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
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
import { state, emit, on } from './state.js';
|
|
21
21
|
import { KEYS } from './constants.js';
|
|
22
22
|
import { storage } from './storage.js';
|
|
23
|
+
import { posStore } from './node-positions-store.js';
|
|
23
24
|
import { getVariant } from './registry.js';
|
|
24
25
|
import {
|
|
25
26
|
getOpenCardsSnapshot,
|
|
@@ -60,7 +61,7 @@ function saveWorkspacesToStorage(list) {
|
|
|
60
61
|
|
|
61
62
|
function _readStoredPositions(key) {
|
|
62
63
|
try {
|
|
63
|
-
return JSON.parse(
|
|
64
|
+
return JSON.parse(posStore.getItem(key) || '{}');
|
|
64
65
|
} catch {
|
|
65
66
|
return {};
|
|
66
67
|
}
|
|
@@ -288,6 +288,9 @@ export function createFrameRenderer(canvas, ctx) {
|
|
|
288
288
|
|
|
289
289
|
function flush() {
|
|
290
290
|
if (destroyed || rendering || !pending) return;
|
|
291
|
+
// Tab hidden — skip decode entirely; the latest frame stays in `pending`
|
|
292
|
+
// and draws as soon as render() is called again on a visible tab
|
|
293
|
+
if (document.hidden) return;
|
|
291
294
|
const now = performance.now();
|
|
292
295
|
if (now - lastFrameTime < FRAME_INTERVAL) {
|
|
293
296
|
// Drop frame — too soon since last render
|
|
@@ -358,3 +361,58 @@ export function createFrameRenderer(canvas, ctx) {
|
|
|
358
361
|
destroy() { destroyed = true; pending = null; },
|
|
359
362
|
};
|
|
360
363
|
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Debounce — invoke `fn` only after `wait` ms have elapsed since the last call
|
|
367
|
+
* (trailing edge). Use for input-driven work that shouldn't run per keystroke
|
|
368
|
+
* (filter rebuilds, syntax highlight). The wrapper exposes `.cancel()` to drop a
|
|
369
|
+
* pending call (e.g. on teardown).
|
|
370
|
+
* @param {Function} fn
|
|
371
|
+
* @param {number} wait milliseconds
|
|
372
|
+
* @returns {Function & { cancel(): void }}
|
|
373
|
+
*/
|
|
374
|
+
export function debounce(fn, wait = 120) {
|
|
375
|
+
let timer = null;
|
|
376
|
+
function wrapped(...args) {
|
|
377
|
+
if (timer) clearTimeout(timer);
|
|
378
|
+
timer = setTimeout(() => {
|
|
379
|
+
timer = null;
|
|
380
|
+
fn.apply(this, args);
|
|
381
|
+
}, wait);
|
|
382
|
+
}
|
|
383
|
+
wrapped.cancel = () => {
|
|
384
|
+
if (timer) { clearTimeout(timer); timer = null; }
|
|
385
|
+
};
|
|
386
|
+
return wrapped;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* rAF throttle — coalesce a burst of calls into a single invocation on the next
|
|
391
|
+
* animation frame, always running with the most recent arguments. Ideal for
|
|
392
|
+
* scroll handlers and "rebuild at most once per frame" render coalescing
|
|
393
|
+
* (vsync-aligned, drops redundant work without deferring the visible result by
|
|
394
|
+
* more than one frame). The wrapper exposes `.cancel()` to drop a pending frame.
|
|
395
|
+
* @param {Function} fn
|
|
396
|
+
* @returns {Function & { cancel(): void }}
|
|
397
|
+
*/
|
|
398
|
+
export function rafThrottle(fn) {
|
|
399
|
+
let rafId = null;
|
|
400
|
+
let lastArgs = null;
|
|
401
|
+
let lastThis = null;
|
|
402
|
+
function wrapped(...args) {
|
|
403
|
+
lastArgs = args;
|
|
404
|
+
lastThis = this;
|
|
405
|
+
if (rafId !== null) return;
|
|
406
|
+
rafId = requestAnimationFrame(() => {
|
|
407
|
+
rafId = null;
|
|
408
|
+
const a = lastArgs, t = lastThis;
|
|
409
|
+
lastArgs = lastThis = null;
|
|
410
|
+
fn.apply(t, a);
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
wrapped.cancel = () => {
|
|
414
|
+
if (rafId !== null) { cancelAnimationFrame(rafId); rafId = null; }
|
|
415
|
+
lastArgs = lastThis = null;
|
|
416
|
+
};
|
|
417
|
+
return wrapped;
|
|
418
|
+
}
|
|
@@ -114,7 +114,7 @@ export class VTermBuffer {
|
|
|
114
114
|
* @param {number} cols
|
|
115
115
|
* @param {number} rows
|
|
116
116
|
*/
|
|
117
|
-
constructor(cols, rows) {
|
|
117
|
+
constructor(cols, rows, maxScrollback = MAX_SCROLLBACK) {
|
|
118
118
|
this.cols = cols;
|
|
119
119
|
this.rows = rows;
|
|
120
120
|
|
|
@@ -130,7 +130,7 @@ export class VTermBuffer {
|
|
|
130
130
|
this._buffer = this._mainBuffer;
|
|
131
131
|
|
|
132
132
|
// Scrollback (main buffer only) — circular buffer for O(1) operations
|
|
133
|
-
this._scrollback = new CircularBuffer(
|
|
133
|
+
this._scrollback = new CircularBuffer(maxScrollback);
|
|
134
134
|
|
|
135
135
|
// Cursor state
|
|
136
136
|
this._cursorX = 0;
|
|
@@ -182,9 +182,15 @@ export class VTermBuffer {
|
|
|
182
182
|
|
|
183
183
|
/** Feed raw PTY data */
|
|
184
184
|
write(data) {
|
|
185
|
+
this._writeGen = (this._writeGen || 0) + 1;
|
|
185
186
|
this._parser.parse(data);
|
|
186
187
|
}
|
|
187
188
|
|
|
189
|
+
/** Monotonic generation counter — bumps on every mutation (write/resize).
|
|
190
|
+
* Lets the server memoize rendered snapshots: same generation ⇒ identical
|
|
191
|
+
* buffer contents. Inert on the browser side. */
|
|
192
|
+
get writeGen() { return this._writeGen || 0; }
|
|
193
|
+
|
|
188
194
|
/** Get a row from the visible buffer (0 = top of screen) */
|
|
189
195
|
getRow(idx) {
|
|
190
196
|
if (idx < 0 || idx >= this.rows) return null;
|
|
@@ -221,6 +227,7 @@ export class VTermBuffer {
|
|
|
221
227
|
get cursorX() { return this._cursorX; }
|
|
222
228
|
get cursorY() { return this._cursorY; }
|
|
223
229
|
get cursorVisible() { return this._cursorVisible; }
|
|
230
|
+
get useAltBuffer() { return this._useAlt; }
|
|
224
231
|
get title() { return this._title; }
|
|
225
232
|
get bracketedPaste() { return this._bracketedPaste; }
|
|
226
233
|
get appCursorKeys() { return this._appCursorKeys; }
|
|
@@ -228,6 +235,7 @@ export class VTermBuffer {
|
|
|
228
235
|
/** Resize the terminal */
|
|
229
236
|
resize(cols, rows) {
|
|
230
237
|
if (cols === this.cols && rows === this.rows) return;
|
|
238
|
+
this._writeGen = (this._writeGen || 0) + 1;
|
|
231
239
|
const oldCols = this.cols;
|
|
232
240
|
const oldRows = this.rows;
|
|
233
241
|
this.cols = cols;
|
|
@@ -265,11 +273,13 @@ export class VTermBuffer {
|
|
|
265
273
|
if (!row) continue;
|
|
266
274
|
const s = r === startRow ? startCol : 0;
|
|
267
275
|
const e = r === endRow ? endCol : this.cols - 1;
|
|
268
|
-
|
|
276
|
+
// Array+join instead of += — string concat is O(n²) over wide rows and
|
|
277
|
+
// this runs over the full scrollback for snapshots
|
|
278
|
+
const chars = [];
|
|
269
279
|
for (let c = s; c <= e; c++) {
|
|
270
|
-
|
|
280
|
+
chars.push(row[c]?.char || ' ');
|
|
271
281
|
}
|
|
272
|
-
lines.push(
|
|
282
|
+
lines.push(chars.join('').replace(/\s+$/, ''));
|
|
273
283
|
}
|
|
274
284
|
return lines.join('\n');
|
|
275
285
|
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Phone numbers for the WhatsApp Link. One normaliser shared by the Settings
|
|
2
|
+
// UI (served as a static ES module: no Node imports, no DOM) and the server,
|
|
3
|
+
// so the number the user sees accepted is the number the server stores.
|
|
4
|
+
//
|
|
5
|
+
// normalizePhone takes what people type or paste — spaces of any kind, the
|
|
6
|
+
// invisible direction marks some apps wrap copied numbers in, dashes, dots,
|
|
7
|
+
// brackets, slashes, the "+44 (0)20" optional trunk zero, a 00 international
|
|
8
|
+
// prefix — and returns the bare digits with their country code, or a code the
|
|
9
|
+
// UI turns into a sentence via PHONE_ERRORS. Digits that start with 0 carry no
|
|
10
|
+
// country code (national format, or a "+0…" no country uses): refused, never
|
|
11
|
+
// guessed into some other country's number.
|
|
12
|
+
//
|
|
13
|
+
// maskPhone must return exactly what maskNumber in lib/whatsapp/redact.js
|
|
14
|
+
// returns (tests/whatsapp-phone.test.mjs pins the parity). It is duplicated,
|
|
15
|
+
// not imported, because redact.js runs on Node only.
|
|
16
|
+
|
|
17
|
+
/** Error code → one short sentence for the Settings UI. */
|
|
18
|
+
export const PHONE_ERRORS = Object.freeze({
|
|
19
|
+
NEEDS_COUNTRY_CODE: 'Add your country code first, for example +44 for the UK or +1 for the US.',
|
|
20
|
+
INVALID_CHARS: 'Use digits only; spaces, dashes and brackets are fine.',
|
|
21
|
+
TOO_SHORT: 'That number is too short.',
|
|
22
|
+
TOO_LONG: 'That number is too long (15 digits at most).',
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const MIN_DIGITS = 8;
|
|
26
|
+
const MAX_DIGITS = 15; // E.164
|
|
27
|
+
|
|
28
|
+
// "(0)" — or "( 0 )" — after a country code is the trunk zero dialled only inside the country.
|
|
29
|
+
const TRUNK_ZERO_RE = /\(\s*0\s*\)/g;
|
|
30
|
+
// Whitespace of every kind (NBSP, thin, narrow and ideographic spaces, BOM), zero-width and
|
|
31
|
+
// bidi marks, typographic dashes and the minus sign, and . ( ) / -.
|
|
32
|
+
const SEPARATORS_RE = /[\s---‐-―−.()/-]/g;
|
|
33
|
+
const ASCII_DIGITS_RE = /^[0-9]*$/;
|
|
34
|
+
|
|
35
|
+
function toText(input) {
|
|
36
|
+
try { return String(input ?? ''); } catch { return null; }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Normalise a phone number to international digits. Never throws.
|
|
41
|
+
* @returns {{ ok: true, digits: string, e164: string } | { ok: false, code: 'NEEDS_COUNTRY_CODE' | 'INVALID_CHARS' | 'TOO_SHORT' | 'TOO_LONG' }}
|
|
42
|
+
*/
|
|
43
|
+
export function normalizePhone(input) {
|
|
44
|
+
let text = toText(input);
|
|
45
|
+
if (text === null) return { ok: false, code: 'INVALID_CHARS' };
|
|
46
|
+
text = text.trim()
|
|
47
|
+
.replace(TRUNK_ZERO_RE, (match, offset, whole) => (/[0-9]/.test(whole.slice(0, offset)) ? '' : match))
|
|
48
|
+
.replace(SEPARATORS_RE, '');
|
|
49
|
+
if (text.startsWith('00')) text = `+${text.slice(2)}`;
|
|
50
|
+
if (text.startsWith('0')) return { ok: false, code: 'NEEDS_COUNTRY_CODE' };
|
|
51
|
+
const digits = text.startsWith('+') ? text.slice(1) : text;
|
|
52
|
+
if (!ASCII_DIGITS_RE.test(digits)) return { ok: false, code: 'INVALID_CHARS' };
|
|
53
|
+
if (digits.startsWith('0')) return { ok: false, code: 'NEEDS_COUNTRY_CODE' };
|
|
54
|
+
if (digits.length < MIN_DIGITS) return { ok: false, code: 'TOO_SHORT' };
|
|
55
|
+
if (digits.length > MAX_DIGITS) return { ok: false, code: 'TOO_LONG' };
|
|
56
|
+
return { ok: true, digits, e164: `+${digits}` };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** A phone number for display: never more than the last four digits. */
|
|
60
|
+
export function maskPhone(input) {
|
|
61
|
+
const d = (toText(input) ?? '').replace(/\D/g, '');
|
|
62
|
+
if (d.length >= 8) return `••••${d.slice(-4)}`;
|
|
63
|
+
if (d.length >= 5) return `••${d.slice(-2)}`;
|
|
64
|
+
return '••••';
|
|
65
|
+
}
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// WA-VIEW — what Settings → WhatsApp shows for a status
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Pure (no DOM, no fetch): waView(status) turns GET /api/whatsapp/status into
|
|
6
|
+
// the header and the setup pane — { dot, title, sub, primary, secondary, step,
|
|
7
|
+
// pane, nav } — for every state the service reports, and this file holds every
|
|
8
|
+
// sentence the tab shows, so tests can read them and ui-whatsapp.js only
|
|
9
|
+
// places them. Strings are plain text; the tab escapes whatever it inserts.
|
|
10
|
+
|
|
11
|
+
// ── Translation ──
|
|
12
|
+
// The English in this file is the source text. Without a translator (tests, Node) every string reads as
|
|
13
|
+
// written. Settings installs one with setTranslator((key, english, params) => string); the keys are
|
|
14
|
+
// settings.redesign.wa.<path> (generated by docs/design/settings-redesign/tools/wa_keys.mjs) and `{name}`
|
|
15
|
+
// marks a value filled in at run time.
|
|
16
|
+
let translate = null;
|
|
17
|
+
export function setTranslator(fn) { translate = typeof fn === 'function' ? fn : null; }
|
|
18
|
+
const fill = (text, params) => (params ? String(text).replace(/\{(\w+)\}/g, (m, k) => (params[k] != null ? params[k] : m)) : text);
|
|
19
|
+
const say = (key, english, params) => (translate ? translate(`settings.redesign.wa.${key}`, english, params) : fill(english, params));
|
|
20
|
+
/** One entry of a table of sentences (STAGE_TEXT, ERROR_TEXT …), or its fallback entry. */
|
|
21
|
+
const pick = (prefix, table, id, fallback) => {
|
|
22
|
+
const key = Object.prototype.hasOwnProperty.call(table, id) ? id : fallback;
|
|
23
|
+
return key == null ? '' : say(`${prefix}.${key}`, table[key]);
|
|
24
|
+
};
|
|
25
|
+
const NOT_COPY = new Set(['id', 'value', 'key', 'name']);
|
|
26
|
+
const segment = (v) => String(v).replace(/[^A-Za-z0-9_-]+/g, '');
|
|
27
|
+
/**
|
|
28
|
+
* A copy of a constant in the reader's language. Arrays of objects are keyed by their id / value / key / name,
|
|
29
|
+
* plain arrays by index; identifiers (id, value, key, name) are never translated.
|
|
30
|
+
*/
|
|
31
|
+
export function localize(prefix, data) {
|
|
32
|
+
if (typeof data === 'string') return data ? say(prefix, data) : data;
|
|
33
|
+
if (Array.isArray(data)) {
|
|
34
|
+
return data.map((item, i) => {
|
|
35
|
+
const named = item && typeof item === 'object' && !Array.isArray(item) ? (item.id ?? item.value ?? item.key ?? item.name) : undefined;
|
|
36
|
+
return localize(`${prefix}.${named != null ? segment(named) : i}`, item);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (data && typeof data === 'object') return Object.fromEntries(Object.entries(data).map(([k, v]) => [k, NOT_COPY.has(k) ? v : localize(`${prefix}.${k}`, v)]));
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const TAB_STATES = Object.freeze(['unavailable', 'not_installed', 'installing', 'install_failed', 'ready', 'linking', 'link_expired', 'confirm_owner', 'connected', 'reconnecting', 'paused', 'logged_out', 'error']);
|
|
44
|
+
|
|
45
|
+
export const STEPS = Object.freeze([
|
|
46
|
+
{ id: 'choose', label: 'Choose' },
|
|
47
|
+
{ id: 'install', label: 'Install' },
|
|
48
|
+
{ id: 'link', label: 'Link' },
|
|
49
|
+
{ id: 'confirm', label: 'Confirm' },
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
export const MODE_CARDS = Object.freeze([
|
|
53
|
+
{
|
|
54
|
+
id: 'self',
|
|
55
|
+
title: 'Message yourself',
|
|
56
|
+
badge: 'free, one scan',
|
|
57
|
+
body: 'Talk to SynaBun in your own "Message yourself" chat. No second number, nothing to buy: scan one QR code and write.',
|
|
58
|
+
notes: ['SynaBun reads that one chat only; every other chat is ignored.', 'Only messages typed on your phone count: what you type into "Message yourself" from WhatsApp Web or Desktop is ignored.', 'Replies start with "SynaBun:". WhatsApp may not notify you of messages in your own chat.'],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: 'dedicated',
|
|
62
|
+
title: 'A second number',
|
|
63
|
+
badge: 'Safer',
|
|
64
|
+
body: 'Link a spare WhatsApp account (a second SIM, or WhatsApp Business on another number) and chat with it like a contact. Your own account is never linked.',
|
|
65
|
+
notes: ['Replies arrive as normal notifications.', 'Needs a second number that can receive WhatsApp. You prove it is you with a one-time claim code.'],
|
|
66
|
+
},
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
export const LEVEL_CARDS = Object.freeze([
|
|
70
|
+
{ id: 'read-only', title: 'Read-only', body: 'SynaBun answers, researches and plans. It never changes files, runs commands or starts agents from WhatsApp; a plan can only be approved on this computer.' },
|
|
71
|
+
{ id: 'ask', title: 'Ask on my phone', badge: 'Default', body: 'Before anything that would change your files, run a command or start an agent, SynaBun asks on WhatsApp and acts only on your yes. Any other message approves nothing: the conversation just carries on.' },
|
|
72
|
+
{ id: 'autonomous', title: 'Autonomous', body: 'SynaBun acts without asking, like the Assistant on this computer. Turning it on takes a second click here and an ALLOW code sent from your phone within 5 minutes. It turns back to Ask after 8 hours. Autonomous can read any file your computer account can, including SynaBun\'s WhatsApp login. Use it only with a locked phone, ideally on a second number.' },
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
/** Ask and Autonomous need a Claude brain: the Safety warning when the WhatsApp conversation runs on another one (status.brainLimit). */
|
|
76
|
+
export function brainLimitText(status) {
|
|
77
|
+
const limit = status?.brainLimit;
|
|
78
|
+
if (!limit || !limit.provider) return '';
|
|
79
|
+
return say('brainLimit', 'This conversation runs read-only because its brain is {brain}; switch the WhatsApp brain to Claude for Ask/Autonomous.', { brain: limit.label || limit.provider });
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ── Which model runs the WhatsApp conversation (status.brainChoice; lib/whatsapp/brain.js) ──
|
|
83
|
+
export const BRAIN_COPY = Object.freeze({
|
|
84
|
+
label: 'Model',
|
|
85
|
+
same: 'Same as the Assistant',
|
|
86
|
+
menuTitle: 'Model for WhatsApp',
|
|
87
|
+
hint: 'Which model answers you on WhatsApp. A change applies from your next message. A model from another provider carries on in the same conversation with a fresh context.',
|
|
88
|
+
effort: 'Thinking effort',
|
|
89
|
+
effortDefault: 'Default effort',
|
|
90
|
+
saved: 'WhatsApp model saved. It applies from your next message.',
|
|
91
|
+
});
|
|
92
|
+
const BRAIN_PROVIDER_LABELS = Object.freeze({ 'claude-code': 'Claude', codex: 'Codex', opencode: 'OpenCode' });
|
|
93
|
+
export function brainProviderLabel(provider) { return BRAIN_PROVIDER_LABELS[provider] || String(provider || ''); }
|
|
94
|
+
/**
|
|
95
|
+
* The stored choice of a status: { provider, model, effort } or null (same as
|
|
96
|
+
* the Assistant). A status without the field (an older server) reads as null.
|
|
97
|
+
*/
|
|
98
|
+
export function brainChoiceOf(status) {
|
|
99
|
+
const choice = status?.brainChoice?.choice ?? status?.config?.brain ?? null;
|
|
100
|
+
if (!choice || typeof choice !== 'object' || typeof choice.provider !== 'string' || typeof choice.model !== 'string' || !choice.model) return null;
|
|
101
|
+
return { provider: choice.provider, model: choice.model, effort: typeof choice.effort === 'string' && choice.effort ? choice.effort : null };
|
|
102
|
+
}
|
|
103
|
+
/** The choice in use: the stored one unless the server fell back to the default (a disabled or unknown model). */
|
|
104
|
+
export function brainChoiceInUse(status) {
|
|
105
|
+
return status?.brainChoice?.fallback ? null : brainChoiceOf(status);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The model button's text: "Same as the Assistant" (with the brain that is, when
|
|
109
|
+
* the server says) or "Codex · GPT-6 Sol". `modelLabel`: the picker's own name for the model.
|
|
110
|
+
*/
|
|
111
|
+
export function brainChoiceLabel(status, { modelLabel = '' } = {}) {
|
|
112
|
+
const choice = brainChoiceInUse(status);
|
|
113
|
+
const effective = status?.brainChoice?.effective || null;
|
|
114
|
+
if (!choice) {
|
|
115
|
+
const same = say('brain.same', 'Same as the Assistant');
|
|
116
|
+
const now = effective?.provider ? [effective.providerLabel || brainProviderLabel(effective.provider), effective.modelLabel || effective.model].filter(Boolean).join(' · ') : '';
|
|
117
|
+
return now ? say('brain.sameNow', '{same} ({now})', { same, now }) : same;
|
|
118
|
+
}
|
|
119
|
+
return `${brainProviderLabel(choice.provider)} · ${modelLabel || effective?.modelLabel || choice.model}`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The notes under the model: why a stored choice is not in use, and that a
|
|
123
|
+
* brain other than Claude runs the conversation read-only (the existing rule).
|
|
124
|
+
*/
|
|
125
|
+
export function brainChoiceNotes(status) {
|
|
126
|
+
const view = status?.brainChoice;
|
|
127
|
+
if (!view || typeof view !== 'object') return [];
|
|
128
|
+
const notes = [];
|
|
129
|
+
const fallback = view.fallback;
|
|
130
|
+
if (fallback?.model) {
|
|
131
|
+
notes.push(fallback.reason === 'disabled'
|
|
132
|
+
? say('brain.fallbackDisabled', '{model} is switched off in the Assistant\'s Models list, so WhatsApp runs on the same brain as the Assistant. Pick another model here, or switch it back on.', { model: fallback.model })
|
|
133
|
+
: say('brain.fallbackUnknown', '{provider} no longer lists {model}, so WhatsApp runs on the same brain as the Assistant. Pick another model here.', { provider: fallback.providerLabel || brainProviderLabel(fallback.provider), model: fallback.model }));
|
|
134
|
+
}
|
|
135
|
+
if (view.readOnly?.provider) {
|
|
136
|
+
notes.push(say('brain.readOnly', 'On {brain}, a WhatsApp conversation runs read-only whatever the level: only a Claude model can ask on your phone before it acts. Pick a Claude model for Ask on my phone or Autonomous.', { brain: view.readOnly.label || brainProviderLabel(view.readOnly.provider) }));
|
|
137
|
+
}
|
|
138
|
+
return notes;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export const PROGRESS_OPTIONS = Object.freeze([
|
|
142
|
+
{ value: 'off', label: 'Off', hint: 'Only the answer.' },
|
|
143
|
+
{ value: 'key', label: 'Key moments', hint: '"On it…", agents starting, and a note when a task runs long.' },
|
|
144
|
+
{ value: 'all', label: 'Everything', hint: 'Also what SynaBun is doing while it works (at most every 20 seconds).' },
|
|
145
|
+
]);
|
|
146
|
+
export const MAX_MESSAGE_OPTIONS = Object.freeze([
|
|
147
|
+
{ value: 1, label: '1 message' },
|
|
148
|
+
{ value: 3, label: 'Up to 3' },
|
|
149
|
+
{ value: 5, label: 'Up to 5' },
|
|
150
|
+
]);
|
|
151
|
+
export const ROTATION_OPTIONS = Object.freeze([
|
|
152
|
+
{ value: 'idle6h', label: 'After 6 idle hours' },
|
|
153
|
+
{ value: 'daily', label: 'Every day at 04:00' },
|
|
154
|
+
{ value: 'never', label: 'Never (send /new yourself)' },
|
|
155
|
+
]);
|
|
156
|
+
export const TRIGGER_OPTIONS = Object.freeze([
|
|
157
|
+
{ value: 'all', label: 'Every message in "Message yourself"', hint: 'Everything you write in your own chat goes to SynaBun.' },
|
|
158
|
+
{ value: 'prefix', label: 'Only messages that start with sb', hint: 'Keep using "Message yourself" for notes; start a message with sb (or sb:) to talk to SynaBun. Commands like /stop, the ALLOW code and replies to SynaBun\'s own messages always reach it.' },
|
|
159
|
+
]);
|
|
160
|
+
|
|
161
|
+
export const COMMANDS = Object.freeze([
|
|
162
|
+
{ name: '/status', text: 'what SynaBun is doing, its spend and level' },
|
|
163
|
+
{ name: '/stop', text: 'stop the current task, its agents and anything waiting for your answer' },
|
|
164
|
+
{ name: '/new', text: 'start a fresh conversation' },
|
|
165
|
+
{ name: '/pause', text: 'stop acting on messages until /resume' },
|
|
166
|
+
{ name: '/resume', text: 'act on messages again (not after a pause from this computer)' },
|
|
167
|
+
{ name: '/cards', text: 'ask again what is still waiting for your answer' },
|
|
168
|
+
{ name: '/help', text: 'the list of commands' },
|
|
169
|
+
{ name: '//text', text: 'send text that starts with a slash' },
|
|
170
|
+
]);
|
|
171
|
+
|
|
172
|
+
export const LIMITS = Object.freeze([
|
|
173
|
+
'Text and pictures (up to 4 per message, 5 MB each). Voice notes, videos, documents and stickers are not read yet.',
|
|
174
|
+
'At most 20 messages a minute and 300 a day; 5 messages can wait in line while SynaBun works.',
|
|
175
|
+
'Messages older than 10 minutes when SynaBun comes back online are skipped (it tells you how many).',
|
|
176
|
+
'Answers are split into messages of 3,500 characters; the rest stays in SynaBun.',
|
|
177
|
+
'Computer use from WhatsApp is off until you turn it on above. Then: never at Read-only or while paused, after one yes per task at Ask on my phone, and without asking while Autonomous is active. Agents started from WhatsApp never get it.',
|
|
178
|
+
'Levels, models and settings change only here, never from the phone.',
|
|
179
|
+
]);
|
|
180
|
+
|
|
181
|
+
export const PRIVACY_STAYS = Object.freeze([
|
|
182
|
+
{ key: 'session', label: 'WhatsApp session keys', hint: 'The linked-device credentials. Outside the folder SynaBun backs up.' },
|
|
183
|
+
{ key: 'connector', label: 'The connector', hint: 'Baileys and its dependencies, installed on demand.' },
|
|
184
|
+
{ key: 'logs', label: 'Activity log', hint: 'whatsapp-YYYYMMDD.log, readable by you only, deleted after 7 days.' },
|
|
185
|
+
]);
|
|
186
|
+
export const PRIVACY_NEVER = Object.freeze([
|
|
187
|
+
'Never reads, stores or answers any chat except yours with SynaBun.',
|
|
188
|
+
'Never sends a message to anyone but you.',
|
|
189
|
+
'Never keeps phone numbers: settings and logs show the last four digits at most.',
|
|
190
|
+
'Never uploads your chats anywhere: no SynaBun server sits in between, messages go from WhatsApp to this computer.',
|
|
191
|
+
'Never keeps message text in the log unless you turn it on below.',
|
|
192
|
+
]);
|
|
193
|
+
|
|
194
|
+
export const HELP = Object.freeze({
|
|
195
|
+
how: 'SynaBun links to WhatsApp the same way WhatsApp Web does: as a linked device of an account. Messages you send in the chosen chat reach the SynaBun Assistant on this computer, and its answers come back as WhatsApp messages. Your computer has to be on and SynaBun running.',
|
|
196
|
+
compare: [
|
|
197
|
+
['', 'Message yourself', 'A second number'],
|
|
198
|
+
['Cost', 'Free', 'Free (needs a second number)'],
|
|
199
|
+
['Setup', 'One QR scan', 'One QR scan + a claim code'],
|
|
200
|
+
['Notifications', 'Often silent', 'Normal'],
|
|
201
|
+
['Account linked to SynaBun', 'Yours', 'The second one'],
|
|
202
|
+
['If WhatsApp restricts it', 'Your own account', 'Only the second account'],
|
|
203
|
+
],
|
|
204
|
+
unofficial: 'This uses an unofficial connection (Baileys), not the WhatsApp Business API. WhatsApp\'s Help Center warns that using unofficial apps "may result in a temporary or permanent account ban". SynaBun keeps traffic low and only ever writes to you, but the risk is not zero; the second-number mode keeps it off your own account.',
|
|
205
|
+
linkedDevice: 'A linked device can see every chat of the account. SynaBun receives them from WhatsApp and ignores them: only your chat with SynaBun is read, and nothing else is stored.',
|
|
206
|
+
lostPhone: 'Lost your phone, or something looks wrong? Press Pause now here, or on any device open WhatsApp → Settings → Linked devices, tap SynaBun and Log out.',
|
|
207
|
+
downloads: 'The connector is downloaded from the npm registry the first time you set up WhatsApp (a few seconds), pinned to exact versions: baileys (MIT) and its dependencies, among them libsignal (GPL-3.0). It is installed in its own folder and runs as a separate process; it is not part of SynaBun\'s own code. The pin is baileys 7.0.0-rc14: older versions are deprecated for CVE-2026-48063.',
|
|
208
|
+
troubleshooting: [
|
|
209
|
+
'WhatsApp allows 4 linked devices. If linking fails, remove one under Linked devices on your phone.',
|
|
210
|
+
'If your phone is offline for 14 days, WhatsApp logs out every linked device. Link again when that happens.',
|
|
211
|
+
'Replies in "Message yourself" usually do not notify you; use the second-number mode if you need notifications.',
|
|
212
|
+
'In "Message yourself", only messages typed on the phone reach SynaBun. Messages typed into that chat from WhatsApp Web or Desktop are ignored.',
|
|
213
|
+
'With "Only messages that start with sb", a note without sb never reaches SynaBun and is not logged; commands, the ALLOW code and replies to SynaBun\'s messages always get through.',
|
|
214
|
+
'The QR code expires after about a minute. Press "Show a new code" and scan faster, or link with your phone number instead.',
|
|
215
|
+
'Stuck on "Reconnecting"? Check this computer\'s internet connection, then press Reconnect now.',
|
|
216
|
+
],
|
|
217
|
+
browserTools: 'Not the same as the WhatsApp browser tools. The whatsapp MCP profile lets agents read WhatsApp Web in SynaBun\'s browser; this tab is you chatting with SynaBun from your phone. They do not share a session.',
|
|
218
|
+
uninstall: 'Uninstalling SynaBun does not unlink WhatsApp. Use Unlink or Remove here first, or log SynaBun out under WhatsApp → Settings → Linked devices.',
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
/** The connector's download size from its manifest (status.connector.approxSizeMB): "about 29 MB", or '' when unknown. */
|
|
222
|
+
export function connectorSize(status) {
|
|
223
|
+
const mb = Number(status?.connector?.approxSizeMB);
|
|
224
|
+
return Number.isFinite(mb) && mb > 0 ? say('connectorSize', 'about {mb} MB', { mb: Math.round(mb) }) : '';
|
|
225
|
+
}
|
|
226
|
+
/** The note under the setup choices: the one-time download, sized from the manifest. */
|
|
227
|
+
export function chooseNote(status) {
|
|
228
|
+
const size = connectorSize(status);
|
|
229
|
+
return size
|
|
230
|
+
? say('chooseNoteSized', 'The first time, SynaBun downloads a small connector for WhatsApp ({size}, a few seconds) into its own folder.', { size })
|
|
231
|
+
: say('chooseNote', 'The first time, SynaBun downloads a small connector for WhatsApp (a few seconds) into its own folder.');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export const STAGE_TEXT = Object.freeze({
|
|
235
|
+
checking: 'Checking npm and free disk space…',
|
|
236
|
+
downloading: 'Downloading the connector…',
|
|
237
|
+
verifying: 'Verifying the download…',
|
|
238
|
+
activating: 'Activating…',
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
export const INSTALL_ERRORS = Object.freeze({
|
|
242
|
+
NPM_NOT_FOUND: 'npm was not found. Install Node.js (it comes with npm), then try again.',
|
|
243
|
+
OFFLINE: 'The npm registry could not be reached. Check the internet connection and try again.',
|
|
244
|
+
REGISTRY_REFUSED: 'The npm registry refused the download. A proxy or firewall may be in the way.',
|
|
245
|
+
DISK_FULL: 'Not enough free disk space (about 150 MB is needed).',
|
|
246
|
+
NO_PERMISSION: 'SynaBun could not write to its runtime folder.',
|
|
247
|
+
FILE_IN_USE: 'A file was in use. Close other SynaBun windows and try again.',
|
|
248
|
+
TIMEOUT: 'The download took longer than 5 minutes.',
|
|
249
|
+
VERIFY_FAILED: 'The downloaded connector did not pass verification, so it was not used.',
|
|
250
|
+
INSTALL_BUSY: 'Another install is already running.',
|
|
251
|
+
ABORTED: 'The install was cancelled.',
|
|
252
|
+
UNKNOWN: 'Something unexpected happened. The install log has the details.',
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
export const ERROR_TEXT = Object.freeze({
|
|
256
|
+
HOST_HELD: 'The WhatsApp connector kept crashing, so SynaBun stopped it. Reconnect to try again; the install log may help.',
|
|
257
|
+
HOST_UNAVAILABLE: 'The WhatsApp connector did not start.',
|
|
258
|
+
REPLACED: 'Another copy of this WhatsApp link connected from somewhere else and took over. Reconnect here to take it back.',
|
|
259
|
+
LOCKED: 'Another SynaBun is using the WhatsApp session files. Close it, then reconnect.',
|
|
260
|
+
SESSION_ERROR: 'WhatsApp closed the session. Reconnect, or unlink and link again if it keeps happening.',
|
|
261
|
+
RECONNECT_LIMIT: 'Too many reconnects in a short time, so SynaBun stopped trying. Check the internet connection, then reconnect.',
|
|
262
|
+
OWNER_ANOMALY: 'Sending is paused because a message did not look like it came from the owner. Confirm the owner again (second number), or unlink and link again (Message yourself).',
|
|
263
|
+
PAIRING_FAILED: 'WhatsApp did not give a pairing code for that number. Check the number, or use the QR code.',
|
|
264
|
+
RUNTIME_MISSING: 'The WhatsApp connector is missing. Install it again.',
|
|
265
|
+
AUTH_PERMS: 'SynaBun could not make the WhatsApp session files private (yours only). Fix the permissions of the folder under Data & privacy (700 for the folder, 600 for its files), then reconnect.',
|
|
266
|
+
CONNECT_FAILED: 'SynaBun could not connect to WhatsApp.',
|
|
267
|
+
FORBIDDEN: 'WhatsApp refused the connection.',
|
|
268
|
+
LINK_FAILED: 'Linking failed. Try again.',
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
export const LOGOUT_TEXT = Object.freeze({
|
|
272
|
+
removed: { title: 'Logged out from the phone', sub: 'SynaBun was removed under Linked devices, or WhatsApp ended the session. Link again to keep chatting.' },
|
|
273
|
+
inactive: { title: 'Logged out after a long time offline', sub: 'WhatsApp logs out linked devices that stay offline for a long time. Link again to keep chatting.' },
|
|
274
|
+
banned: { title: 'WhatsApp refused this account', sub: 'WhatsApp blocked the account from linking devices, possibly a temporary or permanent ban. Check the WhatsApp app on the phone.' },
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
export const ACTIVITY_KINDS = Object.freeze({
|
|
278
|
+
inbound: 'Received', reply: 'Sent', ignored: 'Ignored', state: 'Status', security: 'Security', error: 'Problem', settings: 'Settings',
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
export const PHONE_HINT = 'Your WhatsApp number with its country code, for example +44 7911 123456.';
|
|
282
|
+
export const TEST_HINT = 'Sends "SynaBun test message. If you can read this, WhatsApp is working."';
|
|
283
|
+
|
|
284
|
+
const LEVEL_LABELS = Object.freeze({ 'read-only': 'Read-only', ask: 'Ask on my phone', autonomous: 'Autonomous' });
|
|
285
|
+
export function levelLabel(level) { return pick('levelLabel', LEVEL_LABELS, level, 'ask'); }
|
|
286
|
+
export function modeLabel(mode) { return mode === 'dedicated' ? say('modeLabel.dedicated', 'Second number') : say('modeLabel.self', 'Message yourself'); }
|
|
287
|
+
|
|
288
|
+
/** 125000 → "2:05"; negative → "0:00". */
|
|
289
|
+
export function formatCountdown(ms) {
|
|
290
|
+
const total = Math.max(0, Math.ceil((Number(ms) || 0) / 1000));
|
|
291
|
+
const h = Math.floor(total / 3600);
|
|
292
|
+
const m = Math.floor((total % 3600) / 60);
|
|
293
|
+
const s = total % 60;
|
|
294
|
+
return h ? `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}` : `${m}:${String(s).padStart(2, '0')}`;
|
|
295
|
+
}
|
|
296
|
+
/** A clock time for an epoch ms ("14:05"). */
|
|
297
|
+
export function clockTime(ms) {
|
|
298
|
+
const d = new Date(Number(ms));
|
|
299
|
+
return Number.isFinite(d.getTime()) ? `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}` : '';
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
function accountLine(status) {
|
|
303
|
+
const account = status?.account;
|
|
304
|
+
if (!account) return '';
|
|
305
|
+
const name = typeof account.name === 'string' && account.name.trim() && account.name !== '~' ? account.name.trim() : '';
|
|
306
|
+
return [name, account.masked].filter(Boolean).join(' · ');
|
|
307
|
+
}
|
|
308
|
+
const view = (dot, title, sub, { primary = null, secondary = null, step = null, pane, nav = 'disconnected' } = {}) => ({ dot, title, sub, primary, secondary, step, pane, nav });
|
|
309
|
+
const button = (id, label) => ({ id, label });
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* @param {object} status GET /api/whatsapp/status (or null while it loads)
|
|
313
|
+
* @param {{now?: number}} [opts]
|
|
314
|
+
* @returns {{dot:'ok'|'warn'|'err'|'dim', title:string, sub:string, primary:{id,label}|null, secondary:{id,label}|null, step:string|null, pane:string, nav:'connected'|'disconnected'}}
|
|
315
|
+
*/
|
|
316
|
+
export function waView(status, { now = Date.now() } = {}) {
|
|
317
|
+
const s = status && typeof status === 'object' ? status : {};
|
|
318
|
+
if (s.ok === false) {
|
|
319
|
+
return view('err', say('view.unavailable.title', 'WhatsApp settings are unavailable'), s.status === 404 ? say('view.unavailable.noSupport', 'This SynaBun server has no WhatsApp support yet. Restart it after updating.') : String(s.error || say('view.unavailable.noAnswer', 'No answer from SynaBun.')), { pane: 'unavailable' });
|
|
320
|
+
}
|
|
321
|
+
const level = levelLabel(s.level);
|
|
322
|
+
const mode = modeLabel(s.mode);
|
|
323
|
+
switch (s.state) {
|
|
324
|
+
case 'unavailable':
|
|
325
|
+
// reason: 'starting' (the server is still booting the Assistant), 'error' (the WhatsApp Link failed to load), 'env' (the kill switch).
|
|
326
|
+
if (s.reason === 'starting') return view('dim', say('view.starting.title', 'WhatsApp is starting'), say('view.starting.sub', 'SynaBun is still starting its Assistant. This updates by itself in a few seconds.'), { pane: 'unavailable' });
|
|
327
|
+
if (s.reason === 'error') return view('err', say('view.loadFailed.title', 'WhatsApp could not start'), say('view.loadFailed.sub', 'The WhatsApp Link failed to load on this computer. The SynaBun server log says why; restart SynaBun once it is fixed.'), { pane: 'unavailable' });
|
|
328
|
+
return view('dim', say('view.off.title', 'WhatsApp is turned off on this computer'), say('view.off.sub', 'SYNABUN_WHATSAPP=off is set where SynaBun runs. Remove it and restart SynaBun to use WhatsApp.'), { pane: 'unavailable' });
|
|
329
|
+
case 'not_installed':
|
|
330
|
+
return view('dim', say('view.notInstalled.title', 'Not set up'), say('view.notInstalled.sub', 'Chat with your SynaBun Assistant from WhatsApp. Choose how below; it takes about a minute.'), { primary: button('setup', say('button.setup', 'Set up WhatsApp')), step: 'choose', pane: 'choose' });
|
|
331
|
+
case 'ready':
|
|
332
|
+
return view('dim', say('view.ready.title', 'Ready to link'), say('view.ready.sub', 'The connector is installed. Choose how you want to chat, then scan one QR code.'), { primary: button('setup', say('button.link', 'Link WhatsApp')), step: 'choose', pane: 'choose' });
|
|
333
|
+
case 'installing': {
|
|
334
|
+
const size = connectorSize(s);
|
|
335
|
+
const downloading = size ? say('view.installing.downloadingSized', 'Downloading the connector ({size}, once)…', { size }) : say('view.installing.downloading', 'Downloading the connector…');
|
|
336
|
+
return view('warn', say('view.installing.title', 'Setting up the WhatsApp connector'), s.stage === 'downloading' ? downloading : pick('stage', STAGE_TEXT, s.stage, 'checking'), { secondary: button('cancel-install', say('button.cancel', 'Cancel')), step: 'install', pane: 'installing' });
|
|
337
|
+
}
|
|
338
|
+
case 'install_failed':
|
|
339
|
+
return view('err', say('view.installFailed.title', 'The connector could not be installed'), pick('installError', INSTALL_ERRORS, s.code, 'UNKNOWN'), { primary: button('retry-install', say('button.tryAgain', 'Try again')), secondary: button('show-log', say('button.showLog', 'Show install log')), step: 'install', pane: 'install_failed' });
|
|
340
|
+
case 'linking': {
|
|
341
|
+
if (s.phase === 'scanned') return view('warn', say('view.scanned.title', 'Phone accepted, finishing the link…'), say('view.scanned.sub', 'Keep WhatsApp open on the phone for a few seconds.'), { secondary: button('cancel-link', say('button.cancel', 'Cancel')), step: 'link', pane: s.method === 'code' ? 'code' : 'qr' });
|
|
342
|
+
if (s.method === 'code') return view('warn', say('view.code.title', 'Enter the code on your phone'), say('view.code.sub', 'WhatsApp → Settings → Linked devices → Link a device → Link with phone number instead.'), { secondary: button('cancel-link', say('button.cancel', 'Cancel')), step: 'link', pane: 'code' });
|
|
343
|
+
return view('warn', say('view.qr.title', 'Scan the QR code with WhatsApp'), say('view.qr.sub', 'On the phone: WhatsApp → Settings → Linked devices → Link a device.'), { secondary: button('cancel-link', say('button.cancel', 'Cancel')), step: 'link', pane: 'qr' });
|
|
344
|
+
}
|
|
345
|
+
case 'link_expired':
|
|
346
|
+
return view('warn', say('view.expired.title', 'The code expired'), say('view.expired.sub', 'Nothing was linked. Try again when your phone is ready.'), { primary: button('relink', say('button.newCode', 'Show a new code')), secondary: button('change-setup', say('button.changeSetup', 'Change setup')), step: 'link', pane: 'expired' });
|
|
347
|
+
case 'confirm_owner': {
|
|
348
|
+
if (s.confirm?.kind === 'code' || (s.mode === 'dedicated' && s.confirm?.kind !== 'self')) {
|
|
349
|
+
return view('warn', say('view.claim.title', 'Claim the second number from your own WhatsApp'), say('view.claim.sub', 'Send the one-time code from your personal WhatsApp to the linked number. Only that account can then talk to SynaBun.'), { primary: button('claim', say('button.claim', 'Show the claim code')), secondary: button('unlink', say('button.unlink', 'Unlink')), step: 'confirm', pane: 'claim' });
|
|
350
|
+
}
|
|
351
|
+
const who = accountLine(s);
|
|
352
|
+
const linked = who ? say('view.confirm.linkedAs', 'Linked as {who}.', { who }) : say('view.confirm.linked', 'A WhatsApp account is linked.');
|
|
353
|
+
const left = s.confirm?.expiresAt ? ` ${say('view.confirm.within', 'Confirm within {time}, or it is logged out.', { time: formatCountdown(s.confirm.expiresAt - now) })}` : '';
|
|
354
|
+
return view('warn', say('view.confirm.title', 'Is this your WhatsApp?'), `${linked}${left}`, { primary: button('confirm', say('button.confirm', 'This is me — start')), secondary: button('reject', say('button.reject', 'Not me? Unlink')), step: 'confirm', pane: 'confirm_self' });
|
|
355
|
+
}
|
|
356
|
+
case 'connected': {
|
|
357
|
+
const who = accountLine(s);
|
|
358
|
+
const until = s.level === 'autonomous' && s.levelExpiresAt ? ` ${say('view.connected.until', 'until {time}', { time: clockTime(s.levelExpiresAt) })}` : '';
|
|
359
|
+
// A Codex / OpenCode brain holds the conversation at read-only whatever the level.
|
|
360
|
+
const applies = s.brainLimit?.provider ? say('view.connected.readOnlyBrain', 'Read-only ({brain} brain)', { brain: s.brainLimit.label || s.brainLimit.provider }) : `${level}${until}`;
|
|
361
|
+
return view('ok', say('view.connected.title', 'Connected'), [mode, who, applies].filter(Boolean).join(' · '), { primary: button('open-conversation', say('button.openConversation', 'Open conversation')), secondary: button('test', say('button.test', 'Send a test message')), step: 'done', pane: 'connected', nav: 'connected' });
|
|
362
|
+
}
|
|
363
|
+
case 'reconnecting': {
|
|
364
|
+
const next = s.connection?.nextRetryAt ? s.connection.nextRetryAt - now : null;
|
|
365
|
+
const sub = next !== null && next > 0
|
|
366
|
+
? say('view.reconnecting.retry', 'Connection lost. Attempt {attempt}; trying again in {time}.', { attempt: Math.max(1, Number(s.connection.attempt) || 1), time: formatCountdown(next) })
|
|
367
|
+
: say('view.reconnecting.connecting', 'Connecting to WhatsApp…');
|
|
368
|
+
return view('warn', say('view.reconnecting.title', 'Reconnecting'), sub, { primary: button('reconnect', say('button.reconnectNow', 'Reconnect now')), step: 'done', pane: 'reconnecting' });
|
|
369
|
+
}
|
|
370
|
+
case 'paused': {
|
|
371
|
+
const sub = s.enabled === false ? say('view.paused.off', 'WhatsApp is linked but turned off. Resume to act on messages again.')
|
|
372
|
+
: s.pausedBy === 'phone' ? say('view.paused.phone', 'Paused from your phone with /pause. Resume here, or send /resume.')
|
|
373
|
+
: say('view.paused.computer', 'Paused from this computer. SynaBun does not act on WhatsApp messages until you resume (the phone cannot undo this).');
|
|
374
|
+
return view('warn', say('view.paused.title', 'Paused'), sub, { primary: button('resume', say('button.resume', 'Resume')), step: 'done', pane: 'paused' });
|
|
375
|
+
}
|
|
376
|
+
case 'logged_out': {
|
|
377
|
+
const reason = Object.prototype.hasOwnProperty.call(LOGOUT_TEXT, s.reason) ? s.reason : 'removed';
|
|
378
|
+
return view('err', say(`logout.${reason}.title`, LOGOUT_TEXT[reason].title), say(`logout.${reason}.sub`, LOGOUT_TEXT[reason].sub), { primary: s.reason === 'banned' ? null : button('relink', say('button.linkAgain', 'Link again')), secondary: s.reason === 'banned' ? button('change-setup', say('button.setupAgain', 'Set up again')) : null, step: 'link', pane: 'logged_out' });
|
|
379
|
+
}
|
|
380
|
+
case 'error': {
|
|
381
|
+
const canReconnect = !['RUNTIME_MISSING'].includes(s.code);
|
|
382
|
+
return view('err', say('view.error.title', 'WhatsApp needs attention'), ERROR_TEXT[s.code] ? pick('error', ERROR_TEXT, s.code) : say('view.error.stopped', 'The WhatsApp link stopped ({code}).', { code: String(s.code || say('view.error.unknown', 'unknown error')) }), {
|
|
383
|
+
primary: s.code === 'OWNER_ANOMALY' ? (s.mode === 'dedicated' ? button('reset-owner', say('button.resetOwner', 'Confirm the owner again')) : button('unlink', say('button.unlinkRelink', 'Unlink and link again'))) : s.code === 'RUNTIME_MISSING' ? button('retry-install', say('button.installAgain', 'Install again')) : canReconnect ? button('reconnect', say('button.reconnect', 'Reconnect')) : null,
|
|
384
|
+
secondary: button('show-log', say('button.showLog', 'Show install log')), pane: 'error',
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
default:
|
|
388
|
+
return view('dim', say('view.loading.title', 'Checking WhatsApp…'), say('view.loading.sub', 'Asking SynaBun for the WhatsApp status.'), { pane: 'loading' });
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/** The masked account and owner lines for the confirm card ("Linked as Ana · ••••1234"). */
|
|
393
|
+
export function confirmLine(status) {
|
|
394
|
+
const who = accountLine(status);
|
|
395
|
+
return who ? say('confirmLine.as', 'Linked as {who}', { who }) : say('confirmLine.plain', 'Linked');
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/** Every constant above in the reader's language: what ui-whatsapp.js places on screen. */
|
|
399
|
+
export function localizedCopy() {
|
|
400
|
+
return {
|
|
401
|
+
STEPS: localize('steps', STEPS), MODE_CARDS: localize('mode', MODE_CARDS), LEVEL_CARDS: localize('level', LEVEL_CARDS),
|
|
402
|
+
PROGRESS_OPTIONS: localize('progress', PROGRESS_OPTIONS), MAX_MESSAGE_OPTIONS: localize('maxMessages', MAX_MESSAGE_OPTIONS),
|
|
403
|
+
ROTATION_OPTIONS: localize('rotation', ROTATION_OPTIONS), TRIGGER_OPTIONS: localize('trigger', TRIGGER_OPTIONS),
|
|
404
|
+
COMMANDS: localize('commands', COMMANDS), LIMITS: localize('limits', LIMITS),
|
|
405
|
+
PRIVACY_STAYS: localize('privacyStays', PRIVACY_STAYS), PRIVACY_NEVER: localize('privacyNever', PRIVACY_NEVER),
|
|
406
|
+
HELP: localize('help', HELP), STAGE_TEXT: localize('stage', STAGE_TEXT), INSTALL_ERRORS: localize('installError', INSTALL_ERRORS),
|
|
407
|
+
ERROR_TEXT: localize('error', ERROR_TEXT), LOGOUT_TEXT: localize('logout', LOGOUT_TEXT), ACTIVITY_KINDS: localize('activity', ACTIVITY_KINDS),
|
|
408
|
+
LEVEL_LABELS: localize('levelLabel', LEVEL_LABELS), PHONE_HINT: localize('phoneHint', PHONE_HINT), TEST_HINT: localize('testHint', TEST_HINT),
|
|
409
|
+
BRAIN_COPY: localize('brainCopy', BRAIN_COPY),
|
|
410
|
+
};
|
|
411
|
+
}
|