伍 · 委托

Agent 任务

ctx.agentTasks

调用 dsh 已注册的 subagent provider(如 claude-code、codex)执行一次性任务:默认只读权限、每个任务独立目录、类型化的 JSON Schema 输出、并发与排队上限。

接口

import { untrusted } from '@mc/dsh-agent-kit'

const r = await ctx.agentTasks.run<Verdict>({
  provider: 'claude-code',
  title: 'classify evt_123',
  prompt: [
    '请判断下面的事件是否异常。',
    untrusted('event', eventJson),   // 用随机分隔标记包裹外部数据,并声明其不是指令
  ],
  outputSchema,                      // JSONSchemaType<Verdict>;省略时 output 为 undefined
  model: 'optional-model-id',        // 仅传给支持该能力的 provider
  permissions: 'read-only',          // 默认值,可选 workspace-write
  timeoutMs: 120_000,
  signal,
  traceId,
  onEvent: (e) => {},                // 可选:queued / started / finished
})
// r: { sessionId, taskId, text, output: Verdict, durationMs }

provider 是 dsh 中已注册的 subagent provider 名称,例如 claude-code、codex。ctx.subagents 与子进程服务由 dsh 的 base bundle 提供,Profile 里只需安装对应的 provider 包。

隔离与权限

不可信数据

结构化输出

给出 outputSchema 时:

并发、超时与卸载

Agent 进程的环境变量

provider 启动 Agent 时,会剔除名字匹配 KEY、PASSWORD、SECRET、TOKEN 的环境变量与 DSH_*。因此本包的密钥(例如 TYPESAFE_API_KEY)不会进入 Agent 进程;反过来,如果 Agent 依赖这类变量鉴权(例如 ANTHROPIC_AUTH_TOKEN),需要在 provider 自己的配置 env 中显式给出。

审计

claude-code、codex 不持久化 Session,这些任务不会出现在 dsh Web 的会话列表中。审计依赖本包的结构化日志(prompt 与答案只记录长度与哈希)和业务包自己的记录。

配置

在 Profile 的 cordis.patch.yml 中按 id agent-kit-agent-tasks 启用并给出配置。按 id 修改 config 时整段替换,未给出的字段使用默认值。下表由本包源码中的配置 schema 生成。

- id: agent-kit-agent-tasks
  disabled: false
  config:
    # 只写需要改的字段,其余使用下表的默认值
字段默认值取值范围说明
workspaceDir 必填 — — 任务工作目录的根,专用目录,不得是业务代码目录
defaultTimeoutMs 600000 [10000, 3600000] run() 未指定 timeoutMs 时的单任务超时。
maxConcurrency 2 [1, 16] 同时运行的任务数上限,其余按 FIFO 排队。
maxQueueSize 100 ≥ 0 排队数上限,达到后新任务立即以 queue_full 失败。
keepWorkdir false — 任务结束后保留 workspaceDir/<taskId>/ 目录,便于排查。
declaredPermissions {} 见说明 不支持工具过滤的 provider 的权限上限(provider 名 → read-only | workspace-write)。
toolAllowlist.read-only ["read", "read_image", "glob", "grep", "todo_write"] 见说明 支持工具过滤的 provider 在 read-only 档位下可见的工具。
toolAllowlist.workspace-write ["read", "read_image", "glob", "grep", "todo_write", "write", "edit", "str_replace_editor"] 见说明 支持工具过滤的 provider 在 workspace-write 档位下可见的工具。

约束与说明

错误码

所有错误都是 KitError:用 isKitError(e) 判断,按 code 与 retryable 决定是否重试。

code可重试含义
provider_failed 视情况 provider 未注册、委托出错或以 error / refusal / max-tokens 结束;限流可重试,鉴权失败不可重试。
timeout 是 任务超过 timeoutMs,委托被取消。
invalid_output 否 答案中取不到 JSON,或不符合 outputSchema。
aborted 否 调用方 signal 中止或 Service 卸载。
queue_full 是 排队数达到 maxQueueSize。
unsupported_permissions 否 provider 无法保证请求的权限档位,且未声明足够严格的 declaredPermissions。
invalid_config 否 配置或环境变量非法,Service 启动失败。