|
|
@@ -0,0 +1,841 @@
|
|
|
+<!-- Generated by scripts/gen-config-catalog.ts — do not edit by hand.
|
|
|
+ Run `pnpm run gen-config-catalog` to regenerate. -->
|
|
|
+
|
|
|
+# Plugin Config Catalog
|
|
|
+
|
|
|
+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.
|
|
|
+
|
|
|
+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.
|
|
|
+
|
|
|
+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
|
|
|
+ * deployment persona (forwarded to the system-prompt plugin); `toolOrder` is
|
|
|
+ * the explicit model-facing tool order (forwarded to the system-prompt plugin);
|
|
|
+ * `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
|
|
|
+ /** Explicit model-facing tool order (the system-prompt plugin's `toolOrder` config; see dsh-system-prompt). */
|
|
|
+ toolOrder?: string[]
|
|
|
+ /** Directory the JSONL session backend writes under. Defaults to `./.sessions`. */
|
|
|
+ persistenceRoot?: string
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/ui/acp-agent/src/index.ts:49`](../packages/ui/acp-agent/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+ * 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.
|
|
|
+ */
|
|
|
+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']
|
|
|
+ /** The explicit model-facing tool order (see dsh-system-prompt's `Config`). */
|
|
|
+ toolOrder?: SystemPromptConfig['toolOrder']
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Depends on: [`AgentLoopConfig`](#deepseek-aidsh-agent-loop) · [`SystemPromptConfig`](#deepseek-aidsh-system-prompt)
|
|
|
+
|
|
|
+Source: [`packages/core/agent-core/src/index.ts:69`](../packages/core/agent-core/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-agent-loop`
|
|
|
+
|
|
|
+Requires: `agents` · `sessions` · `llm` · `tools` · `systemPrompt`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/**
|
|
|
+ * Plugin config: the agents to create — or resume, via `resumeSessionId` —
|
|
|
+ * declaratively at startup, so a cordis.yml deployment needs no code.
|
|
|
+ */
|
|
|
+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)
|
|
|
+
|
|
|
+Source: [`packages/core/agent-loop/src/index.ts:36`](../packages/core/agent-loop/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/bash/bash-local/src/index.ts:29`](../packages/bash/bash-local/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/hooks/hooks-claude/src/index.ts:56`](../packages/hooks/hooks-claude/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/hooks/hooks-codex/src/index.ts:43`](../packages/hooks/hooks-codex/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+/**
|
|
|
+ * 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.
|
|
|
+ */
|
|
|
+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'
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/llm/llm-deepseek/src/index.ts:43`](../packages/llm/llm-deepseek/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-llm-pi-ai`
|
|
|
+
|
|
|
+Requires: `llm`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/**
|
|
|
+ * 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).
|
|
|
+ */
|
|
|
+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'
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/llm/llm-pi-ai/src/index.ts:37`](../packages/llm/llm-pi-ai/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-llm-replay`
|
|
|
+
|
|
|
+Requires: `llm`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/** Plugin config: the {@link ReplayConfig} inputs, each defaulting to its `DSH_SNAPSHOT_*` env var in `apply`. */
|
|
|
+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[]
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/support/llm-replay/src/index.ts:429`](../packages/support/llm-replay/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-session-persistence-jsonl`
|
|
|
+
|
|
|
+Requires: `sessions`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/** Plugin config: where the JSONL backend keeps its session logs (`root` is required — no default). */
|
|
|
+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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/session-persistence/session-persistence-jsonl/src/index.ts:35`](../packages/session-persistence/session-persistence-jsonl/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+ * the deployment persona (forwarded to the system-prompt plugin); `toolOrder`
|
|
|
+ * is the explicit model-facing tool order (forwarded to the system-prompt plugin);
|
|
|
+ * `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
|
|
|
+ /** Explicit model-facing tool order (the system-prompt plugin's `toolOrder` config; see dsh-system-prompt). */
|
|
|
+ toolOrder?: string[]
|
|
|
+ /** 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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/ui/stdio-agent/src/index.ts:60`](../packages/ui/stdio-agent/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/subagent/subagent-fork/src/index.ts:38`](../packages/subagent/subagent-fork/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/subagent/subagent-spawn/src/index.ts:36`](../packages/subagent/subagent-spawn/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-system-prompt`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/** Plugin config: the deployment-authored fragment of the system prompt (see {@link Config.persona} for its contract). */
|
|
|
+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
|
|
|
+ /**
|
|
|
+ * Explicit model-facing tool order, as a list of `ToolSchema.name`s: listed
|
|
|
+ * 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
|
|
|
+ * 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
|
|
|
+ * {@link SystemPrompt.assemble} collects, BEFORE the
|
|
|
+ * `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[]
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/core/system-prompt/src/index.ts:179`](../packages/core/system-prompt/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-timeout-policy`
|
|
|
+
|
|
|
+```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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/timeout/timeout-policy/src/index.ts:61`](../packages/timeout/timeout-policy/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+/** Plugin config: which web tools to register, and the `web_search` source cap. */
|
|
|
+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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/web/tool-web/src/index.ts:37`](../packages/web/tool-web/src/index.ts)
|
|
|
+
|
|
|
+## `@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
|
|
|
+/** Plugin config: the provider's transport and size limits plus its `User-Agent` (all defaulted). */
|
|
|
+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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/web/web-fetch-local/src/index.ts:34`](../packages/web/web-fetch-local/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-web-search-deepseek`
|
|
|
+
|
|
|
+Requires: `web`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/** Plugin config (all optional — `apply` fills env-var and constant defaults). */
|
|
|
+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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/web/web-search-deepseek/src/index.ts:48`](../packages/web/web-search-deepseek/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-web-search-exa`
|
|
|
+
|
|
|
+Requires: `web`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/** Plugin config (all optional — `apply` fills env-var and constant defaults). */
|
|
|
+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
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/web/web-search-exa/src/index.ts:39`](../packages/web/web-search-exa/src/index.ts)
|
|
|
+
|
|
|
+## `@deepseek-ai/dsh-web-search-perplexity`
|
|
|
+
|
|
|
+Requires: `web`
|
|
|
+
|
|
|
+```ts config-catalog
|
|
|
+/** Plugin config (all optional — `apply` fills env-var and constant defaults). */
|
|
|
+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'
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+Source: [`packages/web/web-search-perplexity/src/index.ts:33`](../packages/web/web-search-perplexity/src/index.ts)
|
|
|
+
|
|
|
+## 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.
|
|
|
+
|
|
|
+- `@deepseek-ai/dsh-acp-snapshot` ([`packages/support/acp-snapshot/src/index.ts`](../packages/support/acp-snapshot/src/index.ts))
|
|
|
+- `@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))
|
|
|
+- `@deepseek-ai/dsh-timeout` ([`packages/util/timeout/src/index.ts`](../packages/util/timeout/src/index.ts))
|