iiRecord
Agentic AI Atlas · SDK-Level Agent-Adapter Discovery
page:docs-adapters-babysitter-integrations-sdk-discoverya5c.ai
II.
Page JSON

page:docs-adapters-babysitter-integrations-sdk-discovery

Structured · live

SDK-Level Agent-Adapter Discovery json

Inspect the normalized record payload exactly as the atlas UI reads it.

File · wiki/docs/adapters-babysitter-integrations/sdk-discovery.mdCluster · wiki
Record JSON
{
  "id": "page:docs-adapters-babysitter-integrations-sdk-discovery",
  "_kind": "Page",
  "_file": "wiki/docs/adapters-babysitter-integrations/sdk-discovery.md",
  "_cluster": "wiki",
  "attributes": {
    "nodeKind": "Page",
    "sourcePath": "docs/adapters-babysitter-integrations/sdk-discovery.md",
    "sourceKind": "repo-docs",
    "title": "SDK-Level Agent-Adapter Discovery",
    "displayName": "SDK-Level Agent-Adapter Discovery",
    "slug": "docs/adapters-babysitter-integrations/sdk-discovery",
    "articlePath": "wiki/docs/adapters-babysitter-integrations/sdk-discovery.md",
    "article": "\n# SDK-Level Agent-Adapter Discovery\n\n## Summary\n\nAdd an optional discovery layer to the SDK that detects adapters availability and queries installed agents, supported models, and capabilities. This data feeds into process creation context.\n\n## API Design\n\n### `discoverExternalAgents(): ExternalAgentDiscovery`\n\n```typescript\n// packages/babysitter-sdk/src/harness/externalAgentDiscovery.ts\n\ninterface ExternalAgentInfo {\n  name: string;              // adapter name (e.g., \"claude\", \"codex\", \"gemini\")\n  displayName: string;       // human-readable (e.g., \"Claude Code\")\n  installed: boolean;        // detected on PATH\n  authenticated: boolean;    // has valid credentials\n  capabilities: string[];    // e.g., [\"file-edit\", \"bash\", \"browser\"]\n}\n\ninterface ExternalAgentDiscovery {\n  available: boolean;                 // is adapters installed?\n  agents: ExternalAgentInfo[];        // discovered agents\n  defaultProvider: string | null;     // ADAPTER_PROVIDER env\n  defaultModel: string | null;        // ADAPTER_MODEL env\n}\n\nexport async function discoverExternalAgents(\n  options?: { timeout?: number; cwd?: string }\n): Promise<ExternalAgentDiscovery>;\n```\n\n### Detection Strategy\n\n1. **Check if `@a5c-ai/adapters` is importable** — same pattern as `isAmuxAvailable()` in agent-platform\n2. **If importable:** call `adapterRegistry.list()` and `adapterRegistry.installed()` to get agent info\n3. **If not importable:** try `adapters doctor --json` via `execFileSync` (CLI fallback)\n4. **If neither works:** return `{ available: false, agents: [], ... }`\n\n### Caching\n\nDiscovery is expensive (spawns processes, checks file system). Cache for 60s. Invalidate on explicit `discoverExternalAgents({ force: true })`.\n\n## Files to Create/Modify\n\n### New Files\n- `packages/babysitter-sdk/src/harness/externalAgentDiscovery.ts` — discovery API\n- `packages/babysitter-sdk/src/harness/__tests__/externalAgentDiscovery.test.ts` — unit tests\n\n### Modified Files\n- `packages/babysitter-sdk/src/index.ts` — export `discoverExternalAgents`\n- `packages/babysitter-sdk/src/harness/discovery.ts` — integrate external agent discovery into harness discovery\n\n## Integration with Process Creation\n\nThe discovery result is passed into the process creation context:\n\n```typescript\n// In agent-platform/src/harness/internal/createRun/planProcess/phase.ts\nconst externalAgents = await discoverExternalAgents({ timeout: 5000 });\n\n// Inject into prompt context\nconst promptContext = buildPromptContext({\n  workspace,\n  selectedHarnessName,\n  discovered,\n  compressionConfig,\n  externalAgents,  // NEW\n});\n```\n\nThe process creation prompt then includes:\n\n```\nAvailable external agents (via adapters):\n- claude-code (installed, authenticated) — file-edit, bash, browser\n- codex (installed, authenticated) — file-edit, bash\n- gemini-cli (installed, not authenticated)\n\nYou may use `external: true` agent tasks to delegate work to these agents.\n```\n\n## Dependencies\n\n- SDK has **no hard dependency** on adapters. Discovery uses dynamic import with fallback.\n- At runtime, adapters is only needed if external tasks are actually dispatched.\n",
    "documents": []
  },
  "outgoingEdges": [],
  "incomingEdges": [
    {
      "from": "page:docs-adapters-babysitter-integrations",
      "to": "page:docs-adapters-babysitter-integrations-sdk-discovery",
      "kind": "contains_page"
    }
  ]
}