@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,762 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pool Commands - CLI operations for agent pool management
|
|
3
|
+
*
|
|
4
|
+
* Provides commands for managing agent pools:
|
|
5
|
+
* - pool list: List all agent pools
|
|
6
|
+
* - pool show <id>: Show pool details
|
|
7
|
+
* - pool create <name>: Create a new agent pool
|
|
8
|
+
* - pool update <id>: Update pool configuration
|
|
9
|
+
* - pool delete <id>: Delete a pool
|
|
10
|
+
* - pool status <id>: Show pool status with active agents
|
|
11
|
+
*/
|
|
12
|
+
import { success, failure, ExitCode, getFormatter, getOutputMode, OPERATOR_ENTITY_ID } from '@stoneforge/quarry/cli';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Shared Helpers
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/**
|
|
17
|
+
* Creates orchestrator API client and pool service
|
|
18
|
+
*/
|
|
19
|
+
async function createPoolClient(options) {
|
|
20
|
+
try {
|
|
21
|
+
const { createStorage, initializeSchema, findStoneforgeDir } = await import('@stoneforge/quarry');
|
|
22
|
+
const { createOrchestratorAPI } = await import('../../api/index.js');
|
|
23
|
+
const { createAgentPoolService, createAgentRegistry } = await import('../../services/index.js');
|
|
24
|
+
const { createSpawnerService, createSessionManager } = await import('../../runtime/index.js');
|
|
25
|
+
const stoneforgeDir = findStoneforgeDir(process.cwd());
|
|
26
|
+
if (!stoneforgeDir) {
|
|
27
|
+
return {
|
|
28
|
+
poolService: null,
|
|
29
|
+
error: 'No .stoneforge directory found. Run "sf init" first.',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const dbPath = options.db ?? `${stoneforgeDir}/stoneforge.db`;
|
|
33
|
+
const backend = createStorage({ path: dbPath, create: true });
|
|
34
|
+
initializeSchema(backend);
|
|
35
|
+
const api = createOrchestratorAPI(backend);
|
|
36
|
+
// Create agent registry
|
|
37
|
+
const agentRegistry = createAgentRegistry(api);
|
|
38
|
+
// Create spawner and session manager
|
|
39
|
+
const spawner = createSpawnerService();
|
|
40
|
+
const sessionManager = createSessionManager(spawner, api, agentRegistry);
|
|
41
|
+
// Create pool service
|
|
42
|
+
const poolService = createAgentPoolService(api, sessionManager, agentRegistry);
|
|
43
|
+
return { poolService };
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
47
|
+
return { poolService: null, error: `Failed to initialize pool service: ${message}` };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parses agent type configuration from CLI string format
|
|
52
|
+
* Format: "role[:workerMode|stewardFocus][:priority][:maxSlots]"
|
|
53
|
+
* Examples:
|
|
54
|
+
* "worker:ephemeral:100:5" - ephemeral workers, priority 100, max 5 slots
|
|
55
|
+
* "worker:persistent:50" - persistent workers, priority 50
|
|
56
|
+
* "steward:merge" - merge stewards
|
|
57
|
+
* "worker" - all workers with default settings
|
|
58
|
+
*/
|
|
59
|
+
function parseAgentTypeConfig(configStr) {
|
|
60
|
+
const parts = configStr.split(':');
|
|
61
|
+
if (parts.length === 0)
|
|
62
|
+
return null;
|
|
63
|
+
const role = parts[0];
|
|
64
|
+
if (!['worker', 'steward'].includes(role)) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
// Build config properties
|
|
68
|
+
let workerMode;
|
|
69
|
+
let stewardFocus;
|
|
70
|
+
let priority;
|
|
71
|
+
let maxSlots;
|
|
72
|
+
if (parts.length > 1) {
|
|
73
|
+
if (role === 'worker') {
|
|
74
|
+
if (['ephemeral', 'persistent'].includes(parts[1])) {
|
|
75
|
+
workerMode = parts[1];
|
|
76
|
+
}
|
|
77
|
+
else if (!isNaN(parseInt(parts[1], 10))) {
|
|
78
|
+
// It's a priority number
|
|
79
|
+
priority = parseInt(parts[1], 10);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (role === 'steward') {
|
|
83
|
+
if (['merge', 'health', 'reminder', 'ops', 'docs'].includes(parts[1])) {
|
|
84
|
+
stewardFocus = parts[1];
|
|
85
|
+
}
|
|
86
|
+
else if (!isNaN(parseInt(parts[1], 10))) {
|
|
87
|
+
priority = parseInt(parts[1], 10);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (parts.length > 2) {
|
|
92
|
+
const maybeNum = parseInt(parts[2], 10);
|
|
93
|
+
if (!isNaN(maybeNum)) {
|
|
94
|
+
priority = maybeNum;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (parts.length > 3) {
|
|
98
|
+
const maybeSlots = parseInt(parts[3], 10);
|
|
99
|
+
if (!isNaN(maybeSlots)) {
|
|
100
|
+
maxSlots = maybeSlots;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Build the config object with all properties upfront
|
|
104
|
+
const config = {
|
|
105
|
+
role: role,
|
|
106
|
+
...(workerMode !== undefined && { workerMode }),
|
|
107
|
+
...(stewardFocus !== undefined && { stewardFocus }),
|
|
108
|
+
...(priority !== undefined && { priority }),
|
|
109
|
+
...(maxSlots !== undefined && { maxSlots }),
|
|
110
|
+
};
|
|
111
|
+
return config;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Formats agent type config for display
|
|
115
|
+
*/
|
|
116
|
+
function formatAgentTypeConfig(config) {
|
|
117
|
+
let result = config.role;
|
|
118
|
+
if (config.workerMode)
|
|
119
|
+
result += `:${config.workerMode}`;
|
|
120
|
+
if (config.stewardFocus)
|
|
121
|
+
result += `:${config.stewardFocus}`;
|
|
122
|
+
if (config.priority !== undefined)
|
|
123
|
+
result += ` (priority: ${config.priority})`;
|
|
124
|
+
if (config.maxSlots !== undefined)
|
|
125
|
+
result += ` (max: ${config.maxSlots})`;
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
const poolListOptions = [
|
|
129
|
+
{
|
|
130
|
+
name: 'enabled',
|
|
131
|
+
short: 'e',
|
|
132
|
+
description: 'Only show enabled pools',
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: 'available',
|
|
136
|
+
short: 'a',
|
|
137
|
+
description: 'Only show pools with available slots',
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: 'tag',
|
|
141
|
+
short: 't',
|
|
142
|
+
description: 'Filter by tag',
|
|
143
|
+
hasValue: true,
|
|
144
|
+
},
|
|
145
|
+
];
|
|
146
|
+
async function poolListHandler(_args, options) {
|
|
147
|
+
const { poolService, error } = await createPoolClient(options);
|
|
148
|
+
if (error || !poolService) {
|
|
149
|
+
return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const pools = await poolService.listPools({
|
|
153
|
+
enabled: options.enabled,
|
|
154
|
+
hasAvailableSlots: options.available,
|
|
155
|
+
tags: options.tag ? [options.tag] : undefined,
|
|
156
|
+
});
|
|
157
|
+
const mode = getOutputMode(options);
|
|
158
|
+
const formatter = getFormatter(mode);
|
|
159
|
+
if (mode === 'json') {
|
|
160
|
+
return success(pools);
|
|
161
|
+
}
|
|
162
|
+
if (mode === 'quiet') {
|
|
163
|
+
return success(pools.map((p) => p.id).join('\n'));
|
|
164
|
+
}
|
|
165
|
+
if (pools.length === 0) {
|
|
166
|
+
return success(null, 'No agent pools found');
|
|
167
|
+
}
|
|
168
|
+
const headers = ['ID', 'NAME', 'SIZE', 'ACTIVE', 'AVAILABLE', 'ENABLED'];
|
|
169
|
+
const rows = pools.map((pool) => [
|
|
170
|
+
pool.id,
|
|
171
|
+
pool.config.name,
|
|
172
|
+
String(pool.config.maxSize),
|
|
173
|
+
String(pool.status.activeCount),
|
|
174
|
+
String(pool.status.availableSlots),
|
|
175
|
+
pool.config.enabled ? 'yes' : 'no',
|
|
176
|
+
]);
|
|
177
|
+
const table = formatter.table(headers, rows);
|
|
178
|
+
return success(pools, `${table}\n${pools.length} pool(s)`);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
182
|
+
return failure(`Failed to list pools: ${message}`, ExitCode.GENERAL_ERROR);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export const poolListCommand = {
|
|
186
|
+
name: 'list',
|
|
187
|
+
description: 'List agent pools',
|
|
188
|
+
usage: 'sf pool list [options]',
|
|
189
|
+
help: `List all agent pools.
|
|
190
|
+
|
|
191
|
+
Options:
|
|
192
|
+
-e, --enabled Only show enabled pools
|
|
193
|
+
-a, --available Only show pools with available slots
|
|
194
|
+
-t, --tag <tag> Filter by tag
|
|
195
|
+
|
|
196
|
+
Examples:
|
|
197
|
+
sf pool list
|
|
198
|
+
sf pool list --enabled
|
|
199
|
+
sf pool list --available
|
|
200
|
+
sf pool list --tag production`,
|
|
201
|
+
options: poolListOptions,
|
|
202
|
+
handler: poolListHandler,
|
|
203
|
+
};
|
|
204
|
+
// ============================================================================
|
|
205
|
+
// Pool Show Command
|
|
206
|
+
// ============================================================================
|
|
207
|
+
async function poolShowHandler(args, options) {
|
|
208
|
+
const [idOrName] = args;
|
|
209
|
+
if (!idOrName) {
|
|
210
|
+
return failure('Usage: sf pool show <id|name>\nExample: sf pool show default', ExitCode.INVALID_ARGUMENTS);
|
|
211
|
+
}
|
|
212
|
+
const { poolService, error } = await createPoolClient(options);
|
|
213
|
+
if (error || !poolService) {
|
|
214
|
+
return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
// Try to get by ID first, then by name
|
|
218
|
+
let pool;
|
|
219
|
+
if (idOrName.startsWith('el-')) {
|
|
220
|
+
pool = await poolService.getPool(idOrName);
|
|
221
|
+
}
|
|
222
|
+
if (!pool) {
|
|
223
|
+
pool = await poolService.getPoolByName(idOrName);
|
|
224
|
+
}
|
|
225
|
+
if (!pool) {
|
|
226
|
+
return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
|
|
227
|
+
}
|
|
228
|
+
const mode = getOutputMode(options);
|
|
229
|
+
if (mode === 'json') {
|
|
230
|
+
return success(pool);
|
|
231
|
+
}
|
|
232
|
+
if (mode === 'quiet') {
|
|
233
|
+
return success(pool.id);
|
|
234
|
+
}
|
|
235
|
+
const lines = [
|
|
236
|
+
`ID: ${pool.id}`,
|
|
237
|
+
`Name: ${pool.config.name}`,
|
|
238
|
+
`Description: ${pool.config.description ?? '-'}`,
|
|
239
|
+
`Max Size: ${pool.config.maxSize}`,
|
|
240
|
+
`Enabled: ${pool.config.enabled ? 'yes' : 'no'}`,
|
|
241
|
+
`Created: ${pool.createdAt}`,
|
|
242
|
+
'',
|
|
243
|
+
'Status:',
|
|
244
|
+
` Active: ${pool.status.activeCount}`,
|
|
245
|
+
` Available: ${pool.status.availableSlots}`,
|
|
246
|
+
` Updated: ${pool.status.lastUpdatedAt}`,
|
|
247
|
+
];
|
|
248
|
+
if (pool.config.agentTypes.length > 0) {
|
|
249
|
+
lines.push('', 'Agent Types:');
|
|
250
|
+
for (const typeConfig of pool.config.agentTypes) {
|
|
251
|
+
lines.push(` - ${formatAgentTypeConfig(typeConfig)}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (pool.config.tags && pool.config.tags.length > 0) {
|
|
255
|
+
lines.push(`Tags: ${pool.config.tags.join(', ')}`);
|
|
256
|
+
}
|
|
257
|
+
if (pool.status.activeAgentIds.length > 0) {
|
|
258
|
+
lines.push('', 'Active Agents:');
|
|
259
|
+
for (const agentId of pool.status.activeAgentIds) {
|
|
260
|
+
lines.push(` - ${agentId}`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return success(pool, lines.join('\n'));
|
|
264
|
+
}
|
|
265
|
+
catch (err) {
|
|
266
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
267
|
+
return failure(`Failed to show pool: ${message}`, ExitCode.GENERAL_ERROR);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
export const poolShowCommand = {
|
|
271
|
+
name: 'show',
|
|
272
|
+
description: 'Show pool details',
|
|
273
|
+
usage: 'sf pool show <id|name>',
|
|
274
|
+
help: `Show detailed information about an agent pool.
|
|
275
|
+
|
|
276
|
+
Arguments:
|
|
277
|
+
id|name Pool identifier or name
|
|
278
|
+
|
|
279
|
+
Examples:
|
|
280
|
+
sf pool show default
|
|
281
|
+
sf pool show el-abc123`,
|
|
282
|
+
options: [],
|
|
283
|
+
handler: poolShowHandler,
|
|
284
|
+
};
|
|
285
|
+
const poolCreateOptions = [
|
|
286
|
+
{
|
|
287
|
+
name: 'size',
|
|
288
|
+
short: 's',
|
|
289
|
+
description: 'Maximum pool size (default: 5)',
|
|
290
|
+
hasValue: true,
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
name: 'description',
|
|
294
|
+
short: 'd',
|
|
295
|
+
description: 'Pool description',
|
|
296
|
+
hasValue: true,
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
name: 'agentType',
|
|
300
|
+
short: 't',
|
|
301
|
+
description: 'Agent type config (can repeat). Format: role[:mode|focus][:priority][:maxSlots]',
|
|
302
|
+
hasValue: true,
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: 'tags',
|
|
306
|
+
description: 'Comma-separated tags',
|
|
307
|
+
hasValue: true,
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: 'disabled',
|
|
311
|
+
description: 'Create pool in disabled state',
|
|
312
|
+
},
|
|
313
|
+
];
|
|
314
|
+
async function poolCreateHandler(args, options) {
|
|
315
|
+
const [name] = args;
|
|
316
|
+
if (!name) {
|
|
317
|
+
return failure('Usage: sf pool create <name> [options]\nExample: sf pool create default --size 5', ExitCode.INVALID_ARGUMENTS);
|
|
318
|
+
}
|
|
319
|
+
const { poolService, error } = await createPoolClient(options);
|
|
320
|
+
if (error || !poolService) {
|
|
321
|
+
return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
|
|
322
|
+
}
|
|
323
|
+
try {
|
|
324
|
+
const maxSize = options.size ? parseInt(options.size, 10) : 5;
|
|
325
|
+
if (isNaN(maxSize) || maxSize < 1 || maxSize > 1000) {
|
|
326
|
+
return failure('Invalid size. Must be between 1 and 1000.', ExitCode.VALIDATION);
|
|
327
|
+
}
|
|
328
|
+
// Parse agent types
|
|
329
|
+
const agentTypes = [];
|
|
330
|
+
const agentTypeInputs = Array.isArray(options.agentType)
|
|
331
|
+
? options.agentType
|
|
332
|
+
: options.agentType
|
|
333
|
+
? [options.agentType]
|
|
334
|
+
: [];
|
|
335
|
+
for (const typeStr of agentTypeInputs) {
|
|
336
|
+
const typeConfig = parseAgentTypeConfig(typeStr);
|
|
337
|
+
if (!typeConfig) {
|
|
338
|
+
return failure(`Invalid agent type format: ${typeStr}. ` +
|
|
339
|
+
`Use: role[:mode|focus][:priority][:maxSlots] (e.g., worker:ephemeral:100:5)`, ExitCode.VALIDATION);
|
|
340
|
+
}
|
|
341
|
+
agentTypes.push(typeConfig);
|
|
342
|
+
}
|
|
343
|
+
const input = {
|
|
344
|
+
name,
|
|
345
|
+
description: options.description,
|
|
346
|
+
maxSize,
|
|
347
|
+
agentTypes,
|
|
348
|
+
enabled: !options.disabled,
|
|
349
|
+
tags: options.tags ? options.tags.split(',').map((t) => t.trim()) : undefined,
|
|
350
|
+
createdBy: (options.actor ?? OPERATOR_ENTITY_ID),
|
|
351
|
+
};
|
|
352
|
+
const pool = await poolService.createPool(input);
|
|
353
|
+
const mode = getOutputMode(options);
|
|
354
|
+
if (mode === 'json') {
|
|
355
|
+
return success(pool);
|
|
356
|
+
}
|
|
357
|
+
if (mode === 'quiet') {
|
|
358
|
+
return success(pool.id);
|
|
359
|
+
}
|
|
360
|
+
return success(pool, `Created pool '${name}': ${pool.id}`);
|
|
361
|
+
}
|
|
362
|
+
catch (err) {
|
|
363
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
364
|
+
return failure(`Failed to create pool: ${message}`, ExitCode.GENERAL_ERROR);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
export const poolCreateCommand = {
|
|
368
|
+
name: 'create',
|
|
369
|
+
description: 'Create an agent pool',
|
|
370
|
+
usage: 'sf pool create <name> [options]',
|
|
371
|
+
help: `Create a new agent pool.
|
|
372
|
+
|
|
373
|
+
Arguments:
|
|
374
|
+
name Pool name (must be unique)
|
|
375
|
+
|
|
376
|
+
Options:
|
|
377
|
+
-s, --size <n> Maximum pool size (default: 5)
|
|
378
|
+
-d, --description <text> Pool description
|
|
379
|
+
-t, --agentType <config> Agent type config (can repeat)
|
|
380
|
+
Format: role[:mode|focus][:priority][:maxSlots]
|
|
381
|
+
--tags <tags> Comma-separated tags
|
|
382
|
+
--disabled Create pool in disabled state
|
|
383
|
+
|
|
384
|
+
Agent Type Format Examples:
|
|
385
|
+
worker All workers with default settings
|
|
386
|
+
worker:ephemeral Ephemeral workers only
|
|
387
|
+
worker:ephemeral:100 Ephemeral workers with priority 100
|
|
388
|
+
worker:persistent:50:3 Persistent workers, priority 50, max 3 slots
|
|
389
|
+
steward:merge Merge stewards
|
|
390
|
+
steward:health:80 Health stewards with priority 80
|
|
391
|
+
|
|
392
|
+
Examples:
|
|
393
|
+
sf pool create default --size 5
|
|
394
|
+
sf pool create workers --size 10 -t worker:ephemeral -t worker:persistent
|
|
395
|
+
sf pool create merge-pool --size 2 -t steward:merge:100
|
|
396
|
+
sf pool create production --size 20 --tags "prod,critical"`,
|
|
397
|
+
options: poolCreateOptions,
|
|
398
|
+
handler: poolCreateHandler,
|
|
399
|
+
};
|
|
400
|
+
const poolUpdateOptions = [
|
|
401
|
+
{
|
|
402
|
+
name: 'size',
|
|
403
|
+
short: 's',
|
|
404
|
+
description: 'Maximum pool size',
|
|
405
|
+
hasValue: true,
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
name: 'description',
|
|
409
|
+
short: 'd',
|
|
410
|
+
description: 'Pool description',
|
|
411
|
+
hasValue: true,
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: 'agentType',
|
|
415
|
+
short: 't',
|
|
416
|
+
description: 'Agent type config (replaces existing, can repeat)',
|
|
417
|
+
hasValue: true,
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
name: 'tags',
|
|
421
|
+
description: 'Comma-separated tags (replaces existing)',
|
|
422
|
+
hasValue: true,
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
name: 'enable',
|
|
426
|
+
description: 'Enable the pool',
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
name: 'disable',
|
|
430
|
+
description: 'Disable the pool',
|
|
431
|
+
},
|
|
432
|
+
];
|
|
433
|
+
async function poolUpdateHandler(args, options) {
|
|
434
|
+
const [idOrName] = args;
|
|
435
|
+
if (!idOrName) {
|
|
436
|
+
return failure('Usage: sf pool update <id|name> [options]\nExample: sf pool update default --size 10', ExitCode.INVALID_ARGUMENTS);
|
|
437
|
+
}
|
|
438
|
+
if (options.enable && options.disable) {
|
|
439
|
+
return failure('Cannot use both --enable and --disable', ExitCode.VALIDATION);
|
|
440
|
+
}
|
|
441
|
+
const { poolService, error } = await createPoolClient(options);
|
|
442
|
+
if (error || !poolService) {
|
|
443
|
+
return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
|
|
444
|
+
}
|
|
445
|
+
try {
|
|
446
|
+
// Find the pool
|
|
447
|
+
let pool;
|
|
448
|
+
if (idOrName.startsWith('el-')) {
|
|
449
|
+
pool = await poolService.getPool(idOrName);
|
|
450
|
+
}
|
|
451
|
+
if (!pool) {
|
|
452
|
+
pool = await poolService.getPoolByName(idOrName);
|
|
453
|
+
}
|
|
454
|
+
if (!pool) {
|
|
455
|
+
return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
|
|
456
|
+
}
|
|
457
|
+
// Validate and parse options first
|
|
458
|
+
let maxSize;
|
|
459
|
+
if (options.size !== undefined) {
|
|
460
|
+
maxSize = parseInt(options.size, 10);
|
|
461
|
+
if (isNaN(maxSize) || maxSize < 1 || maxSize > 1000) {
|
|
462
|
+
return failure('Invalid size. Must be between 1 and 1000.', ExitCode.VALIDATION);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
let agentTypes;
|
|
466
|
+
if (options.agentType !== undefined) {
|
|
467
|
+
agentTypes = [];
|
|
468
|
+
const agentTypeInputs = Array.isArray(options.agentType)
|
|
469
|
+
? options.agentType
|
|
470
|
+
: [options.agentType];
|
|
471
|
+
for (const typeStr of agentTypeInputs) {
|
|
472
|
+
const typeConfig = parseAgentTypeConfig(typeStr);
|
|
473
|
+
if (!typeConfig) {
|
|
474
|
+
return failure(`Invalid agent type format: ${typeStr}`, ExitCode.VALIDATION);
|
|
475
|
+
}
|
|
476
|
+
agentTypes.push(typeConfig);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
const parsedTags = options.tags !== undefined
|
|
480
|
+
? options.tags.split(',').map((t) => t.trim())
|
|
481
|
+
: undefined;
|
|
482
|
+
const enabled = options.enable ? true : options.disable ? false : undefined;
|
|
483
|
+
// Build updates object with all properties upfront
|
|
484
|
+
const updates = {
|
|
485
|
+
...(options.description !== undefined && { description: options.description }),
|
|
486
|
+
...(maxSize !== undefined && { maxSize }),
|
|
487
|
+
...(agentTypes !== undefined && { agentTypes }),
|
|
488
|
+
...(parsedTags !== undefined && { tags: parsedTags }),
|
|
489
|
+
...(enabled !== undefined && { enabled }),
|
|
490
|
+
};
|
|
491
|
+
const updatedPool = await poolService.updatePool(pool.id, updates);
|
|
492
|
+
const mode = getOutputMode(options);
|
|
493
|
+
if (mode === 'json') {
|
|
494
|
+
return success(updatedPool);
|
|
495
|
+
}
|
|
496
|
+
if (mode === 'quiet') {
|
|
497
|
+
return success(updatedPool.id);
|
|
498
|
+
}
|
|
499
|
+
return success(updatedPool, `Updated pool '${updatedPool.config.name}'`);
|
|
500
|
+
}
|
|
501
|
+
catch (err) {
|
|
502
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
503
|
+
return failure(`Failed to update pool: ${message}`, ExitCode.GENERAL_ERROR);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
export const poolUpdateCommand = {
|
|
507
|
+
name: 'update',
|
|
508
|
+
description: 'Update pool configuration',
|
|
509
|
+
usage: 'sf pool update <id|name> [options]',
|
|
510
|
+
help: `Update an agent pool configuration.
|
|
511
|
+
|
|
512
|
+
Arguments:
|
|
513
|
+
id|name Pool identifier or name
|
|
514
|
+
|
|
515
|
+
Options:
|
|
516
|
+
-s, --size <n> Maximum pool size
|
|
517
|
+
-d, --description <text> Pool description
|
|
518
|
+
-t, --agentType <config> Agent type config (replaces existing, can repeat)
|
|
519
|
+
--tags <tags> Comma-separated tags (replaces existing)
|
|
520
|
+
--enable Enable the pool
|
|
521
|
+
--disable Disable the pool
|
|
522
|
+
|
|
523
|
+
Examples:
|
|
524
|
+
sf pool update default --size 10
|
|
525
|
+
sf pool update workers --enable
|
|
526
|
+
sf pool update merge-pool --disable
|
|
527
|
+
sf pool update production --description "Production agent pool"`,
|
|
528
|
+
options: poolUpdateOptions,
|
|
529
|
+
handler: poolUpdateHandler,
|
|
530
|
+
};
|
|
531
|
+
const poolDeleteOptions = [
|
|
532
|
+
{
|
|
533
|
+
name: 'force',
|
|
534
|
+
short: 'f',
|
|
535
|
+
description: 'Delete even if agents are active',
|
|
536
|
+
},
|
|
537
|
+
];
|
|
538
|
+
async function poolDeleteHandler(args, options) {
|
|
539
|
+
const [idOrName] = args;
|
|
540
|
+
if (!idOrName) {
|
|
541
|
+
return failure('Usage: sf pool delete <id|name>\nExample: sf pool delete old-pool', ExitCode.INVALID_ARGUMENTS);
|
|
542
|
+
}
|
|
543
|
+
const { poolService, error } = await createPoolClient(options);
|
|
544
|
+
if (error || !poolService) {
|
|
545
|
+
return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
|
|
546
|
+
}
|
|
547
|
+
try {
|
|
548
|
+
// Find the pool
|
|
549
|
+
let pool;
|
|
550
|
+
if (idOrName.startsWith('el-')) {
|
|
551
|
+
pool = await poolService.getPool(idOrName);
|
|
552
|
+
}
|
|
553
|
+
if (!pool) {
|
|
554
|
+
pool = await poolService.getPoolByName(idOrName);
|
|
555
|
+
}
|
|
556
|
+
if (!pool) {
|
|
557
|
+
return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
|
|
558
|
+
}
|
|
559
|
+
// Check for active agents
|
|
560
|
+
if (pool.status.activeCount > 0 && !options.force) {
|
|
561
|
+
return failure(`Pool '${pool.config.name}' has ${pool.status.activeCount} active agent(s). ` +
|
|
562
|
+
`Use --force to delete anyway.`, ExitCode.VALIDATION);
|
|
563
|
+
}
|
|
564
|
+
await poolService.deletePool(pool.id);
|
|
565
|
+
const mode = getOutputMode(options);
|
|
566
|
+
if (mode === 'json') {
|
|
567
|
+
return success({ deleted: pool.id, name: pool.config.name });
|
|
568
|
+
}
|
|
569
|
+
if (mode === 'quiet') {
|
|
570
|
+
return success(pool.id);
|
|
571
|
+
}
|
|
572
|
+
return success({ deleted: pool.id }, `Deleted pool '${pool.config.name}'`);
|
|
573
|
+
}
|
|
574
|
+
catch (err) {
|
|
575
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
576
|
+
return failure(`Failed to delete pool: ${message}`, ExitCode.GENERAL_ERROR);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
export const poolDeleteCommand = {
|
|
580
|
+
name: 'delete',
|
|
581
|
+
description: 'Delete an agent pool',
|
|
582
|
+
usage: 'sf pool delete <id|name>',
|
|
583
|
+
help: `Delete an agent pool.
|
|
584
|
+
|
|
585
|
+
Arguments:
|
|
586
|
+
id|name Pool identifier or name
|
|
587
|
+
|
|
588
|
+
Options:
|
|
589
|
+
-f, --force Delete even if agents are active
|
|
590
|
+
|
|
591
|
+
Examples:
|
|
592
|
+
sf pool delete old-pool
|
|
593
|
+
sf pool delete el-abc123 --force`,
|
|
594
|
+
options: poolDeleteOptions,
|
|
595
|
+
handler: poolDeleteHandler,
|
|
596
|
+
};
|
|
597
|
+
// ============================================================================
|
|
598
|
+
// Pool Status Command
|
|
599
|
+
// ============================================================================
|
|
600
|
+
async function poolStatusHandler(args, options) {
|
|
601
|
+
const [idOrName] = args;
|
|
602
|
+
if (!idOrName) {
|
|
603
|
+
return failure('Usage: sf pool status <id|name>\nExample: sf pool status default', ExitCode.INVALID_ARGUMENTS);
|
|
604
|
+
}
|
|
605
|
+
const { poolService, error } = await createPoolClient(options);
|
|
606
|
+
if (error || !poolService) {
|
|
607
|
+
return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
|
|
608
|
+
}
|
|
609
|
+
try {
|
|
610
|
+
// Find the pool
|
|
611
|
+
let pool;
|
|
612
|
+
if (idOrName.startsWith('el-')) {
|
|
613
|
+
pool = await poolService.getPool(idOrName);
|
|
614
|
+
}
|
|
615
|
+
if (!pool) {
|
|
616
|
+
pool = await poolService.getPoolByName(idOrName);
|
|
617
|
+
}
|
|
618
|
+
if (!pool) {
|
|
619
|
+
return failure(`Pool not found: ${idOrName}`, ExitCode.NOT_FOUND);
|
|
620
|
+
}
|
|
621
|
+
// Refresh status from session manager
|
|
622
|
+
const status = await poolService.getPoolStatus(pool.id);
|
|
623
|
+
const mode = getOutputMode(options);
|
|
624
|
+
if (mode === 'json') {
|
|
625
|
+
return success({
|
|
626
|
+
poolId: pool.id,
|
|
627
|
+
poolName: pool.config.name,
|
|
628
|
+
...status,
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
if (mode === 'quiet') {
|
|
632
|
+
return success(`${status.activeCount}/${pool.config.maxSize}`);
|
|
633
|
+
}
|
|
634
|
+
const lines = [
|
|
635
|
+
`Pool: ${pool.config.name} (${pool.id})`,
|
|
636
|
+
`Enabled: ${pool.config.enabled ? 'yes' : 'no'}`,
|
|
637
|
+
'',
|
|
638
|
+
'Capacity:',
|
|
639
|
+
` Max Size: ${pool.config.maxSize}`,
|
|
640
|
+
` Active: ${status.activeCount}`,
|
|
641
|
+
` Available: ${status.availableSlots}`,
|
|
642
|
+
` Utilization: ${Math.round((status.activeCount / pool.config.maxSize) * 100)}%`,
|
|
643
|
+
'',
|
|
644
|
+
`Last Updated: ${status.lastUpdatedAt}`,
|
|
645
|
+
];
|
|
646
|
+
if (Object.keys(status.activeByType).length > 0) {
|
|
647
|
+
lines.push('', 'Active by Type:');
|
|
648
|
+
for (const [typeKey, count] of Object.entries(status.activeByType)) {
|
|
649
|
+
lines.push(` ${typeKey}: ${count}`);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
if (status.activeAgentIds.length > 0) {
|
|
653
|
+
lines.push('', 'Active Agents:');
|
|
654
|
+
for (const agentId of status.activeAgentIds) {
|
|
655
|
+
lines.push(` - ${agentId}`);
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
return success(status, lines.join('\n'));
|
|
659
|
+
}
|
|
660
|
+
catch (err) {
|
|
661
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
662
|
+
return failure(`Failed to get pool status: ${message}`, ExitCode.GENERAL_ERROR);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
export const poolStatusCommand = {
|
|
666
|
+
name: 'status',
|
|
667
|
+
description: 'Show pool status',
|
|
668
|
+
usage: 'sf pool status <id|name>',
|
|
669
|
+
help: `Show the current status of an agent pool.
|
|
670
|
+
|
|
671
|
+
Arguments:
|
|
672
|
+
id|name Pool identifier or name
|
|
673
|
+
|
|
674
|
+
Examples:
|
|
675
|
+
sf pool status default
|
|
676
|
+
sf pool status el-abc123`,
|
|
677
|
+
options: [],
|
|
678
|
+
handler: poolStatusHandler,
|
|
679
|
+
};
|
|
680
|
+
// ============================================================================
|
|
681
|
+
// Pool Refresh Command
|
|
682
|
+
// ============================================================================
|
|
683
|
+
async function poolRefreshHandler(_args, options) {
|
|
684
|
+
const { poolService, error } = await createPoolClient(options);
|
|
685
|
+
if (error || !poolService) {
|
|
686
|
+
return failure(error ?? 'Failed to create pool service', ExitCode.GENERAL_ERROR);
|
|
687
|
+
}
|
|
688
|
+
try {
|
|
689
|
+
await poolService.refreshAllPoolStatus();
|
|
690
|
+
const pools = await poolService.listPools();
|
|
691
|
+
const mode = getOutputMode(options);
|
|
692
|
+
if (mode === 'json') {
|
|
693
|
+
return success(pools);
|
|
694
|
+
}
|
|
695
|
+
if (mode === 'quiet') {
|
|
696
|
+
return success(String(pools.length));
|
|
697
|
+
}
|
|
698
|
+
return success(pools, `Refreshed status for ${pools.length} pool(s)`);
|
|
699
|
+
}
|
|
700
|
+
catch (err) {
|
|
701
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
702
|
+
return failure(`Failed to refresh pool status: ${message}`, ExitCode.GENERAL_ERROR);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
export const poolRefreshCommand = {
|
|
706
|
+
name: 'refresh',
|
|
707
|
+
description: 'Refresh pool status from sessions',
|
|
708
|
+
usage: 'sf pool refresh',
|
|
709
|
+
help: `Refresh the status of all agent pools based on current sessions.
|
|
710
|
+
|
|
711
|
+
Examples:
|
|
712
|
+
sf pool refresh`,
|
|
713
|
+
options: [],
|
|
714
|
+
handler: poolRefreshHandler,
|
|
715
|
+
};
|
|
716
|
+
// ============================================================================
|
|
717
|
+
// Main Pool Command
|
|
718
|
+
// ============================================================================
|
|
719
|
+
export const poolCommand = {
|
|
720
|
+
name: 'pool',
|
|
721
|
+
description: 'Manage agent pools',
|
|
722
|
+
usage: 'sf pool <subcommand> [options]',
|
|
723
|
+
help: `Manage agent pools for concurrency limiting.
|
|
724
|
+
|
|
725
|
+
Agent pools allow you to limit the maximum number of agents running
|
|
726
|
+
concurrently. When a pool is at capacity, new agent spawns are blocked
|
|
727
|
+
until slots become available.
|
|
728
|
+
|
|
729
|
+
Subcommands:
|
|
730
|
+
list List all agent pools
|
|
731
|
+
show Show pool details
|
|
732
|
+
create Create a new pool
|
|
733
|
+
update Update pool configuration
|
|
734
|
+
delete Delete a pool
|
|
735
|
+
status Show pool status with active agents
|
|
736
|
+
refresh Refresh pool status from sessions
|
|
737
|
+
|
|
738
|
+
Examples:
|
|
739
|
+
sf pool list
|
|
740
|
+
sf pool create default --size 5
|
|
741
|
+
sf pool show default
|
|
742
|
+
sf pool status default
|
|
743
|
+
sf pool update default --size 10
|
|
744
|
+
sf pool delete old-pool`,
|
|
745
|
+
subcommands: {
|
|
746
|
+
list: poolListCommand,
|
|
747
|
+
show: poolShowCommand,
|
|
748
|
+
create: poolCreateCommand,
|
|
749
|
+
update: poolUpdateCommand,
|
|
750
|
+
delete: poolDeleteCommand,
|
|
751
|
+
status: poolStatusCommand,
|
|
752
|
+
refresh: poolRefreshCommand,
|
|
753
|
+
// Aliases
|
|
754
|
+
ls: poolListCommand,
|
|
755
|
+
get: poolShowCommand,
|
|
756
|
+
add: poolCreateCommand,
|
|
757
|
+
rm: poolDeleteCommand,
|
|
758
|
+
},
|
|
759
|
+
handler: poolListCommand.handler, // Default to list
|
|
760
|
+
options: [],
|
|
761
|
+
};
|
|
762
|
+
//# sourceMappingURL=pool.js.map
|