@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,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proof — is "done" true? (the "Proof Pack")
|
|
3
|
+
*
|
|
4
|
+
* Agents say "all tests pass" when three of fourteen ran, or when none did.
|
|
5
|
+
* Proof reads what an agent *claimed* at the end of a turn, what it actually
|
|
6
|
+
* *ran* during it (the shell tool calls and their exit codes, already in the
|
|
7
|
+
* log), and — the part no vendor does for itself — what happens when Loom runs
|
|
8
|
+
* the project's tests again in a clean checkout of the agent's changes. The
|
|
9
|
+
* verdict is one of:
|
|
10
|
+
*
|
|
11
|
+
* verified the re-run passes, and nothing the agent claimed contradicts it
|
|
12
|
+
* contradicted the re-run fails, or a claim doesn't match what happened
|
|
13
|
+
* (it said 14 pass and 11 did; it said tests pass and never ran any)
|
|
14
|
+
* unverified nothing to check against (no test command, no claims)
|
|
15
|
+
*
|
|
16
|
+
* This file is pure: claims, evidence, counts, the verdict. Running the tests
|
|
17
|
+
* in a clean worktree is the daemon's (daemon/proof.ts).
|
|
18
|
+
*/
|
|
19
|
+
import fs from "node:fs";
|
|
20
|
+
import path from "node:path";
|
|
21
|
+
// ── claims ──
|
|
22
|
+
const NUM = String.raw `(\d{1,6})`;
|
|
23
|
+
const CLAIM_PATTERNS = [
|
|
24
|
+
{ kind: "tests", re: new RegExp(String.raw `\b(?:all\s+)?${NUM}?\s*(?:/\s*${NUM}\s*)?(?:unit\s+|e2e\s+|integration\s+)?(?:tests?|specs?|test cases?)\b[^.\n]{0,40}?\b(?:pass(?:es|ed|ing)?|green|succeed(?:s|ed)?|ok)\b`, "i") },
|
|
25
|
+
{ kind: "tests", re: /\b(?:all\s+)?(?:the\s+)?tests?\s+(?:are\s+|now\s+)*(?:pass(?:es|ed|ing)?|green)\b/i },
|
|
26
|
+
{ kind: "tests", re: new RegExp(String.raw `\b${NUM}\s+passed\b`, "i") },
|
|
27
|
+
{ kind: "build", re: /\b(?:the\s+)?build\s+(?:now\s+)?(?:pass(?:es|ed)?|succeed(?:s|ed)?|is\s+green|works|compiles)\b|\bbuilds?\s+(?:cleanly|successfully)\b/i },
|
|
28
|
+
{ kind: "typecheck", re: /\b(?:type[- ]?check(?:s|ing)?|tsc|types)\s+(?:(?:is|are)\s+)?(?:now\s+)?(?:pass(?:es|ed)?|clean|green|succeed(?:s|ed)?)\b|\bno\s+type\s+errors\b/i },
|
|
29
|
+
{ kind: "lint", re: /\b(?:lint(?:ing|er)?|eslint|ruff|clippy)\s+(?:(?:is|are)\s+)?(?:now\s+)?(?:pass(?:es|ed)?|clean|green)\b|\bno\s+lint\s+(?:errors|warnings)\b/i },
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Sentences that only *talk about* tests claim nothing: a hope or a condition
|
|
33
|
+
* ("should pass once CI…", "if the tests pass"), a negation ("haven't run"),
|
|
34
|
+
* an instruction ("Run the tests to check").
|
|
35
|
+
*/
|
|
36
|
+
const HEDGE = /\b(?:should|would|could|might|may|will|once|until|if|unless|hopefully|expect(?:ed|s)?|to make sure|to verify|to confirm|supposed to)\b/i;
|
|
37
|
+
const NEGATED = /\b(?:not|never|no longer|not yet|haven'?t|hasn'?t|didn'?t|don'?t|doesn'?t|couldn'?t|can'?t|cannot|won'?t|unable|without)\b/i;
|
|
38
|
+
const INSTRUCTION = /^(?:please\s+)?(?:run|try|make sure|check|verify|ensure)\b/i;
|
|
39
|
+
/** What a turn's final message says is true. One claim per kind (the strongest sentence). */
|
|
40
|
+
export function extractClaims(text) {
|
|
41
|
+
const out = new Map();
|
|
42
|
+
const prose = text.replace(/```[\s\S]*?```/g, " "); // code blocks show commands and output, not claims
|
|
43
|
+
for (const raw of prose.split(/(?<=[.!?])\s+|\n+/)) {
|
|
44
|
+
const sentence = raw.replace(/^[\s>*\-•✅✓☑️]+/, "").trim();
|
|
45
|
+
if (!sentence || sentence.length > 400)
|
|
46
|
+
continue;
|
|
47
|
+
for (const { kind, re } of CLAIM_PATTERNS) {
|
|
48
|
+
const m = re.exec(sentence);
|
|
49
|
+
if (!m)
|
|
50
|
+
continue;
|
|
51
|
+
if (HEDGE.test(sentence) || NEGATED.test(sentence) || INSTRUCTION.test(sentence))
|
|
52
|
+
continue;
|
|
53
|
+
if (/\b(?:fail(?:s|ed|ing|ures?)?|broken|red)\b/i.test(sentence) && !/\b0\s+fail/i.test(sentence))
|
|
54
|
+
continue;
|
|
55
|
+
const nums = m.slice(1).filter((x) => x !== undefined).map(Number);
|
|
56
|
+
const claim = { kind, text: sentence.slice(0, 240) };
|
|
57
|
+
if (kind === "tests" && nums.length) {
|
|
58
|
+
claim.passed = nums[0];
|
|
59
|
+
if (nums.length > 1)
|
|
60
|
+
claim.total = nums[1];
|
|
61
|
+
}
|
|
62
|
+
const prev = out.get(kind);
|
|
63
|
+
if (!prev || (claim.passed !== undefined && prev.passed === undefined))
|
|
64
|
+
out.set(kind, claim);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return [...out.values()];
|
|
68
|
+
}
|
|
69
|
+
// ── what ran ──
|
|
70
|
+
const KIND_OF = [
|
|
71
|
+
{ kind: "typecheck", re: /\b(?:tsc\b(?!.*--build)|vue-tsc|mypy|pyright|typecheck|type-check|check-types)\b/i },
|
|
72
|
+
{ kind: "lint", re: /\b(?:eslint|lint|ruff\s+check|flake8|pylint|clippy|golangci-lint|biome\s+(?:check|lint))\b/i },
|
|
73
|
+
{ kind: "tests", re: /\b(?:test|tests|vitest|jest|mocha|ava|pytest|py\.test|unittest|rspec|phpunit|go\s+test|cargo\s+test|cargo\s+nextest|dotnet\s+test|mvn\s+test|gradle\w*\s+test|swift\s+test|bun\s+test|deno\s+test|node\s+--test|playwright\s+test|cypress\s+run)\b/i },
|
|
74
|
+
{ kind: "build", re: /\b(?:build|compile|cargo\s+build|go\s+build|tsc\s+--build|make\b|webpack|vite\s+build|next\s+build|gradle\w*\s+assemble)\b/i },
|
|
75
|
+
];
|
|
76
|
+
export function commandKind(command) {
|
|
77
|
+
for (const { kind, re } of KIND_OF)
|
|
78
|
+
if (re.test(command))
|
|
79
|
+
return kind;
|
|
80
|
+
return "other";
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Pass/fail counts from a test runner's output: vitest, jest, mocha, node:test,
|
|
84
|
+
* pytest, go test, cargo test, rspec, phpunit. Null when it can't tell.
|
|
85
|
+
*/
|
|
86
|
+
export function parseCounts(output) {
|
|
87
|
+
const o = output.replace(/\x1b\[[0-9;]*m/g, "");
|
|
88
|
+
let m;
|
|
89
|
+
// vitest: "Tests 1 failed | 12 passed | 2 skipped (15)"
|
|
90
|
+
if ((m = /Tests\s+((?:\d+\s+\w+\s*\|?\s*)+)\((\d+)\)/.exec(o))) {
|
|
91
|
+
const part = (w) => Number(new RegExp(String.raw `(\d+)\s+${w}`).exec(m[1])?.[1] ?? 0);
|
|
92
|
+
return { passed: part("passed"), failed: part("failed"), skipped: part("skipped"), total: Number(m[2]) };
|
|
93
|
+
}
|
|
94
|
+
// jest: "Tests: 1 failed, 12 passed, 13 total"
|
|
95
|
+
if ((m = /Tests:\s+(.*?)(\d+)\s+total/.exec(o))) {
|
|
96
|
+
const part = (w) => Number(new RegExp(String.raw `(\d+)\s+${w}`).exec(m[1])?.[1] ?? 0);
|
|
97
|
+
return { passed: part("passed"), failed: part("failed"), skipped: part("skipped"), total: Number(m[2]) };
|
|
98
|
+
}
|
|
99
|
+
// node:test: "# pass 12" / "# fail 1" (also "ℹ pass 12")
|
|
100
|
+
if (/(?:#|ℹ)\s+pass\s+\d+/.test(o)) {
|
|
101
|
+
const n = (w) => Number(new RegExp(String.raw `(?:#|ℹ)\s+${w}\s+(\d+)`).exec(o)?.[1] ?? 0);
|
|
102
|
+
return { passed: n("pass"), failed: n("fail"), skipped: n("skipped"), total: n("tests") || undefined };
|
|
103
|
+
}
|
|
104
|
+
// pytest: "=== 3 passed, 1 failed, 2 skipped in 0.12s ==="
|
|
105
|
+
if ((m = /=+\s*((?:\d+\s+\w+(?:,\s*)?)+)\s+in\s+[\d.]+s/.exec(o))) {
|
|
106
|
+
const part = (w) => Number(new RegExp(String.raw `(\d+)\s+${w}`).exec(m[1])?.[1] ?? 0);
|
|
107
|
+
return { passed: part("passed"), failed: part("failed") + part("error"), skipped: part("skipped") };
|
|
108
|
+
}
|
|
109
|
+
// cargo: "test result: ok. 5 passed; 0 failed; 1 ignored"
|
|
110
|
+
if ((m = /test result: \w+\. (\d+) passed; (\d+) failed(?:; (\d+) ignored)?/.exec(o))) {
|
|
111
|
+
return { passed: Number(m[1]), failed: Number(m[2]), skipped: Number(m[3] ?? 0) };
|
|
112
|
+
}
|
|
113
|
+
// mocha: "12 passing" / "1 failing"
|
|
114
|
+
if ((m = /(\d+)\s+passing\b/.exec(o))) {
|
|
115
|
+
return { passed: Number(m[1]), failed: Number(/(\d+)\s+failing\b/.exec(o)?.[1] ?? 0), skipped: Number(/(\d+)\s+pending\b/.exec(o)?.[1] ?? 0) };
|
|
116
|
+
}
|
|
117
|
+
// rspec: "14 examples, 1 failure"
|
|
118
|
+
if ((m = /(\d+)\s+examples?,\s+(\d+)\s+failures?/.exec(o)))
|
|
119
|
+
return { passed: Number(m[1]) - Number(m[2]), failed: Number(m[2]), total: Number(m[1]) };
|
|
120
|
+
// phpunit: "OK (12 tests, 30 assertions)" / "Tests: 12, Assertions: 30, Failures: 1."
|
|
121
|
+
if ((m = /OK \((\d+) tests?/.exec(o)))
|
|
122
|
+
return { passed: Number(m[1]), failed: 0, total: Number(m[1]) };
|
|
123
|
+
if ((m = /Tests: (\d+), Assertions: \d+(?:, Errors: (\d+))?(?:, Failures: (\d+))?/.exec(o))) {
|
|
124
|
+
const failed = Number(m[2] ?? 0) + Number(m[3] ?? 0);
|
|
125
|
+
return { passed: Number(m[1]) - failed, failed, total: Number(m[1]) };
|
|
126
|
+
}
|
|
127
|
+
// go: count "--- PASS" / "--- FAIL" lines, else a bare ok/FAIL package summary
|
|
128
|
+
const goPass = (o.match(/^\s*--- PASS:/gm) ?? []).length, goFail = (o.match(/^\s*--- FAIL:/gm) ?? []).length;
|
|
129
|
+
if (goPass || goFail)
|
|
130
|
+
return { passed: goPass, failed: goFail };
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
/** The commands a turn ran, from its tool_call events. */
|
|
134
|
+
export function evidenceFrom(events) {
|
|
135
|
+
const out = [];
|
|
136
|
+
for (const e of events) {
|
|
137
|
+
if (e.kind !== "tool_call")
|
|
138
|
+
continue;
|
|
139
|
+
const p = e.payload;
|
|
140
|
+
const command = typeof p.command === "string" ? p.command
|
|
141
|
+
: String(p.tool ?? "").toLowerCase() === "shell" || String(p.tool ?? "").toLowerCase() === "bash"
|
|
142
|
+
? String(p.input?.command ?? p.summary ?? "").replace(/^shell:\s*/, "") : "";
|
|
143
|
+
if (!command.trim())
|
|
144
|
+
continue;
|
|
145
|
+
const exitCode = typeof p.exitCode === "number" ? p.exitCode : null;
|
|
146
|
+
const output = [p.output, p.preview].filter((x) => typeof x === "string").join("\n");
|
|
147
|
+
const counts = output ? parseCounts(output) : null;
|
|
148
|
+
const ok = exitCode !== null ? exitCode === 0 : p.ok !== false && !(counts && counts.failed > 0);
|
|
149
|
+
out.push({ command: command.slice(0, 500), kind: commandKind(command), exitCode, ok, ...(counts ? { counts } : {}), eventId: e.id });
|
|
150
|
+
}
|
|
151
|
+
return out;
|
|
152
|
+
}
|
|
153
|
+
// ── the project's test command ──
|
|
154
|
+
/** The command that tests this project, from what it declares. Null when it declares nothing runnable. */
|
|
155
|
+
export function detectTestCommand(dir) {
|
|
156
|
+
const has = (f) => fs.existsSync(path.join(dir, f));
|
|
157
|
+
if (has("package.json")) {
|
|
158
|
+
try {
|
|
159
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(dir, "package.json"), "utf8"));
|
|
160
|
+
const test = pkg.scripts?.test;
|
|
161
|
+
if (test && !/no test specified/i.test(test)) {
|
|
162
|
+
const runner = has("pnpm-lock.yaml") ? "pnpm" : has("yarn.lock") ? "yarn" : has("bun.lockb") || has("bun.lock") ? "bun" : "npm";
|
|
163
|
+
return runner === "npm" ? "npm test" : `${runner} test`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch { /* a package.json we can't read declares nothing */ }
|
|
167
|
+
}
|
|
168
|
+
if (has("Cargo.toml"))
|
|
169
|
+
return "cargo test";
|
|
170
|
+
if (has("go.mod"))
|
|
171
|
+
return "go test ./...";
|
|
172
|
+
if (has("pytest.ini") || has("conftest.py") || (has("pyproject.toml") && /\[tool\.pytest/.test(fs.readFileSync(path.join(dir, "pyproject.toml"), "utf8"))))
|
|
173
|
+
return "python -m pytest -q";
|
|
174
|
+
if (has("Makefile") && /^test:/m.test(fs.readFileSync(path.join(dir, "Makefile"), "utf8")))
|
|
175
|
+
return "make test";
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
// ── the verdict ──
|
|
179
|
+
/** Weigh what was claimed against what ran and what the clean re-run showed. */
|
|
180
|
+
export function judge(claims, ran, rerun) {
|
|
181
|
+
const checks = claims.map((c) => {
|
|
182
|
+
const same = ran.filter((r) => r.kind === c.kind);
|
|
183
|
+
const last = same.at(-1);
|
|
184
|
+
if (c.kind === "tests" && rerun) {
|
|
185
|
+
if (!rerun.ok)
|
|
186
|
+
return { ...c, status: "contradicted", why: `the tests fail in a clean checkout${rerun.counts ? ` (${rerun.counts.failed} failed)` : ""}` };
|
|
187
|
+
if (c.passed !== undefined && rerun.counts && rerun.counts.passed < c.passed)
|
|
188
|
+
return { ...c, status: "contradicted", why: `said ${c.passed} pass; ${rerun.counts.passed} did` };
|
|
189
|
+
return { ...c, status: "supported", why: rerun.counts ? `${rerun.counts.passed} passed in a clean checkout` : "the tests pass in a clean checkout" };
|
|
190
|
+
}
|
|
191
|
+
if (!last)
|
|
192
|
+
return { ...c, status: "contradicted", why: `no ${c.kind === "tests" ? "test" : c.kind} command ran this turn` };
|
|
193
|
+
if (!last.ok)
|
|
194
|
+
return { ...c, status: "contradicted", why: `the last ${c.kind} command failed${last.exitCode !== null ? ` (exit ${last.exitCode})` : ""}: ${last.command.slice(0, 80)}` };
|
|
195
|
+
if (c.kind === "tests" && c.passed !== undefined && last.counts && last.counts.passed < c.passed)
|
|
196
|
+
return { ...c, status: "contradicted", why: `said ${c.passed} pass; the run showed ${last.counts.passed}` };
|
|
197
|
+
return { ...c, status: "supported", why: `${last.command.slice(0, 80)} succeeded` };
|
|
198
|
+
});
|
|
199
|
+
const contradicted = checks.filter((c) => c.status === "contradicted");
|
|
200
|
+
let verdict;
|
|
201
|
+
if (contradicted.length || (rerun && !rerun.ok))
|
|
202
|
+
verdict = "contradicted";
|
|
203
|
+
else if (rerun?.ok)
|
|
204
|
+
verdict = "verified";
|
|
205
|
+
else if (checks.length && checks.every((c) => c.status === "supported"))
|
|
206
|
+
verdict = "verified";
|
|
207
|
+
else
|
|
208
|
+
verdict = "unverified";
|
|
209
|
+
const headline = verdict === "contradicted"
|
|
210
|
+
? contradicted[0] ? `Claimed “${contradicted[0].text.slice(0, 60)}” — ${contradicted[0].why}` : `The tests fail in a clean checkout${rerun?.counts ? `: ${rerun.counts.failed} failed` : ""}`
|
|
211
|
+
: verdict === "verified"
|
|
212
|
+
? rerun?.ok ? `Verified: ${rerun.counts ? `${rerun.counts.passed} tests pass` : "the tests pass"} in a clean checkout` : "Verified against the commands it ran"
|
|
213
|
+
: rerun === null && !claims.length ? "Nothing to verify: no claims and no test command" : "Unverified: no test command to check it against";
|
|
214
|
+
return { verdict, headline, claims: checks, ran, rerun };
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=proof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof.js","sourceRoot":"","sources":["../../src/core/proof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AA4D7B,eAAe;AAEf,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA,WAAW,CAAC;AAClC,MAAM,cAAc,GAA2C;IAC7D,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,gBAAgB,GAAG,cAAc,GAAG,yIAAyI,EAAE,GAAG,CAAC,EAAE;IAC/N,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,oFAAoF,EAAE;IAC3G,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,KAAK,GAAG,aAAa,EAAE,GAAG,CAAC,EAAE;IACvE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,yIAAyI,EAAE;IAChK,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,mJAAmJ,EAAE;IAC9K,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,+IAA+I,EAAE;CACtK,CAAC;AAEF;;;;GAIG;AACH,MAAM,KAAK,GAAG,yIAAyI,CAAC;AACxJ,MAAM,OAAO,GAAG,6HAA6H,CAAC;AAC9I,MAAM,WAAW,GAAG,6DAA6D,CAAC;AAElF,6FAA6F;AAC7F,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,CAAC,mDAAmD;IACvG,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG;YAAE,SAAS;QACjD,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,cAAc,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC3F,IAAI,6CAA6C,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAC5G,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACnE,MAAM,KAAK,GAAU,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC5D,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACvB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/F,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,iBAAiB;AAEjB,MAAM,OAAO,GAA2C;IACtD,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,mFAAmF,EAAE;IAC9G,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,6FAA6F,EAAE;IACnH,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,qPAAqP,EAAE;IAC5Q,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,6HAA6H,EAAE;CACrJ,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,OAAO;QAAE,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;IACtE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAyB,CAAC;IAC9B,yDAAyD;IACzD,IAAI,CAAC,CAAC,GAAG,4CAA4C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3G,CAAC;IACD,qDAAqD;IACrD,IAAI,CAAC,CAAC,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3G,CAAC;IACD,2DAA2D;IAC3D,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAClG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC;IACzG,CAAC;IACD,2DAA2D;IAC3D,IAAI,CAAC,CAAC,GAAG,+CAA+C,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAA,WAAW,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IACtG,CAAC;IACD,0DAA0D;IAC1D,IAAI,CAAC,CAAC,GAAG,mEAAmE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,oCAAoC;IACpC,IAAI,CAAC,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACjJ,CAAC;IACD,kCAAkC;IAClC,IAAI,CAAC,CAAC,GAAG,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtJ,sFAAsF;IACtF,IAAI,CAAC,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvG,IAAI,CAAC,CAAC,GAAG,yEAAyE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,+EAA+E;IAC/E,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC7G,IAAI,MAAM,IAAI,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,MAAmB;IAC9C,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QACrC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;QAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO;YACvD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM;gBAC/F,CAAC,CAAC,MAAM,CAAE,CAAC,CAAC,KAA6C,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1H,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAAE,SAAS;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClG,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,MAAM,EAAE,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjG,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvI,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mCAAmC;AAEnC,0GAA0G;AAC1G,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAyC,CAAC;YACxH,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;YAC/B,IAAI,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChI,OAAO,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,mDAAmD,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,CAAC;QAAE,OAAO,YAAY,CAAC;IAC3C,IAAI,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,eAAe,CAAC;IAC1C,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAAE,OAAO,qBAAqB,CAAC;IACzL,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC;IAC/G,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oBAAoB;AAEpB,gFAAgF;AAChF,MAAM,UAAU,KAAK,CAAC,MAAe,EAAE,GAAU,EAAE,KAAmB;IACpE,MAAM,MAAM,GAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,qCAAqC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;YAC3J,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;gBAC1E,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,CAAC,MAAM,MAAM,EAAE,CAAC;YACpG,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,6BAA6B,CAAC,CAAC,CAAC,oCAAoC,EAAE,CAAC;QACvJ,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,wBAAwB,EAAE,CAAC;QAC5H,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,IAAI,kBAAkB,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACzL,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;YAC9F,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM,yBAAyB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9G,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;IACvE,IAAI,OAAgB,CAAC;IACrB,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,GAAG,cAAc,CAAC;SACrE,IAAI,KAAK,EAAE,EAAE;QAAE,OAAO,GAAG,UAAU,CAAC;SACpC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC;QAAE,OAAO,GAAG,UAAU,CAAC;;QACzF,OAAO,GAAG,YAAY,CAAC;IAE5B,MAAM,QAAQ,GAAG,OAAO,KAAK,cAAc;QACzC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,qCAAqC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7L,CAAC,CAAC,OAAO,KAAK,UAAU;YACtB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,gBAAgB,sBAAsB,CAAC,CAAC,CAAC,sCAAsC;YAC/J,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,kDAAkD,CAAC,CAAC,CAAC,iDAAiD,CAAC;IAChJ,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One short completion from a configured provider (ollama, OpenRouter, …) —
|
|
3
|
+
* the non-Claude twin of claude-cli.ts's claudeText, for Loom's own small
|
|
4
|
+
* jobs (the memory extractor). `pool:free` takes the next few free models in
|
|
5
|
+
* the rotation, so a busy one doesn't fail the job, and stops at the daily cap.
|
|
6
|
+
*/
|
|
7
|
+
/** "ollama/qwen3:4b" → provider "ollama", model "qwen3:4b"; null when the prefix isn't a provider. */
|
|
8
|
+
export declare function providerModel(ref: string): {
|
|
9
|
+
provider: string;
|
|
10
|
+
model: string;
|
|
11
|
+
} | null;
|
|
12
|
+
export declare function providerText(ref: string, prompt: string, opts?: {
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
fetchImpl?: typeof fetch;
|
|
15
|
+
}): Promise<string>;
|
|
16
|
+
/**
|
|
17
|
+
* Loom's own small jobs (the memory extractor, LLM handoff briefs, the
|
|
18
|
+
* dynamic-route router) all come through here: a provider/model runs on that
|
|
19
|
+
* provider, anything else ("haiku", "sonnet") is a Claude alias.
|
|
20
|
+
*/
|
|
21
|
+
export declare function helperText(model: string, prompt: string, opts?: {
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One short completion from a configured provider (ollama, OpenRouter, …) —
|
|
3
|
+
* the non-Claude twin of claude-cli.ts's claudeText, for Loom's own small
|
|
4
|
+
* jobs (the memory extractor). `pool:free` takes the next few free models in
|
|
5
|
+
* the rotation, so a busy one doesn't fail the job, and stops at the daily cap.
|
|
6
|
+
*/
|
|
7
|
+
import { claudeText } from "./claude-cli.js";
|
|
8
|
+
import { countFreeRequest, freeModels, isDailyCap, isPool, noteCapped, resetAt, rest, rotation } from "./free-pool.js";
|
|
9
|
+
import { chatUrl, explainStatus, requestHeaders, resolveProvider } from "./providers.js";
|
|
10
|
+
/** "ollama/qwen3:4b" → provider "ollama", model "qwen3:4b"; null when the prefix isn't a provider. */
|
|
11
|
+
export function providerModel(ref) {
|
|
12
|
+
const i = ref.indexOf("/");
|
|
13
|
+
if (i <= 0)
|
|
14
|
+
return null;
|
|
15
|
+
const provider = ref.slice(0, i), model = ref.slice(i + 1);
|
|
16
|
+
return model && resolveProvider(provider) ? { provider, model } : null;
|
|
17
|
+
}
|
|
18
|
+
export async function providerText(ref, prompt, opts = {}) {
|
|
19
|
+
const pm = providerModel(ref);
|
|
20
|
+
if (!pm)
|
|
21
|
+
throw new Error(`${ref} isn't a configured provider/model`);
|
|
22
|
+
const p = resolveProvider(pm.provider);
|
|
23
|
+
const doFetch = opts.fetchImpl ?? fetch;
|
|
24
|
+
const candidates = isPool(pm.model) ? rotation(await freeModels(p, { fetchImpl: doFetch }), 3) : [pm.model];
|
|
25
|
+
if (!candidates.length)
|
|
26
|
+
throw new Error(`${p.label} has no free models to use`);
|
|
27
|
+
let last = "";
|
|
28
|
+
for (const model of candidates) {
|
|
29
|
+
const res = await doFetch(chatUrl(p), {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: requestHeaders(p),
|
|
32
|
+
body: JSON.stringify({ model, messages: [{ role: "user", content: prompt }], stream: false, temperature: 0 }),
|
|
33
|
+
signal: AbortSignal.timeout(opts.timeoutMs ?? 60_000),
|
|
34
|
+
});
|
|
35
|
+
if (p.free(model) || isPool(pm.model))
|
|
36
|
+
countFreeRequest();
|
|
37
|
+
if (res.ok) {
|
|
38
|
+
const body = (await res.json());
|
|
39
|
+
const text = body.choices?.[0]?.message?.content ?? "";
|
|
40
|
+
if (text.trim())
|
|
41
|
+
return text;
|
|
42
|
+
last = `${model} returned nothing`;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const raw = await res.text().catch(() => "");
|
|
46
|
+
if (isDailyCap(res.status, raw)) {
|
|
47
|
+
noteCapped(resetAt(res.headers));
|
|
48
|
+
throw new Error(explainStatus(res.status, raw, p));
|
|
49
|
+
}
|
|
50
|
+
last = explainStatus(res.status, raw, p);
|
|
51
|
+
if (res.status === 429)
|
|
52
|
+
rest(model);
|
|
53
|
+
if (!isPool(pm.model))
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
throw new Error(last || `${p.label} didn't answer`);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Loom's own small jobs (the memory extractor, LLM handoff briefs, the
|
|
60
|
+
* dynamic-route router) all come through here: a provider/model runs on that
|
|
61
|
+
* provider, anything else ("haiku", "sonnet") is a Claude alias.
|
|
62
|
+
*/
|
|
63
|
+
export function helperText(model, prompt, opts = {}) {
|
|
64
|
+
return providerModel(model) ? providerText(model, prompt, opts) : claudeText(prompt, { model, ...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}) });
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=provider-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-text.js","sourceRoot":"","sources":["../../src/core/provider-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a model agent's turns actually go, and where its key lives.
|
|
3
|
+
*
|
|
4
|
+
* Loom's agents have always been CLIs, which bring their own auth. A model
|
|
5
|
+
* agent (adapters/model.ts) doesn't: it needs a base URL, a key, and whatever
|
|
6
|
+
* headers that particular service insists on. This is the one place that
|
|
7
|
+
* knows those things.
|
|
8
|
+
*
|
|
9
|
+
* ## Keys are not project config
|
|
10
|
+
*
|
|
11
|
+
* `.loom/config.json` is committed in most projects. A key in it is a key in
|
|
12
|
+
* the repository, and then in the fork, and then in the search index. So the
|
|
13
|
+
* project config names a PROVIDER — `"provider": "openrouter"` — and the key
|
|
14
|
+
* lives either in the environment or in `~/.loom/providers.json`, mode 0600,
|
|
15
|
+
* beside the daemon token that already lives there under the same rule.
|
|
16
|
+
*
|
|
17
|
+
* Nothing here returns a key to an HTTP client, logs one, or prints one. What
|
|
18
|
+
* a person sees is whether a provider is configured and the last four
|
|
19
|
+
* characters, which is enough to tell two keys apart and not enough to use
|
|
20
|
+
* one.
|
|
21
|
+
*
|
|
22
|
+
* ## Providers differ in ways that matter
|
|
23
|
+
*
|
|
24
|
+
* They all speak `/v1/chat/completions`, and then each has a quirk: OpenRouter
|
|
25
|
+
* wants attribution headers, AgentRouter refuses clients it doesn't recognise,
|
|
26
|
+
* a local Ollama wants no key at all. Those live in the table rather than in
|
|
27
|
+
* the adapter, so adding a provider is data.
|
|
28
|
+
*/
|
|
29
|
+
export interface ProviderSpec {
|
|
30
|
+
id: string;
|
|
31
|
+
label: string;
|
|
32
|
+
/** Base URL with no trailing slash and no `/v1` — the paths add it. */
|
|
33
|
+
baseUrl: string;
|
|
34
|
+
/** Environment variables checked, in order, before the store. */
|
|
35
|
+
envKeys: string[];
|
|
36
|
+
/** Headers this provider needs beyond authorisation. */
|
|
37
|
+
headers?: Record<string, string>;
|
|
38
|
+
/** Does this model cost nothing here? A convention, where one exists. */
|
|
39
|
+
free?: (modelId: string) => boolean;
|
|
40
|
+
/** Said out loud by `loom providers`, when there's something to know. */
|
|
41
|
+
note?: string;
|
|
42
|
+
docs?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The ones Loom knows by name. Anything else is a custom provider: give it a
|
|
46
|
+
* base URL and it works, because the protocol is the protocol.
|
|
47
|
+
*/
|
|
48
|
+
export declare const BUILTIN_PROVIDERS: ProviderSpec[];
|
|
49
|
+
/** What's been configured on this machine, by provider id. */
|
|
50
|
+
export interface StoredProvider {
|
|
51
|
+
key?: string;
|
|
52
|
+
/** Overrides the built-in base URL, or defines one for a custom provider. */
|
|
53
|
+
baseUrl?: string;
|
|
54
|
+
label?: string;
|
|
55
|
+
/** Extra headers — how a person answers a provider that wants something odd. */
|
|
56
|
+
headers?: Record<string, string>;
|
|
57
|
+
}
|
|
58
|
+
export declare function providersFile(): string;
|
|
59
|
+
export interface ResolvedProvider {
|
|
60
|
+
id: string;
|
|
61
|
+
label: string;
|
|
62
|
+
baseUrl: string;
|
|
63
|
+
/** Null when nothing has been configured — callers decide if that's fatal. */
|
|
64
|
+
key: string | null;
|
|
65
|
+
headers: Record<string, string>;
|
|
66
|
+
free: (modelId: string) => boolean;
|
|
67
|
+
note?: string;
|
|
68
|
+
docs?: string;
|
|
69
|
+
}
|
|
70
|
+
/** The spec for an id, built-in or stored, or null if nobody has heard of it. */
|
|
71
|
+
export declare function specFor(id: string): ProviderSpec | null;
|
|
72
|
+
/**
|
|
73
|
+
* Everything needed to make a call: URL, key, headers.
|
|
74
|
+
*
|
|
75
|
+
* The environment wins over the stored file, so a shell that sets a key for
|
|
76
|
+
* one run doesn't have to undo anything afterwards.
|
|
77
|
+
*/
|
|
78
|
+
export declare function resolveProvider(id: string, env?: NodeJS.ProcessEnv): ResolvedProvider | null;
|
|
79
|
+
/** Save a key, a base URL, headers — any subset. Writes 0600. */
|
|
80
|
+
export declare function setProvider(id: string, patch: StoredProvider): void;
|
|
81
|
+
export declare function forgetProvider(id: string): boolean;
|
|
82
|
+
/** The last four characters, which tells two keys apart and uses neither. */
|
|
83
|
+
export declare function maskKey(key: string | null): string;
|
|
84
|
+
export interface ProviderSummary {
|
|
85
|
+
id: string;
|
|
86
|
+
label: string;
|
|
87
|
+
baseUrl: string;
|
|
88
|
+
configured: boolean;
|
|
89
|
+
/** Masked. There is no code path that returns the key itself. */
|
|
90
|
+
hint: string;
|
|
91
|
+
/** Where the key came from, so "why is it still the old one" is answerable. */
|
|
92
|
+
source: "env" | "file" | "none";
|
|
93
|
+
note?: string;
|
|
94
|
+
docs?: string;
|
|
95
|
+
}
|
|
96
|
+
/** Every provider Loom knows or has been told about, and whether it can be used. */
|
|
97
|
+
export declare function listProviders(env?: NodeJS.ProcessEnv): ProviderSummary[];
|
|
98
|
+
export declare function chatUrl(p: ResolvedProvider): string;
|
|
99
|
+
export declare function modelsUrl(p: ResolvedProvider): string;
|
|
100
|
+
/**
|
|
101
|
+
* Headers for a request. A provider with no key gets none — a local server
|
|
102
|
+
* doesn't want `Authorization: Bearer null`, which is a 401 that reads like a
|
|
103
|
+
* bad key rather than like no key.
|
|
104
|
+
*/
|
|
105
|
+
export declare function requestHeaders(p: ResolvedProvider): Record<string, string>;
|
|
106
|
+
/**
|
|
107
|
+
* Turn a provider's refusal into something a person can act on.
|
|
108
|
+
*
|
|
109
|
+
* These four are the ones worth naming: they're the difference between "your
|
|
110
|
+
* key is wrong", "your free quota is spent", "that model is gone" and "slow
|
|
111
|
+
* down", and each has a different next step.
|
|
112
|
+
*/
|
|
113
|
+
export declare function explainStatus(status: number, body: string, p: ResolvedProvider): string;
|
|
114
|
+
/** Is this the kind of failure another model on the same key might survive? */
|
|
115
|
+
export declare function isExhausted(status: number): boolean;
|
|
116
|
+
export interface ProviderModel {
|
|
117
|
+
id: string;
|
|
118
|
+
provider: string;
|
|
119
|
+
/** Free on this provider, by that provider's own convention. */
|
|
120
|
+
free: boolean;
|
|
121
|
+
/** AgentRouter reports these per model; most providers don't. */
|
|
122
|
+
endpoints?: string[];
|
|
123
|
+
}
|
|
124
|
+
/** How long a model list is believed before asking again. */
|
|
125
|
+
export declare const MODELS_TTL_MS: number;
|
|
126
|
+
/**
|
|
127
|
+
* The models a provider has right now.
|
|
128
|
+
*
|
|
129
|
+
* Cached on disk rather than in memory: the CLI is a new process every time,
|
|
130
|
+
* and asking a provider for its catalogue once per command is rude to them and
|
|
131
|
+
* slow for you. `refresh` skips the cache — which is what a model that has
|
|
132
|
+
* just appeared (or vanished) needs.
|
|
133
|
+
*/
|
|
134
|
+
export declare function fetchModels(p: ResolvedProvider, opts?: {
|
|
135
|
+
refresh?: boolean;
|
|
136
|
+
fetchImpl?: typeof fetch;
|
|
137
|
+
}): Promise<{
|
|
138
|
+
models: ProviderModel[];
|
|
139
|
+
cached: boolean;
|
|
140
|
+
error?: string;
|
|
141
|
+
}>;
|
|
142
|
+
/** Every configured provider's models, for a picker that spans providers. */
|
|
143
|
+
export declare function allModels(opts?: {
|
|
144
|
+
refresh?: boolean;
|
|
145
|
+
env?: NodeJS.ProcessEnv;
|
|
146
|
+
}): Promise<{
|
|
147
|
+
models: ProviderModel[];
|
|
148
|
+
errors: Array<{
|
|
149
|
+
provider: string;
|
|
150
|
+
error: string;
|
|
151
|
+
}>;
|
|
152
|
+
}>;
|