@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,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Registry Service
|
|
3
|
+
*
|
|
4
|
+
* This service provides agent registration and management functionality.
|
|
5
|
+
* It allows registering agents with roles (director, worker, steward) and
|
|
6
|
+
* querying agents by various criteria.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Register agents with specific roles
|
|
10
|
+
* - Query agents by role, status, and other filters
|
|
11
|
+
* - Track agent session status
|
|
12
|
+
* - Manage agent metadata
|
|
13
|
+
* - Create dedicated channels for agent messaging (TB-O7a)
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import type { EntityId, Channel, ChannelId } from '@stoneforge/core';
|
|
18
|
+
import type { QuarryAPI } from '@stoneforge/quarry';
|
|
19
|
+
import type { AgentRole, AgentMetadata, AgentFilter, RegisterDirectorInput, RegisterWorkerInput, RegisterStewardInput } from '../types/index.js';
|
|
20
|
+
import { type AgentEntity, isAgentEntity, getAgentMetadata } from '../api/orchestrator-api.js';
|
|
21
|
+
export type { AgentEntity };
|
|
22
|
+
export { isAgentEntity, getAgentMetadata };
|
|
23
|
+
/**
|
|
24
|
+
* Generates the channel name for an agent based on agent name
|
|
25
|
+
* Channel names follow the pattern: agent-{agentName}
|
|
26
|
+
*/
|
|
27
|
+
export declare function generateAgentChannelName(agentName: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Parses an agent name from a channel name
|
|
30
|
+
* Returns null if the name doesn't match the agent channel pattern
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseAgentChannelName(channelName: string): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Generic agent registration input
|
|
35
|
+
*/
|
|
36
|
+
export type RegisterAgentInput = (RegisterDirectorInput & {
|
|
37
|
+
role: 'director';
|
|
38
|
+
}) | (RegisterWorkerInput & {
|
|
39
|
+
role: 'worker';
|
|
40
|
+
}) | (RegisterStewardInput & {
|
|
41
|
+
role: 'steward';
|
|
42
|
+
});
|
|
43
|
+
/**
|
|
44
|
+
* Agent Registry interface for managing agents in the orchestration system.
|
|
45
|
+
*
|
|
46
|
+
* The registry provides methods for:
|
|
47
|
+
* - Registering agents with specific roles
|
|
48
|
+
* - Querying agents by various criteria
|
|
49
|
+
* - Managing agent session status
|
|
50
|
+
*/
|
|
51
|
+
export interface AgentRegistry {
|
|
52
|
+
/**
|
|
53
|
+
* Registers a new agent with the given parameters.
|
|
54
|
+
* This is a convenience method that dispatches to the appropriate
|
|
55
|
+
* role-specific registration method.
|
|
56
|
+
*/
|
|
57
|
+
registerAgent(input: RegisterAgentInput): Promise<AgentEntity>;
|
|
58
|
+
/**
|
|
59
|
+
* Registers a Director agent.
|
|
60
|
+
* There should typically be only one Director per workspace.
|
|
61
|
+
*/
|
|
62
|
+
registerDirector(input: RegisterDirectorInput): Promise<AgentEntity>;
|
|
63
|
+
/**
|
|
64
|
+
* Registers a Worker agent.
|
|
65
|
+
* Workers can be ephemeral (short-lived, task-specific) or persistent (long-lived).
|
|
66
|
+
*/
|
|
67
|
+
registerWorker(input: RegisterWorkerInput): Promise<AgentEntity>;
|
|
68
|
+
/**
|
|
69
|
+
* Registers a Steward agent.
|
|
70
|
+
* Stewards perform support tasks like merging, health checks, etc.
|
|
71
|
+
*/
|
|
72
|
+
registerSteward(input: RegisterStewardInput): Promise<AgentEntity>;
|
|
73
|
+
/**
|
|
74
|
+
* Gets an agent by ID
|
|
75
|
+
*/
|
|
76
|
+
getAgent(entityId: EntityId): Promise<AgentEntity | undefined>;
|
|
77
|
+
/**
|
|
78
|
+
* Gets an agent by name
|
|
79
|
+
*/
|
|
80
|
+
getAgentByName(name: string): Promise<AgentEntity | undefined>;
|
|
81
|
+
/**
|
|
82
|
+
* Lists agents matching the filter
|
|
83
|
+
*/
|
|
84
|
+
listAgents(filter?: AgentFilter): Promise<AgentEntity[]>;
|
|
85
|
+
/**
|
|
86
|
+
* Gets all agents with a specific role
|
|
87
|
+
*/
|
|
88
|
+
getAgentsByRole(role: AgentRole): Promise<AgentEntity[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Gets available workers (idle or with capacity for more tasks)
|
|
91
|
+
*/
|
|
92
|
+
getAvailableWorkers(): Promise<AgentEntity[]>;
|
|
93
|
+
/**
|
|
94
|
+
* Gets all stewards
|
|
95
|
+
*/
|
|
96
|
+
getStewards(): Promise<AgentEntity[]>;
|
|
97
|
+
/**
|
|
98
|
+
* Gets the Director agent (there should be only one per workspace)
|
|
99
|
+
*/
|
|
100
|
+
getDirector(): Promise<AgentEntity | undefined>;
|
|
101
|
+
/**
|
|
102
|
+
* Updates an agent's session status
|
|
103
|
+
*/
|
|
104
|
+
updateAgentSession(entityId: EntityId, sessionId: string | undefined, status: 'idle' | 'running' | 'suspended' | 'terminated'): Promise<AgentEntity>;
|
|
105
|
+
/**
|
|
106
|
+
* Updates an agent's metadata
|
|
107
|
+
*/
|
|
108
|
+
updateAgentMetadata(entityId: EntityId, updates: Partial<AgentMetadata>): Promise<AgentEntity>;
|
|
109
|
+
/**
|
|
110
|
+
* Updates an agent's properties (e.g., name)
|
|
111
|
+
*/
|
|
112
|
+
updateAgent(entityId: EntityId, updates: {
|
|
113
|
+
name?: string;
|
|
114
|
+
}): Promise<AgentEntity>;
|
|
115
|
+
/**
|
|
116
|
+
* Deletes an agent and its associated channel
|
|
117
|
+
*/
|
|
118
|
+
deleteAgent(entityId: EntityId): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Gets the dedicated channel for an agent.
|
|
121
|
+
* Each agent has a channel named `agent-{agentId}` for receiving messages.
|
|
122
|
+
*
|
|
123
|
+
* @param agentId - The entity ID of the agent
|
|
124
|
+
* @returns The agent's channel, or undefined if not found
|
|
125
|
+
*/
|
|
126
|
+
getAgentChannel(agentId: EntityId): Promise<Channel | undefined>;
|
|
127
|
+
/**
|
|
128
|
+
* Gets the channel ID for an agent from its metadata.
|
|
129
|
+
* This is faster than getAgentChannel() when you only need the ID.
|
|
130
|
+
*
|
|
131
|
+
* @param agentId - The entity ID of the agent
|
|
132
|
+
* @returns The channel ID, or undefined if the agent has no channel
|
|
133
|
+
*/
|
|
134
|
+
getAgentChannelId(agentId: EntityId): Promise<ChannelId | undefined>;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Implementation of the Agent Registry service.
|
|
138
|
+
*
|
|
139
|
+
* This implementation uses the QuarryAPI for storage operations,
|
|
140
|
+
* storing agent information as Entity elements with specialized metadata.
|
|
141
|
+
*/
|
|
142
|
+
export declare class AgentRegistryImpl implements AgentRegistry {
|
|
143
|
+
private readonly api;
|
|
144
|
+
constructor(api: QuarryAPI);
|
|
145
|
+
registerAgent(input: RegisterAgentInput): Promise<AgentEntity>;
|
|
146
|
+
registerDirector(input: RegisterDirectorInput): Promise<AgentEntity>;
|
|
147
|
+
registerWorker(input: RegisterWorkerInput): Promise<AgentEntity>;
|
|
148
|
+
registerSteward(input: RegisterStewardInput): Promise<AgentEntity>;
|
|
149
|
+
getAgent(entityId: EntityId): Promise<AgentEntity | undefined>;
|
|
150
|
+
getAgentByName(name: string): Promise<AgentEntity | undefined>;
|
|
151
|
+
listAgents(filter?: AgentFilter): Promise<AgentEntity[]>;
|
|
152
|
+
getAgentsByRole(role: AgentRole): Promise<AgentEntity[]>;
|
|
153
|
+
getAvailableWorkers(): Promise<AgentEntity[]>;
|
|
154
|
+
getStewards(): Promise<AgentEntity[]>;
|
|
155
|
+
getDirector(): Promise<AgentEntity | undefined>;
|
|
156
|
+
updateAgentSession(entityId: EntityId, sessionId: string | undefined, status: 'idle' | 'running' | 'suspended' | 'terminated'): Promise<AgentEntity>;
|
|
157
|
+
updateAgentMetadata(entityId: EntityId, updates: Partial<AgentMetadata>): Promise<AgentEntity>;
|
|
158
|
+
updateAgent(entityId: EntityId, updates: {
|
|
159
|
+
name?: string;
|
|
160
|
+
}): Promise<AgentEntity>;
|
|
161
|
+
deleteAgent(entityId: EntityId): Promise<void>;
|
|
162
|
+
getAgentChannel(agentId: EntityId): Promise<Channel | undefined>;
|
|
163
|
+
getAgentChannelId(agentId: EntityId): Promise<ChannelId | undefined>;
|
|
164
|
+
/**
|
|
165
|
+
* Creates an agent entity, its channel, and links them via metadata.
|
|
166
|
+
* Rolls back on partial failure to prevent orphaned resources.
|
|
167
|
+
*/
|
|
168
|
+
private registerAgentWithRollback;
|
|
169
|
+
/**
|
|
170
|
+
* Creates a dedicated channel for an agent and updates the agent's metadata
|
|
171
|
+
* with the channel ID.
|
|
172
|
+
*
|
|
173
|
+
* @param agentName - The name of the agent (used for channel naming)
|
|
174
|
+
* @param agentId - The ID of the agent entity (used for membership)
|
|
175
|
+
* @param createdBy - The entity that created the agent (will be a channel member)
|
|
176
|
+
* @returns The created channel
|
|
177
|
+
*/
|
|
178
|
+
private createAgentChannel;
|
|
179
|
+
private applyFilters;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Creates an AgentRegistry instance
|
|
183
|
+
*/
|
|
184
|
+
export declare function createAgentRegistry(api: QuarryAPI): AgentRegistry;
|
|
185
|
+
//# sourceMappingURL=agent-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/services/agent-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Registry Service
|
|
3
|
+
*
|
|
4
|
+
* This service provides agent registration and management functionality.
|
|
5
|
+
* It allows registering agents with roles (director, worker, steward) and
|
|
6
|
+
* querying agents by various criteria.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Register agents with specific roles
|
|
10
|
+
* - Query agents by role, status, and other filters
|
|
11
|
+
* - Track agent session status
|
|
12
|
+
* - Manage agent metadata
|
|
13
|
+
* - Create dedicated channels for agent messaging (TB-O7a)
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import { EntityTypeValue, createEntity, createTimestamp, createDirectChannel, generateDirectChannelName, duplicateName, asEntityId, asElementId } from '@stoneforge/core';
|
|
18
|
+
// Import shared agent entity types from the API module to avoid duplication
|
|
19
|
+
import { isAgentEntity, getAgentMetadata, } from '../api/orchestrator-api.js';
|
|
20
|
+
export { isAgentEntity, getAgentMetadata };
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Constants
|
|
23
|
+
// ============================================================================
|
|
24
|
+
/**
|
|
25
|
+
* Key used to store agent metadata in Entity.metadata
|
|
26
|
+
*/
|
|
27
|
+
const AGENT_META_KEY = 'agent';
|
|
28
|
+
/**
|
|
29
|
+
* Prefix for agent channel names
|
|
30
|
+
*/
|
|
31
|
+
const AGENT_CHANNEL_PREFIX = 'agent-';
|
|
32
|
+
/**
|
|
33
|
+
* Generates the channel name for an agent based on agent name
|
|
34
|
+
* Channel names follow the pattern: agent-{agentName}
|
|
35
|
+
*/
|
|
36
|
+
export function generateAgentChannelName(agentName) {
|
|
37
|
+
return `${AGENT_CHANNEL_PREFIX}${agentName}`;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Parses an agent name from a channel name
|
|
41
|
+
* Returns null if the name doesn't match the agent channel pattern
|
|
42
|
+
*/
|
|
43
|
+
export function parseAgentChannelName(channelName) {
|
|
44
|
+
if (!channelName.startsWith(AGENT_CHANNEL_PREFIX)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const agentName = channelName.slice(AGENT_CHANNEL_PREFIX.length);
|
|
48
|
+
// Basic validation - must have a non-empty name
|
|
49
|
+
if (!agentName || agentName.length === 0) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
return agentName;
|
|
53
|
+
}
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Agent Registry Implementation
|
|
56
|
+
// ============================================================================
|
|
57
|
+
/**
|
|
58
|
+
* Implementation of the Agent Registry service.
|
|
59
|
+
*
|
|
60
|
+
* This implementation uses the QuarryAPI for storage operations,
|
|
61
|
+
* storing agent information as Entity elements with specialized metadata.
|
|
62
|
+
*/
|
|
63
|
+
export class AgentRegistryImpl {
|
|
64
|
+
api;
|
|
65
|
+
constructor(api) {
|
|
66
|
+
this.api = api;
|
|
67
|
+
}
|
|
68
|
+
// ----------------------------------------
|
|
69
|
+
// Agent Registration
|
|
70
|
+
// ----------------------------------------
|
|
71
|
+
async registerAgent(input) {
|
|
72
|
+
switch (input.role) {
|
|
73
|
+
case 'director':
|
|
74
|
+
return this.registerDirector(input);
|
|
75
|
+
case 'worker':
|
|
76
|
+
return this.registerWorker(input);
|
|
77
|
+
case 'steward':
|
|
78
|
+
return this.registerSteward(input);
|
|
79
|
+
default:
|
|
80
|
+
throw new Error(`Unknown agent role: ${input.role}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async registerDirector(input) {
|
|
84
|
+
const existing = await this.getAgentByName(input.name);
|
|
85
|
+
if (existing) {
|
|
86
|
+
throw duplicateName(input.name, 'agent', { existingId: existing.id });
|
|
87
|
+
}
|
|
88
|
+
const agentMetadata = {
|
|
89
|
+
agentRole: 'director',
|
|
90
|
+
sessionStatus: 'idle',
|
|
91
|
+
maxConcurrentTasks: input.maxConcurrentTasks,
|
|
92
|
+
roleDefinitionRef: input.roleDefinitionRef,
|
|
93
|
+
provider: input.provider,
|
|
94
|
+
model: input.model,
|
|
95
|
+
};
|
|
96
|
+
const entity = await createEntity({
|
|
97
|
+
name: input.name,
|
|
98
|
+
entityType: EntityTypeValue.AGENT,
|
|
99
|
+
createdBy: input.createdBy,
|
|
100
|
+
tags: input.tags,
|
|
101
|
+
metadata: { [AGENT_META_KEY]: agentMetadata },
|
|
102
|
+
});
|
|
103
|
+
return this.registerAgentWithRollback(entity, input.name, input.createdBy);
|
|
104
|
+
}
|
|
105
|
+
async registerWorker(input) {
|
|
106
|
+
const existing = await this.getAgentByName(input.name);
|
|
107
|
+
if (existing) {
|
|
108
|
+
throw duplicateName(input.name, 'agent', { existingId: existing.id });
|
|
109
|
+
}
|
|
110
|
+
const agentMetadata = {
|
|
111
|
+
agentRole: 'worker',
|
|
112
|
+
workerMode: input.workerMode,
|
|
113
|
+
sessionStatus: 'idle',
|
|
114
|
+
maxConcurrentTasks: input.maxConcurrentTasks,
|
|
115
|
+
roleDefinitionRef: input.roleDefinitionRef,
|
|
116
|
+
provider: input.provider,
|
|
117
|
+
model: input.model,
|
|
118
|
+
};
|
|
119
|
+
const entity = await createEntity({
|
|
120
|
+
name: input.name,
|
|
121
|
+
entityType: EntityTypeValue.AGENT,
|
|
122
|
+
createdBy: input.createdBy,
|
|
123
|
+
tags: input.tags,
|
|
124
|
+
metadata: { [AGENT_META_KEY]: agentMetadata },
|
|
125
|
+
reportsTo: input.reportsTo,
|
|
126
|
+
});
|
|
127
|
+
return this.registerAgentWithRollback(entity, input.name, input.createdBy);
|
|
128
|
+
}
|
|
129
|
+
async registerSteward(input) {
|
|
130
|
+
const existing = await this.getAgentByName(input.name);
|
|
131
|
+
if (existing) {
|
|
132
|
+
throw duplicateName(input.name, 'agent', { existingId: existing.id });
|
|
133
|
+
}
|
|
134
|
+
const agentMetadata = {
|
|
135
|
+
agentRole: 'steward',
|
|
136
|
+
stewardFocus: input.stewardFocus,
|
|
137
|
+
triggers: input.triggers,
|
|
138
|
+
sessionStatus: 'idle',
|
|
139
|
+
maxConcurrentTasks: input.maxConcurrentTasks,
|
|
140
|
+
roleDefinitionRef: input.roleDefinitionRef,
|
|
141
|
+
provider: input.provider,
|
|
142
|
+
model: input.model,
|
|
143
|
+
};
|
|
144
|
+
const entity = await createEntity({
|
|
145
|
+
name: input.name,
|
|
146
|
+
entityType: EntityTypeValue.AGENT,
|
|
147
|
+
createdBy: input.createdBy,
|
|
148
|
+
tags: input.tags,
|
|
149
|
+
metadata: { [AGENT_META_KEY]: agentMetadata },
|
|
150
|
+
reportsTo: input.reportsTo,
|
|
151
|
+
});
|
|
152
|
+
return this.registerAgentWithRollback(entity, input.name, input.createdBy);
|
|
153
|
+
}
|
|
154
|
+
// ----------------------------------------
|
|
155
|
+
// Agent Queries
|
|
156
|
+
// ----------------------------------------
|
|
157
|
+
async getAgent(entityId) {
|
|
158
|
+
// Cast EntityId to ElementId - they are both branded string types
|
|
159
|
+
const entity = await this.api.get(asElementId(entityId));
|
|
160
|
+
if (!entity || entity.type !== 'entity' || !isAgentEntity(entity)) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
return entity;
|
|
164
|
+
}
|
|
165
|
+
async getAgentByName(name) {
|
|
166
|
+
const entity = await this.api.lookupEntityByName(name);
|
|
167
|
+
if (!entity || !isAgentEntity(entity)) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
return entity;
|
|
171
|
+
}
|
|
172
|
+
async listAgents(filter) {
|
|
173
|
+
// Get all entities
|
|
174
|
+
const entities = await this.api.list({ type: 'entity' });
|
|
175
|
+
// Filter to only agent-type entities with valid agent metadata
|
|
176
|
+
let agents = entities.filter((e) => e.entityType === EntityTypeValue.AGENT && isAgentEntity(e));
|
|
177
|
+
// Apply additional filters
|
|
178
|
+
if (filter) {
|
|
179
|
+
agents = this.applyFilters(agents, filter);
|
|
180
|
+
}
|
|
181
|
+
return agents;
|
|
182
|
+
}
|
|
183
|
+
async getAgentsByRole(role) {
|
|
184
|
+
return this.listAgents({ role });
|
|
185
|
+
}
|
|
186
|
+
async getAvailableWorkers() {
|
|
187
|
+
const workers = await this.listAgents({ role: 'worker' });
|
|
188
|
+
return workers.filter((w) => {
|
|
189
|
+
const meta = getAgentMetadata(w);
|
|
190
|
+
const status = meta?.sessionStatus;
|
|
191
|
+
// Consider idle or undefined (never started) as available
|
|
192
|
+
return status === 'idle' || status === undefined;
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
async getStewards() {
|
|
196
|
+
return this.listAgents({ role: 'steward' });
|
|
197
|
+
}
|
|
198
|
+
async getDirector() {
|
|
199
|
+
const directors = await this.listAgents({ role: 'director' });
|
|
200
|
+
return directors[0];
|
|
201
|
+
}
|
|
202
|
+
// ----------------------------------------
|
|
203
|
+
// Agent Session Management
|
|
204
|
+
// ----------------------------------------
|
|
205
|
+
async updateAgentSession(entityId, sessionId, status) {
|
|
206
|
+
const agent = await this.getAgent(entityId);
|
|
207
|
+
if (!agent) {
|
|
208
|
+
throw new Error(`Agent not found: ${entityId}`);
|
|
209
|
+
}
|
|
210
|
+
const currentMeta = getAgentMetadata(agent);
|
|
211
|
+
if (!currentMeta) {
|
|
212
|
+
throw new Error(`Entity is not an agent: ${entityId}`);
|
|
213
|
+
}
|
|
214
|
+
const updatedAgentMeta = {
|
|
215
|
+
...currentMeta,
|
|
216
|
+
sessionId,
|
|
217
|
+
sessionStatus: status,
|
|
218
|
+
lastActivityAt: createTimestamp(),
|
|
219
|
+
};
|
|
220
|
+
// Cast EntityId to ElementId for update
|
|
221
|
+
const updated = await this.api.update(asElementId(entityId), {
|
|
222
|
+
metadata: { ...agent.metadata, [AGENT_META_KEY]: updatedAgentMeta },
|
|
223
|
+
});
|
|
224
|
+
return updated;
|
|
225
|
+
}
|
|
226
|
+
async updateAgentMetadata(entityId, updates) {
|
|
227
|
+
const agent = await this.getAgent(entityId);
|
|
228
|
+
if (!agent) {
|
|
229
|
+
throw new Error(`Agent not found: ${entityId}`);
|
|
230
|
+
}
|
|
231
|
+
const currentMeta = getAgentMetadata(agent);
|
|
232
|
+
if (!currentMeta) {
|
|
233
|
+
throw new Error(`Entity is not an agent: ${entityId}`);
|
|
234
|
+
}
|
|
235
|
+
const updatedAgentMeta = {
|
|
236
|
+
...currentMeta,
|
|
237
|
+
...updates,
|
|
238
|
+
};
|
|
239
|
+
// Cast EntityId to ElementId for update
|
|
240
|
+
const updated = await this.api.update(asElementId(entityId), {
|
|
241
|
+
metadata: { ...agent.metadata, [AGENT_META_KEY]: updatedAgentMeta },
|
|
242
|
+
});
|
|
243
|
+
return updated;
|
|
244
|
+
}
|
|
245
|
+
async updateAgent(entityId, updates) {
|
|
246
|
+
const agent = await this.getAgent(entityId);
|
|
247
|
+
if (!agent) {
|
|
248
|
+
throw new Error(`Agent not found: ${entityId}`);
|
|
249
|
+
}
|
|
250
|
+
// Build update object with only provided fields
|
|
251
|
+
const updateData = {};
|
|
252
|
+
if (updates.name !== undefined) {
|
|
253
|
+
updateData.name = updates.name;
|
|
254
|
+
}
|
|
255
|
+
// Cast EntityId to ElementId for update, explicitly type as Entity
|
|
256
|
+
const updated = await this.api.update(asElementId(entityId), updateData);
|
|
257
|
+
return updated;
|
|
258
|
+
}
|
|
259
|
+
async deleteAgent(entityId) {
|
|
260
|
+
const agent = await this.getAgent(entityId);
|
|
261
|
+
if (!agent) {
|
|
262
|
+
throw new Error(`Agent not found: ${entityId}`);
|
|
263
|
+
}
|
|
264
|
+
// Get the agent's channel ID from metadata
|
|
265
|
+
const meta = getAgentMetadata(agent);
|
|
266
|
+
const channelId = meta?.channelId;
|
|
267
|
+
// Delete the agent's channel if it exists
|
|
268
|
+
if (channelId) {
|
|
269
|
+
try {
|
|
270
|
+
await this.api.delete(asElementId(channelId));
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Best-effort channel deletion - continue even if it fails
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Delete the agent entity
|
|
277
|
+
await this.api.delete(asElementId(entityId));
|
|
278
|
+
}
|
|
279
|
+
// ----------------------------------------
|
|
280
|
+
// Agent Channel Operations (TB-O7a)
|
|
281
|
+
// ----------------------------------------
|
|
282
|
+
async getAgentChannel(agentId) {
|
|
283
|
+
// First try to get the channel ID from the agent's metadata (fast path)
|
|
284
|
+
const channelId = await this.getAgentChannelId(agentId);
|
|
285
|
+
if (channelId) {
|
|
286
|
+
const channel = await this.api.get(asElementId(channelId));
|
|
287
|
+
if (channel && channel.type === 'channel') {
|
|
288
|
+
return channel;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Fallback: look up agent to get createdBy, then search for the direct channel
|
|
292
|
+
const agent = await this.getAgent(agentId);
|
|
293
|
+
if (!agent) {
|
|
294
|
+
return undefined;
|
|
295
|
+
}
|
|
296
|
+
// Direct channel name is based on sorted entity IDs
|
|
297
|
+
const channelName = generateDirectChannelName(agent.createdBy, agentId);
|
|
298
|
+
const channels = await this.api.searchChannels(channelName, {
|
|
299
|
+
channelType: 'direct',
|
|
300
|
+
});
|
|
301
|
+
// Find exact match (searchChannels does pattern matching)
|
|
302
|
+
const agentChannel = channels.find((c) => c.name === channelName);
|
|
303
|
+
return agentChannel;
|
|
304
|
+
}
|
|
305
|
+
async getAgentChannelId(agentId) {
|
|
306
|
+
const agent = await this.getAgent(agentId);
|
|
307
|
+
if (!agent) {
|
|
308
|
+
return undefined;
|
|
309
|
+
}
|
|
310
|
+
const meta = getAgentMetadata(agent);
|
|
311
|
+
return meta?.channelId;
|
|
312
|
+
}
|
|
313
|
+
// ----------------------------------------
|
|
314
|
+
// Private Helpers
|
|
315
|
+
// ----------------------------------------
|
|
316
|
+
/**
|
|
317
|
+
* Creates an agent entity, its channel, and links them via metadata.
|
|
318
|
+
* Rolls back on partial failure to prevent orphaned resources.
|
|
319
|
+
*/
|
|
320
|
+
async registerAgentWithRollback(entityData, agentName, createdBy) {
|
|
321
|
+
const saved = await this.api.create(entityData);
|
|
322
|
+
const agentEntity = saved;
|
|
323
|
+
const agentEntityId = asEntityId(agentEntity.id);
|
|
324
|
+
let channel;
|
|
325
|
+
try {
|
|
326
|
+
channel = await this.createAgentChannel(agentName, agentEntityId, createdBy);
|
|
327
|
+
}
|
|
328
|
+
catch (channelError) {
|
|
329
|
+
try {
|
|
330
|
+
await this.api.delete(agentEntity.id);
|
|
331
|
+
}
|
|
332
|
+
catch { /* best-effort rollback */ }
|
|
333
|
+
throw channelError;
|
|
334
|
+
}
|
|
335
|
+
try {
|
|
336
|
+
return await this.updateAgentMetadata(agentEntityId, {
|
|
337
|
+
channelId: channel.id,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
catch (metadataError) {
|
|
341
|
+
try {
|
|
342
|
+
await this.api.delete(channel.id);
|
|
343
|
+
}
|
|
344
|
+
catch { /* best-effort */ }
|
|
345
|
+
try {
|
|
346
|
+
await this.api.delete(agentEntity.id);
|
|
347
|
+
}
|
|
348
|
+
catch { /* best-effort */ }
|
|
349
|
+
throw metadataError;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Creates a dedicated channel for an agent and updates the agent's metadata
|
|
354
|
+
* with the channel ID.
|
|
355
|
+
*
|
|
356
|
+
* @param agentName - The name of the agent (used for channel naming)
|
|
357
|
+
* @param agentId - The ID of the agent entity (used for membership)
|
|
358
|
+
* @param createdBy - The entity that created the agent (will be a channel member)
|
|
359
|
+
* @returns The created channel
|
|
360
|
+
*/
|
|
361
|
+
async createAgentChannel(agentName, agentId, createdBy) {
|
|
362
|
+
// Look up the creator entity name for the channel display name
|
|
363
|
+
const creatorEntity = await this.api.get(asElementId(createdBy));
|
|
364
|
+
const creatorName = creatorEntity?.name ?? 'operator';
|
|
365
|
+
// Create a direct channel between the agent and the operator
|
|
366
|
+
const channel = await createDirectChannel({
|
|
367
|
+
entityA: createdBy, // Operator (el-0000)
|
|
368
|
+
entityB: agentId, // The new agent
|
|
369
|
+
entityAName: creatorName,
|
|
370
|
+
entityBName: agentName,
|
|
371
|
+
createdBy: createdBy,
|
|
372
|
+
tags: ['agent-channel'],
|
|
373
|
+
metadata: {
|
|
374
|
+
agentId,
|
|
375
|
+
agentName,
|
|
376
|
+
purpose: 'Agent direct messaging channel',
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
// Save the channel
|
|
380
|
+
const savedChannel = await this.api.create(channel);
|
|
381
|
+
return savedChannel;
|
|
382
|
+
}
|
|
383
|
+
applyFilters(agents, filter) {
|
|
384
|
+
let result = agents;
|
|
385
|
+
if (filter.role !== undefined) {
|
|
386
|
+
result = result.filter((a) => {
|
|
387
|
+
const meta = getAgentMetadata(a);
|
|
388
|
+
return meta?.agentRole === filter.role;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
if (filter.workerMode !== undefined) {
|
|
392
|
+
result = result.filter((a) => {
|
|
393
|
+
const meta = getAgentMetadata(a);
|
|
394
|
+
return (meta?.agentRole === 'worker' &&
|
|
395
|
+
meta.workerMode === filter.workerMode);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
if (filter.stewardFocus !== undefined) {
|
|
399
|
+
result = result.filter((a) => {
|
|
400
|
+
const meta = getAgentMetadata(a);
|
|
401
|
+
return (meta?.agentRole === 'steward' &&
|
|
402
|
+
meta.stewardFocus === filter.stewardFocus);
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
if (filter.sessionStatus !== undefined) {
|
|
406
|
+
result = result.filter((a) => {
|
|
407
|
+
const meta = getAgentMetadata(a);
|
|
408
|
+
return meta?.sessionStatus === filter.sessionStatus;
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
if (filter.reportsTo !== undefined) {
|
|
412
|
+
result = result.filter((a) => a.reportsTo === filter.reportsTo);
|
|
413
|
+
}
|
|
414
|
+
if (filter.hasSession !== undefined) {
|
|
415
|
+
result = result.filter((a) => {
|
|
416
|
+
const meta = getAgentMetadata(a);
|
|
417
|
+
return (meta?.sessionId !== undefined) === filter.hasSession;
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
return result;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// ============================================================================
|
|
424
|
+
// Factory Function
|
|
425
|
+
// ============================================================================
|
|
426
|
+
/**
|
|
427
|
+
* Creates an AgentRegistry instance
|
|
428
|
+
*/
|
|
429
|
+
export function createAgentRegistry(api) {
|
|
430
|
+
return new AgentRegistryImpl(api);
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=agent-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/services/agent-registry.ts"],"names":[],"mappings":"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"}
|