synabun 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +205 -662
- package/LICENSE-COMMERCIAL.md +33 -0
- package/NOTICE +17 -0
- package/README.md +175 -853
- package/THIRD-PARTY-LICENSES.md +136 -0
- package/benchmarks/browser-live-results.json +79 -0
- package/benchmarks/browser-v2-results.json +258 -0
- package/benchmarks/fixtures/browser/README.md +57 -0
- package/benchmarks/fixtures/browser/page-state.json +132 -0
- package/benchmarks/fixtures/browser/social.json +92 -0
- package/benchmarks/fixtures/browser/target.json +319 -0
- package/benchmarks/fixtures/desktop/README.md +58 -0
- package/benchmarks/fixtures/desktop/abstention.json +59 -0
- package/benchmarks/fixtures/desktop/adversarial.json +22 -0
- package/benchmarks/fixtures/desktop/forbidden.json +93 -0
- package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
- package/benchmarks/fixtures/desktop/target.json +136 -0
- package/bin/synabun.js +30 -0
- package/docs/whatsapp.md +325 -0
- package/hooks/claude-code/post-plan.mjs +613 -391
- package/hooks/claude-code/post-remember.mjs +246 -122
- package/hooks/claude-code/pre-compact.mjs +171 -110
- package/hooks/claude-code/pre-task.mjs +133 -0
- package/hooks/claude-code/pre-websearch.mjs +15 -4
- package/hooks/claude-code/prompt-origin.mjs +94 -0
- package/hooks/claude-code/prompt-submit.mjs +1244 -861
- package/hooks/claude-code/session-start.mjs +114 -156
- package/hooks/claude-code/shared.mjs +1228 -368
- package/hooks/claude-code/state.mjs +167 -0
- package/hooks/claude-code/stop.mjs +515 -140
- package/hooks/claude-code/subagent-start.mjs +154 -0
- package/hooks/claude-code/subagent-stop.mjs +102 -0
- package/hooks/claude-code/task-gate.mjs +150 -0
- package/launcher.mjs +40 -0
- package/lib/claude-hooks.js +137 -0
- package/lib/claude-usage-audit.js +141 -0
- package/lib/client-config-repair.js +145 -0
- package/lib/data-home-migration.js +502 -0
- package/lib/desktop-pwa.js +206 -0
- package/lib/external-tools.js +221 -0
- package/lib/first-launch-protection.js +245 -0
- package/lib/packaged-runtime.js +110 -0
- package/lib/paths.d.ts +21 -0
- package/lib/paths.js +103 -0
- package/lib/start-launcher.js +1309 -0
- package/mcp-server/dist/config.d.ts +22 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +109 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +30 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +276 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +48 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +538 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +28 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +32 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
- package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.js +128 -0
- package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.js +344 -0
- package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/browser-assist.d.ts +104 -0
- package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist.js +282 -0
- package/mcp-server/dist/services/browser-assist.js.map +1 -0
- package/mcp-server/dist/services/browser-bench.d.ts +772 -0
- package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-bench.js +424 -0
- package/mcp-server/dist/services/browser-bench.js.map +1 -0
- package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
- package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-judgments.js +363 -0
- package/mcp-server/dist/services/browser-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-risk.d.ts +166 -0
- package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-risk.js +458 -0
- package/mcp-server/dist/services/browser-risk.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +377 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.js +346 -0
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
- package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
- package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist.js +266 -0
- package/mcp-server/dist/services/desktop-assist.js.map +1 -0
- package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
- package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-bench.js +311 -0
- package/mcp-server/dist/services/desktop-bench.js.map +1 -0
- package/mcp-server/dist/services/desktop-client.d.ts +23 -0
- package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-client.js +79 -0
- package/mcp-server/dist/services/desktop-client.js.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.js +177 -0
- package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
- package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
- package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-risk.js +605 -0
- package/mcp-server/dist/services/desktop-risk.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/edit-stale.d.ts +81 -0
- package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
- package/mcp-server/dist/services/edit-stale.js +358 -0
- package/mcp-server/dist/services/edit-stale.js.map +1 -0
- package/mcp-server/dist/services/embedding-service.d.ts +16 -0
- package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-service.js +126 -0
- package/mcp-server/dist/services/embedding-service.js.map +1 -0
- package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
- package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-worker.js +52 -0
- package/mcp-server/dist/services/embedding-worker.js.map +1 -0
- package/mcp-server/dist/services/fb-regions.d.ts +71 -0
- package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
- package/mcp-server/dist/services/fb-regions.js +211 -0
- package/mcp-server/dist/services/fb-regions.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +22 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +55 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
- package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
- package/mcp-server/dist/services/file-excerpt.js +65 -0
- package/mcp-server/dist/services/file-excerpt.js.map +1 -0
- package/mcp-server/dist/services/identity.d.ts +124 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -0
- package/mcp-server/dist/services/identity.js +241 -0
- package/mcp-server/dist/services/identity.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +3 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/memory-client.d.ts +4 -0
- package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-client.js +27 -0
- package/mcp-server/dist/services/memory-client.js.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
- package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
- package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judgments.js +674 -0
- package/mcp-server/dist/services/memory-judgments.js.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.js +403 -0
- package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.js +412 -0
- package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
- package/mcp-server/dist/services/memory-schema.d.ts +16 -0
- package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-schema.js +282 -0
- package/mcp-server/dist/services/memory-schema.js.map +1 -0
- package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-sessions.js +110 -0
- package/mcp-server/dist/services/memory-sessions.js.map +1 -0
- package/mcp-server/dist/services/memory-triage.d.ts +60 -0
- package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-triage.js +189 -0
- package/mcp-server/dist/services/memory-triage.js.map +1 -0
- package/mcp-server/dist/services/memory-verification.d.ts +24 -0
- package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-verification.js +92 -0
- package/mcp-server/dist/services/memory-verification.js.map +1 -0
- package/mcp-server/dist/services/memory-writer.d.ts +26 -0
- package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-writer.js +126 -0
- package/mcp-server/dist/services/memory-writer.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +439 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +1135 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/profiles.d.ts +120 -0
- package/mcp-server/dist/services/profiles.d.ts.map +1 -0
- package/mcp-server/dist/services/profiles.js +387 -0
- package/mcp-server/dist/services/profiles.js.map +1 -0
- package/mcp-server/dist/services/secret-gate.d.ts +29 -0
- package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/secret-gate.js +43 -0
- package/mcp-server/dist/services/secret-gate.js.map +1 -0
- package/mcp-server/dist/services/server-instructions.d.ts +10 -0
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
- package/mcp-server/dist/services/server-instructions.js +101 -0
- package/mcp-server/dist/services/server-instructions.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +235 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +1185 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.js +218 -0
- package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +746 -0
- package/mcp-server/dist/services/typesafe-config.js.map +1 -0
- package/mcp-server/dist/services/typesafe.d.ts +213 -0
- package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe.js +330 -0
- package/mcp-server/dist/services/typesafe.js.map +1 -0
- package/mcp-server/dist/services/vector-cache.d.ts +68 -0
- package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
- package/mcp-server/dist/services/vector-cache.js +271 -0
- package/mcp-server/dist/services/vector-cache.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
- package/mcp-server/dist/tools/agents.d.ts +212 -0
- package/mcp-server/dist/tools/agents.d.ts.map +1 -0
- package/mcp-server/dist/tools/agents.js +407 -0
- package/mcp-server/dist/tools/agents.js.map +1 -0
- package/mcp-server/dist/tools/bluesky.d.ts +39 -0
- package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
- package/mcp-server/dist/tools/bluesky.js +1144 -0
- package/mcp-server/dist/tools/bluesky.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +106 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
- package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-batch.js +187 -0
- package/mcp-server/dist/tools/browser-batch.js.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +300 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +142 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +2009 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +34 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +112 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +16 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/choice.d.ts +160 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -0
- package/mcp-server/dist/tools/choice.js +80 -0
- package/mcp-server/dist/tools/choice.js.map +1 -0
- package/mcp-server/dist/tools/computer.d.ts +71 -0
- package/mcp-server/dist/tools/computer.d.ts.map +1 -0
- package/mcp-server/dist/tools/computer.js +174 -0
- package/mcp-server/dist/tools/computer.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +25 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
- package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/fb-groups.js +369 -0
- package/mcp-server/dist/tools/fb-groups.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +11 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.js +351 -0
- package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.js +258 -0
- package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.js +357 -0
- package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.js +321 -0
- package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.js +197 -0
- package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.js +274 -0
- package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.js +425 -0
- package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
- package/mcp-server/dist/tools/gsc.d.ts +7 -0
- package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc.js +51 -0
- package/mcp-server/dist/tools/gsc.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +14 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +21 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +401 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +56 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +171 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/morelogin.d.ts +24 -0
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
- package/mcp-server/dist/tools/morelogin.js +79 -0
- package/mcp-server/dist/tools/morelogin.js.map +1 -0
- package/mcp-server/dist/tools/profile.d.ts +17 -0
- package/mcp-server/dist/tools/profile.d.ts.map +1 -0
- package/mcp-server/dist/tools/profile.js +114 -0
- package/mcp-server/dist/tools/profile.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +71 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +147 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +56 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +157 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +62 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +201 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.js +231 -0
- package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
- package/mcp-server/dist/tools/style-guide.d.ts +8 -0
- package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide.js +12 -0
- package/mcp-server/dist/tools/style-guide.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +20 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +156 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +11 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +19 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +54 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.js +337 -0
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +16 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.js +83 -0
- package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.js +56 -0
- package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
- package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/download.js +30 -0
- package/mcp-server/dist/tools/youtube/download.js.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.js +143 -0
- package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
- package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
- package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/media.js +97 -0
- package/mcp-server/dist/tools/youtube/media.js.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.js +106 -0
- package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.js +71 -0
- package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.js +128 -0
- package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.js +147 -0
- package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
- package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
- package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/source.js +85 -0
- package/mcp-server/dist/tools/youtube/source.js.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.js +255 -0
- package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
- package/mcp-server/dist/tools/youtube.d.ts +12 -0
- package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube.js +38 -0
- package/mcp-server/dist/tools/youtube.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +806 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/mcp-server/package-lock.json +4798 -0
- package/mcp-server/package.json +55 -38
- package/mcp-server/run.mjs +12 -2
- package/mcp-server/src/config.ts +48 -3
- package/mcp-server/src/http.ts +296 -93
- package/mcp-server/src/index.ts +546 -203
- package/mcp-server/src/preload-http.ts +19 -18
- package/mcp-server/src/preload.ts +19 -18
- package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
- package/mcp-server/src/services/assistant-judgments.ts +157 -0
- package/mcp-server/src/services/browser-assist-gate.ts +383 -0
- package/mcp-server/src/services/browser-assist.ts +267 -0
- package/mcp-server/src/services/browser-bench.ts +477 -0
- package/mcp-server/src/services/browser-judgments.ts +414 -0
- package/mcp-server/src/services/browser-risk.ts +484 -0
- package/mcp-server/src/services/categories.ts +36 -19
- package/mcp-server/src/services/codex-config-heal.ts +403 -0
- package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
- package/mcp-server/src/services/desktop-assist.ts +308 -0
- package/mcp-server/src/services/desktop-bench.ts +372 -0
- package/mcp-server/src/services/desktop-client.ts +76 -0
- package/mcp-server/src/services/desktop-judgments.ts +218 -0
- package/mcp-server/src/services/desktop-risk.ts +743 -0
- package/mcp-server/src/services/edit-stale.ts +299 -0
- package/mcp-server/src/services/embedding-service.ts +108 -0
- package/mcp-server/src/services/embedding-worker.ts +46 -0
- package/mcp-server/src/services/fb-regions.ts +221 -0
- package/mcp-server/src/services/file-checksums.ts +26 -9
- package/mcp-server/src/services/file-excerpt.ts +59 -0
- package/mcp-server/src/services/identity.ts +291 -0
- package/mcp-server/src/services/local-embeddings.ts +2 -77
- package/mcp-server/src/services/memory-client.ts +23 -0
- package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
- package/mcp-server/src/services/memory-judgments.ts +901 -0
- package/mcp-server/src/services/memory-maintenance.ts +360 -0
- package/mcp-server/src/services/memory-retrieval.ts +349 -0
- package/mcp-server/src/services/memory-schema.ts +280 -0
- package/mcp-server/src/services/memory-sessions.ts +87 -0
- package/mcp-server/src/services/memory-triage.ts +182 -0
- package/mcp-server/src/services/memory-verification.ts +68 -0
- package/mcp-server/src/services/memory-writer.ts +125 -0
- package/mcp-server/src/services/neural-interface.ts +1217 -73
- package/mcp-server/src/services/profiles.ts +428 -0
- package/mcp-server/src/services/secret-gate.ts +52 -0
- package/mcp-server/src/services/server-instructions.ts +122 -0
- package/mcp-server/src/services/sqlite.ts +1456 -823
- package/mcp-server/src/services/typesafe-bench.ts +247 -0
- package/mcp-server/src/services/typesafe-config.ts +790 -0
- package/mcp-server/src/services/typesafe.ts +390 -0
- package/mcp-server/src/services/vector-cache.ts +255 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
- package/mcp-server/src/tools/agents.ts +539 -0
- package/mcp-server/src/tools/bluesky.ts +1186 -0
- package/mcp-server/src/tools/browser-advanced.ts +15 -6
- package/mcp-server/src/tools/browser-batch.ts +178 -0
- package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
- package/mcp-server/src/tools/browser-interact.ts +362 -255
- package/mcp-server/src/tools/browser-navigate.ts +164 -77
- package/mcp-server/src/tools/browser-observe.ts +2222 -1330
- package/mcp-server/src/tools/browser.ts +181 -107
- package/mcp-server/src/tools/card.ts +7 -5
- package/mcp-server/src/tools/choice.ts +103 -0
- package/mcp-server/src/tools/computer.ts +190 -0
- package/mcp-server/src/tools/discord.ts +10 -23
- package/mcp-server/src/tools/fb-groups.ts +387 -0
- package/mcp-server/src/tools/forget.ts +1 -1
- package/mcp-server/src/tools/git.ts +3 -1
- package/mcp-server/src/tools/gsc/experience.ts +440 -0
- package/mcp-server/src/tools/gsc/helpers.ts +288 -0
- package/mcp-server/src/tools/gsc/indexing.ts +495 -0
- package/mcp-server/src/tools/gsc/inspect.ts +391 -0
- package/mcp-server/src/tools/gsc/navigate.ts +236 -0
- package/mcp-server/src/tools/gsc/performance.ts +352 -0
- package/mcp-server/src/tools/gsc/settings.ts +564 -0
- package/mcp-server/src/tools/gsc.ts +95 -0
- package/mcp-server/src/tools/image.ts +3 -1
- package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
- package/mcp-server/src/tools/leonardo.ts +7 -5
- package/mcp-server/src/tools/loop.ts +118 -25
- package/mcp-server/src/tools/memories.ts +65 -5
- package/mcp-server/src/tools/morelogin.ts +81 -0
- package/mcp-server/src/tools/profile.ts +122 -0
- package/mcp-server/src/tools/recall.ts +105 -261
- package/mcp-server/src/tools/reflect.ts +171 -145
- package/mcp-server/src/tools/remember.ts +223 -115
- package/mcp-server/src/tools/style-guide-tools.ts +250 -0
- package/mcp-server/src/tools/style-guide.ts +16 -0
- package/mcp-server/src/tools/sync.ts +66 -9
- package/mcp-server/src/tools/tictactoe.ts +3 -1
- package/mcp-server/src/tools/utils.ts +22 -0
- package/mcp-server/src/tools/whiteboard-format.ts +394 -0
- package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
- package/mcp-server/src/tools/whiteboard.ts +7 -5
- package/mcp-server/src/tools/youtube/analytics.ts +106 -0
- package/mcp-server/src/tools/youtube/dedup.ts +57 -0
- package/mcp-server/src/tools/youtube/download.ts +41 -0
- package/mcp-server/src/tools/youtube/helpers.ts +183 -0
- package/mcp-server/src/tools/youtube/media.ts +109 -0
- package/mcp-server/src/tools/youtube/metadata.ts +112 -0
- package/mcp-server/src/tools/youtube/navigate.ts +81 -0
- package/mcp-server/src/tools/youtube/playlist.ts +134 -0
- package/mcp-server/src/tools/youtube/schedule.ts +158 -0
- package/mcp-server/src/tools/youtube/source.ts +101 -0
- package/mcp-server/src/tools/youtube/upload.ts +296 -0
- package/mcp-server/src/tools/youtube.ts +47 -0
- package/mcp-server/src/tui.ts +8 -9
- package/neural-interface/games/TicTacToe/1.svg +1 -0
- package/neural-interface/games/TicTacToe/2.svg +1 -0
- package/neural-interface/games/TicTacToe/3.svg +1 -0
- package/neural-interface/games/TicTacToe/4.svg +1 -0
- package/neural-interface/games/TicTacToe/5.svg +1 -0
- package/neural-interface/games/TicTacToe/6.svg +1 -0
- package/neural-interface/games/TicTacToe/7.svg +1 -0
- package/neural-interface/games/TicTacToe/8.svg +1 -0
- package/neural-interface/games/TicTacToe/9.svg +1 -0
- package/neural-interface/games/TicTacToe/Board.svg +1 -0
- package/neural-interface/games/TicTacToe/Circle.svg +1 -0
- package/neural-interface/games/TicTacToe/Cross.svg +1 -0
- package/neural-interface/i18n/en.json +7022 -0
- package/neural-interface/i18n/pt-BR.json +7026 -0
- package/neural-interface/lib/assistant-api.js +1005 -0
- package/neural-interface/lib/assistant-attachments.js +121 -0
- package/neural-interface/lib/assistant-brains/claude.js +207 -0
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
- package/neural-interface/lib/assistant-brains/codex.js +213 -0
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
- package/neural-interface/lib/assistant-brains/opencode.js +320 -0
- package/neural-interface/lib/assistant-budget.js +318 -0
- package/neural-interface/lib/assistant-catalog.js +731 -0
- package/neural-interface/lib/assistant-clarify.js +664 -0
- package/neural-interface/lib/assistant-config.js +232 -0
- package/neural-interface/lib/assistant-dispatch.js +2744 -0
- package/neural-interface/lib/assistant-envelope.js +582 -0
- package/neural-interface/lib/assistant-evidence.js +236 -0
- package/neural-interface/lib/assistant-hidden-models.js +272 -0
- package/neural-interface/lib/assistant-jev.js +117 -0
- package/neural-interface/lib/assistant-judgments.js +111 -0
- package/neural-interface/lib/assistant-media.js +335 -0
- package/neural-interface/lib/assistant-memory.js +398 -0
- package/neural-interface/lib/assistant-persona.js +444 -0
- package/neural-interface/lib/assistant-plan-permissions.js +448 -0
- package/neural-interface/lib/assistant-playbooks/design.md +87 -0
- package/neural-interface/lib/assistant-playbooks.js +72 -0
- package/neural-interface/lib/assistant-pricing.js +159 -0
- package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
- package/neural-interface/lib/assistant-route-gate.js +212 -0
- package/neural-interface/lib/assistant-router.js +1324 -0
- package/neural-interface/lib/assistant-runtime.js +3337 -0
- package/neural-interface/lib/assistant-task-prompt.js +472 -0
- package/neural-interface/lib/assistant-usage.js +1688 -0
- package/neural-interface/lib/augmented-path.js +70 -0
- package/neural-interface/lib/automation-storage-migration.js +54 -0
- package/neural-interface/lib/backup-service.js +851 -0
- package/neural-interface/lib/backup-zip-reader.js +262 -0
- package/neural-interface/lib/browser-assist-api.js +41 -0
- package/neural-interface/lib/browser-console.js +176 -0
- package/neural-interface/lib/browser-execution.js +241 -0
- package/neural-interface/lib/browser-extraction.js +191 -0
- package/neural-interface/lib/browser-language.js +83 -0
- package/neural-interface/lib/browser-screenshot.js +399 -0
- package/neural-interface/lib/browser-semantic-context.js +639 -0
- package/neural-interface/lib/browser-snapshots.js +192 -0
- package/neural-interface/lib/browser-tab-recovery.js +119 -0
- package/neural-interface/lib/browser-targets.js +70 -0
- package/neural-interface/lib/browser-tool-policy.js +926 -0
- package/neural-interface/lib/claude-accounts.js +230 -0
- package/neural-interface/lib/claude-agent-bridge.js +3203 -0
- package/neural-interface/lib/claude-bypass-policy.js +99 -0
- package/neural-interface/lib/claude-executable.js +241 -0
- package/neural-interface/lib/claude-history.js +429 -0
- package/neural-interface/lib/claude-model-catalog.js +444 -0
- package/neural-interface/lib/claude-panel-requests.js +165 -0
- package/neural-interface/lib/claude-panel-session.js +272 -0
- package/neural-interface/lib/claude-permission-rules.js +153 -0
- package/neural-interface/lib/claude-session-cleanup.js +71 -0
- package/neural-interface/lib/claude-session-list.js +82 -0
- package/neural-interface/lib/claude-session-ops.js +140 -0
- package/neural-interface/lib/claude-settings-view.js +51 -0
- package/neural-interface/lib/claude-skin-connect.js +79 -0
- package/neural-interface/lib/claude-stall-policy.js +7 -0
- package/neural-interface/lib/claude-temporary.js +435 -0
- package/neural-interface/lib/cli-update-planner.js +312 -0
- package/neural-interface/lib/codex-capabilities.d.ts +41 -0
- package/neural-interface/lib/codex-capabilities.js +148 -0
- package/neural-interface/lib/codex-collaboration-mode.js +17 -0
- package/neural-interface/lib/codex-compat-rpc.js +241 -0
- package/neural-interface/lib/codex-mcp-approvals.js +56 -0
- package/neural-interface/lib/codex-mcp-apps.js +47 -0
- package/neural-interface/lib/codex-model-context.js +202 -0
- package/neural-interface/lib/codex-plan-store.js +71 -0
- package/neural-interface/lib/codex-request-journal.js +242 -0
- package/neural-interface/lib/codex-runtime-path.js +213 -0
- package/neural-interface/lib/codex-session-catalog.js +231 -0
- package/neural-interface/lib/codex-session-settings.js +46 -0
- package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
- package/neural-interface/lib/codex-thread-history.js +165 -0
- package/neural-interface/lib/codex-user-verification.js +34 -0
- package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
- package/neural-interface/lib/confined-fs.js +256 -0
- package/neural-interface/lib/db.js +922 -0
- package/neural-interface/lib/design-md.js +9 -0
- package/neural-interface/lib/desktop/api.js +92 -0
- package/neural-interface/lib/desktop/audit.js +62 -0
- package/neural-interface/lib/desktop/build.js +423 -0
- package/neural-interface/lib/desktop/config.js +606 -0
- package/neural-interface/lib/desktop/coords.js +76 -0
- package/neural-interface/lib/desktop/fake-helper.js +1192 -0
- package/neural-interface/lib/desktop/frames.js +77 -0
- package/neural-interface/lib/desktop/grants.js +84 -0
- package/neural-interface/lib/desktop/guards.js +170 -0
- package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
- package/neural-interface/lib/desktop/lease.js +51 -0
- package/neural-interface/lib/desktop/manager.js +545 -0
- package/neural-interface/lib/desktop/press-contexts.js +103 -0
- package/neural-interface/lib/desktop/protocol.js +495 -0
- package/neural-interface/lib/desktop/service.js +1202 -0
- package/neural-interface/lib/effort-levels.js +148 -0
- package/neural-interface/lib/event-loop-monitor.js +67 -0
- package/neural-interface/lib/exec-loop-command.js +209 -0
- package/neural-interface/lib/folder-picker.ps1 +77 -0
- package/neural-interface/lib/http-guards.js +287 -0
- package/neural-interface/lib/jsonl-lines.js +94 -0
- package/neural-interface/lib/loop-logger.js +127 -0
- package/neural-interface/lib/mcp-client-config.js +133 -0
- package/neural-interface/lib/mcp-installer.js +487 -0
- package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
- package/neural-interface/lib/mcp-profile-servers.js +120 -0
- package/neural-interface/lib/memo-cache.js +84 -0
- package/neural-interface/lib/memory-api.js +758 -0
- package/neural-interface/lib/memory-map-api.js +1150 -0
- package/neural-interface/lib/memory-map-layout.js +872 -0
- package/neural-interface/lib/memory-map-worker.js +165 -0
- package/neural-interface/lib/memory-session-capture.js +81 -0
- package/neural-interface/lib/memory-timers.js +62 -0
- package/neural-interface/lib/morelogin.js +301 -0
- package/neural-interface/lib/native-binary-runtime.js +382 -0
- package/neural-interface/lib/native-loop-goal.js +33 -0
- package/neural-interface/lib/native-loop-providers.js +1002 -0
- package/neural-interface/lib/native-loop-runtime.js +747 -0
- package/neural-interface/lib/offline-page.js +54 -0
- package/neural-interface/lib/opencode-hidden-models.js +113 -0
- package/neural-interface/lib/opencode-history.js +253 -0
- package/neural-interface/lib/opencode-runtime-config.js +58 -0
- package/neural-interface/lib/opencode-v2-client.js +486 -0
- package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
- package/neural-interface/lib/path-confine.js +213 -0
- package/neural-interface/lib/plugin-installer.js +264 -0
- package/neural-interface/lib/project-storage.js +766 -0
- package/neural-interface/lib/pty-host/core.js +603 -0
- package/neural-interface/lib/pty-host/flow.js +43 -0
- package/neural-interface/lib/pty-host/host.js +47 -0
- package/neural-interface/lib/pty-host/manager.js +360 -0
- package/neural-interface/lib/pty-host/protocol.js +81 -0
- package/neural-interface/lib/pty-host/snapshot.js +133 -0
- package/neural-interface/lib/remote-policy.js +582 -0
- package/neural-interface/lib/rulesets/api.js +175 -0
- package/neural-interface/lib/rulesets/fs-safe.js +245 -0
- package/neural-interface/lib/rulesets/installer.js +1453 -0
- package/neural-interface/lib/rulesets/json-edit.js +186 -0
- package/neural-interface/lib/rulesets/lock.js +170 -0
- package/neural-interface/lib/rulesets/managed-text.js +314 -0
- package/neural-interface/lib/rulesets/normalise.js +24 -0
- package/neural-interface/lib/rulesets/render.js +84 -0
- package/neural-interface/lib/schedule-launch-intent.js +40 -0
- package/neural-interface/lib/session-cache-builder.js +524 -0
- package/neural-interface/lib/session-chunker.js +344 -0
- package/neural-interface/lib/session-indexer.js +327 -0
- package/neural-interface/lib/session-title-generator.js +232 -0
- package/neural-interface/lib/skill-prompt-bridge.js +11 -0
- package/neural-interface/lib/style-guide/api.js +375 -0
- package/neural-interface/lib/style-guide/color.js +352 -0
- package/neural-interface/lib/style-guide/export-css.js +99 -0
- package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
- package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
- package/neural-interface/lib/style-guide/fonts.json +227 -0
- package/neural-interface/lib/style-guide/import.js +1268 -0
- package/neural-interface/lib/style-guide/pointers.js +103 -0
- package/neural-interface/lib/style-guide/presets.js +232 -0
- package/neural-interface/lib/style-guide/render-design-md.js +319 -0
- package/neural-interface/lib/style-guide/schema.js +848 -0
- package/neural-interface/lib/style-guide/security.js +43 -0
- package/neural-interface/lib/style-guide/store.js +491 -0
- package/neural-interface/lib/style-guide/summary.js +106 -0
- package/neural-interface/lib/style-guide/tokens.js +170 -0
- package/neural-interface/lib/synabun-update-plan.js +324 -0
- package/neural-interface/lib/synabun-version.js +179 -0
- package/neural-interface/lib/system-restore.js +99 -0
- package/neural-interface/lib/terminal-env.js +86 -0
- package/neural-interface/lib/ui-blob-store.js +106 -0
- package/neural-interface/lib/vector-cache.js +2 -0
- package/neural-interface/lib/virtual-socket.js +60 -0
- package/neural-interface/lib/whatsapp/api.js +146 -0
- package/neural-interface/lib/whatsapp/auth-store.js +389 -0
- package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
- package/neural-interface/lib/whatsapp/brain.js +128 -0
- package/neural-interface/lib/whatsapp/bridge.js +1499 -0
- package/neural-interface/lib/whatsapp/cards.js +519 -0
- package/neural-interface/lib/whatsapp/commands.js +92 -0
- package/neural-interface/lib/whatsapp/config.js +291 -0
- package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
- package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
- package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
- package/neural-interface/lib/whatsapp/connector/package.json +8 -0
- package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
- package/neural-interface/lib/whatsapp/format.js +552 -0
- package/neural-interface/lib/whatsapp/host-core.js +1225 -0
- package/neural-interface/lib/whatsapp/host.js +119 -0
- package/neural-interface/lib/whatsapp/identity.js +288 -0
- package/neural-interface/lib/whatsapp/inbound.js +149 -0
- package/neural-interface/lib/whatsapp/installer.js +562 -0
- package/neural-interface/lib/whatsapp/manager.js +638 -0
- package/neural-interface/lib/whatsapp/paths.js +81 -0
- package/neural-interface/lib/whatsapp/protocol.js +327 -0
- package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
- package/neural-interface/lib/whatsapp/redact.js +130 -0
- package/neural-interface/lib/whatsapp/service.js +1305 -0
- package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
- package/neural-interface/package-lock.json +4431 -0
- package/neural-interface/package.json +58 -27
- package/neural-interface/public/apple-touch-icon.png +0 -0
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +1 -0
- package/neural-interface/public/favicon-16x16.png +0 -0
- package/neural-interface/public/favicon-32x32.png +0 -0
- package/neural-interface/public/icon-192.png +0 -0
- package/neural-interface/public/icon-512.png +0 -0
- package/neural-interface/public/index.html +32 -182
- package/neural-interface/public/index2d.html +2 -2
- package/neural-interface/public/install-app.html +31 -0
- package/neural-interface/public/logo-synabun.png +0 -0
- package/neural-interface/public/logoHD.png +0 -0
- package/neural-interface/public/manifest.json +2 -0
- package/neural-interface/public/mcp.svg +4 -0
- package/neural-interface/public/offline.html +670 -299
- package/neural-interface/public/onboarding.html +804 -161
- package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
- package/neural-interface/public/shared/agent-runtime-options.js +596 -0
- package/neural-interface/public/shared/api.js +339 -28
- package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
- package/neural-interface/public/shared/assistant/asst-api.js +270 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
- package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
- package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
- package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
- package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
- package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
- package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
- package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
- package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
- package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
- package/neural-interface/public/shared/assistant/asst-state.js +727 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
- package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
- package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
- package/neural-interface/public/shared/automation-context.js +75 -0
- package/neural-interface/public/shared/blob-store.js +99 -0
- package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
- package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
- package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
- package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
- package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
- package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
- package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
- package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
- package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
- package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
- package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
- package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
- package/neural-interface/public/shared/cli-status.js +169 -0
- package/neural-interface/public/shared/command-runner-model.js +30 -0
- package/neural-interface/public/shared/constants.js +22 -5
- package/neural-interface/public/shared/cp/cp-agents.js +186 -0
- package/neural-interface/public/shared/cp/cp-bash.js +252 -0
- package/neural-interface/public/shared/cp/cp-compose.js +159 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
- package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
- package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
- package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
- package/neural-interface/public/shared/cp/cp-diff.js +255 -0
- package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
- package/neural-interface/public/shared/cp/cp-events.js +846 -0
- package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
- package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
- package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
- package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
- package/neural-interface/public/shared/cp/cp-restore.js +224 -0
- package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
- package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
- package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
- package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
- package/neural-interface/public/shared/cp/cp-styles.js +349 -0
- package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
- package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
- package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
- package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
- package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
- package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
- package/neural-interface/public/shared/graph-activity.js +68 -0
- package/neural-interface/public/shared/html-shell.js +116 -17
- package/neural-interface/public/shared/i18n.js +132 -34
- package/neural-interface/public/shared/node-positions-store.js +44 -0
- package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
- package/neural-interface/public/shared/provider-icons.js +30 -0
- package/neural-interface/public/shared/pwa-install-page.js +34 -0
- package/neural-interface/public/shared/pwa-install.css +12 -0
- package/neural-interface/public/shared/pwa-install.js +28 -0
- package/neural-interface/public/shared/session-title.js +100 -0
- package/neural-interface/public/shared/settings/settings-ia.js +389 -0
- package/neural-interface/public/shared/settings/settings-kit.js +234 -0
- package/neural-interface/public/shared/settings/settings-rules.js +160 -0
- package/neural-interface/public/shared/settings/settings-search.js +463 -0
- package/neural-interface/public/shared/settings/settings-shell.js +570 -0
- package/neural-interface/public/shared/start-bridge.js +583 -0
- package/neural-interface/public/shared/state.js +5 -0
- package/neural-interface/public/shared/storage.js +50 -7
- package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
- package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
- package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
- package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
- package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
- package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
- package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
- package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
- package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
- package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
- package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
- package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
- package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
- package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
- package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
- package/neural-interface/public/shared/styles.css +8614 -1477
- package/neural-interface/public/shared/synabun-mascot.js +1625 -0
- package/neural-interface/public/shared/synabun-ticker.js +376 -0
- package/neural-interface/public/shared/term-ready.js +307 -0
- package/neural-interface/public/shared/term-renderer.js +343 -0
- package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
- package/neural-interface/public/shared/ui-assistant.js +77 -0
- package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
- package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
- package/neural-interface/public/shared/ui-codex-panel.js +12 -0
- package/neural-interface/public/shared/ui-command-runner.js +251 -468
- package/neural-interface/public/shared/ui-cost-widget.js +55 -34
- package/neural-interface/public/shared/ui-detail.js +77 -14
- package/neural-interface/public/shared/ui-explorer.js +360 -181
- package/neural-interface/public/shared/ui-file-explorer.js +485 -107
- package/neural-interface/public/shared/ui-help.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +45 -21
- package/neural-interface/public/shared/ui-judgments.js +1346 -0
- package/neural-interface/public/shared/ui-keybinds.js +3 -2
- package/neural-interface/public/shared/ui-link.js +105 -51
- package/neural-interface/public/shared/ui-loading.js +222 -11
- package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
- package/neural-interface/public/shared/ui-menubar.js +100 -31
- package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
- package/neural-interface/public/shared/ui-native-window-id.js +7 -0
- package/neural-interface/public/shared/ui-navbar.js +357 -222
- package/neural-interface/public/shared/ui-notifications.js +58 -12
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
- package/neural-interface/public/shared/ui-panels.js +15 -7
- package/neural-interface/public/shared/ui-resume.js +823 -653
- package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
- package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
- package/neural-interface/public/shared/ui-sessions.js +789 -34
- package/neural-interface/public/shared/ui-settings.js +5774 -2194
- package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
- package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
- package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
- package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
- package/neural-interface/public/shared/ui-skills.js +18 -32
- package/neural-interface/public/shared/ui-styleguide.js +35 -0
- package/neural-interface/public/shared/ui-sync.js +87 -0
- package/neural-interface/public/shared/ui-terminal.js +7863 -6385
- package/neural-interface/public/shared/ui-tool-updates.js +292 -0
- package/neural-interface/public/shared/ui-tooltip.js +156 -15
- package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
- package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
- package/neural-interface/public/shared/ui-tutorial.css +102 -0
- package/neural-interface/public/shared/ui-tutorial.js +557 -1076
- package/neural-interface/public/shared/ui-update.js +420 -68
- package/neural-interface/public/shared/ui-whatsapp.js +941 -0
- package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
- package/neural-interface/public/shared/ui-workspaces.js +2 -1
- package/neural-interface/public/shared/utils.js +58 -0
- package/neural-interface/public/shared/vterm-buffer.js +15 -5
- package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
- package/neural-interface/public/sidepanel-session.html +18 -0
- package/neural-interface/public/sw.js +10 -2
- package/neural-interface/public/synabun.png +0 -0
- package/neural-interface/public/variant/2d/graph.js +1707 -1635
- package/neural-interface/public/variant/2d/lasso.js +2 -1
- package/neural-interface/public/variant/2d/layout.js +595 -594
- package/neural-interface/public/variant/2d/main.js +557 -521
- package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
- package/neural-interface/public/variant/3d/main.js +517 -500
- package/neural-interface/public/variant/3d/map-controls.js +144 -0
- package/neural-interface/public/variant/3d/map-data.js +251 -0
- package/neural-interface/public/variant/3d/map-labels.js +241 -0
- package/neural-interface/public/variant/3d/map-pick.js +90 -0
- package/neural-interface/public/variant/3d/map-renderer.js +521 -0
- package/neural-interface/public/variant/3d/map-shaders.js +158 -0
- package/neural-interface/public/variant/3d/map-view.js +618 -0
- package/neural-interface/public/vendor/three/manifest.json +3 -0
- package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
- package/neural-interface/public/vendor/xterm/manifest.json +3 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
- package/neural-interface/scripts/build-vendor.mjs +64 -0
- package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
- package/neural-interface/scripts/rebuild-pty.js +39 -22
- package/neural-interface/scripts/vendor-three-entry.js +24 -0
- package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
- package/neural-interface/server.js +33983 -15000
- package/neural-interface/skins/default/skin.css +90 -0
- package/neural-interface/skins/default/skin.json +8 -0
- package/neural-interface/templates/rulesets/README.md +9 -0
- package/neural-interface/templates/rulesets/claude.md +3 -0
- package/neural-interface/templates/rulesets/codex.md +2 -0
- package/neural-interface/templates/rulesets/coexistence.md +6 -0
- package/neural-interface/templates/rulesets/core.md +26 -0
- package/neural-interface/templates/rulesets/cursor.md +2 -0
- package/neural-interface/templates/rulesets/gemini.md +2 -0
- package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
- package/neural-interface/templates/rulesets/manifest.json +12 -0
- package/neural-interface/templates/rulesets/opencode.md +2 -0
- package/package.json +131 -53
- package/postinstall.js +55 -26
- package/preuninstall.js +187 -0
- package/scripts/restore-data-home-from-backup.mjs +239 -0
- package/setup.js +872 -260
- package/skills/leonardo/SKILL.md +19 -10
- package/skills/leonardo/modules/image-prompter.md +18 -12
- package/skills/leonardo/modules/video-prompter.md +19 -13
- package/skills/synabun/SKILL.md +209 -185
- package/skills/synabun/icon.png +0 -0
- package/skills/synabun/modules/audit.md +380 -374
- package/skills/synabun/modules/changelog.md +15 -6
- package/skills/synabun/modules/idea.md +148 -144
- package/skills/synabun/modules/memorize.md +13 -4
- package/skills/synabun/modules/schedule.md +198 -0
- package/skills/synabun/synabunicon.png +0 -0
- package/updater.cmd +31 -0
- package/updater.mjs +382 -0
- package/updater.sh +29 -0
- package/hooks/claude-code/test-user-learning.mjs +0 -531
- package/neural-interface/public/claude-chat.css +0 -878
- package/neural-interface/public/claude-chat.html +0 -92
- package/neural-interface/public/claude-chat.js +0 -1168
- package/neural-interface/public/index-legacy.html +0 -14677
- package/neural-interface/public/index2d-legacy.html +0 -8193
- package/neural-interface/public/shared/html-term-renderer.js +0 -1022
- package/neural-interface/public/variant/3d/background.js +0 -884
- package/neural-interface/public/variant/3d/camera.js +0 -661
- package/neural-interface/public/variant/3d/gfx.js +0 -116
- package/neural-interface/public/variant/3d/graph.js +0 -2399
- package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
- package/neural-interface/templates/CLAUDE-template.md +0 -211
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — Remote sessions: what a phone may make the Assistant do
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// An Assistant session driven from outside the desktop (WhatsApp Link) runs
|
|
6
|
+
// under a level, enforced by the runtime, the dispatcher and the brain's hooks:
|
|
7
|
+
// read-only — plan mode at every mode write; no workers (REMOTE_READ_ONLY);
|
|
8
|
+
// a plan is approved on the desktop only.
|
|
9
|
+
// ask — (default) the brain asks before anything plan mode would
|
|
10
|
+
// refuse, user allow rules included; routing always asks (one
|
|
11
|
+
// route card per task is the task's approval); workers get no
|
|
12
|
+
// computer, no "user-authorized-full" and a registered cwd.
|
|
13
|
+
// autonomous — the modes as configured, until autonomousUntil; then ask.
|
|
14
|
+
// Ask and Autonomous hold only on a Claude brain: its in-process PreToolUse
|
|
15
|
+
// hook sees every call with its arguments. A Codex or OpenCode brain runs
|
|
16
|
+
// ordinary commands inside its own sandbox / permissions without asking, so a
|
|
17
|
+
// remote session on one is read-only whatever the configured level
|
|
18
|
+
// (remoteBrainLimited; the registry carries the session's brain provider).
|
|
19
|
+
// Every level: isDeniedRemoteTool refuses commands and paths that reach
|
|
20
|
+
// credentials, the WhatsApp link itself, SynaBun's own state, persistence
|
|
21
|
+
// points (shell rc files, LaunchAgents, crontab) and browser profiles. That
|
|
22
|
+
// list is lexical — a speed bump, not a sandbox: a shell that builds a path at
|
|
23
|
+
// run time gets past it (docs/whatsapp.md, SECURITY.md).
|
|
24
|
+
// A call whose arguments the host did not pass is refused (argsComplete).
|
|
25
|
+
//
|
|
26
|
+
// Computer use (the Assistant's own computer tools) is off unless the owner
|
|
27
|
+
// turned on its switch at this computer (the policy's `computerUse`), and then
|
|
28
|
+
// only as remoteComputerUse says: unasked while Autonomous is active, after
|
|
29
|
+
// one yes per turn at Ask, never at Read-only, while paused or on a Codex /
|
|
30
|
+
// OpenCode brain. That function is the one place that decides; the runtime,
|
|
31
|
+
// the brain's hook, the desktop gate, the persona and the panel all ask it.
|
|
32
|
+
// A worker dispatched from a remote session never gets computer use
|
|
33
|
+
// (clampDispatchSpec), at any level.
|
|
34
|
+
//
|
|
35
|
+
// The registry is in memory. The runtime flags a remote session on its record,
|
|
36
|
+
// so after a restart a session nobody registered again reads as read-only.
|
|
37
|
+
|
|
38
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
39
|
+
import { homedir, platform as osPlatform } from 'node:os';
|
|
40
|
+
import { resolve, relative, isAbsolute } from 'node:path';
|
|
41
|
+
import { isExemptTool } from './assistant-route-gate.js';
|
|
42
|
+
import { resolveWhatsAppPaths } from './whatsapp/paths.js';
|
|
43
|
+
|
|
44
|
+
export const LEVELS = Object.freeze(['read-only', 'ask', 'autonomous']);
|
|
45
|
+
export const DEFAULT_LEVEL = 'ask';
|
|
46
|
+
const RANK = Object.freeze({ 'read-only': 0, ask: 1, autonomous: 2 });
|
|
47
|
+
|
|
48
|
+
/** Brain providers that can hold a remote session at Ask and Autonomous (the in-process hook). */
|
|
49
|
+
export const REMOTE_ENFORCING_PROVIDERS = Object.freeze(['claude-code']);
|
|
50
|
+
const PROVIDER_LABELS = Object.freeze({ 'claude-code': 'Claude', codex: 'Codex', opencode: 'OpenCode' });
|
|
51
|
+
export function providerLabel(provider) { return PROVIDER_LABELS[provider] || String(provider || 'this brain'); }
|
|
52
|
+
/** True for a known brain other than Claude: a remote session on it is read-only. */
|
|
53
|
+
export function remoteBrainLimited(provider) {
|
|
54
|
+
const value = String(provider || '').trim();
|
|
55
|
+
return !!value && !REMOTE_ENFORCING_PROVIDERS.includes(value);
|
|
56
|
+
}
|
|
57
|
+
/** What the owner is told (once) when a remote conversation runs read-only because of its brain. */
|
|
58
|
+
export function remoteBrainNotice(provider) {
|
|
59
|
+
return `This conversation runs read-only because its brain is ${providerLabel(provider)}; switch the WhatsApp brain to Claude for Ask/Autonomous.`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** A known level, else `fallback` (read-only: an unknown level fails closed). */
|
|
63
|
+
export function normalizeLevel(level, fallback = 'read-only') {
|
|
64
|
+
return Object.prototype.hasOwnProperty.call(RANK, level) ? level : fallback;
|
|
65
|
+
}
|
|
66
|
+
function lowerOf(a, b) { return RANK[a] <= RANK[b] ? a : b; }
|
|
67
|
+
function toMs(value) {
|
|
68
|
+
if (value === null || value === undefined || value === '') return null;
|
|
69
|
+
const n = typeof value === 'number' ? value : Date.parse(String(value));
|
|
70
|
+
return Number.isFinite(n) ? n : null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class RemotePolicyError extends Error {
|
|
74
|
+
constructor(code, message, status = 409) {
|
|
75
|
+
super(message);
|
|
76
|
+
this.name = 'RemotePolicyError';
|
|
77
|
+
this.code = code;
|
|
78
|
+
this.status = status;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* The level that applies now: null without a policy. Paused reads as
|
|
84
|
+
* read-only, an expired (or never armed) autonomous as ask, a turn whose
|
|
85
|
+
* prompt carried untrusted content is capped at ask, and a session whose brain
|
|
86
|
+
* cannot hold Ask/Autonomous (`provider`, else the policy's brainProvider:
|
|
87
|
+
* Codex, OpenCode) is read-only.
|
|
88
|
+
*/
|
|
89
|
+
export function effectiveLevel(policy, { untrusted = false, now = Date.now(), provider = null } = {}) {
|
|
90
|
+
if (!policy) return null;
|
|
91
|
+
let level = normalizeLevel(policy.level);
|
|
92
|
+
if (policy.paused === true) level = 'read-only';
|
|
93
|
+
if (level === 'autonomous') {
|
|
94
|
+
const until = toMs(policy.autonomousUntil);
|
|
95
|
+
if (!(until > now)) level = 'ask';
|
|
96
|
+
}
|
|
97
|
+
if (untrusted) level = lowerOf(level, 'ask');
|
|
98
|
+
if (remoteBrainLimited(provider || policy.brainProvider)) level = 'read-only';
|
|
99
|
+
return level;
|
|
100
|
+
}
|
|
101
|
+
/** The brain (not the configured level) is what makes this session read-only. */
|
|
102
|
+
export function brainCapsLevel(policy, { provider = null, now = Date.now() } = {}) {
|
|
103
|
+
if (!policy || !remoteBrainLimited(provider || policy.brainProvider)) return false;
|
|
104
|
+
return effectiveLevel({ ...policy, brainProvider: null }, { now }) !== 'read-only';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The approval mode and plan flag a brain may run with. read-only forces plan
|
|
109
|
+
* mode (`planApproved`: the desktop approved the plan, which may then run);
|
|
110
|
+
* ask forces the approval mode to 'default' (every provider asks there);
|
|
111
|
+
* autonomous keeps what was configured.
|
|
112
|
+
*/
|
|
113
|
+
export function clampBrainModes(policy, modes = {}, { untrusted = false, now = Date.now(), planApproved = false } = {}) {
|
|
114
|
+
const permissionMode = modes.permissionMode && modes.permissionMode !== 'plan' ? String(modes.permissionMode) : 'default';
|
|
115
|
+
const planMode = modes.planMode === true || modes.permissionMode === 'plan';
|
|
116
|
+
const level = effectiveLevel(policy, { untrusted, now });
|
|
117
|
+
if (!level || level === 'autonomous') return { permissionMode, planMode };
|
|
118
|
+
if (level === 'ask') return { permissionMode: 'default', planMode };
|
|
119
|
+
return { permissionMode: 'default', planMode: planApproved ? planMode : true };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ── computer use ────────────────────────────────────────────────────────────
|
|
123
|
+
|
|
124
|
+
/** What remoteComputerUse answers: off, after one approval per turn, or unasked. */
|
|
125
|
+
export const COMPUTER_STATES = Object.freeze(['off', 'ask', 'allowed']);
|
|
126
|
+
/** Why: every `reason` remoteComputerUse can give, by state. */
|
|
127
|
+
export const COMPUTER_REASONS = Object.freeze({
|
|
128
|
+
off: Object.freeze(['switch_off', 'brain', 'paused', 'read_only', 'unsupported', 'setup']),
|
|
129
|
+
ask: Object.freeze(['ask', 'autonomous_expired', 'untrusted']),
|
|
130
|
+
allowed: Object.freeze(['autonomous']),
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Computer use for a remote session at this moment → { state, reason, level },
|
|
135
|
+
* or null without a policy (a desktop session: its own toggle decides).
|
|
136
|
+
* off switch_off the owner's switch (Settings → Messages → WhatsApp → Safety) is off
|
|
137
|
+
* brain a Codex / OpenCode brain: it cannot ask before acting (read-only on this channel)
|
|
138
|
+
* paused the channel is paused
|
|
139
|
+
* read_only the Read-only level (or a session nobody registered since a restart)
|
|
140
|
+
* unsupported, setup computer use is not available, or not set up, on this machine (`desktop`)
|
|
141
|
+
* ask ask the Ask level: one yes per turn turns it on for that turn
|
|
142
|
+
* autonomous_expired Autonomous is configured but its window is closed (or was never armed)
|
|
143
|
+
* untrusted Autonomous is active, but this turn carries content the owner did not write
|
|
144
|
+
* allowed autonomous Autonomous is active: the computer tools run unasked
|
|
145
|
+
* `desktop`: { supported, ready } of the desktop service (omitted: not checked).
|
|
146
|
+
* The level is effectiveLevel's, unchanged.
|
|
147
|
+
*/
|
|
148
|
+
export function remoteComputerUse(policy, { untrusted = false, now = Date.now(), provider = null, desktop = null } = {}) {
|
|
149
|
+
if (!policy) return null;
|
|
150
|
+
const level = effectiveLevel(policy, { untrusted, now, provider });
|
|
151
|
+
const off = (reason) => ({ state: 'off', reason, level });
|
|
152
|
+
if (policy.computerUse !== true) return off('switch_off');
|
|
153
|
+
if (remoteBrainLimited(provider || policy.brainProvider)) return off('brain');
|
|
154
|
+
if (policy.paused === true) return off('paused');
|
|
155
|
+
if (level === 'read-only') return off('read_only');
|
|
156
|
+
if (desktop && desktop.supported !== true) return off('unsupported');
|
|
157
|
+
if (desktop && desktop.ready !== true) return off('setup');
|
|
158
|
+
if (level === 'autonomous') return { state: 'allowed', reason: 'autonomous', level };
|
|
159
|
+
// Ask: say why when the owner configured Autonomous.
|
|
160
|
+
let reason = 'ask';
|
|
161
|
+
if (normalizeLevel(policy.level) === 'autonomous') reason = effectiveLevel(policy, { now, provider }) === 'autonomous' ? 'untrusted' : 'autonomous_expired';
|
|
162
|
+
return { state: 'ask', reason, level };
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Where the owner turns computer use on for this channel (the same words everywhere). */
|
|
166
|
+
export const COMPUTER_SWITCH_PATH = 'Settings → Messages → WhatsApp → Safety';
|
|
167
|
+
const COMPUTER_OFF_TEXT = Object.freeze({
|
|
168
|
+
switch_off: `Computer use is off for WhatsApp conversations. The user turns it on in SynaBun on their computer: ${COMPUTER_SWITCH_PATH}.`,
|
|
169
|
+
brain: 'Computer use is off in this WhatsApp conversation: its brain is not Claude, so it runs read-only.',
|
|
170
|
+
paused: 'Computer use is off: WhatsApp is paused.',
|
|
171
|
+
read_only: `Computer use is off at the Read-only level (the level is set in ${COMPUTER_SWITCH_PATH}).`,
|
|
172
|
+
unsupported: 'Computer use is not available on this machine.',
|
|
173
|
+
setup: 'Computer use is not set up on this Mac yet: the user finishes setup with the Computer switch in the Assistant panel.',
|
|
174
|
+
});
|
|
175
|
+
/** What a brain is told when a computer tool is refused (`reason`: remoteComputerUse's, or null). */
|
|
176
|
+
export function remoteComputerDenial(reason = null) {
|
|
177
|
+
return COMPUTER_OFF_TEXT[reason] || 'Computer use is not available from WhatsApp right now.';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/** The route mode a remote session runs: below autonomous every task is approved on its route card. */
|
|
181
|
+
export function clampRouteMode(policy, mode, opts = {}) {
|
|
182
|
+
const level = effectiveLevel(policy, opts);
|
|
183
|
+
if (!level || level === 'autonomous') return mode;
|
|
184
|
+
return 'always-ask';
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Worker permission requests of this session are the user's to answer (never the brain's). */
|
|
188
|
+
export function requiresHumanApproval(policy, opts = {}) {
|
|
189
|
+
const level = effectiveLevel(policy, opts);
|
|
190
|
+
return !!level && level !== 'autonomous' && policy?.strictWorkerApprovals === true;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ── registered projects ─────────────────────────────────────────────────────
|
|
194
|
+
|
|
195
|
+
/** The project paths SynaBun knows (DATA_HOME/data/claude-code-projects.json). */
|
|
196
|
+
export function readRegisteredProjects({ dataHome = defaultDataHome() } = {}) {
|
|
197
|
+
try {
|
|
198
|
+
const path = resolve(dataHome, 'data', 'claude-code-projects.json');
|
|
199
|
+
if (!existsSync(path)) return [];
|
|
200
|
+
const rows = JSON.parse(readFileSync(path, 'utf8'));
|
|
201
|
+
return (Array.isArray(rows) ? rows : []).map((row) => (typeof row === 'string' ? row : row?.path)).filter(Boolean).map(String);
|
|
202
|
+
} catch { return []; }
|
|
203
|
+
}
|
|
204
|
+
function inside(child, parent) {
|
|
205
|
+
const rel = relative(resolve(parent), resolve(child));
|
|
206
|
+
return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
|
|
207
|
+
}
|
|
208
|
+
/** A worker cwd inside a registered project, never the home directory or anything above it. */
|
|
209
|
+
export function remoteCwdAllowed(cwd, registeredProjects = [], { home = homedir() } = {}) {
|
|
210
|
+
const text = String(cwd || '').trim();
|
|
211
|
+
if (!text || !isAbsolute(text)) return false;
|
|
212
|
+
const path = resolve(text);
|
|
213
|
+
if (inside(home, path)) return false; // $HOME itself, or a parent of it
|
|
214
|
+
return (registeredProjects || []).some((project) => {
|
|
215
|
+
const root = typeof project === 'string' ? project : project?.path;
|
|
216
|
+
if (!root || !isAbsolute(String(root))) return false;
|
|
217
|
+
if (inside(home, root)) return false; // a "project" at $HOME never counts
|
|
218
|
+
return inside(path, root);
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* The dispatch a remote session may start: throws REMOTE_READ_ONLY (read-only)
|
|
224
|
+
* or REMOTE_CWD_NOT_ALLOWED (ask, cwd outside the registered projects); else a
|
|
225
|
+
* copy with computer use off, and at ask no "user-authorized-full" and, with
|
|
226
|
+
* strict worker approvals, permissionPolicy 'ask' (Codex has no approval
|
|
227
|
+
* channel: capability 'read-only' + policy 'restricted'). `notes` collects what changed.
|
|
228
|
+
*/
|
|
229
|
+
export function clampDispatchSpec(policy, spec = {}, { registeredProjects = [], defaultCwd = null, home = homedir(), untrusted = false, now = Date.now(), notes = null } = {}) {
|
|
230
|
+
if (!policy) return spec;
|
|
231
|
+
const level = effectiveLevel(policy, { untrusted, now });
|
|
232
|
+
const note = (text) => { if (Array.isArray(notes) && !notes.includes(text)) notes.push(text); };
|
|
233
|
+
if (level === 'read-only') {
|
|
234
|
+
const fix = brainCapsLevel(policy, { now })
|
|
235
|
+
? `its brain is ${providerLabel(policy.brainProvider)}, which cannot ask before acting (switch the WhatsApp brain to Claude for Ask/Autonomous)`
|
|
236
|
+
: 'raise the level in Settings → WhatsApp';
|
|
237
|
+
throw new RemotePolicyError('REMOTE_READ_ONLY', `This session is driven from ${channelLabel(policy)} at the Read-only level, so it cannot start workers. Answer from what you can read, or ask the user to run it from SynaBun on their computer (${fix}).`);
|
|
238
|
+
}
|
|
239
|
+
const out = { ...spec };
|
|
240
|
+
if (out.usesComputer === true || out.usesComputer === 'true') note(`computer use is off for ${channelLabel(policy)} sessions`);
|
|
241
|
+
out.usesComputer = false;
|
|
242
|
+
if (level !== 'ask') return out;
|
|
243
|
+
const tags = Array.isArray(out.tags) ? out.tags.map(String) : [];
|
|
244
|
+
if (tags.includes('user-authorized-full')) {
|
|
245
|
+
out.tags = tags.filter((tag) => tag !== 'user-authorized-full');
|
|
246
|
+
note('tag "user-authorized-full" dropped (only the desktop can authorize it)');
|
|
247
|
+
}
|
|
248
|
+
const cwd = String(out.cwd || out.project || defaultCwd || '').trim();
|
|
249
|
+
if (!remoteCwdAllowed(cwd, registeredProjects, { home })) {
|
|
250
|
+
throw new RemotePolicyError('REMOTE_CWD_NOT_ALLOWED', `A worker started from ${channelLabel(policy)} must run inside a registered project${cwd ? ` (not ${cwd})` : ''}. Use one of the registered project paths as cwd.`);
|
|
251
|
+
}
|
|
252
|
+
out.cwd = cwd;
|
|
253
|
+
if (policy.strictWorkerApprovals === true) {
|
|
254
|
+
if (String(out.provider || '').trim().toLowerCase() === 'codex') {
|
|
255
|
+
out.capability = 'read-only';
|
|
256
|
+
out.permissionPolicy = 'restricted';
|
|
257
|
+
note('strict worker approvals: Codex runs read-only (it has no approval channel)');
|
|
258
|
+
} else {
|
|
259
|
+
out.permissionPolicy = 'ask';
|
|
260
|
+
note('strict worker approvals: every permission request goes to the user');
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return out;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** Whether a live run of this session goes past what the policy allows now (a lowered level stops it). */
|
|
267
|
+
export function runExceedsPolicy(policy, run = {}, { registeredProjects = [], home = homedir(), now = Date.now() } = {}) {
|
|
268
|
+
const level = effectiveLevel(policy, { now });
|
|
269
|
+
if (!level) return false;
|
|
270
|
+
if (level === 'read-only') return true;
|
|
271
|
+
if (run.usesComputer === true) return true;
|
|
272
|
+
if (level !== 'ask') return false;
|
|
273
|
+
if ((run.tags || []).includes('user-authorized-full')) return true;
|
|
274
|
+
if (run.cwd && !remoteCwdAllowed(run.cwd, registeredProjects, { home })) return true;
|
|
275
|
+
if (policy.strictWorkerApprovals === true) {
|
|
276
|
+
if (run.provider === 'codex') return run.capability !== 'read-only';
|
|
277
|
+
return run.permissionPolicy !== 'ask';
|
|
278
|
+
}
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function channelLabel(policy) { return policy?.channel === 'whatsapp' || !policy?.channel ? 'WhatsApp' : String(policy.channel); }
|
|
283
|
+
|
|
284
|
+
// ── tools a remote session never runs ───────────────────────────────────────
|
|
285
|
+
|
|
286
|
+
function defaultDataHome(env = process.env) {
|
|
287
|
+
if (env.SYNABUN_DATA_HOME) return resolve(env.SYNABUN_DATA_HOME);
|
|
288
|
+
if (osPlatform() === 'win32' && env.APPDATA) return resolve(env.APPDATA, 'synabun');
|
|
289
|
+
return resolve(homedir(), '.synabun');
|
|
290
|
+
}
|
|
291
|
+
/** Every place the WhatsApp Link may keep its session and connector (lib/whatsapp/paths.js), the refused override too. */
|
|
292
|
+
function whatsappLocations(dataHome, env, platform) {
|
|
293
|
+
const out = [];
|
|
294
|
+
try {
|
|
295
|
+
const wa = resolveWhatsAppPaths({ dataHome, env, platform });
|
|
296
|
+
out.push(wa.waHome, wa.defaultWaHome, wa.runtimeDir, wa.stagingDir);
|
|
297
|
+
} catch {}
|
|
298
|
+
const override = typeof env.SYNABUN_WHATSAPP_HOME === 'string' ? env.SYNABUN_WHATSAPP_HOME.trim() : '';
|
|
299
|
+
if (override) out.push(resolve(override));
|
|
300
|
+
if (env.LOCALAPPDATA) out.push(resolve(env.LOCALAPPDATA, 'synabun', 'whatsapp'));
|
|
301
|
+
out.push(resolve(dataHome, 'whatsapp'), resolve(dataHome, 'runtime', 'whatsapp'));
|
|
302
|
+
return [...new Set(out.filter(Boolean))];
|
|
303
|
+
}
|
|
304
|
+
const slash = (value) => String(value || '').replace(/\\/g, '/').replace(/\/{2,}/g, '/').toLowerCase();
|
|
305
|
+
const escapeRe = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
306
|
+
/** `a/./b` → `a/b`, `a/x/../b` → `a/b` (lexically, as a shell would hand them to the kernel). */
|
|
307
|
+
function dotSegments(text) {
|
|
308
|
+
let out = text.replace(/\/\.(?=\/|$|[\s"'])/g, '');
|
|
309
|
+
for (let i = 0; i < 32; i += 1) {
|
|
310
|
+
const next = out.replace(/\/(?!\.\.(?:\/|$))[^/\s"'`;&|()]+\/\.\.(?=\/|$|[\s"'`;&|()])/, '');
|
|
311
|
+
if (next === out) break;
|
|
312
|
+
out = next;
|
|
313
|
+
}
|
|
314
|
+
return out;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* The spellings of one value to check: as written (Windows separators turned
|
|
318
|
+
* into /), and with shell quoting and backslash escapes removed; each with ~,
|
|
319
|
+
* $HOME and ${HOME} expanded and dot segments resolved.
|
|
320
|
+
*/
|
|
321
|
+
function spellings(raw, homeSlash) {
|
|
322
|
+
const expand = (text) => dotSegments(text
|
|
323
|
+
.replace(/\$\{home\}|\$home\b/g, homeSlash)
|
|
324
|
+
.replace(/(^|[\s"'=:(])~(?=\/|$)/g, `$1${homeSlash}`));
|
|
325
|
+
const written = slash(raw);
|
|
326
|
+
const unquoted = slash(String(raw).replace(/\\(.)/g, '$1').replace(/["']/g, ''));
|
|
327
|
+
return [...new Set([expand(written), expand(unquoted)])];
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// A dotfile or a directory as a path segment (`~/.ssh`, `.aws/credentials`, `"$HOME/.netrc"`).
|
|
331
|
+
const segment = (name) => `(?:^|[^a-z0-9_.-])${escapeRe(name)}(?=$|[^a-z0-9_-])`;
|
|
332
|
+
// A program in command position (start, after ; & | ( ` or a wrapper such as sudo).
|
|
333
|
+
const program = (name) => `(?:^|[;&|(\`\\n]\\s*|\\b(?:sudo|env|xargs|nohup|exec|command|time|nice)\\s+)${escapeRe(name)}\\b`;
|
|
334
|
+
|
|
335
|
+
const DENIED_PATTERNS = [
|
|
336
|
+
{ re: new RegExp(segment('.ssh')), why: 'SSH keys' },
|
|
337
|
+
{ re: /\bid_(?:rsa|dsa|ecdsa|ed25519)(?:_sk)?\b/, why: 'SSH keys' },
|
|
338
|
+
{ re: /\bauthorized_keys2?\b/, why: 'SSH authorized_keys' },
|
|
339
|
+
{ re: new RegExp(segment('.aws')), why: 'AWS credentials' },
|
|
340
|
+
{ re: /(?:^|[^a-z0-9_-])\.config\/gh(?=$|[^a-z0-9_-])/, why: 'GitHub CLI credentials' },
|
|
341
|
+
{ re: new RegExp(segment('.npmrc')), why: 'npm credentials' },
|
|
342
|
+
{ re: new RegExp(segment('.netrc')), why: '.netrc credentials' },
|
|
343
|
+
{ re: new RegExp(segment('.git-credentials')), why: 'git credentials' },
|
|
344
|
+
{ re: new RegExp(segment('.gnupg')), why: 'GnuPG keys' },
|
|
345
|
+
{ re: /(?:^|[^a-z0-9_-])\.docker\/config\.json\b/, why: 'Docker credentials' },
|
|
346
|
+
{ re: /(?:^|[^a-z0-9_-])\.kube\/config\b/, why: 'Kubernetes credentials' },
|
|
347
|
+
{ re: /\.credentials\.json\b/, why: 'Claude credentials' },
|
|
348
|
+
{ re: /(?:^|[^a-z0-9_-])\.claude\/settings[^/\s"']*\.json\b/, why: 'Claude settings' },
|
|
349
|
+
{ re: /(?:^|[^a-z0-9_-])\.codex\/(?:auth\.json|config\.toml)\b/, why: 'Codex credentials' },
|
|
350
|
+
{ re: /\bmcp-api-key\.json\b/, why: 'the SynaBun MCP key' },
|
|
351
|
+
{ re: /\/library\/keychains\b|\.keychain(?:-db)?\b/, why: 'keychains' },
|
|
352
|
+
{ re: new RegExp(`${program('security')}\\s+(?:find-|dump-keychain|export|unlock-keychain|delete-|add-(?:generic|internet)-password|set-(?:generic|internet)-password|import)`), why: 'keychains' },
|
|
353
|
+
{ re: /library\/application support\/(?:google\/chrome|chromium|bravesoftware|microsoft edge|arc|vivaldi|firefox|opera)|\/library\/safari\b|\/library\/cookies\b|\.mozilla\/firefox|\.config\/(?:google-chrome|chromium|bravesoftware|microsoft-edge|vivaldi)\b|\bbrowser-profiles\b|\blogin data\b|\bcookies\.(?:sqlite|binarycookies)\b/, why: 'browser profiles' },
|
|
354
|
+
{ re: new RegExp(['.zshrc', '.zshenv', '.zprofile', '.zlogin', '.zlogout', '.bashrc', '.bash_profile', '.bash_login', '.bash_logout', '.profile', '.kshrc', '.cshrc', '.tcshrc'].map(segment).join('|')), why: 'shell startup files' },
|
|
355
|
+
{ re: /(?:^|[^a-z0-9_-])\.config\/fish\/(?:config\.fish|conf\.d)\b/, why: 'shell startup files' },
|
|
356
|
+
{ re: /\blaunch(?:agents|daemons)\b/, why: 'LaunchAgents' },
|
|
357
|
+
{ re: new RegExp(program('launchctl')), why: 'LaunchAgents' },
|
|
358
|
+
{ re: new RegExp(program('crontab')), why: 'crontab' },
|
|
359
|
+
{ re: /\/etc\/cron|\/var\/at\/tabs|\/usr\/lib\/cron|\/var\/spool\/cron/, why: 'crontab' },
|
|
360
|
+
{ re: /\/api\/whatsapp\b/, why: 'the WhatsApp link' },
|
|
361
|
+
{ re: /(?:^|[^a-z0-9_-])runtime\/whatsapp\b/, why: 'the WhatsApp link' },
|
|
362
|
+
{ re: /(?:^|[^a-z0-9_-])\.?synabun\/whatsapp\b/, why: 'the WhatsApp link' },
|
|
363
|
+
// The session store by name, wherever it sits (a relative path, a moved home): state.db and its -wal/-shm/-journal.
|
|
364
|
+
{ re: /(?:^|[^a-z0-9_.-])state\.db(?:-(?:wal|shm|journal))?(?=$|[^a-z0-9_.-])/, why: 'the WhatsApp login (state.db)' },
|
|
365
|
+
{ re: /(?:^|[^a-z0-9_.-])whatsapp\/auth(?=$|[^a-z0-9_.-])/, why: 'the WhatsApp login' },
|
|
366
|
+
// SynaBun's own state: the config rows (the WhatsApp level lives in kv_config) and the registered projects.
|
|
367
|
+
{ re: /\b(?:kv_config|whatsapp_config)\b/, why: 'SynaBun settings' },
|
|
368
|
+
{ re: /\bclaude-code-projects\.json\b/, why: 'SynaBun settings' },
|
|
369
|
+
];
|
|
370
|
+
|
|
371
|
+
// Built-in tools (Claude's, OpenCode's lower-case ones): the input keys that name a path or a command (never file contents).
|
|
372
|
+
const BUILTIN_KEYS = {
|
|
373
|
+
bash: ['command'], powershell: ['command'], bashoutput: [],
|
|
374
|
+
read: ['file_path', 'filePath', 'filepath', 'path'], write: ['file_path', 'filePath', 'filepath', 'path'],
|
|
375
|
+
edit: ['file_path', 'filePath', 'filepath', 'path'], multiedit: ['file_path', 'filePath', 'filepath', 'path'],
|
|
376
|
+
notebookedit: ['notebook_path', 'notebookPath', 'path'], notebookread: ['notebook_path', 'notebookPath', 'path'], ls: ['path'],
|
|
377
|
+
glob: ['pattern', 'path'], grep: ['path', 'glob'],
|
|
378
|
+
};
|
|
379
|
+
// Built-ins whose check needs one of their keys: a call without any is refused (its target is unknown).
|
|
380
|
+
const REQUIRED_KEYS = {
|
|
381
|
+
bash: ['command'], powershell: ['command'],
|
|
382
|
+
read: BUILTIN_KEYS.read, write: BUILTIN_KEYS.write, edit: BUILTIN_KEYS.edit, multiedit: BUILTIN_KEYS.multiedit,
|
|
383
|
+
notebookedit: BUILTIN_KEYS.notebookedit, notebookread: BUILTIN_KEYS.notebookread, ls: ['path'], glob: ['pattern', 'path'],
|
|
384
|
+
};
|
|
385
|
+
// Any tool: string values under keys that look like a path, a command or a URL (camelCase keys too: filePath, localFilePath).
|
|
386
|
+
const PATHISH_KEY = /(?:^|_|-)(?:path|paths|file|files|filepath|filename|dir|directory|cwd|workdir|command|commands|cmd|url|urls|uri|src|source|dest|destination|target|glob|location)$/i;
|
|
387
|
+
const pathishKey = (key) => PATHISH_KEY.test(String(key).replace(/([a-z0-9])([A-Z])/g, '$1_$2'));
|
|
388
|
+
// The longest value checked; a longer one is refused rather than checked in part.
|
|
389
|
+
const MAX_VALUE_CHARS = 20_000;
|
|
390
|
+
|
|
391
|
+
function collect(value, keyHint, out, depth, pathish) {
|
|
392
|
+
if (depth > 5) { out.overflow = true; return; }
|
|
393
|
+
if (out.length >= 64) { out.overflow = true; return; }
|
|
394
|
+
if (value === null || value === undefined) return;
|
|
395
|
+
if (typeof value === 'string') {
|
|
396
|
+
if (keyHint && !pathish(keyHint)) return;
|
|
397
|
+
if (value.length > MAX_VALUE_CHARS) out.overflow = true;
|
|
398
|
+
else out.push(value);
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
if (Array.isArray(value)) {
|
|
402
|
+
if (value.length > 64) out.overflow = true;
|
|
403
|
+
for (const item of value.slice(0, 64)) collect(item, keyHint, out, depth + 1, pathish);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
if (typeof value === 'object') {
|
|
407
|
+
const entries = Object.entries(value);
|
|
408
|
+
if (entries.length > 64) out.overflow = true;
|
|
409
|
+
for (const [key, item] of entries.slice(0, 64)) collect(item, key, out, depth + 1, pathish);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/** Computer-use tools under any host's name (mcp__SynaBun__computer*, SynaBun_computer*, bare). */
|
|
414
|
+
export function isComputerTool(name) {
|
|
415
|
+
const text = String(name || '');
|
|
416
|
+
return /^mcp__synabun__computer/i.test(text) || /^synabun_computer/i.test(text) || /^computer(?:_apps|_ax|_status)?$/i.test(text);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Why a remote session may not run this tool call, else null. `paths`
|
|
421
|
+
* overrides the locations (tests): { home, dataHome, waHome, env, platform }.
|
|
422
|
+
* `argsComplete: false` says the host did not pass the call's arguments:
|
|
423
|
+
* anything but SynaBun's own coordination tools is then refused (fail closed).
|
|
424
|
+
* A computer tool is refused unless the caller passes `computerAllowed: true`
|
|
425
|
+
* (the runtime, when remoteComputerUse allows this turn); `computerReason`
|
|
426
|
+
* (remoteComputerUse's reason) words the refusal.
|
|
427
|
+
*/
|
|
428
|
+
export function remoteToolDenial(name, input = {}, { home = homedir(), dataHome = null, waHome = null, env = process.env, platform = osPlatform(), argsComplete = true, computerAllowed = false, computerReason = null } = {}) {
|
|
429
|
+
const tool = String(name || '');
|
|
430
|
+
if (isComputerTool(tool) && computerAllowed !== true) return remoteComputerDenial(computerReason);
|
|
431
|
+
const unseen = `${tool}: SynaBun could not see this call's arguments, so a remote session does not run it.`;
|
|
432
|
+
const hasArgs = input !== null && typeof input === 'object' && !Array.isArray(input);
|
|
433
|
+
if ((argsComplete === false || !hasArgs) && !isExemptTool(tool)) return unseen;
|
|
434
|
+
const args = hasArgs ? input : {};
|
|
435
|
+
const lower = tool.toLowerCase();
|
|
436
|
+
const required = REQUIRED_KEYS[lower];
|
|
437
|
+
const present = (key) => { const value = args[key]; return (typeof value === 'string' && value.trim() !== '') || (Array.isArray(value) && value.length > 0); };
|
|
438
|
+
if (required && !required.some(present)) return unseen;
|
|
439
|
+
const values = [];
|
|
440
|
+
for (const key of BUILTIN_KEYS[lower] || []) collect(args[key], null, values, 0, () => true);
|
|
441
|
+
collect(args, null, values, 0, pathishKey);
|
|
442
|
+
if (values.overflow) return `${tool}: the call is too long for SynaBun to check, so a remote session does not run it.`;
|
|
443
|
+
if (!values.length) return null;
|
|
444
|
+
const data = dataHome ? resolve(dataHome) : defaultDataHome(env);
|
|
445
|
+
const homeSlash = slash(home);
|
|
446
|
+
const specific = [
|
|
447
|
+
...(waHome ? [resolve(waHome)] : whatsappLocations(data, env, platform)).map((path) => ({ path: slash(path), why: 'the WhatsApp link' })),
|
|
448
|
+
{ path: slash(resolve(data, '.env')), why: 'SynaBun secrets (.env)' },
|
|
449
|
+
{ path: slash(resolve(data, 'data', 'browser-profiles')), why: 'browser profiles' },
|
|
450
|
+
];
|
|
451
|
+
for (const raw of values) {
|
|
452
|
+
for (const text of spellings(raw, homeSlash)) {
|
|
453
|
+
for (const { path, why } of specific) if (path && text.includes(path)) return `${tool} touches ${why}, which a remote session never reaches.`;
|
|
454
|
+
for (const { re, why } of DENIED_PATTERNS) if (re.test(text)) return `${tool} touches ${why}, which a remote session never reaches.`;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/** True when a remote session must not run this tool call at any level. */
|
|
461
|
+
export function isDeniedRemoteTool(name, input = {}, paths = {}) {
|
|
462
|
+
return remoteToolDenial(name, input, paths) !== null;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
// ── registry ────────────────────────────────────────────────────────────────
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Per-session policies. `markRemote` records a session the runtime flagged on
|
|
469
|
+
* its record: without a registered policy it reads as read-only (fail closed),
|
|
470
|
+
* computer use off.
|
|
471
|
+
* `setSessionBrain` records the session's brain provider (the runtime sets it
|
|
472
|
+
* whenever the brain changes): it rides on every policy as `brainProvider`, so
|
|
473
|
+
* effectiveLevel caps a Codex / OpenCode session at read-only for every reader.
|
|
474
|
+
*/
|
|
475
|
+
export function createRemotePolicyRegistry({ now = Date.now } = {}) {
|
|
476
|
+
const policies = new Map(); // sessionId → policy
|
|
477
|
+
const flagged = new Map(); // sessionId → { channel }
|
|
478
|
+
const brains = new Map(); // sessionId → brain provider
|
|
479
|
+
const listeners = new Set();
|
|
480
|
+
const key = (id) => String(id ?? '').trim();
|
|
481
|
+
function notify(sessionId, previous) {
|
|
482
|
+
const policy = getSessionPolicy(sessionId);
|
|
483
|
+
for (const listener of [...listeners]) { try { listener({ sessionId, policy, previous }); } catch {} }
|
|
484
|
+
}
|
|
485
|
+
function withBrain(sessionId, policy) {
|
|
486
|
+
return Object.freeze({ ...policy, brainProvider: brains.get(sessionId) || null });
|
|
487
|
+
}
|
|
488
|
+
function registerSessionPolicy(id, { level = DEFAULT_LEVEL, channel = 'whatsapp', autonomousUntil = null, strictWorkerApprovals = false, paused = false, computerUse = false } = {}) {
|
|
489
|
+
const sessionId = key(id);
|
|
490
|
+
if (!sessionId) throw new RemotePolicyError('SESSION_REQUIRED', 'registerSessionPolicy needs a session id', 400);
|
|
491
|
+
const previous = getSessionPolicy(sessionId);
|
|
492
|
+
const policy = Object.freeze({
|
|
493
|
+
sessionId, level: normalizeLevel(level), channel: String(channel || 'whatsapp'),
|
|
494
|
+
autonomousUntil: toMs(autonomousUntil), strictWorkerApprovals: strictWorkerApprovals === true, paused: paused === true,
|
|
495
|
+
// The owner's switch for computer use on this channel: only ever true when it was turned on at this computer.
|
|
496
|
+
computerUse: computerUse === true,
|
|
497
|
+
registeredAt: now(),
|
|
498
|
+
});
|
|
499
|
+
policies.set(sessionId, policy);
|
|
500
|
+
flagged.set(sessionId, { channel: policy.channel });
|
|
501
|
+
notify(sessionId, previous);
|
|
502
|
+
return withBrain(sessionId, policy);
|
|
503
|
+
}
|
|
504
|
+
/** The session stays flagged: it reads as read-only until registered again. */
|
|
505
|
+
function clearSessionPolicy(id) {
|
|
506
|
+
const sessionId = key(id);
|
|
507
|
+
const previous = policies.has(sessionId) ? getSessionPolicy(sessionId) : null;
|
|
508
|
+
if (!previous) return false;
|
|
509
|
+
policies.delete(sessionId);
|
|
510
|
+
notify(sessionId, previous);
|
|
511
|
+
return true;
|
|
512
|
+
}
|
|
513
|
+
function getSessionPolicy(id) {
|
|
514
|
+
const sessionId = key(id);
|
|
515
|
+
if (!sessionId) return null;
|
|
516
|
+
const policy = policies.get(sessionId);
|
|
517
|
+
if (policy) return withBrain(sessionId, policy);
|
|
518
|
+
const flag = flagged.get(sessionId);
|
|
519
|
+
if (!flag) return null;
|
|
520
|
+
return withBrain(sessionId, { sessionId, level: 'read-only', channel: flag.channel, autonomousUntil: null, strictWorkerApprovals: true, paused: false, computerUse: false, registeredAt: null, failClosed: true });
|
|
521
|
+
}
|
|
522
|
+
function markRemote(id, { channel = 'whatsapp' } = {}) {
|
|
523
|
+
const sessionId = key(id);
|
|
524
|
+
if (!sessionId) return;
|
|
525
|
+
if (!flagged.has(sessionId)) flagged.set(sessionId, { channel: String(channel || 'whatsapp') });
|
|
526
|
+
}
|
|
527
|
+
/** The session's brain provider changed (null clears it): a remote session's listeners hear it. */
|
|
528
|
+
function setSessionBrain(id, provider) {
|
|
529
|
+
const sessionId = key(id);
|
|
530
|
+
if (!sessionId) return;
|
|
531
|
+
const next = provider ? String(provider) : null;
|
|
532
|
+
if ((brains.get(sessionId) || null) === next) return;
|
|
533
|
+
const previous = getSessionPolicy(sessionId);
|
|
534
|
+
if (next) brains.set(sessionId, next); else brains.delete(sessionId);
|
|
535
|
+
if (previous) notify(sessionId, previous);
|
|
536
|
+
}
|
|
537
|
+
/** The session is gone (destroyed): forget it entirely. */
|
|
538
|
+
function forgetSession(id) {
|
|
539
|
+
const sessionId = key(id);
|
|
540
|
+
policies.delete(sessionId);
|
|
541
|
+
flagged.delete(sessionId);
|
|
542
|
+
brains.delete(sessionId);
|
|
543
|
+
}
|
|
544
|
+
function isRemote(id) { const sessionId = key(id); return policies.has(sessionId) || flagged.has(sessionId); }
|
|
545
|
+
function subscribe(listener) {
|
|
546
|
+
if (typeof listener !== 'function') throw new Error('subscribe requires a function');
|
|
547
|
+
listeners.add(listener);
|
|
548
|
+
return () => listeners.delete(listener);
|
|
549
|
+
}
|
|
550
|
+
function list() { return [...new Set([...policies.keys(), ...flagged.keys()])].map((id) => getSessionPolicy(id)); }
|
|
551
|
+
return { registerSessionPolicy, clearSessionPolicy, getSessionPolicy, markRemote, setSessionBrain, forgetSession, isRemote, subscribe, list };
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// The process-wide registry the runtime, the dispatcher and the WhatsApp bridge share.
|
|
555
|
+
export const defaultRemotePolicyRegistry = createRemotePolicyRegistry();
|
|
556
|
+
export function registerSessionPolicy(id, options) { return defaultRemotePolicyRegistry.registerSessionPolicy(id, options); }
|
|
557
|
+
export function clearSessionPolicy(id) { return defaultRemotePolicyRegistry.clearSessionPolicy(id); }
|
|
558
|
+
export function getSessionPolicy(id) { return defaultRemotePolicyRegistry.getSessionPolicy(id); }
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* The phone's authority over computer use, as a capability instead of a string.
|
|
562
|
+
*
|
|
563
|
+
* `origin: 'whatsapp'` is text any caller in this process can write, so it says who is recorded in
|
|
564
|
+
* the audit and nothing more. What may grant computer use from a WhatsApp conversation (the yes of
|
|
565
|
+
* a turn, the Mac part of a marked route card, and a turn that counts as the owner's own plain
|
|
566
|
+
* message from the phone) is the holder of the capability this returns.
|
|
567
|
+
*
|
|
568
|
+
* The composition root makes ONE of these and splits it: `verify` goes to the Assistant runtime,
|
|
569
|
+
* `issue` / `revoke` to the WhatsApp service, which hands a fresh capability to each bridge it
|
|
570
|
+
* builds. A capability is a Symbol: it cannot be guessed, rebuilt from its description, sent over a
|
|
571
|
+
* socket or written to disk. Issuing a new one ends the one before, so at most one holder exists.
|
|
572
|
+
*
|
|
573
|
+
* @returns {{ issue: () => symbol, revoke: () => void, verify: (capability: unknown) => boolean }}
|
|
574
|
+
*/
|
|
575
|
+
export function createPhoneAuthority() {
|
|
576
|
+
let current = null;
|
|
577
|
+
return Object.freeze({
|
|
578
|
+
issue() { current = Symbol('synabun.phone-authority'); return current; },
|
|
579
|
+
revoke() { current = null; },
|
|
580
|
+
verify(capability) { return typeof capability === 'symbol' && current !== null && capability === current; },
|
|
581
|
+
});
|
|
582
|
+
}
|