Tianyi Cui 2faeabb05a refactor(examples): rename coding-agent leaf to repl-agent 1 月之前
..
src e547980d77 feat(llm): route adapters by provider 2 月之前
tests 5ed531acba ci(examples): run examples / testing from built lib/js 1 月之前
README.md 2faeabb05a refactor(examples): rename coding-agent leaf to repl-agent 1 月之前
composition.md 864b7bfd65 Merge remote-tracking branch 'origin/master' into feat/tui-package 1 月之前
cordis.yml 864b7bfd65 Merge remote-tracking branch 'origin/master' into feat/tui-package 1 月之前
package.json 53d1ef4a74 Add runnable echo-agent example 3 月之前

README.md

echo-agent

Runnable demo: stdin chat with a scripted mock model and an echo tool. The all-mock skeleton — "swap the backend, keep the app".

What it shows

This example is just a leaf cordis.yml: it loads the @deepseek-ai/dsh-stdio-demo app (which bundles the whole @deepseek-ai/dsh-agent-spine-demo spine, JSONL persistence, the TTY-selected dsh-tui/dsh-stdio front doors, and a pre-created main agent), and swaps in two example-local backends plus hmr:

  • mock-llm.ts — a mock LlmAdapter that streams scripted responses and calls the echo tool when the user types "echo ". Registered with ctx.llm.registerAdapter(['mock-echo'], …).
  • echo-tool.ts — a tool registered via ctx.tools.register(defineTool(…)) with typed execute args; echoes text back uppercased.
  • Swapping mock-llm for the real llm-deepseek adapter is all that separates this from repl-agent — the same app, a different backend.

    Plugin files

    File Role Key patterns demonstrated
    src/mock-llm.ts LlmAdapter registration ctx.llm.registerAdapter(['mock-echo'], …), streaming chunks with the proper block-start/block-end protocol
    src/echo-tool.ts Tool registration ctx.tools.register(defineTool(…)) with typed execute args, returning ContentBlock[]
    cordis.yml Leaf wiring the two backends + hmr + one @deepseek-ai/dsh-stdio-demo entry carrying the app config

    The spine, UI, persistence, and boot glue all live in @deepseek-ai/dsh-stdio-demo and the bundle it loads — this folder holds only the demo-specific mocks and the leaf wiring.

    Run

    pnpm run demo:echo
    # or:
    node --expose-internals --import tsx packages/examples/stdio-demo/src/bin.ts examples/echo-agent/cordis.yml
    

    Type a message and press Enter. "echo " triggers a tool call round-trip (the mock model requests the echo tool, which echoes the text uppercased, and the next model step acknowledges it).

    The session is persisted under .sessions/ relative to the directory you launch the demo from. pnpm run demo:echo runs from the repo root, so the logs land in <repo-root>/.sessions/cwd-<hash>/ (one .jsonl log per session). Clean up with: rm -rf .sessions