synabun 1.3.0 → 2.0.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +197 -662
- package/LICENSE-COMMERCIAL.md +33 -0
- package/NOTICE +17 -0
- package/README.md +175 -853
- package/THIRD-PARTY-LICENSES.md +131 -0
- package/benchmarks/browser-live-results.json +79 -0
- package/benchmarks/browser-v2-results.json +258 -0
- package/benchmarks/fixtures/browser/README.md +57 -0
- package/benchmarks/fixtures/browser/page-state.json +132 -0
- package/benchmarks/fixtures/browser/social.json +92 -0
- package/benchmarks/fixtures/browser/target.json +319 -0
- package/benchmarks/fixtures/desktop/README.md +58 -0
- package/benchmarks/fixtures/desktop/abstention.json +59 -0
- package/benchmarks/fixtures/desktop/adversarial.json +22 -0
- package/benchmarks/fixtures/desktop/forbidden.json +93 -0
- package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
- package/benchmarks/fixtures/desktop/target.json +136 -0
- package/bin/synabun.js +30 -0
- package/docs/browser-v2.md +109 -0
- package/docs/hook-integrity.md +89 -0
- package/docs/judgments.md +182 -0
- package/docs/style-guide.md +246 -0
- package/docs/whatsapp.md +325 -0
- package/hooks/claude-code/post-plan.mjs +613 -391
- package/hooks/claude-code/post-remember.mjs +246 -122
- package/hooks/claude-code/pre-compact.mjs +171 -110
- package/hooks/claude-code/pre-task.mjs +133 -0
- package/hooks/claude-code/pre-websearch.mjs +15 -4
- package/hooks/claude-code/prompt-origin.mjs +94 -0
- package/hooks/claude-code/prompt-submit.mjs +1244 -861
- package/hooks/claude-code/session-start.mjs +114 -156
- package/hooks/claude-code/shared.mjs +1228 -368
- package/hooks/claude-code/state.mjs +167 -0
- package/hooks/claude-code/stop.mjs +515 -140
- package/hooks/claude-code/subagent-start.mjs +154 -0
- package/hooks/claude-code/subagent-stop.mjs +102 -0
- package/hooks/claude-code/task-gate.mjs +150 -0
- package/lib/claude-hooks.js +84 -0
- package/lib/claude-usage-audit.js +141 -0
- package/lib/client-config-repair.js +144 -0
- package/lib/data-home-migration.js +498 -0
- package/lib/first-launch-protection.js +240 -0
- package/lib/paths.d.ts +21 -0
- package/lib/paths.js +103 -0
- package/mcp-server/dist/config.d.ts +22 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +109 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +30 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +276 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +48 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +538 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +28 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +32 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
- package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.js +128 -0
- package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.js +344 -0
- package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/browser-assist.d.ts +104 -0
- package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist.js +282 -0
- package/mcp-server/dist/services/browser-assist.js.map +1 -0
- package/mcp-server/dist/services/browser-bench.d.ts +772 -0
- package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-bench.js +424 -0
- package/mcp-server/dist/services/browser-bench.js.map +1 -0
- package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
- package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-judgments.js +363 -0
- package/mcp-server/dist/services/browser-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-risk.d.ts +166 -0
- package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-risk.js +458 -0
- package/mcp-server/dist/services/browser-risk.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +377 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.js +346 -0
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
- package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
- package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist.js +266 -0
- package/mcp-server/dist/services/desktop-assist.js.map +1 -0
- package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
- package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-bench.js +311 -0
- package/mcp-server/dist/services/desktop-bench.js.map +1 -0
- package/mcp-server/dist/services/desktop-client.d.ts +23 -0
- package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-client.js +79 -0
- package/mcp-server/dist/services/desktop-client.js.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.js +177 -0
- package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
- package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
- package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-risk.js +605 -0
- package/mcp-server/dist/services/desktop-risk.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/edit-stale.d.ts +81 -0
- package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
- package/mcp-server/dist/services/edit-stale.js +358 -0
- package/mcp-server/dist/services/edit-stale.js.map +1 -0
- package/mcp-server/dist/services/embedding-service.d.ts +16 -0
- package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-service.js +126 -0
- package/mcp-server/dist/services/embedding-service.js.map +1 -0
- package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
- package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-worker.js +52 -0
- package/mcp-server/dist/services/embedding-worker.js.map +1 -0
- package/mcp-server/dist/services/fb-regions.d.ts +71 -0
- package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
- package/mcp-server/dist/services/fb-regions.js +211 -0
- package/mcp-server/dist/services/fb-regions.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +22 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +55 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
- package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
- package/mcp-server/dist/services/file-excerpt.js +65 -0
- package/mcp-server/dist/services/file-excerpt.js.map +1 -0
- package/mcp-server/dist/services/identity.d.ts +124 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -0
- package/mcp-server/dist/services/identity.js +241 -0
- package/mcp-server/dist/services/identity.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +3 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/memory-client.d.ts +4 -0
- package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-client.js +27 -0
- package/mcp-server/dist/services/memory-client.js.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
- package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
- package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judgments.js +674 -0
- package/mcp-server/dist/services/memory-judgments.js.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.js +403 -0
- package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.js +412 -0
- package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
- package/mcp-server/dist/services/memory-schema.d.ts +16 -0
- package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-schema.js +282 -0
- package/mcp-server/dist/services/memory-schema.js.map +1 -0
- package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-sessions.js +110 -0
- package/mcp-server/dist/services/memory-sessions.js.map +1 -0
- package/mcp-server/dist/services/memory-triage.d.ts +60 -0
- package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-triage.js +189 -0
- package/mcp-server/dist/services/memory-triage.js.map +1 -0
- package/mcp-server/dist/services/memory-verification.d.ts +24 -0
- package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-verification.js +92 -0
- package/mcp-server/dist/services/memory-verification.js.map +1 -0
- package/mcp-server/dist/services/memory-writer.d.ts +26 -0
- package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-writer.js +126 -0
- package/mcp-server/dist/services/memory-writer.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +439 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +1135 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/profiles.d.ts +120 -0
- package/mcp-server/dist/services/profiles.d.ts.map +1 -0
- package/mcp-server/dist/services/profiles.js +387 -0
- package/mcp-server/dist/services/profiles.js.map +1 -0
- package/mcp-server/dist/services/secret-gate.d.ts +29 -0
- package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/secret-gate.js +43 -0
- package/mcp-server/dist/services/secret-gate.js.map +1 -0
- package/mcp-server/dist/services/server-instructions.d.ts +10 -0
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
- package/mcp-server/dist/services/server-instructions.js +101 -0
- package/mcp-server/dist/services/server-instructions.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +235 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +1185 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.js +218 -0
- package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +746 -0
- package/mcp-server/dist/services/typesafe-config.js.map +1 -0
- package/mcp-server/dist/services/typesafe.d.ts +213 -0
- package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe.js +330 -0
- package/mcp-server/dist/services/typesafe.js.map +1 -0
- package/mcp-server/dist/services/vector-cache.d.ts +68 -0
- package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
- package/mcp-server/dist/services/vector-cache.js +271 -0
- package/mcp-server/dist/services/vector-cache.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
- package/mcp-server/dist/tools/agents.d.ts +212 -0
- package/mcp-server/dist/tools/agents.d.ts.map +1 -0
- package/mcp-server/dist/tools/agents.js +407 -0
- package/mcp-server/dist/tools/agents.js.map +1 -0
- package/mcp-server/dist/tools/bluesky.d.ts +39 -0
- package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
- package/mcp-server/dist/tools/bluesky.js +1144 -0
- package/mcp-server/dist/tools/bluesky.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +106 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
- package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-batch.js +187 -0
- package/mcp-server/dist/tools/browser-batch.js.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +300 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +142 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +2009 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +34 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +112 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +16 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/choice.d.ts +160 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -0
- package/mcp-server/dist/tools/choice.js +80 -0
- package/mcp-server/dist/tools/choice.js.map +1 -0
- package/mcp-server/dist/tools/computer.d.ts +71 -0
- package/mcp-server/dist/tools/computer.d.ts.map +1 -0
- package/mcp-server/dist/tools/computer.js +174 -0
- package/mcp-server/dist/tools/computer.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +25 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
- package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/fb-groups.js +369 -0
- package/mcp-server/dist/tools/fb-groups.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +11 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.js +351 -0
- package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.js +258 -0
- package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.js +357 -0
- package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.js +321 -0
- package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.js +197 -0
- package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.js +274 -0
- package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.js +425 -0
- package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
- package/mcp-server/dist/tools/gsc.d.ts +7 -0
- package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc.js +51 -0
- package/mcp-server/dist/tools/gsc.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +14 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +21 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +401 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +56 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +171 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/morelogin.d.ts +24 -0
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
- package/mcp-server/dist/tools/morelogin.js +79 -0
- package/mcp-server/dist/tools/morelogin.js.map +1 -0
- package/mcp-server/dist/tools/profile.d.ts +17 -0
- package/mcp-server/dist/tools/profile.d.ts.map +1 -0
- package/mcp-server/dist/tools/profile.js +114 -0
- package/mcp-server/dist/tools/profile.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +71 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +147 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +56 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +157 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +62 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +201 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.js +231 -0
- package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
- package/mcp-server/dist/tools/style-guide.d.ts +8 -0
- package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide.js +12 -0
- package/mcp-server/dist/tools/style-guide.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +20 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +156 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +11 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +19 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +54 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.js +337 -0
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +16 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.js +83 -0
- package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.js +56 -0
- package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
- package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/download.js +30 -0
- package/mcp-server/dist/tools/youtube/download.js.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.js +143 -0
- package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
- package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
- package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/media.js +97 -0
- package/mcp-server/dist/tools/youtube/media.js.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.js +106 -0
- package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.js +71 -0
- package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.js +128 -0
- package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.js +147 -0
- package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
- package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
- package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/source.js +85 -0
- package/mcp-server/dist/tools/youtube/source.js.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.js +255 -0
- package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
- package/mcp-server/dist/tools/youtube.d.ts +12 -0
- package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube.js +38 -0
- package/mcp-server/dist/tools/youtube.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +806 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/mcp-server/package-lock.json +4798 -0
- package/mcp-server/package.json +55 -38
- package/mcp-server/run.mjs +12 -2
- package/mcp-server/src/config.ts +48 -3
- package/mcp-server/src/http.ts +296 -93
- package/mcp-server/src/index.ts +546 -203
- package/mcp-server/src/preload-http.ts +19 -18
- package/mcp-server/src/preload.ts +19 -18
- package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
- package/mcp-server/src/services/assistant-judgments.ts +157 -0
- package/mcp-server/src/services/browser-assist-gate.ts +383 -0
- package/mcp-server/src/services/browser-assist.ts +267 -0
- package/mcp-server/src/services/browser-bench.ts +477 -0
- package/mcp-server/src/services/browser-judgments.ts +414 -0
- package/mcp-server/src/services/browser-risk.ts +484 -0
- package/mcp-server/src/services/categories.ts +36 -19
- package/mcp-server/src/services/codex-config-heal.ts +403 -0
- package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
- package/mcp-server/src/services/desktop-assist.ts +308 -0
- package/mcp-server/src/services/desktop-bench.ts +372 -0
- package/mcp-server/src/services/desktop-client.ts +76 -0
- package/mcp-server/src/services/desktop-judgments.ts +218 -0
- package/mcp-server/src/services/desktop-risk.ts +743 -0
- package/mcp-server/src/services/edit-stale.ts +299 -0
- package/mcp-server/src/services/embedding-service.ts +108 -0
- package/mcp-server/src/services/embedding-worker.ts +46 -0
- package/mcp-server/src/services/fb-regions.ts +221 -0
- package/mcp-server/src/services/file-checksums.ts +26 -9
- package/mcp-server/src/services/file-excerpt.ts +59 -0
- package/mcp-server/src/services/identity.ts +291 -0
- package/mcp-server/src/services/local-embeddings.ts +2 -77
- package/mcp-server/src/services/memory-client.ts +23 -0
- package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
- package/mcp-server/src/services/memory-judgments.ts +901 -0
- package/mcp-server/src/services/memory-maintenance.ts +360 -0
- package/mcp-server/src/services/memory-retrieval.ts +349 -0
- package/mcp-server/src/services/memory-schema.ts +280 -0
- package/mcp-server/src/services/memory-sessions.ts +87 -0
- package/mcp-server/src/services/memory-triage.ts +182 -0
- package/mcp-server/src/services/memory-verification.ts +68 -0
- package/mcp-server/src/services/memory-writer.ts +125 -0
- package/mcp-server/src/services/neural-interface.ts +1217 -73
- package/mcp-server/src/services/profiles.ts +428 -0
- package/mcp-server/src/services/secret-gate.ts +52 -0
- package/mcp-server/src/services/server-instructions.ts +122 -0
- package/mcp-server/src/services/sqlite.ts +1456 -823
- package/mcp-server/src/services/typesafe-bench.ts +247 -0
- package/mcp-server/src/services/typesafe-config.ts +790 -0
- package/mcp-server/src/services/typesafe.ts +390 -0
- package/mcp-server/src/services/vector-cache.ts +255 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
- package/mcp-server/src/tools/agents.ts +539 -0
- package/mcp-server/src/tools/bluesky.ts +1186 -0
- package/mcp-server/src/tools/browser-advanced.ts +15 -6
- package/mcp-server/src/tools/browser-batch.ts +178 -0
- package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
- package/mcp-server/src/tools/browser-interact.ts +362 -255
- package/mcp-server/src/tools/browser-navigate.ts +164 -77
- package/mcp-server/src/tools/browser-observe.ts +2222 -1330
- package/mcp-server/src/tools/browser.ts +181 -107
- package/mcp-server/src/tools/card.ts +7 -5
- package/mcp-server/src/tools/choice.ts +103 -0
- package/mcp-server/src/tools/computer.ts +190 -0
- package/mcp-server/src/tools/discord.ts +10 -23
- package/mcp-server/src/tools/fb-groups.ts +387 -0
- package/mcp-server/src/tools/forget.ts +1 -1
- package/mcp-server/src/tools/git.ts +3 -1
- package/mcp-server/src/tools/gsc/experience.ts +440 -0
- package/mcp-server/src/tools/gsc/helpers.ts +288 -0
- package/mcp-server/src/tools/gsc/indexing.ts +495 -0
- package/mcp-server/src/tools/gsc/inspect.ts +391 -0
- package/mcp-server/src/tools/gsc/navigate.ts +236 -0
- package/mcp-server/src/tools/gsc/performance.ts +352 -0
- package/mcp-server/src/tools/gsc/settings.ts +564 -0
- package/mcp-server/src/tools/gsc.ts +95 -0
- package/mcp-server/src/tools/image.ts +3 -1
- package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
- package/mcp-server/src/tools/leonardo.ts +7 -5
- package/mcp-server/src/tools/loop.ts +118 -25
- package/mcp-server/src/tools/memories.ts +65 -5
- package/mcp-server/src/tools/morelogin.ts +81 -0
- package/mcp-server/src/tools/profile.ts +122 -0
- package/mcp-server/src/tools/recall.ts +105 -261
- package/mcp-server/src/tools/reflect.ts +171 -145
- package/mcp-server/src/tools/remember.ts +223 -115
- package/mcp-server/src/tools/style-guide-tools.ts +250 -0
- package/mcp-server/src/tools/style-guide.ts +16 -0
- package/mcp-server/src/tools/sync.ts +66 -9
- package/mcp-server/src/tools/tictactoe.ts +3 -1
- package/mcp-server/src/tools/utils.ts +22 -0
- package/mcp-server/src/tools/whiteboard-format.ts +394 -0
- package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
- package/mcp-server/src/tools/whiteboard.ts +7 -5
- package/mcp-server/src/tools/youtube/analytics.ts +106 -0
- package/mcp-server/src/tools/youtube/dedup.ts +57 -0
- package/mcp-server/src/tools/youtube/download.ts +41 -0
- package/mcp-server/src/tools/youtube/helpers.ts +183 -0
- package/mcp-server/src/tools/youtube/media.ts +109 -0
- package/mcp-server/src/tools/youtube/metadata.ts +112 -0
- package/mcp-server/src/tools/youtube/navigate.ts +81 -0
- package/mcp-server/src/tools/youtube/playlist.ts +134 -0
- package/mcp-server/src/tools/youtube/schedule.ts +158 -0
- package/mcp-server/src/tools/youtube/source.ts +101 -0
- package/mcp-server/src/tools/youtube/upload.ts +296 -0
- package/mcp-server/src/tools/youtube.ts +47 -0
- package/mcp-server/src/tui.ts +8 -9
- package/neural-interface/games/TicTacToe/1.svg +1 -0
- package/neural-interface/games/TicTacToe/2.svg +1 -0
- package/neural-interface/games/TicTacToe/3.svg +1 -0
- package/neural-interface/games/TicTacToe/4.svg +1 -0
- package/neural-interface/games/TicTacToe/5.svg +1 -0
- package/neural-interface/games/TicTacToe/6.svg +1 -0
- package/neural-interface/games/TicTacToe/7.svg +1 -0
- package/neural-interface/games/TicTacToe/8.svg +1 -0
- package/neural-interface/games/TicTacToe/9.svg +1 -0
- package/neural-interface/games/TicTacToe/Board.svg +1 -0
- package/neural-interface/games/TicTacToe/Circle.svg +1 -0
- package/neural-interface/games/TicTacToe/Cross.svg +1 -0
- package/neural-interface/i18n/en.json +6983 -0
- package/neural-interface/i18n/pt-BR.json +6987 -0
- package/neural-interface/lib/assistant-api.js +1005 -0
- package/neural-interface/lib/assistant-attachments.js +121 -0
- package/neural-interface/lib/assistant-brains/claude.js +207 -0
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
- package/neural-interface/lib/assistant-brains/codex.js +213 -0
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
- package/neural-interface/lib/assistant-brains/opencode.js +320 -0
- package/neural-interface/lib/assistant-budget.js +318 -0
- package/neural-interface/lib/assistant-catalog.js +731 -0
- package/neural-interface/lib/assistant-clarify.js +664 -0
- package/neural-interface/lib/assistant-config.js +232 -0
- package/neural-interface/lib/assistant-dispatch.js +2744 -0
- package/neural-interface/lib/assistant-envelope.js +579 -0
- package/neural-interface/lib/assistant-evidence.js +236 -0
- package/neural-interface/lib/assistant-hidden-models.js +272 -0
- package/neural-interface/lib/assistant-jev.js +117 -0
- package/neural-interface/lib/assistant-judgments.js +111 -0
- package/neural-interface/lib/assistant-media.js +335 -0
- package/neural-interface/lib/assistant-memory.js +398 -0
- package/neural-interface/lib/assistant-persona.js +444 -0
- package/neural-interface/lib/assistant-plan-permissions.js +448 -0
- package/neural-interface/lib/assistant-playbooks/design.md +87 -0
- package/neural-interface/lib/assistant-playbooks.js +72 -0
- package/neural-interface/lib/assistant-pricing.js +159 -0
- package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
- package/neural-interface/lib/assistant-route-gate.js +212 -0
- package/neural-interface/lib/assistant-router.js +1324 -0
- package/neural-interface/lib/assistant-runtime.js +3337 -0
- package/neural-interface/lib/assistant-task-prompt.js +472 -0
- package/neural-interface/lib/assistant-usage.js +1688 -0
- package/neural-interface/lib/augmented-path.js +50 -0
- package/neural-interface/lib/automation-storage-migration.js +54 -0
- package/neural-interface/lib/backup-service.js +851 -0
- package/neural-interface/lib/backup-zip-reader.js +262 -0
- package/neural-interface/lib/browser-assist-api.js +41 -0
- package/neural-interface/lib/browser-console.js +176 -0
- package/neural-interface/lib/browser-execution.js +241 -0
- package/neural-interface/lib/browser-extraction.js +191 -0
- package/neural-interface/lib/browser-screenshot.js +399 -0
- package/neural-interface/lib/browser-semantic-context.js +639 -0
- package/neural-interface/lib/browser-snapshots.js +192 -0
- package/neural-interface/lib/browser-tab-recovery.js +119 -0
- package/neural-interface/lib/browser-targets.js +70 -0
- package/neural-interface/lib/browser-tool-policy.js +926 -0
- package/neural-interface/lib/claude-accounts.js +230 -0
- package/neural-interface/lib/claude-agent-bridge.js +3296 -0
- package/neural-interface/lib/claude-bypass-policy.js +99 -0
- package/neural-interface/lib/claude-history.js +429 -0
- package/neural-interface/lib/claude-model-catalog.js +483 -0
- package/neural-interface/lib/claude-panel-requests.js +165 -0
- package/neural-interface/lib/claude-panel-session.js +272 -0
- package/neural-interface/lib/claude-permission-rules.js +153 -0
- package/neural-interface/lib/claude-session-cleanup.js +71 -0
- package/neural-interface/lib/claude-session-list.js +82 -0
- package/neural-interface/lib/claude-session-ops.js +140 -0
- package/neural-interface/lib/claude-settings-view.js +51 -0
- package/neural-interface/lib/claude-skin-connect.js +79 -0
- package/neural-interface/lib/claude-stall-policy.js +7 -0
- package/neural-interface/lib/claude-temporary.js +435 -0
- package/neural-interface/lib/cli-update-planner.js +312 -0
- package/neural-interface/lib/codex-capabilities.d.ts +41 -0
- package/neural-interface/lib/codex-capabilities.js +148 -0
- package/neural-interface/lib/codex-collaboration-mode.js +17 -0
- package/neural-interface/lib/codex-compat-rpc.js +241 -0
- package/neural-interface/lib/codex-mcp-approvals.js +56 -0
- package/neural-interface/lib/codex-mcp-apps.js +47 -0
- package/neural-interface/lib/codex-model-context.js +202 -0
- package/neural-interface/lib/codex-plan-store.js +71 -0
- package/neural-interface/lib/codex-request-journal.js +242 -0
- package/neural-interface/lib/codex-runtime-path.js +213 -0
- package/neural-interface/lib/codex-session-catalog.js +231 -0
- package/neural-interface/lib/codex-session-settings.js +46 -0
- package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
- package/neural-interface/lib/codex-thread-history.js +165 -0
- package/neural-interface/lib/codex-user-verification.js +34 -0
- package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
- package/neural-interface/lib/confined-fs.js +256 -0
- package/neural-interface/lib/db.js +922 -0
- package/neural-interface/lib/design-md.js +9 -0
- package/neural-interface/lib/desktop/api.js +92 -0
- package/neural-interface/lib/desktop/audit.js +62 -0
- package/neural-interface/lib/desktop/build.js +423 -0
- package/neural-interface/lib/desktop/config.js +606 -0
- package/neural-interface/lib/desktop/coords.js +76 -0
- package/neural-interface/lib/desktop/fake-helper.js +1192 -0
- package/neural-interface/lib/desktop/frames.js +77 -0
- package/neural-interface/lib/desktop/grants.js +84 -0
- package/neural-interface/lib/desktop/guards.js +170 -0
- package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
- package/neural-interface/lib/desktop/lease.js +51 -0
- package/neural-interface/lib/desktop/manager.js +545 -0
- package/neural-interface/lib/desktop/press-contexts.js +103 -0
- package/neural-interface/lib/desktop/protocol.js +495 -0
- package/neural-interface/lib/desktop/service.js +1202 -0
- package/neural-interface/lib/effort-levels.js +148 -0
- package/neural-interface/lib/event-loop-monitor.js +67 -0
- package/neural-interface/lib/exec-loop-command.js +209 -0
- package/neural-interface/lib/folder-picker.ps1 +77 -0
- package/neural-interface/lib/http-guards.js +287 -0
- package/neural-interface/lib/jsonl-lines.js +94 -0
- package/neural-interface/lib/loop-logger.js +127 -0
- package/neural-interface/lib/mcp-client-config.js +133 -0
- package/neural-interface/lib/mcp-installer.js +487 -0
- package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
- package/neural-interface/lib/mcp-profile-servers.js +120 -0
- package/neural-interface/lib/memo-cache.js +84 -0
- package/neural-interface/lib/memory-api.js +758 -0
- package/neural-interface/lib/memory-map-api.js +1150 -0
- package/neural-interface/lib/memory-map-layout.js +872 -0
- package/neural-interface/lib/memory-map-worker.js +165 -0
- package/neural-interface/lib/memory-session-capture.js +81 -0
- package/neural-interface/lib/memory-timers.js +62 -0
- package/neural-interface/lib/morelogin.js +301 -0
- package/neural-interface/lib/native-binary-runtime.js +650 -0
- package/neural-interface/lib/native-loop-goal.js +33 -0
- package/neural-interface/lib/native-loop-providers.js +1016 -0
- package/neural-interface/lib/native-loop-runtime.js +747 -0
- package/neural-interface/lib/opencode-hidden-models.js +113 -0
- package/neural-interface/lib/opencode-history.js +253 -0
- package/neural-interface/lib/opencode-runtime-config.js +58 -0
- package/neural-interface/lib/opencode-v2-client.js +486 -0
- package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
- package/neural-interface/lib/path-confine.js +213 -0
- package/neural-interface/lib/plugin-installer.js +264 -0
- package/neural-interface/lib/project-storage.js +766 -0
- package/neural-interface/lib/pty-host/core.js +603 -0
- package/neural-interface/lib/pty-host/flow.js +43 -0
- package/neural-interface/lib/pty-host/host.js +47 -0
- package/neural-interface/lib/pty-host/manager.js +360 -0
- package/neural-interface/lib/pty-host/protocol.js +81 -0
- package/neural-interface/lib/pty-host/snapshot.js +133 -0
- package/neural-interface/lib/remote-policy.js +582 -0
- package/neural-interface/lib/rulesets/api.js +175 -0
- package/neural-interface/lib/rulesets/fs-safe.js +245 -0
- package/neural-interface/lib/rulesets/installer.js +1453 -0
- package/neural-interface/lib/rulesets/json-edit.js +186 -0
- package/neural-interface/lib/rulesets/lock.js +170 -0
- package/neural-interface/lib/rulesets/managed-text.js +314 -0
- package/neural-interface/lib/rulesets/normalise.js +24 -0
- package/neural-interface/lib/rulesets/render.js +84 -0
- package/neural-interface/lib/schedule-launch-intent.js +40 -0
- package/neural-interface/lib/session-cache-builder.js +524 -0
- package/neural-interface/lib/session-chunker.js +344 -0
- package/neural-interface/lib/session-indexer.js +327 -0
- package/neural-interface/lib/session-title-generator.js +227 -0
- package/neural-interface/lib/skill-prompt-bridge.js +11 -0
- package/neural-interface/lib/style-guide/api.js +375 -0
- package/neural-interface/lib/style-guide/color.js +352 -0
- package/neural-interface/lib/style-guide/export-css.js +99 -0
- package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
- package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
- package/neural-interface/lib/style-guide/fonts.json +227 -0
- package/neural-interface/lib/style-guide/import.js +1268 -0
- package/neural-interface/lib/style-guide/pointers.js +103 -0
- package/neural-interface/lib/style-guide/presets.js +232 -0
- package/neural-interface/lib/style-guide/render-design-md.js +319 -0
- package/neural-interface/lib/style-guide/schema.js +848 -0
- package/neural-interface/lib/style-guide/security.js +43 -0
- package/neural-interface/lib/style-guide/store.js +491 -0
- package/neural-interface/lib/style-guide/summary.js +106 -0
- package/neural-interface/lib/style-guide/tokens.js +170 -0
- package/neural-interface/lib/synabun-update-plan.js +305 -0
- package/neural-interface/lib/synabun-version.js +179 -0
- package/neural-interface/lib/system-restore.js +99 -0
- package/neural-interface/lib/terminal-env.js +86 -0
- package/neural-interface/lib/ui-blob-store.js +106 -0
- package/neural-interface/lib/vector-cache.js +2 -0
- package/neural-interface/lib/virtual-socket.js +60 -0
- package/neural-interface/lib/whatsapp/api.js +146 -0
- package/neural-interface/lib/whatsapp/auth-store.js +389 -0
- package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
- package/neural-interface/lib/whatsapp/brain.js +128 -0
- package/neural-interface/lib/whatsapp/bridge.js +1499 -0
- package/neural-interface/lib/whatsapp/cards.js +519 -0
- package/neural-interface/lib/whatsapp/commands.js +92 -0
- package/neural-interface/lib/whatsapp/config.js +291 -0
- package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
- package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
- package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
- package/neural-interface/lib/whatsapp/connector/package.json +8 -0
- package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
- package/neural-interface/lib/whatsapp/format.js +552 -0
- package/neural-interface/lib/whatsapp/host-core.js +1225 -0
- package/neural-interface/lib/whatsapp/host.js +119 -0
- package/neural-interface/lib/whatsapp/identity.js +288 -0
- package/neural-interface/lib/whatsapp/inbound.js +149 -0
- package/neural-interface/lib/whatsapp/installer.js +562 -0
- package/neural-interface/lib/whatsapp/manager.js +638 -0
- package/neural-interface/lib/whatsapp/paths.js +81 -0
- package/neural-interface/lib/whatsapp/protocol.js +327 -0
- package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
- package/neural-interface/lib/whatsapp/redact.js +130 -0
- package/neural-interface/lib/whatsapp/service.js +1305 -0
- package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
- package/neural-interface/package-lock.json +4682 -0
- package/neural-interface/package.json +58 -27
- package/neural-interface/public/apple-touch-icon.png +0 -0
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +1 -0
- package/neural-interface/public/favicon-16x16.png +0 -0
- package/neural-interface/public/favicon-32x32.png +0 -0
- package/neural-interface/public/icon-192.png +0 -0
- package/neural-interface/public/icon-512.png +0 -0
- package/neural-interface/public/index.html +32 -182
- package/neural-interface/public/index2d.html +2 -2
- package/neural-interface/public/logo-synabun.png +0 -0
- package/neural-interface/public/logoHD.png +0 -0
- package/neural-interface/public/mcp.svg +4 -0
- package/neural-interface/public/offline.html +335 -299
- package/neural-interface/public/onboarding.html +692 -155
- package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
- package/neural-interface/public/shared/agent-runtime-options.js +596 -0
- package/neural-interface/public/shared/api.js +339 -28
- package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
- package/neural-interface/public/shared/assistant/asst-api.js +270 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
- package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
- package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
- package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
- package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +311 -0
- package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +589 -0
- package/neural-interface/public/shared/assistant/asst-render.js +3296 -0
- package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
- package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
- package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
- package/neural-interface/public/shared/assistant/asst-state.js +727 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +1684 -0
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
- package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
- package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
- package/neural-interface/public/shared/automation-context.js +75 -0
- package/neural-interface/public/shared/blob-store.js +99 -0
- package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
- package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
- package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
- package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
- package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
- package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
- package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
- package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
- package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
- package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
- package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
- package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
- package/neural-interface/public/shared/cli-status.js +169 -0
- package/neural-interface/public/shared/constants.js +22 -5
- package/neural-interface/public/shared/cp/cp-agents.js +186 -0
- package/neural-interface/public/shared/cp/cp-bash.js +252 -0
- package/neural-interface/public/shared/cp/cp-compose.js +159 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
- package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
- package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
- package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
- package/neural-interface/public/shared/cp/cp-diff.js +255 -0
- package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
- package/neural-interface/public/shared/cp/cp-events.js +846 -0
- package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
- package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
- package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
- package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
- package/neural-interface/public/shared/cp/cp-restore.js +224 -0
- package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
- package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
- package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
- package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
- package/neural-interface/public/shared/cp/cp-styles.js +349 -0
- package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
- package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
- package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
- package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
- package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
- package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
- package/neural-interface/public/shared/graph-activity.js +68 -0
- package/neural-interface/public/shared/html-shell.js +107 -12
- package/neural-interface/public/shared/i18n.js +132 -34
- package/neural-interface/public/shared/node-positions-store.js +44 -0
- package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
- package/neural-interface/public/shared/provider-icons.js +30 -0
- package/neural-interface/public/shared/session-title.js +100 -0
- package/neural-interface/public/shared/settings/settings-ia.js +389 -0
- package/neural-interface/public/shared/settings/settings-kit.js +234 -0
- package/neural-interface/public/shared/settings/settings-search.js +463 -0
- package/neural-interface/public/shared/settings/settings-shell.js +570 -0
- package/neural-interface/public/shared/state.js +5 -0
- package/neural-interface/public/shared/storage.js +50 -7
- package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
- package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
- package/neural-interface/public/shared/styleguide/sg-colors.js +148 -0
- package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
- package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
- package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
- package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-import-export.js +47 -0
- package/neural-interface/public/shared/styleguide/sg-kit.js +281 -0
- package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
- package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +229 -0
- package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
- package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
- package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
- package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
- package/neural-interface/public/shared/styleguide/sg-typography.js +124 -0
- package/neural-interface/public/shared/styles.css +7883 -1155
- package/neural-interface/public/shared/synabun-mascot.js +1625 -0
- package/neural-interface/public/shared/synabun-ticker.js +376 -0
- package/neural-interface/public/shared/term-renderer.js +343 -0
- package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
- package/neural-interface/public/shared/ui-assistant.js +77 -0
- package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
- package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
- package/neural-interface/public/shared/ui-codex-panel.js +12 -0
- package/neural-interface/public/shared/ui-cost-widget.js +55 -34
- package/neural-interface/public/shared/ui-detail.js +77 -14
- package/neural-interface/public/shared/ui-explorer.js +360 -181
- package/neural-interface/public/shared/ui-file-explorer.js +485 -107
- package/neural-interface/public/shared/ui-help.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +45 -21
- package/neural-interface/public/shared/ui-judgments.js +1346 -0
- package/neural-interface/public/shared/ui-keybinds.js +3 -2
- package/neural-interface/public/shared/ui-link.js +105 -51
- package/neural-interface/public/shared/ui-loading.js +4 -4
- package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
- package/neural-interface/public/shared/ui-menubar.js +89 -4
- package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
- package/neural-interface/public/shared/ui-native-window-id.js +7 -0
- package/neural-interface/public/shared/ui-navbar.js +357 -222
- package/neural-interface/public/shared/ui-notifications.js +58 -12
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
- package/neural-interface/public/shared/ui-panels.js +15 -7
- package/neural-interface/public/shared/ui-resume.js +823 -653
- package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
- package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
- package/neural-interface/public/shared/ui-sessions.js +789 -34
- package/neural-interface/public/shared/ui-settings.js +5793 -2190
- package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
- package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
- package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
- package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
- package/neural-interface/public/shared/ui-skills.js +18 -32
- package/neural-interface/public/shared/ui-styleguide.js +35 -0
- package/neural-interface/public/shared/ui-sync.js +87 -0
- package/neural-interface/public/shared/ui-terminal.js +7877 -6385
- package/neural-interface/public/shared/ui-tool-updates.js +292 -0
- package/neural-interface/public/shared/ui-tooltip.js +156 -15
- package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
- package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
- package/neural-interface/public/shared/ui-tutorial.css +102 -0
- package/neural-interface/public/shared/ui-tutorial.js +557 -1076
- package/neural-interface/public/shared/ui-update.js +420 -68
- package/neural-interface/public/shared/ui-whatsapp.js +941 -0
- package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
- package/neural-interface/public/shared/ui-workspaces.js +2 -1
- package/neural-interface/public/shared/utils.js +58 -0
- package/neural-interface/public/shared/vterm-buffer.js +15 -5
- package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
- package/neural-interface/public/sidepanel-session.html +18 -0
- package/neural-interface/public/sw.js +8 -2
- package/neural-interface/public/synabun.png +0 -0
- package/neural-interface/public/variant/2d/graph.js +1707 -1635
- package/neural-interface/public/variant/2d/lasso.js +2 -1
- package/neural-interface/public/variant/2d/layout.js +595 -594
- package/neural-interface/public/variant/2d/main.js +556 -521
- package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
- package/neural-interface/public/variant/3d/main.js +516 -500
- package/neural-interface/public/variant/3d/map-controls.js +144 -0
- package/neural-interface/public/variant/3d/map-data.js +251 -0
- package/neural-interface/public/variant/3d/map-labels.js +241 -0
- package/neural-interface/public/variant/3d/map-pick.js +90 -0
- package/neural-interface/public/variant/3d/map-renderer.js +521 -0
- package/neural-interface/public/variant/3d/map-shaders.js +158 -0
- package/neural-interface/public/variant/3d/map-view.js +618 -0
- package/neural-interface/public/vendor/three/manifest.json +3 -0
- package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
- package/neural-interface/public/vendor/xterm/manifest.json +3 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
- package/neural-interface/scripts/build-vendor.mjs +64 -0
- package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
- package/neural-interface/scripts/rebuild-pty.js +37 -23
- package/neural-interface/scripts/vendor-three-entry.js +24 -0
- package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
- package/neural-interface/server.js +33948 -15000
- package/neural-interface/skins/default/skin.css +90 -0
- package/neural-interface/skins/default/skin.json +8 -0
- package/neural-interface/templates/rulesets/README.md +9 -0
- package/neural-interface/templates/rulesets/claude.md +3 -0
- package/neural-interface/templates/rulesets/codex.md +2 -0
- package/neural-interface/templates/rulesets/coexistence.md +6 -0
- package/neural-interface/templates/rulesets/core.md +26 -0
- package/neural-interface/templates/rulesets/cursor.md +2 -0
- package/neural-interface/templates/rulesets/gemini.md +2 -0
- package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
- package/neural-interface/templates/rulesets/manifest.json +12 -0
- package/neural-interface/templates/rulesets/opencode.md +2 -0
- package/package.json +119 -53
- package/postinstall.js +125 -26
- package/preuninstall.js +187 -0
- package/scripts/audit-claude-hook-usage.mjs +12 -0
- package/scripts/audit-memory-duplicates.mjs +44 -0
- package/scripts/measure-claude-hook-overhead.mjs +77 -0
- package/scripts/recover-user-config.mjs +254 -0
- package/scripts/restore-data-home-from-backup.mjs +239 -0
- package/setup.js +804 -260
- package/skills/leonardo/SKILL.md +19 -10
- package/skills/leonardo/modules/image-prompter.md +18 -12
- package/skills/leonardo/modules/video-prompter.md +19 -13
- package/skills/synabun/SKILL.md +209 -185
- package/skills/synabun/icon.png +0 -0
- package/skills/synabun/modules/audit.md +380 -374
- package/skills/synabun/modules/changelog.md +15 -6
- package/skills/synabun/modules/idea.md +148 -144
- package/skills/synabun/modules/memorize.md +13 -4
- package/skills/synabun/modules/schedule.md +198 -0
- package/skills/synabun/synabunicon.png +0 -0
- package/updater.cmd +31 -0
- package/updater.mjs +382 -0
- package/updater.sh +29 -0
- package/hooks/claude-code/test-user-learning.mjs +0 -531
- package/neural-interface/public/claude-chat.css +0 -878
- package/neural-interface/public/claude-chat.html +0 -92
- package/neural-interface/public/claude-chat.js +0 -1168
- package/neural-interface/public/index-legacy.html +0 -14677
- package/neural-interface/public/index2d-legacy.html +0 -8193
- package/neural-interface/public/shared/html-term-renderer.js +0 -1022
- package/neural-interface/public/variant/3d/background.js +0 -884
- package/neural-interface/public/variant/3d/camera.js +0 -661
- package/neural-interface/public/variant/3d/gfx.js +0 -116
- package/neural-interface/public/variant/3d/graph.js +0 -2399
- package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
- package/neural-interface/templates/CLAUDE-template.md +0 -211
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — WhatsApp Link: the Assistant's cards as chat messages
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Pure. A card is one open request the phone may resolve: the brain's own
|
|
6
|
+
// (permission, question, plan, Codex approval, MCP elicitation), a route card,
|
|
7
|
+
// a clarify card, or a worker's permission request. On WhatsApp it reads like
|
|
8
|
+
// a person asking: a question is one plain message (its options folded into a
|
|
9
|
+
// sentence, never a numbered list), an approval is one yes / no question.
|
|
10
|
+
//
|
|
11
|
+
// A reply is matched deterministically:
|
|
12
|
+
// an approval "yes" (the whole message) grants it once; "no", "skip",
|
|
13
|
+
// "cancel" deny it; a route card also takes the name of one of
|
|
14
|
+
// the models it offered. Nothing else ever grants anything.
|
|
15
|
+
// a question the owner's text is the answer (an option's name becomes that
|
|
16
|
+
// option); "skip" declines.
|
|
17
|
+
// Whatever is not an answer comes back as { action: 'prompt' }: the bridge
|
|
18
|
+
// then closes the card fail-closed and carries on with the message.
|
|
19
|
+
// The response is the SAME one the desktop panel would send, built with the
|
|
20
|
+
// panel's own helpers (asst-control.js, asst-route.js) — minus everything a
|
|
21
|
+
// phone must never grant: "always", updatedPermissions, a remembered route,
|
|
22
|
+
// a plan decision other than 'default'.
|
|
23
|
+
//
|
|
24
|
+
// An approvable tool card shows the whole request exactly as it runs: every
|
|
25
|
+
// argument, verbatim, each in a code span (so WhatsApp formatting cannot hide
|
|
26
|
+
// a character), never shortened or rewritten. Tool cards the phone cannot
|
|
27
|
+
// judge stay on the desktop: a tool a remote session never runs, computer use,
|
|
28
|
+
// (a computer tool card; the "control your Mac for this?" request below is
|
|
29
|
+
// its own kind and is the phone's to answer),
|
|
30
|
+
// a request longer than 600 characters once shown in full, several lines,
|
|
31
|
+
// control / bidi / zero-width characters, a backtick (it would end the code
|
|
32
|
+
// span), and approvals whose content the phone cannot show (Codex file changes,
|
|
33
|
+
// permission grants and input to a running command, MCP tool-call approvals).
|
|
34
|
+
// The phone may still deny them.
|
|
35
|
+
//
|
|
36
|
+
// Computer use at the Ask level is one request of its own kind per turn
|
|
37
|
+
// (kind 'computer', raised by the runtime at the first computer tool call):
|
|
38
|
+
// "Want me to control your Mac for this? I'll stop when this task is done."
|
|
39
|
+
// A plain yes grants it for that turn only; it carries no arguments, so there
|
|
40
|
+
// is nothing to show and nothing a reply could change.
|
|
41
|
+
//
|
|
42
|
+
// One yes, not two: when a route card is for a computer task done here on the
|
|
43
|
+
// Assistant's own model, the router marks the option a plain yes approves
|
|
44
|
+
// (`route.computer.optionId`) and the card says the Mac will be controlled:
|
|
45
|
+
// "…want me to do it on your Mac, here with <model>? I'll control the screen
|
|
46
|
+
// until this task is done." A yes to that card is also the computer approval
|
|
47
|
+
// (the runtime binds it to the turn that carries the route out). Naming another
|
|
48
|
+
// model, or a card without that sentence, approves the route only.
|
|
49
|
+
|
|
50
|
+
import { CONTROL_KINDS, buildControlResponse, describeToolInput, normalizeAnswers, normalizeControlRequest } from '../../public/shared/assistant/asst-control.js';
|
|
51
|
+
import { buildRouteResponse, normalizeRouteRequest, routeOptions } from '../../public/shared/assistant/asst-route.js';
|
|
52
|
+
import { isComputerTool, isDeniedRemoteTool } from '../remote-policy.js';
|
|
53
|
+
|
|
54
|
+
// Codes a person can read out loud: no 0/O, 1/I/L, 2/Z, 5/S, 8/B.
|
|
55
|
+
const TAG_ALPHABET = 'ACDEFGHJKMNPQRTUVWXY34679';
|
|
56
|
+
const REPLY_RE = /^\s*(\d{1,2}(?:\s*,\s*\d{1,2})*)[.)]?\s*([\s\S]*)$/;
|
|
57
|
+
// The most a phone card shows of an approvable request (every argument, in full).
|
|
58
|
+
const MAX_INPUT_CHARS = 600;
|
|
59
|
+
// C0/C1 controls (a newline counts as "several lines"), bidi overrides and isolates, zero-width and other format characters.
|
|
60
|
+
const HIDDEN_CHARS = /[\p{Cc}\p{Cf}\u2028\u2029]/u;
|
|
61
|
+
const DESKTOP_METHODS = new Set(['item/fileChange/requestApproval', 'item/permissions/requestApproval']);
|
|
62
|
+
const CODEX_COMMAND_METHOD = 'item/commandExecution/requestApproval';
|
|
63
|
+
// Shown first when present: what the request acts on.
|
|
64
|
+
const LEAD_KEYS = ['command', 'cmd', 'file_path', 'filePath', 'filepath', 'notebook_path', 'path', 'url'];
|
|
65
|
+
|
|
66
|
+
const clean = (value) => String(value ?? '').replace(/\s+/g, ' ').trim();
|
|
67
|
+
function clip(value, max = 160) { const text = clean(value); return text.length > max ? `${text.slice(0, max - 1)}…` : text; }
|
|
68
|
+
|
|
69
|
+
export function randomTag(rng = Math.random) {
|
|
70
|
+
let out = '';
|
|
71
|
+
for (let i = 0; i < 3; i += 1) out += TAG_ALPHABET[Math.floor((Number(rng()) || 0) * TAG_ALPHABET.length) % TAG_ALPHABET.length];
|
|
72
|
+
return out;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// A yes is the whole message and nothing else ("yes but only the tests" is not one).
|
|
76
|
+
const YES_RE = /^(?:y|yes|yep|yeah|yup|ok|okay|sure|approve|approved|allow|allowed|go ahead|go for it|do it|please do|yes please|sim|s[ií]|oui|ja|👍[\u{1F3FB}-\u{1F3FF}]?)$/iu;
|
|
77
|
+
// A no may carry a note ("no, not now"): the note goes with the denial.
|
|
78
|
+
const NO_RE = /^(no thanks|no thank you|nope|nah|no|n|deny|denied|decline|declined|n[aã]o|non|nein|👎[\u{1F3FB}-\u{1F3FF}]?)(?=$|[\s,.;:!-])[\s,.;:!-]*([\s\S]*)$/iu;
|
|
79
|
+
const trimEnd = (value) => String(value ?? '').trim().replace(/[\s.!…]+$/u, '');
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* A reply to a card: { type:'yes' } | { type:'no'|'skip'|'cancel', rest } | { type:'numbers', numbers, rest }
|
|
83
|
+
* | { type:'text', text }. Deterministic: the same text always reads the same way.
|
|
84
|
+
*/
|
|
85
|
+
export function parseCardReply(text) {
|
|
86
|
+
const raw = String(text ?? '').trim();
|
|
87
|
+
const numbered = REPLY_RE.exec(raw);
|
|
88
|
+
if (numbered) return { type: 'numbers', numbers: numbered[1].split(',').map((n) => Number(n.trim())), rest: numbered[2].trim() };
|
|
89
|
+
const word = /^(skip|cancel)\b[.!]?\s*([\s\S]*)$/i.exec(raw);
|
|
90
|
+
if (word) return { type: word[1].toLowerCase(), rest: word[2].trim() };
|
|
91
|
+
if (YES_RE.test(trimEnd(raw))) return { type: 'yes', rest: '' };
|
|
92
|
+
const no = NO_RE.exec(raw);
|
|
93
|
+
if (no) return { type: 'no', rest: no[2].trim() };
|
|
94
|
+
return { type: 'text', text: raw };
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* A reply that is nothing but an answer: "yes", or "no" / "skip" / "cancel" / option numbers
|
|
99
|
+
* with no other words. "1. Explain the command first" and "no, use staging" say more than
|
|
100
|
+
* that: aimed at a request that is gone, they are the owner's next message, not a late answer.
|
|
101
|
+
*/
|
|
102
|
+
export function isBareAnswer(text) {
|
|
103
|
+
const parsed = parseCardReply(text);
|
|
104
|
+
if (parsed.type === 'text') return false;
|
|
105
|
+
return parsed.type === 'yes' || !parsed.rest;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Every string in a value, object keys included (bounded; `overflow` is set past the bound). */
|
|
109
|
+
function strings(value, out = [], depth = 0) {
|
|
110
|
+
if (depth > 6) { out.overflow = true; return out; }
|
|
111
|
+
if (out.length > 200) { out.overflow = true; return out; }
|
|
112
|
+
if (value === null || value === undefined) return out;
|
|
113
|
+
if (typeof value === 'string') out.push(value);
|
|
114
|
+
else if (Array.isArray(value)) for (const item of value) strings(item, out, depth + 1);
|
|
115
|
+
else if (typeof value === 'object') for (const [key, item] of Object.entries(value)) { out.push(key); strings(item, out, depth + 1); }
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function inputOf(normalized) {
|
|
120
|
+
return normalized?.input && typeof normalized.input === 'object' ? normalized.input : {};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* The approvable request as [label, text] rows, each text exactly what runs
|
|
125
|
+
* (strings verbatim, anything else as JSON): a Codex command approval is its
|
|
126
|
+
* command and the folder it runs in (plus the network host it asks for);
|
|
127
|
+
* everything else is every argument of the call, what it acts on first.
|
|
128
|
+
*/
|
|
129
|
+
export function approvalRows(normalized) {
|
|
130
|
+
const input = inputOf(normalized);
|
|
131
|
+
const text = (value) => (typeof value === 'string' ? value : JSON.stringify(value) ?? '');
|
|
132
|
+
if (normalized?.method === CODEX_COMMAND_METHOD) {
|
|
133
|
+
const rows = [['command', text(input.command ?? '')]];
|
|
134
|
+
if (input.cwd !== undefined && input.cwd !== null) rows.push(['cwd', text(input.cwd)]);
|
|
135
|
+
if (input.networkApprovalContext) rows.push(['network', text(input.networkApprovalContext)]);
|
|
136
|
+
return rows;
|
|
137
|
+
}
|
|
138
|
+
const keys = Object.keys(input);
|
|
139
|
+
const ordered = [...LEAD_KEYS.filter((key) => keys.includes(key)), ...keys.filter((key) => !LEAD_KEYS.includes(key))];
|
|
140
|
+
return ordered.filter((key) => input[key] !== undefined && input[key] !== null).map((key) => [key, text(input[key])]);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Why a tool card must be approved on the desktop, else null. */
|
|
144
|
+
export function toolCardDesktopReason(normalized) {
|
|
145
|
+
if (!normalized) return 'unknown request';
|
|
146
|
+
const tool = String(normalized.toolName || '');
|
|
147
|
+
const input = inputOf(normalized);
|
|
148
|
+
if (DESKTOP_METHODS.has(normalized.method)) return 'the phone cannot show what it changes';
|
|
149
|
+
if (normalized.method === CODEX_COMMAND_METHOD && input.kind && input.kind !== 'command') return 'the phone cannot show what it sends to a running command';
|
|
150
|
+
if (isComputerTool(tool)) return 'computer use is not available from WhatsApp';
|
|
151
|
+
if (isDeniedRemoteTool(tool, input)) return 'a WhatsApp session never runs this';
|
|
152
|
+
let rows;
|
|
153
|
+
try { rows = approvalRows(normalized); } catch { return 'the request cannot be shown'; }
|
|
154
|
+
// Every string of the request (keys too), shown or not.
|
|
155
|
+
const values = strings(input);
|
|
156
|
+
if (values.overflow) return 'the request is too long to check on a phone';
|
|
157
|
+
if (values.some((value) => /[\r\n]/.test(value))) return 'the request spans several lines';
|
|
158
|
+
if (values.some((value) => HIDDEN_CHARS.test(value))) return 'the request contains hidden characters';
|
|
159
|
+
const shown = rows.flat();
|
|
160
|
+
if (shown.some((value) => HIDDEN_CHARS.test(value) || /[\r\n]/.test(value))) return 'the request contains hidden characters';
|
|
161
|
+
if (shown.some((value) => value.includes('`'))) return 'the request cannot be shown exactly on a phone';
|
|
162
|
+
if (shown.reduce((sum, value) => sum + value.length, 0) > MAX_INPUT_CHARS) return 'the request is too long to check on a phone';
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function isApprovalElicitation(normalized) {
|
|
167
|
+
if (normalized?.kind !== CONTROL_KINDS.ELICITATION) return false;
|
|
168
|
+
const params = normalized.input || {};
|
|
169
|
+
const meta = params._meta ?? params.meta ?? {};
|
|
170
|
+
return meta.codex_approval_kind === 'mcp_tool_call';
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* A card from a runtime packet: a control_request (brain, route, clarify) or a
|
|
175
|
+
* synabun.dispatch_control_request event; null for anything else. `level` is
|
|
176
|
+
* the session's remote level: at read-only a permission, a plan and a route
|
|
177
|
+
* are the desktop's.
|
|
178
|
+
*/
|
|
179
|
+
export function cardFromPacket(packet, { sessionId = null, level = 'ask', now = Date.now() } = {}) {
|
|
180
|
+
if (!packet || typeof packet !== 'object') return null;
|
|
181
|
+
let normalized = null;
|
|
182
|
+
let source = 'brain';
|
|
183
|
+
let runId = null;
|
|
184
|
+
if (packet.type === 'control_request') {
|
|
185
|
+
normalized = normalizeControlRequest(packet);
|
|
186
|
+
if (normalized?.kind === CONTROL_KINDS.ROUTE) source = 'route';
|
|
187
|
+
else if (normalized?.kind === CONTROL_KINDS.CLARIFY) source = 'clarify';
|
|
188
|
+
} else if (packet.type === 'event' && packet.event?.type === 'synabun.dispatch_control_request') {
|
|
189
|
+
const ev = packet.event;
|
|
190
|
+
runId = ev.runId ? String(ev.runId) : null;
|
|
191
|
+
if (!runId) return null;
|
|
192
|
+
normalized = normalizeControlRequest({ request_id: ev.request_id || ev.request?.requestId, request: ev.request, provider: ev.provider, runId }, { origin: { runId, provider: ev.provider || null } });
|
|
193
|
+
source = 'dispatch';
|
|
194
|
+
} else {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
if (!normalized) return null;
|
|
198
|
+
const card = {
|
|
199
|
+
key: `${sessionId || ''}:${source}:${runId || ''}:${normalized.requestId}`,
|
|
200
|
+
source, sessionId, requestId: normalized.requestId, runId, kind: normalized.kind, provider: normalized.provider,
|
|
201
|
+
normalized, route: null, routeChoices: [], questions: [], step: 0, answers: [],
|
|
202
|
+
desktopOnly: null, tag: null, createdAt: now, messageIds: [],
|
|
203
|
+
};
|
|
204
|
+
if (card.kind === CONTROL_KINDS.ROUTE) {
|
|
205
|
+
card.route = normalizeRouteRequest(packet);
|
|
206
|
+
if (!card.route) return null;
|
|
207
|
+
card.routeChoices = routeOptions(card.route).filter((option) => !option.disabled).map((option, index) => ({ ...option, number: index + 1 }));
|
|
208
|
+
if (!card.routeChoices.length) card.desktopOnly = 'no option can be picked from the phone';
|
|
209
|
+
if (level === 'read-only') card.desktopOnly = 'this WhatsApp session is read-only';
|
|
210
|
+
} else if (card.kind === CONTROL_KINDS.QUESTION || card.kind === CONTROL_KINDS.CLARIFY || (card.kind === CONTROL_KINDS.ELICITATION && !isApprovalElicitation(normalized))) {
|
|
211
|
+
card.questions = normalized.questions || [];
|
|
212
|
+
if (!card.questions.length) card.desktopOnly = 'the question cannot be shown';
|
|
213
|
+
} else if (card.kind === CONTROL_KINDS.PLAN) {
|
|
214
|
+
if (level === 'read-only') card.desktopOnly = 'this WhatsApp session is read-only';
|
|
215
|
+
} else if (card.kind === CONTROL_KINDS.COMPUTER) {
|
|
216
|
+
// The runtime raises it only when the level allows; a level lowered since makes it the desktop's.
|
|
217
|
+
if (level === 'read-only') card.desktopOnly = 'this WhatsApp session is read-only';
|
|
218
|
+
} else {
|
|
219
|
+
// A permission (or an approval in the shape of an elicitation).
|
|
220
|
+
card.kind = CONTROL_KINDS.PERMISSION;
|
|
221
|
+
card.desktopOnly = isApprovalElicitation(normalized) ? 'the phone cannot show what it approves' : toolCardDesktopReason(normalized);
|
|
222
|
+
if (!card.desktopOnly && level === 'read-only') card.desktopOnly = 'this WhatsApp session is read-only';
|
|
223
|
+
}
|
|
224
|
+
return card;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* The request's lines. Approvable (desktopOnly null): every argument in full,
|
|
229
|
+
* each in a code span — a lone command as "Tool: `command`". A desktop-only
|
|
230
|
+
* card cannot be approved here, so it names the request in one short line.
|
|
231
|
+
*/
|
|
232
|
+
function toolLines(card) {
|
|
233
|
+
const normalized = card.normalized || {};
|
|
234
|
+
const tool = String(normalized.toolName || 'a tool');
|
|
235
|
+
if (card.desktopOnly) {
|
|
236
|
+
const detail = clip(normalized.detail || describeToolInput(tool, normalized.input), 160);
|
|
237
|
+
return [detail ? `${tool}: ${detail}` : tool];
|
|
238
|
+
}
|
|
239
|
+
const rows = approvalRows(normalized);
|
|
240
|
+
const code = (value) => (value === '' ? '(empty)' : `\`${value}\``);
|
|
241
|
+
if (!rows.length) return [tool];
|
|
242
|
+
if (rows.length === 1 && (rows[0][0] === 'command' || rows[0][0] === 'cmd')) return [`${tool}: ${code(rows[0][1])}`];
|
|
243
|
+
return [tool, ...rows.map(([key, value]) => `${key}: ${code(value)}`)];
|
|
244
|
+
}
|
|
245
|
+
// Several open requests (or one right after another was answered elsewhere): a yes names its card.
|
|
246
|
+
function tagHint(card) { return card.tag ? `\nMore than one thing is waiting, so add the code ${card.tag} to a yes: "yes ${card.tag}".` : ''; }
|
|
247
|
+
const joinOr = (items) => (items.length <= 1 ? (items[0] || '') : `${items.slice(0, -1).join(', ')} or ${items[items.length - 1]}`);
|
|
248
|
+
const isQuestionCard = (card) => card.kind === CONTROL_KINDS.QUESTION || card.kind === CONTROL_KINDS.CLARIFY || card.kind === CONTROL_KINDS.ELICITATION;
|
|
249
|
+
|
|
250
|
+
/** One question as a person would ask it: its text, then the options folded into a sentence. */
|
|
251
|
+
function questionLine(q = {}) {
|
|
252
|
+
const text = clean(q.text || q.header) || 'What would you like?';
|
|
253
|
+
const options = (q.options || []).slice(0, 8).map((option) => `${clean(option.label)}${option.description ? ` (${clip(option.description, 60)})` : ''}`).filter(Boolean);
|
|
254
|
+
if (!options.length) return text;
|
|
255
|
+
return `${text} ${joinOr(options)}${q.multiple ? ' (more than one is fine)' : ''}, or tell me something else.`;
|
|
256
|
+
}
|
|
257
|
+
/** The questions of a card as one message: one line for one question, a short list for several. */
|
|
258
|
+
function questionLines(card, lead, leadMany) {
|
|
259
|
+
const questions = card.questions.length ? card.questions : [{}];
|
|
260
|
+
if (questions.length === 1) return [`${lead}${questionLine(questions[0])}`];
|
|
261
|
+
return [leadMany, ...questions.map((q) => `- ${questionLine(q)}`), 'One message with your answers is fine.'];
|
|
262
|
+
}
|
|
263
|
+
/** What picking a route choice means, in words: "do it here with Sonnet 5" / "hand it to GPT-6 Sol". */
|
|
264
|
+
function choiceName(choice) {
|
|
265
|
+
// The router labels a "here" option "Do it here with <model>": the sentence names the model only.
|
|
266
|
+
const strip = (value) => clean(value).replace(/^do it here with /i, '');
|
|
267
|
+
return strip(choice.label) || strip(choice.title) || 'that model';
|
|
268
|
+
}
|
|
269
|
+
function routePhrase(choice, { it = 'it', other = false } = {}) {
|
|
270
|
+
if (choice.here) return `do ${it} here with ${choiceName(choice)}`;
|
|
271
|
+
return other ? `use ${choiceName(choice)}` : `hand ${it} to ${choiceName(choice)}`;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* The card as a WhatsApp message, written the way a person asks: a question in
|
|
276
|
+
* one message (never a numbered list), an approval as one yes / no question.
|
|
277
|
+
* `formatPlan` turns the plan's markdown into WhatsApp text.
|
|
278
|
+
*/
|
|
279
|
+
export function renderCard(card, { formatPlan = (text) => text } = {}) {
|
|
280
|
+
if (!card) return '';
|
|
281
|
+
const n = card.normalized || {};
|
|
282
|
+
if (card.kind === CONTROL_KINDS.ROUTE) {
|
|
283
|
+
const route = card.route || {};
|
|
284
|
+
const [first, ...others] = card.routeChoices;
|
|
285
|
+
const what = clip(route.summary, 160);
|
|
286
|
+
if (!first) return `${what ? `"${what}": ` : ''}I can't take the choice of model for this from the phone. Pick it in SynaBun on your computer, or say no and I'll drop it.`;
|
|
287
|
+
// The option a plain yes approves is the one the router marked: that yes also lets the Assistant control the Mac for this task.
|
|
288
|
+
const mac = routeControlsMac(card);
|
|
289
|
+
const lines = mac
|
|
290
|
+
? [what ? `For "${what}", want me to do it on your Mac, here with ${choiceName(first)}? ${ROUTE_MAC_SENTENCE} (yes / no)` : `Want me to do this on your Mac, here with ${choiceName(first)}? ${ROUTE_MAC_SENTENCE} (yes / no)`]
|
|
291
|
+
: [what ? `For "${what}", want me to ${routePhrase(first)}? (yes / no)` : `Want me to ${routePhrase(first, { it: 'this' })}? (yes / no)`];
|
|
292
|
+
if (card.desktopOnly) {
|
|
293
|
+
lines[0] = lines[0].replace(' (yes / no)', '');
|
|
294
|
+
lines.push(`I can't take that choice from the phone (${card.desktopOnly}): pick it in SynaBun on your computer, or say no and I'll drop it.`);
|
|
295
|
+
return lines.join('\n');
|
|
296
|
+
}
|
|
297
|
+
if (others.length) lines.push(`I could also ${joinOr(others.slice(0, 4).map((choice) => routePhrase(choice, { other: true })))}: just name it.${mac ? ' Then I ask about the Mac separately.' : ''}`);
|
|
298
|
+
return `${lines.join('\n')}${tagHint(card)}`;
|
|
299
|
+
}
|
|
300
|
+
if (card.kind === CONTROL_KINDS.CLARIFY) {
|
|
301
|
+
const clarify = n.clarify || {};
|
|
302
|
+
const about = clarify.summary ? ` on "${clip(clarify.summary, 120)}"` : '';
|
|
303
|
+
const lines = questionLines(card, `Before I start${about}: `, `Before I start${about}, a few quick questions:`);
|
|
304
|
+
const assumptions = (clarify.assumptions || []).slice(0, 5).map((assumption) => clip(assumption, 160));
|
|
305
|
+
lines.push(assumptions.length ? `Or say "skip" and I'll go with: ${assumptions.join('; ')}.` : 'Or say "skip" and I\'ll go with my best guess.');
|
|
306
|
+
return lines.join('\n');
|
|
307
|
+
}
|
|
308
|
+
if (card.kind === CONTROL_KINDS.QUESTION || card.kind === CONTROL_KINDS.ELICITATION) {
|
|
309
|
+
const worker = card.source === 'dispatch';
|
|
310
|
+
if (card.kind === CONTROL_KINDS.ELICITATION) {
|
|
311
|
+
const tool = clip(n.toolName || 'A tool', 60);
|
|
312
|
+
const lines = [n.message ? `${tool} needs something from you: ${clip(n.message, 300)}` : `${tool} needs something from you.`];
|
|
313
|
+
lines.push(...questionLines(card, '', 'A few things:'));
|
|
314
|
+
return lines.join('\n');
|
|
315
|
+
}
|
|
316
|
+
return questionLines(card, worker ? 'One of the agents is asking: ' : '', worker ? 'One of the agents has a few questions:' : 'A few quick questions:').join('\n');
|
|
317
|
+
}
|
|
318
|
+
if (card.kind === CONTROL_KINDS.PLAN) {
|
|
319
|
+
const plan = String(n.plan || '').trim();
|
|
320
|
+
const lines = ["Here's my plan:"];
|
|
321
|
+
if (plan) lines.push(formatPlan(plan));
|
|
322
|
+
lines.push(card.desktopOnly
|
|
323
|
+
? `I can't take a yes for the plan from the phone (${card.desktopOnly}): approve it in SynaBun on your computer, or tell me what to change.`
|
|
324
|
+
: `Shall I go ahead? (yes / no, or tell me what to change)${tagHint(card)}`);
|
|
325
|
+
return lines.join('\n');
|
|
326
|
+
}
|
|
327
|
+
if (card.kind === CONTROL_KINDS.COMPUTER) {
|
|
328
|
+
if (card.desktopOnly) return `I'd need to control your Mac for this, and I can't take a yes for that from the phone (${card.desktopOnly}): answer in SynaBun on your computer, or say no and I'll skip it.`;
|
|
329
|
+
return `${COMPUTER_ASK_TEXT}${tagHint(card)}`;
|
|
330
|
+
}
|
|
331
|
+
const worker = card.source === 'dispatch' ? `One of the agents${card.provider && card.provider !== 'claude-code' ? ` (${card.provider})` : ''}` : null;
|
|
332
|
+
const lines = [worker ? `${worker} needs your OK to run this:` : 'I need your OK to run this:', ...toolLines(card)];
|
|
333
|
+
if (n.message && n.message !== n.detail) lines.push(clip(n.message, 200));
|
|
334
|
+
if (card.desktopOnly) lines.push(`I can't take a yes for this one from the phone (${card.desktopOnly}): approve it in SynaBun on your computer, or say no and I'll skip it.`);
|
|
335
|
+
else lines.push(`OK to go ahead? (yes / no)${tagHint(card)}`);
|
|
336
|
+
return lines.join('\n');
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/** What a route card adds when its yes is also the computer approval (the router's `computer.optionId`). */
|
|
340
|
+
export const ROUTE_MAC_SENTENCE = "I'll control the screen until this task is done.";
|
|
341
|
+
/**
|
|
342
|
+
* This route card says the Mac will be controlled: the router marked an option
|
|
343
|
+
* (`route.computer.optionId`) and it is the one a plain yes approves here (the
|
|
344
|
+
* first choice), on the phone's own level. Anything else is a plain route card.
|
|
345
|
+
*/
|
|
346
|
+
export function routeControlsMac(card) {
|
|
347
|
+
const marked = card?.route?.computer?.optionId;
|
|
348
|
+
const first = card?.routeChoices?.[0];
|
|
349
|
+
return !!marked && !!first && !card.desktopOnly && first.id === marked && first.here === true;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** The one question a turn asks before it controls the Mac at the Ask level. "This task" is the turn that asks. */
|
|
353
|
+
export const COMPUTER_ASK_TEXT = "Want me to control your Mac for this? I'll stop when this task is done. (yes / no)";
|
|
354
|
+
/** What the brain is told when the owner says no to it. */
|
|
355
|
+
export const COMPUTER_DECLINED_NOTE = 'The user said no to computer use for this task. Do not retry it or work around it in this task: say what you could not do.';
|
|
356
|
+
|
|
357
|
+
/** What a phone must never grant, removed from a response the panel's helpers built. */
|
|
358
|
+
export function sanitizeResponse(response) {
|
|
359
|
+
if (!response || typeof response !== 'object') return response;
|
|
360
|
+
const out = { ...response };
|
|
361
|
+
delete out.always;
|
|
362
|
+
delete out.updatedPermissions;
|
|
363
|
+
delete out.persist;
|
|
364
|
+
if (out.kind === 'route' && 'remember' in out) out.remember = false;
|
|
365
|
+
if ('planDecision' in out && out.planDecision !== 'default') out.planDecision = 'default';
|
|
366
|
+
return out;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
function respond(card, response, summary) { return { action: 'respond', response: sanitizeResponse(response), summary }; }
|
|
370
|
+
function deny(card, note = '') {
|
|
371
|
+
const message = clean(note);
|
|
372
|
+
if (card.kind === CONTROL_KINDS.ROUTE) return respond(card, buildRouteResponse(card.route, { decline: true }), 'cancelled');
|
|
373
|
+
if (card.kind === CONTROL_KINDS.CLARIFY) return respond(card, buildControlResponse(card.normalized, { behavior: 'deny', message: message || undefined }), 'skipped');
|
|
374
|
+
if (card.kind === CONTROL_KINDS.PLAN) return respond(card, buildControlResponse(card.normalized, { behavior: 'deny', message: message || undefined }), 'keep planning');
|
|
375
|
+
if (card.kind === CONTROL_KINDS.COMPUTER) return respond(card, buildControlResponse(card.normalized, { behavior: 'deny', message: message ? `${COMPUTER_DECLINED_NOTE} They added: ${message}` : COMPUTER_DECLINED_NOTE }), 'denied');
|
|
376
|
+
const fallback = card.kind === CONTROL_KINDS.PERMISSION ? 'Declined on WhatsApp.' : '';
|
|
377
|
+
return respond(card, buildControlResponse(card.normalized, { behavior: 'deny', message: message || fallback || undefined }), card.kind === CONTROL_KINDS.PERMISSION ? 'denied' : 'declined');
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* What the brain is told when a card closes because the owner wrote something
|
|
382
|
+
* else instead of answering it. It ends its turn without a closing line ("OK, I
|
|
383
|
+
* won't") but keeps a result it has: the bridge forwards whatever it still says.
|
|
384
|
+
*/
|
|
385
|
+
export const MOVED_ON_NOTE = 'The user did not answer this on WhatsApp: they sent a new message instead, which you get next. Nothing was approved. Do not retry this or work around it. End your turn now, with no text unless you have a result to report.';
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Close a card without granting anything (the owner moved on): a denial for a
|
|
389
|
+
* permission, a question or a plan, a cancelled route or clarify round.
|
|
390
|
+
* `superseded` tells the runtime not to treat it as the owner's own "no"
|
|
391
|
+
* (no "route declined" event, no plan revision, no "go with your assumptions").
|
|
392
|
+
*/
|
|
393
|
+
export function failClosedResponse(card, note = MOVED_ON_NOTE) {
|
|
394
|
+
if (!card) return null;
|
|
395
|
+
if (card.kind === CONTROL_KINDS.ROUTE) return { ...buildRouteResponse(card.route, { decline: true }), superseded: true };
|
|
396
|
+
return { ...sanitizeResponse(buildControlResponse(card.normalized, { behavior: 'deny', message: note })), superseded: true };
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
function stripTag(rest, tag) {
|
|
400
|
+
if (!tag) return { ok: true, rest };
|
|
401
|
+
const re = new RegExp(`(^|\\s)${tag}(?=\\s|$|[.,!])`, 'i');
|
|
402
|
+
if (!re.test(rest)) return { ok: false, rest };
|
|
403
|
+
return { ok: true, rest: rest.replace(re, ' ').trim() };
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const plain = (value) => clean(value).toLowerCase().replace(/[“”"'`’.,!?;:()]/g, '').replace(/\s+/g, ' ').trim();
|
|
407
|
+
/** The option of a question the reply names (its label, as typed or without punctuation), else null. */
|
|
408
|
+
function matchOption(options, text) {
|
|
409
|
+
const said = plain(text);
|
|
410
|
+
if (!said) return null;
|
|
411
|
+
const hits = (options || []).filter((option) => plain(option.label) === said);
|
|
412
|
+
return hits.length === 1 ? hits[0] : null;
|
|
413
|
+
}
|
|
414
|
+
const PICK_LEAD = /^(?:please )?(?:use|with|on|pick|choose|take|try|go with|lets use|lets go with|hand it to|give it to|send it to|run it on|make it) /;
|
|
415
|
+
/**
|
|
416
|
+
* The offered route choice a reply names, else null. The reply is the name and
|
|
417
|
+
* nothing else: an optional lead ("use", "go with", "yes,"; "no" only before
|
|
418
|
+
* such a verb) and an optional "please" / "instead". "don't use haiku" names nothing.
|
|
419
|
+
*/
|
|
420
|
+
function matchRouteChoice(card, text) {
|
|
421
|
+
let said = plain(text);
|
|
422
|
+
if (!said) return null;
|
|
423
|
+
said = said.replace(/^(?:yes|yep|yeah|ok|okay|sure) (?=\S)/, '');
|
|
424
|
+
const afterNo = said.replace(/^(?:no|nope|nah) /, '');
|
|
425
|
+
if (afterNo !== said) { if (!PICK_LEAD.test(afterNo)) return null; said = afterNo; }
|
|
426
|
+
said = said.replace(PICK_LEAD, '').replace(/^the /, '');
|
|
427
|
+
for (let i = 0; i < 3; i += 1) said = said.replace(/ (?:please|instead|then|thanks|model)$/, '');
|
|
428
|
+
if (said.length < 2) return null;
|
|
429
|
+
const names = (choice) => {
|
|
430
|
+
const list = [choice.label, choiceName(choice), choice.model, choice.title, String(choice.model || '').split('/').pop()].map(plain).filter(Boolean);
|
|
431
|
+
if (choice.here) list.push('here', 'do it here', 'do it yourself', 'yourself', 'you do it', `here with ${plain(choice.label)}`);
|
|
432
|
+
return [...new Set(list)];
|
|
433
|
+
};
|
|
434
|
+
const hits = card.routeChoices.filter((choice) => names(choice).some((name) => name === said || (said.length >= 3 && name.startsWith(`${said} `))));
|
|
435
|
+
return hits.length === 1 ? hits[0] : null;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Apply a reply to a card → { action: 'respond', response, summary }
|
|
440
|
+
* | { action: 'invalid', message } (a yes that does not say which of several requests it means)
|
|
441
|
+
* | { action: 'desktop', message } (a yes to something only the desktop may approve)
|
|
442
|
+
* | { action: 'prompt' } (not an answer: the caller closes the card fail-closed and carries on with the message).
|
|
443
|
+
* `quoted`: the reply quotes the card (no code needed). Only "yes" (or the legacy
|
|
444
|
+
* "1"), alone, grants an approval; a route also takes the name of an offered model.
|
|
445
|
+
*/
|
|
446
|
+
export function answerCard(card, reply, { quoted = false } = {}) {
|
|
447
|
+
if (!card) return { action: 'prompt' };
|
|
448
|
+
const raw = String(typeof reply === 'string' ? reply : (reply?.text ?? '')).trim();
|
|
449
|
+
// The card's code is taken out before the reply is read ("yes K7Q" is a yes).
|
|
450
|
+
const tag = typeof reply === 'string' ? (quoted ? { ok: true, rest: raw } : stripTag(raw, card.tag)) : { ok: true, rest: raw };
|
|
451
|
+
const parsed = typeof reply === 'string' ? parseCardReply(tag.rest) : reply;
|
|
452
|
+
const needTag = () => ({ action: 'invalid', message: `More than one thing is waiting, so say which one you mean: add the code ${card.tag}, like "yes ${card.tag}".` });
|
|
453
|
+
const said = tag.rest || raw;
|
|
454
|
+
const stop = parsed.type === 'skip' || parsed.type === 'cancel';
|
|
455
|
+
if (isQuestionCard(card)) {
|
|
456
|
+
if (card.desktopOnly) return { action: 'prompt' };
|
|
457
|
+
// "Cancel" is an answer when the question offers it; otherwise "skip" / "cancel" decline.
|
|
458
|
+
const named = card.questions.length === 1 && matchOption(card.questions[0].options, said);
|
|
459
|
+
if (stop && !named) return deny(card, parsed.rest);
|
|
460
|
+
return answerQuestions(card, said, parsed);
|
|
461
|
+
}
|
|
462
|
+
// An approval. A denial is always safe, so it never needs the code.
|
|
463
|
+
const numbers = parsed.type === 'numbers' ? parsed.numbers : [];
|
|
464
|
+
if (card.kind === CONTROL_KINDS.ROUTE) {
|
|
465
|
+
if (stop || (parsed.type === 'no' && !parsed.rest)) return deny(card);
|
|
466
|
+
let choice = null;
|
|
467
|
+
if (parsed.type === 'yes') choice = card.routeChoices[0] || null;
|
|
468
|
+
else if (numbers.length === 1 && !parsed.rest) choice = card.routeChoices.find((row) => row.number === numbers[0]) || null;
|
|
469
|
+
// A name, or "no, use <name>". A "no" with anything else goes on as the next prompt (a route's decline carries no note).
|
|
470
|
+
else if (parsed.type === 'text' || parsed.type === 'no') choice = matchRouteChoice(card, said);
|
|
471
|
+
if (!choice && parsed.type !== 'yes') return { action: 'prompt' };
|
|
472
|
+
if (!tag.ok) return needTag();
|
|
473
|
+
if (card.desktopOnly || !choice) return { action: 'desktop', message: 'I can\'t take that choice from the phone: pick it in SynaBun on your computer, or say no and I\'ll drop it.' };
|
|
474
|
+
const onMac = routeControlsMac(card) && choice.id === card.routeChoices[0].id;
|
|
475
|
+
return respond(card, buildRouteResponse(card.route, { optionId: choice.id, remember: false }), onMac ? `doing it on your Mac, here with ${choiceName(choice)}. Esc on the Mac stops me` : choice.here ? `doing it here with ${choiceName(choice)}` : `handing it to ${choiceName(choice)}`);
|
|
476
|
+
}
|
|
477
|
+
if (stop || parsed.type === 'no' || (numbers.length === 1 && numbers[0] === 2)) return deny(card, parsed.rest);
|
|
478
|
+
const yes = parsed.type === 'yes' || (numbers.length === 1 && numbers[0] === 1 && !parsed.rest);
|
|
479
|
+
if (!yes) return { action: 'prompt' };
|
|
480
|
+
if (!tag.ok) return needTag();
|
|
481
|
+
if (card.kind === CONTROL_KINDS.PLAN) {
|
|
482
|
+
if (card.desktopOnly) return { action: 'desktop', message: `I can't take a yes for the plan from the phone (${card.desktopOnly}): approve it in SynaBun on your computer, or tell me what to change.` };
|
|
483
|
+
return respond(card, buildControlResponse(card.normalized, { behavior: 'allow', planDecision: 'default' }), 'approved');
|
|
484
|
+
}
|
|
485
|
+
if (card.desktopOnly) return { action: 'desktop', message: `I can't take a yes for this one from the phone (${card.desktopOnly}): approve it in SynaBun on your computer, or say no and I'll skip it.` };
|
|
486
|
+
// Computer use for this turn: the response carries nothing but the yes.
|
|
487
|
+
if (card.kind === CONTROL_KINDS.COMPUTER) return respond(card, buildControlResponse(card.normalized, { behavior: 'allow' }), 'computer allowed');
|
|
488
|
+
return respond(card, buildControlResponse(card.normalized, { behavior: 'allow' }), 'allowed once');
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/**
|
|
492
|
+
* The owner's reply as the answers of a question card. One question: the
|
|
493
|
+
* option it names (by its name, or by position for a bare number), else the
|
|
494
|
+
* reply as typed. Several questions: every one gets the reply as typed (an
|
|
495
|
+
* option it names exactly becomes that option), so one message always settles
|
|
496
|
+
* the card and the brain reads it as the reply.
|
|
497
|
+
*/
|
|
498
|
+
function answerQuestions(card, text, parsed) {
|
|
499
|
+
const reply = String(text ?? '').trim();
|
|
500
|
+
if (!reply) return { action: 'prompt' };
|
|
501
|
+
const questions = card.questions.length ? card.questions : [{}];
|
|
502
|
+
const one = (q) => {
|
|
503
|
+
const named = matchOption(q.options, reply);
|
|
504
|
+
if (named) return [named.label];
|
|
505
|
+
const options = q.options || [];
|
|
506
|
+
if (questions.length === 1 && options.length && parsed?.type === 'numbers' && !parsed.rest) {
|
|
507
|
+
const picked = [...new Set(parsed.numbers)];
|
|
508
|
+
if ((q.multiple || picked.length === 1) && picked.every((num) => num >= 1 && num <= options.length)) return picked.map((num) => options[num - 1].label);
|
|
509
|
+
}
|
|
510
|
+
if (q.multiple && options.length) {
|
|
511
|
+
const parts = reply.split(/\s*(?:,|;|\band\b|&)\s*/i).map((part) => matchOption(options, part)).filter(Boolean);
|
|
512
|
+
if (parts.length > 1 && parts.length === reply.split(/\s*(?:,|;|\band\b|&)\s*/i).length) return [...new Set(parts.map((option) => option.label))];
|
|
513
|
+
}
|
|
514
|
+
return [reply];
|
|
515
|
+
};
|
|
516
|
+
// One list per question, shaped exactly as the panel's answers are.
|
|
517
|
+
const lists = normalizeAnswers(card.normalized, questions.map(one));
|
|
518
|
+
return respond(card, buildControlResponse(card.normalized, { behavior: 'allow', answers: lists }), 'answered');
|
|
519
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — WhatsApp Link: the owner's slash commands
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Pure parsing and fixed texts. A command is the owner's own text — never a
|
|
6
|
+
// forwarded or quoted message — that starts with one of COMMANDS
|
|
7
|
+
// (case-insensitive). Commands run at once, busy or paused. Any other "/x" is
|
|
8
|
+
// a prompt; "//x" sends the literal "/x". No command raises the level or
|
|
9
|
+
// changes a setting: those names get a fixed refusal (they would otherwise
|
|
10
|
+
// reach the brain's CLI as its own slash commands).
|
|
11
|
+
|
|
12
|
+
export const COMMANDS = Object.freeze(['help', 'status', 'stop', 'new', 'pause', 'resume', 'cards']);
|
|
13
|
+
const COMMAND_SET = new Set(COMMANDS);
|
|
14
|
+
// Settings, levels and the CLI's own configuration commands: never from a phone.
|
|
15
|
+
const REFUSED = new Set([
|
|
16
|
+
'level', 'autonomous', 'auto', 'allow', 'approve', 'bypass', 'yolo', 'trust', 'unlock', 'raise',
|
|
17
|
+
'settings', 'setting', 'config', 'configure', 'mode', 'permissions', 'permission', 'sandbox', 'computer',
|
|
18
|
+
'model', 'login', 'logout', 'add-dir', 'mcp', 'hooks', 'agents', 'plugin', 'plugins', 'install', 'upgrade',
|
|
19
|
+
'output-style', 'privacy-settings', 'terminal-setup', 'statusline', 'ide', 'vim',
|
|
20
|
+
]);
|
|
21
|
+
|
|
22
|
+
export const HELP_TEXT = [
|
|
23
|
+
'*SynaBun on WhatsApp*',
|
|
24
|
+
'Write to me like you would in SynaBun. Pictures work too.',
|
|
25
|
+
'',
|
|
26
|
+
'/status — what I am doing, spend and level',
|
|
27
|
+
'/stop — stop the current task, its agents and anything waiting for your answer',
|
|
28
|
+
'/new — start a fresh conversation',
|
|
29
|
+
'/pause — stop acting on messages until /resume',
|
|
30
|
+
'/resume — act on messages again',
|
|
31
|
+
'/cards — ask again what is still waiting for your answer',
|
|
32
|
+
'/help — this list',
|
|
33
|
+
'',
|
|
34
|
+
'When I ask something, just answer in your own words. An approval takes a plain yes or no; any other message approves nothing and carries on the conversation. Start with // to send text that begins with a slash.',
|
|
35
|
+
'Levels, models and other settings change only in SynaBun on your computer (Settings → WhatsApp).',
|
|
36
|
+
].join('\n');
|
|
37
|
+
|
|
38
|
+
export const SETTINGS_REFUSAL = 'Settings change only in SynaBun on your computer (Settings → WhatsApp). Nothing was changed.';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* An inbound message → { kind: 'command', name, args } | { kind: 'refused', name }
|
|
42
|
+
* | { kind: 'literal', text } ("//x" → "/x") | null (not a command: a prompt).
|
|
43
|
+
* Only the owner's own text counts: forwarded or quoted messages are prompts.
|
|
44
|
+
*/
|
|
45
|
+
export function parseCommand(message) {
|
|
46
|
+
if (!message || message.owner === false || message.forwarded || message.quoted) return null;
|
|
47
|
+
const text = String(message.text ?? '').trim();
|
|
48
|
+
if (!text.startsWith('/')) return null;
|
|
49
|
+
if (text.startsWith('//')) return { kind: 'literal', text: text.slice(1) };
|
|
50
|
+
const match = /^\/([a-z][a-z0-9_-]*)(?:\s+([\s\S]*))?$/i.exec(text);
|
|
51
|
+
if (!match) return null;
|
|
52
|
+
const name = match[1].toLowerCase();
|
|
53
|
+
const args = (match[2] || '').trim();
|
|
54
|
+
if (COMMAND_SET.has(name)) return { kind: 'command', name, args };
|
|
55
|
+
if (REFUSED.has(name)) return { kind: 'refused', name };
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const usd = (value) => `$${(Number(value) || 0).toFixed(2)}`;
|
|
60
|
+
function levelLabel(level) {
|
|
61
|
+
if (level === 'read-only') return 'Read-only';
|
|
62
|
+
if (level === 'autonomous') return 'Autonomous';
|
|
63
|
+
if (level === 'ask') return 'Ask on my phone';
|
|
64
|
+
return level ? String(level) : 'unknown';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* /status text from a snapshot: { connected, sessionId, title, brain:{provider,model},
|
|
69
|
+
* running, turnKind, queued, pendingCards, currentCard, budget:{totalUsd, hardUsd},
|
|
70
|
+
* brainUsd, brainCapUsd, level, paused, pausedBy, autonomousUntil }.
|
|
71
|
+
*/
|
|
72
|
+
export function statusText(s = {}) {
|
|
73
|
+
const lines = ['*SynaBun status*'];
|
|
74
|
+
lines.push(`WhatsApp: ${s.connected === false ? 'reconnecting' : 'connected'}`);
|
|
75
|
+
if (s.sessionId) {
|
|
76
|
+
const brain = s.brain?.provider ? `${s.brain.provider}${s.brain.model ? ` / ${s.brain.model}` : ''}` : 'default brain';
|
|
77
|
+
lines.push(`Conversation: ${s.title || 'WhatsApp'} (${brain})`);
|
|
78
|
+
} else {
|
|
79
|
+
lines.push('Conversation: none yet (your next message starts one)');
|
|
80
|
+
}
|
|
81
|
+
const doing = s.running
|
|
82
|
+
? (s.turnKind === 'external' ? 'working on a request from your computer' : s.turnKind === 'mailbox' || s.turnKind === 'background' ? 'reading agent results' : 'working on your message')
|
|
83
|
+
: 'idle';
|
|
84
|
+
lines.push(`Now: ${doing}${s.queued ? ` · ${s.queued} message${s.queued === 1 ? '' : 's'} queued` : ''}`);
|
|
85
|
+
if (s.pendingCards) lines.push(`Waiting for you: ${s.pendingCards} question${s.pendingCards === 1 ? '' : 's'} or approval${s.pendingCards === 1 ? '' : 's'}${s.currentCard ? ` (${s.currentCard})` : ''} — /cards asks again`);
|
|
86
|
+
if (s.budget && Number.isFinite(Number(s.budget.hardUsd))) lines.push(`Spend: ${usd(s.budget.totalUsd)} of ${usd(s.budget.hardUsd)} session cap${Number.isFinite(Number(s.brainCapUsd)) ? ` (brain ${usd(s.brainUsd)} of ${usd(s.brainCapUsd)})` : ''}`);
|
|
87
|
+
let level = `Level: ${levelLabel(s.level)}`;
|
|
88
|
+
if (s.level === 'autonomous' && s.autonomousUntil) level += ` until ${new Date(Number(s.autonomousUntil)).toTimeString().slice(0, 5)}`;
|
|
89
|
+
lines.push(level);
|
|
90
|
+
if (s.paused) lines.push(`Paused${s.pausedBy === 'desktop' ? ' from your computer' : ''} — ${s.pausedBy === 'desktop' ? 'resume it in SynaBun' : 'send /resume'}`);
|
|
91
|
+
return lines.join('\n');
|
|
92
|
+
}
|