@loompad/cli 0.1.0 → 1.1.1
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 +1042 -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 +4643 -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/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,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom → OpenTelemetry logs (OTLP/HTTP JSON, `/v1/logs`).
|
|
3
|
+
*
|
|
4
|
+
* Loom already has a log: the LoomEvent stream is the source of truth for the
|
|
5
|
+
* whole product. This ships it. Every agent message, tool call, file edit,
|
|
6
|
+
* decision, route step, budget pause and error becomes one OTLP log record with
|
|
7
|
+
* the same `service.name` as the spans, and — when the event happened inside a
|
|
8
|
+
* turn — the same `traceId`/`spanId`.
|
|
9
|
+
*
|
|
10
|
+
* That last part is the whole point. Without trace correlation this is just a
|
|
11
|
+
* second copy of the event log in a different database. With it, a slow turn
|
|
12
|
+
* in the trace view gets a "related logs" tab showing what the agent actually
|
|
13
|
+
* said and did while it was slow, and a log line has a link back to the span
|
|
14
|
+
* that produced it. Traces tell you a turn took 40s; logs tell you why.
|
|
15
|
+
*
|
|
16
|
+
* Same contract as the other two exporters: buffered, best-effort, never throws
|
|
17
|
+
* into the agent loop. Off with LOOM_OTEL_LOGS=0 (or any consent opt-out).
|
|
18
|
+
*/
|
|
19
|
+
import { encodeAttributes, postOtlp, resourceAttributes, } from "./otlp.js";
|
|
20
|
+
/**
|
|
21
|
+
* OTLP SeverityNumber. The spec's named levels; we use four of them.
|
|
22
|
+
*
|
|
23
|
+
* Mapped honestly, which mostly means resisting the urge to inflate. An agent
|
|
24
|
+
* saying something is INFO, not DEBUG — it is the primary content of the
|
|
25
|
+
* product. A turn that failed is ERROR. Something a human needs to look at but
|
|
26
|
+
* that isn't a failure (blocked on input, over budget, a suggested handoff) is
|
|
27
|
+
* WARN. Adapter lifecycle chatter is DEBUG. Nothing is FATAL: Loom survives
|
|
28
|
+
* every event it logs, and a severity nobody can act on is noise with a red
|
|
29
|
+
* icon.
|
|
30
|
+
*/
|
|
31
|
+
export const SEVERITY = {
|
|
32
|
+
DEBUG: 5,
|
|
33
|
+
INFO: 9,
|
|
34
|
+
WARN: 13,
|
|
35
|
+
ERROR: 17,
|
|
36
|
+
};
|
|
37
|
+
const SEVERITY_TEXT = {
|
|
38
|
+
[SEVERITY.DEBUG]: "DEBUG",
|
|
39
|
+
[SEVERITY.INFO]: "INFO",
|
|
40
|
+
[SEVERITY.WARN]: "WARN",
|
|
41
|
+
[SEVERITY.ERROR]: "ERROR",
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Longest body we will ship, in characters.
|
|
45
|
+
*
|
|
46
|
+
* An agent turn can produce a message with an entire file pasted into it. That
|
|
47
|
+
* is real data and we do not drop the record — but a megabyte of it per line
|
|
48
|
+
* will get the batch rejected by the collector's payload limit, taking the
|
|
49
|
+
* *other* records in the batch down with it. Cut it and say so in the body, so
|
|
50
|
+
* a reader can tell "this is all of it" from "there was more".
|
|
51
|
+
*/
|
|
52
|
+
const MAX_BODY_CHARS = 8192;
|
|
53
|
+
/**
|
|
54
|
+
* A LoomEvent → the log record it should produce, or null for kinds that carry
|
|
55
|
+
* nothing a human would read.
|
|
56
|
+
*
|
|
57
|
+
* Pure, and exported so the mapping (and especially the severity mapping) is
|
|
58
|
+
* testable without a collector — same arrangement as `eventToSpan`.
|
|
59
|
+
*/
|
|
60
|
+
export function eventToLogRecord(event, ctx = {}) {
|
|
61
|
+
const p = event.payload ?? {};
|
|
62
|
+
const attributes = {
|
|
63
|
+
"loom.project": ctx.project,
|
|
64
|
+
"loom.chat": event.chat,
|
|
65
|
+
"loom.event.kind": event.kind,
|
|
66
|
+
"loom.event.id": event.id,
|
|
67
|
+
"gen_ai.agent.id": event.agentId,
|
|
68
|
+
};
|
|
69
|
+
const who = event.agentId || "loom";
|
|
70
|
+
switch (event.kind) {
|
|
71
|
+
case "message": {
|
|
72
|
+
const text = str(p.text);
|
|
73
|
+
if (!text)
|
|
74
|
+
return null;
|
|
75
|
+
// Reasoning is the model thinking out loud, not addressing anyone. Same
|
|
76
|
+
// severity, tagged so it can be filtered out of a "what did the agent
|
|
77
|
+
// say" view.
|
|
78
|
+
return rec(event, SEVERITY.INFO, text, { ...attributes, "loom.message.reasoning": p.reasoning === true });
|
|
79
|
+
}
|
|
80
|
+
case "tool_call": {
|
|
81
|
+
const tool = str(p.tool) || str(p.name) || "tool";
|
|
82
|
+
return rec(event, SEVERITY.INFO, `${who} called ${tool}${summarize(p.input ?? p.args ?? p.command)}`, {
|
|
83
|
+
...attributes,
|
|
84
|
+
"gen_ai.tool.name": tool,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
case "tool_result": {
|
|
88
|
+
const tool = str(p.tool) || str(p.name) || "tool";
|
|
89
|
+
const failed = p.error != null || p.isError === true || num(p.exitCode) === 1;
|
|
90
|
+
return rec(event, failed ? SEVERITY.WARN : SEVERITY.DEBUG, `${tool} returned${summarize(p.error ?? p.output ?? p.result)}`, { ...attributes, "gen_ai.tool.name": tool, "loom.tool.failed": failed });
|
|
91
|
+
}
|
|
92
|
+
case "file_edit": {
|
|
93
|
+
const path = str(p.path);
|
|
94
|
+
if (!path)
|
|
95
|
+
return null;
|
|
96
|
+
return rec(event, SEVERITY.INFO, `${who} edited ${path}`, {
|
|
97
|
+
...attributes,
|
|
98
|
+
"loom.file.path": path,
|
|
99
|
+
"loom.file.tool": str(p.tool) || undefined,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
case "decision": {
|
|
103
|
+
const text = str(p.text) || str(p.decision) || str(p.summary);
|
|
104
|
+
if (!text)
|
|
105
|
+
return null;
|
|
106
|
+
return rec(event, SEVERITY.INFO, `decision: ${text}`, {
|
|
107
|
+
...attributes,
|
|
108
|
+
"loom.decision.kind": str(p.kind) || undefined,
|
|
109
|
+
"loom.decision.confidence": num(p.confidence),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
case "handoff":
|
|
113
|
+
return rec(event, SEVERITY.INFO, `baton: ${str(p.from) || event.agentId || "?"} → ${str(p.to) || str(p.agent) || "?"}`, {
|
|
114
|
+
...attributes,
|
|
115
|
+
"loom.handoff.from": str(p.from) || event.agentId || undefined,
|
|
116
|
+
"loom.handoff.to": str(p.to) || str(p.agent) || undefined,
|
|
117
|
+
});
|
|
118
|
+
case "suggestion":
|
|
119
|
+
return rec(event, SEVERITY.INFO, `suggested handoff to ${str(p.to) || str(p.agent) || "?"}`, attributes);
|
|
120
|
+
// Blocked on a human. Not a failure, but nothing moves until someone looks.
|
|
121
|
+
case "needs_input":
|
|
122
|
+
return rec(event, SEVERITY.WARN, `${who} needs input: ${str(p.question)}`, attributes);
|
|
123
|
+
case "run_complete": {
|
|
124
|
+
const ms = num(p.durationMs) ?? 0;
|
|
125
|
+
const failed = p.error != null;
|
|
126
|
+
return rec(event, failed ? SEVERITY.ERROR : SEVERITY.INFO, failed ? `${who} turn failed after ${ms}ms: ${str(p.error)}` : `${who} completed a turn in ${ms}ms`, {
|
|
127
|
+
...attributes,
|
|
128
|
+
"gen_ai.request.model": str(p.model) || undefined,
|
|
129
|
+
"gen_ai.system": str(p.adapter) || undefined,
|
|
130
|
+
"loom.turn.duration_ms": ms,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
case "route_started":
|
|
134
|
+
case "route_step":
|
|
135
|
+
case "route_paused":
|
|
136
|
+
case "route_resumed":
|
|
137
|
+
case "route_completed":
|
|
138
|
+
case "route_failed": {
|
|
139
|
+
const phase = event.kind.slice("route_".length);
|
|
140
|
+
const routeId = str(p.routeId) || str(p.id);
|
|
141
|
+
const failed = event.kind === "route_failed";
|
|
142
|
+
return rec(event, failed ? SEVERITY.ERROR : event.kind === "route_paused" ? SEVERITY.WARN : SEVERITY.INFO, `route ${routeId || "?"} ${phase}${failed ? `: ${str(p.error) || "route failed"}` : summarize(p.step ?? p.agent)}`, { ...attributes, "loom.route.id": routeId || undefined, "loom.route.phase": phase });
|
|
143
|
+
}
|
|
144
|
+
case "memory_add":
|
|
145
|
+
case "memory_update":
|
|
146
|
+
case "memory_forget": {
|
|
147
|
+
const op = event.kind.slice("memory_".length);
|
|
148
|
+
return rec(event, SEVERITY.INFO, `memory ${op}: ${str(p.text) || str(p.key) || str(p.kind)}`, {
|
|
149
|
+
...attributes,
|
|
150
|
+
"loom.memory.op": op,
|
|
151
|
+
"loom.memory.scope": str(p.scope) || undefined,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
case "error":
|
|
155
|
+
return rec(event, SEVERITY.ERROR, str(p.message) || "error", {
|
|
156
|
+
...attributes,
|
|
157
|
+
"loom.error.detail": str(p.stderr) || str(p.detail) || undefined,
|
|
158
|
+
});
|
|
159
|
+
case "status": {
|
|
160
|
+
const state = str(p.state);
|
|
161
|
+
// The budget guard's two states are the reason status isn't all DEBUG: a
|
|
162
|
+
// paused agent is the single most confusing thing to debug from the
|
|
163
|
+
// outside ("why did nothing happen?"), and it deserves to be visible at
|
|
164
|
+
// WARN next to the turns that didn't run.
|
|
165
|
+
if (state === "budget_exceeded") {
|
|
166
|
+
return rec(event, SEVERITY.WARN, `${who} paused — spent $${fixed(p.spentTodayUsd)} against a $${fixed(p.budgetUsd)}/day budget`, {
|
|
167
|
+
...attributes,
|
|
168
|
+
"loom.status.state": state,
|
|
169
|
+
"loom.budget.usd": num(p.budgetUsd),
|
|
170
|
+
"loom.budget.spent_today_usd": num(p.spentTodayUsd),
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (state === "budget_recovered") {
|
|
174
|
+
return rec(event, SEVERITY.INFO, `${who} back under budget — pause lifted`, {
|
|
175
|
+
...attributes,
|
|
176
|
+
"loom.status.state": state,
|
|
177
|
+
"loom.budget.paused_ms": num(p.pausedMs),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
if (!state)
|
|
181
|
+
return null;
|
|
182
|
+
return rec(event, SEVERITY.DEBUG, `${who}: ${state}`, { ...attributes, "loom.status.state": state });
|
|
183
|
+
}
|
|
184
|
+
default:
|
|
185
|
+
// agent_join / role_change / turn_diff / memory_import and friends: real
|
|
186
|
+
// events, but with no body worth a line of their own. They are already on
|
|
187
|
+
// the span side; adding a "something happened" log record would only pad
|
|
188
|
+
// the log volume.
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function rec(event, severityNumber, body, attributes) {
|
|
193
|
+
return {
|
|
194
|
+
timeUnixNano: BigInt(Math.max(0, Math.round(event.ts))) * 1000000n,
|
|
195
|
+
severityNumber,
|
|
196
|
+
body: truncate(body),
|
|
197
|
+
attributes,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/** Cut an over-long body and say by how much, rather than lying about length. */
|
|
201
|
+
export function truncate(body, max = MAX_BODY_CHARS) {
|
|
202
|
+
if (body.length <= max)
|
|
203
|
+
return body;
|
|
204
|
+
return `${body.slice(0, max)}… [truncated ${body.length - max} chars]`;
|
|
205
|
+
}
|
|
206
|
+
/** A short parenthetical for a payload field, or nothing when there isn't one. */
|
|
207
|
+
function summarize(v) {
|
|
208
|
+
const s = typeof v === "string" ? v : v == null ? "" : JSON.stringify(v);
|
|
209
|
+
if (!s)
|
|
210
|
+
return "";
|
|
211
|
+
return `: ${s.length > 200 ? `${s.slice(0, 200)}…` : s}`;
|
|
212
|
+
}
|
|
213
|
+
function fixed(v) {
|
|
214
|
+
const n = Number(v);
|
|
215
|
+
return Number.isFinite(n) ? n.toFixed(2) : "?";
|
|
216
|
+
}
|
|
217
|
+
function num(v) {
|
|
218
|
+
const n = Number(v);
|
|
219
|
+
return Number.isFinite(n) ? n : undefined;
|
|
220
|
+
}
|
|
221
|
+
function str(v) {
|
|
222
|
+
return typeof v === "string" ? v : v == null ? "" : String(v);
|
|
223
|
+
}
|
|
224
|
+
/** Buffered OTLP log exporter. Mirrors LoomTelemetry's batching exactly. */
|
|
225
|
+
export class LoomLogs {
|
|
226
|
+
cfg;
|
|
227
|
+
buffer = [];
|
|
228
|
+
timer = null;
|
|
229
|
+
logsUrl;
|
|
230
|
+
resource;
|
|
231
|
+
constructor(cfg) {
|
|
232
|
+
this.cfg = cfg;
|
|
233
|
+
this.logsUrl = `${cfg.endpoint}/v1/logs`;
|
|
234
|
+
this.resource = resourceAttributes(cfg);
|
|
235
|
+
}
|
|
236
|
+
get enabled() {
|
|
237
|
+
return this.cfg.logsEnabled && typeof globalThis.fetch === "function";
|
|
238
|
+
}
|
|
239
|
+
/** Buffer one record. No-op when logs are disabled. */
|
|
240
|
+
log(input) {
|
|
241
|
+
if (!this.enabled)
|
|
242
|
+
return;
|
|
243
|
+
const ts = input.timeUnixNano.toString();
|
|
244
|
+
this.buffer.push({
|
|
245
|
+
timeUnixNano: ts,
|
|
246
|
+
// When the event happened vs. when we saw it. Identical here — Loom
|
|
247
|
+
// observes its own events synchronously — but the field is required for
|
|
248
|
+
// a backend to order records, and omitting it makes it fall back to ingest
|
|
249
|
+
// time, which reorders a burst of turn output arbitrarily.
|
|
250
|
+
observedTimeUnixNano: ts,
|
|
251
|
+
severityNumber: input.severityNumber,
|
|
252
|
+
severityText: SEVERITY_TEXT[input.severityNumber] ?? "INFO",
|
|
253
|
+
body: { stringValue: input.body },
|
|
254
|
+
attributes: encodeAttributes(input.attributes),
|
|
255
|
+
...(input.traceId ? { traceId: input.traceId } : {}),
|
|
256
|
+
...(input.spanId ? { spanId: input.spanId } : {}),
|
|
257
|
+
});
|
|
258
|
+
if (this.buffer.length >= 64)
|
|
259
|
+
this.drain();
|
|
260
|
+
else
|
|
261
|
+
this.ensureTimer();
|
|
262
|
+
}
|
|
263
|
+
ensureTimer() {
|
|
264
|
+
if (this.timer)
|
|
265
|
+
return;
|
|
266
|
+
this.timer = setTimeout(() => {
|
|
267
|
+
this.timer = null;
|
|
268
|
+
this.drain();
|
|
269
|
+
}, 1500);
|
|
270
|
+
if (typeof this.timer.unref === "function")
|
|
271
|
+
this.timer.unref();
|
|
272
|
+
}
|
|
273
|
+
drain() {
|
|
274
|
+
if (this.buffer.length === 0)
|
|
275
|
+
return;
|
|
276
|
+
const logRecords = this.buffer;
|
|
277
|
+
this.buffer = [];
|
|
278
|
+
postOtlp(this.logsUrl, this.cfg.headers, {
|
|
279
|
+
resourceLogs: [
|
|
280
|
+
{
|
|
281
|
+
resource: { attributes: this.resource },
|
|
282
|
+
scopeLogs: [{ scope: { name: "loom" }, logRecords }],
|
|
283
|
+
},
|
|
284
|
+
],
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
flush() {
|
|
288
|
+
if (this.timer) {
|
|
289
|
+
clearTimeout(this.timer);
|
|
290
|
+
this.timer = null;
|
|
291
|
+
}
|
|
292
|
+
this.drain();
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/observability/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loom → OpenTelemetry metrics (OTLP/HTTP JSON, `/v1/metrics`).
|
|
3
|
+
*
|
|
4
|
+
* Same shape as the trace exporter next door: aggregate in memory, flush on a
|
|
5
|
+
* short timer, POST, never throw. What differs is that a metric is a fold, not
|
|
6
|
+
* an event — several turns collapse into one datapoint — so this holds a small
|
|
7
|
+
* aggregation table keyed by metric name + attribute set instead of a list.
|
|
8
|
+
*
|
|
9
|
+
* Every number here is derived from a LoomEvent that actually happened. There
|
|
10
|
+
* is no periodic "emit 0 so the chart has a line" path, because a flat zero and
|
|
11
|
+
* "nothing happened" look identical on a graph and only one of them is true.
|
|
12
|
+
*
|
|
13
|
+
* ── Naming ──────────────────────────────────────────────────────────────────
|
|
14
|
+
* `gen_ai.*` names and attributes follow the OpenTelemetry GenAI semantic
|
|
15
|
+
* conventions (semantic-conventions-genai, the GenAI metrics doc split out of
|
|
16
|
+
* the main semconv repo): `gen_ai.client.token.usage` with a
|
|
17
|
+
* `gen_ai.token.type` of `input`/`output`, `gen_ai.client.operation.duration`
|
|
18
|
+
* in seconds, dimensioned by `gen_ai.operation.name`, `gen_ai.system` and
|
|
19
|
+
* `gen_ai.request.model`. `loom.*` names are ours — nothing in the convention
|
|
20
|
+
* covers batons, routes or a per-agent daily spend cap — and follow its style.
|
|
21
|
+
*
|
|
22
|
+
* One deliberate deviation: the convention models `gen_ai.client.token.usage`
|
|
23
|
+
* as a *histogram* (a distribution of tokens-per-request). Loom emits it as a
|
|
24
|
+
* monotonic sum. A histogram earns its keep when you want percentiles over many
|
|
25
|
+
* requests; Loom reports exactly one input/output pair per turn, and what
|
|
26
|
+
* anyone asks this data is "how many tokens did this agent burn today" — a sum
|
|
27
|
+
* answers that exactly, and a histogram's `sum` field only approximates it once
|
|
28
|
+
* you start dropping buckets. `gen_ai.client.operation.duration` stays a
|
|
29
|
+
* histogram, as specified, because turn latency genuinely is a distribution.
|
|
30
|
+
*
|
|
31
|
+
* ── Temporality ─────────────────────────────────────────────────────────────
|
|
32
|
+
* Delta, everywhere (AGGREGATION_TEMPORALITY_DELTA). Cumulative asks the
|
|
33
|
+
* *client* to remember every counter's running total for the life of the
|
|
34
|
+
* process and expects the backend to detect resets. Loom's daemon restarts
|
|
35
|
+
* whenever you edit a config or upgrade the CLI, so cumulative would mean a
|
|
36
|
+
* counter reset every few minutes — the exact case cumulative handles worst.
|
|
37
|
+
* Delta makes each export self-contained: what happened since the last flush,
|
|
38
|
+
* nothing remembered, nothing to reset. Collectors accept both.
|
|
39
|
+
*/
|
|
40
|
+
import { type AttrValue, type TelemetryConfig } from "./otlp.js";
|
|
41
|
+
export type MetricAttributes = Record<string, AttrValue>;
|
|
42
|
+
export declare class LoomMetrics {
|
|
43
|
+
private readonly cfg;
|
|
44
|
+
private series;
|
|
45
|
+
private timer;
|
|
46
|
+
private readonly metricsUrl;
|
|
47
|
+
private readonly resource;
|
|
48
|
+
/**
|
|
49
|
+
* Start of the current delta window. A delta datapoint's
|
|
50
|
+
* `startTimeUnixNano`..`timeUnixNano` must bracket exactly the interval the
|
|
51
|
+
* value accumulated over, and consecutive windows must not overlap — so this
|
|
52
|
+
* advances to the previous flush's end rather than being re-read from the
|
|
53
|
+
* clock each time.
|
|
54
|
+
*/
|
|
55
|
+
private windowStartNs;
|
|
56
|
+
constructor(cfg: TelemetryConfig);
|
|
57
|
+
get enabled(): boolean;
|
|
58
|
+
/** Add to a monotonic counter. Negative or non-finite deltas are ignored. */
|
|
59
|
+
addCount(name: string, value: number, attributes: MetricAttributes, isInt?: boolean): void;
|
|
60
|
+
/** Record one observation into a histogram. */
|
|
61
|
+
record(name: string, value: number, attributes: MetricAttributes, bounds?: number[]): void;
|
|
62
|
+
/** Observe a gauge's current value, as of now. */
|
|
63
|
+
setGauge(name: string, value: number, attributes?: MetricAttributes): void;
|
|
64
|
+
flush(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Build the OTLP payload for everything accumulated so far and clear the
|
|
67
|
+
* window. Exported for tests: asserting on the JSON we would send beats
|
|
68
|
+
* asserting on a mocked fetch, and the payload shape is the part a collector
|
|
69
|
+
* actually rejects.
|
|
70
|
+
*/
|
|
71
|
+
collect(nowOverrideNs?: bigint): Record<string, unknown> | null;
|
|
72
|
+
private bag;
|
|
73
|
+
/**
|
|
74
|
+
* Refuse to open a new series past the cap.
|
|
75
|
+
*
|
|
76
|
+
* Metric attributes come from agent ids and model names, which are bounded in
|
|
77
|
+
* practice — but a misbehaving adapter reporting a unique model string per
|
|
78
|
+
* turn would otherwise turn this map into an unbounded leak and the backend's
|
|
79
|
+
* index into a mess. Dropping the *new* series keeps the ones already being
|
|
80
|
+
* measured intact and correct; the alternative (evicting) would silently
|
|
81
|
+
* discard counts that were already recorded.
|
|
82
|
+
*/
|
|
83
|
+
private guardCardinality;
|
|
84
|
+
private ensureTimer;
|
|
85
|
+
private drain;
|
|
86
|
+
}
|