@stoneforge/smithy 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +114 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +7 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/orchestrator-api.d.ts +153 -0
- package/dist/api/orchestrator-api.d.ts.map +1 -0
- package/dist/api/orchestrator-api.js +374 -0
- package/dist/api/orchestrator-api.js.map +1 -0
- package/dist/bin/sf.d.ts +3 -0
- package/dist/bin/sf.d.ts.map +1 -0
- package/dist/bin/sf.js +10 -0
- package/dist/bin/sf.js.map +1 -0
- package/dist/cli/commands/agent.d.ts +20 -0
- package/dist/cli/commands/agent.d.ts.map +1 -0
- package/dist/cli/commands/agent.js +861 -0
- package/dist/cli/commands/agent.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +14 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +272 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/dispatch.d.ts +9 -0
- package/dist/cli/commands/dispatch.d.ts.map +1 -0
- package/dist/cli/commands/dispatch.js +128 -0
- package/dist/cli/commands/dispatch.js.map +1 -0
- package/dist/cli/commands/merge.d.ts +11 -0
- package/dist/cli/commands/merge.d.ts.map +1 -0
- package/dist/cli/commands/merge.js +246 -0
- package/dist/cli/commands/merge.js.map +1 -0
- package/dist/cli/commands/pool.d.ts +21 -0
- package/dist/cli/commands/pool.d.ts.map +1 -0
- package/dist/cli/commands/pool.js +762 -0
- package/dist/cli/commands/pool.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +54 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +57 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/task.d.ts +36 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +889 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/test-orchestration.d.ts +32 -0
- package/dist/cli/commands/test-orchestration.d.ts.map +1 -0
- package/dist/cli/commands/test-orchestration.js +392 -0
- package/dist/cli/commands/test-orchestration.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/plugin.d.ts +23 -0
- package/dist/cli/plugin.d.ts.map +1 -0
- package/dist/cli/plugin.js +36 -0
- package/dist/cli/plugin.js.map +1 -0
- package/dist/git/index.d.ts +10 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +12 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/merge.d.ts +79 -0
- package/dist/git/merge.d.ts.map +1 -0
- package/dist/git/merge.js +254 -0
- package/dist/git/merge.js.map +1 -0
- package/dist/git/worktree-manager.d.ts +299 -0
- package/dist/git/worktree-manager.d.ts.map +1 -0
- package/dist/git/worktree-manager.js +744 -0
- package/dist/git/worktree-manager.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/director.md +272 -0
- package/dist/prompts/index.d.ts +100 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +294 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/message-triage.md +50 -0
- package/dist/prompts/persistent-worker.md +240 -0
- package/dist/prompts/steward-base.md +64 -0
- package/dist/prompts/steward-docs.md +118 -0
- package/dist/prompts/steward-health.md +39 -0
- package/dist/prompts/steward-merge.md +168 -0
- package/dist/prompts/steward-ops.md +28 -0
- package/dist/prompts/steward-reminder.md +26 -0
- package/dist/prompts/worker.md +282 -0
- package/dist/providers/claude/headless.d.ts +18 -0
- package/dist/providers/claude/headless.d.ts.map +1 -0
- package/dist/providers/claude/headless.js +307 -0
- package/dist/providers/claude/headless.js.map +1 -0
- package/dist/providers/claude/index.d.ts +24 -0
- package/dist/providers/claude/index.d.ts.map +1 -0
- package/dist/providers/claude/index.js +80 -0
- package/dist/providers/claude/index.js.map +1 -0
- package/dist/providers/claude/interactive.d.ts +21 -0
- package/dist/providers/claude/interactive.d.ts.map +1 -0
- package/dist/providers/claude/interactive.js +142 -0
- package/dist/providers/claude/interactive.js.map +1 -0
- package/dist/providers/codex/event-mapper.d.ts +91 -0
- package/dist/providers/codex/event-mapper.d.ts.map +1 -0
- package/dist/providers/codex/event-mapper.js +299 -0
- package/dist/providers/codex/event-mapper.js.map +1 -0
- package/dist/providers/codex/headless.d.ts +20 -0
- package/dist/providers/codex/headless.d.ts.map +1 -0
- package/dist/providers/codex/headless.js +174 -0
- package/dist/providers/codex/headless.js.map +1 -0
- package/dist/providers/codex/index.d.ts +30 -0
- package/dist/providers/codex/index.d.ts.map +1 -0
- package/dist/providers/codex/index.js +55 -0
- package/dist/providers/codex/index.js.map +1 -0
- package/dist/providers/codex/interactive.d.ts +21 -0
- package/dist/providers/codex/interactive.d.ts.map +1 -0
- package/dist/providers/codex/interactive.js +141 -0
- package/dist/providers/codex/interactive.js.map +1 -0
- package/dist/providers/codex/jsonrpc-client.d.ts +52 -0
- package/dist/providers/codex/jsonrpc-client.d.ts.map +1 -0
- package/dist/providers/codex/jsonrpc-client.js +141 -0
- package/dist/providers/codex/jsonrpc-client.js.map +1 -0
- package/dist/providers/codex/server-manager.d.ts +100 -0
- package/dist/providers/codex/server-manager.d.ts.map +1 -0
- package/dist/providers/codex/server-manager.js +153 -0
- package/dist/providers/codex/server-manager.js.map +1 -0
- package/dist/providers/index.d.ts +15 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/opencode/async-queue.d.ts +21 -0
- package/dist/providers/opencode/async-queue.d.ts.map +1 -0
- package/dist/providers/opencode/async-queue.js +51 -0
- package/dist/providers/opencode/async-queue.js.map +1 -0
- package/dist/providers/opencode/event-mapper.d.ts +132 -0
- package/dist/providers/opencode/event-mapper.d.ts.map +1 -0
- package/dist/providers/opencode/event-mapper.js +204 -0
- package/dist/providers/opencode/event-mapper.js.map +1 -0
- package/dist/providers/opencode/headless.d.ts +25 -0
- package/dist/providers/opencode/headless.d.ts.map +1 -0
- package/dist/providers/opencode/headless.js +190 -0
- package/dist/providers/opencode/headless.js.map +1 -0
- package/dist/providers/opencode/index.d.ts +33 -0
- package/dist/providers/opencode/index.d.ts.map +1 -0
- package/dist/providers/opencode/index.js +42 -0
- package/dist/providers/opencode/index.js.map +1 -0
- package/dist/providers/opencode/interactive.d.ts +21 -0
- package/dist/providers/opencode/interactive.d.ts.map +1 -0
- package/dist/providers/opencode/interactive.js +135 -0
- package/dist/providers/opencode/interactive.js.map +1 -0
- package/dist/providers/opencode/server-manager.d.ts +145 -0
- package/dist/providers/opencode/server-manager.d.ts.map +1 -0
- package/dist/providers/opencode/server-manager.js +163 -0
- package/dist/providers/opencode/server-manager.js.map +1 -0
- package/dist/providers/registry.d.ts +38 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +82 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +144 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +25 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/runtime/event-utils.d.ts +8 -0
- package/dist/runtime/event-utils.d.ts.map +1 -0
- package/dist/runtime/event-utils.js +23 -0
- package/dist/runtime/event-utils.js.map +1 -0
- package/dist/runtime/handoff.d.ts +195 -0
- package/dist/runtime/handoff.d.ts.map +1 -0
- package/dist/runtime/handoff.js +332 -0
- package/dist/runtime/handoff.js.map +1 -0
- package/dist/runtime/index.d.ts +17 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +60 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/message-mapper.d.ts +99 -0
- package/dist/runtime/message-mapper.d.ts.map +1 -0
- package/dist/runtime/message-mapper.js +202 -0
- package/dist/runtime/message-mapper.js.map +1 -0
- package/dist/runtime/predecessor-query.d.ts +212 -0
- package/dist/runtime/predecessor-query.d.ts.map +1 -0
- package/dist/runtime/predecessor-query.js +283 -0
- package/dist/runtime/predecessor-query.js.map +1 -0
- package/dist/runtime/session-manager.d.ts +466 -0
- package/dist/runtime/session-manager.d.ts.map +1 -0
- package/dist/runtime/session-manager.js +986 -0
- package/dist/runtime/session-manager.js.map +1 -0
- package/dist/runtime/spawner.d.ts +407 -0
- package/dist/runtime/spawner.d.ts.map +1 -0
- package/dist/runtime/spawner.js +781 -0
- package/dist/runtime/spawner.js.map +1 -0
- package/dist/server/config.d.ts +22 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +59 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/daemon-state.d.ts +50 -0
- package/dist/server/daemon-state.d.ts.map +1 -0
- package/dist/server/daemon-state.js +100 -0
- package/dist/server/daemon-state.js.map +1 -0
- package/dist/server/events-websocket.d.ts +32 -0
- package/dist/server/events-websocket.d.ts.map +1 -0
- package/dist/server/events-websocket.js +96 -0
- package/dist/server/events-websocket.js.map +1 -0
- package/dist/server/formatters.d.ts +94 -0
- package/dist/server/formatters.d.ts.map +1 -0
- package/dist/server/formatters.js +142 -0
- package/dist/server/formatters.js.map +1 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +153 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lsp-websocket.d.ts +33 -0
- package/dist/server/lsp-websocket.d.ts.map +1 -0
- package/dist/server/lsp-websocket.js +161 -0
- package/dist/server/lsp-websocket.js.map +1 -0
- package/dist/server/routes/agents.d.ts +9 -0
- package/dist/server/routes/agents.d.ts.map +1 -0
- package/dist/server/routes/agents.js +369 -0
- package/dist/server/routes/agents.js.map +1 -0
- package/dist/server/routes/daemon.d.ts +13 -0
- package/dist/server/routes/daemon.d.ts.map +1 -0
- package/dist/server/routes/daemon.js +187 -0
- package/dist/server/routes/daemon.js.map +1 -0
- package/dist/server/routes/events.d.ts +23 -0
- package/dist/server/routes/events.d.ts.map +1 -0
- package/dist/server/routes/events.js +282 -0
- package/dist/server/routes/events.js.map +1 -0
- package/dist/server/routes/extensions.d.ts +9 -0
- package/dist/server/routes/extensions.d.ts.map +1 -0
- package/dist/server/routes/extensions.js +202 -0
- package/dist/server/routes/extensions.js.map +1 -0
- package/dist/server/routes/health.d.ts +7 -0
- package/dist/server/routes/health.d.ts.map +1 -0
- package/dist/server/routes/health.js +33 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/index.d.ts +21 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +21 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/lsp.d.ts +9 -0
- package/dist/server/routes/lsp.d.ts.map +1 -0
- package/dist/server/routes/lsp.js +50 -0
- package/dist/server/routes/lsp.js.map +1 -0
- package/dist/server/routes/plugins.d.ts +9 -0
- package/dist/server/routes/plugins.d.ts.map +1 -0
- package/dist/server/routes/plugins.js +109 -0
- package/dist/server/routes/plugins.js.map +1 -0
- package/dist/server/routes/pools.d.ts +9 -0
- package/dist/server/routes/pools.d.ts.map +1 -0
- package/dist/server/routes/pools.js +189 -0
- package/dist/server/routes/pools.js.map +1 -0
- package/dist/server/routes/scheduler.d.ts +9 -0
- package/dist/server/routes/scheduler.d.ts.map +1 -0
- package/dist/server/routes/scheduler.js +162 -0
- package/dist/server/routes/scheduler.js.map +1 -0
- package/dist/server/routes/sessions.d.ts +27 -0
- package/dist/server/routes/sessions.d.ts.map +1 -0
- package/dist/server/routes/sessions.js +773 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/tasks.d.ts +9 -0
- package/dist/server/routes/tasks.d.ts.map +1 -0
- package/dist/server/routes/tasks.js +954 -0
- package/dist/server/routes/tasks.js.map +1 -0
- package/dist/server/routes/upload.d.ts +8 -0
- package/dist/server/routes/upload.d.ts.map +1 -0
- package/dist/server/routes/upload.js +40 -0
- package/dist/server/routes/upload.js.map +1 -0
- package/dist/server/routes/workflows.d.ts +9 -0
- package/dist/server/routes/workflows.d.ts.map +1 -0
- package/dist/server/routes/workflows.js +532 -0
- package/dist/server/routes/workflows.js.map +1 -0
- package/dist/server/routes/workspace-files.d.ts +12 -0
- package/dist/server/routes/workspace-files.d.ts.map +1 -0
- package/dist/server/routes/workspace-files.js +520 -0
- package/dist/server/routes/workspace-files.js.map +1 -0
- package/dist/server/routes/worktrees.d.ts +9 -0
- package/dist/server/routes/worktrees.d.ts.map +1 -0
- package/dist/server/routes/worktrees.js +94 -0
- package/dist/server/routes/worktrees.js.map +1 -0
- package/dist/server/server.d.ts +14 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +258 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/services/lsp-manager.d.ts +93 -0
- package/dist/server/services/lsp-manager.d.ts.map +1 -0
- package/dist/server/services/lsp-manager.js +291 -0
- package/dist/server/services/lsp-manager.js.map +1 -0
- package/dist/server/services/session-messages.d.ts +61 -0
- package/dist/server/services/session-messages.d.ts.map +1 -0
- package/dist/server/services/session-messages.js +101 -0
- package/dist/server/services/session-messages.js.map +1 -0
- package/dist/server/services.d.ts +35 -0
- package/dist/server/services.d.ts.map +1 -0
- package/dist/server/services.js +159 -0
- package/dist/server/services.js.map +1 -0
- package/dist/server/static.d.ts +18 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +71 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/types.d.ts +20 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +7 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/websocket.d.ts +16 -0
- package/dist/server/websocket.d.ts.map +1 -0
- package/dist/server/websocket.js +143 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/services/agent-pool-service.d.ts +181 -0
- package/dist/services/agent-pool-service.d.ts.map +1 -0
- package/dist/services/agent-pool-service.js +590 -0
- package/dist/services/agent-pool-service.js.map +1 -0
- package/dist/services/agent-registry.d.ts +185 -0
- package/dist/services/agent-registry.d.ts.map +1 -0
- package/dist/services/agent-registry.js +432 -0
- package/dist/services/agent-registry.js.map +1 -0
- package/dist/services/dispatch-daemon.d.ts +429 -0
- package/dist/services/dispatch-daemon.d.ts.map +1 -0
- package/dist/services/dispatch-daemon.js +1833 -0
- package/dist/services/dispatch-daemon.js.map +1 -0
- package/dist/services/dispatch-service.d.ts +148 -0
- package/dist/services/dispatch-service.d.ts.map +1 -0
- package/dist/services/dispatch-service.js +170 -0
- package/dist/services/dispatch-service.js.map +1 -0
- package/dist/services/docs-steward-service.d.ts +199 -0
- package/dist/services/docs-steward-service.d.ts.map +1 -0
- package/dist/services/docs-steward-service.js +599 -0
- package/dist/services/docs-steward-service.js.map +1 -0
- package/dist/services/health-steward-service.d.ts +446 -0
- package/dist/services/health-steward-service.d.ts.map +1 -0
- package/dist/services/health-steward-service.js +866 -0
- package/dist/services/health-steward-service.js.map +1 -0
- package/dist/services/index.d.ts +26 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +111 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/merge-request-provider.d.ts +59 -0
- package/dist/services/merge-request-provider.d.ts.map +1 -0
- package/dist/services/merge-request-provider.js +89 -0
- package/dist/services/merge-request-provider.js.map +1 -0
- package/dist/services/merge-steward-service.d.ts +268 -0
- package/dist/services/merge-steward-service.d.ts.map +1 -0
- package/dist/services/merge-steward-service.js +568 -0
- package/dist/services/merge-steward-service.js.map +1 -0
- package/dist/services/plugin-executor.d.ts +247 -0
- package/dist/services/plugin-executor.d.ts.map +1 -0
- package/dist/services/plugin-executor.js +451 -0
- package/dist/services/plugin-executor.js.map +1 -0
- package/dist/services/role-definition-service.d.ts +117 -0
- package/dist/services/role-definition-service.d.ts.map +1 -0
- package/dist/services/role-definition-service.js +289 -0
- package/dist/services/role-definition-service.js.map +1 -0
- package/dist/services/steward-scheduler.d.ts +336 -0
- package/dist/services/steward-scheduler.d.ts.map +1 -0
- package/dist/services/steward-scheduler.js +732 -0
- package/dist/services/steward-scheduler.js.map +1 -0
- package/dist/services/task-assignment-service.d.ts +291 -0
- package/dist/services/task-assignment-service.d.ts.map +1 -0
- package/dist/services/task-assignment-service.js +454 -0
- package/dist/services/task-assignment-service.js.map +1 -0
- package/dist/services/worker-task-service.d.ts +202 -0
- package/dist/services/worker-task-service.d.ts.map +1 -0
- package/dist/services/worker-task-service.js +228 -0
- package/dist/services/worker-task-service.js.map +1 -0
- package/dist/testing/index.d.ts +13 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +17 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/orchestration-tests.d.ts +62 -0
- package/dist/testing/orchestration-tests.d.ts.map +1 -0
- package/dist/testing/orchestration-tests.js +1115 -0
- package/dist/testing/orchestration-tests.js.map +1 -0
- package/dist/testing/test-context.d.ts +171 -0
- package/dist/testing/test-context.d.ts.map +1 -0
- package/dist/testing/test-context.js +665 -0
- package/dist/testing/test-context.js.map +1 -0
- package/dist/testing/test-prompts.d.ts +46 -0
- package/dist/testing/test-prompts.d.ts.map +1 -0
- package/dist/testing/test-prompts.js +140 -0
- package/dist/testing/test-prompts.js.map +1 -0
- package/dist/testing/test-utils.d.ts +200 -0
- package/dist/testing/test-utils.d.ts.map +1 -0
- package/dist/testing/test-utils.js +378 -0
- package/dist/testing/test-utils.js.map +1 -0
- package/dist/types/agent-pool.d.ts +215 -0
- package/dist/types/agent-pool.d.ts.map +1 -0
- package/dist/types/agent-pool.js +143 -0
- package/dist/types/agent-pool.js.map +1 -0
- package/dist/types/agent.d.ts +265 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +127 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +40 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/message-types.d.ts +294 -0
- package/dist/types/message-types.d.ts.map +1 -0
- package/dist/types/message-types.js +354 -0
- package/dist/types/message-types.js.map +1 -0
- package/dist/types/role-definition.d.ts +272 -0
- package/dist/types/role-definition.d.ts.map +1 -0
- package/dist/types/role-definition.js +144 -0
- package/dist/types/role-definition.js.map +1 -0
- package/dist/types/task-meta.d.ts +248 -0
- package/dist/types/task-meta.d.ts.map +1 -0
- package/dist/types/task-meta.js +213 -0
- package/dist/types/task-meta.js.map +1 -0
- package/package.json +120 -0
- package/web/assets/abap-BrgZPUOV.js +6 -0
- package/web/assets/apex-DyP6w7ZV.js +6 -0
- package/web/assets/azcli-BaLxmfj-.js +6 -0
- package/web/assets/bat-CFOPXBzS.js +6 -0
- package/web/assets/bicep-BfEKNvv3.js +7 -0
- package/web/assets/cameligo-BFG1Mk7z.js +6 -0
- package/web/assets/clojure-DTECt2xU.js +6 -0
- package/web/assets/codicon-DCmgc-ay.ttf +0 -0
- package/web/assets/coffee-CDGzqUPQ.js +6 -0
- package/web/assets/cpp-CLLBncYj.js +6 -0
- package/web/assets/csharp-dUCx_-0o.js +6 -0
- package/web/assets/csp-5Rap-vPy.js +6 -0
- package/web/assets/css-D3h14YRZ.js +8 -0
- package/web/assets/cssMode-DMo-5YLA.js +9 -0
- package/web/assets/cypher-DrQuvNYM.js +6 -0
- package/web/assets/dart-CFKIUWau.js +6 -0
- package/web/assets/dockerfile-Zznr-cwX.js +6 -0
- package/web/assets/ecl-Ce3n6wWz.js +6 -0
- package/web/assets/elixir-deUWdS0T.js +6 -0
- package/web/assets/flow9-i9-g7ZhI.js +6 -0
- package/web/assets/freemarker2-D4qgkQzN.js +8 -0
- package/web/assets/fsharp-CzKuDChf.js +6 -0
- package/web/assets/go-Cphgjts3.js +6 -0
- package/web/assets/graphql-Cg7bfA9N.js +6 -0
- package/web/assets/handlebars-CXFvNjQC.js +6 -0
- package/web/assets/hcl-0cvrggvQ.js +6 -0
- package/web/assets/html-oyuB_D-B.js +6 -0
- package/web/assets/htmlMode-iWuZ24-r.js +9 -0
- package/web/assets/index-DqP-_E4F.css +32 -0
- package/web/assets/index-R1cylSgw.js +1665 -0
- package/web/assets/ini-Drc7WvVn.js +6 -0
- package/web/assets/java-B_fMsGYe.js +6 -0
- package/web/assets/javascript-CRIkN2Pg.js +6 -0
- package/web/assets/jsonMode-DVDkDgex.js +15 -0
- package/web/assets/julia-Bqgm2twL.js +6 -0
- package/web/assets/kotlin-BSkB5QuD.js +6 -0
- package/web/assets/less-BsTHnhdd.js +7 -0
- package/web/assets/lexon-YWi4-JPR.js +6 -0
- package/web/assets/liquid-CSfldbB5.js +6 -0
- package/web/assets/lua-nf6ki56Z.js +6 -0
- package/web/assets/m3-Cpb6xl2v.js +6 -0
- package/web/assets/markdown-DSZPf7rp.js +6 -0
- package/web/assets/mdx-Dd58iymR.js +6 -0
- package/web/assets/mips-B_c3zf-v.js +6 -0
- package/web/assets/monaco-editor-B4lwqA13.js +751 -0
- package/web/assets/monaco-editor-CQpyCxOA.css +1 -0
- package/web/assets/msdax-rUNN04Wq.js +6 -0
- package/web/assets/mysql-DDwshQtU.js +6 -0
- package/web/assets/objective-c-B5zXfXm9.js +6 -0
- package/web/assets/pascal-CXOwvkN_.js +6 -0
- package/web/assets/pascaligo-Bc-ZgV77.js +6 -0
- package/web/assets/perl-CwNk8-XU.js +6 -0
- package/web/assets/pgsql-tGk8EFnU.js +6 -0
- package/web/assets/php-CpIb_Oan.js +6 -0
- package/web/assets/pla-B03wrqEc.js +6 -0
- package/web/assets/postiats-BKlk5iyT.js +6 -0
- package/web/assets/powerquery-Bhzvs7bI.js +6 -0
- package/web/assets/powershell-Dd3NCNK9.js +6 -0
- package/web/assets/protobuf-COyEY5Pt.js +7 -0
- package/web/assets/pug-BaJupSGV.js +6 -0
- package/web/assets/python-XWrMqdhO.js +6 -0
- package/web/assets/qsharp-DXyYeYxl.js +6 -0
- package/web/assets/r-CdQndTaG.js +6 -0
- package/web/assets/razor-DPlhCpIs.js +6 -0
- package/web/assets/redis-CVwtpugi.js +6 -0
- package/web/assets/redshift-25W9uPmb.js +6 -0
- package/web/assets/restructuredtext-DfzH4Xui.js +6 -0
- package/web/assets/router-vendor-DHlGizSU.js +41 -0
- package/web/assets/ruby-Cp1zYvxS.js +6 -0
- package/web/assets/rust-D5C2fndG.js +6 -0
- package/web/assets/sb-CDntyWJ8.js +6 -0
- package/web/assets/scala-BoFRg7Ot.js +6 -0
- package/web/assets/scheme-Bio4gycK.js +6 -0
- package/web/assets/scss-4Ik7cdeQ.js +8 -0
- package/web/assets/shell-CX-rkNHf.js +6 -0
- package/web/assets/solidity-Tw7wswEv.js +6 -0
- package/web/assets/sophia-C5WLch3f.js +6 -0
- package/web/assets/sparql-DHaeiCBh.js +6 -0
- package/web/assets/sql-CCSDG5nI.js +6 -0
- package/web/assets/st-pnP8ivHi.js +6 -0
- package/web/assets/swift-DwJ7jVG9.js +8 -0
- package/web/assets/systemverilog-B9Xyijhd.js +6 -0
- package/web/assets/tcl-DnHyzjbg.js +6 -0
- package/web/assets/tsMode-BbA1Jbf3.js +16 -0
- package/web/assets/twig-CPajHgWi.js +6 -0
- package/web/assets/typescript-DcLHYzvH.js +6 -0
- package/web/assets/typespec-D-MeaMDU.js +6 -0
- package/web/assets/ui-vendor-BSco96uv.js +51 -0
- package/web/assets/utils-vendor-DaJ2Dubl.js +911 -0
- package/web/assets/vb-DgyLZaXg.js +6 -0
- package/web/assets/wgsl-DYQUnd45.js +303 -0
- package/web/assets/xml-xKYS3dO6.js +6 -0
- package/web/assets/yaml-CNmlXqzH.js +6 -0
- package/web/favicon.ico +0 -0
- package/web/index.html +22 -0
- package/web/logo.png +0 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handoff Service (TB-O10e, TB-O10f)
|
|
3
|
+
*
|
|
4
|
+
* This service enables agent session handoffs for context preservation:
|
|
5
|
+
*
|
|
6
|
+
* - **Self-Handoff (TB-O10e)**: Agent hands off to fresh instance of itself
|
|
7
|
+
* - Creates handoff message with context summary
|
|
8
|
+
* - Suspends current session (available for predecessor query)
|
|
9
|
+
* - New session finds handoff note in inbox
|
|
10
|
+
*
|
|
11
|
+
* - **Agent-Agent Handoff (TB-O10f)**: Agent hands off to another agent
|
|
12
|
+
* - Sends handoff message to target agent's channel
|
|
13
|
+
* - Optionally transfers tasks to target agent
|
|
14
|
+
* - Triggers target agent to process handoff
|
|
15
|
+
*
|
|
16
|
+
* Key design decisions:
|
|
17
|
+
* - Handoff is manual-only (agent decides when to hand off)
|
|
18
|
+
* - Handoff messages stored as Documents for persistence
|
|
19
|
+
* - Uses existing inbox/channel system for delivery
|
|
20
|
+
*
|
|
21
|
+
* @module
|
|
22
|
+
*/
|
|
23
|
+
import type { EntityId, DocumentId, MessageId, Timestamp } from '@stoneforge/core';
|
|
24
|
+
import type { QuarryAPI } from '@stoneforge/quarry';
|
|
25
|
+
import type { SessionManager, SessionRecord } from './session-manager.js';
|
|
26
|
+
import type { AgentRegistry } from '../services/agent-registry.js';
|
|
27
|
+
/**
|
|
28
|
+
* Handoff message content structure
|
|
29
|
+
*/
|
|
30
|
+
export interface HandoffContent {
|
|
31
|
+
/** Type identifier for handoff messages */
|
|
32
|
+
readonly type: 'handoff';
|
|
33
|
+
/** Agent ID of the source (handing off) */
|
|
34
|
+
readonly fromAgentId: EntityId;
|
|
35
|
+
/** Agent ID of the target (receiving handoff), undefined for self-handoff */
|
|
36
|
+
readonly toAgentId?: EntityId;
|
|
37
|
+
/** Summary of the current context/state */
|
|
38
|
+
readonly contextSummary: string;
|
|
39
|
+
/** Recommended next steps */
|
|
40
|
+
readonly nextSteps?: string;
|
|
41
|
+
/** Reason for the handoff */
|
|
42
|
+
readonly reason?: string;
|
|
43
|
+
/** Task IDs being transferred (for agent-agent handoff) */
|
|
44
|
+
readonly taskIds?: string[];
|
|
45
|
+
/** Provider session ID for predecessor queries */
|
|
46
|
+
readonly providerSessionId?: string;
|
|
47
|
+
/** Timestamp when handoff was initiated */
|
|
48
|
+
readonly initiatedAt: Timestamp;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Options for self-handoff
|
|
52
|
+
*/
|
|
53
|
+
export interface SelfHandoffOptions {
|
|
54
|
+
/** Summary of current context to preserve */
|
|
55
|
+
readonly contextSummary: string;
|
|
56
|
+
/** Recommended next steps for the new session */
|
|
57
|
+
readonly nextSteps?: string;
|
|
58
|
+
/** Reason for triggering handoff */
|
|
59
|
+
readonly reason?: string;
|
|
60
|
+
/** Additional metadata to include */
|
|
61
|
+
readonly metadata?: Record<string, unknown>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Result of a self-handoff operation
|
|
65
|
+
*/
|
|
66
|
+
export interface SelfHandoffResult {
|
|
67
|
+
/** Whether the handoff was successful */
|
|
68
|
+
readonly success: boolean;
|
|
69
|
+
/** The handoff document ID */
|
|
70
|
+
readonly handoffDocumentId?: DocumentId;
|
|
71
|
+
/** The message ID sent to the agent's channel */
|
|
72
|
+
readonly messageId?: MessageId;
|
|
73
|
+
/** The suspended session record */
|
|
74
|
+
readonly suspendedSession?: SessionRecord;
|
|
75
|
+
/** Error message if failed */
|
|
76
|
+
readonly error?: string;
|
|
77
|
+
/** Timestamp when handoff completed */
|
|
78
|
+
readonly completedAt: Timestamp;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Options for agent-to-agent handoff
|
|
82
|
+
*/
|
|
83
|
+
export interface AgentHandoffOptions {
|
|
84
|
+
/** Summary of current context to preserve */
|
|
85
|
+
readonly contextSummary: string;
|
|
86
|
+
/** Recommended next steps for the target agent */
|
|
87
|
+
readonly nextSteps?: string;
|
|
88
|
+
/** Reason for triggering handoff */
|
|
89
|
+
readonly reason?: string;
|
|
90
|
+
/** Task IDs to transfer to the target agent */
|
|
91
|
+
readonly taskIds?: string[];
|
|
92
|
+
/** Additional metadata to include */
|
|
93
|
+
readonly metadata?: Record<string, unknown>;
|
|
94
|
+
/** Whether to trigger the target agent to wake up (default: true) */
|
|
95
|
+
readonly triggerTarget?: boolean;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Result of an agent-to-agent handoff operation
|
|
99
|
+
*/
|
|
100
|
+
export interface AgentHandoffResult {
|
|
101
|
+
/** Whether the handoff was successful */
|
|
102
|
+
readonly success: boolean;
|
|
103
|
+
/** The handoff document ID */
|
|
104
|
+
readonly handoffDocumentId?: DocumentId;
|
|
105
|
+
/** The message ID sent to the target agent's channel */
|
|
106
|
+
readonly messageId?: MessageId;
|
|
107
|
+
/** The suspended session record of the source agent */
|
|
108
|
+
readonly suspendedSession?: SessionRecord;
|
|
109
|
+
/** The target agent ID */
|
|
110
|
+
readonly targetAgentId?: EntityId;
|
|
111
|
+
/** Error message if failed */
|
|
112
|
+
readonly error?: string;
|
|
113
|
+
/** Timestamp when handoff completed */
|
|
114
|
+
readonly completedAt: Timestamp;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Handoff Service interface for agent session handoffs.
|
|
118
|
+
*
|
|
119
|
+
* The service provides methods for:
|
|
120
|
+
* - Self-handoff: Agent hands off to fresh instance of itself
|
|
121
|
+
* - Agent-agent handoff: Agent hands off to another agent (TB-O10f)
|
|
122
|
+
*/
|
|
123
|
+
export interface HandoffService {
|
|
124
|
+
/**
|
|
125
|
+
* Performs a self-handoff for an agent.
|
|
126
|
+
*
|
|
127
|
+
* This operation:
|
|
128
|
+
* 1. Creates a handoff document with context summary
|
|
129
|
+
* 2. Sends a handoff message to the agent's own channel
|
|
130
|
+
* 3. Suspends the current session (preserving provider session ID)
|
|
131
|
+
* 4. Terminates the process gracefully
|
|
132
|
+
*
|
|
133
|
+
* The new session can find the handoff note in its inbox and
|
|
134
|
+
* optionally query the suspended predecessor for more context.
|
|
135
|
+
*
|
|
136
|
+
* @param agentId - The agent performing the handoff
|
|
137
|
+
* @param sessionId - The current session ID
|
|
138
|
+
* @param options - Handoff options
|
|
139
|
+
* @returns Result of the handoff operation
|
|
140
|
+
*/
|
|
141
|
+
selfHandoff(agentId: EntityId, sessionId: string, options: SelfHandoffOptions): Promise<SelfHandoffResult>;
|
|
142
|
+
/**
|
|
143
|
+
* Performs a handoff from one agent to another.
|
|
144
|
+
*
|
|
145
|
+
* This operation:
|
|
146
|
+
* 1. Creates a handoff document with context summary
|
|
147
|
+
* 2. Sends a handoff message to the target agent's channel
|
|
148
|
+
* 3. Optionally transfers task assignments to the target
|
|
149
|
+
* 4. Suspends the source session
|
|
150
|
+
* 5. Optionally triggers the target agent to wake up
|
|
151
|
+
*
|
|
152
|
+
* @param fromAgentId - The agent initiating the handoff
|
|
153
|
+
* @param toAgentId - The target agent receiving the handoff
|
|
154
|
+
* @param sessionId - The current session ID of the source agent
|
|
155
|
+
* @param options - Handoff options
|
|
156
|
+
* @returns Result of the handoff operation
|
|
157
|
+
*/
|
|
158
|
+
handoffToAgent(fromAgentId: EntityId, toAgentId: EntityId, sessionId: string, options: AgentHandoffOptions): Promise<AgentHandoffResult>;
|
|
159
|
+
/**
|
|
160
|
+
* Gets the most recent handoff message for an agent.
|
|
161
|
+
*
|
|
162
|
+
* @param agentId - The agent to check for handoff messages
|
|
163
|
+
* @returns The most recent handoff content, or undefined if none
|
|
164
|
+
*/
|
|
165
|
+
getLastHandoff(agentId: EntityId): Promise<HandoffContent | undefined>;
|
|
166
|
+
/**
|
|
167
|
+
* Checks if an agent has a pending handoff message.
|
|
168
|
+
*
|
|
169
|
+
* @param agentId - The agent to check
|
|
170
|
+
* @returns True if a handoff message is pending
|
|
171
|
+
*/
|
|
172
|
+
hasPendingHandoff(agentId: EntityId): Promise<boolean>;
|
|
173
|
+
}
|
|
174
|
+
/** Tag used to identify handoff documents */
|
|
175
|
+
export declare const HANDOFF_DOCUMENT_TAG = "handoff";
|
|
176
|
+
/** Message type for handoff messages */
|
|
177
|
+
export declare const HANDOFF_MESSAGE_TYPE = "handoff";
|
|
178
|
+
/**
|
|
179
|
+
* Implementation of the Handoff Service.
|
|
180
|
+
*/
|
|
181
|
+
export declare class HandoffServiceImpl implements HandoffService {
|
|
182
|
+
private readonly sessionManager;
|
|
183
|
+
private readonly registry;
|
|
184
|
+
private readonly api;
|
|
185
|
+
constructor(sessionManager: SessionManager, registry: AgentRegistry, api: QuarryAPI);
|
|
186
|
+
selfHandoff(agentId: EntityId, sessionId: string, options: SelfHandoffOptions): Promise<SelfHandoffResult>;
|
|
187
|
+
handoffToAgent(fromAgentId: EntityId, toAgentId: EntityId, sessionId: string, options: AgentHandoffOptions): Promise<AgentHandoffResult>;
|
|
188
|
+
getLastHandoff(agentId: EntityId): Promise<HandoffContent | undefined>;
|
|
189
|
+
hasPendingHandoff(agentId: EntityId): Promise<boolean>;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Creates a HandoffService instance
|
|
193
|
+
*/
|
|
194
|
+
export declare function createHandoffService(sessionManager: SessionManager, registry: AgentRegistry, api: QuarryAPI): HandoffService;
|
|
195
|
+
//# sourceMappingURL=handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/runtime/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handoff Service (TB-O10e, TB-O10f)
|
|
3
|
+
*
|
|
4
|
+
* This service enables agent session handoffs for context preservation:
|
|
5
|
+
*
|
|
6
|
+
* - **Self-Handoff (TB-O10e)**: Agent hands off to fresh instance of itself
|
|
7
|
+
* - Creates handoff message with context summary
|
|
8
|
+
* - Suspends current session (available for predecessor query)
|
|
9
|
+
* - New session finds handoff note in inbox
|
|
10
|
+
*
|
|
11
|
+
* - **Agent-Agent Handoff (TB-O10f)**: Agent hands off to another agent
|
|
12
|
+
* - Sends handoff message to target agent's channel
|
|
13
|
+
* - Optionally transfers tasks to target agent
|
|
14
|
+
* - Triggers target agent to process handoff
|
|
15
|
+
*
|
|
16
|
+
* Key design decisions:
|
|
17
|
+
* - Handoff is manual-only (agent decides when to hand off)
|
|
18
|
+
* - Handoff messages stored as Documents for persistence
|
|
19
|
+
* - Uses existing inbox/channel system for delivery
|
|
20
|
+
*
|
|
21
|
+
* @module
|
|
22
|
+
*/
|
|
23
|
+
import { createTimestamp, createDocument, createMessage, ContentType } from '@stoneforge/core';
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Constants
|
|
26
|
+
// ============================================================================
|
|
27
|
+
/** Tag used to identify handoff documents */
|
|
28
|
+
export const HANDOFF_DOCUMENT_TAG = 'handoff';
|
|
29
|
+
/** Message type for handoff messages */
|
|
30
|
+
export const HANDOFF_MESSAGE_TYPE = 'handoff';
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// Implementation
|
|
33
|
+
// ============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Implementation of the Handoff Service.
|
|
36
|
+
*/
|
|
37
|
+
export class HandoffServiceImpl {
|
|
38
|
+
sessionManager;
|
|
39
|
+
registry;
|
|
40
|
+
api;
|
|
41
|
+
constructor(sessionManager, registry, api) {
|
|
42
|
+
this.sessionManager = sessionManager;
|
|
43
|
+
this.registry = registry;
|
|
44
|
+
this.api = api;
|
|
45
|
+
}
|
|
46
|
+
async selfHandoff(agentId, sessionId, options) {
|
|
47
|
+
const now = createTimestamp();
|
|
48
|
+
try {
|
|
49
|
+
// Get the current session
|
|
50
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
51
|
+
if (!session) {
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
error: `Session not found: ${sessionId}`,
|
|
55
|
+
completedAt: now,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Verify the session belongs to the agent
|
|
59
|
+
if (session.agentId !== agentId) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: `Session ${sessionId} does not belong to agent ${agentId}`,
|
|
63
|
+
completedAt: now,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Verify the session is running
|
|
67
|
+
if (session.status !== 'running') {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: `Cannot handoff session in status: ${session.status}`,
|
|
71
|
+
completedAt: now,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Get the agent's channel
|
|
75
|
+
const channelId = await this.registry.getAgentChannelId(agentId);
|
|
76
|
+
if (!channelId) {
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
error: `Agent ${agentId} has no channel`,
|
|
80
|
+
completedAt: now,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// Create handoff content
|
|
84
|
+
const handoffContent = {
|
|
85
|
+
type: 'handoff',
|
|
86
|
+
fromAgentId: agentId,
|
|
87
|
+
toAgentId: undefined, // Self-handoff has no target
|
|
88
|
+
contextSummary: options.contextSummary,
|
|
89
|
+
nextSteps: options.nextSteps,
|
|
90
|
+
reason: options.reason,
|
|
91
|
+
providerSessionId: session.providerSessionId,
|
|
92
|
+
initiatedAt: now,
|
|
93
|
+
};
|
|
94
|
+
// Create handoff document
|
|
95
|
+
const handoffDocument = await createDocument({
|
|
96
|
+
content: JSON.stringify(handoffContent, null, 2),
|
|
97
|
+
contentType: ContentType.JSON,
|
|
98
|
+
createdBy: agentId,
|
|
99
|
+
tags: [HANDOFF_DOCUMENT_TAG, 'self-handoff'],
|
|
100
|
+
metadata: {
|
|
101
|
+
handoffType: 'self',
|
|
102
|
+
fromAgentId: agentId,
|
|
103
|
+
providerSessionId: session.providerSessionId,
|
|
104
|
+
...options.metadata,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
// Save the handoff document
|
|
108
|
+
const savedDocument = await this.api.create(handoffDocument);
|
|
109
|
+
const handoffDocumentId = savedDocument.id;
|
|
110
|
+
// Create and send handoff message to the agent's channel
|
|
111
|
+
const handoffMessage = await createMessage({
|
|
112
|
+
channelId: channelId,
|
|
113
|
+
sender: agentId,
|
|
114
|
+
contentRef: handoffDocumentId,
|
|
115
|
+
metadata: {
|
|
116
|
+
type: HANDOFF_MESSAGE_TYPE,
|
|
117
|
+
handoffType: 'self',
|
|
118
|
+
fromAgentId: agentId,
|
|
119
|
+
handoffDocumentId,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
const savedMessage = await this.api.create(handoffMessage);
|
|
123
|
+
const messageId = savedMessage.id;
|
|
124
|
+
// Suspend the session (preserves provider session ID for predecessor queries)
|
|
125
|
+
const suspendReason = options.reason
|
|
126
|
+
? `Self-handoff: ${options.reason}`
|
|
127
|
+
: 'Self-handoff initiated';
|
|
128
|
+
await this.sessionManager.suspendSession(sessionId, suspendReason);
|
|
129
|
+
// Get the updated session record
|
|
130
|
+
const suspendedSession = this.sessionManager.getSession(sessionId);
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
handoffDocumentId,
|
|
134
|
+
messageId,
|
|
135
|
+
suspendedSession: suspendedSession ?? undefined,
|
|
136
|
+
completedAt: createTimestamp(),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
error: error instanceof Error ? error.message : String(error),
|
|
143
|
+
completedAt: createTimestamp(),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async handoffToAgent(fromAgentId, toAgentId, sessionId, options) {
|
|
148
|
+
const now = createTimestamp();
|
|
149
|
+
try {
|
|
150
|
+
// Get the current session
|
|
151
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
152
|
+
if (!session) {
|
|
153
|
+
return {
|
|
154
|
+
success: false,
|
|
155
|
+
error: `Session not found: ${sessionId}`,
|
|
156
|
+
completedAt: now,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// Verify the session belongs to the source agent
|
|
160
|
+
if (session.agentId !== fromAgentId) {
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
error: `Session ${sessionId} does not belong to agent ${fromAgentId}`,
|
|
164
|
+
completedAt: now,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// Verify the session is running
|
|
168
|
+
if (session.status !== 'running') {
|
|
169
|
+
return {
|
|
170
|
+
success: false,
|
|
171
|
+
error: `Cannot handoff session in status: ${session.status}`,
|
|
172
|
+
completedAt: now,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
// Verify target agent exists
|
|
176
|
+
const targetAgent = await this.registry.getAgent(toAgentId);
|
|
177
|
+
if (!targetAgent) {
|
|
178
|
+
return {
|
|
179
|
+
success: false,
|
|
180
|
+
error: `Target agent not found: ${toAgentId}`,
|
|
181
|
+
completedAt: now,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// Get the target agent's channel
|
|
185
|
+
const targetChannelId = await this.registry.getAgentChannelId(toAgentId);
|
|
186
|
+
if (!targetChannelId) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
error: `Target agent ${toAgentId} has no channel`,
|
|
190
|
+
completedAt: now,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// Create handoff content
|
|
194
|
+
const handoffContent = {
|
|
195
|
+
type: 'handoff',
|
|
196
|
+
fromAgentId,
|
|
197
|
+
toAgentId,
|
|
198
|
+
contextSummary: options.contextSummary,
|
|
199
|
+
nextSteps: options.nextSteps,
|
|
200
|
+
reason: options.reason,
|
|
201
|
+
taskIds: options.taskIds,
|
|
202
|
+
providerSessionId: session.providerSessionId,
|
|
203
|
+
initiatedAt: now,
|
|
204
|
+
};
|
|
205
|
+
// Create handoff document
|
|
206
|
+
const handoffDocument = await createDocument({
|
|
207
|
+
content: JSON.stringify(handoffContent, null, 2),
|
|
208
|
+
contentType: ContentType.JSON,
|
|
209
|
+
createdBy: fromAgentId,
|
|
210
|
+
tags: [HANDOFF_DOCUMENT_TAG, 'agent-handoff'],
|
|
211
|
+
metadata: {
|
|
212
|
+
handoffType: 'agent-to-agent',
|
|
213
|
+
fromAgentId,
|
|
214
|
+
toAgentId,
|
|
215
|
+
providerSessionId: session.providerSessionId,
|
|
216
|
+
taskIds: options.taskIds,
|
|
217
|
+
...options.metadata,
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
// Save the handoff document
|
|
221
|
+
const savedDocument = await this.api.create(handoffDocument);
|
|
222
|
+
const handoffDocumentId = savedDocument.id;
|
|
223
|
+
// Create and send handoff message to the target agent's channel
|
|
224
|
+
const handoffMessage = await createMessage({
|
|
225
|
+
channelId: targetChannelId,
|
|
226
|
+
sender: fromAgentId,
|
|
227
|
+
contentRef: handoffDocumentId,
|
|
228
|
+
metadata: {
|
|
229
|
+
type: HANDOFF_MESSAGE_TYPE,
|
|
230
|
+
handoffType: 'agent-to-agent',
|
|
231
|
+
fromAgentId,
|
|
232
|
+
toAgentId,
|
|
233
|
+
handoffDocumentId,
|
|
234
|
+
taskIds: options.taskIds,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
const savedMessage = await this.api.create(handoffMessage);
|
|
238
|
+
const messageId = savedMessage.id;
|
|
239
|
+
// Suspend the source session
|
|
240
|
+
const suspendReason = options.reason
|
|
241
|
+
? `Handoff to ${toAgentId}: ${options.reason}`
|
|
242
|
+
: `Handoff to ${toAgentId}`;
|
|
243
|
+
await this.sessionManager.suspendSession(sessionId, suspendReason);
|
|
244
|
+
// Get the updated session record
|
|
245
|
+
const suspendedSession = this.sessionManager.getSession(sessionId);
|
|
246
|
+
// TODO: If options.triggerTarget !== false and target agent is idle,
|
|
247
|
+
// we could notify/wake up the target agent here.
|
|
248
|
+
// This would require integration with a notification system or
|
|
249
|
+
// direct session starting capability.
|
|
250
|
+
return {
|
|
251
|
+
success: true,
|
|
252
|
+
handoffDocumentId,
|
|
253
|
+
messageId,
|
|
254
|
+
suspendedSession: suspendedSession ?? undefined,
|
|
255
|
+
targetAgentId: toAgentId,
|
|
256
|
+
completedAt: createTimestamp(),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return {
|
|
261
|
+
success: false,
|
|
262
|
+
error: error instanceof Error ? error.message : String(error),
|
|
263
|
+
completedAt: createTimestamp(),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async getLastHandoff(agentId) {
|
|
268
|
+
try {
|
|
269
|
+
// Get the agent's channel ID
|
|
270
|
+
const channelId = await this.registry.getAgentChannelId(agentId);
|
|
271
|
+
if (!channelId) {
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
// Search for handoff documents targeting this agent
|
|
275
|
+
const documents = await this.api.list({
|
|
276
|
+
type: 'document',
|
|
277
|
+
tags: [HANDOFF_DOCUMENT_TAG],
|
|
278
|
+
});
|
|
279
|
+
// Filter to handoff documents for this agent and sort by creation time
|
|
280
|
+
const handoffDocs = documents
|
|
281
|
+
.filter((doc) => {
|
|
282
|
+
const meta = doc.metadata;
|
|
283
|
+
// Match self-handoff (fromAgentId === agentId, no toAgentId) or
|
|
284
|
+
// agent-to-agent handoff (toAgentId === agentId)
|
|
285
|
+
return ((meta?.fromAgentId === agentId && meta?.handoffType === 'self') ||
|
|
286
|
+
meta?.toAgentId === agentId);
|
|
287
|
+
})
|
|
288
|
+
.sort((a, b) => {
|
|
289
|
+
const aTime = typeof a.createdAt === 'number' ? a.createdAt : new Date(a.createdAt).getTime();
|
|
290
|
+
const bTime = typeof b.createdAt === 'number' ? b.createdAt : new Date(b.createdAt).getTime();
|
|
291
|
+
return bTime - aTime; // Most recent first
|
|
292
|
+
});
|
|
293
|
+
if (handoffDocs.length === 0) {
|
|
294
|
+
return undefined;
|
|
295
|
+
}
|
|
296
|
+
// Get the most recent handoff document
|
|
297
|
+
const latestDoc = handoffDocs[0];
|
|
298
|
+
const content = latestDoc.content;
|
|
299
|
+
if (!content) {
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
// Parse the handoff content
|
|
303
|
+
try {
|
|
304
|
+
const handoffContent = JSON.parse(content);
|
|
305
|
+
if (handoffContent.type !== 'handoff') {
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
return handoffContent;
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
return undefined;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
return undefined;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
async hasPendingHandoff(agentId) {
|
|
319
|
+
const handoff = await this.getLastHandoff(agentId);
|
|
320
|
+
return handoff !== undefined;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// ============================================================================
|
|
324
|
+
// Factory Function
|
|
325
|
+
// ============================================================================
|
|
326
|
+
/**
|
|
327
|
+
* Creates a HandoffService instance
|
|
328
|
+
*/
|
|
329
|
+
export function createHandoffService(sessionManager, registry, api) {
|
|
330
|
+
return new HandoffServiceImpl(sessionManager, registry, api);
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/runtime/handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator Runtime
|
|
3
|
+
*
|
|
4
|
+
* This module exports runtime management for Claude Code agent processes:
|
|
5
|
+
* - SpawnerService (TB-O9) - Spawns and manages Claude Code processes
|
|
6
|
+
* - SessionManager (TB-O10) - Session tracking with resume support
|
|
7
|
+
* - PredecessorQueryService (TB-O10d) - Query previous sessions for context
|
|
8
|
+
* - Handoff services (TB-O10e, TB-O10f) - TODO
|
|
9
|
+
*/
|
|
10
|
+
export { type SpawnMode, type SpawnConfig, type SpawnOptions, type StreamJsonEventType, type StreamJsonEvent, type SpawnedSessionEvent, type SessionStatus, type SpawnedSession, type SpawnResult, type SendInputOptions, type SpawnerService, type UWPCheckResult, type UWPCheckOptions, type UWPTaskInfo, SessionStatusTransitions, SpawnerServiceImpl, createSpawnerService, canReceiveInput, isTerminalStatus, getStatusDescription, } from './spawner.js';
|
|
11
|
+
export { type SessionRecord, type StartSessionOptions, type ResumeSessionOptions, type StopSessionOptions, type MessageSessionOptions, type MessageSessionResult, type SessionFilter, type SessionHistoryEntry, type RoleSessionHistoryEntry, type SessionManager, type ResumeUWPCheckResult, SessionManagerImpl, createSessionManager, } from './session-manager.js';
|
|
12
|
+
export { DEFAULT_QUERY_TIMEOUT_MS, MIN_QUERY_TIMEOUT_MS, MAX_QUERY_TIMEOUT_MS, type PredecessorQueryOptions, type PredecessorQueryResult, type PredecessorInfo, type PredecessorQueryStatus, type ActivePredecessorQuery, type PredecessorQueryService, PredecessorQueryServiceImpl, createPredecessorQueryService, TimeoutError, NoPredecessorError, } from './predecessor-query.js';
|
|
13
|
+
export { trackListeners } from './event-utils.js';
|
|
14
|
+
export { HANDOFF_DOCUMENT_TAG, HANDOFF_MESSAGE_TYPE, type HandoffContent, type SelfHandoffOptions, type SelfHandoffResult, type AgentHandoffOptions, type AgentHandoffResult, type HandoffService, HandoffServiceImpl, createHandoffService, } from './handoff.js';
|
|
15
|
+
export { type SDKMessage, type SDKAssistantMessage, type SDKSystemMessage, type SDKResultMessage, type SDKErrorMessage, type SDKContentBlock, type AnySDKMessage, mapSDKMessageToEvent, mapToolResultToEvent, mapSDKMessagesToEvents, } from './message-mapper.js';
|
|
16
|
+
export { type ProviderSessionId, type AgentProviderConfig, type AgentMessage, type HeadlessSession, type HeadlessSpawnOptions, type HeadlessProvider, type InteractiveSession, type InteractiveSpawnOptions, type InteractiveProvider, type AgentProvider, AgentProviderRegistry, getProviderRegistry, ClaudeAgentProvider, ClaudeHeadlessProvider, ClaudeInteractiveProvider, OpenCodeAgentProvider, OpenCodeHeadlessProvider, OpenCodeInteractiveProvider, ProviderError, } from '../providers/index.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAEnB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,WAAW,EAEhB,wBAAwB,EAExB,kBAAkB,EAElB,oBAAoB,EAEpB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EAExB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EAEnB,KAAK,oBAAoB,EAEzB,kBAAkB,EAElB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAEL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EAEpB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAE5B,2BAA2B,EAE3B,6BAA6B,EAE7B,YAAY,EACZ,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAEL,oBAAoB,EACpB,oBAAoB,EAEpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EAEnB,kBAAkB,EAElB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAElB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAElB,qBAAqB,EACrB,mBAAmB,EAEnB,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EAEzB,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B,EAE3B,aAAa,GACd,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestrator Runtime
|
|
3
|
+
*
|
|
4
|
+
* This module exports runtime management for Claude Code agent processes:
|
|
5
|
+
* - SpawnerService (TB-O9) - Spawns and manages Claude Code processes
|
|
6
|
+
* - SessionManager (TB-O10) - Session tracking with resume support
|
|
7
|
+
* - PredecessorQueryService (TB-O10d) - Query previous sessions for context
|
|
8
|
+
* - Handoff services (TB-O10e, TB-O10f) - TODO
|
|
9
|
+
*/
|
|
10
|
+
// Spawner service (TB-O9)
|
|
11
|
+
export {
|
|
12
|
+
// Constants
|
|
13
|
+
SessionStatusTransitions,
|
|
14
|
+
// Implementation
|
|
15
|
+
SpawnerServiceImpl,
|
|
16
|
+
// Factory
|
|
17
|
+
createSpawnerService,
|
|
18
|
+
// Utilities
|
|
19
|
+
canReceiveInput, isTerminalStatus, getStatusDescription, } from './spawner.js';
|
|
20
|
+
// Session Manager (TB-O10)
|
|
21
|
+
export {
|
|
22
|
+
// Implementation
|
|
23
|
+
SessionManagerImpl,
|
|
24
|
+
// Factory
|
|
25
|
+
createSessionManager, } from './session-manager.js';
|
|
26
|
+
// Predecessor Query Service (TB-O10d)
|
|
27
|
+
export {
|
|
28
|
+
// Constants
|
|
29
|
+
DEFAULT_QUERY_TIMEOUT_MS, MIN_QUERY_TIMEOUT_MS, MAX_QUERY_TIMEOUT_MS,
|
|
30
|
+
// Implementation
|
|
31
|
+
PredecessorQueryServiceImpl,
|
|
32
|
+
// Factory
|
|
33
|
+
createPredecessorQueryService,
|
|
34
|
+
// Errors
|
|
35
|
+
TimeoutError, NoPredecessorError, } from './predecessor-query.js';
|
|
36
|
+
// Event utilities
|
|
37
|
+
export { trackListeners } from './event-utils.js';
|
|
38
|
+
// Handoff Service (TB-O10e, TB-O10f)
|
|
39
|
+
export {
|
|
40
|
+
// Constants
|
|
41
|
+
HANDOFF_DOCUMENT_TAG, HANDOFF_MESSAGE_TYPE,
|
|
42
|
+
// Implementation
|
|
43
|
+
HandoffServiceImpl,
|
|
44
|
+
// Factory
|
|
45
|
+
createHandoffService, } from './handoff.js';
|
|
46
|
+
// Message Mapper (SDK to SpawnedSessionEvent conversion)
|
|
47
|
+
export {
|
|
48
|
+
// Functions
|
|
49
|
+
mapSDKMessageToEvent, mapToolResultToEvent, mapSDKMessagesToEvents, } from './message-mapper.js';
|
|
50
|
+
// Provider Abstraction Layer
|
|
51
|
+
export {
|
|
52
|
+
// Registry
|
|
53
|
+
AgentProviderRegistry, getProviderRegistry,
|
|
54
|
+
// Claude provider (default)
|
|
55
|
+
ClaudeAgentProvider, ClaudeHeadlessProvider, ClaudeInteractiveProvider,
|
|
56
|
+
// OpenCode provider (stubs)
|
|
57
|
+
OpenCodeAgentProvider, OpenCodeHeadlessProvider, OpenCodeInteractiveProvider,
|
|
58
|
+
// Errors
|
|
59
|
+
ProviderError, } from '../providers/index.js';
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,0BAA0B;AAC1B,OAAO;AAiBL,YAAY;AACZ,wBAAwB;AACxB,iBAAiB;AACjB,kBAAkB;AAClB,UAAU;AACV,oBAAoB;AACpB,YAAY;AACZ,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,2BAA2B;AAC3B,OAAO;AAeL,iBAAiB;AACjB,kBAAkB;AAClB,UAAU;AACV,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,sCAAsC;AACtC,OAAO;AACL,YAAY;AACZ,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB;AAQpB,iBAAiB;AACjB,2BAA2B;AAC3B,UAAU;AACV,6BAA6B;AAC7B,SAAS;AACT,YAAY,EACZ,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAEhC,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,qCAAqC;AACrC,OAAO;AACL,YAAY;AACZ,oBAAoB,EACpB,oBAAoB;AAQpB,iBAAiB;AACjB,kBAAkB;AAClB,UAAU;AACV,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,yDAAyD;AACzD,OAAO;AASL,YAAY;AACZ,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAE7B,6BAA6B;AAC7B,OAAO;AAYL,WAAW;AACX,qBAAqB,EACrB,mBAAmB;AACnB,4BAA4B;AAC5B,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB;AACzB,4BAA4B;AAC5B,qBAAqB,EACrB,wBAAwB,EACxB,2BAA2B;AAC3B,SAAS;AACT,aAAa,GACd,MAAM,uBAAuB,CAAC"}
|