@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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A picture of the page Loom is previewing.
|
|
3
|
+
*
|
|
4
|
+
* The preview is an iframe pointing at someone else's origin, so the browser
|
|
5
|
+
* will not let the page photograph it — and a person who can see the bug on
|
|
6
|
+
* screen shouldn't have to describe it in words. The daemon takes the shot
|
|
7
|
+
* instead, with the Playwright the project already has for its specs, and the
|
|
8
|
+
* file lands where attachments live so the composer can carry it like any
|
|
9
|
+
* pasted image.
|
|
10
|
+
*
|
|
11
|
+
* A project without Playwright is told so plainly rather than handed an empty
|
|
12
|
+
* file: `npx --no-install` never installs anything behind your back.
|
|
13
|
+
*/
|
|
14
|
+
import { spawn } from "./process.js";
|
|
15
|
+
import fs from "node:fs";
|
|
16
|
+
import os from "node:os";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
export const MAX_SHOT_MS = 45_000;
|
|
19
|
+
/** The little script Playwright runs. Kept here so what it does is readable. */
|
|
20
|
+
export function shotScript(req) {
|
|
21
|
+
return `const { chromium } = require("playwright");
|
|
22
|
+
(async () => {
|
|
23
|
+
const browser = await chromium.launch();
|
|
24
|
+
const page = await browser.newPage({
|
|
25
|
+
viewport: { width: ${req.width}, height: ${req.height} },
|
|
26
|
+
colorScheme: ${JSON.stringify(req.colorScheme)},
|
|
27
|
+
deviceScaleFactor: 2,
|
|
28
|
+
});
|
|
29
|
+
try {
|
|
30
|
+
await page.goto(${JSON.stringify(req.url)}, { waitUntil: "load", timeout: 20000 });
|
|
31
|
+
// Settle: fonts and the first paint of whatever loaded late.
|
|
32
|
+
await page.waitForTimeout(400);
|
|
33
|
+
${req.selector
|
|
34
|
+
? `const el = page.locator(${JSON.stringify(req.selector)}).first();
|
|
35
|
+
await el.scrollIntoViewIfNeeded({ timeout: 8000 });
|
|
36
|
+
await el.screenshot({ path: ${JSON.stringify(req.out)}, timeout: 8000 });`
|
|
37
|
+
: `await page.screenshot({ path: ${JSON.stringify(req.out)}, fullPage: ${req.fullPage} });`}
|
|
38
|
+
} finally {
|
|
39
|
+
await browser.close();
|
|
40
|
+
}
|
|
41
|
+
})().catch((err) => { console.error(String(err && err.message || err)); process.exit(1); });
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Take the shot in `projectDir` (so the project's own Playwright and browsers
|
|
46
|
+
* are the ones used). Rejects with something a person can act on.
|
|
47
|
+
*/
|
|
48
|
+
export async function capture(projectDir, req, spawnImpl = spawn) {
|
|
49
|
+
const url = req.url.trim();
|
|
50
|
+
if (!/^https?:\/\//.test(url))
|
|
51
|
+
throw new Error("a screenshot needs an http(s) url");
|
|
52
|
+
const width = clamp(req.width ?? 1280, 200, 3840);
|
|
53
|
+
const height = clamp(req.height ?? 800, 200, 3840);
|
|
54
|
+
const colorScheme = req.colorScheme === "dark" ? "dark" : "light";
|
|
55
|
+
const fullPage = Boolean(req.fullPage);
|
|
56
|
+
// The script lives in the PROJECT, not in /tmp: node resolves `playwright`
|
|
57
|
+
// from the script's own directory, and a script in /tmp would never find the
|
|
58
|
+
// project's copy — it would report "no Playwright" for a project that has it.
|
|
59
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "loom-shot-"));
|
|
60
|
+
const scriptDir = path.join(projectDir, ".loom");
|
|
61
|
+
fs.mkdirSync(scriptDir, { recursive: true });
|
|
62
|
+
const script = path.join(scriptDir, `preview-shot-${process.pid}-${Date.now()}.cjs`);
|
|
63
|
+
const out = path.join(tmp, "shot.png");
|
|
64
|
+
const selector = typeof req.selector === "string" && req.selector.trim() ? req.selector.trim().slice(0, 500) : undefined;
|
|
65
|
+
fs.writeFileSync(script, shotScript({ url, width, height, colorScheme, fullPage, out, ...(selector ? { selector } : {}) }));
|
|
66
|
+
const code = await new Promise((resolve) => {
|
|
67
|
+
const child = spawnImpl("npx", ["--no-install", "node", script], {
|
|
68
|
+
cwd: projectDir,
|
|
69
|
+
env: { ...process.env, CI: "1" },
|
|
70
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
71
|
+
});
|
|
72
|
+
let err = "";
|
|
73
|
+
child.stderr?.on("data", (d) => (err += String(d)));
|
|
74
|
+
const timer = setTimeout(() => child.kill("SIGKILL"), req.timeoutMs ?? MAX_SHOT_MS);
|
|
75
|
+
child.on("error", (e) => {
|
|
76
|
+
clearTimeout(timer);
|
|
77
|
+
resolve({ code: 1, err: e.message });
|
|
78
|
+
});
|
|
79
|
+
child.on("exit", (c) => {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
resolve({ code: c ?? 1, err });
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
fs.rmSync(script, { force: true });
|
|
85
|
+
if (code.code !== 0 || !fs.existsSync(out)) {
|
|
86
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
87
|
+
throw new Error(explain(code.err));
|
|
88
|
+
}
|
|
89
|
+
return { file: out, width, height, colorScheme, fullPage };
|
|
90
|
+
}
|
|
91
|
+
/** Playwright's failures, in words that say what to do. */
|
|
92
|
+
export function explain(stderr) {
|
|
93
|
+
const s = stderr.trim();
|
|
94
|
+
if (/Cannot find module 'playwright'|Cannot find package 'playwright'/.test(s)) {
|
|
95
|
+
return "this project has no Playwright — add it (npm i -D playwright) and run npx playwright install chromium";
|
|
96
|
+
}
|
|
97
|
+
if (/Executable doesn't exist|browserType.launch/.test(s)) {
|
|
98
|
+
return "Playwright is here but its browser isn't — run npx playwright install chromium";
|
|
99
|
+
}
|
|
100
|
+
if (/net::ERR_CONNECTION_REFUSED/.test(s))
|
|
101
|
+
return "nothing answered at that address — is the server running?";
|
|
102
|
+
if (/Timeout .* exceeded|navigation timeout/i.test(s))
|
|
103
|
+
return "the page didn't finish loading in time";
|
|
104
|
+
return s.split("\n").slice(-3).join(" ").slice(0, 300) || "the screenshot failed";
|
|
105
|
+
}
|
|
106
|
+
function clamp(n, lo, hi) {
|
|
107
|
+
return Math.max(lo, Math.min(hi, Math.round(Number(n) || lo)));
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=preview-shot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-shot.js","sourceRoot":"","sources":["../../src/core/preview-shot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { spawn as nodeSpawn, execFile as nodeExecFile, execFileSync as nodeExecFileSync, type ChildProcess } from "node:child_process";
|
|
2
|
+
/** A trusted, user-configured command line, using the native OS shell. */
|
|
3
|
+
export declare function shellInvocation(command: string): {
|
|
4
|
+
command: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
windowsVerbatimArguments?: boolean;
|
|
7
|
+
};
|
|
8
|
+
/** Carry a file placeholder through the environment so spaces and shell
|
|
9
|
+
* characters in the file's name cannot become command syntax. */
|
|
10
|
+
export declare function fileCommand(template: string, file: string): {
|
|
11
|
+
command: string;
|
|
12
|
+
args: string[];
|
|
13
|
+
env: NodeJS.ProcessEnv;
|
|
14
|
+
windowsVerbatimArguments?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare function findExecutable(command: string, env?: NodeJS.ProcessEnv, cwd?: string): string | null;
|
|
17
|
+
export declare function commandInvocation(command: string, args: readonly string[], options?: {
|
|
18
|
+
env?: NodeJS.ProcessEnv;
|
|
19
|
+
cwd?: string | URL;
|
|
20
|
+
}): {
|
|
21
|
+
command: string;
|
|
22
|
+
args: string[];
|
|
23
|
+
};
|
|
24
|
+
export declare const spawn: typeof nodeSpawn;
|
|
25
|
+
/** Native harnesses run inside an owned containment boundary on every OS. */
|
|
26
|
+
export declare const spawnContained: typeof nodeSpawn;
|
|
27
|
+
export declare const execFile: typeof nodeExecFile;
|
|
28
|
+
export declare const execFileSync: typeof nodeExecFileSync;
|
|
29
|
+
/** Stop the Windows process tree while its parent still exists. This is
|
|
30
|
+
* best-effort shutdown for ordinary sessions, not native-continuity containment.
|
|
31
|
+
*/
|
|
32
|
+
export declare function stopWindowsTree(child: ChildProcess): Promise<void>;
|
|
33
|
+
/** Interrupt a pipe terminal's foreground children, preserving its cmd session. */
|
|
34
|
+
export declare function stopWindowsChildren(parentPid: number): Promise<void>;
|
|
35
|
+
/** Stop a verified orphan's tree without terminating shared console hosts. */
|
|
36
|
+
export declare function stopWindowsPid(pid: number): Promise<void>;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/** Launch Node CLIs on Windows without passing prompts through cmd.exe.
|
|
2
|
+
* npm's .cmd shims and Unix shebangs are not executable by CreateProcess.
|
|
3
|
+
* Resolve those to their JavaScript entry point and keep every argument literal.
|
|
4
|
+
*/
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import path from "node:path";
|
|
7
|
+
import { spawn as nodeSpawn, execFile as nodeExecFile, execFileSync as nodeExecFileSync } from "node:child_process";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
import { spawnWindowsJob, hasWindowsJob, quiesceWindowsJob } from "./windows-jobs.js";
|
|
10
|
+
/** A trusted, user-configured command line, using the native OS shell. */
|
|
11
|
+
export function shellInvocation(command) {
|
|
12
|
+
return process.platform === "win32"
|
|
13
|
+
? { command: process.env.ComSpec ?? "cmd.exe", args: ["/d", "/s", "/c", `"${command}"`], windowsVerbatimArguments: true }
|
|
14
|
+
: { command: "/bin/sh", args: ["-c", command] };
|
|
15
|
+
}
|
|
16
|
+
/** Carry a file placeholder through the environment so spaces and shell
|
|
17
|
+
* characters in the file's name cannot become command syntax. */
|
|
18
|
+
export function fileCommand(template, file) {
|
|
19
|
+
const quoted = process.platform === "win32" ? '"%LOOM_INPUT_FILE%"' : '"$LOOM_INPUT_FILE"';
|
|
20
|
+
const command = template.replaceAll('"{file}"', quoted).replaceAll("'{file}'", quoted).replaceAll("{file}", quoted);
|
|
21
|
+
return { ...shellInvocation(command), env: { ...process.env, LOOM_INPUT_FILE: file } };
|
|
22
|
+
}
|
|
23
|
+
export function findExecutable(command, env = process.env, cwd = process.cwd()) {
|
|
24
|
+
const dirs = /[/\\]/.test(command) ? [""] : (env.PATH ?? env.Path ?? "").split(path.delimiter).filter(Boolean);
|
|
25
|
+
const extensions = process.platform === "win32" ? ["", ...(env.PATHEXT ?? ".EXE;.COM;.CMD;.BAT").split(";")] : [""];
|
|
26
|
+
for (const dir of dirs)
|
|
27
|
+
for (const ext of extensions) {
|
|
28
|
+
const file = path.resolve(cwd, dir.replace(/^"|"$/g, ""), command + ext.toLowerCase());
|
|
29
|
+
try {
|
|
30
|
+
if (fs.statSync(file).isFile())
|
|
31
|
+
return file;
|
|
32
|
+
}
|
|
33
|
+
catch { /* try the next path */ }
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
export function commandInvocation(command, args, options = {}) {
|
|
38
|
+
if (process.platform !== "win32")
|
|
39
|
+
return { command, args: [...args] };
|
|
40
|
+
const file = findExecutable(command, options.env, typeof options.cwd === "string" ? options.cwd : undefined);
|
|
41
|
+
if (!file || /\.(exe|com)$/i.test(file))
|
|
42
|
+
return { command: file ?? command, args: [...args] };
|
|
43
|
+
let text;
|
|
44
|
+
try {
|
|
45
|
+
const fd = fs.openSync(file, "r");
|
|
46
|
+
try {
|
|
47
|
+
const buf = Buffer.alloc(8192);
|
|
48
|
+
text = buf.subarray(0, fs.readSync(fd, buf)).toString();
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
fs.closeSync(fd);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return { command: file, args: [...args] };
|
|
56
|
+
}
|
|
57
|
+
if (/^#![^\r\n]*\bnode\b/.test(text) || /\.[cm]?js$/i.test(file))
|
|
58
|
+
return { command: process.execPath, args: [file, ...args] };
|
|
59
|
+
// npm/cmd-shim uses %dp0% (older versions: %~dp0) for its own directory.
|
|
60
|
+
// Only unwrap a Node launcher; a user's arbitrary batch file is not JavaScript.
|
|
61
|
+
if (/\.(cmd|bat)$/i.test(file) && /(?:^|[\s"\\/])node(?:\.exe)?(?:["\s]|$)/im.test(text)) {
|
|
62
|
+
const entry = /"%(?:dp0%|~dp0)[\\/]([^"\r\n]+)"\s+%\*/i.exec(text)?.[1];
|
|
63
|
+
if (entry) {
|
|
64
|
+
const script = path.resolve(path.dirname(file), entry);
|
|
65
|
+
if (fs.existsSync(script))
|
|
66
|
+
return { command: process.execPath, args: [script, ...args] };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// npm also wraps native binaries (OpenCode 1.19+ on Windows). Unwrap only
|
|
70
|
+
// its literal %dp0% executable + %* form, without interpreting batch code.
|
|
71
|
+
if (/\.(cmd|bat)$/i.test(file)) {
|
|
72
|
+
const entry = /"%(?:dp0%|~dp0)[\\/]([^"\r\n]+\.(?:exe|com))"\s+%\*/i.exec(text)?.[1];
|
|
73
|
+
if (entry) {
|
|
74
|
+
const binary = path.resolve(path.dirname(file), entry);
|
|
75
|
+
if (fs.existsSync(binary))
|
|
76
|
+
return { command: binary, args: [...args] };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// npm also writes an extensionless POSIX shim next to the .cmd file.
|
|
80
|
+
if (!path.extname(file) && fs.existsSync(`${file}.cmd`))
|
|
81
|
+
return commandInvocation(`${file}.cmd`, args, options);
|
|
82
|
+
return { command: file, args: [...args] };
|
|
83
|
+
}
|
|
84
|
+
export const spawn = ((command, args = [], options = {}) => {
|
|
85
|
+
if (!Array.isArray(args))
|
|
86
|
+
return nodeSpawn(command, { windowsHide: true, ...args });
|
|
87
|
+
const spec = commandInvocation(command, args, options);
|
|
88
|
+
return nodeSpawn(spec.command, spec.args, { windowsHide: true, ...options });
|
|
89
|
+
});
|
|
90
|
+
/** Native harnesses run inside an owned containment boundary on every OS. */
|
|
91
|
+
export const spawnContained = ((command, args, options = {}) => {
|
|
92
|
+
const spec = commandInvocation(command, args, options);
|
|
93
|
+
return process.platform === "win32" ? spawnWindowsJob(spec.command, spec.args, options)
|
|
94
|
+
: nodeSpawn(spec.command, spec.args, { ...options, detached: true });
|
|
95
|
+
});
|
|
96
|
+
export const execFile = ((command, args, ...rest) => {
|
|
97
|
+
const options = (typeof rest[0] === "object" && rest[0] ? rest[0] : {});
|
|
98
|
+
const spec = commandInvocation(command, args, options);
|
|
99
|
+
return nodeExecFile(spec.command, spec.args, { windowsHide: true, ...options }, ...rest.filter((v) => typeof v === "function"));
|
|
100
|
+
});
|
|
101
|
+
Object.defineProperty(execFile, promisify.custom, { value: (command, args, options = {}) => {
|
|
102
|
+
const spec = commandInvocation(command, args, options);
|
|
103
|
+
return promisify(nodeExecFile)(spec.command, spec.args, { windowsHide: true, ...options });
|
|
104
|
+
} });
|
|
105
|
+
export const execFileSync = ((command, args, options = {}) => {
|
|
106
|
+
const spec = commandInvocation(command, args, options);
|
|
107
|
+
return nodeExecFileSync(spec.command, spec.args, { windowsHide: true, ...options });
|
|
108
|
+
});
|
|
109
|
+
/** Stop the Windows process tree while its parent still exists. This is
|
|
110
|
+
* best-effort shutdown for ordinary sessions, not native-continuity containment.
|
|
111
|
+
*/
|
|
112
|
+
export async function stopWindowsTree(child) {
|
|
113
|
+
if (hasWindowsJob(child))
|
|
114
|
+
return quiesceWindowsJob(child);
|
|
115
|
+
if (!child.pid || child.exitCode !== null || child.signalCode !== null)
|
|
116
|
+
return;
|
|
117
|
+
await terminateWindowsTree(child.pid, true, () => child.exitCode === null && child.signalCode === null).catch(() => {
|
|
118
|
+
try {
|
|
119
|
+
child.kill();
|
|
120
|
+
}
|
|
121
|
+
catch { /* already gone */ }
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/** Interrupt a pipe terminal's foreground children, preserving its cmd session. */
|
|
125
|
+
export async function stopWindowsChildren(parentPid) {
|
|
126
|
+
await terminateWindowsTree(parentPid, false);
|
|
127
|
+
}
|
|
128
|
+
/** Stop a verified orphan's tree without terminating shared console hosts. */
|
|
129
|
+
export async function stopWindowsPid(pid) {
|
|
130
|
+
await terminateWindowsTree(pid, true);
|
|
131
|
+
}
|
|
132
|
+
async function terminateWindowsTree(rootPid, includeRoot, stillRunning = () => true) {
|
|
133
|
+
const { stdout } = await promisify(nodeExecFile)("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command",
|
|
134
|
+
"Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,@{Name='Created';Expression={if($_.CreationDate){$_.CreationDate.ToUniversalTime().ToString('o')}}} | ConvertTo-Json -Compress"], { windowsHide: true, timeout: 8000 });
|
|
135
|
+
const rows = JSON.parse(stdout);
|
|
136
|
+
// CIM can take seconds. A provider (or a second stop request) may have
|
|
137
|
+
// closed the child meanwhile, and Windows can reuse its PID for another
|
|
138
|
+
// process. Never act on that stale process-tree snapshot.
|
|
139
|
+
const root = rows.find(row => row.ProcessId === rootPid);
|
|
140
|
+
if (!stillRunning() || !root)
|
|
141
|
+
return;
|
|
142
|
+
const pids = [], visited = new Set();
|
|
143
|
+
const visit = (parent) => {
|
|
144
|
+
if (visited.has(parent.ProcessId))
|
|
145
|
+
return;
|
|
146
|
+
visited.add(parent.ProcessId);
|
|
147
|
+
for (const row of rows)
|
|
148
|
+
if (row.ParentProcessId === parent.ProcessId) {
|
|
149
|
+
// ParentProcessId can refer to a later process that reused an old
|
|
150
|
+
// parent's PID. UTC round-trip strings retain CIM's timestamp precision.
|
|
151
|
+
// Unknown ancestry is left alone rather than killing another session.
|
|
152
|
+
if (!parent.Created || !row.Created || row.Created < parent.Created)
|
|
153
|
+
continue;
|
|
154
|
+
// A console host can serve the surviving shell/daemon too. taskkill /T
|
|
155
|
+
// kills it and leaves later console children with DLL_INIT_FAILED.
|
|
156
|
+
if (!/^(?:conhost|OpenConsole)\.exe$/i.test(row.Name)) {
|
|
157
|
+
visit(row);
|
|
158
|
+
pids.push(row.ProcessId);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
visit(root);
|
|
163
|
+
if (includeRoot)
|
|
164
|
+
pids.push(rootPid);
|
|
165
|
+
if (pids.length)
|
|
166
|
+
await promisify(nodeExecFile)("taskkill.exe", [...pids.flatMap(pid => ["/pid", String(pid)]), "/F"], { windowsHide: true, timeout: 8000 }).catch(() => { });
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/core/process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,QAAQ,IAAI,YAAY,EAAE,YAAY,IAAI,gBAAgB,EAAqB,MAAM,oBAAoB,CAAC;AACvI,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtF,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO;QACjC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,GAAG,CAAC,EAAE,wBAAwB,EAAE,IAAI,EAAE;QACzH,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;AACpD,CAAC;AAED;iEACiE;AACjE,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,IAAY;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpH,OAAO,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACpF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/G,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpH,KAAK,MAAM,GAAG,IAAI,IAAI;QAAE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC;gBAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;oBAAE,OAAO,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;QACxF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAuB,EAAE,UAA2D,EAAE;IACvI,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7G,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9F,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC;YAAC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAAC,CAAC;IACzK,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;IAAC,CAAC;IACpD,IAAI,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAC9H,yEAAyE;IACzE,gFAAgF;IAChF,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzF,MAAM,KAAK,GAAG,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAC3F,CAAC;IACH,CAAC;IACD,0EAA0E;IAC1E,2EAA2E;IAC3E,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,sDAAsD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QACzE,CAAC;IACH,CAAC;IACD,qEAAqE;IACrE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,MAAM,CAAC;QAAE,OAAO,iBAAiB,CAAC,GAAG,IAAI,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAqB,CAAC,CAAC,OAAe,EAAE,OAA0B,EAAE,EAAE,UAAkB,EAAE,EAAE,EAAE;IAC9G,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAC/E,CAAC,CAAqB,CAAC;AAEvB,6EAA6E;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAqB,CAAC,CAAC,OAAe,EAAE,IAAc,EAAE,UAAkB,EAAE,EAAE,EAAE;IACzG,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QACrF,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACzE,CAAC,CAAqB,CAAC;AAEvB,MAAM,CAAC,MAAM,QAAQ,GAAwB,CAAC,CAAC,OAAe,EAAE,IAAc,EAAE,GAAG,IAAe,EAAE,EAAE;IACpG,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAoD,CAAC;IAC3H,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,OAAQ,YAAyB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC;AAChJ,CAAC,CAAwB,CAAC;AAC1B,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,OAAe,EAAE,IAAc,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;QAC3G,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC7F,CAAC,EAAE,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,YAAY,GAA4B,CAAC,CAAC,OAAe,EAAE,IAAc,EAAE,UAAmF,EAAE,EAAE,EAAE;IAC/K,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AACtF,CAAC,CAA4B,CAAC;AAE9B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAmB;IACvD,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO;IAC/E,MAAM,oBAAoB,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACjH,IAAI,CAAC;YAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAiB;IACzD,MAAM,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,WAAoB,EAAE,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI;IAClG,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,UAAU;QAC7G,6MAA6M,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAExP,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAiB,CAAC;IAChD,uEAAuE;IACvE,wEAAwE;IACxE,0DAA0D;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI;QAAE,OAAO;IACrC,MAAM,IAAI,GAAa,EAAE,EAAE,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IACvD,MAAM,KAAK,GAAG,CAAC,MAAkB,EAAQ,EAAE;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE,OAAO;QAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI;YAAE,IAAI,GAAG,CAAC,eAAe,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrE,kEAAkE;gBAClE,yEAAyE;gBACzE,sEAAsE;gBACtE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;oBAAE,SAAS;gBAC9E,uEAAuE;gBACvE,mEAAmE;gBACnE,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAAC,CAAC;YAClG,CAAC;IACH,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,IAAI,WAAW;QAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC,cAAc,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9K,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The prompt queue: what you've lined up for this project, run one at a time.
|
|
3
|
+
*
|
|
4
|
+
* You type while an agent is mid-turn, or while an orchestra goal is still
|
|
5
|
+
* running, and the prompt waits here instead of being refused or lost. Each
|
|
6
|
+
* item names who takes it — one agent, the orchestrator (a new goal), or the
|
|
7
|
+
* auto router — and nothing about it is final until it's sent: you can edit
|
|
8
|
+
* the text, change who it goes to, reorder it or drop it.
|
|
9
|
+
*
|
|
10
|
+
* This module is the data and its file; ProjectRuntime decides when the head
|
|
11
|
+
* of the queue may go (see ProjectRuntime.drainPromptQueue). The file lives in
|
|
12
|
+
* the project's .loom/ beside the log, so a queue survives a daemon restart —
|
|
13
|
+
* reloaded paused, because prompts you queued an hour ago shouldn't start
|
|
14
|
+
* running just because the daemon came back.
|
|
15
|
+
*/
|
|
16
|
+
export type QueueTarget = {
|
|
17
|
+
kind: "agent";
|
|
18
|
+
agentId: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "orchestra";
|
|
21
|
+
orchestrator?: string;
|
|
22
|
+
workers?: string[];
|
|
23
|
+
maxParallel?: number;
|
|
24
|
+
maxUsd?: number;
|
|
25
|
+
} | {
|
|
26
|
+
kind: "auto";
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* When a queued prompt may go, beyond "when nothing is in the way".
|
|
30
|
+
*
|
|
31
|
+
* The queue's default is as soon as it can, which is right for the next thing
|
|
32
|
+
* you want said. These are for the things you want said *later*: at an hour,
|
|
33
|
+
* once a goal is really on main rather than merely finished, or once CI has
|
|
34
|
+
* spoken. Each one is a fact the daemon can check — nothing here guesses.
|
|
35
|
+
*/
|
|
36
|
+
export type QueueCondition =
|
|
37
|
+
/** Not before this moment (epoch ms). */
|
|
38
|
+
{
|
|
39
|
+
kind: "at";
|
|
40
|
+
at: number;
|
|
41
|
+
}
|
|
42
|
+
/** After the goal that was running when this was queued has LANDED. */
|
|
43
|
+
| {
|
|
44
|
+
kind: "landed";
|
|
45
|
+
runId: string;
|
|
46
|
+
}
|
|
47
|
+
/** After that goal's PR checks are green. */
|
|
48
|
+
| {
|
|
49
|
+
kind: "checks-green";
|
|
50
|
+
runId: string;
|
|
51
|
+
}
|
|
52
|
+
/** After this many ms with no agent working. */
|
|
53
|
+
| {
|
|
54
|
+
kind: "quiet";
|
|
55
|
+
ms: number;
|
|
56
|
+
};
|
|
57
|
+
export interface QueueItem {
|
|
58
|
+
id: string;
|
|
59
|
+
text: string;
|
|
60
|
+
target: QueueTarget;
|
|
61
|
+
/** The chat it was typed in — an agent's reply comes back there. */
|
|
62
|
+
chat: string;
|
|
63
|
+
plan?: boolean;
|
|
64
|
+
/** The reply length it was sent with (brief / detailed). */
|
|
65
|
+
length?: "brief" | "detailed";
|
|
66
|
+
source: "user" | "route";
|
|
67
|
+
at: number;
|
|
68
|
+
editedAt?: number;
|
|
69
|
+
/** Native continuity freezes its target model and idempotency key at enqueue. */
|
|
70
|
+
continuity?: {
|
|
71
|
+
requestId: string;
|
|
72
|
+
model: string | null;
|
|
73
|
+
};
|
|
74
|
+
/** Hold it back until this is true — see QueueCondition. */
|
|
75
|
+
when?: QueueCondition;
|
|
76
|
+
}
|
|
77
|
+
/** A condition from the wire, checked. */
|
|
78
|
+
export declare function parseCondition(raw: unknown): QueueCondition | undefined;
|
|
79
|
+
/** The condition in the words the queue shows. */
|
|
80
|
+
export declare function describeCondition(c: QueueCondition): string;
|
|
81
|
+
export interface QueueState {
|
|
82
|
+
items: QueueItem[];
|
|
83
|
+
paused: boolean;
|
|
84
|
+
/** Why it's paused, when it paused itself (a refused send, a Stop, a restart). */
|
|
85
|
+
reason?: string;
|
|
86
|
+
}
|
|
87
|
+
export interface QueueInput {
|
|
88
|
+
text: string;
|
|
89
|
+
target?: QueueTarget;
|
|
90
|
+
chat?: string;
|
|
91
|
+
plan?: boolean;
|
|
92
|
+
length?: "brief" | "detailed";
|
|
93
|
+
source?: "user" | "route";
|
|
94
|
+
when?: QueueCondition;
|
|
95
|
+
continuity?: QueueItem["continuity"];
|
|
96
|
+
}
|
|
97
|
+
export declare const MAX_QUEUE = 100;
|
|
98
|
+
export declare const MAX_QUEUE_TEXT = 100000;
|
|
99
|
+
/** A target from the wire: validated, so nothing downstream sees a shape it doesn't know. */
|
|
100
|
+
export declare function parseTarget(raw: unknown): QueueTarget;
|
|
101
|
+
export declare class PromptQueue {
|
|
102
|
+
private file;
|
|
103
|
+
private onChange;
|
|
104
|
+
private state;
|
|
105
|
+
private seq;
|
|
106
|
+
/** `file` null keeps it in memory (tests, projects with no .loom). */
|
|
107
|
+
constructor(file: string | null, onChange?: (s: QueueState) => void);
|
|
108
|
+
snapshot(): QueueState;
|
|
109
|
+
get paused(): boolean;
|
|
110
|
+
get length(): number;
|
|
111
|
+
peek(): QueueItem | undefined;
|
|
112
|
+
add(input: QueueInput): QueueItem;
|
|
113
|
+
assertCanAdd(input: QueueInput): void;
|
|
114
|
+
edit(id: string, patch: {
|
|
115
|
+
text?: string;
|
|
116
|
+
target?: QueueTarget;
|
|
117
|
+
plan?: boolean;
|
|
118
|
+
when?: QueueCondition | null;
|
|
119
|
+
}): QueueItem;
|
|
120
|
+
remove(id: string): void;
|
|
121
|
+
/** Move an item to position `to` (0 = next to run), clamped to the queue. */
|
|
122
|
+
move(id: string, to: number): void;
|
|
123
|
+
clear(): number;
|
|
124
|
+
setPaused(paused: boolean, reason?: string): void;
|
|
125
|
+
/** Take the head to send it. */
|
|
126
|
+
shift(): QueueItem | undefined;
|
|
127
|
+
/** Put a head that couldn't go back where it was. */
|
|
128
|
+
unshift(item: QueueItem): void;
|
|
129
|
+
private must;
|
|
130
|
+
private index;
|
|
131
|
+
private changed;
|
|
132
|
+
}
|
|
133
|
+
/** The item was already sent or removed — the UI raced the queue. */
|
|
134
|
+
export declare class QueueItemGone extends Error {
|
|
135
|
+
constructor(id: string);
|
|
136
|
+
}
|