- Wire the control service and send_message tool into every shipped composition with a resumable provider and background enabled (headless-agent, tui-agent, and the SDK helper's subagent feature base resources); jsonrpc-agent disables background and is unchanged. - Resolve the send_message availability check in the CALLER's tool scope so a restriction that removes the follow-up tool from one agent also blocks that agent's continuable start. - Control-service disposal now cancels live activations and awaits producer settlement instead of stranding them: TaskService keeps producer Tasks across a reload, so the disposing service aborts each activation-owned controller, resolves its terminal gate (the effect-scoped onTaskDone listener is already gone), and awaits done. A new test kills a mid-start activation through HMR disposal.
143 lines
4.4 KiB
YAML
143 lines
4.4 KiB
YAML
# One-shot coding agent with format-pure stdout. The app bin loads the
|
|
# gitignored root `.env` into the process environment; entry configs here are
|
|
# the composition base, while user-plane values resolve per request through
|
|
# the two providers below.
|
|
|
|
# User-settings document (`$DSH_HOME/settings.yaml`, hot-reloaded): a
|
|
# `llm-deepseek:` section there overrides the adapter entry below without a
|
|
# restart.
|
|
- id: settings
|
|
name: '@deepseek-ai/dsh-settings-local'
|
|
|
|
# Credential store: the live process environment over `$DSH_HOME/.env`
|
|
# (owner-only file, hot-reloaded). The adapter resolves `DEEPSEEK_API_KEY`
|
|
# through it at each request, so no key is inlined in this file.
|
|
- id: credentials
|
|
name: '@deepseek-ai/dsh-credentials-local'
|
|
|
|
# The DeepSeek adapter. Swap to '@deepseek-ai/dsh-llm-pi-ai' for the pi-ai-backed
|
|
# twin (a `providers` dict keyed by route; `reasoning: high` replaces
|
|
# thinking/reasoningEffort). Shipped default: full thinking at max effort on
|
|
# every request. Exact-model resolution materializes request defaults before
|
|
# the request header is logged.
|
|
- id: llm-deepseek
|
|
name: '@deepseek-ai/dsh-llm-deepseek'
|
|
config:
|
|
thinking: enabled
|
|
reasoningEffort: max
|
|
models:
|
|
- id: deepseek-v4-pro
|
|
contextWindow: 128000
|
|
- id: deepseek-v4-flash
|
|
contextWindow: 128000
|
|
|
|
# Managed child-process groups for the bash executor (spawn/kill/output plumbing).
|
|
- id: subprocess
|
|
name: '@deepseek-ai/dsh-subprocess-local'
|
|
|
|
- id: bash
|
|
name: '@deepseek-ai/dsh-bash-local'
|
|
config:
|
|
timeoutMs: 60000
|
|
|
|
# The app bundle pre-creates one fresh `main` agent per invocation.
|
|
- id: cli-agent
|
|
name: '@deepseek-ai/dsh-cli-demo'
|
|
config:
|
|
provider: deepseek-official
|
|
# Stays on flash: the goal/ralph replay corpora were recorded on it, and
|
|
# their nested-include overlays cannot re-pin the app config (a config
|
|
# patch cannot target an entry behind a nested include).
|
|
model: deepseek-v4-flash
|
|
persistenceRoot: './.sessions'
|
|
persistenceCompression: !!js "process.env.DSH_SNAPSHOT === undefined ? 'zstd' : 'none'"
|
|
workspaceContext:
|
|
maxBytes: 65536
|
|
persona: |
|
|
You are headless-agent, a coding assistant powered by the {{model}} model.
|
|
|
|
Verify your work by running the code or tests. Keep answers brief and
|
|
factual.
|
|
|
|
# Summarize an older range when derived history approaches the context window.
|
|
- id: token-meter
|
|
name: '@deepseek-ai/dsh-token-meter'
|
|
|
|
- id: compact-basic
|
|
name: '@deepseek-ai/dsh-compact-basic'
|
|
config:
|
|
thresholdRatio: 0.8
|
|
retainRatio: 0.16
|
|
maxTokens: 8192
|
|
compactionRetries: 1
|
|
|
|
# Expose fresh-child `spawn` and completed-prefix `fork` through independent
|
|
# in-process backends.
|
|
- id: subagent
|
|
name: '@deepseek-ai/dsh-subagent'
|
|
|
|
- id: subagent-spawn
|
|
name: '@deepseek-ai/dsh-subagent-spawn'
|
|
config:
|
|
providerName: spawn
|
|
|
|
- id: subagent-fork
|
|
name: '@deepseek-ai/dsh-subagent-fork'
|
|
config:
|
|
providerName: fork
|
|
|
|
# Continuable background children: the control service owns durable child ids
|
|
# and Task-backed activations; the control tool registers the one global
|
|
# `send_message` shared by both delegation tools.
|
|
- id: subagent-control
|
|
name: '@deepseek-ai/dsh-subagent-control'
|
|
|
|
- id: tool-subagent-control
|
|
name: '@deepseek-ai/dsh-tool-subagent-control'
|
|
|
|
- id: tool-subagent
|
|
name: '@deepseek-ai/dsh-tool-subagent'
|
|
config:
|
|
provider: spawn
|
|
toolName: subagent
|
|
maxDepth: 1
|
|
|
|
- id: tool-subagent-fork
|
|
name: '@deepseek-ai/dsh-tool-subagent'
|
|
config:
|
|
provider: fork
|
|
toolName: subagent_fork
|
|
maxDepth: 1
|
|
|
|
# The worker-thread workflow engine fans a model-written JavaScript script's
|
|
# `agent()` calls out through the spawn backend.
|
|
- id: workflow-workerthread
|
|
name: '@deepseek-ai/dsh-workflow-workerthread'
|
|
config:
|
|
provider: spawn
|
|
|
|
- id: tool-workflow
|
|
name: '@deepseek-ai/dsh-tool-workflow'
|
|
|
|
# A separate fixed consumer demonstrates fresh-agent Ralph iteration without
|
|
# changing the workflow tool or same-session goal behavior.
|
|
- id: tool-ralph
|
|
name: '@deepseek-ai/dsh-tool-ralph'
|
|
|
|
# `todo_write` replaces the logged whole list.
|
|
- id: tool-todo
|
|
name: '@deepseek-ai/dsh-tool-todo'
|
|
|
|
# Policy loads before the model-facing filesystem tools so writes and edits
|
|
# require an observed file. Relative paths resolve from the process cwd.
|
|
- id: fs-local
|
|
name: '@deepseek-ai/dsh-fs-local'
|
|
config:
|
|
cwd: !!js process.cwd()
|
|
|
|
- id: fs-policy
|
|
name: '@deepseek-ai/dsh-fs-policy'
|
|
|
|
- id: tool-fs
|
|
name: '@deepseek-ai/dsh-tool-fs'
|