Configuration reference

August 12, 2026 ยท View on GitHub

All keys are optional. Defaults are resolved by the plugin's Schemastery config before the service starts.

KeyDefaultPurpose
projectDirectory.dsh/workflowsProject capsule/trusted-local catalog, relative to session cwd.
personalDirectoryworkflowsPersonal catalog, relative to $DSH_HOME (or ~/.dsh).
runDirectory.dsh/workflow-runsPer-project durable run store. Absolute paths are additionally partitioned by cwd hash.
listToolNameworkflow_listModel-facing discovery tool name.
runToolNamerun_workflowModel-facing execution/authoring tool name.
manageToolNameworkflow_manageModel-facing lifecycle tool name.
maxCapsuleBytes512000Per workflow file admission limit.
maxCatalogEntries200Maximum catalog rows returned to callers.
maxAgents64Deployment ceiling per run. A manifest may select a lower cap.
maxConcurrency8Deployment concurrent-child ceiling shared across every project and run in this plugin instance.
maxResultChars50000Durable/rendered result-summary limit; full JSON result remains in run.json.
scriptSyncTimeoutMs10000VM synchronous slice limit.
scriptWallTimeoutMs3600000Whole restricted-script wall-clock limit.
defaultProviderspawnFallback DSH subagent provider.
synthesisProviderspawnDSH subagent transport selected by wf.synthesize.
fastProvider/ModelProvider/Model/MaxTokensspawn / unset / unset / 4096Fast tier: subagent transport plus optional DSH LLM provider/model route.
balancedProvider/ModelProvider/Model/MaxTokensspawn / unset / unset / 8192Balanced/default tier: subagent transport plus optional DSH LLM provider/model route.
deepProvider/ModelProvider/Model/MaxTokensspawn / unset / unset / 16384Deep tier: subagent transport plus optional DSH LLM provider/model route.
readOnlyAllowedToolsread, read_image, glob, grep, lsp, skill, web_searchTrusted read-only candidates. Each child receives only names also visible in its parent's live DSH catalog.
readOnlyDeniedTools[]Deprecated extra subtraction from the allow-list; never forwarded as an unvalidated deny-list.
approvalModegenerated-and-localnever, generated/trusted-local only, or always.
availableTools[]Deployment capability inventory used by capsule preflight.
availableMcp[]Available MCP server inventory used by preflight.
availableSkills[]Available skill inventory used by preflight.
maxRetainedRuns500Newest terminal runs retained automatically. Live runs are never pruned.

Example:

- id: dsh-external-workflow
  name: '@dsh-external/workflow'
  config:
    approvalMode: generated-and-local
    maxAgents: 32
    maxConcurrency: 6
    availableTools: [read, search]
    availableMcp: [github]
    availableSkills: [code-review]
    fastProvider: spawn
    fastModelProvider: deepseek-official
    fastModel: fast-model
    deepProvider: spawn
    deepModelProvider: deepseek-official
    deepModel: reasoning-model

fastProvider/balancedProvider/deepProvider name a provider registered on ctx.subagents (for example spawn, fork, acp). The corresponding *ModelProvider values name DSH LLM provider routes passed in AgentOptions. They are deliberately separate; a subagent transport name is never sent to the model router.

Deployment adapters

Register these before the first workflow operation in a project context:

ctx.dynamicWorkflows.registerIsolationAdapter({
  name: 'deployment-worktree',
  async prepare({ runId, taskId, cwd, parent }) {
    // Create a contained worktree and a DSH parent Agent whose cwd points at it.
    return { cwd: isolatedCwd, parent: isolatedParent, async dispose() { /* cleanup */ } }
  },
})

ctx.dynamicWorkflows.registerVerificationAdapter({
  async preflight(cwd, policy) { /* capture an authoritative workspace baseline */ return { ok: true, reasons: [] } },
  async verify(cwd, task, result) { /* add git/diff evidence */ return { ok: true, reasons: [], changedPaths: [] } },
})

ctx.dynamicWorkflows.registerDispatchAdapter({
  async start({ target, effort, provider, request, subagents }) {
    // Route target/effort through a deployment-specific continuable-agent or model seam.
    const run = await deploymentDispatch({ target, effort, provider, request, subagents })
    return {
      run,
      telemetry: {
        provider: 'resolved-provider', model: 'resolved-model', resolvedEffort: effort,
        // Optional measured usage, fallbackReason, iterations, and durationMs belong here.
      },
    }
  },
})

Adapters are single registrations because isolation and verification are policy authorities. Registration after an engine has started is rejected to prevent different runs in one project from receiving different semantics.

Dispatch adapters may return a bare SubagentRun or { run, telemetry }. The latter is the authority for final provider/model/effort, fallback and remote usage facts; the plugin never fabricates unknown remote token counts.

Budget semantics

For a token-budgeted workflow, every possible model tier needs maxTokens. Before a child starts, its allocation is reserved atomically against the run budget. Local DSH children reconcile the reservation from Session usage; remote providers without local usage are conservatively charged the allocation.