@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,861 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Commands - CLI operations for orchestrator agents
|
|
3
|
+
*
|
|
4
|
+
* Provides commands for agent management:
|
|
5
|
+
* - agent list: List all registered agents
|
|
6
|
+
* - agent show <id>: Show agent details
|
|
7
|
+
* - agent register <name>: Register a new agent
|
|
8
|
+
* - agent start <id>: Start (spawn) a Claude Code process for an agent
|
|
9
|
+
* - agent stop <id>: Stop an agent session
|
|
10
|
+
* - agent stream <id>: Get agent channel for streaming
|
|
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
|
|
18
|
+
*/
|
|
19
|
+
async function createOrchestratorClient(options) {
|
|
20
|
+
try {
|
|
21
|
+
const { createStorage, initializeSchema, findStoneforgeDir } = await import('@stoneforge/quarry');
|
|
22
|
+
const { createOrchestratorAPI } = await import('../../api/index.js');
|
|
23
|
+
const stoneforgeDir = findStoneforgeDir(process.cwd());
|
|
24
|
+
if (!stoneforgeDir) {
|
|
25
|
+
return {
|
|
26
|
+
api: null,
|
|
27
|
+
error: 'No .stoneforge directory found. Run "sf init" first.',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const dbPath = options.db ?? `${stoneforgeDir}/stoneforge.db`;
|
|
31
|
+
const backend = createStorage({ path: dbPath, create: true });
|
|
32
|
+
initializeSchema(backend);
|
|
33
|
+
const api = createOrchestratorAPI(backend);
|
|
34
|
+
return { api };
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
38
|
+
return { api: null, error: `Failed to initialize API: ${message}` };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Gets agent metadata from agent entity
|
|
43
|
+
*/
|
|
44
|
+
function getAgentMeta(agent) {
|
|
45
|
+
return (agent.metadata?.agent ?? {});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Streams output from a spawned session's event emitter
|
|
49
|
+
* This is a long-running operation that continues until the session ends
|
|
50
|
+
*/
|
|
51
|
+
async function streamSpawnedSession(events, sessionMode) {
|
|
52
|
+
return new Promise((resolve) => {
|
|
53
|
+
const onInterrupt = () => {
|
|
54
|
+
console.log('\n[Stream interrupted]');
|
|
55
|
+
cleanup();
|
|
56
|
+
resolve();
|
|
57
|
+
};
|
|
58
|
+
const cleanup = () => {
|
|
59
|
+
process.off('SIGINT', onInterrupt);
|
|
60
|
+
events.off('event', onEvent);
|
|
61
|
+
events.off('pty-data', onPtyData);
|
|
62
|
+
events.off('exit', onExit);
|
|
63
|
+
events.off('error', onError);
|
|
64
|
+
};
|
|
65
|
+
const onEvent = (event) => {
|
|
66
|
+
if (event.type === 'assistant' && event.message) {
|
|
67
|
+
process.stdout.write(event.message);
|
|
68
|
+
}
|
|
69
|
+
else if (event.type === 'tool_use' && event.tool?.name) {
|
|
70
|
+
console.log(`\n[Tool: ${event.tool.name}]`);
|
|
71
|
+
}
|
|
72
|
+
else if (event.type === 'result' && event.message) {
|
|
73
|
+
console.log(`\n[Result: ${event.message}]`);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const onPtyData = (data) => {
|
|
77
|
+
process.stdout.write(data);
|
|
78
|
+
};
|
|
79
|
+
const onExit = (code, signal) => {
|
|
80
|
+
// User-friendly message for normal exit, show exit code for debugging on errors
|
|
81
|
+
const exitMessage = code === 0
|
|
82
|
+
? 'The agent has stopped the session'
|
|
83
|
+
: `The agent session ended unexpectedly (exit code ${code})${signal ? ` (signal: ${signal})` : ''}`;
|
|
84
|
+
console.log(`\n[${exitMessage}]`);
|
|
85
|
+
cleanup();
|
|
86
|
+
resolve();
|
|
87
|
+
};
|
|
88
|
+
const onError = (error) => {
|
|
89
|
+
console.error(`\n[Error: ${error.message}]`);
|
|
90
|
+
};
|
|
91
|
+
process.on('SIGINT', onInterrupt);
|
|
92
|
+
if (sessionMode === 'headless') {
|
|
93
|
+
events.on('event', onEvent);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
events.on('pty-data', onPtyData);
|
|
97
|
+
}
|
|
98
|
+
events.on('exit', onExit);
|
|
99
|
+
events.on('error', onError);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const agentListOptions = [
|
|
103
|
+
{
|
|
104
|
+
name: 'role',
|
|
105
|
+
short: 'r',
|
|
106
|
+
description: 'Filter by role (director, worker, steward)',
|
|
107
|
+
hasValue: true,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'status',
|
|
111
|
+
short: 's',
|
|
112
|
+
description: 'Filter by session status (idle, running, suspended, terminated)',
|
|
113
|
+
hasValue: true,
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
name: 'workerMode',
|
|
117
|
+
short: 'm',
|
|
118
|
+
description: 'Filter by worker mode (ephemeral, persistent)',
|
|
119
|
+
hasValue: true,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'focus',
|
|
123
|
+
short: 'f',
|
|
124
|
+
description: 'Filter by steward focus (merge, health, reminder, ops, docs)',
|
|
125
|
+
hasValue: true,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'reportsTo',
|
|
129
|
+
description: 'Filter by manager entity ID',
|
|
130
|
+
hasValue: true,
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: 'hasSession',
|
|
134
|
+
description: 'Filter to agents with active sessions',
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
async function agentListHandler(_args, options) {
|
|
138
|
+
const { api, error } = await createOrchestratorClient(options);
|
|
139
|
+
if (error || !api) {
|
|
140
|
+
return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
let agents;
|
|
144
|
+
// Filter by role if specified
|
|
145
|
+
if (options.role) {
|
|
146
|
+
const validRoles = ['director', 'worker', 'steward'];
|
|
147
|
+
if (!validRoles.includes(options.role)) {
|
|
148
|
+
return failure(`Invalid role: ${options.role}. Must be one of: ${validRoles.join(', ')}`, ExitCode.VALIDATION);
|
|
149
|
+
}
|
|
150
|
+
agents = await api.getAgentsByRole(options.role);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
agents = await api.listAgents();
|
|
154
|
+
}
|
|
155
|
+
// Additional filter by status
|
|
156
|
+
if (options.status) {
|
|
157
|
+
const validStatuses = ['idle', 'running', 'suspended', 'terminated'];
|
|
158
|
+
if (!validStatuses.includes(options.status)) {
|
|
159
|
+
return failure(`Invalid status: ${options.status}. Must be one of: ${validStatuses.join(', ')}`, ExitCode.VALIDATION);
|
|
160
|
+
}
|
|
161
|
+
agents = agents.filter((a) => {
|
|
162
|
+
const meta = getAgentMeta(a);
|
|
163
|
+
return meta.sessionStatus === options.status;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// Filter by worker mode
|
|
167
|
+
if (options.workerMode) {
|
|
168
|
+
const validModes = ['ephemeral', 'persistent'];
|
|
169
|
+
if (!validModes.includes(options.workerMode)) {
|
|
170
|
+
return failure(`Invalid workerMode: ${options.workerMode}. Must be one of: ${validModes.join(', ')}`, ExitCode.VALIDATION);
|
|
171
|
+
}
|
|
172
|
+
agents = agents.filter((a) => {
|
|
173
|
+
const meta = getAgentMeta(a);
|
|
174
|
+
return meta.workerMode === options.workerMode;
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// Filter by steward focus
|
|
178
|
+
if (options.focus) {
|
|
179
|
+
const validFocuses = ['merge', 'health', 'reminder', 'ops', 'docs'];
|
|
180
|
+
if (!validFocuses.includes(options.focus)) {
|
|
181
|
+
return failure(`Invalid focus: ${options.focus}. Must be one of: ${validFocuses.join(', ')}`, ExitCode.VALIDATION);
|
|
182
|
+
}
|
|
183
|
+
agents = agents.filter((a) => {
|
|
184
|
+
const meta = getAgentMeta(a);
|
|
185
|
+
return meta.stewardFocus === options.focus;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
// Filter by manager
|
|
189
|
+
if (options.reportsTo) {
|
|
190
|
+
agents = agents.filter((a) => a.reportsTo === options.reportsTo);
|
|
191
|
+
}
|
|
192
|
+
// Filter by has session
|
|
193
|
+
if (options.hasSession) {
|
|
194
|
+
agents = agents.filter((a) => {
|
|
195
|
+
const meta = getAgentMeta(a);
|
|
196
|
+
return meta.sessionId !== undefined;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
const mode = getOutputMode(options);
|
|
200
|
+
const formatter = getFormatter(mode);
|
|
201
|
+
if (mode === 'json') {
|
|
202
|
+
return success(agents);
|
|
203
|
+
}
|
|
204
|
+
if (mode === 'quiet') {
|
|
205
|
+
return success(agents.map((a) => a.id).join('\n'));
|
|
206
|
+
}
|
|
207
|
+
if (agents.length === 0) {
|
|
208
|
+
return success(null, 'No agents found');
|
|
209
|
+
}
|
|
210
|
+
const headers = ['ID', 'NAME', 'ROLE', 'STATUS', 'SESSION'];
|
|
211
|
+
const rows = agents.map((agent) => {
|
|
212
|
+
const meta = getAgentMeta(agent);
|
|
213
|
+
return [
|
|
214
|
+
agent.id,
|
|
215
|
+
agent.name ?? '-',
|
|
216
|
+
meta.agentRole ?? '-',
|
|
217
|
+
meta.sessionStatus ?? 'idle',
|
|
218
|
+
meta.sessionId?.slice(0, 8) ?? '-',
|
|
219
|
+
];
|
|
220
|
+
});
|
|
221
|
+
const table = formatter.table(headers, rows);
|
|
222
|
+
return success(agents, `${table}\n${agents.length} agent(s)`);
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
226
|
+
return failure(`Failed to list agents: ${message}`, ExitCode.GENERAL_ERROR);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
export const agentListCommand = {
|
|
230
|
+
name: 'list',
|
|
231
|
+
description: 'List registered agents',
|
|
232
|
+
usage: 'sf agent list [options]',
|
|
233
|
+
help: `List all registered orchestrator agents.
|
|
234
|
+
|
|
235
|
+
Options:
|
|
236
|
+
-r, --role <role> Filter by role (director, worker, steward)
|
|
237
|
+
-s, --status <status> Filter by session status (idle, running, suspended, terminated)
|
|
238
|
+
-m, --workerMode <mode> Filter by worker mode (ephemeral, persistent)
|
|
239
|
+
-f, --focus <focus> Filter by steward focus (merge, health, reminder, ops, docs)
|
|
240
|
+
--reportsTo <id> Filter by manager entity ID
|
|
241
|
+
--hasSession Filter to agents with active sessions
|
|
242
|
+
|
|
243
|
+
Examples:
|
|
244
|
+
sf agent list
|
|
245
|
+
sf agent list --role worker
|
|
246
|
+
sf agent list --role worker --workerMode ephemeral
|
|
247
|
+
sf agent list --status running
|
|
248
|
+
sf agent list --role steward --focus health
|
|
249
|
+
sf agent list --hasSession`,
|
|
250
|
+
options: agentListOptions,
|
|
251
|
+
handler: agentListHandler,
|
|
252
|
+
};
|
|
253
|
+
// ============================================================================
|
|
254
|
+
// Agent Show Command
|
|
255
|
+
// ============================================================================
|
|
256
|
+
async function agentShowHandler(args, options) {
|
|
257
|
+
const [id] = args;
|
|
258
|
+
if (!id) {
|
|
259
|
+
return failure('Usage: sf agent show <id>\nExample: sf agent show el-abc123', ExitCode.INVALID_ARGUMENTS);
|
|
260
|
+
}
|
|
261
|
+
const { api, error } = await createOrchestratorClient(options);
|
|
262
|
+
if (error || !api) {
|
|
263
|
+
return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
|
|
264
|
+
}
|
|
265
|
+
try {
|
|
266
|
+
const agent = await api.getAgent(id);
|
|
267
|
+
if (!agent) {
|
|
268
|
+
return failure(`Agent not found: ${id}`, ExitCode.NOT_FOUND);
|
|
269
|
+
}
|
|
270
|
+
const mode = getOutputMode(options);
|
|
271
|
+
if (mode === 'json') {
|
|
272
|
+
return success(agent);
|
|
273
|
+
}
|
|
274
|
+
if (mode === 'quiet') {
|
|
275
|
+
return success(agent.id);
|
|
276
|
+
}
|
|
277
|
+
const meta = getAgentMeta(agent);
|
|
278
|
+
const lines = [
|
|
279
|
+
`ID: ${agent.id}`,
|
|
280
|
+
`Name: ${agent.name ?? '-'}`,
|
|
281
|
+
`Role: ${meta.agentRole ?? '-'}`,
|
|
282
|
+
`Status: ${meta.sessionStatus ?? 'idle'}`,
|
|
283
|
+
`Session: ${meta.sessionId ?? '-'}`,
|
|
284
|
+
`Channel: ${meta.channelId ?? '-'}`,
|
|
285
|
+
`Created: ${agent.createdAt}`,
|
|
286
|
+
];
|
|
287
|
+
if (meta.workerMode) {
|
|
288
|
+
lines.push(`Mode: ${meta.workerMode}`);
|
|
289
|
+
}
|
|
290
|
+
if (meta.stewardFocus) {
|
|
291
|
+
lines.push(`Focus: ${meta.stewardFocus}`);
|
|
292
|
+
}
|
|
293
|
+
return success(agent, lines.join('\n'));
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
297
|
+
return failure(`Failed to show agent: ${message}`, ExitCode.GENERAL_ERROR);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
export const agentShowCommand = {
|
|
301
|
+
name: 'show',
|
|
302
|
+
description: 'Show agent details',
|
|
303
|
+
usage: 'sf agent show <id>',
|
|
304
|
+
help: `Show detailed information about an agent.
|
|
305
|
+
|
|
306
|
+
Arguments:
|
|
307
|
+
id Agent identifier
|
|
308
|
+
|
|
309
|
+
Examples:
|
|
310
|
+
sf agent show el-abc123`,
|
|
311
|
+
options: [],
|
|
312
|
+
handler: agentShowHandler,
|
|
313
|
+
};
|
|
314
|
+
const agentRegisterOptions = [
|
|
315
|
+
{
|
|
316
|
+
name: 'role',
|
|
317
|
+
short: 'r',
|
|
318
|
+
description: 'Agent role (worker, director, steward)',
|
|
319
|
+
hasValue: true,
|
|
320
|
+
required: true,
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
name: 'mode',
|
|
324
|
+
short: 'm',
|
|
325
|
+
description: 'Worker mode (ephemeral, persistent)',
|
|
326
|
+
hasValue: true,
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
name: 'focus',
|
|
330
|
+
short: 'f',
|
|
331
|
+
description: 'Steward focus (merge, health, reminder, ops, docs)',
|
|
332
|
+
hasValue: true,
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
name: 'maxTasks',
|
|
336
|
+
short: 't',
|
|
337
|
+
description: 'Maximum concurrent tasks (default: 1)',
|
|
338
|
+
hasValue: true,
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
name: 'tags',
|
|
342
|
+
description: 'Comma-separated tags',
|
|
343
|
+
hasValue: true,
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
name: 'reportsTo',
|
|
347
|
+
description: 'Manager entity ID',
|
|
348
|
+
hasValue: true,
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
name: 'roleDef',
|
|
352
|
+
description: 'Role definition document ID',
|
|
353
|
+
hasValue: true,
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
name: 'trigger',
|
|
357
|
+
description: 'Steward cron trigger (e.g., "0 2 * * *")',
|
|
358
|
+
hasValue: true,
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
name: 'provider',
|
|
362
|
+
description: 'Agent provider (e.g., claude, opencode)',
|
|
363
|
+
hasValue: true,
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
name: 'model',
|
|
367
|
+
description: 'LLM model to use (e.g., claude-sonnet-4-5-20250929)',
|
|
368
|
+
hasValue: true,
|
|
369
|
+
},
|
|
370
|
+
];
|
|
371
|
+
async function agentRegisterHandler(args, options) {
|
|
372
|
+
const [name] = args;
|
|
373
|
+
if (!name) {
|
|
374
|
+
return failure('Usage: sf agent register <name> --role <role> [options]\nExample: sf agent register MyWorker --role worker', ExitCode.INVALID_ARGUMENTS);
|
|
375
|
+
}
|
|
376
|
+
if (!options.role) {
|
|
377
|
+
return failure('--role is required', ExitCode.INVALID_ARGUMENTS);
|
|
378
|
+
}
|
|
379
|
+
const validRoles = ['director', 'worker', 'steward'];
|
|
380
|
+
if (!validRoles.includes(options.role)) {
|
|
381
|
+
return failure(`Invalid role: ${options.role}. Must be one of: ${validRoles.join(', ')}`, ExitCode.VALIDATION);
|
|
382
|
+
}
|
|
383
|
+
const { api, error } = await createOrchestratorClient(options);
|
|
384
|
+
if (error || !api) {
|
|
385
|
+
return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
|
|
386
|
+
}
|
|
387
|
+
try {
|
|
388
|
+
// Use the default operator entity for CLI operations
|
|
389
|
+
const createdBy = (options.actor ?? OPERATOR_ENTITY_ID);
|
|
390
|
+
const maxConcurrentTasks = options.maxTasks ? parseInt(options.maxTasks, 10) : 1;
|
|
391
|
+
const tags = options.tags ? options.tags.split(',').map(t => t.trim()) : undefined;
|
|
392
|
+
const reportsTo = options.reportsTo;
|
|
393
|
+
const roleDefinitionRef = options.roleDef;
|
|
394
|
+
let agent;
|
|
395
|
+
switch (options.role) {
|
|
396
|
+
case 'director':
|
|
397
|
+
agent = await api.registerDirector({
|
|
398
|
+
name,
|
|
399
|
+
createdBy,
|
|
400
|
+
maxConcurrentTasks,
|
|
401
|
+
tags,
|
|
402
|
+
roleDefinitionRef,
|
|
403
|
+
provider: options.provider,
|
|
404
|
+
model: options.model,
|
|
405
|
+
});
|
|
406
|
+
break;
|
|
407
|
+
case 'worker': {
|
|
408
|
+
const workerMode = options.mode ?? 'ephemeral';
|
|
409
|
+
const validModes = ['ephemeral', 'persistent'];
|
|
410
|
+
if (!validModes.includes(workerMode)) {
|
|
411
|
+
return failure(`Invalid mode: ${workerMode}. Must be one of: ${validModes.join(', ')}`, ExitCode.VALIDATION);
|
|
412
|
+
}
|
|
413
|
+
agent = await api.registerWorker({
|
|
414
|
+
name,
|
|
415
|
+
createdBy,
|
|
416
|
+
workerMode,
|
|
417
|
+
maxConcurrentTasks,
|
|
418
|
+
tags,
|
|
419
|
+
reportsTo,
|
|
420
|
+
roleDefinitionRef,
|
|
421
|
+
provider: options.provider,
|
|
422
|
+
model: options.model,
|
|
423
|
+
});
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case 'steward': {
|
|
427
|
+
const stewardFocus = options.focus ?? 'health';
|
|
428
|
+
const validFocuses = ['merge', 'health', 'reminder', 'ops', 'docs'];
|
|
429
|
+
if (!validFocuses.includes(stewardFocus)) {
|
|
430
|
+
return failure(`Invalid focus: ${stewardFocus}. Must be one of: ${validFocuses.join(', ')}`, ExitCode.VALIDATION);
|
|
431
|
+
}
|
|
432
|
+
// Parse trigger if provided
|
|
433
|
+
const triggers = [];
|
|
434
|
+
if (options.trigger) {
|
|
435
|
+
triggers.push({ type: 'cron', schedule: options.trigger });
|
|
436
|
+
}
|
|
437
|
+
agent = await api.registerSteward({
|
|
438
|
+
name,
|
|
439
|
+
createdBy,
|
|
440
|
+
stewardFocus,
|
|
441
|
+
triggers,
|
|
442
|
+
maxConcurrentTasks,
|
|
443
|
+
tags,
|
|
444
|
+
reportsTo,
|
|
445
|
+
roleDefinitionRef,
|
|
446
|
+
provider: options.provider,
|
|
447
|
+
model: options.model,
|
|
448
|
+
});
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
default:
|
|
452
|
+
return failure(`Unknown role: ${options.role}`, ExitCode.VALIDATION);
|
|
453
|
+
}
|
|
454
|
+
const mode = getOutputMode(options);
|
|
455
|
+
if (mode === 'json') {
|
|
456
|
+
return success(agent);
|
|
457
|
+
}
|
|
458
|
+
if (mode === 'quiet') {
|
|
459
|
+
return success(agent.id);
|
|
460
|
+
}
|
|
461
|
+
return success(agent, `Registered ${options.role} agent: ${agent.id}`);
|
|
462
|
+
}
|
|
463
|
+
catch (err) {
|
|
464
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
465
|
+
return failure(`Failed to register agent: ${message}`, ExitCode.GENERAL_ERROR);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
export const agentRegisterCommand = {
|
|
469
|
+
name: 'register',
|
|
470
|
+
description: 'Register a new agent',
|
|
471
|
+
usage: 'sf agent register <name> --role <role> [options]',
|
|
472
|
+
help: `Register a new orchestrator agent.
|
|
473
|
+
|
|
474
|
+
Arguments:
|
|
475
|
+
name Agent name
|
|
476
|
+
|
|
477
|
+
Options:
|
|
478
|
+
-r, --role <role> Agent role: director, worker, steward (required)
|
|
479
|
+
-m, --mode <mode> Worker mode: ephemeral, persistent (default: ephemeral)
|
|
480
|
+
-f, --focus <focus> Steward focus: merge, health, reminder, ops, docs
|
|
481
|
+
-t, --maxTasks <n> Maximum concurrent tasks (default: 1)
|
|
482
|
+
--tags <tags> Comma-separated tags (e.g., "frontend,urgent")
|
|
483
|
+
--reportsTo <id> Manager entity ID (for workers/stewards)
|
|
484
|
+
--roleDef <id> Role definition document ID
|
|
485
|
+
--trigger <cron> Steward cron trigger (e.g., "0 2 * * *")
|
|
486
|
+
--provider <name> Agent provider (e.g., claude, opencode)
|
|
487
|
+
--model <model> LLM model to use (e.g., claude-sonnet-4-5-20250929)
|
|
488
|
+
|
|
489
|
+
Examples:
|
|
490
|
+
sf agent register MyWorker --role worker --mode ephemeral
|
|
491
|
+
sf agent register MainDirector --role director
|
|
492
|
+
sf agent register HealthChecker --role steward --focus health
|
|
493
|
+
sf agent register MyWorker --role worker --tags "frontend,urgent"
|
|
494
|
+
sf agent register TeamWorker --role worker --reportsTo el-director123
|
|
495
|
+
sf agent register DailyChecker --role steward --focus health --trigger "0 9 * * *"
|
|
496
|
+
sf agent register OcWorker --role worker --provider opencode
|
|
497
|
+
sf agent register MyWorker --role worker --model claude-sonnet-4-5-20250929`,
|
|
498
|
+
options: agentRegisterOptions,
|
|
499
|
+
handler: agentRegisterHandler,
|
|
500
|
+
};
|
|
501
|
+
const agentStopOptions = [
|
|
502
|
+
{
|
|
503
|
+
name: 'graceful',
|
|
504
|
+
short: 'g',
|
|
505
|
+
description: 'Graceful shutdown (default: true)',
|
|
506
|
+
},
|
|
507
|
+
{
|
|
508
|
+
name: 'no-graceful',
|
|
509
|
+
description: 'Force immediate shutdown',
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
name: 'reason',
|
|
513
|
+
short: 'r',
|
|
514
|
+
description: 'Reason for stopping the agent',
|
|
515
|
+
hasValue: true,
|
|
516
|
+
},
|
|
517
|
+
];
|
|
518
|
+
async function agentStopHandler(args, options) {
|
|
519
|
+
const [id] = args;
|
|
520
|
+
if (!id) {
|
|
521
|
+
return failure('Usage: sf agent stop <id> [options]\nExample: sf agent stop el-abc123', ExitCode.INVALID_ARGUMENTS);
|
|
522
|
+
}
|
|
523
|
+
const { api, error } = await createOrchestratorClient(options);
|
|
524
|
+
if (error || !api) {
|
|
525
|
+
return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
|
|
526
|
+
}
|
|
527
|
+
try {
|
|
528
|
+
// Determine graceful mode (default true unless --no-graceful is set)
|
|
529
|
+
const graceful = options['no-graceful'] !== true;
|
|
530
|
+
const agent = await api.updateAgentSession(id, undefined, 'idle');
|
|
531
|
+
const mode = getOutputMode(options);
|
|
532
|
+
if (mode === 'json') {
|
|
533
|
+
return success({
|
|
534
|
+
...agent,
|
|
535
|
+
graceful,
|
|
536
|
+
reason: options.reason,
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
if (mode === 'quiet') {
|
|
540
|
+
return success(agent.id);
|
|
541
|
+
}
|
|
542
|
+
let message = `Stopped agent ${id}`;
|
|
543
|
+
if (!graceful) {
|
|
544
|
+
message += ' (forced)';
|
|
545
|
+
}
|
|
546
|
+
if (options.reason) {
|
|
547
|
+
message += `: ${options.reason}`;
|
|
548
|
+
}
|
|
549
|
+
return success(agent, message);
|
|
550
|
+
}
|
|
551
|
+
catch (err) {
|
|
552
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
553
|
+
return failure(`Failed to stop agent: ${message}`, ExitCode.GENERAL_ERROR);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
export const agentStopCommand = {
|
|
557
|
+
name: 'stop',
|
|
558
|
+
description: 'Stop an agent session',
|
|
559
|
+
usage: 'sf agent stop <id> [options]',
|
|
560
|
+
help: `Stop an agent session.
|
|
561
|
+
|
|
562
|
+
Arguments:
|
|
563
|
+
id Agent identifier
|
|
564
|
+
|
|
565
|
+
Options:
|
|
566
|
+
-g, --graceful Graceful shutdown (default: true)
|
|
567
|
+
--no-graceful Force immediate shutdown
|
|
568
|
+
-r, --reason <text> Reason for stopping the agent
|
|
569
|
+
|
|
570
|
+
Examples:
|
|
571
|
+
sf agent stop el-abc123
|
|
572
|
+
sf agent stop el-abc123 --reason "Task completed"
|
|
573
|
+
sf agent stop el-abc123 --no-graceful`,
|
|
574
|
+
options: agentStopOptions,
|
|
575
|
+
handler: agentStopHandler,
|
|
576
|
+
};
|
|
577
|
+
// ============================================================================
|
|
578
|
+
// Agent Stream Command
|
|
579
|
+
// ============================================================================
|
|
580
|
+
async function agentStreamHandler(args, options) {
|
|
581
|
+
const [id] = args;
|
|
582
|
+
if (!id) {
|
|
583
|
+
return failure('Usage: sf agent stream <id>\nExample: sf agent stream el-abc123', ExitCode.INVALID_ARGUMENTS);
|
|
584
|
+
}
|
|
585
|
+
const { api, error } = await createOrchestratorClient(options);
|
|
586
|
+
if (error || !api) {
|
|
587
|
+
return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
|
|
588
|
+
}
|
|
589
|
+
try {
|
|
590
|
+
const channelId = await api.getAgentChannel(id);
|
|
591
|
+
if (!channelId) {
|
|
592
|
+
return failure(`No channel found for agent: ${id}`, ExitCode.NOT_FOUND);
|
|
593
|
+
}
|
|
594
|
+
const mode = getOutputMode(options);
|
|
595
|
+
if (mode === 'json') {
|
|
596
|
+
return success({ channelId, agentId: id });
|
|
597
|
+
}
|
|
598
|
+
return success({ channelId }, `Agent ${id} channel: ${channelId}\nUse "sf channel stream ${channelId}" to watch messages`);
|
|
599
|
+
}
|
|
600
|
+
catch (err) {
|
|
601
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
602
|
+
return failure(`Failed to get agent stream: ${message}`, ExitCode.GENERAL_ERROR);
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
export const agentStreamCommand = {
|
|
606
|
+
name: 'stream',
|
|
607
|
+
description: 'Get agent channel for streaming',
|
|
608
|
+
usage: 'sf agent stream <id>',
|
|
609
|
+
help: `Get the channel ID for an agent to stream messages.
|
|
610
|
+
|
|
611
|
+
Arguments:
|
|
612
|
+
id Agent identifier
|
|
613
|
+
|
|
614
|
+
Examples:
|
|
615
|
+
sf agent stream el-abc123`,
|
|
616
|
+
options: [],
|
|
617
|
+
handler: agentStreamHandler,
|
|
618
|
+
};
|
|
619
|
+
const agentStartOptions = [
|
|
620
|
+
{
|
|
621
|
+
name: 'prompt',
|
|
622
|
+
short: 'p',
|
|
623
|
+
description: 'Initial prompt to send to the agent',
|
|
624
|
+
hasValue: true,
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
name: 'mode',
|
|
628
|
+
short: 'm',
|
|
629
|
+
description: 'Spawn mode (headless, interactive)',
|
|
630
|
+
hasValue: true,
|
|
631
|
+
},
|
|
632
|
+
{
|
|
633
|
+
name: 'resume',
|
|
634
|
+
short: 'r',
|
|
635
|
+
description: 'Provider session ID to resume',
|
|
636
|
+
hasValue: true,
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
name: 'workdir',
|
|
640
|
+
short: 'w',
|
|
641
|
+
description: 'Working directory for the agent',
|
|
642
|
+
hasValue: true,
|
|
643
|
+
},
|
|
644
|
+
{
|
|
645
|
+
name: 'cols',
|
|
646
|
+
description: 'Terminal columns for interactive mode (default: 120)',
|
|
647
|
+
hasValue: true,
|
|
648
|
+
},
|
|
649
|
+
{
|
|
650
|
+
name: 'rows',
|
|
651
|
+
description: 'Terminal rows for interactive mode (default: 30)',
|
|
652
|
+
hasValue: true,
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
name: 'timeout',
|
|
656
|
+
description: 'Timeout in milliseconds (default: 120000)',
|
|
657
|
+
hasValue: true,
|
|
658
|
+
},
|
|
659
|
+
{
|
|
660
|
+
name: 'env',
|
|
661
|
+
short: 'e',
|
|
662
|
+
description: 'Environment variables (KEY=VALUE, can repeat)',
|
|
663
|
+
hasValue: true,
|
|
664
|
+
},
|
|
665
|
+
{
|
|
666
|
+
name: 'taskId',
|
|
667
|
+
short: 't',
|
|
668
|
+
description: 'Task ID to assign to this agent',
|
|
669
|
+
hasValue: true,
|
|
670
|
+
},
|
|
671
|
+
{
|
|
672
|
+
name: 'stream',
|
|
673
|
+
description: 'Stream agent output after spawning',
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
name: 'provider',
|
|
677
|
+
description: 'Override agent provider for this session',
|
|
678
|
+
hasValue: true,
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
name: 'model',
|
|
682
|
+
description: 'Override model for this session (e.g., claude-opus-4-6)',
|
|
683
|
+
hasValue: true,
|
|
684
|
+
},
|
|
685
|
+
];
|
|
686
|
+
async function agentStartHandler(args, options) {
|
|
687
|
+
const [id] = args;
|
|
688
|
+
if (!id) {
|
|
689
|
+
return failure('Usage: sf agent start <id> [options]\nExample: sf agent start el-abc123 --prompt "Begin working"', ExitCode.INVALID_ARGUMENTS);
|
|
690
|
+
}
|
|
691
|
+
const { api, error } = await createOrchestratorClient(options);
|
|
692
|
+
if (error || !api) {
|
|
693
|
+
return failure(error ?? 'Failed to create API', ExitCode.GENERAL_ERROR);
|
|
694
|
+
}
|
|
695
|
+
try {
|
|
696
|
+
// Get the agent to verify it exists and get its role
|
|
697
|
+
const agent = await api.getAgent(id);
|
|
698
|
+
if (!agent) {
|
|
699
|
+
return failure(`Agent not found: ${id}`, ExitCode.NOT_FOUND);
|
|
700
|
+
}
|
|
701
|
+
const meta = getAgentMeta(agent);
|
|
702
|
+
const agentRole = meta.agentRole ?? 'worker';
|
|
703
|
+
// Import the spawner service
|
|
704
|
+
const { createSpawnerService } = await import('../../runtime/index.js');
|
|
705
|
+
const { findStoneforgeDir } = await import('@stoneforge/quarry');
|
|
706
|
+
// Parse environment variables
|
|
707
|
+
const environmentVariables = {};
|
|
708
|
+
if (options.env) {
|
|
709
|
+
const parts = options.env.split('=');
|
|
710
|
+
if (parts.length >= 2) {
|
|
711
|
+
const key = parts[0];
|
|
712
|
+
const value = parts.slice(1).join('=');
|
|
713
|
+
environmentVariables[key] = value;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
const stoneforgeDir = findStoneforgeDir(process.cwd());
|
|
717
|
+
const spawner = createSpawnerService({
|
|
718
|
+
workingDirectory: options.workdir ?? process.cwd(),
|
|
719
|
+
stoneforgeRoot: stoneforgeDir ?? undefined,
|
|
720
|
+
timeout: options.timeout ? parseInt(options.timeout, 10) : undefined,
|
|
721
|
+
environmentVariables: Object.keys(environmentVariables).length > 0 ? environmentVariables : undefined,
|
|
722
|
+
});
|
|
723
|
+
// Determine spawn mode
|
|
724
|
+
let spawnMode;
|
|
725
|
+
if (options.mode) {
|
|
726
|
+
if (options.mode !== 'headless' && options.mode !== 'interactive') {
|
|
727
|
+
return failure(`Invalid mode: ${options.mode}. Must be 'headless' or 'interactive'`, ExitCode.VALIDATION);
|
|
728
|
+
}
|
|
729
|
+
spawnMode = options.mode;
|
|
730
|
+
}
|
|
731
|
+
// Spawn the agent
|
|
732
|
+
const result = await spawner.spawn(id, agentRole, {
|
|
733
|
+
initialPrompt: options.prompt,
|
|
734
|
+
mode: spawnMode,
|
|
735
|
+
resumeSessionId: options.resume,
|
|
736
|
+
workingDirectory: options.workdir,
|
|
737
|
+
cols: options.cols ? parseInt(options.cols, 10) : undefined,
|
|
738
|
+
rows: options.rows ? parseInt(options.rows, 10) : undefined,
|
|
739
|
+
});
|
|
740
|
+
// If task ID is provided, assign the task to this agent
|
|
741
|
+
if (options.taskId) {
|
|
742
|
+
await api.assignTaskToAgent(options.taskId, id, { sessionId: result.session.id });
|
|
743
|
+
}
|
|
744
|
+
// If --stream is set, stream the session output
|
|
745
|
+
if (options.stream) {
|
|
746
|
+
console.log(`Spawned agent ${id}`);
|
|
747
|
+
console.log(` Session ID: ${result.session.id}`);
|
|
748
|
+
console.log(` Mode: ${result.session.mode}`);
|
|
749
|
+
console.log('\nStreaming output (Press Ctrl+C to stop):\n');
|
|
750
|
+
await streamSpawnedSession(result.events, result.session.mode);
|
|
751
|
+
return success(result.session, 'Stream ended');
|
|
752
|
+
}
|
|
753
|
+
const mode = getOutputMode(options);
|
|
754
|
+
if (mode === 'json') {
|
|
755
|
+
return success({
|
|
756
|
+
sessionId: result.session.id,
|
|
757
|
+
providerSessionId: result.session.providerSessionId,
|
|
758
|
+
agentId: id,
|
|
759
|
+
status: result.session.status,
|
|
760
|
+
mode: result.session.mode,
|
|
761
|
+
pid: result.session.pid,
|
|
762
|
+
taskId: options.taskId,
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
if (mode === 'quiet') {
|
|
766
|
+
return success(result.session.id);
|
|
767
|
+
}
|
|
768
|
+
const lines = [
|
|
769
|
+
`Spawned agent ${id}`,
|
|
770
|
+
` Session ID: ${result.session.id}`,
|
|
771
|
+
` Provider ID: ${result.session.providerSessionId ?? '-'}`,
|
|
772
|
+
` Status: ${result.session.status}`,
|
|
773
|
+
` Mode: ${result.session.mode}`,
|
|
774
|
+
` PID: ${result.session.pid ?? '-'}`,
|
|
775
|
+
];
|
|
776
|
+
if (options.taskId) {
|
|
777
|
+
lines.push(` Task ID: ${options.taskId}`);
|
|
778
|
+
}
|
|
779
|
+
return success(result.session, lines.join('\n'));
|
|
780
|
+
}
|
|
781
|
+
catch (err) {
|
|
782
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
783
|
+
return failure(`Failed to start agent: ${message}`, ExitCode.GENERAL_ERROR);
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
export const agentStartCommand = {
|
|
787
|
+
name: 'start',
|
|
788
|
+
description: 'Start an agent process',
|
|
789
|
+
usage: 'sf agent start <id> [options]',
|
|
790
|
+
help: `Start a new agent process.
|
|
791
|
+
|
|
792
|
+
Arguments:
|
|
793
|
+
id Agent identifier
|
|
794
|
+
|
|
795
|
+
Options:
|
|
796
|
+
-p, --prompt <text> Initial prompt to send to the agent
|
|
797
|
+
-m, --mode <mode> Start mode: headless, interactive
|
|
798
|
+
-r, --resume <id> Resume a previous session
|
|
799
|
+
-w, --workdir <path> Working directory for the agent
|
|
800
|
+
--cols <n> Terminal columns for interactive mode (default: 120)
|
|
801
|
+
--rows <n> Terminal rows for interactive mode (default: 30)
|
|
802
|
+
--timeout <ms> Timeout in milliseconds (default: 120000)
|
|
803
|
+
-e, --env <KEY=VALUE> Environment variable to set
|
|
804
|
+
-t, --taskId <id> Task ID to assign to this agent
|
|
805
|
+
--stream Stream agent output after starting
|
|
806
|
+
--provider <name> Override agent provider for this session
|
|
807
|
+
--model <model> Override model for this session
|
|
808
|
+
|
|
809
|
+
Examples:
|
|
810
|
+
sf agent start el-abc123
|
|
811
|
+
sf agent start el-abc123 --mode interactive
|
|
812
|
+
sf agent start el-abc123 --mode interactive --cols 160 --rows 40
|
|
813
|
+
sf agent start el-abc123 --prompt "Start working on your assigned tasks"
|
|
814
|
+
sf agent start el-abc123 --resume prev-session-id
|
|
815
|
+
sf agent start el-abc123 --env MY_VAR=value
|
|
816
|
+
sf agent start el-abc123 --taskId el-task456
|
|
817
|
+
sf agent start el-abc123 --stream
|
|
818
|
+
sf agent start el-abc123 --provider opencode
|
|
819
|
+
sf agent start el-abc123 --model claude-opus-4-6`,
|
|
820
|
+
options: agentStartOptions,
|
|
821
|
+
handler: agentStartHandler,
|
|
822
|
+
};
|
|
823
|
+
// ============================================================================
|
|
824
|
+
// Main Agent Command
|
|
825
|
+
// ============================================================================
|
|
826
|
+
export const agentCommand = {
|
|
827
|
+
name: 'agent',
|
|
828
|
+
description: 'Manage orchestrator agents',
|
|
829
|
+
usage: 'sf agent <subcommand> [options]',
|
|
830
|
+
help: `Manage orchestrator agents.
|
|
831
|
+
|
|
832
|
+
Subcommands:
|
|
833
|
+
list List all registered agents
|
|
834
|
+
show Show agent details
|
|
835
|
+
register Register a new agent
|
|
836
|
+
start Start an agent process
|
|
837
|
+
stop Stop an agent session
|
|
838
|
+
stream Get agent channel for streaming
|
|
839
|
+
|
|
840
|
+
Examples:
|
|
841
|
+
sf agent list
|
|
842
|
+
sf agent register MyWorker --role worker
|
|
843
|
+
sf agent start el-abc123
|
|
844
|
+
sf agent start el-abc123 --mode interactive`,
|
|
845
|
+
subcommands: {
|
|
846
|
+
list: agentListCommand,
|
|
847
|
+
show: agentShowCommand,
|
|
848
|
+
register: agentRegisterCommand,
|
|
849
|
+
start: agentStartCommand,
|
|
850
|
+
stop: agentStopCommand,
|
|
851
|
+
stream: agentStreamCommand,
|
|
852
|
+
// Aliases (hidden from --help via dedup in getCommandHelp)
|
|
853
|
+
create: agentRegisterCommand,
|
|
854
|
+
ls: agentListCommand,
|
|
855
|
+
get: agentShowCommand,
|
|
856
|
+
view: agentShowCommand,
|
|
857
|
+
},
|
|
858
|
+
handler: agentListCommand.handler, // Default to list
|
|
859
|
+
options: [],
|
|
860
|
+
};
|
|
861
|
+
//# sourceMappingURL=agent.js.map
|