2026-07-06 21:57:17 +08:00
<!-- Generated by scripts/gen-config-catalog.ts — do not edit by hand.
Run `pnpm run gen-config-catalog` to regenerate. -->
# Plugin Config Catalog
2026-07-06 23:16:29 +08:00
Every `config:` block a `cordis.yml` entry can set: for each loadable harness package, the verbatim config declaration (JSDoc included) its `apply` function or service constructor receives, with every referenced type pasted alongside (package-local types) or linked (everything else). The paste is the plugin's full declared config type — a field the runtime schema deliberately excludes is a runtime-only seam (its own JSDoc says so) and is not settable from `cordis.yml` . This is the **deployment ** -axis reference — the wiring a plugin author works against is the cordis [events ](cordis-catalog/events.md ) + [services ](cordis-catalog/services.md ) catalogs, the model-facing tool schemas are the [tool catalog ](tool-catalog.md ), and [core-data-structures/ ](core-data-structures/core.md ) documents the types these declarations reference.
2026-07-06 21:57:17 +08:00
2026-07-06 23:06:03 +08:00
This file is GENERATED from source (`scripts/gen-config-catalog.ts` ) and verified fresh by `pnpm run verify-config-catalog` (part of `doc-sync` ) — do not edit it by hand. Declaration blocks use a `ts config-catalog` fence (skipped by doc-typecheck, since a lone declaration referencing imports is not standalone-compilable). The generator also cross-checks the runtime schemastery schema against the pasted declaration — every schema-validated key, nested keys included, must be locatable on the declared config type — so the paste cannot hide a loader-accepted field.
2026-07-06 21:57:17 +08:00
A `Requires:` line lists the service keys the plugin `inject` s: its `cordis.yml` tree must also load providers for those services. Scope is the harness tier (`packages/` ); the vendored cordis plugins a config tree may also load (`hmr` , the console logger, …) are pinned upstream source ([vendoring policy ](../vendor/README.md )) and not catalogued here.
## `@deepseek-ai/dsh-acp`
Requires: `agents` · `sessions` · `sessionPersistence` · `tools`
```ts config-catalog
/** Plugin config: the agent template ACP sessions are created from. */
export interface AcpConfig {
/** Model name for created agents (must have a registered adapter). */
model?: string
/**
* Transport stream override. Production omits this (the plugin wires
* ` process.stdin`/` process.stdout` via ` ndJsonStream`). Tests inject an
* in-memory ` Stream` (e.g. an ` ndJsonStream` over a ` Duplex` pair) to drive
* the bridge without a subprocess. Not part of the schemastery ` Config` —
* it is a runtime-only seam, never set from a ` cordis.yml`.
*/
stream?: Stream
}
` ``
Depends on: ` Stream` (` @agentclientprotocol/sdk `)
Source: [` packages/ui/acp/src/index.ts:115`](../packages/ui/acp/src/index.ts)
## ` @deepseek -ai/dsh-acp-agent`
` ``ts config-catalog
/**
* App config: the swappable per-deployment values. ` model` configures the
* agent template the ACP bridge creates each session's agent from (NOT a
* pre-created agent — ACP creates agents at ` session/new`); ` persona` is the
2026-07-07 11:03:11 +08:00
* deployment persona (forwarded to the system-prompt plugin); ` toolOrder` is
* the explicit model-facing tool order (forwarded to the system-prompt plugin);
2026-07-06 21:57:17 +08:00
* ` persistenceRoot` is the JSONL backend's directory.
*/
export interface Config {
/** Model name for ACP-created agents (must have a registered adapter). */
model: string
/** Deployment persona (the system-prompt plugin's ` persona` config). */
persona?: string
2026-07-07 11:03:11 +08:00
/** Explicit model-facing tool order (the system-prompt plugin's ` toolOrder` config; see dsh-system-prompt). */
toolOrder?: string[]
2026-07-06 21:57:17 +08:00
/** Directory the JSONL session backend writes under. Defaults to ` ./.sessions`. */
persistenceRoot?: string
}
` ``
2026-07-07 11:03:11 +08:00
Source: [` packages/ui/acp-agent/src/index.ts:49`](../packages/ui/acp-agent/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-agent-core`
` ``ts config-catalog
/**
* Bundle config: each field forwarded verbatim to the child that owns it —
* ` agents` to the agent loop (an app that pre-creates no agents, like the ACP
2026-07-07 11:03:11 +08:00
* bridge, simply omits it), ` persona` and ` toolOrder` to the system-prompt
* plugin (the deployment's persona section and the explicit model-facing tool
* order). Every field is optional INPUT here because each owner's schema
* supplies the default (` []` / ` ''` / absent — lexicographic); the schema is
* the INTERSECTION of the owners' own schemas, so validation and defaulting
* can never drift from them.
2026-07-06 21:57:17 +08:00
*/
export interface Config {
/** The agent-loop ` agents` list (see dsh-agent-loop's ` Config`). */
agents?: AgentLoopConfig['agents']
/** The deployment persona (see dsh-system-prompt's ` Config`). */
persona?: SystemPromptConfig['persona']
2026-07-07 11:03:11 +08:00
/** The explicit model-facing tool order (see dsh-system-prompt's ` Config`). */
toolOrder?: SystemPromptConfig['toolOrder']
2026-07-06 21:57:17 +08:00
}
` ``
Depends on: [` AgentLoopConfig`](#deepseek-aidsh-agent-loop) · [` SystemPromptConfig`](#deepseek-aidsh-system-prompt)
2026-07-07 11:03:11 +08:00
Source: [` packages/core/agent-core/src/index.ts:69`](../packages/core/agent-core/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-agent-loop`
Requires: ` agents` · ` sessions` · ` llm` · ` tools` · ` systemPrompt`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/**
* Plugin config: the agents to create — or resume, via ` resumeSessionId` —
* declaratively at startup, so a cordis.yml deployment needs no code.
*/
2026-07-06 21:57:17 +08:00
export interface Config {
/** Agents created from configuration at startup. */
agents: (AgentOptions & {
/** Agent id to register under; also seeds the fresh per-run session id (` ${id}-session-<uuid>`). */
id: AgentId
/**
* If set, the config agent RESUMES this persisted session id instead of
* starting a fresh ` ${id}-session-<uuid>`. Sourced from an env var in
* cordis.yml (` resumeSessionId: !!js process.env.RESUME_SESSION_ID`), so a
* demo can continue a prior conversation without code changes. Requires a
* ` dsh-session-persistence` backend; the resume is deferred until that
* service is available (via ` ctx.inject`) and the loaded session's events
* seed the live session so history continues.
*
* The schema accepts a plain string at runtime (cordis.yml values are
* untyped); the brand is compile-time only — the config format is the
* boundary where an id enters, so the TYPE declares the brand here.
*/
resumeSessionId?: SessionId
})[]
}
` ``
Depends on: [` AgentId`](../packages/core/agent/src/index.ts) · [` AgentOptions`](../packages/core/agent/src/index.ts) · [` SessionId`](../packages/core/session/src/index.ts)
2026-07-07 09:34:12 +08:00
Source: [` packages/core/agent-loop/src/index.ts:36`](../packages/core/agent-loop/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-bash-local`
` ``ts config-catalog
/** Plugin config (all optional — ` static Config` supplies the defaults). */
export interface Config {
/** Default working directory for commands (default: process.cwd()). */
cwd?: string
/** Default foreground timeout in milliseconds. */
timeoutMs?: number
/** Upper bound for per-call timeout overrides. */
maxTimeoutMs?: number
/** Per-stream in-memory output cap; overflow spills to a temp file. */
maxOutputBytes?: number
/** Grace period between the SIGTERM and the SIGKILL escalation on a kill. */
graceMs?: number
}
` ``
2026-07-08 11:18:27 +08:00
Source: [` packages/bash/bash-local/src/index.ts:29`](../packages/bash/bash-local/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-compact-basic`
Requires: ` llm`
` ``ts config-catalog
/**
* Backend configuration. Every knob is REQUIRED except ` auto` and
* ` charsPerToken`: there is no concrete data yet to justify default
* thresholds/budgets, so a consumer must state each value explicitly rather
* than inherit a guessed default. ` auto` alone defaults to ` true`
* (auto-compaction is the intended posture), and ` charsPerToken` defaults to
* the English-text heuristic its estimator was calibrated on.
*/
export interface BasicCompactConfig {
/** Context window size in tokens. */
contextWindow: number
/** Compact when estimated token usage exceeds this fraction of context window. */
thresholdRatio: number
/** Number of tokens of recent context to retain during compaction. */
retainTokens: number
/** Model to use for summarization (` ''` — uses the agent's model). */
summarizationModel: string
/** Provider generation cap for the summarization call. */
maxTokens: number
/** Extra compaction attempts when the first compacted surface is still over threshold. */
compactionRetries: number
/** Enable automatic compaction on the ` agent/pre-step` seam (default true). */
auto?: boolean
/**
* Text density for the token estimator: estimated tokens = chars /
* ` charsPerToken`. Defaults to 4 (typical English text). A CJK-heavy
* deployment should set ~1-2 — CJK runs at roughly 1-2 chars per token, so
* the default UNDERestimates several-fold and compaction fires far too late.
* May be fractional.
*/
charsPerToken?: number
}
` ``
Source: [` packages/compact/compact-basic/src/types.ts:20`](../packages/compact/compact-basic/src/types.ts)
## ` @deepseek -ai/dsh-fs-local`
` ``ts config-catalog
/** Configuration for the local filesystem backend. */
export interface Config {
/** Base directory for relative paths. Defaults to ` process.cwd()`. */
cwd?: string
}
` ``
Source: [` packages/fs/fs-local/src/index.ts:58`](../packages/fs/fs-local/src/index.ts)
## ` @deepseek -ai/dsh-hooks-claude`
Requires: ` bash`
` ``ts config-catalog
/** Plugin config: where the CC hook config lives + substitution roots. */
export interface Config {
/**
* Path to a ` hooks.json` or a settings file whose ` hooks` key holds the config.
* PROCESS-LEVEL: read once at load, a relative path resolves against the process
* launch cwd, so one config applies to the whole process.
* TODO(per-session-hook-config): per-session discovery of a project-local
* ` hooks.json` from each ` session/new.cwd` is not yet implemented.
*/
configPath: string
/**
* Replaces ` ${CLAUDE_PLUGIN_ROOT}` in command strings (the plugin's root dir).
*/
pluginRoot?: string
/**
* Replaces ` ${CLAUDE_PROJECT_DIR}` in command strings AND is exported as the
* ` CLAUDE_PROJECT_DIR` env var for hook processes. When omitted, the env var
* defaults per-run to the agent's session workspace (` session.header.cwd`, the
* same dir the hook runs in) — Claude Code always exports this var, and common
* unmodified hooks reference ` $CLAUDE_PROJECT_DIR` for project-relative paths.
*/
projectDir?: string
/** Default per-hook timeout in ms when a hook sets none (CC default: 600000). */
defaultTimeoutMs?: number
/** Character cap for the ` hook/result` event's persisted stderr summary. */
stderrSummaryMaxChars?: number
}
` ``
2026-07-07 09:44:18 +08:00
Source: [` packages/hooks/hooks-claude/src/index.ts:56`](../packages/hooks/hooks-claude/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-hooks-codex`
Requires: ` bash`
` ``ts config-catalog
/** Plugin config: where the Codex hooks.json lives + the model name for payloads. */
export interface Config {
/**
* Path to a Codex ` hooks.json`. PROCESS-LEVEL: read once at load, a relative
* path resolves against the process launch cwd.
* TODO(per-session-hook-config): per-session project-local discovery from each
* ` session/new.cwd` is not yet implemented.
*/
configPath: string
/** The model name stamped on every payload (Codex includes ` model` on each event). */
model?: string
/** Default per-hook timeout in ms when a hook sets none (Codex default: 600000). */
defaultTimeoutMs?: number
/** Character cap for the ` hook/result` event's persisted stderr summary. */
stderrSummaryMaxChars?: number
}
` ``
2026-07-07 09:44:18 +08:00
Source: [` packages/hooks/hooks-codex/src/index.ts:43`](../packages/hooks/hooks-codex/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-invariants`
Requires: ` sessions`
` ``ts config-catalog
/** Plugin config. */
export interface Config {
/**
* Deep-freeze logged session-event data so mutating a logged event throws.
* Default true — this plugin only runs in dev/test, where freezing is the
* point. Set false to assert the event contract without freezing.
*/
freeze?: boolean
}
` ``
Source: [` packages/support/invariants/src/index.ts:45`](../packages/support/invariants/src/index.ts)
## ` @deepseek -ai/dsh-llm-deepseek`
Requires: ` llm`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/**
* Plugin config, validated by the same-named schemastery schema. Every field
* is optional in yml: credentials/endpoint fall back to the environment (a
* missing API key fails plugin load, not the first call), and omitted
* thinking fields send nothing on the wire, so the provider default applies.
*/
2026-07-06 21:57:17 +08:00
export interface Config {
/** API key; falls back to $DEEPSEEK_API_KEY. Required one way or the other. */
apiKey?: string
/** Endpoint base; falls back to $DEEPSEEK_BASE_URL, then the public API. */
baseURL?: string
/** Model names to register (sent verbatim on the wire). */
models?: string[]
/** Thinking-mode default for every request (provider default: enabled). */
thinking?: 'enabled' | 'disabled'
/** Thinking effort (only meaningful with thinking enabled). */
reasoningEffort?: 'high' | 'max'
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/llm/llm-deepseek/src/index.ts:43`](../packages/llm/llm-deepseek/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-llm-pi-ai`
Requires: ` llm`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/**
* Plugin config, validated by the same-named schemastery schema. Every field
* is optional in yml: credentials/endpoint fall back to the environment (a
* missing API key fails plugin load, not the first call).
*/
2026-07-06 21:57:17 +08:00
export interface Config {
/** API key; falls back to $DEEPSEEK_API_KEY. Required one way or the other. */
apiKey?: string
/** Endpoint base; falls back to $DEEPSEEK_BASE_URL, then the public API. */
baseURL?: string
/** Model names to register (sent verbatim on the wire). */
models?: string[]
/**
* Thinking level for every request: 'off' disables thinking mode; 'high'
* and 'xhigh' (wire 'max') set the effort. Omitted = provider default
* (thinking enabled), matching llm-deepseek's omission semantics.
*/
reasoning?: PiAiReasoning
}
/** Reasoning levels surfaced by this adapter (DeepSeek wire: high|max). */
export type PiAiReasoning = 'off' | 'high' | 'xhigh'
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/llm/llm-pi-ai/src/index.ts:37`](../packages/llm/llm-pi-ai/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-llm-replay`
Requires: ` llm`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config: the {@link ReplayConfig} inputs, each defaulting to its ` DSH_SNAPSHOT_*` env var in ` apply`. */
2026-07-06 21:57:17 +08:00
export interface Config {
/** Override the fixture path; defaults to ` $DSH_SNAPSHOT_FILE`. */
file?: string
/** Override the sidecar path; defaults to ` $DSH_SNAPSHOT_OVERRIDE`. */
overrideFile?: string
/**
* Override the child-log paths; defaults to ` $DSH_SNAPSHOT_CHILD_FILES` (a
* path-separator-delimited list). Each is a recorded subagent session log for
* a nested-agent scenario; absent/empty for a single-session scenario.
*/
childFiles?: string[]
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/support/llm-replay/src/index.ts:429`](../packages/support/llm-replay/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-session-persistence-jsonl`
Requires: ` sessions`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config: where the JSONL backend keeps its session logs (` root` is required — no default). */
2026-07-06 21:57:17 +08:00
export interface Config {
/**
* Root directory for all session files. Required (no default): a default of
* ` process.cwd()` would scatter session files as the process's cwd changes
* (bash calls, subprocesses). Sessions group under per-cwd subdirectories.
*/
root: string
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/session-persistence/session-persistence-jsonl/src/index.ts:35`](../packages/session-persistence/session-persistence-jsonl/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-session-persistence-sqlite`
Requires: ` sessions`
` ``ts config-catalog
/** Plugin configuration. */
export interface Config {
/**
* Filesystem path to the SQLite database file. The special value ` :memory:`
* opens an in-process database (tests); a file path is created (with parent
* dirs) on construction.
*/
path: string
/**
* SQLite ` journal_mode` pragma. ` wal` (the default) is the recorded
* durability model; pick a rollback-journal mode (` delete`/` truncate`/
* ` persist`) on filesystems where WAL's shared-memory files do not work
* (network mounts). See {@link JournalMode}.
*/
journalMode?: JournalMode
}
/**
* Journal modes the backend will run under. ` wal` is the default and the
* durability model the persistence ADR records; the rollback-journal modes
* (` delete`/` truncate`/` persist`) exist for filesystems where WAL's
* shared-memory files do not work (network mounts). ` memory`/` off` are
* excluded: dropping journal durability silently contradicts what this
* backend promises.
*/
export type JournalMode = 'wal' | 'delete' | 'truncate' | 'persist'
` ``
Source: [` packages/session-persistence/session-persistence-sqlite/src/index.ts:50`](../packages/session-persistence/session-persistence-sqlite/src/index.ts)
## ` @deepseek -ai/dsh-stdio-agent`
` ``ts config-catalog
/**
* App config: the swappable per-demo values, each routed to where the app wires
* it. ` model`/` resumeSessionId` configure the pre-created ` main` agent (through
* {@link @deepseek-ai/dsh-agent-core}'s forwarded ` agents` list); ` persona` is
2026-07-07 11:03:11 +08:00
* the deployment persona (forwarded to the system-prompt plugin); ` toolOrder`
* is the explicit model-facing tool order (forwarded to the system-prompt plugin);
2026-07-06 21:57:17 +08:00
* ` persistenceRoot` is the JSONL backend's directory; ` welcome` is the UI banner.
*/
export interface Config {
/** Model name for the ` main` agent (must have a registered adapter). */
model: string
/** Deployment persona (the system-prompt plugin's ` persona` config). */
persona?: string
2026-07-07 11:03:11 +08:00
/** Explicit model-facing tool order (the system-prompt plugin's ` toolOrder` config; see dsh-system-prompt). */
toolOrder?: string[]
2026-07-06 21:57:17 +08:00
/** Directory the JSONL session backend writes under. Defaults to ` ./.sessions`. */
persistenceRoot?: string
/** stdin-chat banner printed once on start. Defaults to ` 'ready.'`. */
welcome?: string
/**
* If set, the ` main` agent RESUMES this persisted session id instead of
* starting fresh. Sourced from an env var in the leaf ` cordis.yml`
* (` resumeSessionId: !!js process.env.RESUME_SESSION_ID`).
*/
resumeSessionId?: string
}
` ``
2026-07-07 11:03:11 +08:00
Source: [` packages/ui/stdio-agent/src/index.ts:60`](../packages/ui/stdio-agent/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-subagent-acp`
Requires: ` subagents`
` ``ts config-catalog
/** Config: how to spawn and drive the child ACP agent process. */
export interface Config {
/** Provider name on ` ctx.subagents` (default ` acp`). */
providerName: string
/** The executable to spawn for each run (the child ACP agent). */
command: string
/** Arguments passed to {@link command}. */
args: string[]
/**
* Working directory for the child process and its ACP session. Defaults to
* the parent process's cwd when omitted.
*/
cwd?: string
/**
* How to auto-answer the child's ` session/request_permission` prompts:
* ` reject` (default — decline every prompt) or ` allow` (approve via the first
* allow-shaped option). The first cut surfaces no prompt to a human.
*/
permission: PermissionPolicy
/**
* Extra environment variables for the child process — e.g. the child
* harness's own ` DEEPSEEK_API_KEY`. Forwarded on top of a credential-scrubbed
* copy of the parent env, so an explicit key here reaches the child while
* ambient secrets do not leak implicitly.
*/
env: Record<string, string>
/**
* Grace period (ms) for the child's EOF-driven quiesce on dispose — its
* window to flush persistence and tear down its own nested subprocesses
* before the parent escalates to a signal.
*/
disposeEofGraceMs?: number
/** Grace period (ms) between ` SIGTERM` and the ` SIGKILL` escalation on dispose. */
disposeGraceMs?: number
}
/**
* How the client answers a child's ` session/request_permission`. The first cut
* does not surface permission prompts to a human, so every request is
* auto-answered by this fixed policy:
*
* - ` reject` — decline every prompt (answer ` cancelled`). Safe default: a child
* that asks before a side effect does not get to take it.
* - ` allow` — approve every prompt by selecting its first ` allow_*` option (or,
* if none is offered, ` cancelled`). Use when the child is trusted to act.
*/
export type PermissionPolicy = 'allow' | 'reject'
` ``
Source: [` packages/subagent/subagent-acp/src/index.ts:30`](../packages/subagent/subagent-acp/src/index.ts)
## ` @deepseek -ai/dsh-subagent-fork`
Requires: ` subagents` · ` agents`
` ``ts config-catalog
/** Config: the registry name to register the provider under. */
export interface Config {
/** Provider name on ` ctx.subagents` (default ` fork`). */
providerName: string
}
` ``
2026-07-07 09:44:18 +08:00
Source: [` packages/subagent/subagent-fork/src/index.ts:38`](../packages/subagent/subagent-fork/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-subagent-mock`
Requires: ` subagents`
` ``ts config-catalog
/** Config for the mock provider; all optional with test-friendly defaults. */
export interface Config {
/** Registry name to register under. */
name: string
/** The text the scripted child "returns" as its final answer. */
reply?: string
/** The stop reason the run settles with. */
stopReason?: SubagentStopReason
/** Which start-time capabilities to advertise (default: all ` true`). */
capabilities?: Partial<SubagentCapabilities>
/**
* The context contract to declare ({@link SubagentProvider.inheritsParentContext});
* default ` false` (spawn-like). Set ` true` to exercise the fork-shaped tool
* wording in consumer tests.
*/
inheritsParentContext?: boolean
/**
* Structured value surfaced when a request carries an ` outputSchema` and the
* ` outputSchema` capability is on (default: ` { reply }`).
*/
structured?: unknown
}
` ``
Depends on: [` SubagentCapabilities`](../packages/subagent/subagent/src/index.ts) · [` SubagentStopReason`](../packages/subagent/subagent/src/index.ts)
Source: [` packages/support/subagent-mock/src/index.ts:84`](../packages/support/subagent-mock/src/index.ts)
## ` @deepseek -ai/dsh-subagent-spawn`
Requires: ` subagents` · ` agents`
` ``ts config-catalog
/** Config: the registry name to register the provider under. */
export interface Config {
/** Provider name on ` ctx.subagents` (default ` spawn`). */
providerName: string
}
` ``
2026-07-07 09:44:18 +08:00
Source: [` packages/subagent/subagent-spawn/src/index.ts:36`](../packages/subagent/subagent-spawn/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-system-prompt`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config: the deployment-authored fragment of the system prompt (see {@link Config.persona} for its contract). */
2026-07-06 21:57:17 +08:00
export interface Config {
/**
* The deployment's persona — the ONE deployment-authored fragment of the
* system prompt, rendered as the order-0 ` deployment:persona` section
* (after the harness identity, before all tool guidance). Every agent in
* the context shares it, subagents included. Template, not free-form text:
* every complete ` {{…}}` group is interpreted strictly against the
* registered prompt variables (the shipped agent loop registers ` {{model}}`
* and ` {{cwd}}`), and there is no escape syntax for literal ` {{…}}` prose
* yet (a deliberate deferral; see the prompt-variables RFC). Defaults to
* ` ''` — the empty section is dropped at render, so a persona-less
* deployment opens with the harness identity alone.
*/
persona?: string
2026-07-07 11:03:11 +08:00
/**
* Explicit model-facing tool order, as a list of ` ToolSchema.name`s: listed
2026-07-07 20:20:56 +08:00
* tools take their listed position, and tools absent from the list are
* inserted at the {@link TOOL_ORDER_REST} (` '<unlisted-tools>'`) entry in
* lexicographic name order. A configured list must contain the rest entry
* exactly once, no duplicate names, and no name without a registered tool —
* a misconfigured order blocks work instead of silently reaching a model
* request: shape violations throw at load, and an unregistered name rejects
2026-07-07 22:03:12 +08:00
* every assembly. ` TOOL_ORDER_REST` is reserved for the list marker and may
* not be a collected tool name; such a provider output also rejects the
* assembly. The single assembly-time validation rejects either failure
* before any model request — the earliest moment the registered tool set
* exists to check against, since tool plugins register after this service
* constructs. When omitted, tools are ordered lexicographically by name.
* Applied to the tools
2026-07-07 20:20:56 +08:00
* {@link SystemPrompt.assemble} collects, BEFORE the
2026-07-07 11:03:11 +08:00
* ` system-prompt/assemble` waterfall — like the sections' ` order` sort, it
* canonicalizes what the registry contributed (registration order is a
* plugin-load artifact); a waterfall listener that mutates the tool list
* owns the determinism of what it emits. Rationale (and why not per-plugin
* weights): docs/rfc/implemented/feature/2026-07-06-explicit-tool-order.md.
*/
toolOrder?: string[]
2026-07-06 21:57:17 +08:00
}
` ``
2026-07-07 22:03:12 +08:00
Source: [` packages/core/system-prompt/src/index.ts:179`](../packages/core/system-prompt/src/index.ts)
2026-07-06 21:57:17 +08:00
2026-07-08 11:18:27 +08:00
## ` @deepseek -ai/dsh-timeout-policy`
2026-07-08 11:43:29 +08:00
Requires: ` tools`
2026-07-08 11:18:27 +08:00
` ``ts config-catalog
/**
* Plugin config: per-tool timeout policy, keyed by the model-facing tool name.
* There is deliberately NO global default (a global budget would silently start
* failing any tool that happens to run long once the plugin loads) and NO model
* override (timeout is deployment policy, not prompt semantics) in this version.
*/
export interface Config {
/** Timeout policy per tool name; an unlisted tool gets no deadline from this plugin. */
tools?: Record<string, ToolTimeoutPolicy>
}
/** Per-tool timeout policy. ` timeoutMs` is required and must be positive finite. */
export interface ToolTimeoutPolicy {
/** The per-call cooperative deadline for this tool, in milliseconds. */
timeoutMs: number
}
` ``
2026-07-08 11:43:29 +08:00
Source: [` packages/timeout/timeout-policy/src/index.ts:64`](../packages/timeout/timeout-policy/src/index.ts)
2026-07-08 11:18:27 +08:00
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-tool-fs`
Requires: ` tools` · ` fs` · ` systemPrompt`
` ``ts config-catalog
/** Plugin config (all optional — ` Config` supplies the defaults). */
export interface Config {
/** Default and maximum number of lines returned by one ` read` call. */
readLimit?: number
/** Maximum characters returned for a single line before truncation. */
readMaxLineLength?: number
/** Maximum bytes returned for the selected lines of one ` read` call. */
readMaxBytes?: number
/** Files at or above this size stream instead of loading whole into memory. */
readStreamMinSize?: number
}
` ``
Source: [` packages/fs/tool-fs/src/index.ts:48`](../packages/fs/tool-fs/src/index.ts)
## ` @deepseek -ai/dsh-tool-subagent`
Requires: ` tools` · ` subagents`
` ``ts config-catalog
/** Config: which registered provider this tool delegates to, plus child defaults. */
export interface Config {
/** The ` ctx.subagents` provider name to start runs on (e.g. ` spawn`, ` acp`). */
provider: string
/**
* The model-facing tool name to register (default ` subagent`). To expose more
* than one transport, load this plugin once per provider — each load MUST set
* a distinct ` toolName` (the tool registry rejects a duplicate name), e.g.
* ` { provider: 'spawn', toolName: 'subagent' }` and
* ` { provider: 'acp', toolName: 'subagent_acp' }`.
*/
toolName?: string
/**
* Default per-child agent options (model) applied to every spawned child.
* Omitted fields fall back to the child loop's own defaults. There is no
* per-child persona: the deployment persona (the system-prompt plugin's
* ` persona` config) is a context-wide section every agent shares.
*/
agentOptions?: AgentOptions
}
` ``
Depends on: [` AgentOptions`](../packages/core/agent/src/index.ts)
Source: [` packages/subagent/tool-subagent/src/index.ts:44`](../packages/subagent/tool-subagent/src/index.ts)
## ` @deepseek -ai/dsh-tool-web`
Requires: ` tools` · ` web` · ` systemPrompt`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config: which web tools to register, and the ` web_search` source cap. */
2026-07-06 21:57:17 +08:00
export interface Config {
/** Register ` web_search`. Defaults to true. */
search?: boolean
/** Register ` web_fetch`. Defaults to true. */
fetch?: boolean
/** Upper bound on sources returned by one ` web_search` call. */
searchMaxResults?: number
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/web/tool-web/src/index.ts:37`](../packages/web/tool-web/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-web`
` ``ts config-catalog
/**
* Config for the web seam. ` searchProvider` / ` fetchProvider` pin which provider
* wins for each capability; both are optional (a single registered usable
* provider auto-selects). Operational overrides such as environment variables
* must feed these same fields rather than introduce a hidden priority chain.
*/
export interface WebServiceConfig {
/** Explicit search provider id. Omitted = auto-select when exactly one usable. */
readonly searchProvider?: string
/** Explicit fetch provider id. Omitted = auto-select when exactly one usable. */
readonly fetchProvider?: string
}
` ``
Source: [` packages/web/web/src/index.ts:68`](../packages/web/web/src/index.ts)
## ` @deepseek -ai/dsh-web-fetch-local`
Requires: ` web`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config: the provider's transport and size limits plus its ` User-Agent` (all defaulted). */
2026-07-06 21:57:17 +08:00
export interface Config {
/** Maximum accepted request URL length. */
maxUrlLength?: number
/** Maximum response body size in bytes. */
maxResponseBytes?: number
/** Maximum decoded body length in characters. */
maxBodyChars?: number
/** Default fetch timeout in milliseconds. */
timeoutMs?: number
/** Upper bound for a per-request timeout override. */
maxTimeoutMs?: number
/** Maximum number of same-origin redirect hops to follow. */
maxRedirects?: number
/** ` User-Agent` header sent on every request. */
userAgent?: string
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/web/web-fetch-local/src/index.ts:34`](../packages/web/web-fetch-local/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-web-search-deepseek`
Requires: ` web`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config (all optional — ` apply` fills env-var and constant defaults). */
2026-07-06 21:57:17 +08:00
export interface Config {
/** DeepSeek API key. Falls back to ` $DEEPSEEK_API_KEY`. Empty → unavailable. */
apiKey?: string
/** Anthropic-compatible endpoint base; ` /messages` is appended. */
baseURL?: string
/** Anthropic-format model name. Defaults to ` deepseek-v4-flash`. */
model?: string
/** ` anthropic-version` header value. Defaults to ` 2023-06-01`. */
apiVersion?: string
/** Upper bound on generated tokens for the Messages request. Defaults to 4096. */
maxTokens?: number
/** Maximum ` web_search` server-tool uses per request. Defaults to 5. */
maxUses?: number
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/web/web-search-deepseek/src/index.ts:48`](../packages/web/web-search-deepseek/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-web-search-exa`
Requires: ` web`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config (all optional — ` apply` fills env-var and constant defaults). */
2026-07-06 21:57:17 +08:00
export interface Config {
/** Exa API key. Falls back to ` $EXA_API_KEY`. Empty → provider unavailable. */
apiKey?: string
/** Endpoint base; ` /search` is appended. Defaults to the public API. */
baseURL?: string
/** Retrieval mode sent as Exa's ` type`. Defaults to ` auto`. */
searchType?: 'auto' | 'keyword' | 'neural'
/** Default result count when a request carries no ` maxResults`. Omitted = none. */
numResults?: number
/** Highlight sentences requested per result. Defaults to 1. */
highlightsPerResult?: number
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/web/web-search-exa/src/index.ts:39`](../packages/web/web-search-exa/src/index.ts)
2026-07-06 21:57:17 +08:00
## ` @deepseek -ai/dsh-web-search-perplexity`
Requires: ` web`
` ``ts config-catalog
2026-07-07 09:34:12 +08:00
/** Plugin config (all optional — ` apply` fills env-var and constant defaults). */
2026-07-06 21:57:17 +08:00
export interface Config {
/** Perplexity API key. Falls back to ` $PERPLEXITY_API_KEY`. Empty → unavailable. */
apiKey?: string
/** Endpoint base; ` /chat/completions` is appended. Defaults to the public API. */
baseURL?: string
/** Search model name. Defaults to ` sonar`. */
model?: string
/** Upper bound on generated answer tokens. Defaults to 1024. */
maxTokens?: number
/** Recency window sent as ` search_recency_filter`. Omitted = no filter. */
searchRecency?: 'day' | 'week' | 'month' | 'year'
}
` ``
2026-07-07 09:34:12 +08:00
Source: [` packages/web/web-search-perplexity/src/index.ts:33`](../packages/web/web-search-perplexity/src/index.ts)
2026-07-06 21:57:17 +08:00
## Loadable plugins with no config
These load from a ` cordis.yml` entry with no ` config:` block; they declare no config surface.
- ` @deepseek -ai/dsh-agent` ([` packages/core/agent/src/index.ts`](../packages/core/agent/src/index.ts))
- ` @deepseek -ai/dsh-fs-policy` ([` packages/fs/fs-policy/src/index.ts`](../packages/fs/fs-policy/src/index.ts))
- ` @deepseek -ai/dsh-llm` ([` packages/llm/llm/src/index.ts`](../packages/llm/llm/src/index.ts))
- ` @deepseek -ai/dsh-session` ([` packages/core/session/src/index.ts`](../packages/core/session/src/index.ts))
- ` @deepseek -ai/dsh-subagent` ([` packages/subagent/subagent/src/index.ts`](../packages/subagent/subagent/src/index.ts))
- ` @deepseek -ai/dsh-tool-bash` — requires ` tools` · ` bash` · ` systemPrompt` ([` packages/bash/tool-bash/src/index.ts`](../packages/bash/tool-bash/src/index.ts))
- ` @deepseek -ai/dsh-tool-todo` — requires ` tools` ([` packages/todo/tool-todo/src/index.ts`](../packages/todo/tool-todo/src/index.ts))
- ` @deepseek -ai/dsh-tools` — requires ` systemPrompt` ([` packages/core/tools/src/index.ts`](../packages/core/tools/src/index.ts))
## Seam packages (not directly loadable)
Abstract service classes — a deployment loads a concrete implementation package instead ([capability seams](rfc/implemented/architecture/2026-06-13-capability-seams.md)).
- ` @deepseek -ai/dsh-bash` — abstract ` BashExecutor` ([` packages/bash/bash/src/index.ts`](../packages/bash/bash/src/index.ts))
- ` @deepseek -ai/dsh-compact` — abstract ` CompactService` ([` packages/compact/compact/src/index.ts`](../packages/compact/compact/src/index.ts))
- ` @deepseek -ai/dsh-fs` — abstract ` FileSystem` ([` packages/fs/fs/src/index.ts`](../packages/fs/fs/src/index.ts))
- ` @deepseek -ai/dsh-session-persistence` — abstract ` SessionPersistence` ([` packages/session-persistence/session-persistence/src/index.ts`](../packages/session-persistence/session-persistence/src/index.ts))
## Library packages (no plugin entry)
Imported as libraries by other packages; a ` cordis.yml` cannot load them.
2026-07-08 01:44:20 +08:00
- ` @deepseek -ai/dsh-acp-snapshot` ([` packages/support/acp-snapshot/src/index.ts`](../packages/support/acp-snapshot/src/index.ts))
2026-07-06 21:57:17 +08:00
- ` @deepseek -ai/dsh-app-boot` ([` packages/ui/app-boot/src/index.ts`](../packages/ui/app-boot/src/index.ts))
- ` @deepseek -ai/dsh-brand` ([` packages/util/brand/src/index.ts`](../packages/util/brand/src/index.ts))
- ` @deepseek -ai/dsh-hook-protocol` ([` packages/hooks/hook-protocol/src/index.ts`](../packages/hooks/hook-protocol/src/index.ts))
- ` @deepseek -ai/dsh-subagent-inprocess` ([` packages/subagent/subagent-inprocess/src/index.ts`](../packages/subagent/subagent-inprocess/src/index.ts))
2026-07-08 11:18:27 +08:00
- ` @deepseek -ai/dsh-timeout` ([` packages/util/timeout/src/index.ts`](../packages/util/timeout/src/index.ts))