@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,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loom backup` — everything Loom knows, in one archive.
|
|
3
|
+
*
|
|
4
|
+
* What goes in: ~/.loom (settings, pairings, prompts, cloud and team config)
|
|
5
|
+
* and every registered project's .loom directory (its event log, brain,
|
|
6
|
+
* chats, config). What stays out: orchestra worktrees (full checkouts — their
|
|
7
|
+
* branches live in your repos) and the model cache (re-downloadable).
|
|
8
|
+
*
|
|
9
|
+
* A log.db is copied with VACUUM INTO, which SQLite guarantees is a
|
|
10
|
+
* consistent snapshot even while the daemon is writing to it. Everything
|
|
11
|
+
* else is copied as-is.
|
|
12
|
+
*/
|
|
13
|
+
export interface BackupResult {
|
|
14
|
+
file: string;
|
|
15
|
+
bytes: number;
|
|
16
|
+
projects: number;
|
|
17
|
+
skipped: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function makeBackup(out?: string, now?: Date): BackupResult;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `loom backup` — everything Loom knows, in one archive.
|
|
3
|
+
*
|
|
4
|
+
* What goes in: ~/.loom (settings, pairings, prompts, cloud and team config)
|
|
5
|
+
* and every registered project's .loom directory (its event log, brain,
|
|
6
|
+
* chats, config). What stays out: orchestra worktrees (full checkouts — their
|
|
7
|
+
* branches live in your repos) and the model cache (re-downloadable).
|
|
8
|
+
*
|
|
9
|
+
* A log.db is copied with VACUUM INTO, which SQLite guarantees is a
|
|
10
|
+
* consistent snapshot even while the daemon is writing to it. Everything
|
|
11
|
+
* else is copied as-is.
|
|
12
|
+
*/
|
|
13
|
+
import { spawnSync } from "node:child_process";
|
|
14
|
+
import fs from "node:fs";
|
|
15
|
+
import { createRequire } from "node:module";
|
|
16
|
+
import os from "node:os";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { listProjects, loomHome } from "./registry.js";
|
|
19
|
+
const SKIP_HOME = new Set(["orchestra", "models"]);
|
|
20
|
+
function copyDir(src, dest, skipped, skip) {
|
|
21
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
22
|
+
for (const ent of fs.readdirSync(src, { withFileTypes: true })) {
|
|
23
|
+
if (skip?.(ent.name)) {
|
|
24
|
+
skipped.push(path.join(src, ent.name));
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const s = path.join(src, ent.name), d = path.join(dest, ent.name);
|
|
28
|
+
if (ent.isDirectory())
|
|
29
|
+
copyDir(s, d, skipped);
|
|
30
|
+
else if (ent.isFile()) {
|
|
31
|
+
if (ent.name === "log.db")
|
|
32
|
+
snapshotDb(s, d);
|
|
33
|
+
else if (/^log\.db-(wal|shm)$/.test(ent.name))
|
|
34
|
+
continue; // folded in by the snapshot
|
|
35
|
+
else
|
|
36
|
+
fs.copyFileSync(s, d);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function snapshotDb(src, dest) {
|
|
41
|
+
try {
|
|
42
|
+
const { DatabaseSync } = createRequire(import.meta.url)("node:sqlite");
|
|
43
|
+
const db = new DatabaseSync(src, { readOnly: true });
|
|
44
|
+
try {
|
|
45
|
+
db.exec(`VACUUM INTO '${dest.replace(/'/g, "''")}'`);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
db.close();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
fs.copyFileSync(src, dest); // no node:sqlite here: a plain copy beats nothing
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function makeBackup(out, now = new Date()) {
|
|
56
|
+
const stamp = now.toISOString().replace(/[:T]/g, "-").slice(0, 16);
|
|
57
|
+
const file = path.resolve(out ?? path.join(os.homedir(), `loom-backup-${stamp}.tar.gz`));
|
|
58
|
+
const stage = fs.mkdtempSync(path.join(os.tmpdir(), "loom-backup-"));
|
|
59
|
+
const skipped = [];
|
|
60
|
+
try {
|
|
61
|
+
const home = loomHome();
|
|
62
|
+
if (fs.existsSync(home))
|
|
63
|
+
copyDir(home, path.join(stage, "loom-home"), skipped, (n) => SKIP_HOME.has(n));
|
|
64
|
+
let projects = 0;
|
|
65
|
+
const index = [];
|
|
66
|
+
for (const p of listProjects()) {
|
|
67
|
+
const dotLoom = path.join(p.dir, ".loom");
|
|
68
|
+
if (!fs.existsSync(dotLoom))
|
|
69
|
+
continue;
|
|
70
|
+
const slot = `${p.name.replace(/[^\w.-]+/g, "-")}-${p.id}`;
|
|
71
|
+
copyDir(dotLoom, path.join(stage, "projects", slot, ".loom"), skipped, (n) => n === "worktrees");
|
|
72
|
+
index.push({ id: p.id, name: p.name, dir: p.dir });
|
|
73
|
+
projects++;
|
|
74
|
+
}
|
|
75
|
+
fs.writeFileSync(path.join(stage, "BACKUP.json"), JSON.stringify({ format: "loom-backup", version: 1, at: now.toISOString(), projects: index }, null, 2));
|
|
76
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
77
|
+
const tar = spawnSync("tar", ["-czf", file, "-C", stage, "."], { encoding: "utf8" });
|
|
78
|
+
if (tar.status !== 0)
|
|
79
|
+
throw new Error(`tar failed: ${(tar.stderr || tar.error?.message || "").trim()}`);
|
|
80
|
+
return { file, bytes: fs.statSync(file).size, projects, skipped };
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
fs.rmSync(stage, { recursive: true, force: true });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"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"}
|
package/dist/core/baton.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Handoffs are explicit (the user confirms in the surface). The active agent
|
|
6
6
|
* is interruptible: a confirmed handoff interrupts an in-flight turn.
|
|
7
7
|
*/
|
|
8
|
-
import type {
|
|
8
|
+
import type { EventJournal } from "./eventlog.js";
|
|
9
9
|
export declare class NotHolderError extends Error {
|
|
10
10
|
readonly agentId: string;
|
|
11
11
|
readonly holder: string | null;
|
|
@@ -14,7 +14,7 @@ export declare class NotHolderError extends Error {
|
|
|
14
14
|
export declare class BatonManager {
|
|
15
15
|
private projectDir;
|
|
16
16
|
private log;
|
|
17
|
-
constructor(projectDir: string, log:
|
|
17
|
+
constructor(projectDir: string, log: EventJournal);
|
|
18
18
|
holder(): string | null;
|
|
19
19
|
holderSince(): number | undefined;
|
|
20
20
|
/** First acquisition (no current holder). Logged as a handoff from nobody. */
|
package/dist/core/baton.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baton.js","sourceRoot":"","sources":["../../src/core/baton.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpE,MAAM,OAAO,cAAe,SAAQ,KAAK;IAErB;IACA;IAFlB,YACkB,OAAe,EACf,MAAqB;QAErC,KAAK,CACH,MAAM;YACJ,CAAC,CAAC,UAAU,OAAO,uCAAuC,MAAM,IAAI;YACpE,CAAC,CAAC,0BAA0B,CAC/B,CAAC;QAPc,YAAO,GAAP,OAAO,CAAQ;QACf,WAAM,GAAN,MAAM,CAAe;QAOrC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IACf,UAAU,CAAS;IACnB,GAAG,
|
|
1
|
+
{"version":3,"file":"baton.js","sourceRoot":"","sources":["../../src/core/baton.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,6 +76,8 @@ export interface ApplyOpts {
|
|
|
76
76
|
by: string;
|
|
77
77
|
eventId: number;
|
|
78
78
|
chat?: string;
|
|
79
|
+
/** The turn read outside content: tag what it teaches as untrusted (D43). */
|
|
80
|
+
untrusted?: boolean;
|
|
79
81
|
}
|
|
80
82
|
/**
|
|
81
83
|
* Apply the extractor's ops to the brain, dropping anything that fails a guard.
|
|
@@ -92,6 +94,8 @@ export type ExtractEngine = (prompt: {
|
|
|
92
94
|
}) => Promise<string>;
|
|
93
95
|
export interface ExtractFromTurnOpts {
|
|
94
96
|
engine: ExtractEngine;
|
|
97
|
+
/** Discard an in-flight helper result when its owning project closes. */
|
|
98
|
+
signal?: AbortSignal;
|
|
95
99
|
/** Who ran the turn — the memories are attributed to them. */
|
|
96
100
|
agentId: string;
|
|
97
101
|
chat?: string;
|
|
@@ -100,6 +104,8 @@ export interface ExtractFromTurnOpts {
|
|
|
100
104
|
/** How many existing memories to show the extractor as collision candidates. */
|
|
101
105
|
candidateLimit?: number;
|
|
102
106
|
eventId?: number;
|
|
107
|
+
/** The turn read outside content (web, issues, PRs) — D43. */
|
|
108
|
+
untrusted?: boolean;
|
|
103
109
|
}
|
|
104
110
|
/**
|
|
105
111
|
* Learn from one turn: retrieve candidates, ask the engine, apply the ops.
|
|
@@ -109,3 +115,14 @@ export interface ExtractFromTurnOpts {
|
|
|
109
115
|
* failure returns an empty result.
|
|
110
116
|
*/
|
|
111
117
|
export declare function extractFromTurn(brain: Brain, turn: string, opts: ExtractFromTurnOpts): Promise<ExtractResult>;
|
|
118
|
+
/**
|
|
119
|
+
* Did this turn read outside content? Tool calls that fetch the web or read
|
|
120
|
+
* GitHub issue/PR text mean anything learned may carry someone else's words —
|
|
121
|
+
* the memory-poisoning vector (D43). Conservative on purpose: a false
|
|
122
|
+
* "untrusted" costs a click; a false "trusted" can spread a planted instruction
|
|
123
|
+
* to every teammate's agent.
|
|
124
|
+
*/
|
|
125
|
+
export declare function readExternalContent(events: Array<{
|
|
126
|
+
kind: string;
|
|
127
|
+
payload: Record<string, unknown>;
|
|
128
|
+
}>): boolean;
|
|
@@ -169,12 +169,16 @@ export function applyExtraction(brain, ops, turn, candidates, opts) {
|
|
|
169
169
|
...(op.confidence !== undefined ? { confidence: op.confidence } : {}),
|
|
170
170
|
evidence: op.evidence,
|
|
171
171
|
...(opts.chat ? { scope: { chat: opts.chat } } : {}),
|
|
172
|
+
...(opts.untrusted ? { untrusted: true } : {}),
|
|
172
173
|
provenance: prov,
|
|
173
174
|
});
|
|
174
175
|
if (created)
|
|
175
176
|
res.added.push(memory);
|
|
176
|
-
else
|
|
177
|
+
else {
|
|
178
|
+
// learned again: that's a confirmation, and it keeps the memory fresh (D16)
|
|
179
|
+
brain.confirm(memory.id, opts.by);
|
|
177
180
|
res.dropped.push({ op, reason: "already known (hash match)" });
|
|
181
|
+
}
|
|
178
182
|
}
|
|
179
183
|
else if (op.op === "UPDATE") {
|
|
180
184
|
const target = byInt.get(op.id);
|
|
@@ -215,7 +219,7 @@ export function applyExtraction(brain, ops, turn, candidates, opts) {
|
|
|
215
219
|
*/
|
|
216
220
|
export async function extractFromTurn(brain, turn, opts) {
|
|
217
221
|
const empty = { added: [], updated: [], forgotten: [], dropped: [] };
|
|
218
|
-
if (!turn.trim())
|
|
222
|
+
if (opts.signal?.aborted || !turn.trim())
|
|
219
223
|
return empty;
|
|
220
224
|
// Candidates: what a new fact from this turn might collide with. Query is the
|
|
221
225
|
// turn itself plus the files it touched — exactly what phase 1 ranks on.
|
|
@@ -236,6 +240,8 @@ export async function extractFromTurn(brain, turn, opts) {
|
|
|
236
240
|
catch {
|
|
237
241
|
return empty; // extractor unavailable — the turn is unaffected
|
|
238
242
|
}
|
|
243
|
+
if (opts.signal?.aborted)
|
|
244
|
+
return empty;
|
|
239
245
|
const ops = parseExtraction(reply);
|
|
240
246
|
if (!ops.length)
|
|
241
247
|
return empty;
|
|
@@ -243,6 +249,26 @@ export async function extractFromTurn(brain, turn, opts) {
|
|
|
243
249
|
by: opts.agentId,
|
|
244
250
|
eventId: opts.eventId ?? 0,
|
|
245
251
|
...(opts.chat ? { chat: opts.chat } : {}),
|
|
252
|
+
...(opts.untrusted ? { untrusted: true } : {}),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Did this turn read outside content? Tool calls that fetch the web or read
|
|
257
|
+
* GitHub issue/PR text mean anything learned may carry someone else's words —
|
|
258
|
+
* the memory-poisoning vector (D43). Conservative on purpose: a false
|
|
259
|
+
* "untrusted" costs a click; a false "trusted" can spread a planted instruction
|
|
260
|
+
* to every teammate's agent.
|
|
261
|
+
*/
|
|
262
|
+
export function readExternalContent(events) {
|
|
263
|
+
const external = /\b(web_?fetch|web_?search|fetch_url|browse|browser|firecrawl|webpage)\b|https?:\/\/(?!127\.0\.0\.1|localhost)|\bgh\s+(issue|pr)\s+(view|list|diff)|\bgh\s+api\b|\bcurl\s|\bwget\s/i;
|
|
264
|
+
return events.some((e) => {
|
|
265
|
+
if (e.kind !== "tool_call" && e.kind !== "tool_result")
|
|
266
|
+
return false;
|
|
267
|
+
const p = e.payload;
|
|
268
|
+
const hay = [p.tool, p.name, p.command, p.summary, typeof p.input === "string" ? p.input : JSON.stringify(p.input ?? "")]
|
|
269
|
+
.filter(Boolean)
|
|
270
|
+
.join(" ");
|
|
271
|
+
return external.test(hay);
|
|
246
272
|
});
|
|
247
273
|
}
|
|
248
274
|
//# sourceMappingURL=brain-extract.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain-extract.js","sourceRoot":"","sources":["../../src/core/brain-extract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"brain-extract.js","sourceRoot":"","sources":["../../src/core/brain-extract.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,7 +34,31 @@
|
|
|
34
34
|
* rows silently eat the recall budget. Ours are gone before we rank.
|
|
35
35
|
*/
|
|
36
36
|
import type { Brain, Memory } from "./brain.js";
|
|
37
|
+
/** 1.0 for a fresh unit, exponentially down to DECAY_FLOOR with age. */
|
|
38
|
+
export declare function recencyFactor(updatedAt: number, now?: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* The dense channel (core/semantic.ts), when a project has turned it on.
|
|
41
|
+
*
|
|
42
|
+
* Weighted below BM25 on purpose. It is the only channel that can follow a
|
|
43
|
+
* synonym, and the only one that can be confidently wrong about a sentence it
|
|
44
|
+
* has never seen — so it earns candidates and nudges rank, rather than
|
|
45
|
+
* deciding it.
|
|
46
|
+
*
|
|
47
|
+
* Scored RELATIVE to the best dense hit in the same query, exactly as BM25 is
|
|
48
|
+
* a few lines down, and for the same reason. The absolute numbers this model
|
|
49
|
+
* returns are not a scale you can put a meaningful threshold on: measured over
|
|
50
|
+
* the recall set, a query's true match sits anywhere from 0.19 to 0.52 while
|
|
51
|
+
* noise reaches 0.19 — the RANKING is near-perfect and the magnitude means
|
|
52
|
+
* almost nothing. A fixed threshold on it therefore throws away most of what
|
|
53
|
+
* the channel knows (it did: at 0.35 the gap it was built to close stayed
|
|
54
|
+
* half open). The absolute floor that remains is only there to keep a query
|
|
55
|
+
* that matches nothing from promoting its least-bad noise.
|
|
56
|
+
*/
|
|
57
|
+
export declare const DENSE_WEIGHT = 0.6;
|
|
58
|
+
export declare const DENSE_FLOOR = 0.15;
|
|
37
59
|
export interface RetrieveOpts {
|
|
60
|
+
/** Crew memories are private to that crew until a human promotes them. */
|
|
61
|
+
crew?: string;
|
|
38
62
|
/** Free text — a task description, a prompt, a turn. */
|
|
39
63
|
query?: string;
|
|
40
64
|
/** Files in play. From turn_diff, the file tree, or whatever the task names. */
|
|
@@ -48,11 +72,27 @@ export interface RetrieveOpts {
|
|
|
48
72
|
minConfidence?: number;
|
|
49
73
|
/** Show the arithmetic. For tests and for the Brain tab. */
|
|
50
74
|
explain?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Embeddings, when the project has a model. The caller does the embedding —
|
|
77
|
+
* it's async and this isn't — and hands the vectors in: the query's, and one
|
|
78
|
+
* per memory id for whatever has been embedded so far. Absent or empty and
|
|
79
|
+
* retrieval is exactly what it was before the channel existed.
|
|
80
|
+
*/
|
|
81
|
+
dense?: {
|
|
82
|
+
query: Float32Array;
|
|
83
|
+
byId: Map<string, Float32Array>;
|
|
84
|
+
};
|
|
51
85
|
}
|
|
52
86
|
export interface ScoreDetail {
|
|
53
87
|
bm25: number;
|
|
54
88
|
entity: number;
|
|
89
|
+
/** Trigram-cosine channel, already weighted. Morphology and typos, not synonymy. */
|
|
90
|
+
fuzzy: number;
|
|
91
|
+
/** Embedding-cosine channel, already weighted. Synonymy — and only when on. */
|
|
92
|
+
dense?: number;
|
|
55
93
|
kindBias: number;
|
|
94
|
+
/** 1.0 fresh → 0.55 floor with age; multiplies the match, not the bias. */
|
|
95
|
+
recency: number;
|
|
56
96
|
matchedEntities: string[];
|
|
57
97
|
final: number;
|
|
58
98
|
}
|
|
@@ -61,6 +101,10 @@ export interface Hit {
|
|
|
61
101
|
score: number;
|
|
62
102
|
detail?: ScoreDetail;
|
|
63
103
|
}
|
|
104
|
+
export declare function trigramVector(text: string): Float32Array;
|
|
105
|
+
/** Cosine of two ALREADY-normalised vectors — which is just a dot product. */
|
|
106
|
+
export declare function dot(a: Float32Array, b: Float32Array): number;
|
|
107
|
+
export declare function cosine(a: Float32Array, b: Float32Array): number;
|
|
64
108
|
/**
|
|
65
109
|
* An inverted index over a set of memories.
|
|
66
110
|
*
|
|
@@ -117,6 +161,33 @@ export declare function queryEntities(query: string, files?: string[]): string[]
|
|
|
117
161
|
export declare function retrieveFrom(memories: Memory[], opts: RetrieveOpts): Hit[];
|
|
118
162
|
/** The same, against a live Brain. */
|
|
119
163
|
export declare function retrieve(brain: Brain, opts: RetrieveOpts): Hit[];
|
|
164
|
+
export interface Conflict {
|
|
165
|
+
a: Memory;
|
|
166
|
+
b: Memory;
|
|
167
|
+
/** Trigram similarity of the pair — how same-topic they are. */
|
|
168
|
+
similarity: number;
|
|
169
|
+
/** What tripped the flag, so the human can judge the judge. */
|
|
170
|
+
signal: "negation" | "same-topic-divergent";
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Likely contradictions between live units of the same kind.
|
|
174
|
+
*
|
|
175
|
+
* Heuristic, and says so in the shape of its output: each flag carries the
|
|
176
|
+
* signal that tripped it, because the human resolving a conflict needs to be
|
|
177
|
+
* able to judge the judge. Two signals:
|
|
178
|
+
*
|
|
179
|
+
* negation — same topic (trigram ≥ .45) and one side negates a
|
|
180
|
+
* word the other asserts. The strong flag.
|
|
181
|
+
* same-topic-divergent — decisions/conventions only, very same-topic
|
|
182
|
+
* (.60–.92) yet worded apart. Weaker: often a
|
|
183
|
+
* refinement, sometimes a reversal. Above .92 it's a
|
|
184
|
+
* near-duplicate, which dedupe owns, not this.
|
|
185
|
+
*
|
|
186
|
+
* O(n²) over live units, which at brain scale (hundreds) is nothing. Facts are
|
|
187
|
+
* exempt from the divergent signal — two facts about one file are usually both
|
|
188
|
+
* true — but not from negation.
|
|
189
|
+
*/
|
|
190
|
+
export declare function findConflicts(memories: Memory[]): Conflict[];
|
|
120
191
|
/**
|
|
121
192
|
* Render retrieved memories into a brief for an agent taking the baton.
|
|
122
193
|
*
|
package/dist/core/brain-index.js
CHANGED
|
@@ -39,7 +39,46 @@ const K1 = 1.2;
|
|
|
39
39
|
const B = 0.75;
|
|
40
40
|
/** How much a matched entity can contribute, before IDF weighting. */
|
|
41
41
|
const ENTITY_WEIGHT = 0.5;
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Recency half-life. A unit's score decays toward a floor as it ages, so an
|
|
44
|
+
* equally-matching fresh unit outranks a stale one — but never to zero: the
|
|
45
|
+
* floor keeps a strongly-matching old constraint above a weakly-matching new
|
|
46
|
+
* fact. Age should tip ties, not erase history; a decay that can reach zero
|
|
47
|
+
* would silently delete week-one constraints from every briefing, which is the
|
|
48
|
+
* exact class of memory you least want to lose.
|
|
49
|
+
*/
|
|
50
|
+
const HALF_LIFE_MS = 7 * 24 * 60 * 60 * 1000;
|
|
51
|
+
const DECAY_FLOOR = 0.55;
|
|
52
|
+
/** 1.0 for a fresh unit, exponentially down to DECAY_FLOOR with age. */
|
|
53
|
+
export function recencyFactor(updatedAt, now = Date.now()) {
|
|
54
|
+
const age = Math.max(0, now - updatedAt);
|
|
55
|
+
return DECAY_FLOOR + (1 - DECAY_FLOOR) * Math.pow(0.5, age / HALF_LIFE_MS);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The dense channel (core/semantic.ts), when a project has turned it on.
|
|
59
|
+
*
|
|
60
|
+
* Weighted below BM25 on purpose. It is the only channel that can follow a
|
|
61
|
+
* synonym, and the only one that can be confidently wrong about a sentence it
|
|
62
|
+
* has never seen — so it earns candidates and nudges rank, rather than
|
|
63
|
+
* deciding it.
|
|
64
|
+
*
|
|
65
|
+
* Scored RELATIVE to the best dense hit in the same query, exactly as BM25 is
|
|
66
|
+
* a few lines down, and for the same reason. The absolute numbers this model
|
|
67
|
+
* returns are not a scale you can put a meaningful threshold on: measured over
|
|
68
|
+
* the recall set, a query's true match sits anywhere from 0.19 to 0.52 while
|
|
69
|
+
* noise reaches 0.19 — the RANKING is near-perfect and the magnitude means
|
|
70
|
+
* almost nothing. A fixed threshold on it therefore throws away most of what
|
|
71
|
+
* the channel knows (it did: at 0.35 the gap it was built to close stayed
|
|
72
|
+
* half open). The absolute floor that remains is only there to keep a query
|
|
73
|
+
* that matches nothing from promoting its least-bad noise.
|
|
74
|
+
*/
|
|
75
|
+
export const DENSE_WEIGHT = 0.6;
|
|
76
|
+
export const DENSE_FLOOR = 0.15;
|
|
77
|
+
/**
|
|
78
|
+
* Fixed, so scores mean the same thing across queries — and widened only when
|
|
79
|
+
* the dense channel is actually in play, so turning it on doesn't silently
|
|
80
|
+
* rescale every score in a project that never asked for it.
|
|
81
|
+
*/
|
|
43
82
|
const MAX_SCORE = 1 + ENTITY_WEIGHT;
|
|
44
83
|
/**
|
|
45
84
|
* Constraints and failures outrank facts at equal score. Getting burned by the
|
|
@@ -57,6 +96,56 @@ const KIND_BIAS = {
|
|
|
57
96
|
function tokens(text) {
|
|
58
97
|
return lemmatize(text).split(" ").filter(Boolean);
|
|
59
98
|
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// The fuzzy channel: hashed character-trigram vectors
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
/**
|
|
103
|
+
* A local embedding of the cheapest honest kind: each text becomes a
|
|
104
|
+
* 256-dimension vector of hashed character trigrams, compared by cosine.
|
|
105
|
+
*
|
|
106
|
+
* What this buys that BM25 can't: morphology and typos. "deploying" matches
|
|
107
|
+
* "deployment", "sqlite" matches "sqllite", because they share most of their
|
|
108
|
+
* trigrams even though they share no token. What it does NOT buy is synonymy —
|
|
109
|
+
* "auth" will never match "login" here, and pretending otherwise is why this
|
|
110
|
+
* is a third channel at low weight rather than a replacement for the other
|
|
111
|
+
* two. Offline, keyless, deterministic; no model file, no network.
|
|
112
|
+
*/
|
|
113
|
+
const TRIGRAM_DIMS = 256;
|
|
114
|
+
const FUZZY_WEIGHT = 0.35;
|
|
115
|
+
export function trigramVector(text) {
|
|
116
|
+
const v = new Float32Array(TRIGRAM_DIMS);
|
|
117
|
+
const s = ` ${text.toLowerCase().replace(/\s+/g, " ").trim()} `;
|
|
118
|
+
for (let i = 0; i + 3 <= s.length; i++) {
|
|
119
|
+
// FNV-1a over the 3 chars — cheap, stable, spreads well at this scale.
|
|
120
|
+
let h = 0x811c9dc5;
|
|
121
|
+
for (let j = i; j < i + 3; j++) {
|
|
122
|
+
h ^= s.charCodeAt(j);
|
|
123
|
+
h = Math.imul(h, 0x01000193);
|
|
124
|
+
}
|
|
125
|
+
v[(h >>> 0) % TRIGRAM_DIMS] += 1;
|
|
126
|
+
}
|
|
127
|
+
let norm = 0;
|
|
128
|
+
for (let i = 0; i < TRIGRAM_DIMS; i++)
|
|
129
|
+
norm += v[i] * v[i];
|
|
130
|
+
norm = Math.sqrt(norm) || 1;
|
|
131
|
+
for (let i = 0; i < TRIGRAM_DIMS; i++)
|
|
132
|
+
v[i] /= norm;
|
|
133
|
+
return v;
|
|
134
|
+
}
|
|
135
|
+
/** Cosine of two ALREADY-normalised vectors — which is just a dot product. */
|
|
136
|
+
export function dot(a, b) {
|
|
137
|
+
let sum = 0;
|
|
138
|
+
const n = Math.min(a.length, b.length);
|
|
139
|
+
for (let i = 0; i < n; i++)
|
|
140
|
+
sum += a[i] * b[i];
|
|
141
|
+
return sum;
|
|
142
|
+
}
|
|
143
|
+
export function cosine(a, b) {
|
|
144
|
+
let dot = 0;
|
|
145
|
+
for (let i = 0; i < TRIGRAM_DIMS; i++)
|
|
146
|
+
dot += a[i] * b[i];
|
|
147
|
+
return dot;
|
|
148
|
+
}
|
|
60
149
|
/** Entities are matched case-insensitively; everything else is exact. */
|
|
61
150
|
function entKey(s) {
|
|
62
151
|
return s.trim().toLowerCase();
|
|
@@ -239,6 +328,8 @@ export function retrieveFrom(memories, opts) {
|
|
|
239
328
|
return false;
|
|
240
329
|
if (opts.chat && m.scope.chat && m.scope.chat !== opts.chat)
|
|
241
330
|
return false;
|
|
331
|
+
if (m.scope.crew && m.scope.crew !== opts.crew)
|
|
332
|
+
return false;
|
|
242
333
|
return true;
|
|
243
334
|
});
|
|
244
335
|
if (!live.length)
|
|
@@ -248,8 +339,46 @@ export function retrieveFrom(memories, opts) {
|
|
|
248
339
|
const ents = queryEntities(query, opts.files ?? []);
|
|
249
340
|
const bm = query.trim() ? index.bm25(query) : new Map();
|
|
250
341
|
const eh = ents.length ? index.entityHits(ents) : new Map();
|
|
251
|
-
// The
|
|
252
|
-
|
|
342
|
+
// The fuzzy channel: trigram cosine against every live memory. Linear scan —
|
|
343
|
+
// at brain scale (hundreds of units, not millions) that is faster than any
|
|
344
|
+
// index would pay for. Threshold keeps noise out of the candidate set: below
|
|
345
|
+
// 0.30 trigram cosine is mostly shared spaces and stopwords.
|
|
346
|
+
const fz = new Map();
|
|
347
|
+
if (query.trim()) {
|
|
348
|
+
const qv = trigramVector(query);
|
|
349
|
+
for (const m of live) {
|
|
350
|
+
const sim = cosine(qv, trigramVector(m.text));
|
|
351
|
+
if (sim >= 0.3)
|
|
352
|
+
fz.set(m.id, sim);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// The dense channel: cosine against the embeddings the caller brought.
|
|
356
|
+
// Same shape as the others — a threshold, then union — because the point of
|
|
357
|
+
// the union is that no channel gets a veto over the candidate set.
|
|
358
|
+
const dn = new Map();
|
|
359
|
+
if (opts.dense?.query && opts.dense.byId.size) {
|
|
360
|
+
let best = 0;
|
|
361
|
+
for (const m of live) {
|
|
362
|
+
const v = opts.dense.byId.get(m.id);
|
|
363
|
+
if (!v)
|
|
364
|
+
continue; // not embedded yet; the other channels still see it
|
|
365
|
+
const sim = dot(opts.dense.query, v);
|
|
366
|
+
if (sim >= DENSE_FLOOR) {
|
|
367
|
+
dn.set(m.id, sim);
|
|
368
|
+
if (sim > best)
|
|
369
|
+
best = sim;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
for (const [id, sim] of dn)
|
|
373
|
+
dn.set(id, sim / best); // relative to the best
|
|
374
|
+
}
|
|
375
|
+
// The axis widens only when the channel can actually contribute to it:
|
|
376
|
+
// a project with the channel on but nothing embedded yet — the first
|
|
377
|
+
// seconds after a cold start — must score exactly as it did before, not
|
|
378
|
+
// shrink everything by a third while it warms up.
|
|
379
|
+
const maxScore = MAX_SCORE + (opts.dense?.byId.size ? DENSE_WEIGHT : 0);
|
|
380
|
+
// The union. Any channel alone is enough to be a candidate.
|
|
381
|
+
const ids = new Set([...bm.keys(), ...eh.keys(), ...fz.keys(), ...dn.keys()]);
|
|
253
382
|
if (!ids.size)
|
|
254
383
|
return [];
|
|
255
384
|
// BM25 is unbounded, so normalise against the best hit in this query to get
|
|
@@ -268,8 +397,13 @@ export function retrieveFrom(memories, opts) {
|
|
|
268
397
|
const bmNorm = maxBm > 0 ? (bm.get(id) ?? 0) / maxBm : 0;
|
|
269
398
|
const ent = eh.get(id);
|
|
270
399
|
const bias = KIND_BIAS[memory.kind] ?? 0;
|
|
271
|
-
const
|
|
272
|
-
const
|
|
400
|
+
const fuzzy = (fz.get(id) ?? 0) * FUZZY_WEIGHT;
|
|
401
|
+
const dense = (dn.get(id) ?? 0) * DENSE_WEIGHT;
|
|
402
|
+
const raw = bmNorm + (ent?.score ?? 0) + fuzzy + dense;
|
|
403
|
+
// Decay multiplies the match, not the bias: how well it matches fades with
|
|
404
|
+
// age; what KIND of thing it is doesn't.
|
|
405
|
+
const recency = recencyFactor(memory.updatedAt, now);
|
|
406
|
+
const final = Math.min(1, (raw / maxScore) * recency + bias);
|
|
273
407
|
hits.push({
|
|
274
408
|
memory,
|
|
275
409
|
score: final,
|
|
@@ -278,7 +412,10 @@ export function retrieveFrom(memories, opts) {
|
|
|
278
412
|
detail: {
|
|
279
413
|
bm25: round(bmNorm),
|
|
280
414
|
entity: round(ent?.score ?? 0),
|
|
415
|
+
fuzzy: round(fuzzy),
|
|
416
|
+
...(opts.dense ? { dense: round(dense) } : {}),
|
|
281
417
|
kindBias: bias,
|
|
418
|
+
recency: round(recency),
|
|
282
419
|
matchedEntities: ent?.matched ?? [],
|
|
283
420
|
final: round(final),
|
|
284
421
|
},
|
|
@@ -296,6 +433,68 @@ function round(n) {
|
|
|
296
433
|
export function retrieve(brain, opts) {
|
|
297
434
|
return retrieveFrom(brain.all(), opts);
|
|
298
435
|
}
|
|
436
|
+
const NEGATIONS = [
|
|
437
|
+
["always", "never"],
|
|
438
|
+
["use", "don't use"],
|
|
439
|
+
["use", "do not use"],
|
|
440
|
+
["should", "should not"],
|
|
441
|
+
["should", "shouldn't"],
|
|
442
|
+
["enable", "disable"],
|
|
443
|
+
["allow", "forbid"],
|
|
444
|
+
["allow", "refuse"],
|
|
445
|
+
["on", "off"],
|
|
446
|
+
];
|
|
447
|
+
function negationPair(a, b) {
|
|
448
|
+
const la = ` ${a.toLowerCase()} `;
|
|
449
|
+
const lb = ` ${b.toLowerCase()} `;
|
|
450
|
+
return NEGATIONS.some(([x, y]) => (la.includes(` ${x} `) && lb.includes(` ${y} `)) ||
|
|
451
|
+
(la.includes(` ${y} `) && lb.includes(` ${x} `)));
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Likely contradictions between live units of the same kind.
|
|
455
|
+
*
|
|
456
|
+
* Heuristic, and says so in the shape of its output: each flag carries the
|
|
457
|
+
* signal that tripped it, because the human resolving a conflict needs to be
|
|
458
|
+
* able to judge the judge. Two signals:
|
|
459
|
+
*
|
|
460
|
+
* negation — same topic (trigram ≥ .45) and one side negates a
|
|
461
|
+
* word the other asserts. The strong flag.
|
|
462
|
+
* same-topic-divergent — decisions/conventions only, very same-topic
|
|
463
|
+
* (.60–.92) yet worded apart. Weaker: often a
|
|
464
|
+
* refinement, sometimes a reversal. Above .92 it's a
|
|
465
|
+
* near-duplicate, which dedupe owns, not this.
|
|
466
|
+
*
|
|
467
|
+
* O(n²) over live units, which at brain scale (hundreds) is nothing. Facts are
|
|
468
|
+
* exempt from the divergent signal — two facts about one file are usually both
|
|
469
|
+
* true — but not from negation.
|
|
470
|
+
*/
|
|
471
|
+
export function findConflicts(memories) {
|
|
472
|
+
const live = memories.filter((m) => !isExpired(m));
|
|
473
|
+
const out = [];
|
|
474
|
+
const vecs = new Map(live.map((m) => [m.id, trigramVector(m.text)]));
|
|
475
|
+
for (let i = 0; i < live.length; i++) {
|
|
476
|
+
for (let j = i + 1; j < live.length; j++) {
|
|
477
|
+
const a = live[i];
|
|
478
|
+
const b = live[j];
|
|
479
|
+
if (a.kind !== b.kind)
|
|
480
|
+
continue;
|
|
481
|
+
const sim = cosine(vecs.get(a.id), vecs.get(b.id));
|
|
482
|
+
if (sim < 0.45)
|
|
483
|
+
continue;
|
|
484
|
+
// Negation first, at any similarity: "we use tabs" vs "we do not use
|
|
485
|
+
// tabs" is nearly identical text (≥ .92) and the plainest contradiction
|
|
486
|
+
// there is. Skipping it as a "near-duplicate" left both beliefs in the
|
|
487
|
+
// brain with nothing flagging them — dedupe only merges exact text.
|
|
488
|
+
if (negationPair(a.text, b.text)) {
|
|
489
|
+
out.push({ a, b, similarity: round(sim), signal: "negation" });
|
|
490
|
+
}
|
|
491
|
+
else if (sim >= 0.6 && sim < 0.92 && (a.kind === "decision" || a.kind === "convention" || a.kind === "constraint")) {
|
|
492
|
+
out.push({ a, b, similarity: round(sim), signal: "same-topic-divergent" });
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return out.sort((x, y) => y.similarity - x.similarity);
|
|
497
|
+
}
|
|
299
498
|
const KIND_LABEL = {
|
|
300
499
|
constraint: "Constraints reality imposes",
|
|
301
500
|
failure: "Known failures — do not repeat these",
|