@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,39 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en" class="dark">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
|
6
|
+
<meta name="theme-color" content="#0a0a0a">
|
|
7
|
+
<link rel="manifest" href="/app/manifest.webmanifest">
|
|
8
|
+
<link rel="icon" id="favicon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='22' fill='%230a0a0a'/%3E%3Ctext x='50' y='60' font-size='36' text-anchor='middle' fill='%23fafafa' font-family='-apple-system,Segoe UI,sans-serif' font-weight='600'%3Elo%3C/text%3E%3Crect x='32' y='70' width='36' height='4' rx='2' fill='%2367e8f9'/%3E%3C/svg%3E">
|
|
9
|
+
<link rel="stylesheet" href="/app/vendor/xterm.css">
|
|
10
|
+
<title>Loom</title>
|
|
11
|
+
<script>
|
|
12
|
+
/* Apply the saved theme before first paint so there is no flash. */
|
|
13
|
+
try{var t=localStorage.getItem("loomTheme");if(t==="light"||(t==="system"&&matchMedia("(prefers-color-scheme: light)").matches))document.documentElement.classList.remove("dark")}catch(e){}
|
|
14
|
+
/* The telemetry backend's own UI, for the trace deep links, injected by the
|
|
15
|
+
daemon from LOOM_TRACE_UI_URL. Empty unless one is configured — the links
|
|
16
|
+
hide themselves rather than pointing at a guessed port. */
|
|
17
|
+
window.__loomTraceUrl="%%TRACE_UI_URL%%";
|
|
18
|
+
window.__loomPageRev="%%BUILD_REV%%";
|
|
19
|
+
</script>
|
|
20
|
+
<style>%%APP_CSS%%</style>
|
|
21
|
+
</head>
|
|
22
|
+
<body id="loom-app">
|
|
23
|
+
<!-- ADE brand marks, defined once (see brand-icons.ts). Every agent glyph on
|
|
24
|
+
the page is a <use> of one of these symbols. -->
|
|
25
|
+
%%BRAND_SPRITE%%
|
|
26
|
+
<div id="root"></div>
|
|
27
|
+
<div id="toast" role="status" aria-live="polite" aria-atomic="true"></div>
|
|
28
|
+
<div id="a11y-alert" role="alert" aria-live="assertive" class="visually-hidden"></div>
|
|
29
|
+
<!-- xterm.js, served by the daemon from node_modules: the app has no build
|
|
30
|
+
step and must work offline on a tailnet, so no bundler and no CDN. Only
|
|
31
|
+
used when the daemon has a real pty; the fallback needs none of it. -->
|
|
32
|
+
<script src="/app/vendor/xterm.js"></script>
|
|
33
|
+
<script src="/app/vendor/addon-fit.js"></script>
|
|
34
|
+
<script src="/app/vendor/addon-web-links.js"></script>
|
|
35
|
+
<script>
|
|
36
|
+
%%APP_JS%%
|
|
37
|
+
</script>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
package/docs/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Loom docs
|
|
2
|
+
|
|
3
|
+
| Doc | What's in it |
|
|
4
|
+
|---|---|
|
|
5
|
+
| [SETUP.md](SETUP.md) | Installing Loom and connecting your agents |
|
|
6
|
+
| [teams-architecture.md](teams-architecture.md) | Loom Teams: the design, all 78 decisions, and what's built |
|
|
7
|
+
| [teams.md](teams.md) | Loom Teams as a user: set up a team, share a repo, land goals, run a runner |
|
|
8
|
+
| [adapters.md](adapters.md) | How each agent CLI is driven, and how to add one |
|
|
9
|
+
| [cloud.md](cloud.md) | Loom Cloud: reaching your daemon from your phone on any network |
|
|
10
|
+
| [observability.md](observability.md) | Telemetry, the Observatory, and what's recorded |
|
|
11
|
+
| [loompad.md](loompad.md) | The LoomPad hardware controller |
|
|
12
|
+
| [design-system.md](design-system.md) | The UI's tokens and components |
|
|
13
|
+
| [integration-notes.md](integration-notes.md) | Notes from integrating t3code and agent-orchestrator ideas |
|
|
14
|
+
| [proposals/](proposals/) | Design proposals |
|
|
15
|
+
|
|
16
|
+
Code-level guides live beside the code:
|
|
17
|
+
[src/](../src/README.md), [src/adapters/](../src/adapters/README.md),
|
|
18
|
+
[src/hub/](../src/hub/README.md), [supabase/](../supabase/README.md),
|
|
19
|
+
[test/](../test/README.md), [scripts/](../scripts/README.md),
|
|
20
|
+
[desktop/](../desktop/README.md), [app/](../app/README.md),
|
|
21
|
+
[hardware/](../hardware/README.md).
|
package/docs/SETUP.md
CHANGED
|
@@ -43,6 +43,7 @@ useful.
|
|
|
43
43
|
| **Codex** | [Codex.app](https://openai.com/codex/), or `npm i -g @openai/codex` | `codex login` | `codex login status` |
|
|
44
44
|
| **OpenCode** | `curl -fsSL https://opencode.ai/install \| bash` | `opencode auth login` | `opencode --version` |
|
|
45
45
|
| **Grok Code** | [docs.x.ai](https://docs.x.ai) | `grok` (once, interactively) | `grok --version` |
|
|
46
|
+
| **Antigravity CLI** | `curl -fsSL https://antigravity.google/cli/install.sh \| bash` | `agy` (once, sign in with Google) | `agy --version` |
|
|
46
47
|
|
|
47
48
|
Two things worth knowing:
|
|
48
49
|
|
|
@@ -55,6 +56,15 @@ coming up empty doesn't mean it's missing.
|
|
|
55
56
|
**Being logged in is not optional and not detectable in advance.** Loom probes
|
|
56
57
|
whether a CLI *exists*, not whether it's authenticated. An unauthenticated agent
|
|
57
58
|
looks installed, takes your turn, and fails. Run each one once by hand first.
|
|
59
|
+
(The Antigravity CLI is the one exception Loom *can* check — `agy models` only
|
|
60
|
+
answers when you're signed in — but running it once yourself is still the move.)
|
|
61
|
+
|
|
62
|
+
**Antigravity comes in two shapes, and only one is on offer.** The **Antigravity
|
|
63
|
+
CLI** (`agy`) above is a real headless agent: it holds the baton and runs a turn
|
|
64
|
+
to completion on Gemini (or hosted Claude/GPT — `agy models` lists them), which
|
|
65
|
+
is how you offload work off your orchestrator's token budget. The Antigravity
|
|
66
|
+
**IDE** is a different thing — a GUI Loom could only watch — and the bridge that
|
|
67
|
+
drove it has been **withdrawn** in favour of the CLI.
|
|
58
68
|
|
|
59
69
|
Then ask Loom what it can see:
|
|
60
70
|
|
package/docs/adapters.md
CHANGED
|
@@ -8,7 +8,7 @@ decision:
|
|
|
8
8
|
| Can hold the baton (write lock) | ✅ | ❌ never |
|
|
9
9
|
| Must implement | `send`, live events, `injectMemory`, `interrupt`, `diff` | events (best-effort), `injectMemory` |
|
|
10
10
|
| For | agents with a real API / headless mode | GUI agents without a stable control surface |
|
|
11
|
-
| Examples | Claude Code, OpenCode
|
|
11
|
+
| Examples | Claude Code, OpenCode, Codex, Grok Code, Antigravity CLI | Kiro |
|
|
12
12
|
|
|
13
13
|
This split is deliberate (see [ARCHITECTURE.md](../ARCHITECTURE.md)): the baton
|
|
14
14
|
authorizes *edits to the user's working tree*, so it can only be held by an agent Loom
|
|
@@ -16,9 +16,15 @@ can reliably start, stream, interrupt, and account for. If your target tool only
|
|
|
16
16
|
a debug port and pixels, build a bridge; if it exposes an API, build an adapter. A
|
|
17
17
|
bridge can graduate later.
|
|
18
18
|
|
|
19
|
+
Kiro is the only bridge Loom ships. Antigravity was one too — a CDP bridge that drove
|
|
20
|
+
the IDE's chat panel over DevTools and could only watch — and that is the graduation
|
|
21
|
+
path working: it was withdrawn once `antigravity-cli` could drive the same tool headless
|
|
22
|
+
as a real adapter. The registration survives so projects that still name `antigravity`
|
|
23
|
+
open, but nothing offers it (`src/adapters/index.ts`, `WITHDRAWN_KINDS`).
|
|
24
|
+
|
|
19
25
|
## The contract
|
|
20
26
|
|
|
21
|
-
Everything lives in
|
|
27
|
+
Everything lives in `@loompad/cli/sdk`:
|
|
22
28
|
|
|
23
29
|
```ts
|
|
24
30
|
import {
|
|
@@ -27,7 +33,7 @@ import {
|
|
|
27
33
|
registerAgentKind,
|
|
28
34
|
type SendInput, // { text, briefing? }
|
|
29
35
|
type AdapterEvent // { kind, payload }
|
|
30
|
-
} from "
|
|
36
|
+
} from "@loompad/cli/sdk";
|
|
31
37
|
```
|
|
32
38
|
|
|
33
39
|
### Events you can emit
|
|
@@ -49,7 +55,7 @@ becomes context for everyone else.
|
|
|
49
55
|
### A complete adapter
|
|
50
56
|
|
|
51
57
|
```ts
|
|
52
|
-
import { AdapterBase, registerAgentKind, type SendInput } from "
|
|
58
|
+
import { AdapterBase, registerAgentKind, type SendInput } from "@loompad/cli/sdk";
|
|
53
59
|
|
|
54
60
|
export class MyAgentAdapter extends AdapterBase {
|
|
55
61
|
// available(): is the underlying tool installed/reachable?
|
|
@@ -99,13 +105,15 @@ Users then declare it in `.loom/config.json`:
|
|
|
99
105
|
```
|
|
100
106
|
|
|
101
107
|
`cfg.options` arrives in your constructor if you define one — see
|
|
102
|
-
`src/adapters/
|
|
103
|
-
|
|
108
|
+
`src/adapters/opencode.ts` for a real example, including session persistence via
|
|
109
|
+
project state and native continuity (a turn with `input.continuity` runs on its
|
|
110
|
+
binding's session and reports `turn_started` / `native_turn_accepted`). Codex and Claude Code are built differently — as warm provider
|
|
111
|
+
sessions on the contract in `src/providers/` (see `providers/agent.ts`).
|
|
104
112
|
|
|
105
113
|
### A bridge
|
|
106
114
|
|
|
107
115
|
```ts
|
|
108
|
-
import { BridgeBase, registerAgentKind } from "
|
|
116
|
+
import { BridgeBase, registerAgentKind } from "@loompad/cli/sdk";
|
|
109
117
|
|
|
110
118
|
export class MyGuiBridge extends BridgeBase {
|
|
111
119
|
async available() { return true; }
|
|
@@ -117,7 +125,12 @@ export class MyGuiBridge extends BridgeBase {
|
|
|
117
125
|
// driving the GUI agent points it at that file.
|
|
118
126
|
}
|
|
119
127
|
|
|
120
|
-
|
|
128
|
+
// The third argument is the tier, and it defaults to "adapter". Omit it and your
|
|
129
|
+
// bridge is registered as an adapter: the roster answers "adapter or bridge?" from
|
|
130
|
+
// this map — it has to, for kinds that are switched off and have no instance to ask
|
|
131
|
+
// — so a disabled bridge would advertise itself as an adapter and the composer,
|
|
132
|
+
// which filters its chips on that field, would offer it the baton.
|
|
133
|
+
registerAgentKind("my-gui", (cfg, dir) => new MyGuiBridge(cfg.id, "my-gui", dir), "bridge");
|
|
121
134
|
```
|
|
122
135
|
|
|
123
136
|
## Ground rules
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Native Brain continuity
|
|
2
|
+
|
|
3
|
+
The deterministic implementation is **opt-in**. This guide describes what works
|
|
4
|
+
now; it does not claim every milestone in the [approved plan](proposals/brain-continuity-implementation.md)
|
|
5
|
+
is finished. Release gates and results are in [BRAIN-TODO](refactoring/BRAIN-TODO.md)
|
|
6
|
+
and [BRAIN-NOTES](refactoring/BRAIN-NOTES.md).
|
|
7
|
+
|
|
8
|
+
## Enable and switch
|
|
9
|
+
|
|
10
|
+
Enable **Native context continuity** in Settings → Preferences, or set
|
|
11
|
+
`brain.continuity: true` in `.loom/config.json`. Finish/reconcile active turns and clear queued prompts before
|
|
12
|
+
changing modes. The default remains the legacy workflow.
|
|
13
|
+
|
|
14
|
+
Select Codex, Claude Code or OpenCode in an ordinary chat. The next request captures its
|
|
15
|
+
target/model. Requests sent during another foreground turn queue until it finishes;
|
|
16
|
+
later picker changes do not retarget them. Explicit handoff/Stop interrupts, waits
|
|
17
|
+
for process close, and refuses unproven quiescence. Preparing turns can also be stopped.
|
|
18
|
+
|
|
19
|
+
| Capability | Current support |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| Codex | Any installed version; `codex app-server`, explicit `thread/resume`; context in ordinary turn input (stdin, no argv limit). Acceptance is the `turn/start` response or `turn/started`. |
|
|
22
|
+
| Claude Code | Any installed version, driven through the Claude Agent SDK; explicit resume by session; context in the ordinary user message (stdin). Acceptance is the `requesting` status or the first output. |
|
|
23
|
+
| Lost native session | A resume that finds no session fails before any turn starts. The adapter reports `NativeSessionMissing`; the receipt fails and the binding moves to a new epoch, so the next packet reconstructs into a fresh session. |
|
|
24
|
+
| Harness health | Each native CLI is probed with `--version` every 20 s and before dispatch. An unreachable CLI refuses the turn before the request is recorded. Status reports `available` and `cliVersion`; transitions are logged. Protocol drift appears as missing acceptance evidence, never as success. |
|
|
25
|
+
| Per-chat model | Supported. Changing the model keeps the same native session (Codex and Claude accept a model on resume; OpenCode switches the session's model in place); other configuration changes select a new binding. |
|
|
26
|
+
| OpenCode | Driven over `opencode serve`'s HTTP API (verified on 1.18.31); explicit resume by session; context in the ordinary prompt. Acceptance is the prompt's admission; the turn is over, and quiescent, when `/api/session/active` no longer lists the session. A session the server no longer has fails before anything is sent, and the next packet rebuilds in a new one. An agent pointed at a running server (`baseUrl`) is probed by that server's health. |
|
|
27
|
+
| Bridges | Native continuity unsupported; legacy workflow available. |
|
|
28
|
+
| Parallel subagents/orchestra | Unsupported in this sequential mode. |
|
|
29
|
+
| Embeddings/inference/cheap helpers | Not loaded or launched by this mode; helpers disabled. |
|
|
30
|
+
| Attachments | Existing `[image]`/`[file]` upload protocol rejected; ordinary workspace references usable. |
|
|
31
|
+
| Native compaction | Every harness reports it: Claude as `status: compacting` then `compact_boundary`, Codex as a `contextCompaction` item, OpenCode as `session.next.compaction.started`/`.ended`. The binding is marked compacted, and the next packet rebuilds reviewed state and recent history into the same resumed session. The UI shows compaction while it runs, and the context in use against the model's window. No private transcript modifications. |
|
|
32
|
+
|
|
33
|
+
Checked fixtures are not live account validation on every listed version or
|
|
34
|
+
cross-platform packaging certification.
|
|
35
|
+
|
|
36
|
+
## Context and storage
|
|
37
|
+
|
|
38
|
+
One ordinary foreground request contains an origin-labelled historical block and
|
|
39
|
+
the current request once. What the block carries depends on the target session:
|
|
40
|
+
|
|
41
|
+
- **Resumed session (delta).** The native session already holds everything earlier
|
|
42
|
+
packets gave it and its own turns. It receives only what it lacks: user messages
|
|
43
|
+
sent to another agent meanwhile, other agents' work since its last turn, and
|
|
44
|
+
reviewed items if they changed. Returning after a short detour costs roughly the
|
|
45
|
+
size of that detour, not the conversation.
|
|
46
|
+
- **New or compacted session (reconstruction).** Current reviewed items, the most
|
|
47
|
+
recent user messages exactly, one-line headlines for older user messages (full
|
|
48
|
+
text in a local evidence file) and recent observations, all within the target.
|
|
49
|
+
|
|
50
|
+
A request becomes conversation history only once it may have reached a harness.
|
|
51
|
+
Queued, overflowed or refused requests are not shown to other turns. Discussion is not automatically accepted
|
|
52
|
+
as a decision; agent claims are not automatically verified work. Corrections carry
|
|
53
|
+
revision/supersession and source references. Small user points never depend on top-K.
|
|
54
|
+
|
|
55
|
+
Canonical originals remain in `.loom/log.db` on EventLog's existing connection.
|
|
56
|
+
Brain adds versioned requests, native bindings, items/revisions/dispositions, packets,
|
|
57
|
+
receipts and FTS5 projections with lexical fallback. There is no second canonical
|
|
58
|
+
database or vector service. Writes retain the synchronous owner semantics; worker
|
|
59
|
+
isolation is a measured follow-up, without `Atomics.wait` or memory-only acknowledgements.
|
|
60
|
+
|
|
61
|
+
Source references include project, event ID, SHA-256 and validated UTF-8 spans.
|
|
62
|
+
Packets, rendered text/hashes and receipts are separate immutable/transitioned records.
|
|
63
|
+
Native IDs are scoped to chat, agent instance, workspace, compatibility fingerprint
|
|
64
|
+
and epoch. Ambiguous legacy instance IDs are neither adopted nor overwritten.
|
|
65
|
+
|
|
66
|
+
App packet assembly prevents cross-chat injection. A native coding harness with
|
|
67
|
+
project filesystem access can still inspect other local files; application scoping
|
|
68
|
+
is not a sandbox isolating private chats from a trusted local agent.
|
|
69
|
+
|
|
70
|
+
## Budgets and checkpoints
|
|
71
|
+
|
|
72
|
+
The default target is **6,000 estimated turn-input tokens**, including the current
|
|
73
|
+
request and app-added context, estimated from UTF-8 bytes / 3,
|
|
74
|
+
rounded up. This is a heuristic, not a provider tokenizer or verified native capacity.
|
|
75
|
+
Native history, tools, output and provider caching affect usage outside
|
|
76
|
+
that estimate. The wire field retains its v1 name `estimatedAddedTokens`. Resuming a native session does not imply free or unlimited context.
|
|
77
|
+
|
|
78
|
+
Priority is: reviewed items and the current request, then user messages (exact
|
|
79
|
+
newest-first up to about 75% of the target, then headlines), then observations.
|
|
80
|
+
Nothing is dropped silently: each source is recorded as exact, summarized
|
|
81
|
+
(reviewed checkpoint), referenced (headline plus evidence file) or omitted.
|
|
82
|
+
Omitted observations are reconsidered by the next delta. Overflow now occurs only
|
|
83
|
+
when reviewed items plus the current request exceed the target. It saves the
|
|
84
|
+
request/packet without starting a coding turn. The review dialog
|
|
85
|
+
lets you increase the target or create a reviewed checkpoint from selected originals,
|
|
86
|
+
then resume the saved request. Increasing the target can consume more quota and
|
|
87
|
+
still exceed native capacity. Exact restrictions and unresolved questions belong in
|
|
88
|
+
the checkpoint; the app does not certify your summary's fidelity.
|
|
89
|
+
|
|
90
|
+
Original checkpoint evidence is accessible as content-addressed local JSON under
|
|
91
|
+
`.loom/brain/artifacts/`. It is flushed and atomically finalized before reference.
|
|
92
|
+
Submission checks integrity and rejects unsafe paths. Unreferenced crash artifacts
|
|
93
|
+
are retained for now; automatic GC/deletion/retention remains a release gate.
|
|
94
|
+
|
|
95
|
+
Checkpoints can be created or changed only while no agent turn is running, so a
|
|
96
|
+
running agent cannot forge user-reviewed context through the local API.
|
|
97
|
+
|
|
98
|
+
Protocol limits: 4 MB serialized contract input, nesting depth 32, 1 million
|
|
99
|
+
characters per text field, 1 MB rendered context, 10,000 protected messages/items,
|
|
100
|
+
1,000 item sources, 32 MB native JSONL records/retrieval artifacts, 100 MB offline JSONL imports, and
|
|
101
|
+
an explicitly chosen added-context target of 128–100,000 estimated tokens.
|
|
102
|
+
Exceeding limits produces an error/overflow instead of silent truncation.
|
|
103
|
+
|
|
104
|
+
## Delivery and recovery
|
|
105
|
+
|
|
106
|
+
`prepared` means stored; `submitting` means durable intent to call the harness.
|
|
107
|
+
`accepted` requires correlated native turn/output evidence, not spawn or initialization.
|
|
108
|
+
Execution is separately `running`, `complete`, `failed`, `interrupted` or `unknown`.
|
|
109
|
+
A provider error may arrive before process exit; it does not release the runtime
|
|
110
|
+
writer barrier early. Accepted does not mean understood or retained.
|
|
111
|
+
|
|
112
|
+
After restart/lost acknowledgement, uncertain runs keep their workspace lease.
|
|
113
|
+
Inspect native processes and changed files, then explicitly reconcile with evidence.
|
|
114
|
+
Reconciliation clears the lease and increments the binding epoch; it does not replay
|
|
115
|
+
the action. Reconciliation is atomic with binding invalidation and cannot be repeated
|
|
116
|
+
on a resolved receipt. Retry is a new deliberate request. Failed stops block successors.
|
|
117
|
+
|
|
118
|
+
Native POSIX launches own a process group. Parent exit starts inherited-child cleanup;
|
|
119
|
+
completion waits for containment and output drain. Unknown termination retains the
|
|
120
|
+
writer lease. Escaped/detached children are not fully contained; inspect them during
|
|
121
|
+
manual recovery. Windows native harnesses launch inside kill-on-close Job Objects;
|
|
122
|
+
the launch handshake completes containment before any harness or tool can start.
|
|
123
|
+
Shutdown verifies zero job members, and failed inspection retains the writer lease.
|
|
124
|
+
The daemon probes assignment on the current host (including enclosing jobs) before
|
|
125
|
+
enabling native continuity. OpenCode supports both the legacy `/api/session` API
|
|
126
|
+
and npm 1.19.0's `/session/:id/prompt_async` admission and `/session/status` idle proof.
|
|
127
|
+
App-owned diff/commit work also finishes before the next native turn starts.
|
|
128
|
+
|
|
129
|
+
The Brain pane lists the latest 100 attempt summaries and loads individual full
|
|
130
|
+
packets on demand. Project-authenticated routes under
|
|
131
|
+
`/api/projects/:id/brain/continuity` are:
|
|
132
|
+
|
|
133
|
+
| Method/path | Purpose |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| `GET /?requestId=...` | Bounded attempt summaries, counts, estimates and outcomes. |
|
|
136
|
+
| `GET /packets/:packetId` | One packet and exact rendered text/hash. |
|
|
137
|
+
| `GET /source/:eventId?chat=...` | Scoped original text/source hash. |
|
|
138
|
+
| `GET /items?chat=...`, `POST /items` | Reviewed `ContextItemV1` records. |
|
|
139
|
+
| `POST /checkpoint` | `{chat,itemId,eventIds,reviewed:true}`; atomic full-source dispositions. |
|
|
140
|
+
| `POST /requests/:requestId/resume` | `{targetAddedTokens}`; rebuild an unsubmitted overflow/preflight request. Submitted requests cannot be replayed here. |
|
|
141
|
+
| `POST /search/rebuild` | `{}`; rebuild FTS transactionally from canonical events. |
|
|
142
|
+
| `POST /reconcile` | `{receiptId,evidence,quiescent:true}`; explicit uncertain-run reconciliation. |
|
|
143
|
+
|
|
144
|
+
`POST /api/projects/:id/messages` accepts `requestId`. Same ID/content/target does
|
|
145
|
+
not append/execute twice; different content is a conflict. Captured queued text,
|
|
146
|
+
target and model are immutable, including whitespace. Native queue action edits are
|
|
147
|
+
unsupported until durable supersession is implemented; remove the unsent entry and
|
|
148
|
+
submit a new request. Removal stops dispatch, but retains original evidence.
|
|
149
|
+
Autonomous routes, orchestra and subagents reject before starting in native mode.
|
|
150
|
+
|
|
151
|
+
## Migration and ownership
|
|
152
|
+
|
|
153
|
+
Activation backs up SQLite with `VACUUM INTO` before schema migration. Request/event
|
|
154
|
+
transactions publish only after commit. A second live Brain owner or unowned event
|
|
155
|
+
writer is refused. Dead-owner takeover is conservative; live/reused PIDs do not
|
|
156
|
+
authorize takeover. Use a local filesystem; network-filesystem recovery is not certified.
|
|
157
|
+
|
|
158
|
+
Legacy JSONL remains readable with `LOOM_STORE=jsonl` but cannot provide transactional
|
|
159
|
+
continuity. Stop the daemon, then run:
|
|
160
|
+
|
|
161
|
+
```sh
|
|
162
|
+
loom brain:migrate /path/to/project
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
The importer backs up JSONL/SQLite, preserves IDs/Main history and records a manifest.
|
|
166
|
+
Repeated imports are idempotent. Malformed records/conflicting IDs abort the import;
|
|
167
|
+
distinct histories are never merged/renumbered silently. Original files remain.
|
|
168
|
+
An unmatched SQLite/JSONL pair fails visibly. New SQLite events are not automatically
|
|
169
|
+
copied back to JSONL for an older reader; rollback requires explicit backup/export
|
|
170
|
+
reconciliation.
|
|
171
|
+
|
|
172
|
+
## Verification and follow-ups
|
|
173
|
+
|
|
174
|
+
Protocol fakes (a Claude CLI speaking the SDK control protocol, a Codex app-server
|
|
175
|
+
speaking JSON-RPC; `test/native-fakes.ts`) test switching, chat isolation, corrections, explicit resume after restart,
|
|
176
|
+
captured queue targets/models, idempotency, protected overflow and uncertain delivery.
|
|
177
|
+
Storage tests exercise migration conflicts/rollback, SQLite contention, commit-before-
|
|
178
|
+
publication and unknown schema rejection. Ordinary tests make no paid model calls.
|
|
179
|
+
|
|
180
|
+
Remaining gates include isolated account-supported
|
|
181
|
+
cheap helpers, OpenCode parity, retention/GC, full platform packaging and long-history
|
|
182
|
+
quality/performance comparisons. Electron optimization remains future work.
|
|
183
|
+
See [architecture](../ARCHITECTURE.md) and the linked notes/TODO for measured evidence.
|
|
184
|
+
|
|
185
|
+
Cleanup evidence and the complete E01–E64 status audit are in
|
|
186
|
+
[BRAIN-AUDIT](refactoring/BRAIN-AUDIT.md).
|
package/docs/cloud.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Loom Cloud setup (Supabase)
|
|
2
|
+
|
|
3
|
+
One Supabase project powers three optional features:
|
|
4
|
+
|
|
5
|
+
| Feature | Uses | Without it |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| **Loom Cloud relay**: phone ↔ computer from any network | Realtime (broadcast) | The phone works on the same Wi-Fi or tailnet only |
|
|
8
|
+
| **Sign in with Google** in the phone app | Auth | "Continue without an account" still works fully |
|
|
9
|
+
| **Anonymous usage stats** (country only) | one Postgres table | Nothing is sent |
|
|
10
|
+
|
|
11
|
+
The free tier covers all three. Loom runs no server of its own, but out of the
|
|
12
|
+
box the relay and the Team Hub use Loom's hosted Supabase project (see
|
|
13
|
+
`src/core/hosted.ts`). Everything below points them at a project of your own.
|
|
14
|
+
|
|
15
|
+
## 1. Create the project
|
|
16
|
+
|
|
17
|
+
1. Go to https://supabase.com/dashboard and create a **New project**.
|
|
18
|
+
2. Open **Project Settings → API** and copy two values:
|
|
19
|
+
- the **Project URL**: `https://<ref>.supabase.co`
|
|
20
|
+
- the **anon public** key.
|
|
21
|
+
|
|
22
|
+
The anon key is designed to be public. It ships inside the app, and everything
|
|
23
|
+
it can reach is locked down by the policies below.
|
|
24
|
+
|
|
25
|
+
## 2. Realtime (the relay)
|
|
26
|
+
|
|
27
|
+
The relay uses **broadcast** channels named `loom-relay:<random id>`. Nothing is
|
|
28
|
+
stored, and every message is end-to-end encrypted with a key that exists only in
|
|
29
|
+
your pairing QR.
|
|
30
|
+
|
|
31
|
+
- **Realtime → Settings**: keep **public channels allowed**. This is the default.
|
|
32
|
+
If "private channels only" is on, the relay can't join.
|
|
33
|
+
|
|
34
|
+
Turn it on for your computer:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
loom cloud enable --url https://<ref>.supabase.co --key <anon key>
|
|
38
|
+
loom pair # the QR now carries the relay credentials in its #fragment
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Or set `LOOM_SUPABASE_URL` / `LOOM_SUPABASE_ANON_KEY` in the daemon's environment
|
|
42
|
+
and use **Settings → Loom Cloud** in the desktop app.
|
|
43
|
+
|
|
44
|
+
- `loom cloud rotate` mints a new key. Phones that paired through the cloud must
|
|
45
|
+
pair again.
|
|
46
|
+
- `loom cloud disable` leaves the channel.
|
|
47
|
+
|
|
48
|
+
## 3. Sign in with Google
|
|
49
|
+
|
|
50
|
+
1. **Google Cloud Console → APIs & Services → Credentials → Create credentials →
|
|
51
|
+
OAuth client ID**:
|
|
52
|
+
- Application type: **Web application**
|
|
53
|
+
- Authorized redirect URI: `https://<ref>.supabase.co/auth/v1/callback`
|
|
54
|
+
2. **Supabase → Authentication → Sign In / Providers → Google**:
|
|
55
|
+
- enable it;
|
|
56
|
+
- paste the **Client ID** and **Client secret**.
|
|
57
|
+
3. **Supabase → Authentication → URL Configuration → Redirect URLs**: add
|
|
58
|
+
- `loom://auth-callback` (installed app)
|
|
59
|
+
- `exp://**`, for development in Expo Go only.
|
|
60
|
+
4. In the phone app, copy `app/.env.example` to `app/.env` and fill in:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
EXPO_PUBLIC_SUPABASE_URL=https://<ref>.supabase.co
|
|
64
|
+
EXPO_PUBLIC_SUPABASE_ANON_KEY=<anon key>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
For EAS builds, set the same two names as EAS environment variables.
|
|
68
|
+
|
|
69
|
+
An account is optional. Loom's local features never need one.
|
|
70
|
+
|
|
71
|
+
## 4. Anonymous usage stats
|
|
72
|
+
|
|
73
|
+
Run [`supabase/migrations/0001_app_opens.sql`](../supabase/migrations/0001_app_opens.sql)
|
|
74
|
+
in **SQL Editor**, or use `supabase db push` if you use the CLI.
|
|
75
|
+
|
|
76
|
+
**What is collected, per app open (at most once a day):**
|
|
77
|
+
- **country**: from the phone's region setting. No IP address, no location.
|
|
78
|
+
- **platform**
|
|
79
|
+
- **app version**
|
|
80
|
+
|
|
81
|
+
**What is not collected:** no user id, no device id, no email, no prompts, no code.
|
|
82
|
+
|
|
83
|
+
- Anyone can insert. Nobody but the service role can read.
|
|
84
|
+
- The phone app has an **Anonymous usage stats** switch to turn it off.
|
|
85
|
+
|
|
86
|
+
Read the counts in the SQL editor, which runs as the service role:
|
|
87
|
+
|
|
88
|
+
```sql
|
|
89
|
+
select country, count(*) from app_opens group by 1 order by 2 desc;
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Security model, in one paragraph
|
|
93
|
+
|
|
94
|
+
- **Supabase relays but cannot read.** Every relay message is
|
|
95
|
+
XChaCha20-Poly1305-sealed with a 32-byte key minted on your computer. That key
|
|
96
|
+
travels only in the pairing link's URL fragment, which is never sent to a server.
|
|
97
|
+
- **Requests are authorized exactly as on the LAN.** Your computer runs each
|
|
98
|
+
relayed request against itself, with the phone's own paired token. Revoking a
|
|
99
|
+
phone (`loom clients --revoke`) stops its requests the same way over the cloud.
|
|
100
|
+
Every phone paired to one computer shares one relay key, though, so a revoked
|
|
101
|
+
phone that kept the key can still *read* the others' traffic until you run
|
|
102
|
+
`loom cloud rotate` (which re-pairs everyone).
|
|
103
|
+
- **A captured request can't be replayed.** Each one carries its send time
|
|
104
|
+
inside the seal; your computer refuses anything stamped more than ten minutes
|
|
105
|
+
off and never runs the same request id twice.
|
|
106
|
+
- **The local admin bootstrap is refused over the relay.**
|
|
107
|
+
- Someone who learns your channel id still can't read or forge anything without
|
|
108
|
+
the key.
|
package/docs/crews.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
## Desktop and phone controls
|
|
4
|
+
|
|
5
|
+
Crew is available beside Orchestra on desktop and in the phone project tabs.
|
|
6
|
+
Pick Ship, Fan-out or Race in Play and limits before starting the next goal.
|
|
7
|
+
Each active seat shows its own work, goal spend and native context epoch. The
|
|
8
|
+
board keeps Planned -> Building -> Review -> Testing -> Ready to integrate -> Done;
|
|
9
|
+
Race waits for Choose this result before integrating a winner.
|
|
10
|
+
|
|
11
|
+
Pause finishes active turns and then prevents new turns. Resume keeps a plan
|
|
12
|
+
waiting for approval. Budget and team holds explain why work stopped. A native
|
|
13
|
+
recovery warning requires inspecting/reconciling the action first; Resume is
|
|
14
|
+
not offered while the receipt is uncertain. Refresh context starts a new
|
|
15
|
+
native epoch only when it is safe to do so.
|
|
16
|
+
|
|
17
|
+
Team requests and runner crews contains encrypted requests for owner approval
|
|
18
|
+
and remote runner progress. Start composer goal on my runner queues the goal
|
|
19
|
+
text from the composer; the runner's plan still needs the owner's approval.
|
|
20
|
+
Completed runner goals provide Review PR; humans merge them.
|
|
21
|
+
|
|
22
|
+
Crew cards also appear in the ordinary Board with their crew, stage and seat.
|
|
23
|
+
These are scheduler-owned cards; open Crew to control them. Fleet includes
|
|
24
|
+
active crews, and a crew notification opens the corresponding Crew view.
|
|
25
|
+
|
|
26
|
+
CLI examples:
|
|
27
|
+
|
|
28
|
+
```powershell
|
|
29
|
+
loom crew pause --crew ship
|
|
30
|
+
loom crew resume --crew ship
|
|
31
|
+
loom crew pick --crew ship --to builder-2
|
|
32
|
+
loom crew budget --crew ship --amount 15
|
|
33
|
+
loom crew overlap --crew ship --card c12 --decision narrow --touches 'src/api/**'
|
|
34
|
+
loom crew refresh --crew ship --to reviewer
|
|
35
|
+
loom crew deliver --crew ship
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Physical native-phone acceptance, hosted migration acceptance and trusted
|
|
39
|
+
installer signing are separate checks. The local browser checks and native
|
|
40
|
+
Windows orchestration evidence do not substitute for them.
|
|
41
|
+
The hosted hub needs migration `0010_crew_coordination.sql` for requests and
|
|
42
|
+
control jobs at full capacity. Review/apply it separately with admin access;
|
|
43
|
+
Loom does not apply it. The self-hosted hub supports these paths directly.
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
A reviewed role/runner permission ceiling is checked against the actual harness
|
|
47
|
+
before work starts. OpenCode's `ask` mode is currently unverified/unsupported,
|
|
48
|
+
so a team role requiring it must use Codex/Claude (or a separately reviewed,
|
|
49
|
+
supported role setting). Loom refuses the seat instead of silently using auto.
|
|
50
|
+
Tightening permissions during a goal settles and recreates the warm adapter
|
|
51
|
+
before its next turn; native compatibility changes receive a fresh binding.
|
|
52
|
+
|
|
53
|
+
The `hub-sql` CI job runs all migrations and authorization checks in a disposable
|
|
54
|
+
PostgreSQL cluster and fails if tools are missing. It never connects to hosted
|
|
55
|
+
Supabase. Migration 0010 and the other SQL checks passed there (26 checks).
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
If an owner-approved request stays queued because a budget or startup check
|
|
59
|
+
blocked admission, Check delivery retries that known unstarted item after the
|
|
60
|
+
block is resolved. A running, delivered or failed request is never executed
|
|
61
|
+
again by this button. An interrupted delivery needs inspection and a new
|
|
62
|
+
explicit request; restarting the daemon does not silently replay it.
|
package/docs/design-system.md
CHANGED
|
@@ -11,7 +11,7 @@ Canonical token sources:
|
|
|
11
11
|
|
|
12
12
|
| Surface | Token file |
|
|
13
13
|
| --- | --- |
|
|
14
|
-
| Web app (daemon-served) + Electron shell | `src/
|
|
14
|
+
| Web app (daemon-served) + Electron shell | `src/web/styles/base.css` (`:root` light / `.dark`) |
|
|
15
15
|
| Phone app (Expo RN) | `app/src/theme.ts` |
|
|
16
16
|
|
|
17
17
|
## Color tokens — web / desktop (from Orca desktop)
|
|
@@ -164,7 +164,7 @@ xterm.js, served from `node_modules` at `/app/vendor/*` — no bundler, no CDN.
|
|
|
164
164
|
**`pipe` — the fallback** (no node-pty). `node-pty` is a native module, so it
|
|
165
165
|
is an *optionalDependency* and ships prebuilds only for macOS/Windows; Loom
|
|
166
166
|
runs headless on Linux boxes that may have no toolchain, and `npm i -g
|
|
167
|
-
|
|
167
|
+
@loompad/cli` must never break. A long-lived shell on plain pipes:
|
|
168
168
|
|
|
169
169
|
- `cd` and exported variables still persist; tabs are isolated.
|
|
170
170
|
- No tty, so the daemon reports each command's exit code and cwd out of band:
|
|
@@ -202,6 +202,35 @@ pills.
|
|
|
202
202
|
Mobile (<900px) keeps the single-column thread: chips row, glass sheets, and
|
|
203
203
|
the docked composer.
|
|
204
204
|
|
|
205
|
+
## The thread (1.1 layer)
|
|
206
|
+
|
|
207
|
+
The last block of the stylesheet ("Loom 1.1 design layer") is the finish on
|
|
208
|
+
top of the tokens above; it uses the same tokens and wins by order.
|
|
209
|
+
|
|
210
|
+
- **One reading column** — `--measure: 760px` with a `--gutter` either side.
|
|
211
|
+
Prose is Geist at 14.5px / 1.72; mono is for code, paths and ids only.
|
|
212
|
+
- **A reply is a byline, not a bubble.** `.who` = 22px mark tile (`.av`),
|
|
213
|
+
name, model pill, time (on hover). The body indents 30px under the name.
|
|
214
|
+
An agent continuing its own turn (`.msg.agent.cont`) drops the byline.
|
|
215
|
+
- **Your message** is the only bubble: `--secondary`, 18px radius with a
|
|
216
|
+
6px tail corner, right-aligned.
|
|
217
|
+
- **Tool use** folds: consecutive `.tool` rows become one `details.acts`
|
|
218
|
+
whose summary counts them ("Ran 3 commands, read 2 files").
|
|
219
|
+
- **Every turn ends on `.turnend`** — agent · duration · model · cost.
|
|
220
|
+
- **Live** — `#feedlive` holds a `.livebox` per working agent: a bar
|
|
221
|
+
(spinning ring + shimmer label + timer) until text arrives, then the reply
|
|
222
|
+
itself with a cyan `.caret`. Never logged; the finished message replaces it.
|
|
223
|
+
- **Cards** — `.plancard` (orchestrator plan), `.nicard` (needs you, warn
|
|
224
|
+
tint), `.apcard` (approval), `.errcard` (error, raw payload folded),
|
|
225
|
+
`.odone` (orchestra complete, ok tint). One radius (14px), one shadow.
|
|
226
|
+
- **Motion** — custom `--ease-out`; nothing over 250ms on UI; no animation on
|
|
227
|
+
keyboard-driven actions; `prefers-reduced-motion` turns it all off.
|
|
228
|
+
- **Confirmations** are `askConfirm()` (an in-app `.cfmodal`), not
|
|
229
|
+
`window.confirm`.
|
|
230
|
+
- **Regex escapes in the page are written doubled** (`\\s`), because the
|
|
231
|
+
page is one template literal and a single backslash is eaten — a test
|
|
232
|
+
enforces it.
|
|
233
|
+
|
|
205
234
|
## Window chrome (Electron)
|
|
206
235
|
|
|
207
236
|
Matches Orca: `titleBarStyle: hiddenInset` (macOS) with traffic lights at
|