synabun 1.3.0 → 2.0.0
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/CHANGELOG.md +205 -662
- package/LICENSE-COMMERCIAL.md +33 -0
- package/NOTICE +17 -0
- package/README.md +175 -853
- package/THIRD-PARTY-LICENSES.md +136 -0
- package/benchmarks/browser-live-results.json +79 -0
- package/benchmarks/browser-v2-results.json +258 -0
- package/benchmarks/fixtures/browser/README.md +57 -0
- package/benchmarks/fixtures/browser/page-state.json +132 -0
- package/benchmarks/fixtures/browser/social.json +92 -0
- package/benchmarks/fixtures/browser/target.json +319 -0
- package/benchmarks/fixtures/desktop/README.md +58 -0
- package/benchmarks/fixtures/desktop/abstention.json +59 -0
- package/benchmarks/fixtures/desktop/adversarial.json +22 -0
- package/benchmarks/fixtures/desktop/forbidden.json +93 -0
- package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
- package/benchmarks/fixtures/desktop/target.json +136 -0
- package/bin/synabun.js +30 -0
- package/docs/whatsapp.md +325 -0
- package/hooks/claude-code/post-plan.mjs +613 -391
- package/hooks/claude-code/post-remember.mjs +246 -122
- package/hooks/claude-code/pre-compact.mjs +171 -110
- package/hooks/claude-code/pre-task.mjs +133 -0
- package/hooks/claude-code/pre-websearch.mjs +15 -4
- package/hooks/claude-code/prompt-origin.mjs +94 -0
- package/hooks/claude-code/prompt-submit.mjs +1244 -861
- package/hooks/claude-code/session-start.mjs +114 -156
- package/hooks/claude-code/shared.mjs +1228 -368
- package/hooks/claude-code/state.mjs +167 -0
- package/hooks/claude-code/stop.mjs +515 -140
- package/hooks/claude-code/subagent-start.mjs +154 -0
- package/hooks/claude-code/subagent-stop.mjs +102 -0
- package/hooks/claude-code/task-gate.mjs +150 -0
- package/launcher.mjs +40 -0
- package/lib/claude-hooks.js +137 -0
- package/lib/claude-usage-audit.js +141 -0
- package/lib/client-config-repair.js +145 -0
- package/lib/data-home-migration.js +502 -0
- package/lib/desktop-pwa.js +206 -0
- package/lib/external-tools.js +221 -0
- package/lib/first-launch-protection.js +245 -0
- package/lib/packaged-runtime.js +110 -0
- package/lib/paths.d.ts +21 -0
- package/lib/paths.js +103 -0
- package/lib/start-launcher.js +1309 -0
- package/mcp-server/dist/config.d.ts +22 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +109 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +30 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +276 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +48 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +538 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +28 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +32 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
- package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.js +128 -0
- package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.js +344 -0
- package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/browser-assist.d.ts +104 -0
- package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist.js +282 -0
- package/mcp-server/dist/services/browser-assist.js.map +1 -0
- package/mcp-server/dist/services/browser-bench.d.ts +772 -0
- package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-bench.js +424 -0
- package/mcp-server/dist/services/browser-bench.js.map +1 -0
- package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
- package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-judgments.js +363 -0
- package/mcp-server/dist/services/browser-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-risk.d.ts +166 -0
- package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-risk.js +458 -0
- package/mcp-server/dist/services/browser-risk.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +377 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.js +346 -0
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
- package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
- package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist.js +266 -0
- package/mcp-server/dist/services/desktop-assist.js.map +1 -0
- package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
- package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-bench.js +311 -0
- package/mcp-server/dist/services/desktop-bench.js.map +1 -0
- package/mcp-server/dist/services/desktop-client.d.ts +23 -0
- package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-client.js +79 -0
- package/mcp-server/dist/services/desktop-client.js.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.js +177 -0
- package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
- package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
- package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-risk.js +605 -0
- package/mcp-server/dist/services/desktop-risk.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/edit-stale.d.ts +81 -0
- package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
- package/mcp-server/dist/services/edit-stale.js +358 -0
- package/mcp-server/dist/services/edit-stale.js.map +1 -0
- package/mcp-server/dist/services/embedding-service.d.ts +16 -0
- package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-service.js +126 -0
- package/mcp-server/dist/services/embedding-service.js.map +1 -0
- package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
- package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-worker.js +52 -0
- package/mcp-server/dist/services/embedding-worker.js.map +1 -0
- package/mcp-server/dist/services/fb-regions.d.ts +71 -0
- package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
- package/mcp-server/dist/services/fb-regions.js +211 -0
- package/mcp-server/dist/services/fb-regions.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +22 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +55 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
- package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
- package/mcp-server/dist/services/file-excerpt.js +65 -0
- package/mcp-server/dist/services/file-excerpt.js.map +1 -0
- package/mcp-server/dist/services/identity.d.ts +124 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -0
- package/mcp-server/dist/services/identity.js +241 -0
- package/mcp-server/dist/services/identity.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +3 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/memory-client.d.ts +4 -0
- package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-client.js +27 -0
- package/mcp-server/dist/services/memory-client.js.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
- package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
- package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judgments.js +674 -0
- package/mcp-server/dist/services/memory-judgments.js.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.js +403 -0
- package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.js +412 -0
- package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
- package/mcp-server/dist/services/memory-schema.d.ts +16 -0
- package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-schema.js +282 -0
- package/mcp-server/dist/services/memory-schema.js.map +1 -0
- package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-sessions.js +110 -0
- package/mcp-server/dist/services/memory-sessions.js.map +1 -0
- package/mcp-server/dist/services/memory-triage.d.ts +60 -0
- package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-triage.js +189 -0
- package/mcp-server/dist/services/memory-triage.js.map +1 -0
- package/mcp-server/dist/services/memory-verification.d.ts +24 -0
- package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-verification.js +92 -0
- package/mcp-server/dist/services/memory-verification.js.map +1 -0
- package/mcp-server/dist/services/memory-writer.d.ts +26 -0
- package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-writer.js +126 -0
- package/mcp-server/dist/services/memory-writer.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +439 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +1135 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/profiles.d.ts +120 -0
- package/mcp-server/dist/services/profiles.d.ts.map +1 -0
- package/mcp-server/dist/services/profiles.js +387 -0
- package/mcp-server/dist/services/profiles.js.map +1 -0
- package/mcp-server/dist/services/secret-gate.d.ts +29 -0
- package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/secret-gate.js +43 -0
- package/mcp-server/dist/services/secret-gate.js.map +1 -0
- package/mcp-server/dist/services/server-instructions.d.ts +10 -0
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
- package/mcp-server/dist/services/server-instructions.js +101 -0
- package/mcp-server/dist/services/server-instructions.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +235 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +1185 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.js +218 -0
- package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +746 -0
- package/mcp-server/dist/services/typesafe-config.js.map +1 -0
- package/mcp-server/dist/services/typesafe.d.ts +213 -0
- package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe.js +330 -0
- package/mcp-server/dist/services/typesafe.js.map +1 -0
- package/mcp-server/dist/services/vector-cache.d.ts +68 -0
- package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
- package/mcp-server/dist/services/vector-cache.js +271 -0
- package/mcp-server/dist/services/vector-cache.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
- package/mcp-server/dist/tools/agents.d.ts +212 -0
- package/mcp-server/dist/tools/agents.d.ts.map +1 -0
- package/mcp-server/dist/tools/agents.js +407 -0
- package/mcp-server/dist/tools/agents.js.map +1 -0
- package/mcp-server/dist/tools/bluesky.d.ts +39 -0
- package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
- package/mcp-server/dist/tools/bluesky.js +1144 -0
- package/mcp-server/dist/tools/bluesky.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +106 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
- package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-batch.js +187 -0
- package/mcp-server/dist/tools/browser-batch.js.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +300 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +142 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +2009 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +34 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +112 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +16 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/choice.d.ts +160 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -0
- package/mcp-server/dist/tools/choice.js +80 -0
- package/mcp-server/dist/tools/choice.js.map +1 -0
- package/mcp-server/dist/tools/computer.d.ts +71 -0
- package/mcp-server/dist/tools/computer.d.ts.map +1 -0
- package/mcp-server/dist/tools/computer.js +174 -0
- package/mcp-server/dist/tools/computer.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +25 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
- package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/fb-groups.js +369 -0
- package/mcp-server/dist/tools/fb-groups.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +11 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.js +351 -0
- package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.js +258 -0
- package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.js +357 -0
- package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.js +321 -0
- package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.js +197 -0
- package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.js +274 -0
- package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.js +425 -0
- package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
- package/mcp-server/dist/tools/gsc.d.ts +7 -0
- package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc.js +51 -0
- package/mcp-server/dist/tools/gsc.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +14 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +21 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +401 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +56 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +171 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/morelogin.d.ts +24 -0
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
- package/mcp-server/dist/tools/morelogin.js +79 -0
- package/mcp-server/dist/tools/morelogin.js.map +1 -0
- package/mcp-server/dist/tools/profile.d.ts +17 -0
- package/mcp-server/dist/tools/profile.d.ts.map +1 -0
- package/mcp-server/dist/tools/profile.js +114 -0
- package/mcp-server/dist/tools/profile.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +71 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +147 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +56 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +157 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +62 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +201 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.js +231 -0
- package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
- package/mcp-server/dist/tools/style-guide.d.ts +8 -0
- package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide.js +12 -0
- package/mcp-server/dist/tools/style-guide.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +20 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +156 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +11 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +19 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +54 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.js +337 -0
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +16 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.js +83 -0
- package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.js +56 -0
- package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
- package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/download.js +30 -0
- package/mcp-server/dist/tools/youtube/download.js.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.js +143 -0
- package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
- package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
- package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/media.js +97 -0
- package/mcp-server/dist/tools/youtube/media.js.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.js +106 -0
- package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.js +71 -0
- package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.js +128 -0
- package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.js +147 -0
- package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
- package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
- package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/source.js +85 -0
- package/mcp-server/dist/tools/youtube/source.js.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.js +255 -0
- package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
- package/mcp-server/dist/tools/youtube.d.ts +12 -0
- package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube.js +38 -0
- package/mcp-server/dist/tools/youtube.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +806 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/mcp-server/package-lock.json +4798 -0
- package/mcp-server/package.json +55 -38
- package/mcp-server/run.mjs +12 -2
- package/mcp-server/src/config.ts +48 -3
- package/mcp-server/src/http.ts +296 -93
- package/mcp-server/src/index.ts +546 -203
- package/mcp-server/src/preload-http.ts +19 -18
- package/mcp-server/src/preload.ts +19 -18
- package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
- package/mcp-server/src/services/assistant-judgments.ts +157 -0
- package/mcp-server/src/services/browser-assist-gate.ts +383 -0
- package/mcp-server/src/services/browser-assist.ts +267 -0
- package/mcp-server/src/services/browser-bench.ts +477 -0
- package/mcp-server/src/services/browser-judgments.ts +414 -0
- package/mcp-server/src/services/browser-risk.ts +484 -0
- package/mcp-server/src/services/categories.ts +36 -19
- package/mcp-server/src/services/codex-config-heal.ts +403 -0
- package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
- package/mcp-server/src/services/desktop-assist.ts +308 -0
- package/mcp-server/src/services/desktop-bench.ts +372 -0
- package/mcp-server/src/services/desktop-client.ts +76 -0
- package/mcp-server/src/services/desktop-judgments.ts +218 -0
- package/mcp-server/src/services/desktop-risk.ts +743 -0
- package/mcp-server/src/services/edit-stale.ts +299 -0
- package/mcp-server/src/services/embedding-service.ts +108 -0
- package/mcp-server/src/services/embedding-worker.ts +46 -0
- package/mcp-server/src/services/fb-regions.ts +221 -0
- package/mcp-server/src/services/file-checksums.ts +26 -9
- package/mcp-server/src/services/file-excerpt.ts +59 -0
- package/mcp-server/src/services/identity.ts +291 -0
- package/mcp-server/src/services/local-embeddings.ts +2 -77
- package/mcp-server/src/services/memory-client.ts +23 -0
- package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
- package/mcp-server/src/services/memory-judgments.ts +901 -0
- package/mcp-server/src/services/memory-maintenance.ts +360 -0
- package/mcp-server/src/services/memory-retrieval.ts +349 -0
- package/mcp-server/src/services/memory-schema.ts +280 -0
- package/mcp-server/src/services/memory-sessions.ts +87 -0
- package/mcp-server/src/services/memory-triage.ts +182 -0
- package/mcp-server/src/services/memory-verification.ts +68 -0
- package/mcp-server/src/services/memory-writer.ts +125 -0
- package/mcp-server/src/services/neural-interface.ts +1217 -73
- package/mcp-server/src/services/profiles.ts +428 -0
- package/mcp-server/src/services/secret-gate.ts +52 -0
- package/mcp-server/src/services/server-instructions.ts +122 -0
- package/mcp-server/src/services/sqlite.ts +1456 -823
- package/mcp-server/src/services/typesafe-bench.ts +247 -0
- package/mcp-server/src/services/typesafe-config.ts +790 -0
- package/mcp-server/src/services/typesafe.ts +390 -0
- package/mcp-server/src/services/vector-cache.ts +255 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
- package/mcp-server/src/tools/agents.ts +539 -0
- package/mcp-server/src/tools/bluesky.ts +1186 -0
- package/mcp-server/src/tools/browser-advanced.ts +15 -6
- package/mcp-server/src/tools/browser-batch.ts +178 -0
- package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
- package/mcp-server/src/tools/browser-interact.ts +362 -255
- package/mcp-server/src/tools/browser-navigate.ts +164 -77
- package/mcp-server/src/tools/browser-observe.ts +2222 -1330
- package/mcp-server/src/tools/browser.ts +181 -107
- package/mcp-server/src/tools/card.ts +7 -5
- package/mcp-server/src/tools/choice.ts +103 -0
- package/mcp-server/src/tools/computer.ts +190 -0
- package/mcp-server/src/tools/discord.ts +10 -23
- package/mcp-server/src/tools/fb-groups.ts +387 -0
- package/mcp-server/src/tools/forget.ts +1 -1
- package/mcp-server/src/tools/git.ts +3 -1
- package/mcp-server/src/tools/gsc/experience.ts +440 -0
- package/mcp-server/src/tools/gsc/helpers.ts +288 -0
- package/mcp-server/src/tools/gsc/indexing.ts +495 -0
- package/mcp-server/src/tools/gsc/inspect.ts +391 -0
- package/mcp-server/src/tools/gsc/navigate.ts +236 -0
- package/mcp-server/src/tools/gsc/performance.ts +352 -0
- package/mcp-server/src/tools/gsc/settings.ts +564 -0
- package/mcp-server/src/tools/gsc.ts +95 -0
- package/mcp-server/src/tools/image.ts +3 -1
- package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
- package/mcp-server/src/tools/leonardo.ts +7 -5
- package/mcp-server/src/tools/loop.ts +118 -25
- package/mcp-server/src/tools/memories.ts +65 -5
- package/mcp-server/src/tools/morelogin.ts +81 -0
- package/mcp-server/src/tools/profile.ts +122 -0
- package/mcp-server/src/tools/recall.ts +105 -261
- package/mcp-server/src/tools/reflect.ts +171 -145
- package/mcp-server/src/tools/remember.ts +223 -115
- package/mcp-server/src/tools/style-guide-tools.ts +250 -0
- package/mcp-server/src/tools/style-guide.ts +16 -0
- package/mcp-server/src/tools/sync.ts +66 -9
- package/mcp-server/src/tools/tictactoe.ts +3 -1
- package/mcp-server/src/tools/utils.ts +22 -0
- package/mcp-server/src/tools/whiteboard-format.ts +394 -0
- package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
- package/mcp-server/src/tools/whiteboard.ts +7 -5
- package/mcp-server/src/tools/youtube/analytics.ts +106 -0
- package/mcp-server/src/tools/youtube/dedup.ts +57 -0
- package/mcp-server/src/tools/youtube/download.ts +41 -0
- package/mcp-server/src/tools/youtube/helpers.ts +183 -0
- package/mcp-server/src/tools/youtube/media.ts +109 -0
- package/mcp-server/src/tools/youtube/metadata.ts +112 -0
- package/mcp-server/src/tools/youtube/navigate.ts +81 -0
- package/mcp-server/src/tools/youtube/playlist.ts +134 -0
- package/mcp-server/src/tools/youtube/schedule.ts +158 -0
- package/mcp-server/src/tools/youtube/source.ts +101 -0
- package/mcp-server/src/tools/youtube/upload.ts +296 -0
- package/mcp-server/src/tools/youtube.ts +47 -0
- package/mcp-server/src/tui.ts +8 -9
- package/neural-interface/games/TicTacToe/1.svg +1 -0
- package/neural-interface/games/TicTacToe/2.svg +1 -0
- package/neural-interface/games/TicTacToe/3.svg +1 -0
- package/neural-interface/games/TicTacToe/4.svg +1 -0
- package/neural-interface/games/TicTacToe/5.svg +1 -0
- package/neural-interface/games/TicTacToe/6.svg +1 -0
- package/neural-interface/games/TicTacToe/7.svg +1 -0
- package/neural-interface/games/TicTacToe/8.svg +1 -0
- package/neural-interface/games/TicTacToe/9.svg +1 -0
- package/neural-interface/games/TicTacToe/Board.svg +1 -0
- package/neural-interface/games/TicTacToe/Circle.svg +1 -0
- package/neural-interface/games/TicTacToe/Cross.svg +1 -0
- package/neural-interface/i18n/en.json +7022 -0
- package/neural-interface/i18n/pt-BR.json +7026 -0
- package/neural-interface/lib/assistant-api.js +1005 -0
- package/neural-interface/lib/assistant-attachments.js +121 -0
- package/neural-interface/lib/assistant-brains/claude.js +207 -0
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
- package/neural-interface/lib/assistant-brains/codex.js +213 -0
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
- package/neural-interface/lib/assistant-brains/opencode.js +320 -0
- package/neural-interface/lib/assistant-budget.js +318 -0
- package/neural-interface/lib/assistant-catalog.js +731 -0
- package/neural-interface/lib/assistant-clarify.js +664 -0
- package/neural-interface/lib/assistant-config.js +232 -0
- package/neural-interface/lib/assistant-dispatch.js +2744 -0
- package/neural-interface/lib/assistant-envelope.js +582 -0
- package/neural-interface/lib/assistant-evidence.js +236 -0
- package/neural-interface/lib/assistant-hidden-models.js +272 -0
- package/neural-interface/lib/assistant-jev.js +117 -0
- package/neural-interface/lib/assistant-judgments.js +111 -0
- package/neural-interface/lib/assistant-media.js +335 -0
- package/neural-interface/lib/assistant-memory.js +398 -0
- package/neural-interface/lib/assistant-persona.js +444 -0
- package/neural-interface/lib/assistant-plan-permissions.js +448 -0
- package/neural-interface/lib/assistant-playbooks/design.md +87 -0
- package/neural-interface/lib/assistant-playbooks.js +72 -0
- package/neural-interface/lib/assistant-pricing.js +159 -0
- package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
- package/neural-interface/lib/assistant-route-gate.js +212 -0
- package/neural-interface/lib/assistant-router.js +1324 -0
- package/neural-interface/lib/assistant-runtime.js +3337 -0
- package/neural-interface/lib/assistant-task-prompt.js +472 -0
- package/neural-interface/lib/assistant-usage.js +1688 -0
- package/neural-interface/lib/augmented-path.js +70 -0
- package/neural-interface/lib/automation-storage-migration.js +54 -0
- package/neural-interface/lib/backup-service.js +851 -0
- package/neural-interface/lib/backup-zip-reader.js +262 -0
- package/neural-interface/lib/browser-assist-api.js +41 -0
- package/neural-interface/lib/browser-console.js +176 -0
- package/neural-interface/lib/browser-execution.js +241 -0
- package/neural-interface/lib/browser-extraction.js +191 -0
- package/neural-interface/lib/browser-language.js +83 -0
- package/neural-interface/lib/browser-screenshot.js +399 -0
- package/neural-interface/lib/browser-semantic-context.js +639 -0
- package/neural-interface/lib/browser-snapshots.js +192 -0
- package/neural-interface/lib/browser-tab-recovery.js +119 -0
- package/neural-interface/lib/browser-targets.js +70 -0
- package/neural-interface/lib/browser-tool-policy.js +926 -0
- package/neural-interface/lib/claude-accounts.js +230 -0
- package/neural-interface/lib/claude-agent-bridge.js +3203 -0
- package/neural-interface/lib/claude-bypass-policy.js +99 -0
- package/neural-interface/lib/claude-executable.js +241 -0
- package/neural-interface/lib/claude-history.js +429 -0
- package/neural-interface/lib/claude-model-catalog.js +444 -0
- package/neural-interface/lib/claude-panel-requests.js +165 -0
- package/neural-interface/lib/claude-panel-session.js +272 -0
- package/neural-interface/lib/claude-permission-rules.js +153 -0
- package/neural-interface/lib/claude-session-cleanup.js +71 -0
- package/neural-interface/lib/claude-session-list.js +82 -0
- package/neural-interface/lib/claude-session-ops.js +140 -0
- package/neural-interface/lib/claude-settings-view.js +51 -0
- package/neural-interface/lib/claude-skin-connect.js +79 -0
- package/neural-interface/lib/claude-stall-policy.js +7 -0
- package/neural-interface/lib/claude-temporary.js +435 -0
- package/neural-interface/lib/cli-update-planner.js +312 -0
- package/neural-interface/lib/codex-capabilities.d.ts +41 -0
- package/neural-interface/lib/codex-capabilities.js +148 -0
- package/neural-interface/lib/codex-collaboration-mode.js +17 -0
- package/neural-interface/lib/codex-compat-rpc.js +241 -0
- package/neural-interface/lib/codex-mcp-approvals.js +56 -0
- package/neural-interface/lib/codex-mcp-apps.js +47 -0
- package/neural-interface/lib/codex-model-context.js +202 -0
- package/neural-interface/lib/codex-plan-store.js +71 -0
- package/neural-interface/lib/codex-request-journal.js +242 -0
- package/neural-interface/lib/codex-runtime-path.js +213 -0
- package/neural-interface/lib/codex-session-catalog.js +231 -0
- package/neural-interface/lib/codex-session-settings.js +46 -0
- package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
- package/neural-interface/lib/codex-thread-history.js +165 -0
- package/neural-interface/lib/codex-user-verification.js +34 -0
- package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
- package/neural-interface/lib/confined-fs.js +256 -0
- package/neural-interface/lib/db.js +922 -0
- package/neural-interface/lib/design-md.js +9 -0
- package/neural-interface/lib/desktop/api.js +92 -0
- package/neural-interface/lib/desktop/audit.js +62 -0
- package/neural-interface/lib/desktop/build.js +423 -0
- package/neural-interface/lib/desktop/config.js +606 -0
- package/neural-interface/lib/desktop/coords.js +76 -0
- package/neural-interface/lib/desktop/fake-helper.js +1192 -0
- package/neural-interface/lib/desktop/frames.js +77 -0
- package/neural-interface/lib/desktop/grants.js +84 -0
- package/neural-interface/lib/desktop/guards.js +170 -0
- package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
- package/neural-interface/lib/desktop/lease.js +51 -0
- package/neural-interface/lib/desktop/manager.js +545 -0
- package/neural-interface/lib/desktop/press-contexts.js +103 -0
- package/neural-interface/lib/desktop/protocol.js +495 -0
- package/neural-interface/lib/desktop/service.js +1202 -0
- package/neural-interface/lib/effort-levels.js +148 -0
- package/neural-interface/lib/event-loop-monitor.js +67 -0
- package/neural-interface/lib/exec-loop-command.js +209 -0
- package/neural-interface/lib/folder-picker.ps1 +77 -0
- package/neural-interface/lib/http-guards.js +287 -0
- package/neural-interface/lib/jsonl-lines.js +94 -0
- package/neural-interface/lib/loop-logger.js +127 -0
- package/neural-interface/lib/mcp-client-config.js +133 -0
- package/neural-interface/lib/mcp-installer.js +487 -0
- package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
- package/neural-interface/lib/mcp-profile-servers.js +120 -0
- package/neural-interface/lib/memo-cache.js +84 -0
- package/neural-interface/lib/memory-api.js +758 -0
- package/neural-interface/lib/memory-map-api.js +1150 -0
- package/neural-interface/lib/memory-map-layout.js +872 -0
- package/neural-interface/lib/memory-map-worker.js +165 -0
- package/neural-interface/lib/memory-session-capture.js +81 -0
- package/neural-interface/lib/memory-timers.js +62 -0
- package/neural-interface/lib/morelogin.js +301 -0
- package/neural-interface/lib/native-binary-runtime.js +382 -0
- package/neural-interface/lib/native-loop-goal.js +33 -0
- package/neural-interface/lib/native-loop-providers.js +1002 -0
- package/neural-interface/lib/native-loop-runtime.js +747 -0
- package/neural-interface/lib/offline-page.js +54 -0
- package/neural-interface/lib/opencode-hidden-models.js +113 -0
- package/neural-interface/lib/opencode-history.js +253 -0
- package/neural-interface/lib/opencode-runtime-config.js +58 -0
- package/neural-interface/lib/opencode-v2-client.js +486 -0
- package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
- package/neural-interface/lib/path-confine.js +213 -0
- package/neural-interface/lib/plugin-installer.js +264 -0
- package/neural-interface/lib/project-storage.js +766 -0
- package/neural-interface/lib/pty-host/core.js +603 -0
- package/neural-interface/lib/pty-host/flow.js +43 -0
- package/neural-interface/lib/pty-host/host.js +47 -0
- package/neural-interface/lib/pty-host/manager.js +360 -0
- package/neural-interface/lib/pty-host/protocol.js +81 -0
- package/neural-interface/lib/pty-host/snapshot.js +133 -0
- package/neural-interface/lib/remote-policy.js +582 -0
- package/neural-interface/lib/rulesets/api.js +175 -0
- package/neural-interface/lib/rulesets/fs-safe.js +245 -0
- package/neural-interface/lib/rulesets/installer.js +1453 -0
- package/neural-interface/lib/rulesets/json-edit.js +186 -0
- package/neural-interface/lib/rulesets/lock.js +170 -0
- package/neural-interface/lib/rulesets/managed-text.js +314 -0
- package/neural-interface/lib/rulesets/normalise.js +24 -0
- package/neural-interface/lib/rulesets/render.js +84 -0
- package/neural-interface/lib/schedule-launch-intent.js +40 -0
- package/neural-interface/lib/session-cache-builder.js +524 -0
- package/neural-interface/lib/session-chunker.js +344 -0
- package/neural-interface/lib/session-indexer.js +327 -0
- package/neural-interface/lib/session-title-generator.js +232 -0
- package/neural-interface/lib/skill-prompt-bridge.js +11 -0
- package/neural-interface/lib/style-guide/api.js +375 -0
- package/neural-interface/lib/style-guide/color.js +352 -0
- package/neural-interface/lib/style-guide/export-css.js +99 -0
- package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
- package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
- package/neural-interface/lib/style-guide/fonts.json +227 -0
- package/neural-interface/lib/style-guide/import.js +1268 -0
- package/neural-interface/lib/style-guide/pointers.js +103 -0
- package/neural-interface/lib/style-guide/presets.js +232 -0
- package/neural-interface/lib/style-guide/render-design-md.js +319 -0
- package/neural-interface/lib/style-guide/schema.js +848 -0
- package/neural-interface/lib/style-guide/security.js +43 -0
- package/neural-interface/lib/style-guide/store.js +491 -0
- package/neural-interface/lib/style-guide/summary.js +106 -0
- package/neural-interface/lib/style-guide/tokens.js +170 -0
- package/neural-interface/lib/synabun-update-plan.js +324 -0
- package/neural-interface/lib/synabun-version.js +179 -0
- package/neural-interface/lib/system-restore.js +99 -0
- package/neural-interface/lib/terminal-env.js +86 -0
- package/neural-interface/lib/ui-blob-store.js +106 -0
- package/neural-interface/lib/vector-cache.js +2 -0
- package/neural-interface/lib/virtual-socket.js +60 -0
- package/neural-interface/lib/whatsapp/api.js +146 -0
- package/neural-interface/lib/whatsapp/auth-store.js +389 -0
- package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
- package/neural-interface/lib/whatsapp/brain.js +128 -0
- package/neural-interface/lib/whatsapp/bridge.js +1499 -0
- package/neural-interface/lib/whatsapp/cards.js +519 -0
- package/neural-interface/lib/whatsapp/commands.js +92 -0
- package/neural-interface/lib/whatsapp/config.js +291 -0
- package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
- package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
- package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
- package/neural-interface/lib/whatsapp/connector/package.json +8 -0
- package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
- package/neural-interface/lib/whatsapp/format.js +552 -0
- package/neural-interface/lib/whatsapp/host-core.js +1225 -0
- package/neural-interface/lib/whatsapp/host.js +119 -0
- package/neural-interface/lib/whatsapp/identity.js +288 -0
- package/neural-interface/lib/whatsapp/inbound.js +149 -0
- package/neural-interface/lib/whatsapp/installer.js +562 -0
- package/neural-interface/lib/whatsapp/manager.js +638 -0
- package/neural-interface/lib/whatsapp/paths.js +81 -0
- package/neural-interface/lib/whatsapp/protocol.js +327 -0
- package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
- package/neural-interface/lib/whatsapp/redact.js +130 -0
- package/neural-interface/lib/whatsapp/service.js +1305 -0
- package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
- package/neural-interface/package-lock.json +4431 -0
- package/neural-interface/package.json +58 -27
- package/neural-interface/public/apple-touch-icon.png +0 -0
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +1 -0
- package/neural-interface/public/favicon-16x16.png +0 -0
- package/neural-interface/public/favicon-32x32.png +0 -0
- package/neural-interface/public/icon-192.png +0 -0
- package/neural-interface/public/icon-512.png +0 -0
- package/neural-interface/public/index.html +32 -182
- package/neural-interface/public/index2d.html +2 -2
- package/neural-interface/public/install-app.html +31 -0
- package/neural-interface/public/logo-synabun.png +0 -0
- package/neural-interface/public/logoHD.png +0 -0
- package/neural-interface/public/manifest.json +2 -0
- package/neural-interface/public/mcp.svg +4 -0
- package/neural-interface/public/offline.html +670 -299
- package/neural-interface/public/onboarding.html +804 -161
- package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
- package/neural-interface/public/shared/agent-runtime-options.js +596 -0
- package/neural-interface/public/shared/api.js +339 -28
- package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
- package/neural-interface/public/shared/assistant/asst-api.js +270 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
- package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
- package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
- package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
- package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
- package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
- package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
- package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
- package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
- package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
- package/neural-interface/public/shared/assistant/asst-state.js +727 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
- package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
- package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
- package/neural-interface/public/shared/automation-context.js +75 -0
- package/neural-interface/public/shared/blob-store.js +99 -0
- package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
- package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
- package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
- package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
- package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
- package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
- package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
- package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
- package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
- package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
- package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
- package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
- package/neural-interface/public/shared/cli-status.js +169 -0
- package/neural-interface/public/shared/command-runner-model.js +30 -0
- package/neural-interface/public/shared/constants.js +22 -5
- package/neural-interface/public/shared/cp/cp-agents.js +186 -0
- package/neural-interface/public/shared/cp/cp-bash.js +252 -0
- package/neural-interface/public/shared/cp/cp-compose.js +159 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
- package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
- package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
- package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
- package/neural-interface/public/shared/cp/cp-diff.js +255 -0
- package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
- package/neural-interface/public/shared/cp/cp-events.js +846 -0
- package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
- package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
- package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
- package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
- package/neural-interface/public/shared/cp/cp-restore.js +224 -0
- package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
- package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
- package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
- package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
- package/neural-interface/public/shared/cp/cp-styles.js +349 -0
- package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
- package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
- package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
- package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
- package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
- package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
- package/neural-interface/public/shared/graph-activity.js +68 -0
- package/neural-interface/public/shared/html-shell.js +116 -17
- package/neural-interface/public/shared/i18n.js +132 -34
- package/neural-interface/public/shared/node-positions-store.js +44 -0
- package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
- package/neural-interface/public/shared/provider-icons.js +30 -0
- package/neural-interface/public/shared/pwa-install-page.js +34 -0
- package/neural-interface/public/shared/pwa-install.css +12 -0
- package/neural-interface/public/shared/pwa-install.js +28 -0
- package/neural-interface/public/shared/session-title.js +100 -0
- package/neural-interface/public/shared/settings/settings-ia.js +389 -0
- package/neural-interface/public/shared/settings/settings-kit.js +234 -0
- package/neural-interface/public/shared/settings/settings-rules.js +160 -0
- package/neural-interface/public/shared/settings/settings-search.js +463 -0
- package/neural-interface/public/shared/settings/settings-shell.js +570 -0
- package/neural-interface/public/shared/start-bridge.js +583 -0
- package/neural-interface/public/shared/state.js +5 -0
- package/neural-interface/public/shared/storage.js +50 -7
- package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
- package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
- package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
- package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
- package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
- package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
- package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
- package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
- package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
- package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
- package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
- package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
- package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
- package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
- package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
- package/neural-interface/public/shared/styles.css +8614 -1477
- package/neural-interface/public/shared/synabun-mascot.js +1625 -0
- package/neural-interface/public/shared/synabun-ticker.js +376 -0
- package/neural-interface/public/shared/term-ready.js +307 -0
- package/neural-interface/public/shared/term-renderer.js +343 -0
- package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
- package/neural-interface/public/shared/ui-assistant.js +77 -0
- package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
- package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
- package/neural-interface/public/shared/ui-codex-panel.js +12 -0
- package/neural-interface/public/shared/ui-command-runner.js +251 -468
- package/neural-interface/public/shared/ui-cost-widget.js +55 -34
- package/neural-interface/public/shared/ui-detail.js +77 -14
- package/neural-interface/public/shared/ui-explorer.js +360 -181
- package/neural-interface/public/shared/ui-file-explorer.js +485 -107
- package/neural-interface/public/shared/ui-help.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +45 -21
- package/neural-interface/public/shared/ui-judgments.js +1346 -0
- package/neural-interface/public/shared/ui-keybinds.js +3 -2
- package/neural-interface/public/shared/ui-link.js +105 -51
- package/neural-interface/public/shared/ui-loading.js +222 -11
- package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
- package/neural-interface/public/shared/ui-menubar.js +100 -31
- package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
- package/neural-interface/public/shared/ui-native-window-id.js +7 -0
- package/neural-interface/public/shared/ui-navbar.js +357 -222
- package/neural-interface/public/shared/ui-notifications.js +58 -12
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
- package/neural-interface/public/shared/ui-panels.js +15 -7
- package/neural-interface/public/shared/ui-resume.js +823 -653
- package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
- package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
- package/neural-interface/public/shared/ui-sessions.js +789 -34
- package/neural-interface/public/shared/ui-settings.js +5774 -2194
- package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
- package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
- package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
- package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
- package/neural-interface/public/shared/ui-skills.js +18 -32
- package/neural-interface/public/shared/ui-styleguide.js +35 -0
- package/neural-interface/public/shared/ui-sync.js +87 -0
- package/neural-interface/public/shared/ui-terminal.js +7863 -6385
- package/neural-interface/public/shared/ui-tool-updates.js +292 -0
- package/neural-interface/public/shared/ui-tooltip.js +156 -15
- package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
- package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
- package/neural-interface/public/shared/ui-tutorial.css +102 -0
- package/neural-interface/public/shared/ui-tutorial.js +557 -1076
- package/neural-interface/public/shared/ui-update.js +420 -68
- package/neural-interface/public/shared/ui-whatsapp.js +941 -0
- package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
- package/neural-interface/public/shared/ui-workspaces.js +2 -1
- package/neural-interface/public/shared/utils.js +58 -0
- package/neural-interface/public/shared/vterm-buffer.js +15 -5
- package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
- package/neural-interface/public/sidepanel-session.html +18 -0
- package/neural-interface/public/sw.js +10 -2
- package/neural-interface/public/synabun.png +0 -0
- package/neural-interface/public/variant/2d/graph.js +1707 -1635
- package/neural-interface/public/variant/2d/lasso.js +2 -1
- package/neural-interface/public/variant/2d/layout.js +595 -594
- package/neural-interface/public/variant/2d/main.js +557 -521
- package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
- package/neural-interface/public/variant/3d/main.js +517 -500
- package/neural-interface/public/variant/3d/map-controls.js +144 -0
- package/neural-interface/public/variant/3d/map-data.js +251 -0
- package/neural-interface/public/variant/3d/map-labels.js +241 -0
- package/neural-interface/public/variant/3d/map-pick.js +90 -0
- package/neural-interface/public/variant/3d/map-renderer.js +521 -0
- package/neural-interface/public/variant/3d/map-shaders.js +158 -0
- package/neural-interface/public/variant/3d/map-view.js +618 -0
- package/neural-interface/public/vendor/three/manifest.json +3 -0
- package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
- package/neural-interface/public/vendor/xterm/manifest.json +3 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
- package/neural-interface/scripts/build-vendor.mjs +64 -0
- package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
- package/neural-interface/scripts/rebuild-pty.js +39 -22
- package/neural-interface/scripts/vendor-three-entry.js +24 -0
- package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
- package/neural-interface/server.js +33983 -15000
- package/neural-interface/skins/default/skin.css +90 -0
- package/neural-interface/skins/default/skin.json +8 -0
- package/neural-interface/templates/rulesets/README.md +9 -0
- package/neural-interface/templates/rulesets/claude.md +3 -0
- package/neural-interface/templates/rulesets/codex.md +2 -0
- package/neural-interface/templates/rulesets/coexistence.md +6 -0
- package/neural-interface/templates/rulesets/core.md +26 -0
- package/neural-interface/templates/rulesets/cursor.md +2 -0
- package/neural-interface/templates/rulesets/gemini.md +2 -0
- package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
- package/neural-interface/templates/rulesets/manifest.json +12 -0
- package/neural-interface/templates/rulesets/opencode.md +2 -0
- package/package.json +131 -53
- package/postinstall.js +55 -26
- package/preuninstall.js +187 -0
- package/scripts/restore-data-home-from-backup.mjs +239 -0
- package/setup.js +872 -260
- package/skills/leonardo/SKILL.md +19 -10
- package/skills/leonardo/modules/image-prompter.md +18 -12
- package/skills/leonardo/modules/video-prompter.md +19 -13
- package/skills/synabun/SKILL.md +209 -185
- package/skills/synabun/icon.png +0 -0
- package/skills/synabun/modules/audit.md +380 -374
- package/skills/synabun/modules/changelog.md +15 -6
- package/skills/synabun/modules/idea.md +148 -144
- package/skills/synabun/modules/memorize.md +13 -4
- package/skills/synabun/modules/schedule.md +198 -0
- package/skills/synabun/synabunicon.png +0 -0
- package/updater.cmd +31 -0
- package/updater.mjs +382 -0
- package/updater.sh +29 -0
- package/hooks/claude-code/test-user-learning.mjs +0 -531
- package/neural-interface/public/claude-chat.css +0 -878
- package/neural-interface/public/claude-chat.html +0 -92
- package/neural-interface/public/claude-chat.js +0 -1168
- package/neural-interface/public/index-legacy.html +0 -14677
- package/neural-interface/public/index2d-legacy.html +0 -8193
- package/neural-interface/public/shared/html-term-renderer.js +0 -1022
- package/neural-interface/public/variant/3d/background.js +0 -884
- package/neural-interface/public/variant/3d/camera.js +0 -661
- package/neural-interface/public/variant/3d/gfx.js +0 -116
- package/neural-interface/public/variant/3d/graph.js +0 -2399
- package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
- package/neural-interface/templates/CLAUDE-template.md +0 -211
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — one entry of a JSON list, edited as text (pure, no fs)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// OpenCode's config.json belongs to the user. Parsing it and writing it back
|
|
6
|
+
// would re-indent it, re-space it and drop whatever JSON.stringify spells
|
|
7
|
+
// differently, all to add one string to one list. These two functions change
|
|
8
|
+
// only the characters of that entry (and of the key, when SynaBun adds or takes
|
|
9
|
+
// away the whole list): every other byte, the BOM, the line endings and the
|
|
10
|
+
// final newline stay as they were.
|
|
11
|
+
//
|
|
12
|
+
// Input must be strict JSON holding an object (the caller parsed it already).
|
|
13
|
+
// Both throw on text they cannot follow, and on a key that is there more than
|
|
14
|
+
// once (code DUPLICATE_KEY): JSON.parse keeps the last one, so an edit of
|
|
15
|
+
// either would lose or strand an entry. The caller then refuses to write;
|
|
16
|
+
// nothing here, and nothing in the installer, re-serialises the file.
|
|
17
|
+
|
|
18
|
+
const WHITESPACE = new Set([' ', '\t', '\r', '\n']);
|
|
19
|
+
|
|
20
|
+
function skipSpace(text, pos) {
|
|
21
|
+
while (pos < text.length && WHITESPACE.has(text[pos])) pos++;
|
|
22
|
+
return pos;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function skipString(text, pos) {
|
|
26
|
+
for (let i = pos + 1; i < text.length; i++) {
|
|
27
|
+
if (text[i] === '\\') { i++; continue; }
|
|
28
|
+
if (text[i] === '"') return i + 1;
|
|
29
|
+
}
|
|
30
|
+
throw new Error('JSON string without an end');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The offset just past the value that starts at `pos`. */
|
|
34
|
+
function skipValue(text, pos) {
|
|
35
|
+
const first = text[pos];
|
|
36
|
+
if (first === '"') return skipString(text, pos);
|
|
37
|
+
if (first === '{' || first === '[') {
|
|
38
|
+
let depth = 0;
|
|
39
|
+
for (let i = pos; i < text.length; i++) {
|
|
40
|
+
const ch = text[i];
|
|
41
|
+
if (ch === '"') { i = skipString(text, i) - 1; continue; }
|
|
42
|
+
if (ch === '{' || ch === '[') depth++;
|
|
43
|
+
else if (ch === '}' || ch === ']') { depth--; if (depth === 0) return i + 1; }
|
|
44
|
+
}
|
|
45
|
+
throw new Error('JSON value without an end');
|
|
46
|
+
}
|
|
47
|
+
let end = pos;
|
|
48
|
+
while (end < text.length && !WHITESPACE.has(text[end]) && text[end] !== ',' && text[end] !== '}' && text[end] !== ']') end++;
|
|
49
|
+
if (end === pos) throw new Error('JSON value expected');
|
|
50
|
+
return end;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** {open, close, members:[{key, keyStart, valueStart, valueEnd}]} for the object whose `{` is at `open`. */
|
|
54
|
+
function scanObject(text, open) {
|
|
55
|
+
if (text[open] !== '{') throw new Error('JSON object expected');
|
|
56
|
+
const members = [];
|
|
57
|
+
let pos = skipSpace(text, open + 1);
|
|
58
|
+
if (text[pos] === '}') return { open, close: pos, members };
|
|
59
|
+
for (;;) {
|
|
60
|
+
if (text[pos] !== '"') throw new Error('JSON key expected');
|
|
61
|
+
const keyStart = pos;
|
|
62
|
+
const keyEnd = skipString(text, pos);
|
|
63
|
+
pos = skipSpace(text, keyEnd);
|
|
64
|
+
if (text[pos] !== ':') throw new Error('JSON colon expected');
|
|
65
|
+
const valueStart = skipSpace(text, pos + 1);
|
|
66
|
+
const valueEnd = skipValue(text, valueStart);
|
|
67
|
+
members.push({ key: JSON.parse(text.slice(keyStart, keyEnd)), keyStart, valueStart, valueEnd });
|
|
68
|
+
pos = skipSpace(text, valueEnd);
|
|
69
|
+
if (text[pos] === ',') { pos = skipSpace(text, pos + 1); continue; }
|
|
70
|
+
if (text[pos] === '}') return { open, close: pos, members };
|
|
71
|
+
throw new Error('JSON object without an end');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** {open, close, items:[{start, end}]} for the list whose `[` is at `open`. */
|
|
76
|
+
function scanList(text, open) {
|
|
77
|
+
if (text[open] !== '[') throw new Error('JSON list expected');
|
|
78
|
+
const items = [];
|
|
79
|
+
let pos = skipSpace(text, open + 1);
|
|
80
|
+
if (text[pos] === ']') return { open, close: pos, items };
|
|
81
|
+
for (;;) {
|
|
82
|
+
const end = skipValue(text, pos);
|
|
83
|
+
items.push({ start: pos, end });
|
|
84
|
+
pos = skipSpace(text, end);
|
|
85
|
+
if (text[pos] === ',') { pos = skipSpace(text, pos + 1); continue; }
|
|
86
|
+
if (text[pos] === ']') return { open, close: pos, items };
|
|
87
|
+
throw new Error('JSON list without an end');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function rootObject(text) {
|
|
92
|
+
return scanObject(text, skipSpace(text, text.startsWith('') ? 1 : 0));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** The whitespace `pos` is indented by, or null when something else comes before it on its line. */
|
|
96
|
+
function lineIndent(text, pos) {
|
|
97
|
+
let start = pos;
|
|
98
|
+
while (start > 0 && (text[start - 1] === ' ' || text[start - 1] === '\t')) start--;
|
|
99
|
+
return start === 0 || text[start - 1] === '\n' ? text.slice(start, pos) : null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function styleOf(text, root) {
|
|
103
|
+
const first = root.members.length ? lineIndent(text, root.members[0].keyStart) : null;
|
|
104
|
+
return { eol: text.includes('\r\n') ? '\r\n' : '\n', unit: first || ' ' };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** The index of the one member named `key`, or -1. Throws DUPLICATE_KEY when there are several. */
|
|
108
|
+
function findMember(root, key) {
|
|
109
|
+
let at = -1;
|
|
110
|
+
root.members.forEach((member, index) => {
|
|
111
|
+
if (member.key !== key) return;
|
|
112
|
+
if (at !== -1) {
|
|
113
|
+
const error = new Error(`"${key}" is there more than once`);
|
|
114
|
+
error.code = 'DUPLICATE_KEY';
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
at = index;
|
|
118
|
+
});
|
|
119
|
+
return at;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** How many times `key` appears at the top level of the object in `text`. */
|
|
123
|
+
export function countJsonKey(text, key) {
|
|
124
|
+
return rootObject(text).members.filter((member) => member.key === key).length;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Append the string `value` to the top-level list `key`, creating the list (as the last key) when there is none. */
|
|
128
|
+
export function addToJsonList(text, key, value) {
|
|
129
|
+
const root = rootObject(text);
|
|
130
|
+
const { eol, unit } = styleOf(text, root);
|
|
131
|
+
const quoted = JSON.stringify(value);
|
|
132
|
+
const at = findMember(root, key);
|
|
133
|
+
|
|
134
|
+
if (at !== -1) {
|
|
135
|
+
const member = root.members[at];
|
|
136
|
+
const list = scanList(text, member.valueStart);
|
|
137
|
+
if (list.items.length) {
|
|
138
|
+
const last = list.items[list.items.length - 1];
|
|
139
|
+
const indent = lineIndent(text, last.start);
|
|
140
|
+
return text.slice(0, last.end) + (indent === null ? `, ${quoted}` : `,${eol}${indent}${quoted}`) + text.slice(last.end);
|
|
141
|
+
}
|
|
142
|
+
const outer = lineIndent(text, member.keyStart);
|
|
143
|
+
const filled = outer === null ? `[${quoted}]` : `[${eol}${outer}${unit}${quoted}${eol}${outer}]`;
|
|
144
|
+
return text.slice(0, list.open) + filled + text.slice(list.close + 1);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const name = JSON.stringify(key);
|
|
148
|
+
if (root.members.length) {
|
|
149
|
+
const last = root.members[root.members.length - 1];
|
|
150
|
+
const indent = lineIndent(text, last.keyStart);
|
|
151
|
+
const added = indent === null
|
|
152
|
+
? `, ${name}: [${quoted}]`
|
|
153
|
+
: `,${eol}${indent}${name}: [${eol}${indent}${unit}${quoted}${eol}${indent}]`;
|
|
154
|
+
return text.slice(0, last.valueEnd) + added + text.slice(last.valueEnd);
|
|
155
|
+
}
|
|
156
|
+
return `${text.slice(0, root.open)}{${eol}${unit}${name}: [${eol}${unit}${unit}${quoted}${eol}${unit}]${eol}}${text.slice(root.close + 1)}`;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Take one occurrence of the string `value` (the last) out of the top-level
|
|
161
|
+
* list `key`. With `dropEmptyKey`, a list left empty goes too, key and all.
|
|
162
|
+
* Unchanged when the list or the string is not there.
|
|
163
|
+
*/
|
|
164
|
+
export function removeFromJsonList(text, key, value, { dropEmptyKey = false } = {}) {
|
|
165
|
+
const root = rootObject(text);
|
|
166
|
+
const at = findMember(root, key);
|
|
167
|
+
if (at === -1) return text;
|
|
168
|
+
const member = root.members[at];
|
|
169
|
+
if (text[member.valueStart] !== '[') return text;
|
|
170
|
+
const list = scanList(text, member.valueStart);
|
|
171
|
+
let found = -1;
|
|
172
|
+
list.items.forEach((item, index) => {
|
|
173
|
+
if (text[item.start] === '"' && JSON.parse(text.slice(item.start, item.end)) === value) found = index;
|
|
174
|
+
});
|
|
175
|
+
if (found === -1) return text;
|
|
176
|
+
|
|
177
|
+
if (list.items.length > 1) {
|
|
178
|
+
// With its comma: the one before it, or for the first item the one after.
|
|
179
|
+
if (found > 0) return text.slice(0, list.items[found - 1].end) + text.slice(list.items[found].end);
|
|
180
|
+
return text.slice(0, list.items[0].start) + text.slice(list.items[1].start);
|
|
181
|
+
}
|
|
182
|
+
if (!dropEmptyKey) return `${text.slice(0, list.open)}[]${text.slice(list.close + 1)}`;
|
|
183
|
+
if (root.members.length === 1) return `${text.slice(0, root.open)}{}${text.slice(root.close + 1)}`;
|
|
184
|
+
if (at > 0) return text.slice(0, root.members[at - 1].valueEnd) + text.slice(member.valueEnd);
|
|
185
|
+
return text.slice(0, member.keyStart) + text.slice(root.members[1].keyStart);
|
|
186
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — one rules writer per data home
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Two SynaBun servers can share one data home (two ports, a dev checkout next
|
|
6
|
+
// to an installed release). Every change the rules installer makes runs inside
|
|
7
|
+
// one critical section per data home, held by the operating system:
|
|
8
|
+
//
|
|
9
|
+
// <dataHome>/data/rulesets-lock.db
|
|
10
|
+
//
|
|
11
|
+
// is an empty SQLite database, and a write transaction on it (BEGIN IMMEDIATE)
|
|
12
|
+
// is the lock. Nothing is ever written to it: the transaction is rolled back to
|
|
13
|
+
// leave. SQLite keeps that lock as an OS file lock, so it goes away with the
|
|
14
|
+
// process that held it, however the process ended. There is no stale state to
|
|
15
|
+
// clean up, and nothing here looks at pids or ages: a holder that is suspended
|
|
16
|
+
// keeps the lock, and everyone else times out (BUSY).
|
|
17
|
+
//
|
|
18
|
+
// The binding is `node:sqlite`, the one the Neural Interface already loads for
|
|
19
|
+
// the memory store (server.js, lib/db.js). The journal mode stays the default
|
|
20
|
+
// (never WAL) and the locking mode stays normal (never EXCLUSIVE).
|
|
21
|
+
//
|
|
22
|
+
// NOTHING ELSE MAY EVER OPEN, READ, COPY OR BACK UP THAT FILE. On POSIX a
|
|
23
|
+
// process loses every lock it holds on a file the moment it closes any
|
|
24
|
+
// descriptor on that file, so a second look at it from inside the server (a
|
|
25
|
+
// backup that streams it, a checksum, a copy) can silently drop the lock while
|
|
26
|
+
// a writer is still inside. SQLite's own connections are safe from that; plain
|
|
27
|
+
// file access is not. lib/backup-service.js skips the file by name, and a
|
|
28
|
+
// restore never extracts it (lib/system-restore.js): both read LOCK_FILE_NAME
|
|
29
|
+
// through LOCK_ONLY_DATA_FILES of backup-service.js.
|
|
30
|
+
//
|
|
31
|
+
// The file can still be deleted or replaced under a running server (a restore,
|
|
32
|
+
// a cleanup tool, the user). A connection that stayed on the old, unlinked file
|
|
33
|
+
// would lock something nobody else looks at, and two processes would each
|
|
34
|
+
// believe they hold the lock. So the connection remembers which file it is on
|
|
35
|
+
// (device and inode, by stat alone: never by opening the file a second time)
|
|
36
|
+
// and checks the path against that before and after every BEGIN IMMEDIATE: a
|
|
37
|
+
// path that leads to another file, or to none, means a new connection.
|
|
38
|
+
|
|
39
|
+
import { mkdirSync, statSync } from 'node:fs';
|
|
40
|
+
import { dirname } from 'node:path';
|
|
41
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
42
|
+
|
|
43
|
+
export const DEFAULT_LOCK_TIMEOUT_MS = 2000;
|
|
44
|
+
/** The lock file's name inside <dataHome>/data. Spelled here and nowhere else. */
|
|
45
|
+
export const LOCK_FILE_NAME = 'rulesets-lock.db';
|
|
46
|
+
|
|
47
|
+
const SQLITE_BUSY = 5;
|
|
48
|
+
|
|
49
|
+
function lockError(code, message, cause) {
|
|
50
|
+
const error = new Error(message);
|
|
51
|
+
error.code = code;
|
|
52
|
+
error.retryable = code === 'BUSY';
|
|
53
|
+
if (cause) error.cause = cause;
|
|
54
|
+
return error;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function isBusy(error) {
|
|
58
|
+
// The primary result code: extended codes (SQLITE_BUSY_SNAPSHOT, ...) keep it in the low byte.
|
|
59
|
+
return (Number(error?.errcode) & 0xff) === SQLITE_BUSY || /database is locked/i.test(String(error?.errstr || error?.message || ''));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* The writer lock at `path`. `enter()` returns once this process holds it, or
|
|
64
|
+
* throws: BUSY when another holder kept it for `timeoutMs`, or when the lock
|
|
65
|
+
* file kept being replaced while it was taken (retryable), and
|
|
66
|
+
* LOCK_UNAVAILABLE when the lock file cannot be opened, is not an SQLite
|
|
67
|
+
* database (an empty file is one), or is one in WAL mode. A valid database
|
|
68
|
+
* that holds something is accepted: nothing is ever read from it or written
|
|
69
|
+
* to it. Either way the caller must change nothing. `leave()`
|
|
70
|
+
* gives it back. One connection, opened on the first `enter()` and kept for as
|
|
71
|
+
* long as `path` still leads to the file it is on. `afterBegin` runs right
|
|
72
|
+
* after the lock was taken, before the file is checked again (a seam for tests).
|
|
73
|
+
*/
|
|
74
|
+
export function createWriterLock(path, { timeoutMs = DEFAULT_LOCK_TIMEOUT_MS, afterBegin = null } = {}) {
|
|
75
|
+
const wait = Number.isFinite(timeoutMs) && timeoutMs >= 0 ? Math.floor(timeoutMs) : DEFAULT_LOCK_TIMEOUT_MS;
|
|
76
|
+
let db = null;
|
|
77
|
+
let file = null; // which file the connection is on: "<dev>:<ino>"
|
|
78
|
+
let held = false;
|
|
79
|
+
|
|
80
|
+
/** The file `path` leads to right now, as "<dev>:<ino>", or null when there is none. By stat alone. */
|
|
81
|
+
function identity() {
|
|
82
|
+
try {
|
|
83
|
+
const info = statSync(path, { bigint: true });
|
|
84
|
+
return `${info.dev}:${info.ino}`;
|
|
85
|
+
} catch (error) {
|
|
86
|
+
if (error?.code === 'ENOENT' || error?.code === 'ENOTDIR') return null;
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function close() {
|
|
91
|
+
const handle = db;
|
|
92
|
+
db = null;
|
|
93
|
+
file = null;
|
|
94
|
+
held = false;
|
|
95
|
+
try { handle?.close(); } catch { /* closed already */ }
|
|
96
|
+
}
|
|
97
|
+
function open() {
|
|
98
|
+
if (db) return db;
|
|
99
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
100
|
+
const before = identity();
|
|
101
|
+
const handle = new DatabaseSync(path);
|
|
102
|
+
try {
|
|
103
|
+
handle.exec(`PRAGMA busy_timeout=${wait}`);
|
|
104
|
+
const mode = handle.prepare('PRAGMA journal_mode').get()?.journal_mode;
|
|
105
|
+
if (String(mode).toLowerCase() === 'wal') throw new Error('it is in WAL mode, which SynaBun never sets');
|
|
106
|
+
file = identity();
|
|
107
|
+
// A file that was there before the open and is another one after it was replaced in between: which of the
|
|
108
|
+
// two this connection is on cannot be told by stat, so it is not used.
|
|
109
|
+
if (file === null || (before !== null && before !== file)) throw Object.assign(new Error('the lock file was replaced while it was being opened'), { moved: true });
|
|
110
|
+
} catch (error) {
|
|
111
|
+
file = null;
|
|
112
|
+
try { handle.close(); } catch { /* nothing to close */ }
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
db = handle;
|
|
116
|
+
return db;
|
|
117
|
+
}
|
|
118
|
+
function unavailable(cause) {
|
|
119
|
+
return lockError('LOCK_UNAVAILABLE', `SynaBun could not use its rules lock (${path}): ${cause?.message || cause}. Nothing was changed.`, cause);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function enter() {
|
|
123
|
+
if (held) throw lockError('LOCK_UNAVAILABLE', `The rules lock (${path}) is already held by this installer.`);
|
|
124
|
+
for (let attempt = 1; attempt <= 2; attempt++) {
|
|
125
|
+
let handle;
|
|
126
|
+
try {
|
|
127
|
+
// Deleted or replaced since this connection was opened: it is on a file nobody else locks. It holds no
|
|
128
|
+
// transaction here, so it is simply dropped and a new one is opened on the file that is there now.
|
|
129
|
+
if (db && identity() !== file) close();
|
|
130
|
+
handle = open();
|
|
131
|
+
} catch (cause) {
|
|
132
|
+
close();
|
|
133
|
+
if (cause?.moved) continue; // replaced under the open itself: once more, then BUSY
|
|
134
|
+
throw unavailable(cause);
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
handle.exec('BEGIN IMMEDIATE');
|
|
138
|
+
} catch (cause) {
|
|
139
|
+
if (isBusy(cause)) throw lockError('BUSY', 'Another SynaBun process is working on the rules right now, so nothing was changed. Try again in a moment.', cause);
|
|
140
|
+
close(); // not a lock this connection can use: the next call opens it afresh
|
|
141
|
+
throw unavailable(cause);
|
|
142
|
+
}
|
|
143
|
+
let same = false;
|
|
144
|
+
try {
|
|
145
|
+
if (afterBegin) afterBegin(path);
|
|
146
|
+
// Replaced between the look above and the lock: what was just locked is the old file. Give it back.
|
|
147
|
+
same = identity() === file;
|
|
148
|
+
} catch (cause) {
|
|
149
|
+
try { handle.exec('ROLLBACK'); } catch { /* closed below either way */ }
|
|
150
|
+
close();
|
|
151
|
+
throw unavailable(cause);
|
|
152
|
+
}
|
|
153
|
+
if (same) {
|
|
154
|
+
held = true;
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
try { handle.exec('ROLLBACK'); } catch { /* closed below either way */ }
|
|
158
|
+
close();
|
|
159
|
+
}
|
|
160
|
+
throw lockError('BUSY', 'The rules lock file was replaced while SynaBun was taking it, so nothing was changed. Try again in a moment.');
|
|
161
|
+
}
|
|
162
|
+
function leave() {
|
|
163
|
+
if (!held) return;
|
|
164
|
+
held = false;
|
|
165
|
+
// A rollback that fails leaves the connection in doubt: closing it gives the lock back for certain.
|
|
166
|
+
try { db.exec('ROLLBACK'); } catch { close(); }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return { path, timeoutMs: wait, enter, leave, close };
|
|
170
|
+
}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — managed rule blocks (pure text, no fs)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// SynaBun's rules sit in a user's instruction file between two markers:
|
|
6
|
+
//
|
|
7
|
+
// <!-- synabun:rules:begin v=2.0.0 host=codex sha=9f2c1a7b3e4d -->
|
|
8
|
+
// <!-- Managed by SynaBun. Edit this block and SynaBun stops updating it; … -->
|
|
9
|
+
// ...rendered rules...
|
|
10
|
+
// <!-- synabun:rules:end -->
|
|
11
|
+
//
|
|
12
|
+
// The sha covers everything between the begin and end lines, so a block says
|
|
13
|
+
// by itself whether someone edited it. Every function here leaves each byte
|
|
14
|
+
// outside the markers alone, keeps the file's line endings and BOM, and
|
|
15
|
+
// refuses to guess when the markers are damaged.
|
|
16
|
+
//
|
|
17
|
+
// Fenced code (``` and ~~~) is somebody quoting text, never the live thing: a
|
|
18
|
+
// marker or an old ruleset inside a fence is not seen by anything here.
|
|
19
|
+
|
|
20
|
+
import { createHash } from 'node:crypto';
|
|
21
|
+
import { normalise, sha12 } from './normalise.js';
|
|
22
|
+
|
|
23
|
+
export const MANAGED_NOTE = '<!-- Managed by SynaBun. Edit this block and SynaBun stops updating it; remove it in SynaBun Settings > Setup. -->';
|
|
24
|
+
export const END_MARKER = '<!-- synabun:rules:end -->';
|
|
25
|
+
export const LEGACY_HEADINGS = Object.freeze(['## Memory Ruleset', '## Memory: SynaBun MCP', '## Persistent Memory']);
|
|
26
|
+
|
|
27
|
+
const BEGIN_RE = /^<!-- synabun:rules:begin v=(\S+) host=([a-z0-9-]+) sha=([0-9a-f]{12}) -->$/;
|
|
28
|
+
const BEGIN_HINT = 'synabun:rules:begin';
|
|
29
|
+
const END_HINT = 'synabun:rules:end';
|
|
30
|
+
const BOM = '';
|
|
31
|
+
|
|
32
|
+
export class ManagedTextConflict extends Error {
|
|
33
|
+
constructor(code, message) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.name = 'ManagedTextConflict';
|
|
36
|
+
this.code = code;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function hasBom(text) {
|
|
41
|
+
return String(text ?? '').startsWith(BOM);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** The file's own line ending: CRLF when most of its lines end that way, LF otherwise. */
|
|
45
|
+
export function detectEol(text) {
|
|
46
|
+
const source = String(text ?? '');
|
|
47
|
+
const crlf = source.split('\r\n').length - 1;
|
|
48
|
+
const lf = source.split('\n').length - 1 - crlf;
|
|
49
|
+
return crlf > lf ? '\r\n' : '\n';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function toEol(text, eol) {
|
|
53
|
+
const lf = String(text).replace(/\r\n/g, '\n');
|
|
54
|
+
return eol === '\n' ? lf : lf.replace(/\n/g, eol);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** [{start, end, eolEnd, text}]: `end` stops before the line break, `eolEnd` after it. */
|
|
58
|
+
function scanLines(text) {
|
|
59
|
+
const lines = [];
|
|
60
|
+
let pos = hasBom(text) ? 1 : 0;
|
|
61
|
+
while (pos < text.length) {
|
|
62
|
+
const lf = text.indexOf('\n', pos);
|
|
63
|
+
if (lf === -1) {
|
|
64
|
+
lines.push({ start: pos, end: text.length, eolEnd: text.length, text: text.slice(pos) });
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
const end = lf > pos && text[lf - 1] === '\r' ? lf - 1 : lf;
|
|
68
|
+
lines.push({ start: pos, end, eolEnd: lf + 1, text: text.slice(pos, end) });
|
|
69
|
+
pos = lf + 1;
|
|
70
|
+
}
|
|
71
|
+
return lines;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function endsWithEol(text) {
|
|
75
|
+
return text.endsWith('\n');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function stripOneEol(text) {
|
|
79
|
+
if (text.endsWith('\r\n')) return text.slice(0, -2);
|
|
80
|
+
if (text.endsWith('\n')) return text.slice(0, -1);
|
|
81
|
+
return text;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function startsWithEol(text) {
|
|
85
|
+
return text.startsWith('\r\n') || text.startsWith('\n');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function dropLeadingEol(text) {
|
|
89
|
+
if (text.startsWith('\r\n')) return text.slice(2);
|
|
90
|
+
if (text.startsWith('\n')) return text.slice(1);
|
|
91
|
+
return text;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** wrap(text, {version, host}) → the stamped block, LF line endings, no trailing newline. */
|
|
95
|
+
export function wrap(text, { version, host } = {}) {
|
|
96
|
+
if (!version || !host) throw new Error('wrap needs a version and a host');
|
|
97
|
+
const body = `${MANAGED_NOTE}\n${normalise(text)}`;
|
|
98
|
+
return `<!-- synabun:rules:begin v=${version} host=${host} sha=${sha12(body)} -->\n${body}\n${END_MARKER}`;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const FENCE_OPEN_RE = /^[ \t]*(?:>[ \t]*)*(`{3,}|~{3,})(.*)$/;
|
|
102
|
+
|
|
103
|
+
/** {char, size} when the line opens a fenced code block, else null. Read generously: quoted text is left alone. */
|
|
104
|
+
function fenceOpening(line) {
|
|
105
|
+
const match = line.match(FENCE_OPEN_RE);
|
|
106
|
+
if (!match) return null;
|
|
107
|
+
// A backtick fence cannot carry a backtick in its info string: that is inline code.
|
|
108
|
+
if (match[1][0] === '`' && match[2].includes('`')) return null;
|
|
109
|
+
return { char: match[1][0], size: match[1].length };
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function fenceCloses(line, fence) {
|
|
113
|
+
const match = line.match(FENCE_OPEN_RE);
|
|
114
|
+
return !!match && match[1][0] === fence.char && match[1].length >= fence.size && match[2].trim() === '';
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* One pass over the file: the managed blocks, the marker conflict if any, and
|
|
119
|
+
* which lines sit inside a fenced code block. A block that is open is opaque
|
|
120
|
+
* (its own body may hold fences); a fence that is open hides every marker in
|
|
121
|
+
* it, and an unclosed fence runs to the end of the file as it does in Markdown.
|
|
122
|
+
*/
|
|
123
|
+
function analyse(text) {
|
|
124
|
+
const lines = scanLines(text);
|
|
125
|
+
const fenced = new Array(lines.length).fill(false);
|
|
126
|
+
const blocks = [];
|
|
127
|
+
let conflict = null;
|
|
128
|
+
let open = null;
|
|
129
|
+
let fence = null;
|
|
130
|
+
const flag = (code, message) => { if (!conflict) conflict = { code, message }; };
|
|
131
|
+
|
|
132
|
+
for (let i = 0; i < lines.length; i++) {
|
|
133
|
+
const line = lines[i].text.replace(/\s+$/, '');
|
|
134
|
+
if (!open) {
|
|
135
|
+
if (fence) {
|
|
136
|
+
fenced[i] = true;
|
|
137
|
+
if (fenceCloses(line, fence)) fence = null;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
fence = fenceOpening(line);
|
|
141
|
+
if (fence) { fenced[i] = true; continue; }
|
|
142
|
+
}
|
|
143
|
+
if (line.includes(BEGIN_HINT)) {
|
|
144
|
+
const match = line.match(BEGIN_RE);
|
|
145
|
+
if (!match) { flag('malformed-begin', 'A SynaBun begin marker is damaged'); continue; }
|
|
146
|
+
if (open) flag('begin-without-end', 'A SynaBun begin marker has no end marker');
|
|
147
|
+
open = { index: i, version: match[1], host: match[2], sha: match[3] };
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
if (line.includes(END_HINT)) {
|
|
151
|
+
if (line !== END_MARKER) { flag('malformed-end', 'A SynaBun end marker is damaged'); continue; }
|
|
152
|
+
if (!open) { flag('end-without-begin', 'A SynaBun end marker has no begin marker'); continue; }
|
|
153
|
+
const first = lines[open.index];
|
|
154
|
+
blocks.push({
|
|
155
|
+
start: first.start,
|
|
156
|
+
end: lines[i].end,
|
|
157
|
+
eolEnd: lines[i].eolEnd,
|
|
158
|
+
version: open.version,
|
|
159
|
+
host: open.host,
|
|
160
|
+
sha: open.sha,
|
|
161
|
+
body: lines.slice(open.index + 1, i).map((entry) => entry.text).join('\n'),
|
|
162
|
+
text: text.slice(first.start, lines[i].end),
|
|
163
|
+
});
|
|
164
|
+
open = null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (open) flag('begin-without-end', 'A SynaBun begin marker has no end marker');
|
|
168
|
+
if (blocks.length > 1) flag('duplicate-blocks', 'More than one SynaBun rules block');
|
|
169
|
+
return { lines, fenced, blocks, conflict };
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* findBlocks(fileText) → {blocks, conflict}.
|
|
174
|
+
* A block is {start, end, eolEnd, version, host, sha, body, text}; `text` runs
|
|
175
|
+
* from the begin marker to the end marker. `conflict` is null, or {code,
|
|
176
|
+
* message} when the markers cannot be trusted: two blocks, a begin without an
|
|
177
|
+
* end, an end without a begin, or a begin line that does not parse. Markers
|
|
178
|
+
* inside a fenced code block are quoted text and are not read at all.
|
|
179
|
+
*/
|
|
180
|
+
export function findBlocks(fileText) {
|
|
181
|
+
const { blocks, conflict } = analyse(String(fileText ?? ''));
|
|
182
|
+
return { blocks, conflict };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function singleBlock(fileText) {
|
|
186
|
+
const { blocks, conflict } = findBlocks(fileText);
|
|
187
|
+
if (conflict) throw new ManagedTextConflict(conflict.code, conflict.message);
|
|
188
|
+
return blocks[0] || null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** True while the body still hashes to its own stamp. Takes a block from findBlocks or a block's text. */
|
|
192
|
+
export function isPristine(block) {
|
|
193
|
+
let parsed = block;
|
|
194
|
+
if (typeof block === 'string') {
|
|
195
|
+
const found = findBlocks(block);
|
|
196
|
+
if (found.conflict || found.blocks.length !== 1) return false;
|
|
197
|
+
parsed = found.blocks[0];
|
|
198
|
+
}
|
|
199
|
+
if (!parsed || typeof parsed.body !== 'string' || !parsed.sha) return false;
|
|
200
|
+
return sha12(parsed.body) === parsed.sha;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Replace the existing block in place, else append it with one blank line
|
|
205
|
+
* before it. Throws ManagedTextConflict when the markers are damaged.
|
|
206
|
+
*/
|
|
207
|
+
export function upsertBlock(fileText, block) {
|
|
208
|
+
const text = String(fileText ?? '');
|
|
209
|
+
const existing = singleBlock(text);
|
|
210
|
+
const eol = detectEol(text);
|
|
211
|
+
const inserted = toEol(block, eol);
|
|
212
|
+
if (existing) return text.slice(0, existing.start) + inserted + text.slice(existing.end);
|
|
213
|
+
const content = hasBom(text) ? text.slice(1) : text;
|
|
214
|
+
if (content === '') return text + inserted + eol;
|
|
215
|
+
// A file that ends without a line break keeps ending without one, so the
|
|
216
|
+
// removal below can give back exactly the bytes it started from.
|
|
217
|
+
if (endsWithEol(text)) return text + eol + inserted + eol;
|
|
218
|
+
return text + eol + eol + inserted;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Remove the block and the blank line the insert added. Unchanged when there is no block. */
|
|
222
|
+
export function removeBlock(fileText) {
|
|
223
|
+
const text = String(fileText ?? '');
|
|
224
|
+
const existing = singleBlock(text);
|
|
225
|
+
if (!existing) return text;
|
|
226
|
+
let before = text.slice(0, existing.start);
|
|
227
|
+
const after = text.slice(existing.eolEnd);
|
|
228
|
+
const blockHadEol = existing.eolEnd > existing.end;
|
|
229
|
+
const floor = hasBom(before) ? 1 : 0;
|
|
230
|
+
const blankBefore = () => before.length > floor && endsWithEol(before) && (stripOneEol(before).length === floor || endsWithEol(stripOneEol(before)));
|
|
231
|
+
if (blockHadEol || after.length > 0) {
|
|
232
|
+
if (blankBefore()) before = stripOneEol(before);
|
|
233
|
+
} else if (blankBefore()) {
|
|
234
|
+
before = stripOneEol(stripOneEol(before));
|
|
235
|
+
}
|
|
236
|
+
return before + after;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** Put `block` over the characters [start, end) in the file's own line endings. */
|
|
240
|
+
export function replaceRange(fileText, start, end, block) {
|
|
241
|
+
const text = String(fileText ?? '');
|
|
242
|
+
return text.slice(0, start) + toEol(block, detectEol(text)) + text.slice(end);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** Cut the lines [start, end) and one of the blank lines that surrounded them. */
|
|
246
|
+
export function removeRange(fileText, start, end) {
|
|
247
|
+
const text = String(fileText ?? '');
|
|
248
|
+
let before = text.slice(0, start);
|
|
249
|
+
let after = dropLeadingEol(text.slice(end));
|
|
250
|
+
const floor = hasBom(before) ? 1 : 0;
|
|
251
|
+
const blankBefore = before.length === floor || (endsWithEol(before) && (stripOneEol(before).length === floor || endsWithEol(stripOneEol(before))));
|
|
252
|
+
if (blankBefore && startsWithEol(after)) after = dropLeadingEol(after);
|
|
253
|
+
else if (after === '' && before.length > floor && blankBefore) before = stripOneEol(before);
|
|
254
|
+
return before + after;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
function isLegacyHeading(line) {
|
|
258
|
+
return LEGACY_HEADINGS.find((heading) => line === heading || line.startsWith(`${heading} `) || line.startsWith(`${heading}:`)) || null;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* findLegacy(fileText, legacyHashes) → [{start, end, kind, sha?, host?, hosts?, heading?}]
|
|
263
|
+
* exact = a run of lines whose normalised hash and line count match a ruleset
|
|
264
|
+
* SynaBun served before the managed blocks existed; `hosts` names
|
|
265
|
+
* every tool that text was served for (`host` is the first of them)
|
|
266
|
+
* heading = one of the old ruleset headings with no exact match around it
|
|
267
|
+
* `start` and `end` are character offsets; `end` stops before the last line's
|
|
268
|
+
* line break. Text inside a managed block or a fenced code block is never
|
|
269
|
+
* reported: the first is SynaBun's own, the second is someone quoting it.
|
|
270
|
+
*/
|
|
271
|
+
export function findLegacy(fileText, legacyHashes) {
|
|
272
|
+
const text = String(fileText ?? '');
|
|
273
|
+
const entries = Array.isArray(legacyHashes) ? legacyHashes : (legacyHashes?.entries || []);
|
|
274
|
+
const { lines, fenced, blocks: managed } = analyse(text);
|
|
275
|
+
const trimmed = lines.map((line) => line.text.replace(/\s+$/, ''));
|
|
276
|
+
const inManaged = (line) => managed.some((block) => line.start >= block.start && line.start < block.eolEnd);
|
|
277
|
+
|
|
278
|
+
const byFirstLine = new Map();
|
|
279
|
+
const hostsOf = new Map();
|
|
280
|
+
for (const entry of entries) {
|
|
281
|
+
if (!entry?.sha || !entry.firstLine || !(entry.lines > 0)) continue;
|
|
282
|
+
if (!byFirstLine.has(entry.firstLine)) byFirstLine.set(entry.firstLine, []);
|
|
283
|
+
byFirstLine.get(entry.firstLine).push(entry);
|
|
284
|
+
const key = `${entry.sha}:${entry.lines}`;
|
|
285
|
+
if (!hostsOf.has(key)) hostsOf.set(key, []);
|
|
286
|
+
if (entry.host && !hostsOf.get(key).includes(entry.host)) hostsOf.get(key).push(entry.host);
|
|
287
|
+
}
|
|
288
|
+
for (const list of byFirstLine.values()) list.sort((a, b) => b.lines - a.lines);
|
|
289
|
+
|
|
290
|
+
const spans = [];
|
|
291
|
+
for (let i = 0; i < lines.length; i++) {
|
|
292
|
+
if (fenced[i] || inManaged(lines[i])) continue;
|
|
293
|
+
let matched = null;
|
|
294
|
+
for (const entry of byFirstLine.get(trimmed[i]) || []) {
|
|
295
|
+
if (i + entry.lines > lines.length) continue;
|
|
296
|
+
// A copy that runs into a code fence or a managed block is not a plain pasted copy.
|
|
297
|
+
if (fenced[i + entry.lines - 1] || inManaged(lines[i + entry.lines - 1])) continue;
|
|
298
|
+
const candidate = trimmed.slice(i, i + entry.lines).join('\n');
|
|
299
|
+
if (createHash('sha256').update(candidate, 'utf8').digest('hex').slice(0, 12) !== entry.sha) continue;
|
|
300
|
+
matched = entry;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
if (matched) {
|
|
304
|
+
const last = lines[i + matched.lines - 1];
|
|
305
|
+
const hosts = hostsOf.get(`${matched.sha}:${matched.lines}`) || [];
|
|
306
|
+
spans.push({ start: lines[i].start, end: last.end, kind: 'exact', sha: matched.sha, host: matched.host || null, hosts });
|
|
307
|
+
i += matched.lines - 1;
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
const heading = isLegacyHeading(trimmed[i]);
|
|
311
|
+
if (heading) spans.push({ start: lines[i].start, end: lines[i].end, kind: 'heading', heading });
|
|
312
|
+
}
|
|
313
|
+
return spans;
|
|
314
|
+
}
|