@loompad/cli 0.1.0 → 1.1.2
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/ARCHITECTURE.md +96 -11
- package/CHANGELOG.md +1054 -0
- package/README.md +1473 -44
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/adapters/antigravity-cli.d.ts +62 -0
- package/dist/adapters/antigravity-cli.js +258 -0
- package/dist/adapters/antigravity-cli.js.map +1 -0
- package/dist/adapters/base.d.ts +61 -9
- package/dist/adapters/base.js +266 -15
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/bridges/antigravity.d.ts +9 -12
- package/dist/adapters/bridges/antigravity.js +9 -12
- package/dist/adapters/bridges/antigravity.js.map +1 -1
- package/dist/adapters/echo.d.ts +1 -0
- package/dist/adapters/echo.js +59 -3
- package/dist/adapters/echo.js.map +1 -1
- package/dist/adapters/grok.d.ts +7 -0
- package/dist/adapters/grok.js +20 -10
- package/dist/adapters/grok.js.map +1 -1
- package/dist/adapters/index.d.ts +5 -1
- package/dist/adapters/index.js +53 -7
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/model.d.ts +137 -0
- package/dist/adapters/model.js +527 -0
- package/dist/adapters/model.js.map +1 -0
- package/dist/adapters/opencode.d.ts +101 -1
- package/dist/adapters/opencode.js +874 -98
- package/dist/adapters/opencode.js.map +1 -1
- package/dist/cli/doctor.d.ts +32 -0
- package/dist/cli/doctor.js +89 -4
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +2651 -87
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/tui-model.js +3 -1
- package/dist/cli/tui-model.js.map +1 -1
- package/dist/cli/tui.js +44 -1
- package/dist/cli/tui.js.map +1 -1
- package/dist/cli/ui.d.ts +2 -0
- package/dist/cli/ui.js +13 -0
- package/dist/cli/ui.js.map +1 -1
- package/dist/core/ades.d.ts +32 -16
- package/dist/core/ades.js +57 -20
- package/dist/core/ades.js.map +1 -1
- package/dist/core/agent-state.d.ts +14 -0
- package/dist/core/agent-state.js +32 -0
- package/dist/core/agent-state.js.map +1 -0
- package/dist/core/approvals.d.ts +33 -0
- package/dist/core/approvals.js +29 -0
- package/dist/core/approvals.js.map +1 -0
- package/dist/core/backup.d.ts +19 -0
- package/dist/core/backup.js +86 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/baton.d.ts +2 -2
- package/dist/core/baton.js.map +1 -1
- package/dist/core/brain-extract.d.ts +17 -0
- package/dist/core/brain-extract.js +28 -2
- package/dist/core/brain-extract.js.map +1 -1
- package/dist/core/brain-index.d.ts +71 -0
- package/dist/core/brain-index.js +204 -5
- package/dist/core/brain-index.js.map +1 -1
- package/dist/core/brain.d.ts +58 -2
- package/dist/core/brain.js +79 -1
- package/dist/core/brain.js.map +1 -1
- package/dist/core/chat-import.d.ts +71 -0
- package/dist/core/chat-import.js +419 -0
- package/dist/core/chat-import.js.map +1 -0
- package/dist/core/checkpoint.d.ts +107 -0
- package/dist/core/checkpoint.js +259 -0
- package/dist/core/checkpoint.js.map +1 -0
- package/dist/core/claude-cli.js +1 -1
- package/dist/core/claude-cli.js.map +1 -1
- package/dist/core/continuity/artifacts.d.ts +14 -0
- package/dist/core/continuity/artifacts.js +118 -0
- package/dist/core/continuity/artifacts.js.map +1 -0
- package/dist/core/continuity/capabilities.d.ts +65 -0
- package/dist/core/continuity/capabilities.js +129 -0
- package/dist/core/continuity/capabilities.js.map +1 -0
- package/dist/core/continuity/contracts.d.ts +352 -0
- package/dist/core/continuity/contracts.js +117 -0
- package/dist/core/continuity/contracts.js.map +1 -0
- package/dist/core/continuity/engine.d.ts +55 -0
- package/dist/core/continuity/engine.js +504 -0
- package/dist/core/continuity/engine.js.map +1 -0
- package/dist/core/continuity/store.d.ts +73 -0
- package/dist/core/continuity/store.js +438 -0
- package/dist/core/continuity/store.js.map +1 -0
- package/dist/core/conversations.d.ts +19 -0
- package/dist/core/conversations.js +87 -0
- package/dist/core/conversations.js.map +1 -0
- package/dist/core/crew-coordination.d.ts +6 -0
- package/dist/core/crew-coordination.js +24 -0
- package/dist/core/crew-coordination.js.map +1 -0
- package/dist/core/crew-policy.d.ts +18 -0
- package/dist/core/crew-policy.js +40 -0
- package/dist/core/crew-policy.js.map +1 -0
- package/dist/core/crew-protocol.d.ts +64 -0
- package/dist/core/crew-protocol.js +146 -0
- package/dist/core/crew-protocol.js.map +1 -0
- package/dist/core/crew-requests.d.ts +14 -0
- package/dist/core/crew-requests.js +22 -0
- package/dist/core/crew-requests.js.map +1 -0
- package/dist/core/crew.d.ts +395 -0
- package/dist/core/crew.js +1857 -0
- package/dist/core/crew.js.map +1 -0
- package/dist/core/digest.d.ts +40 -0
- package/dist/core/digest.js +94 -0
- package/dist/core/digest.js.map +1 -0
- package/dist/core/distill.js +3 -5
- package/dist/core/distill.js.map +1 -1
- package/dist/core/eventlog.d.ts +27 -25
- package/dist/core/eventlog.js +97 -150
- package/dist/core/eventlog.js.map +1 -1
- package/dist/core/events/contracts.d.ts +51 -0
- package/dist/core/events/contracts.js +2 -0
- package/dist/core/events/contracts.js.map +1 -0
- package/dist/core/events/jsonl-store.d.ts +23 -0
- package/dist/core/events/jsonl-store.js +90 -0
- package/dist/core/events/jsonl-store.js.map +1 -0
- package/dist/core/events/sqlite-store.d.ts +37 -0
- package/dist/core/events/sqlite-store.js +215 -0
- package/dist/core/events/sqlite-store.js.map +1 -0
- package/dist/core/forecast.d.ts +44 -0
- package/dist/core/forecast.js +46 -0
- package/dist/core/forecast.js.map +1 -0
- package/dist/core/free-pool.d.ts +65 -0
- package/dist/core/free-pool.js +171 -0
- package/dist/core/free-pool.js.map +1 -0
- package/dist/core/git.d.ts +30 -0
- package/dist/core/git.js +50 -2
- package/dist/core/git.js.map +1 -1
- package/dist/core/github-events.d.ts +53 -0
- package/dist/core/github-events.js +227 -0
- package/dist/core/github-events.js.map +1 -0
- package/dist/core/goal-lanes.d.ts +53 -0
- package/dist/core/goal-lanes.js +99 -0
- package/dist/core/goal-lanes.js.map +1 -0
- package/dist/core/hosted.d.ts +27 -0
- package/dist/core/hosted.js +50 -0
- package/dist/core/hosted.js.map +1 -0
- package/dist/core/http-server.d.ts +5 -0
- package/dist/core/http-server.js +8 -0
- package/dist/core/http-server.js.map +1 -0
- package/dist/core/invite-link.d.ts +31 -0
- package/dist/core/invite-link.js +45 -0
- package/dist/core/invite-link.js.map +1 -0
- package/dist/core/loops.d.ts +37 -0
- package/dist/core/loops.js +81 -0
- package/dist/core/loops.js.map +1 -0
- package/dist/core/mcp-catalog.d.ts +182 -0
- package/dist/core/mcp-catalog.js +431 -0
- package/dist/core/mcp-catalog.js.map +1 -0
- package/dist/core/mcp.d.ts +87 -0
- package/dist/core/mcp.js +181 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/core/memory.d.ts +1 -0
- package/dist/core/memory.js +5 -2
- package/dist/core/memory.js.map +1 -1
- package/dist/core/model-tools.d.ts +97 -0
- package/dist/core/model-tools.js +388 -0
- package/dist/core/model-tools.js.map +1 -0
- package/dist/core/notify.js +19 -1
- package/dist/core/notify.js.map +1 -1
- package/dist/core/orchestra.d.ts +635 -0
- package/dist/core/orchestra.js +2120 -0
- package/dist/core/orchestra.js.map +1 -0
- package/dist/core/permissions.d.ts +56 -0
- package/dist/core/permissions.js +122 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/preview-proxy.d.ts +70 -0
- package/dist/core/preview-proxy.js +563 -0
- package/dist/core/preview-proxy.js.map +1 -0
- package/dist/core/preview-shot.d.ts +46 -0
- package/dist/core/preview-shot.js +109 -0
- package/dist/core/preview-shot.js.map +1 -0
- package/dist/core/process.d.ts +36 -0
- package/dist/core/process.js +168 -0
- package/dist/core/process.js.map +1 -0
- package/dist/core/prompt-queue.d.ts +136 -0
- package/dist/core/prompt-queue.js +269 -0
- package/dist/core/prompt-queue.js.map +1 -0
- package/dist/core/prompts.d.ts +53 -0
- package/dist/core/prompts.js +127 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/proof.d.ts +82 -0
- package/dist/core/proof.js +216 -0
- package/dist/core/proof.js.map +1 -0
- package/dist/core/provider-text.d.ts +23 -0
- package/dist/core/provider-text.js +66 -0
- package/dist/core/provider-text.js.map +1 -0
- package/dist/core/providers.d.ts +152 -0
- package/dist/core/providers.js +343 -0
- package/dist/core/providers.js.map +1 -0
- package/dist/core/quota.d.ts +33 -0
- package/dist/core/quota.js +74 -0
- package/dist/core/quota.js.map +1 -0
- package/dist/core/recipes.d.ts +50 -0
- package/dist/core/recipes.js +99 -0
- package/dist/core/recipes.js.map +1 -0
- package/dist/core/registry.d.ts +54 -0
- package/dist/core/registry.js +62 -5
- package/dist/core/registry.js.map +1 -1
- package/dist/core/relay-client.d.ts +67 -0
- package/dist/core/relay-client.js +184 -0
- package/dist/core/relay-client.js.map +1 -0
- package/dist/core/relay-protocol.d.ts +140 -0
- package/dist/core/relay-protocol.js +189 -0
- package/dist/core/relay-protocol.js.map +1 -0
- package/dist/core/replay.d.ts +18 -0
- package/dist/core/replay.js +191 -0
- package/dist/core/replay.js.map +1 -0
- package/dist/core/review-triage.d.ts +41 -0
- package/dist/core/review-triage.js +124 -0
- package/dist/core/review-triage.js.map +1 -0
- package/dist/core/router.js +2 -2
- package/dist/core/router.js.map +1 -1
- package/dist/core/routes.d.ts +39 -3
- package/dist/core/routes.js +137 -4
- package/dist/core/routes.js.map +1 -1
- package/dist/core/run-command.d.ts +14 -0
- package/dist/core/run-command.js +45 -0
- package/dist/core/run-command.js.map +1 -0
- package/dist/core/runner-setup.d.ts +36 -0
- package/dist/core/runner-setup.js +114 -0
- package/dist/core/runner-setup.js.map +1 -0
- package/dist/core/search.js +0 -0
- package/dist/core/search.js.map +1 -1
- package/dist/core/semantic.d.ts +92 -0
- package/dist/core/semantic.js +227 -0
- package/dist/core/semantic.js.map +1 -0
- package/dist/core/servers.d.ts +115 -0
- package/dist/core/servers.js +305 -0
- package/dist/core/servers.js.map +1 -0
- package/dist/core/setup.js +64 -6
- package/dist/core/setup.js.map +1 -1
- package/dist/core/shield.d.ts +17 -0
- package/dist/core/shield.js +81 -0
- package/dist/core/shield.js.map +1 -0
- package/dist/core/shift.d.ts +69 -0
- package/dist/core/shift.js +120 -0
- package/dist/core/shift.js.map +1 -0
- package/dist/core/skill-install.d.ts +125 -0
- package/dist/core/skill-install.js +328 -0
- package/dist/core/skill-install.js.map +1 -0
- package/dist/core/skills.d.ts +116 -0
- package/dist/core/skills.js +223 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/step-conditions.d.ts +65 -0
- package/dist/core/step-conditions.js +102 -0
- package/dist/core/step-conditions.js.map +1 -0
- package/dist/core/subagents.d.ts +45 -0
- package/dist/core/subagents.js +90 -0
- package/dist/core/subagents.js.map +1 -0
- package/dist/core/team-canon.d.ts +42 -0
- package/dist/core/team-canon.js +121 -0
- package/dist/core/team-canon.js.map +1 -0
- package/dist/core/team-crypto.d.ts +97 -0
- package/dist/core/team-crypto.js +175 -0
- package/dist/core/team-crypto.js.map +1 -0
- package/dist/core/team-hub.d.ts +514 -0
- package/dist/core/team-hub.js +964 -0
- package/dist/core/team-hub.js.map +1 -0
- package/dist/core/team-landing.d.ts +239 -0
- package/dist/core/team-landing.js +504 -0
- package/dist/core/team-landing.js.map +1 -0
- package/dist/core/team-leases.d.ts +44 -0
- package/dist/core/team-leases.js +145 -0
- package/dist/core/team-leases.js.map +1 -0
- package/dist/core/team-memory.d.ts +42 -0
- package/dist/core/team-memory.js +84 -0
- package/dist/core/team-memory.js.map +1 -0
- package/dist/core/team-policy.d.ts +85 -0
- package/dist/core/team-policy.js +191 -0
- package/dist/core/team-policy.js.map +1 -0
- package/dist/core/thread-md.d.ts +6 -0
- package/dist/core/thread-md.js +42 -0
- package/dist/core/thread-md.js.map +1 -0
- package/dist/core/turn-stats.d.ts +61 -0
- package/dist/core/turn-stats.js +124 -0
- package/dist/core/turn-stats.js.map +1 -0
- package/dist/core/updater.d.ts +73 -0
- package/dist/core/updater.js +153 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/core/usage.d.ts +75 -0
- package/dist/core/usage.js +163 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/core/windows-jobs.d.ts +15 -0
- package/dist/core/windows-jobs.js +170 -0
- package/dist/core/windows-jobs.js.map +1 -0
- package/dist/core/worktree-merge.d.ts +57 -0
- package/dist/core/worktree-merge.js +123 -0
- package/dist/core/worktree-merge.js.map +1 -0
- package/dist/core/worktree.d.ts +5 -0
- package/dist/core/worktree.js +45 -5
- package/dist/core/worktree.js.map +1 -1
- package/dist/core/worktrees.d.ts +6 -0
- package/dist/core/worktrees.js +21 -0
- package/dist/core/worktrees.js.map +1 -0
- package/dist/daemon/app-page.d.ts +0 -17
- package/dist/daemon/app-page.js +10 -6346
- package/dist/daemon/app-page.js.map +1 -1
- package/dist/daemon/auth.d.ts +24 -3
- package/dist/daemon/auth.js +66 -7
- package/dist/daemon/auth.js.map +1 -1
- package/dist/daemon/board.d.ts +7 -0
- package/dist/daemon/board.js +12 -1
- package/dist/daemon/board.js.map +1 -1
- package/dist/daemon/brand-icons.d.ts +6 -1
- package/dist/daemon/brand-icons.js +11 -3
- package/dist/daemon/brand-icons.js.map +1 -1
- package/dist/daemon/client.d.ts +665 -1
- package/dist/daemon/client.js +381 -3
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/delivery.d.ts +34 -0
- package/dist/daemon/delivery.js +63 -0
- package/dist/daemon/delivery.js.map +1 -0
- package/dist/daemon/deploys.d.ts +62 -0
- package/dist/daemon/deploys.js +159 -0
- package/dist/daemon/deploys.js.map +1 -0
- package/dist/daemon/landing.d.ts +192 -0
- package/dist/daemon/landing.js +992 -0
- package/dist/daemon/landing.js.map +1 -0
- package/dist/daemon/onboard.d.ts +150 -0
- package/dist/daemon/onboard.js +390 -0
- package/dist/daemon/onboard.js.map +1 -0
- package/dist/daemon/proof.d.ts +70 -0
- package/dist/daemon/proof.js +172 -0
- package/dist/daemon/proof.js.map +1 -0
- package/dist/daemon/push.d.ts +19 -1
- package/dist/daemon/push.js +90 -3
- package/dist/daemon/push.js.map +1 -1
- package/dist/daemon/relay.d.ts +82 -0
- package/dist/daemon/relay.js +351 -0
- package/dist/daemon/relay.js.map +1 -0
- package/dist/daemon/routes/agent-discovery.d.ts +4 -0
- package/dist/daemon/routes/agent-discovery.js +29 -0
- package/dist/daemon/routes/agent-discovery.js.map +1 -0
- package/dist/daemon/routes/agent-settings.d.ts +4 -0
- package/dist/daemon/routes/agent-settings.js +94 -0
- package/dist/daemon/routes/agent-settings.js.map +1 -0
- package/dist/daemon/routes/agents.d.ts +4 -0
- package/dist/daemon/routes/agents.js +105 -0
- package/dist/daemon/routes/agents.js.map +1 -0
- package/dist/daemon/routes/alerts.d.ts +4 -0
- package/dist/daemon/routes/alerts.js +137 -0
- package/dist/daemon/routes/alerts.js.map +1 -0
- package/dist/daemon/routes/approvals.d.ts +4 -0
- package/dist/daemon/routes/approvals.js +40 -0
- package/dist/daemon/routes/approvals.js.map +1 -0
- package/dist/daemon/routes/assets.d.ts +3 -0
- package/dist/daemon/routes/assets.js +64 -0
- package/dist/daemon/routes/assets.js.map +1 -0
- package/dist/daemon/routes/board.d.ts +4 -0
- package/dist/daemon/routes/board.js +147 -0
- package/dist/daemon/routes/board.js.map +1 -0
- package/dist/daemon/routes/brain.d.ts +4 -0
- package/dist/daemon/routes/brain.js +270 -0
- package/dist/daemon/routes/brain.js.map +1 -0
- package/dist/daemon/routes/chats.d.ts +4 -0
- package/dist/daemon/routes/chats.js +249 -0
- package/dist/daemon/routes/chats.js.map +1 -0
- package/dist/daemon/routes/clients.d.ts +4 -0
- package/dist/daemon/routes/clients.js +49 -0
- package/dist/daemon/routes/clients.js.map +1 -0
- package/dist/daemon/routes/cloud.d.ts +4 -0
- package/dist/daemon/routes/cloud.js +46 -0
- package/dist/daemon/routes/cloud.js.map +1 -0
- package/dist/daemon/routes/config.d.ts +4 -0
- package/dist/daemon/routes/config.js +35 -0
- package/dist/daemon/routes/config.js.map +1 -0
- package/dist/daemon/routes/context.d.ts +51 -0
- package/dist/daemon/routes/context.js +2 -0
- package/dist/daemon/routes/context.js.map +1 -0
- package/dist/daemon/routes/crews.d.ts +4 -0
- package/dist/daemon/routes/crews.js +149 -0
- package/dist/daemon/routes/crews.js.map +1 -0
- package/dist/daemon/routes/files.d.ts +3 -0
- package/dist/daemon/routes/files.js +253 -0
- package/dist/daemon/routes/files.js.map +1 -0
- package/dist/daemon/routes/git.d.ts +4 -0
- package/dist/daemon/routes/git.js +96 -0
- package/dist/daemon/routes/git.js.map +1 -0
- package/dist/daemon/routes/history.d.ts +4 -0
- package/dist/daemon/routes/history.js +101 -0
- package/dist/daemon/routes/history.js.map +1 -0
- package/dist/daemon/routes/integrations-project.d.ts +3 -0
- package/dist/daemon/routes/integrations-project.js +103 -0
- package/dist/daemon/routes/integrations-project.js.map +1 -0
- package/dist/daemon/routes/integrations.d.ts +3 -0
- package/dist/daemon/routes/integrations.js +111 -0
- package/dist/daemon/routes/integrations.js.map +1 -0
- package/dist/daemon/routes/logs.d.ts +3 -0
- package/dist/daemon/routes/logs.js +40 -0
- package/dist/daemon/routes/logs.js.map +1 -0
- package/dist/daemon/routes/messages.d.ts +4 -0
- package/dist/daemon/routes/messages.js +60 -0
- package/dist/daemon/routes/messages.js.map +1 -0
- package/dist/daemon/routes/observability.d.ts +4 -0
- package/dist/daemon/routes/observability.js +247 -0
- package/dist/daemon/routes/observability.js.map +1 -0
- package/dist/daemon/routes/onboard.d.ts +12 -0
- package/dist/daemon/routes/onboard.js +67 -0
- package/dist/daemon/routes/onboard.js.map +1 -0
- package/dist/daemon/routes/orchestra.d.ts +4 -0
- package/dist/daemon/routes/orchestra.js +110 -0
- package/dist/daemon/routes/orchestra.js.map +1 -0
- package/dist/daemon/routes/pairing.d.ts +4 -0
- package/dist/daemon/routes/pairing.js +155 -0
- package/dist/daemon/routes/pairing.js.map +1 -0
- package/dist/daemon/routes/preview.d.ts +24 -0
- package/dist/daemon/routes/preview.js +122 -0
- package/dist/daemon/routes/preview.js.map +1 -0
- package/dist/daemon/routes/project-actions.d.ts +4 -0
- package/dist/daemon/routes/project-actions.js +53 -0
- package/dist/daemon/routes/project-actions.js.map +1 -0
- package/dist/daemon/routes/project-team.d.ts +4 -0
- package/dist/daemon/routes/project-team.js +201 -0
- package/dist/daemon/routes/project-team.js.map +1 -0
- package/dist/daemon/routes/projects.d.ts +14 -0
- package/dist/daemon/routes/projects.js +138 -0
- package/dist/daemon/routes/projects.js.map +1 -0
- package/dist/daemon/routes/prompts.d.ts +4 -0
- package/dist/daemon/routes/prompts.js +44 -0
- package/dist/daemon/routes/prompts.js.map +1 -0
- package/dist/daemon/routes/proof.d.ts +4 -0
- package/dist/daemon/routes/proof.js +22 -0
- package/dist/daemon/routes/proof.js.map +1 -0
- package/dist/daemon/routes/providers.d.ts +3 -0
- package/dist/daemon/routes/providers.js +60 -0
- package/dist/daemon/routes/providers.js.map +1 -0
- package/dist/daemon/routes/public.d.ts +4 -0
- package/dist/daemon/routes/public.js +64 -0
- package/dist/daemon/routes/public.js.map +1 -0
- package/dist/daemon/routes/queue.d.ts +4 -0
- package/dist/daemon/routes/queue.js +140 -0
- package/dist/daemon/routes/queue.js.map +1 -0
- package/dist/daemon/routes/routing.d.ts +4 -0
- package/dist/daemon/routes/routing.js +61 -0
- package/dist/daemon/routes/routing.js.map +1 -0
- package/dist/daemon/routes/runtime-handler.d.ts +2 -0
- package/dist/daemon/routes/runtime-handler.js +63 -0
- package/dist/daemon/routes/runtime-handler.js.map +1 -0
- package/dist/daemon/routes/search.d.ts +4 -0
- package/dist/daemon/routes/search.js +17 -0
- package/dist/daemon/routes/search.js.map +1 -0
- package/dist/daemon/routes/servers.d.ts +4 -0
- package/dist/daemon/routes/servers.js +133 -0
- package/dist/daemon/routes/servers.js.map +1 -0
- package/dist/daemon/routes/setup.d.ts +3 -0
- package/dist/daemon/routes/setup.js +50 -0
- package/dist/daemon/routes/setup.js.map +1 -0
- package/dist/daemon/routes/shift.d.ts +4 -0
- package/dist/daemon/routes/shift.js +30 -0
- package/dist/daemon/routes/shift.js.map +1 -0
- package/dist/daemon/routes/specs.d.ts +4 -0
- package/dist/daemon/routes/specs.js +57 -0
- package/dist/daemon/routes/specs.js.map +1 -0
- package/dist/daemon/routes/task-delivery.d.ts +4 -0
- package/dist/daemon/routes/task-delivery.js +38 -0
- package/dist/daemon/routes/task-delivery.js.map +1 -0
- package/dist/daemon/routes/team.d.ts +4 -0
- package/dist/daemon/routes/team.js +193 -0
- package/dist/daemon/routes/team.js.map +1 -0
- package/dist/daemon/routes/terminals.d.ts +4 -0
- package/dist/daemon/routes/terminals.js +87 -0
- package/dist/daemon/routes/terminals.js.map +1 -0
- package/dist/daemon/routes/tools.d.ts +4 -0
- package/dist/daemon/routes/tools.js +180 -0
- package/dist/daemon/routes/tools.js.map +1 -0
- package/dist/daemon/routes/updates.d.ts +4 -0
- package/dist/daemon/routes/updates.js +89 -0
- package/dist/daemon/routes/updates.js.map +1 -0
- package/dist/daemon/routes/voice.d.ts +4 -0
- package/dist/daemon/routes/voice.js +53 -0
- package/dist/daemon/routes/voice.js.map +1 -0
- package/dist/daemon/runner.d.ts +186 -0
- package/dist/daemon/runner.js +612 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/runtime/accounting.d.ts +130 -0
- package/dist/daemon/runtime/accounting.js +303 -0
- package/dist/daemon/runtime/accounting.js.map +1 -0
- package/dist/daemon/runtime/agents.d.ts +16 -0
- package/dist/daemon/runtime/agents.js +71 -0
- package/dist/daemon/runtime/agents.js.map +1 -0
- package/dist/daemon/runtime/briefings.d.ts +134 -0
- package/dist/daemon/runtime/briefings.js +329 -0
- package/dist/daemon/runtime/briefings.js.map +1 -0
- package/dist/daemon/runtime/native-usage.d.ts +21 -0
- package/dist/daemon/runtime/native-usage.js +71 -0
- package/dist/daemon/runtime/native-usage.js.map +1 -0
- package/dist/daemon/runtime/queue.d.ts +94 -0
- package/dist/daemon/runtime/queue.js +222 -0
- package/dist/daemon/runtime/queue.js.map +1 -0
- package/dist/daemon/runtime/relay.d.ts +93 -0
- package/dist/daemon/runtime/relay.js +240 -0
- package/dist/daemon/runtime/relay.js.map +1 -0
- package/dist/daemon/runtime/turns.d.ts +202 -0
- package/dist/daemon/runtime/turns.js +663 -0
- package/dist/daemon/runtime/turns.js.map +1 -0
- package/dist/daemon/runtime-support.d.ts +76 -0
- package/dist/daemon/runtime-support.js +134 -0
- package/dist/daemon/runtime-support.js.map +1 -0
- package/dist/daemon/runtime.d.ts +739 -70
- package/dist/daemon/runtime.js +2751 -470
- package/dist/daemon/runtime.js.map +1 -1
- package/dist/daemon/server.d.ts +82 -55
- package/dist/daemon/server.js +674 -1435
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/shift.d.ts +70 -0
- package/dist/daemon/shift.js +170 -0
- package/dist/daemon/shift.js.map +1 -0
- package/dist/daemon/specs.d.ts +92 -0
- package/dist/daemon/specs.js +285 -0
- package/dist/daemon/specs.js.map +1 -0
- package/dist/daemon/system.d.ts +208 -0
- package/dist/daemon/system.js +557 -0
- package/dist/daemon/system.js.map +1 -0
- package/dist/daemon/tasks.js +1 -1
- package/dist/daemon/team-brain.d.ts +136 -0
- package/dist/daemon/team-brain.js +659 -0
- package/dist/daemon/team-brain.js.map +1 -0
- package/dist/daemon/team-coordinator.d.ts +78 -0
- package/dist/daemon/team-coordinator.js +408 -0
- package/dist/daemon/team-coordinator.js.map +1 -0
- package/dist/daemon/team.d.ts +339 -0
- package/dist/daemon/team.js +1433 -0
- package/dist/daemon/team.js.map +1 -0
- package/dist/daemon/terminals.d.ts +22 -3
- package/dist/daemon/terminals.js +236 -16
- package/dist/daemon/terminals.js.map +1 -1
- package/dist/hub/client.d.ts +120 -0
- package/dist/hub/client.js +228 -0
- package/dist/hub/client.js.map +1 -0
- package/dist/hub/server.d.ts +32 -0
- package/dist/hub/server.js +180 -0
- package/dist/hub/server.js.map +1 -0
- package/dist/hub/supabase-client.d.ts +220 -0
- package/dist/hub/supabase-client.js +843 -0
- package/dist/hub/supabase-client.js.map +1 -0
- package/dist/observability/ask.d.ts +91 -0
- package/dist/observability/ask.js +179 -0
- package/dist/observability/ask.js.map +1 -0
- package/dist/observability/clickhouse.d.ts +33 -0
- package/dist/observability/clickhouse.js +48 -0
- package/dist/observability/clickhouse.js.map +1 -0
- package/dist/observability/decisions.d.ts +176 -0
- package/dist/observability/decisions.js +377 -0
- package/dist/observability/decisions.js.map +1 -0
- package/dist/observability/index.d.ts +89 -0
- package/dist/observability/index.js +348 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/insights.d.ts +151 -0
- package/dist/observability/insights.js +319 -0
- package/dist/observability/insights.js.map +1 -0
- package/dist/observability/logs-query.d.ts +82 -0
- package/dist/observability/logs-query.js +102 -0
- package/dist/observability/logs-query.js.map +1 -0
- package/dist/observability/logs.d.ts +72 -0
- package/dist/observability/logs.js +295 -0
- package/dist/observability/logs.js.map +1 -0
- package/dist/observability/metrics.d.ts +86 -0
- package/dist/observability/metrics.js +303 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/otlp.d.ts +127 -0
- package/dist/observability/otlp.js +242 -0
- package/dist/observability/otlp.js.map +1 -0
- package/dist/observability/snapshots.d.ts +43 -0
- package/dist/observability/snapshots.js +129 -0
- package/dist/observability/snapshots.js.map +1 -0
- package/dist/observability/triage.d.ts +49 -0
- package/dist/observability/triage.js +284 -0
- package/dist/observability/triage.js.map +1 -0
- package/dist/providers/adapter.d.ts +50 -0
- package/dist/providers/adapter.js +38 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/agent.d.ts +110 -0
- package/dist/providers/agent.js +487 -0
- package/dist/providers/agent.js.map +1 -0
- package/dist/providers/approvals.d.ts +24 -0
- package/dist/providers/approvals.js +78 -0
- package/dist/providers/approvals.js.map +1 -0
- package/dist/providers/attachments.d.ts +20 -0
- package/dist/providers/attachments.js +51 -0
- package/dist/providers/attachments.js.map +1 -0
- package/dist/providers/claude/adapter.d.ts +99 -0
- package/dist/providers/claude/adapter.js +790 -0
- package/dist/providers/claude/adapter.js.map +1 -0
- package/dist/providers/codex/adapter.d.ts +113 -0
- package/dist/providers/codex/adapter.js +881 -0
- package/dist/providers/codex/adapter.js.map +1 -0
- package/dist/providers/codex/instructions.d.ts +11 -0
- package/dist/providers/codex/instructions.js +154 -0
- package/dist/providers/codex/instructions.js.map +1 -0
- package/dist/providers/codex/rpc.d.ts +36 -0
- package/dist/providers/codex/rpc.js +104 -0
- package/dist/providers/codex/rpc.js.map +1 -0
- package/dist/providers/contracts.d.ts +339 -0
- package/dist/providers/contracts.js +19 -0
- package/dist/providers/contracts.js.map +1 -0
- package/dist/providers/directory.d.ts +70 -0
- package/dist/providers/directory.js +95 -0
- package/dist/providers/directory.js.map +1 -0
- package/dist/providers/errors.d.ts +47 -0
- package/dist/providers/errors.js +24 -0
- package/dist/providers/errors.js.map +1 -0
- package/dist/providers/index.d.ts +18 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ingestion.d.ts +80 -0
- package/dist/providers/ingestion.js +330 -0
- package/dist/providers/ingestion.js.map +1 -0
- package/dist/providers/live.d.ts +22 -0
- package/dist/providers/live.js +56 -0
- package/dist/providers/live.js.map +1 -0
- package/dist/providers/process.d.ts +29 -0
- package/dist/providers/process.js +71 -0
- package/dist/providers/process.js.map +1 -0
- package/dist/providers/reaper.d.ts +33 -0
- package/dist/providers/reaper.js +65 -0
- package/dist/providers/reaper.js.map +1 -0
- package/dist/providers/service.d.ts +87 -0
- package/dist/providers/service.js +256 -0
- package/dist/providers/service.js.map +1 -0
- package/dist/sdk.d.ts +1 -1
- package/dist/sdk.js +1 -1
- package/dist/sdk.js.map +1 -1
- package/dist/types.d.ts +385 -6
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +7 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/dist/web/app.css +4646 -0
- package/dist/web/app.js +22640 -0
- package/dist/web/app.js.map +7 -0
- package/dist/web/shell.html +39 -0
- package/docs/README.md +21 -0
- package/docs/SETUP.md +10 -0
- package/docs/adapters.md +21 -8
- package/docs/brain-continuity.md +186 -0
- package/docs/cloud.md +108 -0
- package/docs/crews.md +62 -0
- package/docs/design-system.md +31 -2
- package/docs/integration-notes.md +128 -20
- package/docs/loompad.md +105 -0
- package/docs/observability.md +220 -0
- package/docs/play-store.md +123 -0
- package/docs/proposals/agent-teams.md +249 -0
- package/docs/proposals/brain-continuity-implementation.md +468 -0
- package/docs/proposals/brain-session-continuity.md +623 -0
- package/docs/proposals/t3code-port.md +81 -0
- package/docs/proposals/t3code-reference.md +95 -0
- package/docs/refactoring/AGENT-TEAMS-PROGRESS.md +88 -0
- package/docs/refactoring/BOUNDARIES.md +120 -0
- package/docs/refactoring/BRAIN-AUDIT.md +176 -0
- package/docs/refactoring/BRAIN-NOTES.md +390 -0
- package/docs/refactoring/BRAIN-TODO.md +214 -0
- package/docs/refactoring/NOTES.md +129 -0
- package/docs/refactoring/T3-PORT-NOTES.md +165 -0
- package/docs/refactoring/T3-PORT-TODO.md +123 -0
- package/docs/refactoring/TODO.md +46 -0
- package/docs/refactoring/brain-benchmark-2026-09-28.json +48 -0
- package/docs/refactoring/brain-benchmark-audit-2026-09-28.json +48 -0
- package/docs/release-notes/v0.2.0.md +35 -0
- package/docs/release-notes/v0.2.1.md +59 -0
- package/docs/release-notes/v0.2.3.md +77 -0
- package/docs/release-notes/v0.2.4.md +128 -0
- package/docs/release-notes/v0.2.5.md +153 -0
- package/docs/release-notes/v0.2.6.md +62 -0
- package/docs/release-notes/v1.0.0.md +120 -0
- package/docs/release-notes/v1.0.1.md +77 -0
- package/docs/release-notes/v1.1.0.md +71 -0
- package/docs/release-notes/v1.1.1.md +38 -0
- package/docs/release-notes/v1.1.2.md +21 -0
- package/docs/teams-architecture.md +697 -0
- package/docs/teams.md +171 -0
- package/docs/windows.md +85 -0
- package/package.json +22 -9
- package/dist/adapters/claude-code.d.ts +0 -26
- package/dist/adapters/claude-code.js +0 -209
- package/dist/adapters/claude-code.js.map +0 -1
- package/dist/adapters/codex.d.ts +0 -51
- package/dist/adapters/codex.js +0 -291
- package/dist/adapters/codex.js.map +0 -1
- package/docs/img/board-linear.png +0 -0
- package/docs/img/board-projects.png +0 -0
- package/docs/img/brain.png +0 -0
- package/docs/img/settings.png +0 -0
- package/docs/img/workspace.png +0 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision capture — the KAIRO-style "what did each agent decide, and why".
|
|
3
|
+
*
|
|
4
|
+
* Every substantial agent turn contains deliberate choices (a tech pick, an
|
|
5
|
+
* approach, a fix). This extracts them into structured AgentDecisions, through
|
|
6
|
+
* whichever extractor this machine actually has, in descending order of how much
|
|
7
|
+
* it can be trusted to judge its own certainty:
|
|
8
|
+
*
|
|
9
|
+
* "llm" the Anthropic API, when ANTHROPIC_API_KEY is set;
|
|
10
|
+
* "cli" a signed-in local agent CLI driven headlessly — `agy --print`
|
|
11
|
+
* (Antigravity, cheap Gemini model) or `claude -p`. Same trick
|
|
12
|
+
* observability/triage.ts uses to get real prose with no API key;
|
|
13
|
+
* "heuristic" a regex over the prose, when there is no model at all.
|
|
14
|
+
*
|
|
15
|
+
* That order is also why `confidence` is OPTIONAL. A model reading the turn can
|
|
16
|
+
* say how sure the agent sounded; a regex matching "I'll use X because Y"
|
|
17
|
+
* cannot, and the constants it used to stamp (70/75/78/80) were rendered to
|
|
18
|
+
* users as a measured percentage with a progress bar and averaged into a fleet
|
|
19
|
+
* "Avg confidence" tile. A heuristic decision now carries no confidence at all,
|
|
20
|
+
* and `source` says how it was extracted, so nothing downstream has to guess
|
|
21
|
+
* whether a number was measured or invented.
|
|
22
|
+
*
|
|
23
|
+
* The result is persisted per project and surfaced in the Observatory Decision
|
|
24
|
+
* Explorer, the Timeline, and the Time-Travel Replay.
|
|
25
|
+
*/
|
|
26
|
+
import { spawn } from "../core/process.js";
|
|
27
|
+
import fs from "node:fs";
|
|
28
|
+
import os from "node:os";
|
|
29
|
+
import path from "node:path";
|
|
30
|
+
import { agentEnv } from "../adapters/base.js";
|
|
31
|
+
const CATEGORIES = ["architecture", "design", "implementation", "fix", "refactor", "test", "other"];
|
|
32
|
+
const DECISION_MODEL = process.env.LOOM_DECISION_MODEL || "claude-haiku-4-5-20251001";
|
|
33
|
+
const DECISION_EXTRACT_PROMPT = `You are analyzing an AI coding agent's turn output.
|
|
34
|
+
Extract all significant decisions the agent made. A decision is a deliberate choice
|
|
35
|
+
between alternatives — tech choices, architectural decisions, implementation approaches.
|
|
36
|
+
|
|
37
|
+
For each decision, output JSON with this exact shape:
|
|
38
|
+
{
|
|
39
|
+
"decisions": [
|
|
40
|
+
{
|
|
41
|
+
"category": "architecture|design|implementation|fix|refactor|test|other",
|
|
42
|
+
"title": "short label under 60 chars",
|
|
43
|
+
"reasoning": "why the agent chose this (1-2 sentences)",
|
|
44
|
+
"confidence": 85,
|
|
45
|
+
"alternatives": ["other option 1", "other option 2"],
|
|
46
|
+
"filesCreated": ["path/to/file.ts"],
|
|
47
|
+
"filesModified": ["path/to/existing.ts"],
|
|
48
|
+
"artifactNames": ["ComponentName", "functionName"]
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
Rules:
|
|
54
|
+
- Only extract REAL decisions, not descriptions of what was done
|
|
55
|
+
- confidence: how sure the AGENT sounded about this choice, 0-100. 90+ very
|
|
56
|
+
sure, 70-89 reasonably sure, below 70 uncertain. Judge it from the text; if
|
|
57
|
+
the text gives you nothing to judge it by, OMIT the field entirely rather
|
|
58
|
+
than guessing a number
|
|
59
|
+
- alternatives: what the agent explicitly considered OR obvious alternatives
|
|
60
|
+
- If no clear decisions, return {"decisions": []}
|
|
61
|
+
- Output ONLY valid JSON, no markdown, no explanation
|
|
62
|
+
|
|
63
|
+
Agent turn output to analyze:
|
|
64
|
+
`;
|
|
65
|
+
/**
|
|
66
|
+
* Truncate to a word boundary with an ellipsis — never mid-word. A decision
|
|
67
|
+
* title cut at a raw 60 chars reads as broken ("…Redis to store and"); cut at
|
|
68
|
+
* the last whole word with an ellipsis reads as intentional.
|
|
69
|
+
*/
|
|
70
|
+
function clip(s, max = 60) {
|
|
71
|
+
const t = String(s ?? "").trim();
|
|
72
|
+
if (t.length <= max)
|
|
73
|
+
return t;
|
|
74
|
+
const cut = t.slice(0, max);
|
|
75
|
+
const sp = cut.lastIndexOf(" ");
|
|
76
|
+
return (sp > max * 0.6 ? cut.slice(0, sp) : cut).replace(/[\s,;:.\-]+$/, "") + "…";
|
|
77
|
+
}
|
|
78
|
+
/** Coerce one loose object from the model into a well-formed RawDecision. */
|
|
79
|
+
function normalizeRaw(d) {
|
|
80
|
+
const cat = String(d.category ?? "other");
|
|
81
|
+
const arr = (v) => (Array.isArray(v) ? v.map((x) => String(x)).filter(Boolean) : []);
|
|
82
|
+
const conf = Number(d.confidence);
|
|
83
|
+
return {
|
|
84
|
+
category: CATEGORIES.includes(cat) ? cat : "other",
|
|
85
|
+
title: clip(String(d.title ?? "")) || "decision",
|
|
86
|
+
reasoning: String(d.reasoning ?? ""),
|
|
87
|
+
// A model that declined to answer, or answered with junk, gets no
|
|
88
|
+
// confidence — not a plausible-looking default standing in for one.
|
|
89
|
+
...(Number.isFinite(conf) ? { confidence: Math.max(0, Math.min(100, Math.round(conf))) } : {}),
|
|
90
|
+
alternatives: arr(d.alternatives).slice(0, 6),
|
|
91
|
+
filesCreated: arr(d.filesCreated),
|
|
92
|
+
filesModified: arr(d.filesModified),
|
|
93
|
+
artifactNames: arr(d.artifactNames).slice(0, 12),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** Parse the model's JSON reply (tolerating ```json fences) into RawDecisions. */
|
|
97
|
+
export function parseDecisionsJson(text) {
|
|
98
|
+
const cleaned = (text || "").replace(/```json|```/g, "").trim();
|
|
99
|
+
if (!cleaned)
|
|
100
|
+
return [];
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(cleaned);
|
|
103
|
+
const list = Array.isArray(parsed?.decisions) ? parsed.decisions : [];
|
|
104
|
+
return list.map((d) => normalizeRaw((d ?? {})));
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Regex fallback — pull decisions from natural phrasings ("I'll use X because Y",
|
|
112
|
+
* "Instead of X, I'll Y") when there is no model of any kind to read the turn.
|
|
113
|
+
*
|
|
114
|
+
* It emits NO confidence, deliberately. Matching a sentence shape tells you a
|
|
115
|
+
* decision was stated; it tells you nothing whatsoever about how sure the agent
|
|
116
|
+
* was, and the 75/78/80 these branches used to stamp were numbers nobody
|
|
117
|
+
* measured, shown to users as if somebody had.
|
|
118
|
+
*/
|
|
119
|
+
export function extractDecisionsRegex(text) {
|
|
120
|
+
const decisions = [];
|
|
121
|
+
const base = { filesCreated: [], filesModified: [], artifactNames: [] };
|
|
122
|
+
const usePattern = /I(?:'ll| will) (?:use|implement|create|build|add|go with|adopt) ([^.]+?) (?:because|since|as|so that) ([^.]+)\./gi;
|
|
123
|
+
let m;
|
|
124
|
+
while ((m = usePattern.exec(text)) !== null) {
|
|
125
|
+
decisions.push({ ...base, category: "implementation", title: clip(m[1]), reasoning: m[2].trim(), alternatives: [] });
|
|
126
|
+
}
|
|
127
|
+
const insteadPattern = /[Ii]nstead of ([^,]+), I(?:'ll| will) ([^.]+)\./g;
|
|
128
|
+
while ((m = insteadPattern.exec(text)) !== null) {
|
|
129
|
+
decisions.push({ ...base, category: "implementation", title: clip(m[2]), reasoning: `Preferred over: ${m[1].trim()}`, alternatives: [m[1].trim()] });
|
|
130
|
+
}
|
|
131
|
+
const choosePattern = /I(?:'ve| have)? (?:chose|decided|opted|picked)(?: to| for)? ([^.]+?)(?: (?:because|since|to) ([^.]+))?\./gi;
|
|
132
|
+
while ((m = choosePattern.exec(text)) !== null) {
|
|
133
|
+
decisions.push({ ...base, category: "implementation", title: clip(m[1]), reasoning: (m[2] ?? "chosen approach").trim(), alternatives: [] });
|
|
134
|
+
}
|
|
135
|
+
return decisions.slice(0, 5);
|
|
136
|
+
}
|
|
137
|
+
/** Call the Anthropic API to extract decisions; empty on any failure. */
|
|
138
|
+
async function llmExtract(turnText, apiKey) {
|
|
139
|
+
if (typeof globalThis.fetch !== "function")
|
|
140
|
+
return [];
|
|
141
|
+
try {
|
|
142
|
+
const res = await fetch("https://api.anthropic.com/v1/messages", {
|
|
143
|
+
method: "POST",
|
|
144
|
+
headers: { "content-type": "application/json", "x-api-key": apiKey, "anthropic-version": "2023-06-01" },
|
|
145
|
+
body: JSON.stringify({
|
|
146
|
+
model: DECISION_MODEL,
|
|
147
|
+
max_tokens: 1000,
|
|
148
|
+
messages: [{ role: "user", content: DECISION_EXTRACT_PROMPT + turnText.slice(0, 3000) }],
|
|
149
|
+
}),
|
|
150
|
+
});
|
|
151
|
+
if (!res.ok)
|
|
152
|
+
return [];
|
|
153
|
+
const j = (await res.json());
|
|
154
|
+
const text = (j.content ?? []).map((c) => c.text ?? "").join("").trim();
|
|
155
|
+
return parseDecisionsJson(text);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/** agy's cheap tier; the extraction is a small structured read, not reasoning. */
|
|
162
|
+
const AGY_MODEL = process.env.LOOM_DECISION_AGY_MODEL || "gemini-3.6-flash-low";
|
|
163
|
+
/** The claude alias used when agy isn't installed. Small + fast is right. */
|
|
164
|
+
const CLAUDE_MODEL = process.env.LOOM_DECISION_CLAUDE_MODEL || "haiku";
|
|
165
|
+
/** Where the agy installer drops the binary; it isn't always on the daemon's PATH. */
|
|
166
|
+
const AGY_INSTALLED = path.join(os.homedir(), ".local", "bin", "agy");
|
|
167
|
+
/**
|
|
168
|
+
* Run one CLI to completion and return its stdout, or null on timeout, crash,
|
|
169
|
+
* or an empty answer. Deliberately the same shape as triage.ts's `claudeCli`:
|
|
170
|
+
* neutral cwd (no project trust dialog, no CLAUDE.md dragged into context),
|
|
171
|
+
* stdin closed (both CLIs stall in print mode with a pipe open), and `agentEnv`
|
|
172
|
+
* so a daemon started from inside a Claude Code session doesn't hand the child
|
|
173
|
+
* a session-scoped token that answers with nothing.
|
|
174
|
+
*/
|
|
175
|
+
function runCli(bin, args, timeoutMs) {
|
|
176
|
+
return new Promise((resolve) => {
|
|
177
|
+
let child;
|
|
178
|
+
try {
|
|
179
|
+
child = spawn(bin, args, { stdio: ["ignore", "pipe", "ignore"], cwd: os.tmpdir(), env: agentEnv() });
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
resolve(null);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
let out = "";
|
|
186
|
+
const kill = setTimeout(() => {
|
|
187
|
+
try {
|
|
188
|
+
child.kill("SIGKILL");
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
/* already gone */
|
|
192
|
+
}
|
|
193
|
+
resolve(null);
|
|
194
|
+
}, timeoutMs);
|
|
195
|
+
kill.unref?.();
|
|
196
|
+
child.stdout?.on("data", (d) => (out += d.toString()));
|
|
197
|
+
child.on("error", () => {
|
|
198
|
+
clearTimeout(kill);
|
|
199
|
+
resolve(null);
|
|
200
|
+
});
|
|
201
|
+
child.on("close", () => {
|
|
202
|
+
clearTimeout(kill);
|
|
203
|
+
resolve(out.trim() || null);
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* The default CLI extractor: `agy --print` if Antigravity is installed, else
|
|
209
|
+
* `claude -p`. agy is preferred because a turn handed to it runs on Gemini
|
|
210
|
+
* rather than spending the orchestrator's Claude budget — the same reason the
|
|
211
|
+
* antigravity-cli adapter exists.
|
|
212
|
+
*
|
|
213
|
+
* Returns null when neither CLI is present, which is what demotes extraction to
|
|
214
|
+
* the regex (and to no confidence at all).
|
|
215
|
+
*/
|
|
216
|
+
export const defaultCliExtractor = async (prompt) => {
|
|
217
|
+
if (fs.existsSync(AGY_INSTALLED)) {
|
|
218
|
+
const out = await runCli(AGY_INSTALLED, ["--print", prompt, "--model", AGY_MODEL, "--dangerously-skip-permissions", "--print-timeout", "90s"], 120_000);
|
|
219
|
+
if (out)
|
|
220
|
+
return out;
|
|
221
|
+
}
|
|
222
|
+
// `claude -p --output-format json` puts the completion in `.result`; the
|
|
223
|
+
// parser below tolerates either that wrapper or bare text.
|
|
224
|
+
return await runCli("claude", ["-p", prompt, "--output-format", "json", "--model", CLAUDE_MODEL], 90_000);
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* Pull the completion out of whatever a CLI printed: the `.result` of claude's
|
|
228
|
+
* JSON wrapper, or the raw text agy prints. Kept separate from
|
|
229
|
+
* `parseDecisionsJson` because that one is looking for the decisions document,
|
|
230
|
+
* and one of these two CLIs wraps it in another one.
|
|
231
|
+
*/
|
|
232
|
+
export function unwrapCliOutput(raw) {
|
|
233
|
+
const text = (raw ?? "").trim();
|
|
234
|
+
if (!text)
|
|
235
|
+
return "";
|
|
236
|
+
try {
|
|
237
|
+
const j = JSON.parse(text);
|
|
238
|
+
if (Array.isArray(j?.decisions))
|
|
239
|
+
return text; // already the document we want
|
|
240
|
+
if (j?.is_error)
|
|
241
|
+
return "";
|
|
242
|
+
return typeof j?.result === "string" ? j.result.trim() : "";
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return text; // not JSON — agy's markdown, which parseDecisionsJson defences
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/** Ask a local CLI to read the turn; empty on any failure. */
|
|
249
|
+
async function cliExtract(turnText, extractor) {
|
|
250
|
+
const out = await extractor(DECISION_EXTRACT_PROMPT + turnText.slice(0, 3000)).catch(() => null);
|
|
251
|
+
return parseDecisionsJson(unwrapCliOutput(out));
|
|
252
|
+
}
|
|
253
|
+
/** Extract structured decisions from one completed turn. */
|
|
254
|
+
export async function extractDecisions(opts) {
|
|
255
|
+
const { turnText, filesChanged, anthropicApiKey } = opts;
|
|
256
|
+
// Skip trivial turns (greetings, acknowledgements).
|
|
257
|
+
if ((turnText ?? "").trim().length < 100)
|
|
258
|
+
return [];
|
|
259
|
+
let raw = [];
|
|
260
|
+
let source = "heuristic";
|
|
261
|
+
if (anthropicApiKey) {
|
|
262
|
+
raw = await llmExtract(turnText, anthropicApiKey);
|
|
263
|
+
if (raw.length)
|
|
264
|
+
source = "llm";
|
|
265
|
+
}
|
|
266
|
+
// Deterministic escape hatch (tests, or an operator who wants no shell-outs).
|
|
267
|
+
if (raw.length === 0 && process.env.LOOM_DECISIONS_NO_CLI !== "1") {
|
|
268
|
+
raw = await cliExtract(turnText, opts.cliExtractor ?? defaultCliExtractor);
|
|
269
|
+
if (raw.length)
|
|
270
|
+
source = "cli";
|
|
271
|
+
}
|
|
272
|
+
if (raw.length === 0) {
|
|
273
|
+
raw = extractDecisionsRegex(turnText);
|
|
274
|
+
source = "heuristic";
|
|
275
|
+
}
|
|
276
|
+
const changed = new Set(filesChanged);
|
|
277
|
+
const now = Date.now();
|
|
278
|
+
return raw.map((d, i) => ({
|
|
279
|
+
id: `${opts.projectId}-${opts.chatId}-t${opts.turnIndex}-d${i}-${now}`,
|
|
280
|
+
projectId: opts.projectId,
|
|
281
|
+
chatId: opts.chatId,
|
|
282
|
+
agentId: opts.agentId,
|
|
283
|
+
agentRole: opts.agentRole,
|
|
284
|
+
timestamp: now,
|
|
285
|
+
turnIndex: opts.turnIndex,
|
|
286
|
+
// Absent, not "", when this turn has no trace: the difference is a working
|
|
287
|
+
// link versus one that opens a backend search for nothing.
|
|
288
|
+
...(opts.traceId ? { traceId: opts.traceId } : {}),
|
|
289
|
+
...(opts.turnId ? { turnId: opts.turnId } : {}),
|
|
290
|
+
category: d.category,
|
|
291
|
+
title: d.title,
|
|
292
|
+
reasoning: d.reasoning,
|
|
293
|
+
...(d.confidence !== undefined ? { confidence: d.confidence } : {}),
|
|
294
|
+
source,
|
|
295
|
+
alternatives: d.alternatives,
|
|
296
|
+
// Only keep file claims the turn actually changed (when we know the diff).
|
|
297
|
+
filesCreated: changed.size ? d.filesCreated.filter((f) => changed.has(f)) : d.filesCreated,
|
|
298
|
+
filesModified: changed.size ? d.filesModified.filter((f) => changed.has(f)) : d.filesModified,
|
|
299
|
+
artifactNames: d.artifactNames,
|
|
300
|
+
memoryKeys: [],
|
|
301
|
+
upstreamDecisionIds: [],
|
|
302
|
+
turnTokensUsed: opts.turnTokensUsed,
|
|
303
|
+
turnCostUsd: opts.turnCostUsd,
|
|
304
|
+
durationMs: opts.durationMs,
|
|
305
|
+
}));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Read one decision back out of the persisted store, in today's shape.
|
|
309
|
+
*
|
|
310
|
+
* Records written before `source` existed are the problem this handles. Every
|
|
311
|
+
* one of them carries a confidence, and on a machine with no ANTHROPIC_API_KEY
|
|
312
|
+
* — which is the machine most of them were written on — that number came from
|
|
313
|
+
* the regex's 70/75/78/80 constants. It is not distinguishable from a measured
|
|
314
|
+
* one, and a number you cannot tell apart from an invented number must not be
|
|
315
|
+
* rendered as a measurement. So a record with no `source` is read as heuristic
|
|
316
|
+
* and reports no confidence.
|
|
317
|
+
*
|
|
318
|
+
* A projection, not a migration: the file on disk is untouched, and a record
|
|
319
|
+
* written from here on carries its real source and is passed through as-is.
|
|
320
|
+
* The old turn-total names are mapped across for the same reason.
|
|
321
|
+
*/
|
|
322
|
+
export function normalizeStoredDecision(raw) {
|
|
323
|
+
const { tokensUsed, costUsd, confidence, traceId, ...rest } = raw;
|
|
324
|
+
// A record with a source states how it was extracted and can be believed; one
|
|
325
|
+
// without predates the distinction and keeps nothing it can't account for.
|
|
326
|
+
const measured = raw.source !== undefined ? confidence : undefined;
|
|
327
|
+
return {
|
|
328
|
+
...rest,
|
|
329
|
+
source: raw.source ?? "heuristic",
|
|
330
|
+
...(typeof measured === "number" ? { confidence: measured } : {}),
|
|
331
|
+
// "" was what "no trace" used to look like; it links to nothing.
|
|
332
|
+
...(traceId ? { traceId } : {}),
|
|
333
|
+
turnTokensUsed: raw.turnTokensUsed ?? tokensUsed ?? 0,
|
|
334
|
+
turnCostUsd: raw.turnCostUsd ?? costUsd ?? 0,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/** Roll up decisions for the Explorer header + KAIRO metrics. */
|
|
338
|
+
export function decisionStats(decisions) {
|
|
339
|
+
const byAgent = {};
|
|
340
|
+
const byCategory = {};
|
|
341
|
+
const bySource = { llm: 0, cli: 0, heuristic: 0 };
|
|
342
|
+
const altCounts = new Map();
|
|
343
|
+
let confSum = 0;
|
|
344
|
+
let confSamples = 0;
|
|
345
|
+
for (const d of decisions) {
|
|
346
|
+
byAgent[d.agentId] = (byAgent[d.agentId] ?? 0) + 1;
|
|
347
|
+
byCategory[d.category] = (byCategory[d.category] ?? 0) + 1;
|
|
348
|
+
// Decisions read off disk predate `source`; count them as what they were.
|
|
349
|
+
bySource[d.source ?? "heuristic"] += 1;
|
|
350
|
+
// Only measured confidences are averaged. Treating a missing one as 0 would
|
|
351
|
+
// drag the fleet average down with a number nobody ever reported.
|
|
352
|
+
if (typeof d.confidence === "number") {
|
|
353
|
+
confSum += d.confidence;
|
|
354
|
+
confSamples += 1;
|
|
355
|
+
}
|
|
356
|
+
for (const a of d.alternatives)
|
|
357
|
+
altCounts.set(a, (altCounts.get(a) ?? 0) + 1);
|
|
358
|
+
}
|
|
359
|
+
const topAlternatives = [...altCounts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 5).map(([a]) => a);
|
|
360
|
+
// Critical path = the ordered chain of agents that made decisions (deduped runs).
|
|
361
|
+
const chain = [];
|
|
362
|
+
for (const d of [...decisions].sort((a, b) => a.timestamp - b.timestamp)) {
|
|
363
|
+
if (chain[chain.length - 1] !== d.agentId)
|
|
364
|
+
chain.push(d.agentId);
|
|
365
|
+
}
|
|
366
|
+
return {
|
|
367
|
+
total: decisions.length,
|
|
368
|
+
byAgent,
|
|
369
|
+
byCategory,
|
|
370
|
+
avgConfidence: confSamples ? Math.round(confSum / confSamples) : null,
|
|
371
|
+
confidenceSamples: confSamples,
|
|
372
|
+
bySource,
|
|
373
|
+
topAlternatives,
|
|
374
|
+
criticalPath: chain.slice(0, 8),
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../src/observability/decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Loom observability layer: folds LoomEvents into OpenTelemetry signals
|
|
3
|
+
* and ships them over OTLP. One process-wide config, three exporters.
|
|
4
|
+
*
|
|
5
|
+
* Mapping (LoomEvent → span, GenAI semantic conventions where they apply):
|
|
6
|
+
* run_complete → gen_ai.agent.turn (duration, cost, tokens, model)
|
|
7
|
+
* tool_call → gen_ai.tool.call
|
|
8
|
+
* handoff → loom.baton.handoff
|
|
9
|
+
* route_* → loom.route.<phase>
|
|
10
|
+
* memory_add/update/forget→ loom.memory.<op>
|
|
11
|
+
* error → span with ERROR status
|
|
12
|
+
*
|
|
13
|
+
* Metrics (LoomEvent → datapoint, see ./metrics.ts for names and temporality):
|
|
14
|
+
* run_complete → gen_ai.client.token.usage, gen_ai.client.operation.duration,
|
|
15
|
+
* loom.turns, loom.cost.usd (only if reported)
|
|
16
|
+
* status turn_started → loom.agents.active
|
|
17
|
+
* handoff → loom.handoffs
|
|
18
|
+
*
|
|
19
|
+
* Logs (LoomEvent → log record, see ./logs.ts): the event stream itself,
|
|
20
|
+
* correlated to the turn's trace so a span links to what the agent said.
|
|
21
|
+
*
|
|
22
|
+
* One event can produce all three. Callers still only call recordAgentEvent().
|
|
23
|
+
*/
|
|
24
|
+
import type { LoomEvent } from "../types.js";
|
|
25
|
+
import { LoomTelemetry, type SpanInput } from "./otlp.js";
|
|
26
|
+
import { LoomMetrics, type MetricAttributes } from "./metrics.js";
|
|
27
|
+
import { LoomLogs } from "./logs.js";
|
|
28
|
+
/**
|
|
29
|
+
* The trace id of an agent's in-flight turn, or the one that just finished.
|
|
30
|
+
*
|
|
31
|
+
* Undefined when telemetry is off, because then no trace was ever minted and
|
|
32
|
+
* there is nothing in the backend to link to. Callers must leave the field out
|
|
33
|
+
* rather than substituting "" — an empty trace id renders as a link that opens
|
|
34
|
+
* a search for nothing, which reads as a broken feature rather than an absent
|
|
35
|
+
* one.
|
|
36
|
+
*/
|
|
37
|
+
export declare function turnTraceId(agentId: string): string | undefined;
|
|
38
|
+
export declare function telemetry(): LoomTelemetry;
|
|
39
|
+
export declare function metrics(): LoomMetrics;
|
|
40
|
+
export declare function logs(): LoomLogs;
|
|
41
|
+
/** Push every buffered signal now — for shutdown, and for tests that assert. */
|
|
42
|
+
export declare function flushTelemetry(): void;
|
|
43
|
+
export type EventContext = {
|
|
44
|
+
project?: string;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Pure mapper: a LoomEvent → the span it should emit, or null for kinds that
|
|
48
|
+
* aren't telemetry-worthy. Exported so the mapping is unit-testable without a
|
|
49
|
+
* live exporter or collector.
|
|
50
|
+
*/
|
|
51
|
+
export declare function eventToSpan(event: LoomEvent, ctx?: EventContext): SpanInput | null;
|
|
52
|
+
/**
|
|
53
|
+
* One metric write, as data. Returned by the pure mapper below so the
|
|
54
|
+
* event → datapoint decisions can be unit-tested without an exporter — the same
|
|
55
|
+
* reason `eventToSpan` exists.
|
|
56
|
+
*/
|
|
57
|
+
export type MetricOp = {
|
|
58
|
+
op: "count";
|
|
59
|
+
name: string;
|
|
60
|
+
value: number;
|
|
61
|
+
attributes: MetricAttributes;
|
|
62
|
+
isInt: boolean;
|
|
63
|
+
} | {
|
|
64
|
+
op: "histogram";
|
|
65
|
+
name: string;
|
|
66
|
+
value: number;
|
|
67
|
+
attributes: MetricAttributes;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Pure mapper: a LoomEvent → the datapoints it should produce.
|
|
71
|
+
*
|
|
72
|
+
* The rule that governs every branch: a number goes out only if the event
|
|
73
|
+
* carried it. An adapter that reports tokens but no cost produces token
|
|
74
|
+
* datapoints and no cost datapoint — not a cost datapoint of 0. Codex is
|
|
75
|
+
* exactly this case, and the reasoning is written out at the top of
|
|
76
|
+
* src/adapters/codex.ts: a fake $0.001 presented as fact is worse than a blank.
|
|
77
|
+
* On a counter it is worse still, because zeros are indistinguishable from real
|
|
78
|
+
* cheap turns once summed, and the total then reads as authoritative.
|
|
79
|
+
*/
|
|
80
|
+
export declare function eventToMetrics(event: LoomEvent): MetricOp[];
|
|
81
|
+
/**
|
|
82
|
+
* Record one live agent event, fanning it out to every enabled signal.
|
|
83
|
+
*
|
|
84
|
+
* Best-effort and non-throwing: observability must never break the agent loop.
|
|
85
|
+
* The three signals are independent — logs off still means traces and metrics —
|
|
86
|
+
* so each checks its own switch, and the shared trace id is minted once so a
|
|
87
|
+
* log record can point at the span covering the same event.
|
|
88
|
+
*/
|
|
89
|
+
export declare function recordAgentEvent(event: LoomEvent, ctx?: EventContext): void;
|