@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,665 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Context for Orchestration E2E Tests
|
|
3
|
+
*
|
|
4
|
+
* Provides isolated test workspace setup and teardown for orchestration tests.
|
|
5
|
+
* Each test run gets a completely isolated temporary directory with:
|
|
6
|
+
* - Fresh git repository
|
|
7
|
+
* - Minimal project structure
|
|
8
|
+
* - Temporary SQLite database
|
|
9
|
+
* - All required services configured
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
|
|
14
|
+
import { existsSync } from 'node:fs';
|
|
15
|
+
import { tmpdir } from 'node:os';
|
|
16
|
+
import { join, dirname, resolve, delimiter } from 'node:path';
|
|
17
|
+
import { fileURLToPath } from 'node:url';
|
|
18
|
+
import { execSync } from 'node:child_process';
|
|
19
|
+
import { createTimestamp, createTask as coreCreateTask, asEntityId, asElementId } from '@stoneforge/core';
|
|
20
|
+
import { createStorage, initializeSchema, createInboxService } from '@stoneforge/quarry';
|
|
21
|
+
import { createOrchestratorAPI } from '../api/index.js';
|
|
22
|
+
import { createAgentRegistry } from '../services/agent-registry.js';
|
|
23
|
+
import { createDispatchDaemon } from '../services/dispatch-daemon.js';
|
|
24
|
+
import { createWorktreeManager } from '../git/worktree-manager.js';
|
|
25
|
+
import { createTaskAssignmentService } from '../services/task-assignment-service.js';
|
|
26
|
+
import { createDispatchService } from '../services/dispatch-service.js';
|
|
27
|
+
import { createStewardScheduler, createDefaultStewardExecutor } from '../services/steward-scheduler.js';
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// Test Context Creation
|
|
30
|
+
// ============================================================================
|
|
31
|
+
/**
|
|
32
|
+
* Sets up an isolated test context for orchestration tests.
|
|
33
|
+
*
|
|
34
|
+
* Creates:
|
|
35
|
+
* - Temporary directory with git repo
|
|
36
|
+
* - Minimal project structure
|
|
37
|
+
* - Fresh SQLite database
|
|
38
|
+
* - All required services
|
|
39
|
+
*
|
|
40
|
+
* @param options - Setup options
|
|
41
|
+
* @returns The test context
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```typescript
|
|
45
|
+
* const ctx = await setupTestContext({ verbose: true });
|
|
46
|
+
* try {
|
|
47
|
+
* // Run tests...
|
|
48
|
+
* } finally {
|
|
49
|
+
* await ctx.cleanup();
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export async function setupTestContext(options = {}) {
|
|
54
|
+
const verbose = options.verbose ?? false;
|
|
55
|
+
const tempPrefix = options.tempPrefix ?? 'orchestration-test-';
|
|
56
|
+
const pollIntervalMs = options.pollIntervalMs ?? 2000;
|
|
57
|
+
const mode = options.mode ?? 'mock';
|
|
58
|
+
const log = (message) => {
|
|
59
|
+
if (verbose) {
|
|
60
|
+
console.log(` ${message}`);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
// 1. Create isolated temp workspace
|
|
64
|
+
const tempWorkspace = await mkdtemp(join(tmpdir(), tempPrefix));
|
|
65
|
+
log(`Created temp workspace: ${tempWorkspace}`);
|
|
66
|
+
try {
|
|
67
|
+
// 2. Initialize git repo
|
|
68
|
+
await initializeGitRepo(tempWorkspace);
|
|
69
|
+
log('Initialized git repository');
|
|
70
|
+
// 3. Create minimal project structure
|
|
71
|
+
await createProjectStructure(tempWorkspace);
|
|
72
|
+
log('Created project structure');
|
|
73
|
+
// 4. Create initial commit
|
|
74
|
+
execSync('git add -A && git commit -m "Initial commit"', {
|
|
75
|
+
cwd: tempWorkspace,
|
|
76
|
+
stdio: 'pipe',
|
|
77
|
+
});
|
|
78
|
+
log('Created initial commit');
|
|
79
|
+
// 4b. Create bare repo as fake remote (allows workers to push branches)
|
|
80
|
+
const bareRepoPath = join(tempWorkspace, '.test-remote.git');
|
|
81
|
+
execSync(`git init --bare "${bareRepoPath}"`, { stdio: 'pipe' });
|
|
82
|
+
execSync(`git remote add origin "${bareRepoPath}"`, { cwd: tempWorkspace, stdio: 'pipe' });
|
|
83
|
+
const defaultBranch = execSync('git branch --show-current', { cwd: tempWorkspace, encoding: 'utf-8' }).trim();
|
|
84
|
+
execSync(`git push -u origin ${defaultBranch}`, { cwd: tempWorkspace, stdio: 'pipe' });
|
|
85
|
+
log('Created local bare remote');
|
|
86
|
+
// 5. Initialize Stoneforge database
|
|
87
|
+
const stoneforgeDir = join(tempWorkspace, '.stoneforge');
|
|
88
|
+
await mkdir(stoneforgeDir, { recursive: true });
|
|
89
|
+
const dbPath = join(stoneforgeDir, 'stoneforge.db');
|
|
90
|
+
const storage = createStorage({ path: dbPath, create: true });
|
|
91
|
+
initializeSchema(storage);
|
|
92
|
+
log(`Initialized database: ${dbPath}`);
|
|
93
|
+
// 6. Create API and system entity
|
|
94
|
+
const api = createOrchestratorAPI(storage);
|
|
95
|
+
const stoneforgeApi = api;
|
|
96
|
+
const systemEntity = await createSystemEntity(stoneforgeApi);
|
|
97
|
+
log(`Created system entity: ${systemEntity}`);
|
|
98
|
+
// 7. Create all services
|
|
99
|
+
const agentRegistry = createAgentRegistry(api);
|
|
100
|
+
const taskAssignment = createTaskAssignmentService(api);
|
|
101
|
+
const inboxService = createInboxService(storage);
|
|
102
|
+
const dispatchService = createDispatchService(api, taskAssignment, agentRegistry);
|
|
103
|
+
const worktreeManager = createWorktreeManager({
|
|
104
|
+
workspaceRoot: tempWorkspace,
|
|
105
|
+
worktreeDir: '.stoneforge/.worktrees',
|
|
106
|
+
});
|
|
107
|
+
await worktreeManager.initWorkspace();
|
|
108
|
+
log('Initialized worktree manager');
|
|
109
|
+
const stewardScheduler = createStewardScheduler(agentRegistry, createDefaultStewardExecutor());
|
|
110
|
+
// 8. Create session manager (mock or real)
|
|
111
|
+
let sessionManager;
|
|
112
|
+
if (mode === 'real') {
|
|
113
|
+
const { createSpawnerService } = await import('../runtime/spawner.js');
|
|
114
|
+
const { createSessionManager: createRealSessionManager } = await import('../runtime/session-manager.js');
|
|
115
|
+
const elBinDir = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', 'node_modules', '.bin');
|
|
116
|
+
const spawner = createSpawnerService({
|
|
117
|
+
workingDirectory: tempWorkspace,
|
|
118
|
+
stoneforgeRoot: tempWorkspace,
|
|
119
|
+
environmentVariables: {
|
|
120
|
+
PATH: `${elBinDir}${delimiter}${process.env.PATH ?? ''}`,
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
sessionManager = createRealSessionManager(spawner, stoneforgeApi, agentRegistry);
|
|
124
|
+
log('Created real session manager (spawner-backed)');
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
sessionManager = createMockSessionManager(agentRegistry);
|
|
128
|
+
log('Created mock session manager');
|
|
129
|
+
}
|
|
130
|
+
// 8b. Write test prompt overrides for real mode
|
|
131
|
+
if (mode === 'real') {
|
|
132
|
+
await writeTestPromptOverrides(tempWorkspace);
|
|
133
|
+
log('Wrote test prompt overrides');
|
|
134
|
+
}
|
|
135
|
+
// 9. Create dispatch daemon
|
|
136
|
+
// In real mode, enforce a max session duration so stuck workers
|
|
137
|
+
// get reaped and don't block subsequent test dispatches.
|
|
138
|
+
const daemon = createDispatchDaemon(stoneforgeApi, agentRegistry, sessionManager, dispatchService, worktreeManager, taskAssignment, stewardScheduler, inboxService, {
|
|
139
|
+
pollIntervalMs,
|
|
140
|
+
maxSessionDurationMs: mode === 'real' ? 180_000 : 0,
|
|
141
|
+
});
|
|
142
|
+
// 10. Start daemon if not skipped
|
|
143
|
+
if (!options.skipDaemonStart) {
|
|
144
|
+
await daemon.start();
|
|
145
|
+
log('Started dispatch daemon');
|
|
146
|
+
}
|
|
147
|
+
// 11. Cleanup function
|
|
148
|
+
const cleanup = async () => {
|
|
149
|
+
log('Cleaning up test context...');
|
|
150
|
+
// Stop daemon
|
|
151
|
+
await daemon.stop();
|
|
152
|
+
log('Stopped daemon');
|
|
153
|
+
// Stop any running sessions with grace period for real mode
|
|
154
|
+
const running = sessionManager.listSessions({ status: 'running' });
|
|
155
|
+
const starting = sessionManager.listSessions({ status: 'starting' });
|
|
156
|
+
const sessionsToStop = [...running, ...starting];
|
|
157
|
+
for (const session of sessionsToStop) {
|
|
158
|
+
try {
|
|
159
|
+
if (mode === 'real') {
|
|
160
|
+
// Give real sessions a grace period before force-terminating
|
|
161
|
+
const gracefulStop = sessionManager.stopSession(session.id, { graceful: true });
|
|
162
|
+
const forceStop = new Promise((resolve) => setTimeout(async () => {
|
|
163
|
+
try {
|
|
164
|
+
await sessionManager.stopSession(session.id, { graceful: false });
|
|
165
|
+
}
|
|
166
|
+
catch { /* ignore */ }
|
|
167
|
+
resolve();
|
|
168
|
+
}, 5000));
|
|
169
|
+
await Promise.race([gracefulStop, forceStop]);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
await sessionManager.stopSession(session.id, { graceful: false });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch { /* ignore */ }
|
|
176
|
+
}
|
|
177
|
+
log(`Terminated ${sessionsToStop.length} sessions`);
|
|
178
|
+
// Clean up worktrees
|
|
179
|
+
try {
|
|
180
|
+
const worktrees = await worktreeManager.listWorktrees();
|
|
181
|
+
for (const wt of worktrees) {
|
|
182
|
+
try {
|
|
183
|
+
await worktreeManager.removeWorktree(wt.path, { force: true });
|
|
184
|
+
}
|
|
185
|
+
catch { /* ignore */ }
|
|
186
|
+
}
|
|
187
|
+
log(`Cleaned up ${worktrees.length} worktrees`);
|
|
188
|
+
}
|
|
189
|
+
catch { /* ignore */ }
|
|
190
|
+
// Delete temp workspace
|
|
191
|
+
if (existsSync(tempWorkspace)) {
|
|
192
|
+
await rm(tempWorkspace, { recursive: true, force: true });
|
|
193
|
+
log('Deleted temp workspace');
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
// Safety net: clean up on process termination
|
|
197
|
+
const sigintHandler = () => {
|
|
198
|
+
cleanup().catch(() => { }).finally(() => process.exit(1));
|
|
199
|
+
};
|
|
200
|
+
process.on('SIGINT', sigintHandler);
|
|
201
|
+
process.on('SIGTERM', sigintHandler);
|
|
202
|
+
return {
|
|
203
|
+
api,
|
|
204
|
+
stoneforgeApi,
|
|
205
|
+
daemon,
|
|
206
|
+
sessionManager,
|
|
207
|
+
agentRegistry,
|
|
208
|
+
worktreeManager,
|
|
209
|
+
taskAssignment,
|
|
210
|
+
dispatchService,
|
|
211
|
+
stewardScheduler,
|
|
212
|
+
inboxService,
|
|
213
|
+
tempWorkspace,
|
|
214
|
+
dbPath,
|
|
215
|
+
systemEntityId: systemEntity,
|
|
216
|
+
log,
|
|
217
|
+
verbose,
|
|
218
|
+
mode,
|
|
219
|
+
cleanup,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
// Cleanup on setup failure
|
|
224
|
+
if (existsSync(tempWorkspace)) {
|
|
225
|
+
await rm(tempWorkspace, { recursive: true, force: true });
|
|
226
|
+
}
|
|
227
|
+
throw error;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ============================================================================
|
|
231
|
+
// Git Repository Setup
|
|
232
|
+
// ============================================================================
|
|
233
|
+
/**
|
|
234
|
+
* Initializes a git repository in the given directory.
|
|
235
|
+
*/
|
|
236
|
+
async function initializeGitRepo(dir) {
|
|
237
|
+
execSync('git init', { cwd: dir, stdio: 'pipe' });
|
|
238
|
+
execSync('git config user.email "test@orchestration-test.local"', {
|
|
239
|
+
cwd: dir,
|
|
240
|
+
stdio: 'pipe',
|
|
241
|
+
});
|
|
242
|
+
execSync('git config user.name "Orchestration Test"', {
|
|
243
|
+
cwd: dir,
|
|
244
|
+
stdio: 'pipe',
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Creates a minimal project structure for testing.
|
|
249
|
+
*/
|
|
250
|
+
async function createProjectStructure(dir) {
|
|
251
|
+
// Create directories
|
|
252
|
+
await mkdir(join(dir, 'src'), { recursive: true });
|
|
253
|
+
await mkdir(join(dir, '.stoneforge'), { recursive: true });
|
|
254
|
+
// Create package.json
|
|
255
|
+
await writeFile(join(dir, 'package.json'), JSON.stringify({
|
|
256
|
+
name: 'test-project',
|
|
257
|
+
version: '1.0.0',
|
|
258
|
+
type: 'module',
|
|
259
|
+
scripts: {
|
|
260
|
+
test: 'echo "No tests configured"',
|
|
261
|
+
build: 'echo "No build configured"',
|
|
262
|
+
},
|
|
263
|
+
}, null, 2));
|
|
264
|
+
// Create src/index.ts
|
|
265
|
+
await writeFile(join(dir, 'src/index.ts'), `/**
|
|
266
|
+
* Test project entry point
|
|
267
|
+
* Agents can modify this file during tests.
|
|
268
|
+
*/
|
|
269
|
+
|
|
270
|
+
export function hello(): string {
|
|
271
|
+
return 'Hello, World!';
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export function add(a: number, b: number): number {
|
|
275
|
+
return a + b;
|
|
276
|
+
}
|
|
277
|
+
`);
|
|
278
|
+
// Create README.md
|
|
279
|
+
await writeFile(join(dir, 'README.md'), `# Test Project
|
|
280
|
+
|
|
281
|
+
This is a minimal test project for orchestration E2E testing.
|
|
282
|
+
Agents can modify files in this project during tests.
|
|
283
|
+
`);
|
|
284
|
+
// Create .gitignore
|
|
285
|
+
await writeFile(join(dir, '.gitignore'), `node_modules/
|
|
286
|
+
dist/
|
|
287
|
+
.stoneforge/.worktrees/
|
|
288
|
+
.test-remote.git/
|
|
289
|
+
*.db
|
|
290
|
+
*.db-journal
|
|
291
|
+
`);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Creates a system entity for test operations.
|
|
295
|
+
*/
|
|
296
|
+
async function createSystemEntity(api) {
|
|
297
|
+
const { createEntity, EntityTypeValue } = await import('@stoneforge/core');
|
|
298
|
+
const entity = await createEntity({
|
|
299
|
+
name: 'test-system',
|
|
300
|
+
entityType: EntityTypeValue.SYSTEM,
|
|
301
|
+
createdBy: 'system:test',
|
|
302
|
+
tags: ['test', 'system'],
|
|
303
|
+
metadata: { description: 'System entity for orchestration tests' },
|
|
304
|
+
});
|
|
305
|
+
const saved = await api.create(entity);
|
|
306
|
+
return asEntityId(saved.id);
|
|
307
|
+
}
|
|
308
|
+
// ============================================================================
|
|
309
|
+
// Test Prompt Overrides (Real Mode)
|
|
310
|
+
// ============================================================================
|
|
311
|
+
/**
|
|
312
|
+
* Writes constrained prompt overrides into the workspace for real-mode testing.
|
|
313
|
+
* These instruct agents to work fast, skip exploration, and use the `sf` CLI.
|
|
314
|
+
*/
|
|
315
|
+
async function writeTestPromptOverrides(workspacePath) {
|
|
316
|
+
const { buildTestWorkerOverride, buildTestDirectorOverride, buildTestStewardOverride, } = await import('./test-prompts.js');
|
|
317
|
+
const promptsDir = join(workspacePath, '.stoneforge', 'prompts');
|
|
318
|
+
await mkdir(promptsDir, { recursive: true });
|
|
319
|
+
await writeFile(join(promptsDir, 'worker.md'), buildTestWorkerOverride());
|
|
320
|
+
await writeFile(join(promptsDir, 'director.md'), buildTestDirectorOverride());
|
|
321
|
+
await writeFile(join(promptsDir, 'steward.md'), buildTestStewardOverride());
|
|
322
|
+
}
|
|
323
|
+
// ============================================================================
|
|
324
|
+
// Mock Session Manager
|
|
325
|
+
// ============================================================================
|
|
326
|
+
/**
|
|
327
|
+
* Creates a mock session manager that simulates agent sessions
|
|
328
|
+
* without actually spawning Claude processes.
|
|
329
|
+
*/
|
|
330
|
+
export function createMockSessionManager(agentRegistry) {
|
|
331
|
+
const sessions = new Map();
|
|
332
|
+
const agentSessions = new Map();
|
|
333
|
+
const mockSessions = new Map();
|
|
334
|
+
const { EventEmitter } = require('node:events');
|
|
335
|
+
let sessionCounter = 0;
|
|
336
|
+
const manager = {
|
|
337
|
+
mockSessions,
|
|
338
|
+
createMockSession(agentId, options = {}) {
|
|
339
|
+
const id = `mock-session-${++sessionCounter}-${Date.now()}`;
|
|
340
|
+
const events = new EventEmitter();
|
|
341
|
+
const mockSession = {
|
|
342
|
+
id,
|
|
343
|
+
agentId,
|
|
344
|
+
workingDirectory: options.workingDirectory ?? process.cwd(),
|
|
345
|
+
worktree: options.worktree,
|
|
346
|
+
status: 'running',
|
|
347
|
+
events,
|
|
348
|
+
};
|
|
349
|
+
mockSessions.set(id, mockSession);
|
|
350
|
+
// Also create a session record
|
|
351
|
+
const record = {
|
|
352
|
+
id,
|
|
353
|
+
agentId,
|
|
354
|
+
agentRole: 'worker',
|
|
355
|
+
mode: 'headless',
|
|
356
|
+
status: 'running',
|
|
357
|
+
workingDirectory: mockSession.workingDirectory,
|
|
358
|
+
worktree: mockSession.worktree,
|
|
359
|
+
createdAt: createTimestamp(),
|
|
360
|
+
lastActivityAt: createTimestamp(),
|
|
361
|
+
};
|
|
362
|
+
sessions.set(id, record);
|
|
363
|
+
agentSessions.set(agentId, id);
|
|
364
|
+
return mockSession;
|
|
365
|
+
},
|
|
366
|
+
completeMockSession(sessionId) {
|
|
367
|
+
const mock = mockSessions.get(sessionId);
|
|
368
|
+
if (mock) {
|
|
369
|
+
mock.status = 'terminated';
|
|
370
|
+
mock.events.emit('exit', 0, null);
|
|
371
|
+
}
|
|
372
|
+
const session = sessions.get(sessionId);
|
|
373
|
+
if (session) {
|
|
374
|
+
sessions.set(sessionId, {
|
|
375
|
+
...session,
|
|
376
|
+
status: 'terminated',
|
|
377
|
+
endedAt: createTimestamp(),
|
|
378
|
+
});
|
|
379
|
+
agentSessions.delete(session.agentId);
|
|
380
|
+
}
|
|
381
|
+
},
|
|
382
|
+
async startSession(agentId, options) {
|
|
383
|
+
const existing = agentSessions.get(agentId);
|
|
384
|
+
if (existing && sessions.get(existing)?.status === 'running') {
|
|
385
|
+
throw new Error(`Agent ${agentId} already has an active session`);
|
|
386
|
+
}
|
|
387
|
+
const agent = await agentRegistry.getAgent(agentId);
|
|
388
|
+
const agentMeta = agent?.metadata?.agent;
|
|
389
|
+
const agentRole = agentMeta?.agentRole ?? 'worker';
|
|
390
|
+
const id = `mock-session-${++sessionCounter}-${Date.now()}`;
|
|
391
|
+
const events = new EventEmitter();
|
|
392
|
+
const session = {
|
|
393
|
+
id,
|
|
394
|
+
agentId,
|
|
395
|
+
agentRole,
|
|
396
|
+
mode: 'headless',
|
|
397
|
+
status: 'running',
|
|
398
|
+
workingDirectory: options?.workingDirectory ?? process.cwd(),
|
|
399
|
+
worktree: options?.worktree,
|
|
400
|
+
createdAt: createTimestamp(),
|
|
401
|
+
startedAt: createTimestamp(),
|
|
402
|
+
lastActivityAt: createTimestamp(),
|
|
403
|
+
};
|
|
404
|
+
sessions.set(id, session);
|
|
405
|
+
agentSessions.set(agentId, id);
|
|
406
|
+
const mockSession = {
|
|
407
|
+
id,
|
|
408
|
+
agentId,
|
|
409
|
+
workingDirectory: session.workingDirectory,
|
|
410
|
+
worktree: session.worktree,
|
|
411
|
+
status: 'running',
|
|
412
|
+
events,
|
|
413
|
+
};
|
|
414
|
+
mockSessions.set(id, mockSession);
|
|
415
|
+
// Simulate Claude session ID
|
|
416
|
+
const providerSessionId = `claude-${id}`;
|
|
417
|
+
sessions.set(id, { ...session, providerSessionId });
|
|
418
|
+
// Update agent status
|
|
419
|
+
await agentRegistry.updateAgentSession(agentId, providerSessionId, 'running');
|
|
420
|
+
return { session: sessions.get(id), events };
|
|
421
|
+
},
|
|
422
|
+
async resumeSession(agentId, options) {
|
|
423
|
+
return this.startSession(agentId, {
|
|
424
|
+
workingDirectory: options.workingDirectory,
|
|
425
|
+
worktree: options.worktree,
|
|
426
|
+
});
|
|
427
|
+
},
|
|
428
|
+
async stopSession(sessionId, options) {
|
|
429
|
+
const session = sessions.get(sessionId);
|
|
430
|
+
if (!session) {
|
|
431
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
432
|
+
}
|
|
433
|
+
sessions.set(sessionId, {
|
|
434
|
+
...session,
|
|
435
|
+
status: 'terminated',
|
|
436
|
+
endedAt: createTimestamp(),
|
|
437
|
+
terminationReason: options?.reason,
|
|
438
|
+
});
|
|
439
|
+
agentSessions.delete(session.agentId);
|
|
440
|
+
const mock = mockSessions.get(sessionId);
|
|
441
|
+
if (mock) {
|
|
442
|
+
mock.status = 'terminated';
|
|
443
|
+
mock.events.emit('exit', 0, null);
|
|
444
|
+
}
|
|
445
|
+
await agentRegistry.updateAgentSession(session.agentId, undefined, 'idle');
|
|
446
|
+
},
|
|
447
|
+
async suspendSession(sessionId, reason) {
|
|
448
|
+
const session = sessions.get(sessionId);
|
|
449
|
+
if (!session) {
|
|
450
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
451
|
+
}
|
|
452
|
+
sessions.set(sessionId, {
|
|
453
|
+
...session,
|
|
454
|
+
status: 'suspended',
|
|
455
|
+
endedAt: createTimestamp(),
|
|
456
|
+
terminationReason: reason,
|
|
457
|
+
});
|
|
458
|
+
agentSessions.delete(session.agentId);
|
|
459
|
+
await agentRegistry.updateAgentSession(session.agentId, session.providerSessionId, 'suspended');
|
|
460
|
+
},
|
|
461
|
+
async interruptSession(sessionId) {
|
|
462
|
+
const mock = mockSessions.get(sessionId);
|
|
463
|
+
if (mock) {
|
|
464
|
+
mock.events.emit('interrupt');
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
getSession(sessionId) {
|
|
468
|
+
return sessions.get(sessionId);
|
|
469
|
+
},
|
|
470
|
+
getActiveSession(agentId) {
|
|
471
|
+
const sessionId = agentSessions.get(agentId);
|
|
472
|
+
if (!sessionId)
|
|
473
|
+
return undefined;
|
|
474
|
+
const session = sessions.get(sessionId);
|
|
475
|
+
if (!session || session.status !== 'running')
|
|
476
|
+
return undefined;
|
|
477
|
+
return session;
|
|
478
|
+
},
|
|
479
|
+
listSessions(filter) {
|
|
480
|
+
let result = Array.from(sessions.values());
|
|
481
|
+
if (filter) {
|
|
482
|
+
if (filter.agentId) {
|
|
483
|
+
result = result.filter(s => s.agentId === filter.agentId);
|
|
484
|
+
}
|
|
485
|
+
if (filter.role) {
|
|
486
|
+
result = result.filter(s => s.agentRole === filter.role);
|
|
487
|
+
}
|
|
488
|
+
if (filter.status) {
|
|
489
|
+
const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
|
|
490
|
+
result = result.filter(s => statuses.includes(s.status));
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
return result;
|
|
494
|
+
},
|
|
495
|
+
getMostRecentResumableSession(agentId) {
|
|
496
|
+
const agentSessionList = Array.from(sessions.values())
|
|
497
|
+
.filter(s => s.agentId === agentId && s.providerSessionId)
|
|
498
|
+
.sort((a, b) => {
|
|
499
|
+
const aTime = typeof a.createdAt === 'number' ? a.createdAt : new Date(a.createdAt).getTime();
|
|
500
|
+
const bTime = typeof b.createdAt === 'number' ? b.createdAt : new Date(b.createdAt).getTime();
|
|
501
|
+
return bTime - aTime;
|
|
502
|
+
});
|
|
503
|
+
return agentSessionList[0];
|
|
504
|
+
},
|
|
505
|
+
async getSessionHistory(agentId, limit = 10) {
|
|
506
|
+
return Array.from(sessions.values())
|
|
507
|
+
.filter(s => s.agentId === agentId)
|
|
508
|
+
.slice(0, limit)
|
|
509
|
+
.map(s => ({
|
|
510
|
+
id: s.id,
|
|
511
|
+
providerSessionId: s.providerSessionId,
|
|
512
|
+
status: s.status,
|
|
513
|
+
workingDirectory: s.workingDirectory,
|
|
514
|
+
worktree: s.worktree,
|
|
515
|
+
startedAt: s.startedAt,
|
|
516
|
+
endedAt: s.endedAt,
|
|
517
|
+
terminationReason: s.terminationReason,
|
|
518
|
+
}));
|
|
519
|
+
},
|
|
520
|
+
async getSessionHistoryByRole(role, limit = 10) {
|
|
521
|
+
return Array.from(sessions.values())
|
|
522
|
+
.filter(s => s.agentRole === role)
|
|
523
|
+
.slice(0, limit)
|
|
524
|
+
.map(s => ({
|
|
525
|
+
id: s.id,
|
|
526
|
+
providerSessionId: s.providerSessionId,
|
|
527
|
+
status: s.status,
|
|
528
|
+
workingDirectory: s.workingDirectory,
|
|
529
|
+
worktree: s.worktree,
|
|
530
|
+
startedAt: s.startedAt,
|
|
531
|
+
endedAt: s.endedAt,
|
|
532
|
+
terminationReason: s.terminationReason,
|
|
533
|
+
role: s.agentRole,
|
|
534
|
+
agentId: s.agentId,
|
|
535
|
+
agentName: undefined,
|
|
536
|
+
}));
|
|
537
|
+
},
|
|
538
|
+
async getPreviousSession(role) {
|
|
539
|
+
const history = await this.getSessionHistoryByRole(role, 1);
|
|
540
|
+
return history.find(s => s.status === 'suspended' || s.status === 'terminated');
|
|
541
|
+
},
|
|
542
|
+
async messageSession(sessionId, _options) {
|
|
543
|
+
const session = sessions.get(sessionId);
|
|
544
|
+
if (!session) {
|
|
545
|
+
return { success: false, error: `Session not found: ${sessionId}` };
|
|
546
|
+
}
|
|
547
|
+
const mock = mockSessions.get(sessionId);
|
|
548
|
+
if (mock) {
|
|
549
|
+
mock.events.emit('message', _options);
|
|
550
|
+
}
|
|
551
|
+
return { success: true };
|
|
552
|
+
},
|
|
553
|
+
getEventEmitter(sessionId) {
|
|
554
|
+
return mockSessions.get(sessionId)?.events;
|
|
555
|
+
},
|
|
556
|
+
recordUserInput(_sessionId) {
|
|
557
|
+
// No-op for mock
|
|
558
|
+
},
|
|
559
|
+
getSessionUserIdleMs(_agentId) {
|
|
560
|
+
return undefined;
|
|
561
|
+
},
|
|
562
|
+
async persistSession(_sessionId) {
|
|
563
|
+
// No-op for mock
|
|
564
|
+
},
|
|
565
|
+
async loadSessionState(_agentId) {
|
|
566
|
+
// No-op for mock
|
|
567
|
+
},
|
|
568
|
+
async reconcileOnStartup() {
|
|
569
|
+
return { reconciled: 0, errors: [] };
|
|
570
|
+
},
|
|
571
|
+
};
|
|
572
|
+
return manager;
|
|
573
|
+
}
|
|
574
|
+
// ============================================================================
|
|
575
|
+
// Test Data Helpers
|
|
576
|
+
// ============================================================================
|
|
577
|
+
/**
|
|
578
|
+
* Creates a test worker agent.
|
|
579
|
+
*/
|
|
580
|
+
export async function createTestWorker(ctx, name, options = {}) {
|
|
581
|
+
return ctx.api.registerWorker({
|
|
582
|
+
name,
|
|
583
|
+
createdBy: ctx.systemEntityId,
|
|
584
|
+
workerMode: options.workerMode ?? 'ephemeral',
|
|
585
|
+
maxConcurrentTasks: 1,
|
|
586
|
+
tags: ['test'],
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Creates a test director agent.
|
|
591
|
+
*/
|
|
592
|
+
export async function createTestDirector(ctx, name) {
|
|
593
|
+
return ctx.api.registerDirector({
|
|
594
|
+
name,
|
|
595
|
+
createdBy: ctx.systemEntityId,
|
|
596
|
+
maxConcurrentTasks: 5,
|
|
597
|
+
tags: ['test'],
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Creates a test steward agent.
|
|
602
|
+
*/
|
|
603
|
+
export async function createTestSteward(ctx, name, options = {}) {
|
|
604
|
+
return ctx.api.registerSteward({
|
|
605
|
+
name,
|
|
606
|
+
createdBy: ctx.systemEntityId,
|
|
607
|
+
stewardFocus: options.focus ?? 'merge',
|
|
608
|
+
triggers: options.triggers ?? [],
|
|
609
|
+
maxConcurrentTasks: 1,
|
|
610
|
+
tags: ['test'],
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Creates a test task.
|
|
615
|
+
*/
|
|
616
|
+
export async function createTestTask(ctx, title, options = {}) {
|
|
617
|
+
// Create task using core factory
|
|
618
|
+
const task = await coreCreateTask({
|
|
619
|
+
title,
|
|
620
|
+
createdBy: ctx.systemEntityId,
|
|
621
|
+
priority: (options.priority ?? 5),
|
|
622
|
+
tags: options.tags ?? ['test'],
|
|
623
|
+
acceptanceCriteria: options.acceptanceCriteria,
|
|
624
|
+
});
|
|
625
|
+
// Save to database
|
|
626
|
+
const saved = await ctx.api.create(task);
|
|
627
|
+
return saved;
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Sends a message to an agent's channel.
|
|
631
|
+
*/
|
|
632
|
+
export async function sendTestMessage(ctx, agentId, content) {
|
|
633
|
+
const channelId = await ctx.api.getAgentChannel(agentId);
|
|
634
|
+
if (!channelId) {
|
|
635
|
+
throw new Error(`Agent ${agentId} has no channel`);
|
|
636
|
+
}
|
|
637
|
+
// Create a document for the message content
|
|
638
|
+
const doc = await ctx.stoneforgeApi.create({
|
|
639
|
+
type: 'document',
|
|
640
|
+
kind: 'document',
|
|
641
|
+
subKind: 'message',
|
|
642
|
+
title: 'Test Message',
|
|
643
|
+
content,
|
|
644
|
+
metadata: {},
|
|
645
|
+
tags: ['test'],
|
|
646
|
+
createdBy: ctx.systemEntityId,
|
|
647
|
+
createdAt: createTimestamp(),
|
|
648
|
+
updatedAt: createTimestamp(),
|
|
649
|
+
});
|
|
650
|
+
// Create the message
|
|
651
|
+
await ctx.stoneforgeApi.create({
|
|
652
|
+
type: 'message',
|
|
653
|
+
kind: 'message',
|
|
654
|
+
subKind: 'direct',
|
|
655
|
+
channel: channelId,
|
|
656
|
+
sender: ctx.systemEntityId,
|
|
657
|
+
contentRef: asElementId(doc.id),
|
|
658
|
+
metadata: {},
|
|
659
|
+
tags: ['test'],
|
|
660
|
+
createdBy: ctx.systemEntityId,
|
|
661
|
+
createdAt: createTimestamp(),
|
|
662
|
+
updatedAt: createTimestamp(),
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
//# sourceMappingURL=test-context.js.map
|