Implements docs/rfc/.../2026-06-20-extract-example-app-packages.md. Each
example was thick — a hand-rolled start.ts, an infra preamble, nested
base.yml/base-core.yml/acp-tail.yml includes, and a coupled front-door
cluster enforced only by prose. This moves the composition into packages so
each example is a thin leaf cordis.yml: pick the swappable backends, load one
app package.
New packages:
- @deepseek-ai/dsh-agent-core (packages/core/agent-core): one bundle plugin
that loads the providerless/executor-less/UI-less spine (timer + llm +
sessions + system-prompt + tools + agents + invariants + tool-bash +
agent-loop) via ctx.plugin(...) inside apply(), and forwards agent-loop's
`agents` list as its own Config (export const Config = AgentLoop.Config,
default []).
- @deepseek-ai/dsh-stdio-agent (packages/ui/stdio-agent): terminal chat APP —
agent-core + console logger + readline UI + a pre-created `main` agent, with
a bin. The demo:echo/coding front door.
- @deepseek-ai/dsh-acp-agent (packages/ui/acp-agent): ACP server APP —
agent-core + JSONL persistence + the acp bridge, NO stdout logger, with a
bin. The stdout-purity footgun is structurally unreachable from the leaf.
Amendment to the RFC: hmr stays a LEAF cordis.yml entry, not baked into
dsh-stdio-agent. hmr is a Loader-only dev plugin (throws without
--expose-internals; the in-process test tier can't even import its decorator
form), so a package statically importing it could never carry the per-file
coverage gate. Unlike the console logger, a stray hmr is not a stdout-purity
footgun, so leaving it at the leaf costs no safety. With hmr out, all three new
packages carry in-process unit specs at 100%.
Boot glue (Loader tail, .env load, snapshot-mode selection, stdin-dispose
lifecycle) moves into each app's bin; start.ts and base.yml/base-core.yml/
acp-tail.yml are deleted. Each app package gets a keyless real-load-path test
that boots through its bin + the cordis Loader (guarding the unwrapExports
export-shape bug class, postmortem 0001). ACP snapshot replay stays green
against the existing committed goldens (pure boot restructuring). RFC moved
proposed->implemented with the amendment recorded; package/example/architecture
docs and the module graph updated.
94 lines
2.9 KiB
Markdown
94 lines
2.9 KiB
Markdown
<!-- Generated by scripts/gen-module-graph.ts — do not edit by hand.
|
|
Run `pnpm run gen-module-graph` to regenerate. -->
|
|
|
|
# Module dependency graph
|
|
|
|
Inter-package dependencies among the `@deepseek-ai/dsh-*` harness packages, derived from each package's `peerDependencies` (the canonical runtime-dependency signal). An edge `a --> b` means package `a` depends on package `b`. Names have the `@deepseek-ai/dsh-` prefix stripped.
|
|
|
|
```mermaid
|
|
graph TD
|
|
bash --> brand
|
|
llm --> brand
|
|
bash-local --> bash
|
|
llm-deepseek --> llm
|
|
llm-pi-ai --> llm
|
|
session --> brand
|
|
session --> llm
|
|
system-prompt --> llm
|
|
agent --> brand
|
|
agent --> llm
|
|
agent --> session
|
|
llm-replay --> llm
|
|
llm-replay --> session
|
|
session-persistence --> session
|
|
invariants --> agent
|
|
invariants --> llm
|
|
invariants --> session
|
|
session-persistence-jsonl --> session
|
|
session-persistence-jsonl --> session-persistence
|
|
session-persistence-sqlite --> session
|
|
session-persistence-sqlite --> session-persistence
|
|
tools --> agent
|
|
tools --> llm
|
|
tools --> system-prompt
|
|
ui-stdio --> agent
|
|
ui-stdio --> llm
|
|
ui-stdio --> session
|
|
acp --> agent
|
|
acp --> llm
|
|
acp --> session
|
|
acp --> session-persistence
|
|
acp --> tools
|
|
agent-loop --> agent
|
|
agent-loop --> llm
|
|
agent-loop --> session
|
|
agent-loop --> session-persistence
|
|
agent-loop --> system-prompt
|
|
agent-loop --> tools
|
|
tool-bash --> agent
|
|
tool-bash --> bash
|
|
tool-bash --> llm
|
|
tool-bash --> tools
|
|
agent-core --> agent
|
|
agent-core --> agent-loop
|
|
agent-core --> invariants
|
|
agent-core --> llm
|
|
agent-core --> session
|
|
agent-core --> system-prompt
|
|
agent-core --> tool-bash
|
|
agent-core --> tools
|
|
acp-agent --> acp
|
|
acp-agent --> agent-core
|
|
acp-agent --> session-persistence-jsonl
|
|
stdio-agent --> agent
|
|
stdio-agent --> agent-core
|
|
stdio-agent --> session
|
|
stdio-agent --> session-persistence-jsonl
|
|
stdio-agent --> ui-stdio
|
|
```
|
|
|
|
| Package | Depends on |
|
|
| --- | --- |
|
|
| `brand` | — |
|
|
| `bash` | `brand` |
|
|
| `llm` | `brand` |
|
|
| `bash-local` | `bash` |
|
|
| `llm-deepseek` | `llm` |
|
|
| `llm-pi-ai` | `llm` |
|
|
| `session` | `brand`, `llm` |
|
|
| `system-prompt` | `llm` |
|
|
| `agent` | `brand`, `llm`, `session` |
|
|
| `llm-replay` | `llm`, `session` |
|
|
| `session-persistence` | `session` |
|
|
| `invariants` | `agent`, `llm`, `session` |
|
|
| `session-persistence-jsonl` | `session`, `session-persistence` |
|
|
| `session-persistence-sqlite` | `session`, `session-persistence` |
|
|
| `tools` | `agent`, `llm`, `system-prompt` |
|
|
| `ui-stdio` | `agent`, `llm`, `session` |
|
|
| `acp` | `agent`, `llm`, `session`, `session-persistence`, `tools` |
|
|
| `agent-loop` | `agent`, `llm`, `session`, `session-persistence`, `system-prompt`, `tools` |
|
|
| `tool-bash` | `agent`, `bash`, `llm`, `tools` |
|
|
| `agent-core` | `agent`, `agent-loop`, `invariants`, `llm`, `session`, `system-prompt`, `tool-bash`, `tools` |
|
|
| `acp-agent` | `acp`, `agent-core`, `session-persistence-jsonl` |
|
|
| `stdio-agent` | `agent`, `agent-core`, `session`, `session-persistence-jsonl`, `ui-stdio` |
|