Metadata-Version: 2.4
Name: abstract-serve-core
Version: 0.1.35
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.1,>=0.0.76
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                       # provider package entry point
abstract-gpt serve                           # same routes, GPT seat installed
```

## 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 the shared Serve API | [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** | provider-neutral HTTP routes (queue, relay, rollover sweeps, session API) | [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

Provider CLI entry points execute the shared HTTP routes in
`abstract_serve_core/console/server.py`. Shared Serve behaviour is implemented
here and imported directly by provider packages. Its
`GET /api/state` advertises `service=abstract-serve` and protocol version 1;
clients should identify this API independently of the configured model provider.

- **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).


## Python package layout

The package root holds its CLI entry points, version, and packaged assets. Implementations are grouped by responsibility:

| Subpackage | Modules |
| --- | --- |
| `accounting/` | `pricing.py`, `token_test.py`, `usage_db.py` |
| `catalog/` | `models.py` |
| `configuration/` | `actions.py`, `cfgdir.py`, `credentials.py`, `paths.py` |
| `console/` | `attachments.py`, `console_service.py`, `hub.py`, `providers.py`, `server.py`, `webui_assets.py` |
| `integrations/` | `mcp.py`, `relay.py`, `toolset.py` |
| `mct/` | `mct_archive.py`, `mct_repl.py` |
| `processes/` | `auth_capture.py`, `clis.py`, `keepalive.py`, `launch.py`, `seat_report.py` |
| `sessions/` | `chrono.py`, `queue.py`, `rollover.py`, `roster.py`, `session_keys.py`, `session_roll.py`, `stepcap.py` |
| `support/` | `reduce.py`, `util.py` |

Import implementations directly from these subpackages. The former flat module aliases have been removed; shared Claude and GPT helpers live in `abstract_serve_core` and callers import them there. Console provider discovery continues to use the `abstract_serve_core.providers` metadata group, with targets in `abstract_serve_core.console.providers`.

The former `abstract_serve` Python namespace has been removed. Web assets remain in `abstract_serve_core/webui/`.
