Metadata-Version: 2.4
Name: abstract-serve-core
Version: 0.1.21
Summary: Provider-neutral shared Serve console for Claude, GPT, Hugpy, and local model backends.
License: Proprietary
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: prompt_toolkit>=3.0
Requires-Dist: abstract-toolserver~=0.0.31
Provides-Extra: gpt
Requires-Dist: abstract-gpt>=0.1.9; extra == "gpt"

# abstract-serve

The provider-neutral shared Serve console. It owns the durable conversation
store, queue/hold contract, session picker, and provider adapters. Claude, GPT,
Hugpy, and local-model packages may provide adapters without owning the Serve
runtime.

Run `abstract-serve --no-browser` to start the console.

```bash
pip install abstract-serve-core
abstract-serve --no-browser                 # standalone
abstract-claude serve                       # the usual entry point — runs these routes
```

## Part of the hugpy orbit

```
                    ┌──────────────────────────── hugpy (fleet) ───────────────────────────┐
                    │ central + workers: platform · engine · fleet · server · media · …     │
                    │ OpenAI-compatible /v1 — every local model, incl. B (Qwen3-Coder-Next) │
                    └───────▲───────────────────────▲──────────────────────────▲───────────┘
                            │ inference             │ inference                │ B reductions
   ┌────────────────────────┴──┐   ┌────────────────┴──────────┐   ┌───────────┴───────────────┐
   │ hugpy-station             │   │ hugpy-agent               │   │ abstract-toolserver       │
   │ desktop + headless console│──▶│ agent runtime · TUI ·     │◀─▶│ comms · ledgers · boards ·│
   │ tmux seats per locus      │   │ OpenCode/qwen seats       │   │ exchanges · MCP · b_ask   │
   └────────────┬──────────────┘   └────────────┬──────────────┘   └───────────▲───────────────┘
                │ keeper/codex seats            │ --serve                      │ tools (MCP/HTTP)
   ┌────────────▼──────────────┐   ┌────────────▼──────────────┐               │
   │ abstract-gpt (Codex seat) │   │ abstract-claude serve ────┼───────────────┘
   │ abstract-claude (Claude)  │   │  └ abstract-serve-core    │
   └───────────────────────────┘   └───────────────────────────┘
          everything ships through abstract-pypit → PyPI (+ GitHub)
```

| Package | Role | PyPI |
|---|---|---|
| **hugpy** (14 lockstep dists) | the self-hosted LLM fleet: central, workers, engine, media, server | [hugpy](https://pypi.org/project/hugpy/) |
| **hugpy-station** | Electron desktop + headless backend; tmux seats, prompt composer, loop/bug scan | deb via central install links |
| **hugpy-agent** | agent runtime on the fleet; `hugpy-agent tui` over abstract-claude serve | [hugpy-agent](https://pypi.org/project/hugpy-agent/) |
| **abstract-claude** | Claude Code launch/session/rollover + `abstract-claude serve` (roles keeper/chat/worker/local) | [abstract-claude](https://pypi.org/project/abstract-claude/) |
| **abstract-serve-core** | the HTTP routes `abstract-claude serve` actually runs (queue, relay, rollover sweeps) | [abstract-serve-core](https://pypi.org/project/abstract-serve-core/) |
| **abstract-gpt** | Codex/ChatGPT seat counterpart of abstract-claude | [abstract-gpt](https://pypi.org/project/abstract-gpt/) |
| **abstract-toolserver** | one tool service per host: comms, ledgers, boards, exchanges, MCP bridge, B on call | [abstract-toolserver](https://pypi.org/project/abstract-toolserver/) |
| **abstract-pypit** | one-command publisher: bump → build → PyPI → GitHub push | [abstract-pypit](https://pypi.org/project/abstract-pypit/) |

## What it owns

`abstract-claude serve` imports and **executes serve-core's HTTP routes**. The
route handlers left in `abstract_claude/server.py` are dead at serve runtime —
patch serve-core, not abstract-claude, for any serve behaviour.

- **Roles**: `keeper`, `chat`, `worker`, `local` are standing serve sessions
  recorded in `roster.json` — not Claude sessions. Send to one with
  `POST /api/session/<role>/message`.
- **Cross-locus relay**: `session_message` / relay accepts `to="<locus>"` or
  `to="<locus>:keeper"`; `relay.send_cross` posts a comms ping board row on the
  target locus tagged `[from <locus>:<role>]`, answers `202 queued`, and logs to
  `relay.jsonl`. Non-keeper cross-locus targets are refused (400).
- **Queue**: queue-first collator; prompts are sent **verbatim** —
  `_compile_prompt()` only dedups and joins, never runs a model. A model merge
  exists only as an explicit preview (`POST /api/compile {suggest:true}`) the
  operator must apply.
- **Interrupt = stop** (0.1.16): an interrupted batch is done, never retried,
  never held; queued items drain at the end of the turn.
- **Directives**: `AC_SESSION_DIRECTIVES_DIR/<role>.md` is appended to every turn
  of that role.
- **Rollover sweeps** measure context per session (including gpt sessions via
  the codex rollout) and roll over near the limit.
- **Seat report**: a sidecar publishes `{surface: serve, port, pid}` to the
  central `seat_state`.
- `AC_LOCAL_LLM_URL` points at the local model (B) used for previews.

## Attention-worthy

- `[rollover] sweep #N` log lines are routine, not errors (Station's bug scan
  ignores them since 1.0.152).
- Republishing the same version needs `pip install --force-reinstall`, or the
  old files stay.
- Token counters are blank for sessions served by the hugpy engine — it emits
  no per-turn usage.

## Changelog

See `CHANGELOG.md` (0.1.15: verbatim prompts, gpt runaway guard; 0.1.16:
interrupt = stop).

