II.
Page JSON
Structured · livepage:docs-adapters-babysitter-integrations-external-agent-tasks
External Agent Tasks json
Inspect the normalized record payload exactly as the atlas UI reads it.
{
"id": "page:docs-adapters-babysitter-integrations-external-agent-tasks",
"_kind": "Page",
"_file": "wiki/docs/adapters-babysitter-integrations/external-agent-tasks.md",
"_cluster": "wiki",
"attributes": {
"nodeKind": "Page",
"sourcePath": "docs/adapters-babysitter-integrations/external-agent-tasks.md",
"sourceKind": "repo-docs",
"title": "External Agent Tasks",
"displayName": "External Agent Tasks",
"slug": "docs/adapters-babysitter-integrations/external-agent-tasks",
"articlePath": "wiki/docs/adapters-babysitter-integrations/external-agent-tasks.md",
"article": "\n# External Agent Tasks\n\n## Summary\n\nExtend the `agent` task kind with `responderType` routing metadata so tasks-adapter can route work to an internal responder, human, external agent, tracker, or automatic choice. This supersedes the older #603 `external: true` proposal.\n\n## Task Definition API\n\n### Current (internal only)\n```javascript\nconst analyzeTask = defineTask(\"analyze\", (args) => ({\n kind: \"agent\",\n title: \"Analyze codebase\",\n agent: { name: \"Analyzer\", prompt: \"Analyze the code...\" },\n}));\n```\n\n### New (external via adapters)\n```javascript\nconst reviewTask = defineTask(\"review\", (args) => ({\n kind: \"agent\",\n title: \"Code review via Claude Code\",\n agent: {\n name: \"Code Reviewer\",\n prompt: \"Review the changes in the working directory...\",\n responderType: \"agent\", // tasks-adapter routes to adapters\n adapter: \"claude-code\", // NEW — which adapters adapter\n model: \"claude-sonnet-4-6\", // optional — model override\n provider: \"anthropic\", // optional — provider override\n timeoutMs: 300_000, // optional — per-task timeout\n approvalMode: \"yolo\", // optional — auto-approve tool use\n maxTurns: 10, // optional — conversation turn limit\n },\n}));\n```\n\n### Fallback behavior\n```javascript\nconst flexibleTask = defineTask(\"flexible-review\", (args) => ({\n kind: \"agent\",\n title: \"Code review\",\n agent: {\n name: \"Reviewer\",\n prompt: \"Review the code...\",\n responderType: \"agent\",\n adapter: \"claude-code\",\n fallbackType: \"internal\",\n },\n}));\n```\n\n## SDK Changes\n\n### `packages/babysitter-sdk/src/tasks/types.ts`\n\n```typescript\ninterface AgentTaskOptions {\n name: string;\n prompt: string | { instructions: string[] };\n outputSchema?: Record<string, unknown>;\n responderType?: \"internal\" | \"human\" | \"agent\" | \"tracker\" | \"auto\";\n adapter?: string; // adapters adapter name\n fallbackType?: \"internal\" | \"human\" | \"agent\" | \"tracker\" | \"auto\";\n model?: string; // model override\n provider?: string; // provider override\n timeoutMs?: number; // per-task timeout\n approvalMode?: \"yolo\" | \"prompt\";\n maxTurns?: number;\n}\n\n// Add to TaskDef\ninterface TaskDef {\n kind: TaskKind;\n agent?: AgentTaskOptions; // existing field, extended\n // ...\n}\n```\n\n### `packages/babysitter-sdk/src/tasks/kinds/index.ts`\n\nAdd helper function:\n\n```typescript\nconst reviewTask = externalAgentTask(\"review\", {\n adapter: \"claude-code\",\n prompt: \"Review the changes in the working directory...\",\n fallbackType: \"internal\",\n});\n```\n\n### `packages/babysitter-sdk/src/tasks/defineTask.ts`\n\nWhen the task kind is `\"agent\"` and `agent.responderType` is `\"agent\"`:\n- Validate that `agent.adapter` is set\n- Preserve valid routing metadata on the task definition\n- Leave effect routing to the tasks-adapter work tracked by #630/#620\n\n## Files to Modify\n\n- `packages/babysitter-sdk/src/tasks/types.ts` — extend AgentTaskOptions with responder routing fields\n- `packages/babysitter-sdk/src/tasks/kinds/index.ts` — export `externalAgentTask`, `humanTask`, and `autoTask` helpers\n- `packages/babysitter-sdk/src/tasks/defineTask.ts` — validate agent adapter for `responderType: \"agent\"`\n- `packages/babysitter-sdk/src/tasks/serializer.ts` — preserve typed agent routing metadata\n- `packages/babysitter-sdk/src/tasks/__tests__/*.test.ts` — cover helpers, validation, serialization, and compatibility\n\n## Validation Rules\n\nIn SDK task definition validation:\n- Accept typed `agent.responderType`\n- Validate `adapter` is a non-empty string when `agent.responderType === \"agent\"`\n- Leave adapter availability checks to the tasks-adapter/runtime routing work\n\n## Process Template Update\n\nWhen external agents are available, the process definition template should mention:\n\n```\nYou may use external agent tasks to delegate work to installed agents:\n- defineTask(\"id\", (args) => ({\n kind: \"agent\",\n agent: { name: \"...\", prompt: \"...\", responderType: \"agent\", adapter: \"claude-code\" }\n }))\nAvailable adapters: claude-code, codex, gemini-cli, ...\n```\n",
"documents": []
},
"outgoingEdges": [],
"incomingEdges": [
{
"from": "page:docs-adapters-babysitter-integrations",
"to": "page:docs-adapters-babysitter-integrations-external-agent-tasks",
"kind": "contains_page"
}
]
}