@loompad/cli 0.1.0 → 1.1.2
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 +1054 -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 +4646 -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/release-notes/v1.1.2.md +21 -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,77 @@
|
|
|
1
|
+
## Loom 0.2.3 — an Update button, and a Browser tab that runs your app
|
|
2
|
+
|
|
3
|
+
### Loom updates itself
|
|
4
|
+
|
|
5
|
+
There are releases now, so Loom checks for one — a quiet pill in the status
|
|
6
|
+
bar, never a banner — and **Settings → Updates** has the button.
|
|
7
|
+
|
|
8
|
+
It says what it will do before it does it, because that depends on how you
|
|
9
|
+
installed it: a **git checkout** pulls, installs and rebuilds; a **global npm
|
|
10
|
+
install** reinstalls itself; anything else is pointed at the release rather
|
|
11
|
+
than having a command guessed at and run over it. A checkout with uncommitted
|
|
12
|
+
changes is refused — that tree is yours. The commands run with their output
|
|
13
|
+
streaming, and the daemon comes back on the new build with the page
|
|
14
|
+
reconnecting to it.
|
|
15
|
+
|
|
16
|
+
From the terminal: `loom update --check` to look, `loom update` to do it.
|
|
17
|
+
|
|
18
|
+
*(The desktop app still sends you to the release page: updating itself needs a
|
|
19
|
+
signed app, which needs a certificate. That's its own issue.)*
|
|
20
|
+
|
|
21
|
+
### The Browser tab becomes a real browser pane
|
|
22
|
+
|
|
23
|
+
It used to be an address bar and an iframe: you typed a port and hoped. Now
|
|
24
|
+
Loom knows what it's showing.
|
|
25
|
+
|
|
26
|
+
- **Your dev servers, run by Loom.** Declared under `servers` in
|
|
27
|
+
`.loom/config.json` and suggested from `package.json` — a suggestion you
|
|
28
|
+
accept, never something that starts itself. Start, stop and restart from the
|
|
29
|
+
rail or with `loom servers`.
|
|
30
|
+
- **State that's a fact, not a guess:** *running* means a port answered,
|
|
31
|
+
*starting* means the process is up and nothing is listening yet, and
|
|
32
|
+
*crashed* carries the exit code it died with.
|
|
33
|
+
- **Server output under the page it serves**, live — usually where the reason
|
|
34
|
+
for a blank frame is — and a server that dies while an agent works against it
|
|
35
|
+
says so in the thread.
|
|
36
|
+
- **The page reports back.** Loom previews a server through its own proxy,
|
|
37
|
+
which forwards everything (including the socket hot reload rides on) and
|
|
38
|
+
injects one small script. The **Page** pane shows what the page logged and
|
|
39
|
+
what it fetched, and **one click puts a line in the composer** as the context
|
|
40
|
+
an agent needs.
|
|
41
|
+
- **Pick the broken thing.** Click an element in the preview and its selector,
|
|
42
|
+
text, size and markup land in the composer.
|
|
43
|
+
- **A camera** that captures the live page into the composer, at the width
|
|
44
|
+
you're previewing, using the project's own Playwright.
|
|
45
|
+
- **Width presets** (Fit / 375 / 768 / 1280, remembered per project) and
|
|
46
|
+
**auto-reload** when an agent changes what a server serves.
|
|
47
|
+
|
|
48
|
+
Nothing about a previewed page is rewritten — the injected script only reports,
|
|
49
|
+
and stays silent if any part of it fails.
|
|
50
|
+
|
|
51
|
+
### Also fixed
|
|
52
|
+
|
|
53
|
+
- An overridden `loom/review` no longer leaves its own "reviewing…" status
|
|
54
|
+
pending for ever on a commit the owner already decided about.
|
|
55
|
+
- A bad retarget of a queued prompt is refused when you make it, not when the
|
|
56
|
+
queue reaches it.
|
|
57
|
+
- A dev server that accepts a connection and never answers gets a 504 that says
|
|
58
|
+
so, instead of a preview that hangs.
|
|
59
|
+
- Five smaller ones found while building the preview: a buffered page keeping
|
|
60
|
+
two framings, the hot-reload socket's first message pushed the wrong way,
|
|
61
|
+
`innerText` being undefined on SVG icons, upgraded sockets blocking shutdown,
|
|
62
|
+
and a restored Browser pane whose rail spun for ever.
|
|
63
|
+
|
|
64
|
+
### Downloads
|
|
65
|
+
|
|
66
|
+
- **macOS**: `Loom-Desktop-0.2.3-arm64.dmg` (Apple Silicon) or `-x64.dmg` (Intel)
|
|
67
|
+
- **Windows**: the `.exe` installer
|
|
68
|
+
- **Linux**: `.AppImage` or `.deb`
|
|
69
|
+
- **Android**: `loompad-0.2.3-android.apk`
|
|
70
|
+
- **CLI**: `npm install -g github:nickthelegend/loom`
|
|
71
|
+
|
|
72
|
+
The Android apk is signed with the project's release key. The desktop
|
|
73
|
+
installers are not signed by a certificate authority: on macOS the app is
|
|
74
|
+
ad-hoc signed, so right-click → Open the first time; on Windows, "More info →
|
|
75
|
+
Run anyway". Checksums are in `SHA256SUMS.txt`.
|
|
76
|
+
|
|
77
|
+
Full list of changes: [CHANGELOG.md](https://github.com/nickthelegend/loom/blob/main/CHANGELOG.md).
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
## Loom 0.2.4 — a queue that waits, goals that share, routes that decide
|
|
2
|
+
|
|
3
|
+
### The queue learned to wait
|
|
4
|
+
|
|
5
|
+
A queued prompt no longer means "next". It can wait **for a time**, until a
|
|
6
|
+
goal actually **lands** (merged, not merely finished), until that goal's
|
|
7
|
+
**checks go green**, or until the project has been **quiet** for a while. The
|
|
8
|
+
row says what it's waiting for, and a click releases it.
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
loom queue at 03:00 "run the migration"
|
|
12
|
+
loom queue after landed:o1 "update the changelog"
|
|
13
|
+
loom queue after green:o1 "cut the release"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Every branch reads a fact the daemon already has, so none of them can be wrong
|
|
17
|
+
in an interesting way — and a condition about a goal that no longer exists
|
|
18
|
+
**releases** the prompt rather than stranding it forever. The clock ticks only
|
|
19
|
+
while something is waiting on it.
|
|
20
|
+
|
|
21
|
+
**Recipes.** `loom queue save ship` keeps what's queued; `loom queue run ship`
|
|
22
|
+
replays it on any project. Steps remember their target **by role**, because an
|
|
23
|
+
agent id from one machine means nothing on another; a role this project hasn't
|
|
24
|
+
got becomes an **Auto** prompt rather than a refusal.
|
|
25
|
+
|
|
26
|
+
**Reordering.** Drag in the web app, and up/down on the phone, which had no way
|
|
27
|
+
to reorder at all. The arrows stay on both — the accessible path.
|
|
28
|
+
|
|
29
|
+
### Goals: a cap, and more than one at a time
|
|
30
|
+
|
|
31
|
+
`loom orchestrate --max-usd 2` stops a goal at its cap the way the team budget
|
|
32
|
+
always did: running work finishes, nothing new starts, the goal waits for you.
|
|
33
|
+
A project default lives in `budgets.perGoalUsd`, and a word lands in the thread
|
|
34
|
+
at 80%, because the halt shouldn't be the first you hear of a budget.
|
|
35
|
+
|
|
36
|
+
`maxConcurrentGoals` lets goals run side by side **when their paths can't
|
|
37
|
+
collide**. A goal's scope is the `touches` its plan declares; one that hasn't
|
|
38
|
+
said what it touches counts as touching everything and waits. Anything not
|
|
39
|
+
provably disjoint queues with the collision named — *waiting for "rework
|
|
40
|
+
billing" — both touch src/billing/\*\* and src/billing/tax.ts*. Still one at a
|
|
41
|
+
time unless you ask for more.
|
|
42
|
+
|
|
43
|
+
### Coming back to a project
|
|
44
|
+
|
|
45
|
+
**A digest of what happened while you were away** — goals, landings, failures,
|
|
46
|
+
a dead server, and what's waiting on you, newest first, each line clicking
|
|
47
|
+
through to the moment it came from. Nothing is written without an event behind
|
|
48
|
+
it, and a quiet night says nothing at all. `loom digest --since 8` in the
|
|
49
|
+
terminal.
|
|
50
|
+
|
|
51
|
+
**Notifications carry the question**, not "an agent needs you" — and on macOS
|
|
52
|
+
you can answer from the notification. Nothing fires while you're already
|
|
53
|
+
looking at the conversation it would be about.
|
|
54
|
+
|
|
55
|
+
### A pull request you asked for
|
|
56
|
+
|
|
57
|
+
With branch-per-card on, a card in review shows what a PR **would** carry: the
|
|
58
|
+
branch, its commits, its files, and the exact command. It opens only when you
|
|
59
|
+
press the button. Asking pushes nothing — publishing has never been implicit
|
|
60
|
+
here, and still isn't.
|
|
61
|
+
|
|
62
|
+
### Routes: steps that decide whether to run
|
|
63
|
+
|
|
64
|
+
A route step can carry a condition on the previous turn, and is skipped when it
|
|
65
|
+
doesn't hold:
|
|
66
|
+
|
|
67
|
+
```sh
|
|
68
|
+
loom route 'planner,executor,reviewer?lines>200' "tighten the tax rules"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`changed>N`, `changed<N`, `lines>N`, `lines<N`, `touched:<glob>`,
|
|
72
|
+
`!touched:<glob>` — all read off the turn's own diff. That bar is the design: a
|
|
73
|
+
condition must be something Loom **measured**, never a judgement about whether
|
|
74
|
+
the work was any good; judgement stays with the LLM router. Unreadable
|
|
75
|
+
conditions are refused when the route is *defined* rather than silently never
|
|
76
|
+
matching, the first step can't be conditional (there's no turn before it), and
|
|
77
|
+
a skipped step says so in the thread with the numbers that decided it. Skipping
|
|
78
|
+
isn't failing: the route completes.
|
|
79
|
+
|
|
80
|
+
### The baton can carry the work
|
|
81
|
+
|
|
82
|
+
With `worktreePerAgent`, handing A → B left B's checkout holding the state from
|
|
83
|
+
before A started. `git.mergeOnHandoff` merges `agent/A` into B's tree — and
|
|
84
|
+
refuses far more often than it merges: A's uncommitted work isn't on A's branch
|
|
85
|
+
(merging would deliver a convincing half of it), B's tree has to be clean, and
|
|
86
|
+
a merge already in progress is never stacked on. Each refusal says what to do
|
|
87
|
+
about it.
|
|
88
|
+
|
|
89
|
+
A conflict is **left in place** rather than aborted — those files are the thing
|
|
90
|
+
to resolve — and it's named at the top of the incoming briefing, in the handoff
|
|
91
|
+
event, and it stops a route instead of prompting a step on a tree full of
|
|
92
|
+
conflict markers.
|
|
93
|
+
|
|
94
|
+
### Dark mode in the preview
|
|
95
|
+
|
|
96
|
+
Widths landed in 0.2.3; this is the other half. No API lets one document set
|
|
97
|
+
another's `prefers-color-scheme` — but Loom isn't outside the page: the proxy
|
|
98
|
+
served it *and* its stylesheets. So the bridge re-points the page's own
|
|
99
|
+
`@media (prefers-color-scheme: …)` rules, sets the UA colour-scheme, and makes
|
|
100
|
+
`matchMedia` answer to match (firing `change`, so an app that themes itself in
|
|
101
|
+
JavaScript re-renders). Every rewritten rule remembers the media text it came
|
|
102
|
+
with, so **Auto is the page exactly as it shipped**.
|
|
103
|
+
|
|
104
|
+
A page Loom isn't proxying says so instead of offering a switch that does
|
|
105
|
+
nothing, and the screenshot — a real browser — honours the scheme either way.
|
|
106
|
+
Both the width and the scheme ride along with what you send: *Screenshot taken
|
|
107
|
+
at 375×812, dark mode*.
|
|
108
|
+
|
|
109
|
+
### The desktop app can update itself, where that's honest
|
|
110
|
+
|
|
111
|
+
**Help → Check for Updates…** on **Windows** and the **Linux AppImage**: it
|
|
112
|
+
asks before downloading, installs on quit, and restarts only when you press
|
|
113
|
+
Restart. On **macOS** it refuses and says why — that build is ad-hoc signed,
|
|
114
|
+
and macOS only replaces an app signed by a certificate it already trusts — and
|
|
115
|
+
opens the releases page instead. A `.deb` is left to the package manager that
|
|
116
|
+
owns it. The release publishes the update feed for those two platforms and
|
|
117
|
+
deliberately not for macOS: advertising an update the OS will refuse to install
|
|
118
|
+
is worse than advertising none.
|
|
119
|
+
|
|
120
|
+
### Also
|
|
121
|
+
|
|
122
|
+
- `loom team webhook --repo <r>` no longer warns that a shared repo isn't
|
|
123
|
+
shared. An empty cached team view was allowed to answer for the hub, and a
|
|
124
|
+
view fetched before the share landed lists nothing.
|
|
125
|
+
- Retrieval has a number now: recall@5 of **1.00** literal, **0.80** across
|
|
126
|
+
word forms and typos, **0.50** across synonyms. The first two are floors a
|
|
127
|
+
regression trips over; the third is the gap a dense channel would have to
|
|
128
|
+
close.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
## Loom 0.2.5 — an agent doesn't have to be a CLI
|
|
2
|
+
|
|
3
|
+
Every agent Loom drove was a command: `claude`, `codex`, `opencode`, `grok`,
|
|
4
|
+
`agy`. That was the right call — a CLI brings its own tools, its own session,
|
|
5
|
+
its own auth — and it meant your roster could only hold what somebody had
|
|
6
|
+
installed, and every turn cost whatever that CLI's subscription costs, whether
|
|
7
|
+
it was a four-hour refactor or a one-line summary.
|
|
8
|
+
|
|
9
|
+
This release adds agents that are **models**: an HTTP endpoint, any
|
|
10
|
+
OpenAI-compatible provider, a model you pick off a list. Nothing to install,
|
|
11
|
+
and on a provider's free tier, nothing to pay.
|
|
12
|
+
|
|
13
|
+
### A `model` agent
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
loom providers:set openrouter --key sk-… # or $OPENROUTER_API_KEY
|
|
17
|
+
loom models --free # what costs nothing today
|
|
18
|
+
loom agents:add model --as cheap --role reviewer \
|
|
19
|
+
--model "google/gemma-4-31b-it:free" --tools
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
It streams into the thread like any other agent, shows reasoning as reasoning,
|
|
23
|
+
reports its token counts, holds the baton, and takes route steps. Out of the
|
|
24
|
+
box it's a thinker rather than an editor — planning, reviewing, summarising,
|
|
25
|
+
answering, routing, which is most of what a fleet does between edits.
|
|
26
|
+
|
|
27
|
+
**Keys are never project config.** `.loom/config.json` is committed in most
|
|
28
|
+
projects, so it names a *provider*; the key lives in the environment or in
|
|
29
|
+
`~/.loom/providers.json` at mode 0600. No route, log or listing hands one
|
|
30
|
+
back — you get the last four characters, which tells two keys apart and uses
|
|
31
|
+
neither.
|
|
32
|
+
|
|
33
|
+
**Refusals are read, not guessed at.** Each of these means something different
|
|
34
|
+
and gets a different answer:
|
|
35
|
+
|
|
36
|
+
| the provider says | Loom says | Loom does |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| 401 *unauthorized client* | it refused Loom as a client, not your key | stops |
|
|
39
|
+
| 401 / 403 | it rejected the key | stops |
|
|
40
|
+
| **402** dry pool | no quota left for this model right now | **next model in `fallbacks`** |
|
|
41
|
+
| **429** | it's rate-limiting this key | **next model in `fallbacks`** |
|
|
42
|
+
| 503 / 404 | no channel for that model — the name may be wrong | stops |
|
|
43
|
+
|
|
44
|
+
Falling back on a 503 would hide a typo rather than fix it, which is why it
|
|
45
|
+
doesn't.
|
|
46
|
+
|
|
47
|
+
`loom models` asks each configured provider what it has right now, cached for
|
|
48
|
+
ten minutes and refreshable, free ones marked. A model list typed out by hand
|
|
49
|
+
goes stale; one that's asked for doesn't.
|
|
50
|
+
|
|
51
|
+
### It can read the project, and write it if you say so
|
|
52
|
+
|
|
53
|
+
`--tools` adds `read_file`, `list_files` and `search`: read-only, inside the
|
|
54
|
+
project, `.git` and `.loom` refused, every path resolved and proven contained
|
|
55
|
+
before anything opens it. A reviewer that can't open the file it's reviewing is
|
|
56
|
+
being asked to guess.
|
|
57
|
+
|
|
58
|
+
`--write` adds `write_file`; `--run "npm test"` adds `run` with that
|
|
59
|
+
allow-list. **Every write and every command is a card you allow or deny
|
|
60
|
+
first:**
|
|
61
|
+
|
|
62
|
+
> **write_file** — write src/app.ts: 40 lines (replacing 12) — fix the port
|
|
63
|
+
> [Allow] [Deny]
|
|
64
|
+
|
|
65
|
+
It asks in `auto` as well as `ask`, which is stricter than the mapping for
|
|
66
|
+
CLIs and deliberately so: a CLI in your roster is one you installed and signed
|
|
67
|
+
into, and a model agent is a name you picked off a provider's list an hour ago.
|
|
68
|
+
`bypass` is the only mode that doesn't ask. **With nobody to ask, the answer is
|
|
69
|
+
no** — a write that went through because the UI wasn't wired up would be the
|
|
70
|
+
worst failure available here.
|
|
71
|
+
|
|
72
|
+
The allow-list is a prefix match on whole commands and there is no shell, so
|
|
73
|
+
`npm test` permits `npm test --watch` and refuses `npm testify`,
|
|
74
|
+
`npm test; rm -rf ~`, backticks, pipes and redirection. A tool is only offered
|
|
75
|
+
to the model when it can actually be used: no allow-list, no `run` tool at all.
|
|
76
|
+
|
|
77
|
+
### Threads that remember who answers in them
|
|
78
|
+
|
|
79
|
+
A chat used to be a label on events — whoever held the baton answered
|
|
80
|
+
everywhere, so two threads couldn't be talking to two agents. Pin an agent to a
|
|
81
|
+
thread and it answers there whatever the baton is doing elsewhere: one thread
|
|
82
|
+
planning on a free model, one editing with Claude Code, neither waiting for the
|
|
83
|
+
other.
|
|
84
|
+
|
|
85
|
+
**It doesn't take the baton.** The baton is the write lock for work on the
|
|
86
|
+
repository; a conversation doesn't need it, and taking it would stop whatever
|
|
87
|
+
is actually working. The main thread still follows the baton — that's what
|
|
88
|
+
makes it the main thread.
|
|
89
|
+
|
|
90
|
+
### Asking several models at once
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
loom ask --free --limit 3 "is this migration reversible?"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
One prompt, one thread per model, all at the same time, each thread named after
|
|
97
|
+
the model that answered in it. With free quota, asking five models costs what
|
|
98
|
+
asking one costs — and *which of these is right* is a judgement a person makes
|
|
99
|
+
in ten seconds and a model makes badly. The agents are transient, so five asks
|
|
100
|
+
don't leave five agents in your roster, and one model failing leaves its error
|
|
101
|
+
in its own thread while the others answer.
|
|
102
|
+
|
|
103
|
+
### Retrieval that can follow a synonym
|
|
104
|
+
|
|
105
|
+
The brain had three lexical channels and couldn't match *how does login work*
|
|
106
|
+
to a note about Supabase JWKS. `brain.semantic` adds an all-MiniLM-L6-v2
|
|
107
|
+
channel. Measured on the recall set that ships with the tests, recall@5:
|
|
108
|
+
|
|
109
|
+
| | lexical | with the model |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| literal | 1.00 | **1.00** |
|
|
112
|
+
| word forms, typos | 0.80 | **1.00** |
|
|
113
|
+
| synonyms | 0.50 | **1.00** |
|
|
114
|
+
|
|
115
|
+
It isn't a dependency and won't become one: the model is 23MB, the ONNX runtime
|
|
116
|
+
that executes it is ~470MB, so Loom asks you to install that
|
|
117
|
+
(`npm i -g @huggingface/transformers`) and behaves exactly as before when it's
|
|
118
|
+
missing.
|
|
119
|
+
|
|
120
|
+
### Install it with Homebrew
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
brew tap nickthelegend/loom https://github.com/nickthelegend/loom
|
|
124
|
+
brew install --cask loom-desktop
|
|
125
|
+
brew upgrade --cask loom-desktop
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The cask carries both architectures and is regenerated from the published
|
|
129
|
+
checksums by the release job, so it can't go stale. **Check for Updates…**
|
|
130
|
+
recognises a Homebrew install and offers to run the upgrade **in Loom's own
|
|
131
|
+
terminal** — the one in the dock — so you watch it happen rather than having it
|
|
132
|
+
happen invisibly inside the app.
|
|
133
|
+
|
|
134
|
+
It does not get you past Gatekeeper and doesn't pretend to: Homebrew
|
|
135
|
+
quarantines cask downloads on purpose, and the cask deliberately does not strip
|
|
136
|
+
that attribute, because it's the protection that exists *because* this build is
|
|
137
|
+
unsigned. First launch asks once, as it does for a dmg you downloaded yourself.
|
|
138
|
+
|
|
139
|
+
*(There is no free Apple Developer ID for open-source projects — the fee waiver
|
|
140
|
+
is for nonprofits, schools and government entities, and a free Apple ID cannot
|
|
141
|
+
sign for distribution at all. So: buy one, be one of those, or ship unsigned
|
|
142
|
+
and say so. Loom says so.)*
|
|
143
|
+
|
|
144
|
+
### Also
|
|
145
|
+
|
|
146
|
+
- macOS **Check for Updates…** finds the build for your architecture,
|
|
147
|
+
downloads it, and **verifies its SHA-256** against the release's published
|
|
148
|
+
checksums — a file that doesn't match is deleted, not opened — then opens the
|
|
149
|
+
disk image for the drag.
|
|
150
|
+
- `loom team webhook --repo <r>` no longer warns that a shared repo isn't
|
|
151
|
+
shared. An empty cached team view was allowed to answer for the hub.
|
|
152
|
+
- The README was audited against the code. Eight things it claimed had quietly
|
|
153
|
+
stopped being true as features landed underneath them.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
## Loom 0.2.6 — right-click, and a Setup that tells the truth
|
|
2
|
+
|
|
3
|
+
A small release, made entirely of things found by opening the app and looking
|
|
4
|
+
at it rather than by reading the code.
|
|
5
|
+
|
|
6
|
+
### Right-click works now
|
|
7
|
+
|
|
8
|
+
**A project** — open, new chat, settings, **rename**, copy path, and remove.
|
|
9
|
+
Those were scattered: settings behind a gear, rename nowhere at all, and
|
|
10
|
+
removing a project only in `loom projects --forget`.
|
|
11
|
+
|
|
12
|
+
It says **Remove from Loom**, not *Delete*, and the confirm says the folder,
|
|
13
|
+
the history and `.loom/` stay on disk — the route only unregisters. A menu item
|
|
14
|
+
that says delete and doesn't is as bad as one that says delete and does.
|
|
15
|
+
|
|
16
|
+
**A thread** — open, rename, pin which agent answers in it, forget. The main
|
|
17
|
+
thread's menu offers only what applies to it, rather than offering everything
|
|
18
|
+
and refusing half of it when you click.
|
|
19
|
+
|
|
20
|
+
Escape and any click outside close the menu, the arrow keys walk it, and it
|
|
21
|
+
flips rather than hanging off the edge of the window.
|
|
22
|
+
|
|
23
|
+
### A composer that fits
|
|
24
|
+
|
|
25
|
+
That row was holding the model picker, the agent, a permission chip, MCPs,
|
|
26
|
+
Skills, a mic, Prompts, Plan **and** send — and wrapped on a narrow window.
|
|
27
|
+
MCPs and Skills are occasional settings, so they moved into a **More** menu
|
|
28
|
+
that also reaches Prompts and Attach. The skills count badge stayed on the
|
|
29
|
+
outside, because *two skills are on* is the part you need without opening
|
|
30
|
+
anything.
|
|
31
|
+
|
|
32
|
+
### Setup tells the truth about your machine
|
|
33
|
+
|
|
34
|
+
- **Claude Code said "not installed"** on machines where it is. Anthropic's
|
|
35
|
+
installer puts the binary in `~/.local/bin`, and Loom trusted `PATH` alone —
|
|
36
|
+
which an interactive shell has and a detached daemon may not. Codex, Grok and
|
|
37
|
+
Antigravity already looked in their known locations; claude-code was the one
|
|
38
|
+
still guessing. Telling someone to reinstall software they already have is
|
|
39
|
+
the worst kind of wrong answer, because they'll do it.
|
|
40
|
+
- **The Model (API) row** said "couldn't confirm it's signed in" and printed a
|
|
41
|
+
blank command. There is nothing to sign in to: it names the providers that
|
|
42
|
+
have a key, and offers `loom providers:set …` when none does.
|
|
43
|
+
- **A new project no longer gets a `model` agent it can't use.** That kind
|
|
44
|
+
probes as available whenever any provider has a key — a true fact about the
|
|
45
|
+
machine, and the wrong basis for a roster entry, because *which* model is a
|
|
46
|
+
choice nobody has made yet. It landed with no options and refused every turn.
|
|
47
|
+
|
|
48
|
+
### The desktop app says Loom
|
|
49
|
+
|
|
50
|
+
The menu bar said **Electron**. macOS takes that title from the running
|
|
51
|
+
bundle's `Info.plist`, not from `app.setName()` — which is why naming the app
|
|
52
|
+
in code never fixed it. `CFBundleDisplayName` is the lever: the packaged app
|
|
53
|
+
sets it, and a dev run gets a prestart script that stamps the disposable
|
|
54
|
+
Electron.app with the same name.
|
|
55
|
+
|
|
56
|
+
The `.app` filename is deliberately unchanged, because the Homebrew cask names
|
|
57
|
+
it and renaming would break every install that already has one.
|
|
58
|
+
|
|
59
|
+
### If Setup looks wrong, restart the daemon first
|
|
60
|
+
|
|
61
|
+
Half of the above was a daemon that had been running since before the fixes
|
|
62
|
+
landed, serving answers from an older build. `loom up --restart`.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
## Loom 1.0 — you can see what it did, and you can take it back
|
|
2
|
+
|
|
3
|
+
The 0.2 line got the fleet working: several agents, one baton, one brain, goals
|
|
4
|
+
split into parallel tasks. This one is about what that felt like to *watch* —
|
|
5
|
+
and what happened when you didn't like the result.
|
|
6
|
+
|
|
7
|
+
Five things, all of them found by using it rather than reading it.
|
|
8
|
+
|
|
9
|
+
### Rewind
|
|
10
|
+
|
|
11
|
+
An agent turn can touch forty files. Until now the honest answer to *undo that*
|
|
12
|
+
was "read the diff and retype it".
|
|
13
|
+
|
|
14
|
+
So Loom writes down what the files were before every turn, and the turn's
|
|
15
|
+
**Update(…)** card offers **Rewind**. There is a **Rewind…** list under More for
|
|
16
|
+
the whole history, and `loom rewind` in the terminal.
|
|
17
|
+
|
|
18
|
+
It is a working tree, not a history. Rewinding restores what changed, removes
|
|
19
|
+
what was created, brings back what was deleted — and does not move HEAD, does
|
|
20
|
+
not touch your commits, does not edit the thread. What happened still happened;
|
|
21
|
+
the files just don't have to live with it.
|
|
22
|
+
|
|
23
|
+
**Three things it will never touch.** Checkpoints are captured with `git add -A`,
|
|
24
|
+
so `.gitignore` applies: your `node_modules`, your build output and your `.env`
|
|
25
|
+
are never read, never stored and never restored. `.loom/` is ignored too, which
|
|
26
|
+
is why a rewind cannot eat the event log.
|
|
27
|
+
|
|
28
|
+
**It is itself rewindable.** A rewind saves what it is about to replace before
|
|
29
|
+
it replaces it, and hands that back — *Undo the rewind* in the thread, an id on
|
|
30
|
+
the command line. A one-way undo is a trap, and the one time that matters is the
|
|
31
|
+
time someone rewinds past work they meant to keep.
|
|
32
|
+
|
|
33
|
+
**It refuses while an agent is mid-turn**, naming who. Replacing the tree under
|
|
34
|
+
a running agent gives it a working directory that contradicts everything it has
|
|
35
|
+
read, and the damage lands in whatever it writes next.
|
|
36
|
+
|
|
37
|
+
Checkpoints live on hidden refs under `refs/loom/checkpoints/`, so no branch
|
|
38
|
+
listing, no stash and no `git log` ever shows them. The newest 60 are kept.
|
|
39
|
+
|
|
40
|
+
### A transcript you can turn up
|
|
41
|
+
|
|
42
|
+
The thread showed one fixed level of detail and no way to change it. More now
|
|
43
|
+
has a transcript section:
|
|
44
|
+
|
|
45
|
+
| | |
|
|
46
|
+
|---|---|
|
|
47
|
+
| **Normal** | what it said and did |
|
|
48
|
+
| **Thinking** | + reasoning |
|
|
49
|
+
| **Verbose** | + raw payloads |
|
|
50
|
+
|
|
51
|
+
Normal drops reasoning *entirely* rather than folding it away — the working out
|
|
52
|
+
is not the transcript. Verbose opens it and attaches the raw payload to tool
|
|
53
|
+
calls and to the orchestrator's brief, the two places a one-line summary is
|
|
54
|
+
standing in for something much bigger.
|
|
55
|
+
|
|
56
|
+
The level is remembered per project, so reading one run at Verbose doesn't turn
|
|
57
|
+
every other project's thread into a wall of JSON.
|
|
58
|
+
|
|
59
|
+
**And output you can reach the end of.** A long block used to sit in a scroll
|
|
60
|
+
box you could see the start of and never the end of — the orchestrator's
|
|
61
|
+
`{"actions": […]}` plan, most visibly. Code now wraps instead of scrolling out
|
|
62
|
+
of the bubble, and every block carries a copy button.
|
|
63
|
+
|
|
64
|
+
### Orchestrating from Main stays in Main
|
|
65
|
+
|
|
66
|
+
Orchestrating from a thread abandoned that thread. The run opened one of its
|
|
67
|
+
own, titled after the goal, and the app walked you into it — so the goal you
|
|
68
|
+
typed and every word of its answer lived somewhere you hadn't asked for.
|
|
69
|
+
|
|
70
|
+
Now the orchestrator answers where you asked. Each task still gets its own
|
|
71
|
+
thread, and **each task row in the transcript opens it** —
|
|
72
|
+
`t3 · Document data model → Antigravity · done` is a link now, not a label. They
|
|
73
|
+
were findable only by hunting the sidebar for a title you half remembered.
|
|
74
|
+
|
|
75
|
+
A run records whether it borrowed its thread. Replying in a run's *own* thread
|
|
76
|
+
steers the run for good; a borrowed thread stops answering for the run when the
|
|
77
|
+
run ends, so Main goes back to being Main instead of forwarding every message
|
|
78
|
+
you ever send to a finished goal.
|
|
79
|
+
|
|
80
|
+
### A thread says who is working in it, and whether it is still going
|
|
81
|
+
|
|
82
|
+
Two bugs that were the same bug: a thread couldn't answer questions the daemon
|
|
83
|
+
already knew the answer to.
|
|
84
|
+
|
|
85
|
+
- **The wrong logo.** A task thread claimed to be whoever held the project
|
|
86
|
+
baton, so during a run with four workers a Codex task and an Antigravity task
|
|
87
|
+
both wore the Claude Code mark. The header now comes from the task.
|
|
88
|
+
- **No sign of life.** A thread row showed nothing about whether its work was
|
|
89
|
+
running, done or failed. It now carries a mark — pulsing while it runs, green
|
|
90
|
+
when it lands — and *nothing at all* when the daemon can't say, rather than a
|
|
91
|
+
guess.
|
|
92
|
+
|
|
93
|
+
### Models in Orchestrate
|
|
94
|
+
|
|
95
|
+
Orchestrate could pick *who* ran a goal and never *what they ran it on*. Every
|
|
96
|
+
agent chip — the orchestrator and each worker — now carries its model beside its
|
|
97
|
+
permission chip, click to change.
|
|
98
|
+
|
|
99
|
+
And an API model can join the cast without leaving the composer: a dashed
|
|
100
|
+
**+ model** chip adds one and opens its picker straight away, because the state
|
|
101
|
+
it lands in with no model chosen is the one state it cannot run in. Until one is
|
|
102
|
+
picked the chip says so in warning colour, and Orchestrate refuses to start —
|
|
103
|
+
naming the agent and opening its list — rather than failing three tasks into the
|
|
104
|
+
run.
|
|
105
|
+
|
|
106
|
+
Two things the model list itself was getting wrong: a model agent's list is
|
|
107
|
+
asked of the providers, and that case had no branch in the footer, so it printed
|
|
108
|
+
*"no model list for this agent"* directly above 446 of them. And it offered a
|
|
109
|
+
model agent a **Default**, which for that kind does not exist.
|
|
110
|
+
|
|
111
|
+
### Install
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
brew tap nickthelegend/loom https://github.com/nickthelegend/loom
|
|
115
|
+
brew install --cask loom-desktop
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Still unsigned, and still says so: Homebrew quarantines cask downloads on
|
|
119
|
+
purpose and this cask deliberately doesn't strip that, because it is the
|
|
120
|
+
protection that exists *because* the build is unsigned. First launch asks once.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
## Loom 1.0.1 — orchestra spawns its workers again
|
|
2
|
+
|
|
3
|
+
Three bugs found by opening 1.0 on a real project and watching it fail.
|
|
4
|
+
|
|
5
|
+
### The plan was being thrown away before it ran
|
|
6
|
+
|
|
7
|
+
Every orchestra run planned tasks and started **none**. The Fleet showed every
|
|
8
|
+
agent idle, no task threads appeared, and the thread said:
|
|
9
|
+
|
|
10
|
+
> Your reply had no ```loom actions block, so nothing ran.
|
|
11
|
+
|
|
12
|
+
…directly underneath a reply that plainly contained one.
|
|
13
|
+
|
|
14
|
+
The engine parses accumulated turn text rather than the logged message, and
|
|
15
|
+
that text was capped to its **last** 20,000 characters. A plan's block sits at
|
|
16
|
+
the end of a long reply, so the cap kept the *closing* fence and threw away the
|
|
17
|
+
*opening* one. The parser saw an unterminated block and correctly reported that
|
|
18
|
+
there was nothing to run.
|
|
19
|
+
|
|
20
|
+
Which means **the better the orchestrator planned, the more certainly its plan
|
|
21
|
+
was binned** — a thorough orchestrator writes long task prompts, and long is
|
|
22
|
+
exactly what killed it.
|
|
23
|
+
|
|
24
|
+
Replaying one real run through the shipped parser, the logged reply against the
|
|
25
|
+
same reply after the cap:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
id=176 len= 26551 logged=6 acts capped=NULL
|
|
29
|
+
id=207 len= 28329 logged=5 acts capped=NULL
|
|
30
|
+
id=213 len= 24296 logged=5 acts capped=NULL
|
|
31
|
+
id=227 len= 28318 logged=5 acts capped=NULL
|
|
32
|
+
id=234 len= 20297 logged=5 acts capped=NULL
|
|
33
|
+
id=564 len= 51901 logged=8 acts capped=NULL
|
|
34
|
+
id=570 len= 50836 logged=8 acts capped=NULL
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Seven consecutive plans — 6, 5, 5, 5, 5, 8 and 8 tasks — every one parseable
|
|
38
|
+
from the log, every one destroyed. All seven parse intact now.
|
|
39
|
+
|
|
40
|
+
The budget is far clear of any plausible reply, and when it *is* reached the
|
|
41
|
+
cut is made at the start of the actions block rather than at a blind character
|
|
42
|
+
offset. What protects memory can no longer decapitate the payload.
|
|
43
|
+
|
|
44
|
+
### Answer an agent where it asked you
|
|
45
|
+
|
|
46
|
+
An agent stopping to ask something was one flat line with nothing to click:
|
|
47
|
+
|
|
48
|
+
> ⏸ claude-code asks: Want me to dig into the DBC integration specifically, or
|
|
49
|
+
> get the working tree into a committable state?
|
|
50
|
+
|
|
51
|
+
To answer it you went to the composer — and in an orchestra thread the composer
|
|
52
|
+
aims at the **orchestrator**, so your answer went to the wrong agent entirely.
|
|
53
|
+
The one moment Loom exists to surface had the worst affordance in the app.
|
|
54
|
+
|
|
55
|
+
It is now a card you answer in place. The reply goes to the agent that asked,
|
|
56
|
+
read off the card rather than off whatever the composer is pointed at. A
|
|
57
|
+
question that plainly offers a choice becomes buttons:
|
|
58
|
+
|
|
59
|
+
> **dig into the DBC integration specifically** · **get the working tree into a committable state**
|
|
60
|
+
|
|
61
|
+
Anything ambiguous falls back to the text box. A wrong guess would put words in
|
|
62
|
+
your mouth and send them to an agent, so it guesses at nothing: no question
|
|
63
|
+
mark, no clean *or*, no buttons.
|
|
64
|
+
|
|
65
|
+
### A giant icon no longer eats the Board
|
|
66
|
+
|
|
67
|
+
Board → GitHub rendered a single enormous ⓘ filling the whole pane, with the
|
|
68
|
+
columns pushed out of view, whenever `gh` couldn't list pull requests — a
|
|
69
|
+
common state, so the footnote became the screen.
|
|
70
|
+
|
|
71
|
+
`svg()` emitted no `width` or `height`. Every icon depends on a CSS rule to
|
|
72
|
+
size it, and an icon in a container that forgot one has no intrinsic size, so
|
|
73
|
+
in a flex row it stretches to fill the line. `.bnote` was such a container.
|
|
74
|
+
|
|
75
|
+
Icons now carry a default size. CSS still wins, so every existing rule is
|
|
76
|
+
unchanged — what this buys is that the *next* icon dropped somewhere unstyled
|
|
77
|
+
looks slightly wrong instead of covering the screen.
|