synabun 1.3.0 → 2.0.0-beta
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 +197 -662
- package/LICENSE-COMMERCIAL.md +33 -0
- package/NOTICE +17 -0
- package/README.md +175 -853
- package/THIRD-PARTY-LICENSES.md +131 -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/browser-v2.md +109 -0
- package/docs/hook-integrity.md +89 -0
- package/docs/judgments.md +182 -0
- package/docs/style-guide.md +246 -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/lib/claude-hooks.js +84 -0
- package/lib/claude-usage-audit.js +141 -0
- package/lib/client-config-repair.js +144 -0
- package/lib/data-home-migration.js +498 -0
- package/lib/first-launch-protection.js +240 -0
- package/lib/paths.d.ts +21 -0
- package/lib/paths.js +103 -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 +6983 -0
- package/neural-interface/i18n/pt-BR.json +6987 -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 +579 -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 +50 -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-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 +3296 -0
- package/neural-interface/lib/claude-bypass-policy.js +99 -0
- package/neural-interface/lib/claude-history.js +429 -0
- package/neural-interface/lib/claude-model-catalog.js +483 -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 +650 -0
- package/neural-interface/lib/native-loop-goal.js +33 -0
- package/neural-interface/lib/native-loop-providers.js +1016 -0
- package/neural-interface/lib/native-loop-runtime.js +747 -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 +227 -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 +305 -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 +4682 -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/logo-synabun.png +0 -0
- package/neural-interface/public/logoHD.png +0 -0
- package/neural-interface/public/mcp.svg +4 -0
- package/neural-interface/public/offline.html +335 -299
- package/neural-interface/public/onboarding.html +692 -155
- 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 +311 -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 +589 -0
- package/neural-interface/public/shared/assistant/asst-render.js +3296 -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 +1684 -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/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 +107 -12
- 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/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-search.js +463 -0
- package/neural-interface/public/shared/settings/settings-shell.js +570 -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 +148 -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 +47 -0
- package/neural-interface/public/shared/styleguide/sg-kit.js +281 -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 +229 -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 +124 -0
- package/neural-interface/public/shared/styles.css +7883 -1155
- 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-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-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 +4 -4
- package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
- package/neural-interface/public/shared/ui-menubar.js +89 -4
- 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 +5793 -2190
- 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 +7877 -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 +8 -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 +556 -521
- package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
- package/neural-interface/public/variant/3d/main.js +516 -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 +37 -23
- 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 +33948 -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 +119 -53
- package/postinstall.js +125 -26
- package/preuninstall.js +187 -0
- package/scripts/audit-claude-hook-usage.mjs +12 -0
- package/scripts/audit-memory-duplicates.mjs +44 -0
- package/scripts/measure-claude-hook-overhead.mjs +77 -0
- package/scripts/recover-user-config.mjs +254 -0
- package/scripts/restore-data-home-from-backup.mjs +239 -0
- package/setup.js +804 -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,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Facebook region / currency / language helpers.
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth for region bucketing, URL normalization, and seed-queue
|
|
5
|
+
* parsing — imported by BOTH browser-observe.ts (the live joined-groups extractor)
|
|
6
|
+
* and fb-groups.ts (the structured group directory tool) so the two stay in lockstep.
|
|
7
|
+
* Previously these lived inline in browser-observe.ts; moved here to avoid duplication.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** Region bucket inferred from a group's posting currency. */
|
|
11
|
+
export const REGION_BY_CURRENCY: Record<string, string> = {
|
|
12
|
+
GBP: 'UK', USD: 'US', EUR: 'EU', BRL: 'Brazil', TRY: 'Turkey', AUD: 'Australia', CAD: 'Canada',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/** Region bucket inferred from a group's language when currency is unknown. */
|
|
16
|
+
export const REGION_BY_LANG: Record<string, string> = {
|
|
17
|
+
en: 'US/UK', pt: 'Brazil', fr: 'EU', de: 'EU', es: 'LatAm', it: 'EU', nl: 'EU', pl: 'EU', tr: 'Turkey',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/** Coarse country for single-country currencies (EUR omitted — multi-country). */
|
|
21
|
+
export const COUNTRY_BY_CURRENCY: Record<string, string> = {
|
|
22
|
+
GBP: 'United Kingdom', USD: 'United States', BRL: 'Brazil', TRY: 'Turkey', AUD: 'Australia', CAD: 'Canada',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// Spain vs LatAm: both Spanish-speaking but different supported deal currency (Spain = EUR/EU,
|
|
26
|
+
// LatAm = USD — the deal links have no local LatAm currency, so LatAm posts the USD link).
|
|
27
|
+
// Used by classifyGroupName/resolveClassification to split the broad 'es' bucket correctly.
|
|
28
|
+
export const SPAIN_RE = /\b(espa[ñn]a|madrid|barcelona|valencia|sevilla|zaragoza|bilbao|m[áa]laga|ib[ée]rica?)\b/i;
|
|
29
|
+
export const LATAM_RE = /\b(m[ée]xico|mexican[oa]?|argentin[oa]?|chilen[oa]?|chile|peruan[oa]?|per[uú]|colombian[oa]?|colombia|venezolan[oa]?|venezuela|uruguay|paraguay|bolivia|ecuador|guatemala|hondure[ñn]o|nicaragua|panam[áa]|costa rica|rep[uú]blica dominicana|latinoam[ée]rica|latino\s?am[ée]rica|sudam[ée]rica|latin[oa]s?|latam|hispano)\b/i;
|
|
30
|
+
|
|
31
|
+
// Country/region-name fallback when a group is not in the seed-queue. Order matters: most
|
|
32
|
+
// specific first. Matched against the group name (and slug-with-spaces). Country-accurate —
|
|
33
|
+
// language-based detection lives in classifyGroupName below. LatAm sits before US so
|
|
34
|
+
// "América Latina" is not swallowed by the US "america" alias.
|
|
35
|
+
export const NAME_REGION: Array<[RegExp, string]> = [
|
|
36
|
+
[/\b(uk|u\.k\.|britain|british|england|london|scotland|scottish|wales|welsh|ireland|irish)\b/i, 'UK'],
|
|
37
|
+
[LATAM_RE, 'LatAm'],
|
|
38
|
+
[/\b(usa|u\.s\.a|united states|american?)\b/i, 'US'],
|
|
39
|
+
[/\b(brasil|brazil|brasileir[oa]?)\b/i, 'Brazil'],
|
|
40
|
+
[/\b(türkiye|turkiye|turkey|türk|turk)\b/i, 'Turkey'],
|
|
41
|
+
[/\b(australia|australian|aussie|nz|new zealand|kiwi)\b/i, 'Australia'],
|
|
42
|
+
[/\b(canada|canadian)\b/i, 'Canada'],
|
|
43
|
+
[/\b(france|français|francais|paris)\b/i, 'EU'],
|
|
44
|
+
[/\b(deutschland|german|deutsch)\b/i, 'EU'],
|
|
45
|
+
[/\b(españa|espana|spanish|español|espanol)\b/i, 'EU'],
|
|
46
|
+
[/\b(italia|italy|italian)\b/i, 'EU'],
|
|
47
|
+
[/\b(polska|poland|polish)\b/i, 'EU'],
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
// Inverse maps for classification: a region's supported posting currency + default language.
|
|
51
|
+
const REGION_TO_CURRENCY: Record<string, string> = {
|
|
52
|
+
UK: 'GBP', US: 'USD', EU: 'EUR', Brazil: 'BRL', Turkey: 'TRY', Australia: 'AUD', Canada: 'CAD', LatAm: 'USD',
|
|
53
|
+
};
|
|
54
|
+
const REGION_TO_LANG: Record<string, string> = {
|
|
55
|
+
UK: 'en', US: 'en', Brazil: 'pt', Turkey: 'tr', Australia: 'en', Canada: 'en', LatAm: 'es', // EU omitted: ambiguous
|
|
56
|
+
};
|
|
57
|
+
// Posting currency a language maps to (the SUPPORTED deal-link currency, not the
|
|
58
|
+
// local currency — Polish/Italian post the EUR link). 'es' = USD: Spanish skews LatAm (USD); Spain
|
|
59
|
+
// (EUR) is split back out by name in classifyGroupName. 'en' stays null: needs a country/seed signal.
|
|
60
|
+
const CURRENCY_BY_LANG: Record<string, string> = {
|
|
61
|
+
pt: 'BRL', tr: 'TRY', de: 'EUR', fr: 'EUR', es: 'USD', it: 'EUR', pl: 'EUR', nl: 'EUR',
|
|
62
|
+
};
|
|
63
|
+
// Distinctive gaming/deals vocabulary per language, matched as whole words against the lowercased
|
|
64
|
+
// name+slug. High-precision to avoid English false positives ("games"/"deals" are NOT tokens).
|
|
65
|
+
const LANG_TOKENS: Array<[string, RegExp]> = [
|
|
66
|
+
// PT-distinctive only: "barato(s)"/"gratis" are shared with ES, so excluded here (ES keeps them)
|
|
67
|
+
// to avoid Spanish groups ("Juegos Baratos") being mis-tagged Brazilian. "grátis" stays accented.
|
|
68
|
+
['pt', /\b(jogos?|vendas?|trocas?|grátis|promoç(ão|ões)|brasil|brasileir[oa]s?|apaixonados|usados?|portugu[êe]s|classificad[oa]s?|pe[çc]as|barganha|desapego|negócios|divulga\w*|clube|conex[ãa]o|colecionador\w*|compras?|contas?)\b/i],
|
|
69
|
+
['tr', /\b(oyun(lar|cu)?|al[ıi]m|sat[ıi][mş]|takas|ucuz|t[üu]rk(iye)?|indirim|hesap|bilgisayar|ekipman|donan[ıi]m|s[ıi]f[ıi]r)/i],
|
|
70
|
+
['de', /\b(spiele?|g[üu]nstig|kaufen|verkaufen|verkauf|tauschen|tausch|b[öo]rse|ankauf|gebraucht|deutsch(land)?|schn[äa]ppchen|angebote?)\b/i],
|
|
71
|
+
['fr', /\b(jeux|pas cher|vente|achat|gratuit|fran[çc]ais)\b/i],
|
|
72
|
+
['es', /\b(juegos?|barat[oa]s?|ofertas?|venta|compra|gratis|consolas?|espa[ñn]a|espa[ñn]ol)\b/i],
|
|
73
|
+
['pl', /\b(gry|gier|tanie|sprzedam|kupi[ęe]|polska|okazje)\b/i],
|
|
74
|
+
['it', /\b(videogioch\w*|giochi|economici|vendita|mercatino|italia(no)?)\b/i],
|
|
75
|
+
['nl', /\b(spellen|goedkoop|verkopen|nederland)\b/i],
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Conservative name-based classifier → { region, lang, currency } where currency is a SUPPORTED
|
|
80
|
+
* deal-link currency. Language tokens win first (strong signal), then country-name aliases; returns
|
|
81
|
+
* Unknown/null when there is no confident signal (those are left for the LLM curation pass).
|
|
82
|
+
*/
|
|
83
|
+
export function classifyGroupName(name: string, slug = ''): { region: string; lang: string | null; currency: string | null } {
|
|
84
|
+
const hay = `${name || ''} ${(slug || '').replace(/[-_]+/g, ' ')}`;
|
|
85
|
+
for (const [lang, re] of LANG_TOKENS) {
|
|
86
|
+
if (re.test(hay)) {
|
|
87
|
+
// Spanish splits by country: Spain -> EUR/EU, everywhere else (LatAm) -> USD. USD is shared
|
|
88
|
+
// with the US bucket, so es must resolve its region by name, never via REGION_BY_CURRENCY[USD].
|
|
89
|
+
if (lang === 'es') {
|
|
90
|
+
const isSpain = SPAIN_RE.test(hay) && !LATAM_RE.test(hay);
|
|
91
|
+
return isSpain
|
|
92
|
+
? { region: 'EU', lang: 'es', currency: 'EUR' }
|
|
93
|
+
: { region: 'LatAm', lang: 'es', currency: 'USD' };
|
|
94
|
+
}
|
|
95
|
+
const currency = CURRENCY_BY_LANG[lang] || null;
|
|
96
|
+
const region = (currency && REGION_BY_CURRENCY[currency]) || REGION_BY_LANG[lang] || 'Unknown';
|
|
97
|
+
return { region, lang, currency };
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const region = inferRegionFromName(hay);
|
|
101
|
+
if (region !== 'Unknown') {
|
|
102
|
+
return { region, lang: REGION_TO_LANG[region] || null, currency: REGION_TO_CURRENCY[region] || null };
|
|
103
|
+
}
|
|
104
|
+
return { region: 'Unknown', lang: null, currency: null };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Normalize a scraped group name: strip leading/trailing separators (incl. the trailing "(" left by
|
|
108
|
+
// "Name (12k members)") and reject pure label words ("URL", "Group URL", "Link") that the migration
|
|
109
|
+
// captured from "URL: https://..." lines.
|
|
110
|
+
const NAME_LABELS = new Set(['url', 'group url', 'link', 'status', 'name', 'group', 'grupo']);
|
|
111
|
+
export function cleanName(raw?: string | null): string {
|
|
112
|
+
const n = (raw || '').replace(/[\s(|\-—–:•·]+$/, '').replace(/^[\s)|\-—–:•·]+/, '').trim();
|
|
113
|
+
if (!n || NAME_LABELS.has(n.toLowerCase())) return '';
|
|
114
|
+
return n.slice(0, 120);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function inferRegionFromName(name: string): string {
|
|
118
|
+
for (const [re, region] of NAME_REGION) if (re.test(name)) return region;
|
|
119
|
+
return 'Unknown';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Region bucket from a seed-queue lang/currency pair. Currency wins, then language. USD is shared
|
|
124
|
+
* by US + LatAm, so a Spanish-language USD seed is LatAm. Falls back to the language's posting
|
|
125
|
+
* currency when no currency is given (so lang=pt with no currency still lands in Brazil, not
|
|
126
|
+
* Unknown). The non-canonical 'US/UK' english placeholder is never surfaced as a real bucket.
|
|
127
|
+
*/
|
|
128
|
+
export function regionForSeed(lang?: string | null, currency?: string | null): string {
|
|
129
|
+
const ccy = (currency || '').toUpperCase();
|
|
130
|
+
const lg = (lang || '').toLowerCase();
|
|
131
|
+
if (ccy && REGION_BY_CURRENCY[ccy]) {
|
|
132
|
+
return ccy === 'USD' && lg === 'es' ? 'LatAm' : REGION_BY_CURRENCY[ccy];
|
|
133
|
+
}
|
|
134
|
+
if (lg) {
|
|
135
|
+
const byLang = REGION_BY_LANG[lg];
|
|
136
|
+
if (byLang && byLang !== 'US/UK') return byLang;
|
|
137
|
+
const byCur = CURRENCY_BY_LANG[lg];
|
|
138
|
+
if (byCur && REGION_BY_CURRENCY[byCur]) {
|
|
139
|
+
return byCur === 'USD' && lg === 'es' ? 'LatAm' : REGION_BY_CURRENCY[byCur];
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return 'Unknown';
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The canonical region buckets the directory uses (anything else collapses to Unknown). */
|
|
146
|
+
export const CANONICAL_REGIONS = new Set(['UK', 'US', 'EU', 'Brazil', 'Turkey', 'Australia', 'Canada', 'LatAm']);
|
|
147
|
+
|
|
148
|
+
function nonUnknown(r: string): string | null { return r === 'Unknown' ? null : r; }
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Idempotent, all-signals reclassifier. Given whatever a row already has (name/url + any stored
|
|
152
|
+
* region/lang/currency), return the best { region, lang, currency, country }. The recategorize
|
|
153
|
+
* backfill and the import paths route through this so every entry point agrees.
|
|
154
|
+
*
|
|
155
|
+
* Spanish is resolved first (LatAm=USD default, Spain=EUR) so a stale es->EUR/EU row is corrected
|
|
156
|
+
* rather than preserved. Otherwise a confident name classification wins, then language, then
|
|
157
|
+
* currency, then an already-canonical stored region, else Unknown.
|
|
158
|
+
*/
|
|
159
|
+
export function resolveClassification(input: {
|
|
160
|
+
name?: string | null; url?: string | null; region?: string | null; lang?: string | null; currency?: string | null;
|
|
161
|
+
}): { region: string; lang: string | null; currency: string | null; country: string | null } {
|
|
162
|
+
const slug = (input.url || '').match(/\/groups\/([^/]+)/)?.[1] || '';
|
|
163
|
+
const hay = `${input.name || ''} ${slug.replace(/[-_]+/g, ' ')}`;
|
|
164
|
+
const cls = classifyGroupName(input.name || '', slug);
|
|
165
|
+
const storedLang = (input.lang || '').toLowerCase() || null;
|
|
166
|
+
|
|
167
|
+
// Spanish: decide LatAm (USD) vs Spain (EUR) up front, overriding any stale EUR/EU classification.
|
|
168
|
+
if (cls.lang === 'es' || storedLang === 'es') {
|
|
169
|
+
const isSpain = SPAIN_RE.test(hay) && !LATAM_RE.test(hay);
|
|
170
|
+
return isSpain
|
|
171
|
+
? { region: 'EU', lang: 'es', currency: 'EUR', country: 'Spain' }
|
|
172
|
+
: { region: 'LatAm', lang: 'es', currency: 'USD', country: 'LatAm' };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const lang = storedLang || cls.lang || null;
|
|
176
|
+
let currency = (input.currency || '').toUpperCase();
|
|
177
|
+
if (currency && !REGION_BY_CURRENCY[currency]) currency = ''; // drop unsupported currency
|
|
178
|
+
currency = currency || cls.currency || (lang ? CURRENCY_BY_LANG[lang] || '' : '');
|
|
179
|
+
|
|
180
|
+
const stored = input.region && CANONICAL_REGIONS.has(input.region) ? input.region : null;
|
|
181
|
+
let region =
|
|
182
|
+
nonUnknown(cls.region)
|
|
183
|
+
|| (lang ? nonUnknown(regionForSeed(lang, currency || null)) : null)
|
|
184
|
+
|| (currency ? nonUnknown(regionForSeed(null, currency)) : null)
|
|
185
|
+
|| stored
|
|
186
|
+
|| 'Unknown';
|
|
187
|
+
if (!CANONICAL_REGIONS.has(region)) region = 'Unknown';
|
|
188
|
+
if (!currency && region !== 'Unknown') currency = REGION_TO_CURRENCY[region] || '';
|
|
189
|
+
|
|
190
|
+
const country = currency ? COUNTRY_BY_CURRENCY[currency] || null : null;
|
|
191
|
+
return { region, lang: lang || null, currency: currency || null, country };
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Canonical Facebook group URL: origin + /groups/<slug>/ (single trailing slash). */
|
|
195
|
+
export function normUrl(u: string): string {
|
|
196
|
+
try {
|
|
197
|
+
const x = new URL(u.trim());
|
|
198
|
+
return x.origin + x.pathname.replace(/\/+$/, '') + '/';
|
|
199
|
+
} catch {
|
|
200
|
+
return u.trim();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Parse a seed-queue memory body. [QUEUE] / ledger lines are pipe-delimited
|
|
206
|
+
* "url | lang | currency | ..." — extra trailing columns are ignored. Returns a
|
|
207
|
+
* map keyed by the normalized URL so callers can reconcile against live extracts.
|
|
208
|
+
*/
|
|
209
|
+
export function parseSeedQueue(body: string): Map<string, { lang: string; currency: string }> {
|
|
210
|
+
const map = new Map<string, { lang: string; currency: string }>();
|
|
211
|
+
for (const raw of (body || '').split('\n')) {
|
|
212
|
+
const line = raw.trim();
|
|
213
|
+
if (!line || !line.includes('|') || !/\/groups\//.test(line)) continue;
|
|
214
|
+
const parts = line.split('|').map((p) => p.trim());
|
|
215
|
+
if (parts.length < 2) continue;
|
|
216
|
+
const url = normUrl(parts[0].replace(/^[-*\d.\s]+/, ''));
|
|
217
|
+
if (!/^https?:\/\//.test(url)) continue;
|
|
218
|
+
map.set(url, { lang: (parts[1] || '').toLowerCase(), currency: (parts[2] || '').toUpperCase() });
|
|
219
|
+
}
|
|
220
|
+
return map;
|
|
221
|
+
}
|
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
import { createHash } from 'crypto';
|
|
2
2
|
import { readFileSync } from 'fs';
|
|
3
|
-
import { resolve } from 'path';
|
|
3
|
+
import { isAbsolute, resolve } from 'path';
|
|
4
|
+
import { isHttpMode } from './identity.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Where a stored file path points. Absolute paths are used as-is. A relative
|
|
8
|
+
* path is relative to its project's root (`baseDir`, from the project
|
|
9
|
+
* registry). Without one, it falls back to process.cwd() only for a stdio MCP
|
|
10
|
+
* server, which Claude Code starts inside the project; over HTTP the process
|
|
11
|
+
* is the Neural Interface, whose cwd says nothing about the caller, so an
|
|
12
|
+
* unanchored relative path resolves to nothing rather than to the wrong file.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveStoredPath(filePath: string, baseDir?: string | null): string | null {
|
|
15
|
+
if (!filePath) return null;
|
|
16
|
+
if (isAbsolute(filePath)) return filePath;
|
|
17
|
+
if (baseDir) return resolve(baseDir, filePath);
|
|
18
|
+
if (isHttpMode()) return null;
|
|
19
|
+
return resolve(filePath);
|
|
20
|
+
}
|
|
4
21
|
|
|
5
22
|
/**
|
|
6
23
|
* Compute SHA-256 hash of a file's content.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Returns null if the file doesn't exist or can't be read.
|
|
24
|
+
* Returns null if the path cannot be anchored, or the file doesn't exist or
|
|
25
|
+
* can't be read.
|
|
10
26
|
*/
|
|
11
|
-
export function hashFile(filePath: string): string | null {
|
|
27
|
+
export function hashFile(filePath: string, baseDir?: string | null): string | null {
|
|
12
28
|
try {
|
|
13
|
-
const absPath =
|
|
29
|
+
const absPath = resolveStoredPath(filePath, baseDir);
|
|
30
|
+
if (!absPath) return null;
|
|
14
31
|
const content = readFileSync(absPath);
|
|
15
32
|
return createHash('sha256').update(content).digest('hex');
|
|
16
33
|
} catch {
|
|
@@ -20,13 +37,13 @@ export function hashFile(filePath: string): string | null {
|
|
|
20
37
|
|
|
21
38
|
/**
|
|
22
39
|
* Compute checksums for an array of related file paths.
|
|
23
|
-
* Returns a Record mapping each file path to its SHA-256 hash.
|
|
40
|
+
* Returns a Record mapping each file path (as given) to its SHA-256 hash.
|
|
24
41
|
* Files that can't be read are omitted from the result.
|
|
25
42
|
*/
|
|
26
|
-
export function computeChecksums(filePaths: string[]): Record<string, string> {
|
|
43
|
+
export function computeChecksums(filePaths: string[], baseDir?: string | null): Record<string, string> {
|
|
27
44
|
const checksums: Record<string, string> = {};
|
|
28
45
|
for (const fp of filePaths) {
|
|
29
|
-
const hash = hashFile(fp);
|
|
46
|
+
const hash = hashFile(fp, baseDir);
|
|
30
47
|
if (hash) checksums[fp] = hash;
|
|
31
48
|
}
|
|
32
49
|
return checksums;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bounded, credential-free view of a file for a judgment about it.
|
|
3
|
+
*
|
|
4
|
+
* Shared by `sync` (a memory whose checksum changed) and the edit-time stale
|
|
5
|
+
* check (a memory whose file was just edited). File content leaves the machine
|
|
6
|
+
* in these judgments, so key and environment files are never read and every
|
|
7
|
+
* excerpt passes through the credential redaction the log preview uses.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
11
|
+
import { basename } from 'node:path';
|
|
12
|
+
import { redactCredentials } from './typesafe-config.js';
|
|
13
|
+
|
|
14
|
+
const HEAD_CHARS = 6000;
|
|
15
|
+
const EXCERPT_CHARS = 8000;
|
|
16
|
+
const MAX_FILE_BYTES = 4 * 1024 * 1024;
|
|
17
|
+
|
|
18
|
+
/** Files whose content is a credential by construction. Never read, never judged. */
|
|
19
|
+
const DENIED_FILE = /^(?:\.env(?:\..*)?|.*\.(?:pem|key|p12|pfx|keystore|jks)|id_(?:rsa|dsa|ecdsa|ed25519)(?:\..*)?|\.npmrc|\.netrc|\.pgpass|credentials(?:\..*)?)$/i;
|
|
20
|
+
|
|
21
|
+
export function isDeniedFile(filePath: string): boolean {
|
|
22
|
+
return DENIED_FILE.test(basename(filePath));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The head of the content plus the lines that mention identifiers the memory
|
|
27
|
+
* talks about, so a memory about one function is judged against that function
|
|
28
|
+
* even in a long file.
|
|
29
|
+
*/
|
|
30
|
+
export function excerptFromContent(content: string, memoryContent: string): { excerpt: string; truncated: boolean } {
|
|
31
|
+
if (content.length <= EXCERPT_CHARS) return { excerpt: redactCredentials(content), truncated: false };
|
|
32
|
+
const identifiers = new Set<string>();
|
|
33
|
+
for (const m of memoryContent.matchAll(/`([^`\n]{3,60})`/g)) identifiers.add(m[1].trim());
|
|
34
|
+
for (const m of memoryContent.matchAll(/\b([A-Za-z_$][A-Za-z0-9_$]*(?:[A-Z][a-z0-9]+|_[a-z0-9]+)[A-Za-z0-9_$]*)\b/g)) if (m[1].length >= 5) identifiers.add(m[1]);
|
|
35
|
+
const head = content.slice(0, HEAD_CHARS);
|
|
36
|
+
const extra: string[] = [];
|
|
37
|
+
let budget = EXCERPT_CHARS - head.length;
|
|
38
|
+
if (identifiers.size) {
|
|
39
|
+
const lines = content.slice(HEAD_CHARS).split('\n');
|
|
40
|
+
for (const [i, line] of lines.entries()) {
|
|
41
|
+
if (budget <= 0) break;
|
|
42
|
+
if ([...identifiers].some(id => line.includes(id))) {
|
|
43
|
+
const tagged = `L${Math.max(1, head.split('\n').length + i)}: ${line.slice(0, 200)}`;
|
|
44
|
+
extra.push(tagged); budget -= tagged.length + 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const excerpt = extra.length ? `${head}\n… [lines mentioning identifiers from the memory] …\n${extra.join('\n')}` : head;
|
|
49
|
+
return { excerpt: redactCredentials(excerpt), truncated: true };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Read and excerpt a file, or null when it is denied, too large or unreadable. */
|
|
53
|
+
export function fileExcerpt(filePath: string, memoryContent: string): { excerpt: string; truncated: boolean } | null {
|
|
54
|
+
try {
|
|
55
|
+
if (isDeniedFile(filePath)) return null;
|
|
56
|
+
if (statSync(filePath).size > MAX_FILE_BYTES) return null;
|
|
57
|
+
return excerptFromContent(readFileSync(filePath, 'utf8'), memoryContent);
|
|
58
|
+
} catch { return null; }
|
|
59
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-caller identity for browser session/tab isolation.
|
|
3
|
+
*
|
|
4
|
+
* Over the HTTP transport, every MCP request runs inside the ONE Neural
|
|
5
|
+
* Interface process — module-level state in neural-interface.ts would be
|
|
6
|
+
* shared by every connected Claude Code instance (CLI windows, sidepanel
|
|
7
|
+
* chats, loops), which is exactly how separately-launched automations ended
|
|
8
|
+
* up competing for the same browser tab. This module gives each caller its
|
|
9
|
+
* own identity object, derived per-request from:
|
|
10
|
+
*
|
|
11
|
+
* 1. X-Synabun-Terminal / X-Synabun-Browser-Session / X-Synabun-Browser-Tab
|
|
12
|
+
* headers (loops, scheduled loops, sidepanel — injected at launch), or
|
|
13
|
+
* 2. the stateful Mcp-Session-Id (plain CLI windows — unique per Claude
|
|
14
|
+
* Code process with zero client configuration), or
|
|
15
|
+
* 3. a per-process stdio singleton whose pins read live process.env —
|
|
16
|
+
* bit-identical to the historical behavior for stdio MCP children
|
|
17
|
+
* (codex/opencode loops, automation-window agents).
|
|
18
|
+
*
|
|
19
|
+
* The HTTP transport enters the AsyncLocalStorage context around every
|
|
20
|
+
* transport.handleRequest call; stdio never enters it, so getIdentity()
|
|
21
|
+
* falling back to the stdio singleton IS the backward-compat switch.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
25
|
+
import { randomUUID } from 'node:crypto';
|
|
26
|
+
|
|
27
|
+
export interface PinSet {
|
|
28
|
+
terminalSessionId: string | null;
|
|
29
|
+
browserSessionId: string | null;
|
|
30
|
+
browserTabId: string | null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface IdentityState {
|
|
34
|
+
affinitySessionId: string | null;
|
|
35
|
+
interactiveSessionId: string | null;
|
|
36
|
+
interactiveTabId: string | null;
|
|
37
|
+
recoveredSessionId: string | null;
|
|
38
|
+
recoveredTabId: string | null;
|
|
39
|
+
ancestorPinnedSession: string | null;
|
|
40
|
+
ancestorPinnedTab: string | null;
|
|
41
|
+
ancestorPinnedTerminal: string | null;
|
|
42
|
+
ancestorAttempts: number;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Caller roles that unlock role-gated tool groups (see profiles.ts
|
|
46
|
+
* ROLE_GATED_GROUPS). Only the SynaBun assistant runtime exists today. */
|
|
47
|
+
export type CallerRole = 'assistant';
|
|
48
|
+
|
|
49
|
+
export interface CallerIdentity {
|
|
50
|
+
memoryContext?: { project?: string; session?: string; generation?: string };
|
|
51
|
+
/** Role claimed by the caller's launch headers (X-Synabun-Role) — refreshed
|
|
52
|
+
* on every HTTP request; stdio children read SYNABUN_ROLE live instead. */
|
|
53
|
+
role?: CallerRole;
|
|
54
|
+
/** Computer-use grant (X-Synabun-Desktop-Grant), minted by the Neural
|
|
55
|
+
* Interface per assistant brain / computer-use worker. Per request, like role. */
|
|
56
|
+
desktopGrant?: string;
|
|
57
|
+
key: string;
|
|
58
|
+
source: 'header' | 'mcp-session' | 'stdio';
|
|
59
|
+
/** ownerKey for /api/browser/acquire|release AND the X-Synabun-Terminal
|
|
60
|
+
* fallback — one field so the routing key and the acquire key can never
|
|
61
|
+
* drift apart. */
|
|
62
|
+
clientId: string;
|
|
63
|
+
pins: PinSet;
|
|
64
|
+
state: IdentityState;
|
|
65
|
+
lastSeen: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const emptyState = (): IdentityState => ({
|
|
69
|
+
affinitySessionId: null,
|
|
70
|
+
interactiveSessionId: null,
|
|
71
|
+
interactiveTabId: null,
|
|
72
|
+
recoveredSessionId: null,
|
|
73
|
+
recoveredTabId: null,
|
|
74
|
+
ancestorPinnedSession: null,
|
|
75
|
+
ancestorPinnedTab: null,
|
|
76
|
+
ancestorPinnedTerminal: null,
|
|
77
|
+
ancestorAttempts: 0,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const als = new AsyncLocalStorage<CallerIdentity>();
|
|
81
|
+
export function callerMemoryContext() {
|
|
82
|
+
return als.getStore()?.memoryContext || (httpMode ? {} : {
|
|
83
|
+
project: process.env.SYNABUN_PROJECT,
|
|
84
|
+
session: process.env.SYNABUN_TERMINAL_SESSION,
|
|
85
|
+
generation: process.env.SYNABUN_CONTEXT_GENERATION,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const identities = new Map<string, CallerIdentity>();
|
|
89
|
+
|
|
90
|
+
// Set by the HTTP transport at mount. Once true, a missing ALS store inside a
|
|
91
|
+
// tool handler is a context-propagation bug: degrade to an EPHEMERAL identity
|
|
92
|
+
// (costs an extra tab) rather than the shared stdio singleton (cross-talk).
|
|
93
|
+
let httpMode = false;
|
|
94
|
+
export function markHttpMode(): void { httpMode = true; }
|
|
95
|
+
|
|
96
|
+
// Lazy stdio singleton — the per-process identity for stdio transports.
|
|
97
|
+
// clientId is minted once per process (the old INTERACTIVE_CLIENT_ID); pins
|
|
98
|
+
// are read live from process.env by effectivePins(), preserving the exact
|
|
99
|
+
// historical env-pin semantics.
|
|
100
|
+
let _stdioIdentity: CallerIdentity | null = null;
|
|
101
|
+
function stdioIdentity(): CallerIdentity {
|
|
102
|
+
if (!_stdioIdentity) {
|
|
103
|
+
_stdioIdentity = {
|
|
104
|
+
key: 'stdio',
|
|
105
|
+
source: 'stdio',
|
|
106
|
+
clientId: randomUUID(),
|
|
107
|
+
pins: { terminalSessionId: null, browserSessionId: null, browserTabId: null },
|
|
108
|
+
state: emptyState(),
|
|
109
|
+
lastSeen: Date.now(),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
return _stdioIdentity;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The stdio identity if it was ever created (for exit-hook tab release). */
|
|
116
|
+
export function peekStdioIdentity(): CallerIdentity | null {
|
|
117
|
+
return _stdioIdentity;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function isHttpMode(): boolean { return httpMode; }
|
|
121
|
+
|
|
122
|
+
export function runWithIdentity<T>(identity: CallerIdentity, fn: () => T): T {
|
|
123
|
+
return als.run(identity, fn);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function getIdentity(): CallerIdentity {
|
|
127
|
+
const store = als.getStore();
|
|
128
|
+
if (store) return store;
|
|
129
|
+
if (httpMode) {
|
|
130
|
+
// Propagation bug guard: never hand the shared stdio identity to an HTTP
|
|
131
|
+
// caller. An ephemeral identity wastes a tab at worst — never cross-talk.
|
|
132
|
+
console.error('[identity] missing ALS context in HTTP mode — using ephemeral identity (propagation bug?)');
|
|
133
|
+
const key = `ephemeral-${randomUUID()}`;
|
|
134
|
+
return {
|
|
135
|
+
key,
|
|
136
|
+
source: 'mcp-session',
|
|
137
|
+
clientId: key,
|
|
138
|
+
pins: { terminalSessionId: null, browserSessionId: null, browserTabId: null },
|
|
139
|
+
state: emptyState(),
|
|
140
|
+
lastSeen: Date.now(),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return stdioIdentity();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Pins must look like the ids we mint (hex/uuid-ish). Rejects empty strings
|
|
147
|
+
* and unexpanded template junk like "${SYNABUN_TERMINAL_SESSION}". */
|
|
148
|
+
export function sanitizePin(v: string | undefined | null): string | null {
|
|
149
|
+
if (!v) return null;
|
|
150
|
+
return /^[A-Za-z0-9_-]{1,128}$/.test(v) ? v : null;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Only known roles are accepted; anything else (empty, template junk,
|
|
154
|
+
* invented roles) is treated as "no role" so gating fails closed. */
|
|
155
|
+
export function sanitizeRole(v: string | undefined | null): CallerRole | null {
|
|
156
|
+
return typeof v === 'string' && v.trim().toLowerCase() === 'assistant' ? 'assistant' : null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Desktop grants look exactly like the tokens the Neural Interface mints. */
|
|
160
|
+
export function sanitizeDesktopGrant(v: string | undefined | null): string | null {
|
|
161
|
+
return typeof v === 'string' && /^sbd_[A-Za-z0-9_-]{43}$/.test(v.trim()) ? v.trim() : null;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Computer-use grant of the current caller: the ALS identity's grant over HTTP
|
|
166
|
+
* (X-Synabun-Desktop-Grant on every request), SYNABUN_DESKTOP_GRANT for stdio
|
|
167
|
+
* children. Never the host's own env for an unidentified HTTP caller.
|
|
168
|
+
*/
|
|
169
|
+
export function callerDesktopGrant(): string | null {
|
|
170
|
+
const store = als.getStore();
|
|
171
|
+
if (store) return store.desktopGrant ?? null;
|
|
172
|
+
if (httpMode) return null;
|
|
173
|
+
return sanitizeDesktopGrant(process.env.SYNABUN_DESKTOP_GRANT);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Role of the current caller: the ALS identity's role over HTTP (derived from
|
|
178
|
+
* X-Synabun-Role on every request), or SYNABUN_ROLE for stdio children —
|
|
179
|
+
* Codex/OpenCode assistant brains pass the role to their MCP child via env.
|
|
180
|
+
* In HTTP mode a missing ALS store is a propagation bug, so the host
|
|
181
|
+
* process's own env must never grant a role to an unidentified caller.
|
|
182
|
+
*/
|
|
183
|
+
export function callerRole(): CallerRole | null {
|
|
184
|
+
const store = als.getStore();
|
|
185
|
+
if (store) return store.role ?? null;
|
|
186
|
+
if (httpMode) return null;
|
|
187
|
+
return sanitizeRole(process.env.SYNABUN_ROLE);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Create-or-touch the identity for an HTTP caller. */
|
|
191
|
+
export function obtainIdentity(
|
|
192
|
+
key: string,
|
|
193
|
+
opts: { source: 'header' | 'mcp-session'; pins?: Partial<PinSet>; role?: CallerRole | null; desktopGrant?: string | null }
|
|
194
|
+
): CallerIdentity {
|
|
195
|
+
let id = identities.get(key);
|
|
196
|
+
if (!id) {
|
|
197
|
+
id = {
|
|
198
|
+
key,
|
|
199
|
+
source: opts.source,
|
|
200
|
+
clientId: key,
|
|
201
|
+
pins: {
|
|
202
|
+
terminalSessionId: opts.pins?.terminalSessionId ?? null,
|
|
203
|
+
browserSessionId: opts.pins?.browserSessionId ?? null,
|
|
204
|
+
browserTabId: opts.pins?.browserTabId ?? null,
|
|
205
|
+
},
|
|
206
|
+
state: emptyState(),
|
|
207
|
+
lastSeen: Date.now(),
|
|
208
|
+
};
|
|
209
|
+
if (opts.role) id.role = opts.role;
|
|
210
|
+
if (opts.desktopGrant) id.desktopGrant = opts.desktopGrant;
|
|
211
|
+
identities.set(key, id);
|
|
212
|
+
} else {
|
|
213
|
+
// Refresh pins on every request — a loop relaunch may rebind its headers.
|
|
214
|
+
if (opts.pins?.terminalSessionId !== undefined) id.pins.terminalSessionId = opts.pins.terminalSessionId;
|
|
215
|
+
if (opts.pins?.browserSessionId !== undefined) id.pins.browserSessionId = opts.pins.browserSessionId;
|
|
216
|
+
if (opts.pins?.browserTabId !== undefined) id.pins.browserTabId = opts.pins.browserTabId;
|
|
217
|
+
// The role is per-request: a request without the header carries no role,
|
|
218
|
+
// so a stale grant can never outlive the headers that justified it.
|
|
219
|
+
if (opts.role !== undefined) id.role = opts.role ?? undefined;
|
|
220
|
+
if (opts.desktopGrant !== undefined) id.desktopGrant = opts.desktopGrant ?? undefined;
|
|
221
|
+
id.lastSeen = Date.now();
|
|
222
|
+
}
|
|
223
|
+
return id;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/** Pin resolution: stdio reads live env (historical behavior); HTTP identities
|
|
227
|
+
* carry pins parsed from their launch headers. */
|
|
228
|
+
export function effectivePins(id: CallerIdentity): PinSet {
|
|
229
|
+
if (id.source === 'stdio') {
|
|
230
|
+
return {
|
|
231
|
+
terminalSessionId: process.env.SYNABUN_TERMINAL_SESSION || null,
|
|
232
|
+
browserSessionId: process.env.SYNABUN_BROWSER_SESSION || null,
|
|
233
|
+
browserTabId: process.env.SYNABUN_BROWSER_TAB || null,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return id.pins;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** The X-Synabun-Terminal value for Neural Interface requests — the server
|
|
240
|
+
* routes this caller's tab-less browser calls via _tabOwners[terminalId].
|
|
241
|
+
* Analogue of the old currentTerminalId(): env/header pin → resolved
|
|
242
|
+
* ancestor terminal → this identity's own client id. */
|
|
243
|
+
export function terminalIdFor(id: CallerIdentity): string {
|
|
244
|
+
return effectivePins(id).terminalSessionId || id.state.ancestorPinnedTerminal || id.clientId;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Release hook — registered by neural-interface.ts (which owns the HTTP
|
|
248
|
+
// client) to avoid a circular import. Receives the identity whose acquired
|
|
249
|
+
// tab should be released server-side.
|
|
250
|
+
type ReleaseHook = (id: CallerIdentity) => void;
|
|
251
|
+
let releaseHook: ReleaseHook | null = null;
|
|
252
|
+
export function setReleaseHook(fn: ReleaseHook): void { releaseHook = fn; }
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Drop an HTTP identity, releasing its acquired tab if it ever called
|
|
256
|
+
* /api/browser/acquire. Loop tabs are NEVER released here: a loop identity's
|
|
257
|
+
* tab is owned server-side under its terminalSessionId and reaped by
|
|
258
|
+
* /api/loop/stop — interactiveSessionId is only set by acquireInteractive.
|
|
259
|
+
*/
|
|
260
|
+
export function releaseIdentity(key: string): void {
|
|
261
|
+
const id = identities.get(key);
|
|
262
|
+
if (!id) return;
|
|
263
|
+
if (id.state.interactiveSessionId && releaseHook) {
|
|
264
|
+
try { releaseHook(id); } catch { /* best-effort */ }
|
|
265
|
+
}
|
|
266
|
+
identities.delete(key);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export function identityCount(): number { return identities.size; }
|
|
270
|
+
|
|
271
|
+
const IDENTITY_TTL_MS = parseInt(process.env.SYNABUN_IDENTITY_TTL_MS || '', 10) || 2 * 60 * 60 * 1000;
|
|
272
|
+
|
|
273
|
+
let sweeperStarted = false;
|
|
274
|
+
export function startIdentitySweeper(): void {
|
|
275
|
+
if (sweeperStarted) return;
|
|
276
|
+
sweeperStarted = true;
|
|
277
|
+
const interval = setInterval(() => {
|
|
278
|
+
const now = Date.now();
|
|
279
|
+
let evicted = 0;
|
|
280
|
+
for (const [key, id] of identities) {
|
|
281
|
+
if (now - id.lastSeen > IDENTITY_TTL_MS) {
|
|
282
|
+
releaseIdentity(key);
|
|
283
|
+
evicted++;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (evicted > 0) {
|
|
287
|
+
console.error(`[identity] evicted ${evicted} idle identities (${identities.size} remain)`);
|
|
288
|
+
}
|
|
289
|
+
}, 60_000);
|
|
290
|
+
interval.unref();
|
|
291
|
+
}
|