@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 @@
|
|
|
1
|
+
{"version":3,"file":"skill-install.js","sourceRoot":"","sources":["../../src/core/skill-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills — SKILL.md context blocks injected into an agent's system prompt.
|
|
3
|
+
*
|
|
4
|
+
* A skill is a directory `skills/<id>/SKILL.md` with YAML frontmatter (name,
|
|
5
|
+
* description) and a markdown body. Enabled skills (per project, in
|
|
6
|
+
* .loom/config.json) get their bodies prepended to the briefing so every agent
|
|
7
|
+
* follows the same conventions/procedures. Plus a keyword matcher that suggests
|
|
8
|
+
* a relevant skill as the user types.
|
|
9
|
+
*
|
|
10
|
+
* ## Why the search widened
|
|
11
|
+
*
|
|
12
|
+
* This used to look in exactly two places: the project's own `skills/` and the
|
|
13
|
+
* daemon's bundled one. Which meant that on a machine with dozens of skills
|
|
14
|
+
* already installed — `~/.claude/skills`, plus everything a marketplace plugin
|
|
15
|
+
* dropped into `~/.claude/plugins/cache/…` — Loom reported that you had one.
|
|
16
|
+
* The skills were right there on disk and the picker said "agent-triage" and
|
|
17
|
+
* nothing else. That is not a small omission: skills are the one place a user
|
|
18
|
+
* writes down how their agents should behave, and Loom was ignoring all of them
|
|
19
|
+
* because it only knew one directory layout.
|
|
20
|
+
*
|
|
21
|
+
* `discoverSkillRoots` knows the four layouts that actually exist. Each root
|
|
22
|
+
* carries an `origin` so a manifest can say where it came from, because "you
|
|
23
|
+
* have 60 skills" is much less useful than "3 of these are yours, 40 came from
|
|
24
|
+
* a plugin, and this one is the project's". First root wins on a duplicate id,
|
|
25
|
+
* so a project can shadow a user skill with its own version of the same name —
|
|
26
|
+
* the same precedence Claude Code itself uses.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Where a skill came from, which is the difference between "the project ships
|
|
30
|
+
* this" and "this happens to be installed on the laptop". The UI needs it to
|
|
31
|
+
* label a row; `removeSkill` needs it to refuse deleting somebody else's file.
|
|
32
|
+
*/
|
|
33
|
+
export type SkillOrigin = "project" | "user" | "plugin" | "bundled";
|
|
34
|
+
/** A directory to scan for `<id>/SKILL.md`, tagged with where it sits. */
|
|
35
|
+
export interface SkillRoot {
|
|
36
|
+
dir: string;
|
|
37
|
+
origin: SkillOrigin;
|
|
38
|
+
}
|
|
39
|
+
export interface SkillManifest {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
description: string;
|
|
43
|
+
path: string;
|
|
44
|
+
body: string;
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
/** The root directory this skill was found under (not the SKILL.md path). */
|
|
47
|
+
source: string;
|
|
48
|
+
origin: SkillOrigin;
|
|
49
|
+
}
|
|
50
|
+
/** Split a SKILL.md into its frontmatter fields and the body after it. */
|
|
51
|
+
export declare function parseSkillMd(text: string): {
|
|
52
|
+
name: string;
|
|
53
|
+
description: string;
|
|
54
|
+
body: string;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Scan the given roots for `<dir>/SKILL.md`, deduped by id (first root wins).
|
|
58
|
+
*
|
|
59
|
+
* A plain string root is accepted and reported as `origin: "project"` — the
|
|
60
|
+
* callers that predate origins pass their own single directory and that is what
|
|
61
|
+
* it means to them. Anything unreadable (a root that doesn't exist, a directory
|
|
62
|
+
* with no SKILL.md, a permission error on somebody else's plugin cache) is
|
|
63
|
+
* skipped rather than thrown: this runs on every list request and on every turn,
|
|
64
|
+
* and one bad directory must not take the roster with it.
|
|
65
|
+
*/
|
|
66
|
+
export declare function loadSkills(roots: Array<string | SkillRoot>, enabledMap?: Record<string, boolean>): SkillManifest[];
|
|
67
|
+
/**
|
|
68
|
+
* Claude Code's config directory. `CLAUDE_CONFIG_DIR` is its own documented
|
|
69
|
+
* override, so honouring it is both correct for a user who has moved theirs and
|
|
70
|
+
* the hook the tests use to keep discovery off the developer's real machine.
|
|
71
|
+
*/
|
|
72
|
+
export declare function claudeHome(): string;
|
|
73
|
+
/**
|
|
74
|
+
* Skill directories belonging to installed marketplace plugins.
|
|
75
|
+
*
|
|
76
|
+
* The cache is laid out `<home>/plugins/cache/<marketplace>/<plugin>/…`, and the
|
|
77
|
+
* "…" is the part that has moved between Claude Code versions: some installs put
|
|
78
|
+
* `skills/` directly under the plugin, newer ones interpose a version directory
|
|
79
|
+
* (`<plugin>/1.1.0/skills`), and a few plugins nest theirs under `.claude/`.
|
|
80
|
+
* Rather than guess one, this walks the two levels that are stable and probes
|
|
81
|
+
* every shape at each — a directory that isn't there costs one failed stat.
|
|
82
|
+
*
|
|
83
|
+
* Bounded on purpose: two `readdir` levels, no recursion. A plugin cache is
|
|
84
|
+
* somebody else's tree and can be arbitrarily deep; walking it looking for
|
|
85
|
+
* SKILL.md would turn a list request into a full-disk scan.
|
|
86
|
+
*/
|
|
87
|
+
export declare function pluginSkillRoots(home?: string): string[];
|
|
88
|
+
/**
|
|
89
|
+
* Every root a project can draw skills from, in precedence order.
|
|
90
|
+
*
|
|
91
|
+
* Project first (a repo's own conventions beat anything installed globally),
|
|
92
|
+
* then the user's, then plugins, then whatever the daemon was started next to.
|
|
93
|
+
* `bundledDir` is last because it is the weakest claim of the four: it is
|
|
94
|
+
* "there was a skills/ folder in the process's cwd", which is Loom's own
|
|
95
|
+
* checkout when you run it from source and nothing at all when you don't.
|
|
96
|
+
*/
|
|
97
|
+
export declare function discoverSkillRoots(projectDir: string, bundledDir?: string): SkillRoot[];
|
|
98
|
+
/**
|
|
99
|
+
* One row of the skill picker: everything a list screen needs and nothing it
|
|
100
|
+
* doesn't. The body is deliberately absent — see ProjectRuntime#skillsCatalog.
|
|
101
|
+
*/
|
|
102
|
+
export interface SkillCatalogEntry {
|
|
103
|
+
id: string;
|
|
104
|
+
name: string;
|
|
105
|
+
description: string;
|
|
106
|
+
enabled: boolean;
|
|
107
|
+
origin: SkillOrigin;
|
|
108
|
+
/** The root directory it was found under, so the UI can say where it lives. */
|
|
109
|
+
source: string;
|
|
110
|
+
/** Does it live in this project's own `skills/` dir (and so can be removed)? */
|
|
111
|
+
installed: boolean;
|
|
112
|
+
}
|
|
113
|
+
/** The block prepended to a briefing for the enabled skills. Empty if none. */
|
|
114
|
+
export declare function buildSkillsBlock(skills: SkillManifest[]): string;
|
|
115
|
+
/** The single best skill to suggest for a message, or null. */
|
|
116
|
+
export declare function suggestSkill(message: string, skills: SkillManifest[]): SkillManifest | null;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills — SKILL.md context blocks injected into an agent's system prompt.
|
|
3
|
+
*
|
|
4
|
+
* A skill is a directory `skills/<id>/SKILL.md` with YAML frontmatter (name,
|
|
5
|
+
* description) and a markdown body. Enabled skills (per project, in
|
|
6
|
+
* .loom/config.json) get their bodies prepended to the briefing so every agent
|
|
7
|
+
* follows the same conventions/procedures. Plus a keyword matcher that suggests
|
|
8
|
+
* a relevant skill as the user types.
|
|
9
|
+
*
|
|
10
|
+
* ## Why the search widened
|
|
11
|
+
*
|
|
12
|
+
* This used to look in exactly two places: the project's own `skills/` and the
|
|
13
|
+
* daemon's bundled one. Which meant that on a machine with dozens of skills
|
|
14
|
+
* already installed — `~/.claude/skills`, plus everything a marketplace plugin
|
|
15
|
+
* dropped into `~/.claude/plugins/cache/…` — Loom reported that you had one.
|
|
16
|
+
* The skills were right there on disk and the picker said "agent-triage" and
|
|
17
|
+
* nothing else. That is not a small omission: skills are the one place a user
|
|
18
|
+
* writes down how their agents should behave, and Loom was ignoring all of them
|
|
19
|
+
* because it only knew one directory layout.
|
|
20
|
+
*
|
|
21
|
+
* `discoverSkillRoots` knows the four layouts that actually exist. Each root
|
|
22
|
+
* carries an `origin` so a manifest can say where it came from, because "you
|
|
23
|
+
* have 60 skills" is much less useful than "3 of these are yours, 40 came from
|
|
24
|
+
* a plugin, and this one is the project's". First root wins on a duplicate id,
|
|
25
|
+
* so a project can shadow a user skill with its own version of the same name —
|
|
26
|
+
* the same precedence Claude Code itself uses.
|
|
27
|
+
*/
|
|
28
|
+
import fs from "node:fs";
|
|
29
|
+
import os from "node:os";
|
|
30
|
+
import path from "node:path";
|
|
31
|
+
/** Split a SKILL.md into its frontmatter fields and the body after it. */
|
|
32
|
+
export function parseSkillMd(text) {
|
|
33
|
+
const m = /^---\s*\n([\s\S]*?)\n---\s*\n?([\s\S]*)$/.exec(text);
|
|
34
|
+
if (!m)
|
|
35
|
+
return { name: "", description: "", body: text.trim() };
|
|
36
|
+
const fm = m[1];
|
|
37
|
+
const body = (m[2] ?? "").trim();
|
|
38
|
+
const field = (key) => {
|
|
39
|
+
// key: value (value may be a folded `>` block continued on indented lines)
|
|
40
|
+
const re = new RegExp(`^${key}\\s*:\\s*(>-?|\\|-?)?[ \\t]*(.*)$`, "m");
|
|
41
|
+
const fmm = re.exec(fm);
|
|
42
|
+
if (!fmm)
|
|
43
|
+
return "";
|
|
44
|
+
if (fmm[1]) {
|
|
45
|
+
// folded/literal block: gather the following indented lines
|
|
46
|
+
const start = fm.indexOf(fmm[0]) + fmm[0].length;
|
|
47
|
+
const rest = fm.slice(start).split("\n");
|
|
48
|
+
const lines = fmm[2] ? [fmm[2]] : [];
|
|
49
|
+
for (const l of rest) {
|
|
50
|
+
if (/^\s+\S/.test(l) || l.trim() === "")
|
|
51
|
+
lines.push(l.trim());
|
|
52
|
+
else
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
return lines.join(" ").trim();
|
|
56
|
+
}
|
|
57
|
+
return fmm[2].replace(/^["']|["']$/g, "").trim();
|
|
58
|
+
};
|
|
59
|
+
return { name: field("name"), description: field("description"), body };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Scan the given roots for `<dir>/SKILL.md`, deduped by id (first root wins).
|
|
63
|
+
*
|
|
64
|
+
* A plain string root is accepted and reported as `origin: "project"` — the
|
|
65
|
+
* callers that predate origins pass their own single directory and that is what
|
|
66
|
+
* it means to them. Anything unreadable (a root that doesn't exist, a directory
|
|
67
|
+
* with no SKILL.md, a permission error on somebody else's plugin cache) is
|
|
68
|
+
* skipped rather than thrown: this runs on every list request and on every turn,
|
|
69
|
+
* and one bad directory must not take the roster with it.
|
|
70
|
+
*/
|
|
71
|
+
export function loadSkills(roots, enabledMap = {}) {
|
|
72
|
+
const byId = new Map();
|
|
73
|
+
for (const raw of roots) {
|
|
74
|
+
const root = typeof raw === "string" ? { dir: raw, origin: "project" } : raw;
|
|
75
|
+
let entries = [];
|
|
76
|
+
try {
|
|
77
|
+
entries = fs.readdirSync(root.dir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
continue; // no such dir
|
|
81
|
+
}
|
|
82
|
+
for (const id of entries) {
|
|
83
|
+
if (byId.has(id))
|
|
84
|
+
continue;
|
|
85
|
+
const p = path.join(root.dir, id, "SKILL.md");
|
|
86
|
+
let text;
|
|
87
|
+
try {
|
|
88
|
+
text = fs.readFileSync(p, "utf8");
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
continue; // no SKILL.md in this dir
|
|
92
|
+
}
|
|
93
|
+
const { name, description, body } = parseSkillMd(text);
|
|
94
|
+
byId.set(id, {
|
|
95
|
+
id,
|
|
96
|
+
name: name || id,
|
|
97
|
+
description,
|
|
98
|
+
path: p,
|
|
99
|
+
body,
|
|
100
|
+
enabled: enabledMap[id] === true,
|
|
101
|
+
source: root.dir,
|
|
102
|
+
origin: root.origin,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return [...byId.values()].sort((a, b) => a.id.localeCompare(b.id));
|
|
107
|
+
}
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Where skills live
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
/**
|
|
112
|
+
* Claude Code's config directory. `CLAUDE_CONFIG_DIR` is its own documented
|
|
113
|
+
* override, so honouring it is both correct for a user who has moved theirs and
|
|
114
|
+
* the hook the tests use to keep discovery off the developer's real machine.
|
|
115
|
+
*/
|
|
116
|
+
export function claudeHome() {
|
|
117
|
+
const override = process.env.CLAUDE_CONFIG_DIR?.trim();
|
|
118
|
+
return override ? override : path.join(os.homedir(), ".claude");
|
|
119
|
+
}
|
|
120
|
+
/** Directory names to try under a plugin's checkout, in the order they win. */
|
|
121
|
+
const PLUGIN_SKILL_SUBDIRS = ["skills", path.join(".claude", "skills")];
|
|
122
|
+
/**
|
|
123
|
+
* Skill directories belonging to installed marketplace plugins.
|
|
124
|
+
*
|
|
125
|
+
* The cache is laid out `<home>/plugins/cache/<marketplace>/<plugin>/…`, and the
|
|
126
|
+
* "…" is the part that has moved between Claude Code versions: some installs put
|
|
127
|
+
* `skills/` directly under the plugin, newer ones interpose a version directory
|
|
128
|
+
* (`<plugin>/1.1.0/skills`), and a few plugins nest theirs under `.claude/`.
|
|
129
|
+
* Rather than guess one, this walks the two levels that are stable and probes
|
|
130
|
+
* every shape at each — a directory that isn't there costs one failed stat.
|
|
131
|
+
*
|
|
132
|
+
* Bounded on purpose: two `readdir` levels, no recursion. A plugin cache is
|
|
133
|
+
* somebody else's tree and can be arbitrarily deep; walking it looking for
|
|
134
|
+
* SKILL.md would turn a list request into a full-disk scan.
|
|
135
|
+
*/
|
|
136
|
+
export function pluginSkillRoots(home = claudeHome()) {
|
|
137
|
+
const cache = path.join(home, "plugins", "cache");
|
|
138
|
+
const out = [];
|
|
139
|
+
const dirsIn = (dir) => {
|
|
140
|
+
try {
|
|
141
|
+
return fs.readdirSync(dir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
return []; // no cache, or not ours to read
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
const collect = (base) => {
|
|
148
|
+
for (const sub of PLUGIN_SKILL_SUBDIRS) {
|
|
149
|
+
const candidate = path.join(base, sub);
|
|
150
|
+
try {
|
|
151
|
+
if (fs.statSync(candidate).isDirectory())
|
|
152
|
+
out.push(candidate);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// not this layout
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
for (const marketplace of dirsIn(cache)) {
|
|
160
|
+
for (const plugin of dirsIn(path.join(cache, marketplace))) {
|
|
161
|
+
const pluginDir = path.join(cache, marketplace, plugin);
|
|
162
|
+
collect(pluginDir);
|
|
163
|
+
// …and the versioned layout, `<plugin>/<version>/skills`.
|
|
164
|
+
for (const version of dirsIn(pluginDir))
|
|
165
|
+
collect(path.join(pluginDir, version));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return out;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Every root a project can draw skills from, in precedence order.
|
|
172
|
+
*
|
|
173
|
+
* Project first (a repo's own conventions beat anything installed globally),
|
|
174
|
+
* then the user's, then plugins, then whatever the daemon was started next to.
|
|
175
|
+
* `bundledDir` is last because it is the weakest claim of the four: it is
|
|
176
|
+
* "there was a skills/ folder in the process's cwd", which is Loom's own
|
|
177
|
+
* checkout when you run it from source and nothing at all when you don't.
|
|
178
|
+
*/
|
|
179
|
+
export function discoverSkillRoots(projectDir, bundledDir) {
|
|
180
|
+
const roots = [
|
|
181
|
+
{ dir: path.join(projectDir, "skills"), origin: "project" },
|
|
182
|
+
{ dir: path.join(projectDir, ".claude", "skills"), origin: "project" },
|
|
183
|
+
{ dir: path.join(claudeHome(), "skills"), origin: "user" },
|
|
184
|
+
...pluginSkillRoots().map((dir) => ({ dir, origin: "plugin" })),
|
|
185
|
+
];
|
|
186
|
+
if (bundledDir)
|
|
187
|
+
roots.push({ dir: bundledDir, origin: "bundled" });
|
|
188
|
+
// Two roots can resolve to the same directory (running the daemon from inside
|
|
189
|
+
// the project makes cwd/skills the project's own). Keeping both would be
|
|
190
|
+
// harmless — loadSkills dedupes by id — but it would report the bundled root
|
|
191
|
+
// as the source of a project skill, which is a wrong answer, not a slow one.
|
|
192
|
+
const seen = new Set();
|
|
193
|
+
return roots.filter((r) => (seen.has(r.dir) ? false : (seen.add(r.dir), true)));
|
|
194
|
+
}
|
|
195
|
+
/** The block prepended to a briefing for the enabled skills. Empty if none. */
|
|
196
|
+
export function buildSkillsBlock(skills) {
|
|
197
|
+
const on = skills.filter((s) => s.enabled && s.body.trim());
|
|
198
|
+
if (!on.length)
|
|
199
|
+
return "";
|
|
200
|
+
return `--- ACTIVE SKILLS ---\n${on.map((s) => s.body.trim()).join("\n---\n")}\n--- END ACTIVE SKILLS ---\n`;
|
|
201
|
+
}
|
|
202
|
+
/** Keyword → skill-id rules, most specific first. */
|
|
203
|
+
const SUGGEST_RULES = [
|
|
204
|
+
{ id: /triage/i, when: /\btriage\b|why did|failing|failed|debug (the )?agent|root[- ]?cause|stall/i },
|
|
205
|
+
{ id: /clickhouse|generating-queries|query/i, when: /\bquery\b|clickhouse|\btraces?\b|\bspans?\b/i },
|
|
206
|
+
{ id: /creating-alerts|alert/i, when: /\balert\b|threshold|\bfire[sd]?\b|notify me|page me/i },
|
|
207
|
+
{ id: /creating-dashboards|dashboard/i, when: /dashboard/i },
|
|
208
|
+
];
|
|
209
|
+
/** The single best skill to suggest for a message, or null. */
|
|
210
|
+
export function suggestSkill(message, skills) {
|
|
211
|
+
const msg = message || "";
|
|
212
|
+
if (msg.trim().length < 4)
|
|
213
|
+
return null;
|
|
214
|
+
for (const rule of SUGGEST_RULES) {
|
|
215
|
+
if (!rule.when.test(msg))
|
|
216
|
+
continue;
|
|
217
|
+
const hit = skills.find((s) => !s.enabled && rule.id.test(s.id));
|
|
218
|
+
if (hit)
|
|
219
|
+
return hit;
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/core/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conditions a static route can honestly evaluate.
|
|
3
|
+
*
|
|
4
|
+
* Until now a route branched on exactly one thing: the step errored (`onFail`).
|
|
5
|
+
* #34 was the collection point for the rest, and the bar for letting one in was
|
|
6
|
+
* that it must be MECHANICAL — a number the daemon already has, not a judgement
|
|
7
|
+
* about whether the work was any good. "The reviewer wasn't happy" stays with
|
|
8
|
+
* the LLM router, where a judgement belongs.
|
|
9
|
+
*
|
|
10
|
+
* What qualified, all read off the turn's own diff:
|
|
11
|
+
*
|
|
12
|
+
* changed>10 more than ten files changed
|
|
13
|
+
* changed<3 fewer than three did
|
|
14
|
+
* lines>200 more than two hundred lines added+removed
|
|
15
|
+
* lines<20 fewer than twenty
|
|
16
|
+
* touched:src/db/** something under that path changed
|
|
17
|
+
* !touched:docs/** nothing under that path did
|
|
18
|
+
*
|
|
19
|
+
* A step carrying one runs only when it holds — "send a big change to the
|
|
20
|
+
* reviewer, let a small one go straight on" without a person deciding each
|
|
21
|
+
* time. A step that can't be measured doesn't get to guess: with no diff to
|
|
22
|
+
* read, `changed>N` and `lines>N` are false and their `<` forms are true,
|
|
23
|
+
* which is exactly what "nothing changed" means.
|
|
24
|
+
*/
|
|
25
|
+
export interface TurnFacts {
|
|
26
|
+
/** Files the turn changed, repo-relative. */
|
|
27
|
+
files: string[];
|
|
28
|
+
added: number;
|
|
29
|
+
removed: number;
|
|
30
|
+
}
|
|
31
|
+
export type StepCondition = {
|
|
32
|
+
kind: "changed";
|
|
33
|
+
op: ">" | "<";
|
|
34
|
+
n: number;
|
|
35
|
+
} | {
|
|
36
|
+
kind: "lines";
|
|
37
|
+
op: ">" | "<";
|
|
38
|
+
n: number;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "touched";
|
|
41
|
+
glob: string;
|
|
42
|
+
negated: boolean;
|
|
43
|
+
};
|
|
44
|
+
/** A turn that changed nothing — what a host with no diff to offer reports. */
|
|
45
|
+
export declare const NO_CHANGES: TurnFacts;
|
|
46
|
+
/**
|
|
47
|
+
* Read a condition written the way a person writes one.
|
|
48
|
+
*
|
|
49
|
+
* Anything it doesn't understand is refused here, at parse time, where it can
|
|
50
|
+
* still be fixed — rather than at run time, where an unreadable condition
|
|
51
|
+
* would quietly never match and its step would silently never run.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parseStepCondition(raw: string): StepCondition;
|
|
54
|
+
/** Does the turn meet the condition? */
|
|
55
|
+
export declare function conditionHolds(cond: StepCondition, facts: TurnFacts): boolean;
|
|
56
|
+
/** The condition in the words the thread uses to explain a skipped step. */
|
|
57
|
+
export declare function describeStepCondition(cond: StepCondition): string;
|
|
58
|
+
/** The turn in the same terms, so the two can be read side by side. */
|
|
59
|
+
export declare function describeFacts(facts: TurnFacts): string;
|
|
60
|
+
/**
|
|
61
|
+
* Small glob matching: `*` within a segment, `**` across segments, `?` for a
|
|
62
|
+
* single character. Enough for the paths people write into a route, and small
|
|
63
|
+
* enough to be obviously right.
|
|
64
|
+
*/
|
|
65
|
+
export declare function matchesGlob(file: string, glob: string): boolean;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conditions a static route can honestly evaluate.
|
|
3
|
+
*
|
|
4
|
+
* Until now a route branched on exactly one thing: the step errored (`onFail`).
|
|
5
|
+
* #34 was the collection point for the rest, and the bar for letting one in was
|
|
6
|
+
* that it must be MECHANICAL — a number the daemon already has, not a judgement
|
|
7
|
+
* about whether the work was any good. "The reviewer wasn't happy" stays with
|
|
8
|
+
* the LLM router, where a judgement belongs.
|
|
9
|
+
*
|
|
10
|
+
* What qualified, all read off the turn's own diff:
|
|
11
|
+
*
|
|
12
|
+
* changed>10 more than ten files changed
|
|
13
|
+
* changed<3 fewer than three did
|
|
14
|
+
* lines>200 more than two hundred lines added+removed
|
|
15
|
+
* lines<20 fewer than twenty
|
|
16
|
+
* touched:src/db/** something under that path changed
|
|
17
|
+
* !touched:docs/** nothing under that path did
|
|
18
|
+
*
|
|
19
|
+
* A step carrying one runs only when it holds — "send a big change to the
|
|
20
|
+
* reviewer, let a small one go straight on" without a person deciding each
|
|
21
|
+
* time. A step that can't be measured doesn't get to guess: with no diff to
|
|
22
|
+
* read, `changed>N` and `lines>N` are false and their `<` forms are true,
|
|
23
|
+
* which is exactly what "nothing changed" means.
|
|
24
|
+
*/
|
|
25
|
+
/** A turn that changed nothing — what a host with no diff to offer reports. */
|
|
26
|
+
export const NO_CHANGES = { files: [], added: 0, removed: 0 };
|
|
27
|
+
/**
|
|
28
|
+
* Read a condition written the way a person writes one.
|
|
29
|
+
*
|
|
30
|
+
* Anything it doesn't understand is refused here, at parse time, where it can
|
|
31
|
+
* still be fixed — rather than at run time, where an unreadable condition
|
|
32
|
+
* would quietly never match and its step would silently never run.
|
|
33
|
+
*/
|
|
34
|
+
export function parseStepCondition(raw) {
|
|
35
|
+
const s = raw.trim();
|
|
36
|
+
const count = /^(changed|files|lines)\s*([<>])\s*(\d+)$/i.exec(s);
|
|
37
|
+
if (count) {
|
|
38
|
+
const kind = count[1].toLowerCase() === "lines" ? "lines" : "changed";
|
|
39
|
+
return { kind, op: count[2], n: Number(count[3]) };
|
|
40
|
+
}
|
|
41
|
+
const touched = /^(!?)\s*touched\s*:\s*(.+)$/i.exec(s);
|
|
42
|
+
if (touched?.[2]?.trim()) {
|
|
43
|
+
return { kind: "touched", glob: touched[2].trim(), negated: touched[1] === "!" };
|
|
44
|
+
}
|
|
45
|
+
throw new Error(`I don't understand the condition "${s}" — try changed>10, lines>200, touched:src/db/** or !touched:docs/**`);
|
|
46
|
+
}
|
|
47
|
+
/** Does the turn meet the condition? */
|
|
48
|
+
export function conditionHolds(cond, facts) {
|
|
49
|
+
if (cond.kind === "changed") {
|
|
50
|
+
return cond.op === ">" ? facts.files.length > cond.n : facts.files.length < cond.n;
|
|
51
|
+
}
|
|
52
|
+
if (cond.kind === "lines") {
|
|
53
|
+
const total = facts.added + facts.removed;
|
|
54
|
+
return cond.op === ">" ? total > cond.n : total < cond.n;
|
|
55
|
+
}
|
|
56
|
+
const hit = facts.files.some((f) => matchesGlob(f, cond.glob));
|
|
57
|
+
return cond.negated ? !hit : hit;
|
|
58
|
+
}
|
|
59
|
+
/** The condition in the words the thread uses to explain a skipped step. */
|
|
60
|
+
export function describeStepCondition(cond) {
|
|
61
|
+
if (cond.kind === "changed") {
|
|
62
|
+
return `${cond.op === ">" ? "more" : "fewer"} than ${cond.n} files changed`;
|
|
63
|
+
}
|
|
64
|
+
if (cond.kind === "lines") {
|
|
65
|
+
return `${cond.op === ">" ? "more" : "fewer"} than ${cond.n} lines changed`;
|
|
66
|
+
}
|
|
67
|
+
return cond.negated
|
|
68
|
+
? `nothing under ${cond.glob} changed`
|
|
69
|
+
: `something under ${cond.glob} changed`;
|
|
70
|
+
}
|
|
71
|
+
/** The turn in the same terms, so the two can be read side by side. */
|
|
72
|
+
export function describeFacts(facts) {
|
|
73
|
+
const n = facts.files.length;
|
|
74
|
+
return `${n} file${n === 1 ? "" : "s"}, ${facts.added + facts.removed} lines`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Small glob matching: `*` within a segment, `**` across segments, `?` for a
|
|
78
|
+
* single character. Enough for the paths people write into a route, and small
|
|
79
|
+
* enough to be obviously right.
|
|
80
|
+
*/
|
|
81
|
+
export function matchesGlob(file, glob) {
|
|
82
|
+
// Sentinels: the two `**` forms are set aside while the rest is escaped,
|
|
83
|
+
// then put back as regex. `a/**/b` may match nothing in the middle; a
|
|
84
|
+
// trailing `a/**` means everything underneath.
|
|
85
|
+
const DIRS = "<<anydirs>>";
|
|
86
|
+
const REST = "<<anything>>";
|
|
87
|
+
const pattern = glob.trim().replace(/^\.?\//, "");
|
|
88
|
+
const rx = new RegExp("^" +
|
|
89
|
+
pattern
|
|
90
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&")
|
|
91
|
+
.replace(/\*\*\//g, DIRS)
|
|
92
|
+
.replace(/\*\*/g, REST)
|
|
93
|
+
.replace(/\*/g, "[^/]*")
|
|
94
|
+
.replace(/\?/g, "[^/]")
|
|
95
|
+
.split(DIRS)
|
|
96
|
+
.join("(?:.*/)?")
|
|
97
|
+
.split(REST)
|
|
98
|
+
.join(".*") +
|
|
99
|
+
"$");
|
|
100
|
+
return rx.test(file.replace(/^\.?\//, ""));
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=step-conditions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-conditions.js","sourceRoot":"","sources":["../../src/core/step-conditions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every agent working for an orchestrator, in one list: the tasks of an
|
|
3
|
+
* Orchestra run, the entrants of a race, the teammates of a crew. The desktop
|
|
4
|
+
* opens it as a "Subagents" tab when a goal starts, and the phone shows the
|
|
5
|
+
* same list — who is working right now, who has finished, and a way into each
|
|
6
|
+
* one's own thread.
|
|
7
|
+
*/
|
|
8
|
+
import type { CrewView } from "./crew.js";
|
|
9
|
+
import type { OrchestraRun } from "./orchestra.js";
|
|
10
|
+
export type SubagentStatus = "running" | "asks" | "pending" | "done" | "failed" | "cancelled";
|
|
11
|
+
export interface Subagent {
|
|
12
|
+
/** Stable across polls, so a client can keep its selection. */
|
|
13
|
+
id: string;
|
|
14
|
+
/** What it's doing: the task's title, or the teammate's role. */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Roster agent id and adapter kind, for the logo. */
|
|
17
|
+
agentId: string;
|
|
18
|
+
kind: string;
|
|
19
|
+
status: SubagentStatus;
|
|
20
|
+
/** Its own thread. */
|
|
21
|
+
chat?: string;
|
|
22
|
+
/** Where it came from: an Orchestra run, a race, a crew. */
|
|
23
|
+
source: "orchestra" | "race" | "crew";
|
|
24
|
+
/** The goal it serves, for grouping. */
|
|
25
|
+
goal: string;
|
|
26
|
+
goalId: string;
|
|
27
|
+
/** Last time it did anything (start, finish, or its thread's latest event). */
|
|
28
|
+
at: number;
|
|
29
|
+
costUsd?: number;
|
|
30
|
+
/** One line of what it's on or what it produced. */
|
|
31
|
+
note?: string;
|
|
32
|
+
}
|
|
33
|
+
export interface SubagentList {
|
|
34
|
+
active: Subagent[];
|
|
35
|
+
done: Subagent[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @param lastActivity chat id → latest event time, so a teammate's "when" is
|
|
39
|
+
* its last word rather than when the goal began.
|
|
40
|
+
* @param recentRuns how many Orchestra runs back to include (newest first).
|
|
41
|
+
*/
|
|
42
|
+
export declare function subagents(runs: readonly OrchestraRun[], crews: readonly CrewView[], lastActivity: ReadonlyMap<string, number>, opts?: {
|
|
43
|
+
kindOf?: (agentId: string) => string | undefined;
|
|
44
|
+
recentRuns?: number;
|
|
45
|
+
}): SubagentList;
|