ds-review-bot flagged that a typo'd or stale config key (e.g. web_fech for web_fetch) silently applies the timeout to nothing — the tools/execute lookup just never matches. Mirror dsh-tool-subagent's lifecycle-driven handling of a configured-but-unregistered provider: on every tools/change (and once at load), logger.warn each configured name still absent from ctx.tools, warning each name at most once so a late registration silences it. Not a load-time throw — the tool set is dynamic (cordis.yml load order, HMR), so a real tool may register later. Declare inject = ['tools'] since the plugin now reads ctx.tools synchronously in apply (previously only inside event callbacks). Regenerate config-catalog (Requires: tools) and event-producer-consumer graph.
timeout/ — tool-call timeout policy
The tool-call timeout policy plugin. A single product package: it is a deployment-policy consumer of the tools/execute around-dispatch seam (owned by dsh-tools) and the pure dsh-timeout library — not a swappable capability with an interface/implementation split, so it needs no seam trio.
| Package | Role | ctx key |
|---|---|---|
timeout-policy/ |
A tools/execute wrapper: for each configured tool it arms a per-call deadline on exec.signal and returns a structured TOOL_TIMEOUT result when that deadline wins |
(registers a tools/execute listener; injects nothing) |
Timeout is split across three layers: dsh-timeout owns the pure timing/classification primitive (deadline/timeoutOf), each capability owns termination (bash kills its process group, the fetch provider tears down its socket), and this package owns the model-facing tool-call budget as deployment policy — no model-facing timeout argument, no global default. It is the middleware the timeout-library RFC foresaw. bash and hook command execution keep their own BASH_TIMEOUT backend timeout and do not route through this policy.