synabun 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +205 -662
- package/LICENSE-COMMERCIAL.md +33 -0
- package/NOTICE +17 -0
- package/README.md +175 -853
- package/THIRD-PARTY-LICENSES.md +136 -0
- package/benchmarks/browser-live-results.json +79 -0
- package/benchmarks/browser-v2-results.json +258 -0
- package/benchmarks/fixtures/browser/README.md +57 -0
- package/benchmarks/fixtures/browser/page-state.json +132 -0
- package/benchmarks/fixtures/browser/social.json +92 -0
- package/benchmarks/fixtures/browser/target.json +319 -0
- package/benchmarks/fixtures/desktop/README.md +58 -0
- package/benchmarks/fixtures/desktop/abstention.json +59 -0
- package/benchmarks/fixtures/desktop/adversarial.json +22 -0
- package/benchmarks/fixtures/desktop/forbidden.json +93 -0
- package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
- package/benchmarks/fixtures/desktop/target.json +136 -0
- package/bin/synabun.js +30 -0
- package/docs/whatsapp.md +325 -0
- package/hooks/claude-code/post-plan.mjs +613 -391
- package/hooks/claude-code/post-remember.mjs +246 -122
- package/hooks/claude-code/pre-compact.mjs +171 -110
- package/hooks/claude-code/pre-task.mjs +133 -0
- package/hooks/claude-code/pre-websearch.mjs +15 -4
- package/hooks/claude-code/prompt-origin.mjs +94 -0
- package/hooks/claude-code/prompt-submit.mjs +1244 -861
- package/hooks/claude-code/session-start.mjs +114 -156
- package/hooks/claude-code/shared.mjs +1228 -368
- package/hooks/claude-code/state.mjs +167 -0
- package/hooks/claude-code/stop.mjs +515 -140
- package/hooks/claude-code/subagent-start.mjs +154 -0
- package/hooks/claude-code/subagent-stop.mjs +102 -0
- package/hooks/claude-code/task-gate.mjs +150 -0
- package/launcher.mjs +40 -0
- package/lib/claude-hooks.js +137 -0
- package/lib/claude-usage-audit.js +141 -0
- package/lib/client-config-repair.js +145 -0
- package/lib/data-home-migration.js +502 -0
- package/lib/desktop-pwa.js +206 -0
- package/lib/external-tools.js +221 -0
- package/lib/first-launch-protection.js +245 -0
- package/lib/packaged-runtime.js +110 -0
- package/lib/paths.d.ts +21 -0
- package/lib/paths.js +103 -0
- package/lib/start-launcher.js +1309 -0
- package/mcp-server/dist/config.d.ts +22 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +109 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +30 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +276 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +48 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +538 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +28 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +32 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
- package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.js +128 -0
- package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.js +344 -0
- package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/browser-assist.d.ts +104 -0
- package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist.js +282 -0
- package/mcp-server/dist/services/browser-assist.js.map +1 -0
- package/mcp-server/dist/services/browser-bench.d.ts +772 -0
- package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-bench.js +424 -0
- package/mcp-server/dist/services/browser-bench.js.map +1 -0
- package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
- package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-judgments.js +363 -0
- package/mcp-server/dist/services/browser-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-risk.d.ts +166 -0
- package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-risk.js +458 -0
- package/mcp-server/dist/services/browser-risk.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +377 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.js +346 -0
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
- package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
- package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist.js +266 -0
- package/mcp-server/dist/services/desktop-assist.js.map +1 -0
- package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
- package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-bench.js +311 -0
- package/mcp-server/dist/services/desktop-bench.js.map +1 -0
- package/mcp-server/dist/services/desktop-client.d.ts +23 -0
- package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-client.js +79 -0
- package/mcp-server/dist/services/desktop-client.js.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.js +177 -0
- package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
- package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
- package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-risk.js +605 -0
- package/mcp-server/dist/services/desktop-risk.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/edit-stale.d.ts +81 -0
- package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
- package/mcp-server/dist/services/edit-stale.js +358 -0
- package/mcp-server/dist/services/edit-stale.js.map +1 -0
- package/mcp-server/dist/services/embedding-service.d.ts +16 -0
- package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-service.js +126 -0
- package/mcp-server/dist/services/embedding-service.js.map +1 -0
- package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
- package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-worker.js +52 -0
- package/mcp-server/dist/services/embedding-worker.js.map +1 -0
- package/mcp-server/dist/services/fb-regions.d.ts +71 -0
- package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
- package/mcp-server/dist/services/fb-regions.js +211 -0
- package/mcp-server/dist/services/fb-regions.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +22 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +55 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
- package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
- package/mcp-server/dist/services/file-excerpt.js +65 -0
- package/mcp-server/dist/services/file-excerpt.js.map +1 -0
- package/mcp-server/dist/services/identity.d.ts +124 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -0
- package/mcp-server/dist/services/identity.js +241 -0
- package/mcp-server/dist/services/identity.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +3 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/memory-client.d.ts +4 -0
- package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-client.js +27 -0
- package/mcp-server/dist/services/memory-client.js.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
- package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
- package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judgments.js +674 -0
- package/mcp-server/dist/services/memory-judgments.js.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.js +403 -0
- package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.js +412 -0
- package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
- package/mcp-server/dist/services/memory-schema.d.ts +16 -0
- package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-schema.js +282 -0
- package/mcp-server/dist/services/memory-schema.js.map +1 -0
- package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-sessions.js +110 -0
- package/mcp-server/dist/services/memory-sessions.js.map +1 -0
- package/mcp-server/dist/services/memory-triage.d.ts +60 -0
- package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-triage.js +189 -0
- package/mcp-server/dist/services/memory-triage.js.map +1 -0
- package/mcp-server/dist/services/memory-verification.d.ts +24 -0
- package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-verification.js +92 -0
- package/mcp-server/dist/services/memory-verification.js.map +1 -0
- package/mcp-server/dist/services/memory-writer.d.ts +26 -0
- package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-writer.js +126 -0
- package/mcp-server/dist/services/memory-writer.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +439 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +1135 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/profiles.d.ts +120 -0
- package/mcp-server/dist/services/profiles.d.ts.map +1 -0
- package/mcp-server/dist/services/profiles.js +387 -0
- package/mcp-server/dist/services/profiles.js.map +1 -0
- package/mcp-server/dist/services/secret-gate.d.ts +29 -0
- package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/secret-gate.js +43 -0
- package/mcp-server/dist/services/secret-gate.js.map +1 -0
- package/mcp-server/dist/services/server-instructions.d.ts +10 -0
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
- package/mcp-server/dist/services/server-instructions.js +101 -0
- package/mcp-server/dist/services/server-instructions.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +235 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +1185 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.js +218 -0
- package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +746 -0
- package/mcp-server/dist/services/typesafe-config.js.map +1 -0
- package/mcp-server/dist/services/typesafe.d.ts +213 -0
- package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe.js +330 -0
- package/mcp-server/dist/services/typesafe.js.map +1 -0
- package/mcp-server/dist/services/vector-cache.d.ts +68 -0
- package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
- package/mcp-server/dist/services/vector-cache.js +271 -0
- package/mcp-server/dist/services/vector-cache.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
- package/mcp-server/dist/tools/agents.d.ts +212 -0
- package/mcp-server/dist/tools/agents.d.ts.map +1 -0
- package/mcp-server/dist/tools/agents.js +407 -0
- package/mcp-server/dist/tools/agents.js.map +1 -0
- package/mcp-server/dist/tools/bluesky.d.ts +39 -0
- package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
- package/mcp-server/dist/tools/bluesky.js +1144 -0
- package/mcp-server/dist/tools/bluesky.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +106 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
- package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-batch.js +187 -0
- package/mcp-server/dist/tools/browser-batch.js.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +300 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +142 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +2009 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +34 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +112 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +16 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/choice.d.ts +160 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -0
- package/mcp-server/dist/tools/choice.js +80 -0
- package/mcp-server/dist/tools/choice.js.map +1 -0
- package/mcp-server/dist/tools/computer.d.ts +71 -0
- package/mcp-server/dist/tools/computer.d.ts.map +1 -0
- package/mcp-server/dist/tools/computer.js +174 -0
- package/mcp-server/dist/tools/computer.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +25 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
- package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/fb-groups.js +369 -0
- package/mcp-server/dist/tools/fb-groups.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +11 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.js +351 -0
- package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.js +258 -0
- package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.js +357 -0
- package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.js +321 -0
- package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.js +197 -0
- package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.js +274 -0
- package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.js +425 -0
- package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
- package/mcp-server/dist/tools/gsc.d.ts +7 -0
- package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc.js +51 -0
- package/mcp-server/dist/tools/gsc.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +14 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +21 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +401 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +56 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +171 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/morelogin.d.ts +24 -0
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
- package/mcp-server/dist/tools/morelogin.js +79 -0
- package/mcp-server/dist/tools/morelogin.js.map +1 -0
- package/mcp-server/dist/tools/profile.d.ts +17 -0
- package/mcp-server/dist/tools/profile.d.ts.map +1 -0
- package/mcp-server/dist/tools/profile.js +114 -0
- package/mcp-server/dist/tools/profile.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +71 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +147 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +56 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +157 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +62 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +201 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.js +231 -0
- package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
- package/mcp-server/dist/tools/style-guide.d.ts +8 -0
- package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide.js +12 -0
- package/mcp-server/dist/tools/style-guide.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +20 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +156 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +11 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +19 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +54 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.js +337 -0
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +16 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.js +83 -0
- package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.js +56 -0
- package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
- package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/download.js +30 -0
- package/mcp-server/dist/tools/youtube/download.js.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.js +143 -0
- package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
- package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
- package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/media.js +97 -0
- package/mcp-server/dist/tools/youtube/media.js.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.js +106 -0
- package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.js +71 -0
- package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.js +128 -0
- package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.js +147 -0
- package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
- package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
- package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/source.js +85 -0
- package/mcp-server/dist/tools/youtube/source.js.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.js +255 -0
- package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
- package/mcp-server/dist/tools/youtube.d.ts +12 -0
- package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube.js +38 -0
- package/mcp-server/dist/tools/youtube.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +806 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/mcp-server/package-lock.json +4798 -0
- package/mcp-server/package.json +55 -38
- package/mcp-server/run.mjs +12 -2
- package/mcp-server/src/config.ts +48 -3
- package/mcp-server/src/http.ts +296 -93
- package/mcp-server/src/index.ts +546 -203
- package/mcp-server/src/preload-http.ts +19 -18
- package/mcp-server/src/preload.ts +19 -18
- package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
- package/mcp-server/src/services/assistant-judgments.ts +157 -0
- package/mcp-server/src/services/browser-assist-gate.ts +383 -0
- package/mcp-server/src/services/browser-assist.ts +267 -0
- package/mcp-server/src/services/browser-bench.ts +477 -0
- package/mcp-server/src/services/browser-judgments.ts +414 -0
- package/mcp-server/src/services/browser-risk.ts +484 -0
- package/mcp-server/src/services/categories.ts +36 -19
- package/mcp-server/src/services/codex-config-heal.ts +403 -0
- package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
- package/mcp-server/src/services/desktop-assist.ts +308 -0
- package/mcp-server/src/services/desktop-bench.ts +372 -0
- package/mcp-server/src/services/desktop-client.ts +76 -0
- package/mcp-server/src/services/desktop-judgments.ts +218 -0
- package/mcp-server/src/services/desktop-risk.ts +743 -0
- package/mcp-server/src/services/edit-stale.ts +299 -0
- package/mcp-server/src/services/embedding-service.ts +108 -0
- package/mcp-server/src/services/embedding-worker.ts +46 -0
- package/mcp-server/src/services/fb-regions.ts +221 -0
- package/mcp-server/src/services/file-checksums.ts +26 -9
- package/mcp-server/src/services/file-excerpt.ts +59 -0
- package/mcp-server/src/services/identity.ts +291 -0
- package/mcp-server/src/services/local-embeddings.ts +2 -77
- package/mcp-server/src/services/memory-client.ts +23 -0
- package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
- package/mcp-server/src/services/memory-judgments.ts +901 -0
- package/mcp-server/src/services/memory-maintenance.ts +360 -0
- package/mcp-server/src/services/memory-retrieval.ts +349 -0
- package/mcp-server/src/services/memory-schema.ts +280 -0
- package/mcp-server/src/services/memory-sessions.ts +87 -0
- package/mcp-server/src/services/memory-triage.ts +182 -0
- package/mcp-server/src/services/memory-verification.ts +68 -0
- package/mcp-server/src/services/memory-writer.ts +125 -0
- package/mcp-server/src/services/neural-interface.ts +1217 -73
- package/mcp-server/src/services/profiles.ts +428 -0
- package/mcp-server/src/services/secret-gate.ts +52 -0
- package/mcp-server/src/services/server-instructions.ts +122 -0
- package/mcp-server/src/services/sqlite.ts +1456 -823
- package/mcp-server/src/services/typesafe-bench.ts +247 -0
- package/mcp-server/src/services/typesafe-config.ts +790 -0
- package/mcp-server/src/services/typesafe.ts +390 -0
- package/mcp-server/src/services/vector-cache.ts +255 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
- package/mcp-server/src/tools/agents.ts +539 -0
- package/mcp-server/src/tools/bluesky.ts +1186 -0
- package/mcp-server/src/tools/browser-advanced.ts +15 -6
- package/mcp-server/src/tools/browser-batch.ts +178 -0
- package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
- package/mcp-server/src/tools/browser-interact.ts +362 -255
- package/mcp-server/src/tools/browser-navigate.ts +164 -77
- package/mcp-server/src/tools/browser-observe.ts +2222 -1330
- package/mcp-server/src/tools/browser.ts +181 -107
- package/mcp-server/src/tools/card.ts +7 -5
- package/mcp-server/src/tools/choice.ts +103 -0
- package/mcp-server/src/tools/computer.ts +190 -0
- package/mcp-server/src/tools/discord.ts +10 -23
- package/mcp-server/src/tools/fb-groups.ts +387 -0
- package/mcp-server/src/tools/forget.ts +1 -1
- package/mcp-server/src/tools/git.ts +3 -1
- package/mcp-server/src/tools/gsc/experience.ts +440 -0
- package/mcp-server/src/tools/gsc/helpers.ts +288 -0
- package/mcp-server/src/tools/gsc/indexing.ts +495 -0
- package/mcp-server/src/tools/gsc/inspect.ts +391 -0
- package/mcp-server/src/tools/gsc/navigate.ts +236 -0
- package/mcp-server/src/tools/gsc/performance.ts +352 -0
- package/mcp-server/src/tools/gsc/settings.ts +564 -0
- package/mcp-server/src/tools/gsc.ts +95 -0
- package/mcp-server/src/tools/image.ts +3 -1
- package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
- package/mcp-server/src/tools/leonardo.ts +7 -5
- package/mcp-server/src/tools/loop.ts +118 -25
- package/mcp-server/src/tools/memories.ts +65 -5
- package/mcp-server/src/tools/morelogin.ts +81 -0
- package/mcp-server/src/tools/profile.ts +122 -0
- package/mcp-server/src/tools/recall.ts +105 -261
- package/mcp-server/src/tools/reflect.ts +171 -145
- package/mcp-server/src/tools/remember.ts +223 -115
- package/mcp-server/src/tools/style-guide-tools.ts +250 -0
- package/mcp-server/src/tools/style-guide.ts +16 -0
- package/mcp-server/src/tools/sync.ts +66 -9
- package/mcp-server/src/tools/tictactoe.ts +3 -1
- package/mcp-server/src/tools/utils.ts +22 -0
- package/mcp-server/src/tools/whiteboard-format.ts +394 -0
- package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
- package/mcp-server/src/tools/whiteboard.ts +7 -5
- package/mcp-server/src/tools/youtube/analytics.ts +106 -0
- package/mcp-server/src/tools/youtube/dedup.ts +57 -0
- package/mcp-server/src/tools/youtube/download.ts +41 -0
- package/mcp-server/src/tools/youtube/helpers.ts +183 -0
- package/mcp-server/src/tools/youtube/media.ts +109 -0
- package/mcp-server/src/tools/youtube/metadata.ts +112 -0
- package/mcp-server/src/tools/youtube/navigate.ts +81 -0
- package/mcp-server/src/tools/youtube/playlist.ts +134 -0
- package/mcp-server/src/tools/youtube/schedule.ts +158 -0
- package/mcp-server/src/tools/youtube/source.ts +101 -0
- package/mcp-server/src/tools/youtube/upload.ts +296 -0
- package/mcp-server/src/tools/youtube.ts +47 -0
- package/mcp-server/src/tui.ts +8 -9
- package/neural-interface/games/TicTacToe/1.svg +1 -0
- package/neural-interface/games/TicTacToe/2.svg +1 -0
- package/neural-interface/games/TicTacToe/3.svg +1 -0
- package/neural-interface/games/TicTacToe/4.svg +1 -0
- package/neural-interface/games/TicTacToe/5.svg +1 -0
- package/neural-interface/games/TicTacToe/6.svg +1 -0
- package/neural-interface/games/TicTacToe/7.svg +1 -0
- package/neural-interface/games/TicTacToe/8.svg +1 -0
- package/neural-interface/games/TicTacToe/9.svg +1 -0
- package/neural-interface/games/TicTacToe/Board.svg +1 -0
- package/neural-interface/games/TicTacToe/Circle.svg +1 -0
- package/neural-interface/games/TicTacToe/Cross.svg +1 -0
- package/neural-interface/i18n/en.json +7022 -0
- package/neural-interface/i18n/pt-BR.json +7026 -0
- package/neural-interface/lib/assistant-api.js +1005 -0
- package/neural-interface/lib/assistant-attachments.js +121 -0
- package/neural-interface/lib/assistant-brains/claude.js +207 -0
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
- package/neural-interface/lib/assistant-brains/codex.js +213 -0
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
- package/neural-interface/lib/assistant-brains/opencode.js +320 -0
- package/neural-interface/lib/assistant-budget.js +318 -0
- package/neural-interface/lib/assistant-catalog.js +731 -0
- package/neural-interface/lib/assistant-clarify.js +664 -0
- package/neural-interface/lib/assistant-config.js +232 -0
- package/neural-interface/lib/assistant-dispatch.js +2744 -0
- package/neural-interface/lib/assistant-envelope.js +582 -0
- package/neural-interface/lib/assistant-evidence.js +236 -0
- package/neural-interface/lib/assistant-hidden-models.js +272 -0
- package/neural-interface/lib/assistant-jev.js +117 -0
- package/neural-interface/lib/assistant-judgments.js +111 -0
- package/neural-interface/lib/assistant-media.js +335 -0
- package/neural-interface/lib/assistant-memory.js +398 -0
- package/neural-interface/lib/assistant-persona.js +444 -0
- package/neural-interface/lib/assistant-plan-permissions.js +448 -0
- package/neural-interface/lib/assistant-playbooks/design.md +87 -0
- package/neural-interface/lib/assistant-playbooks.js +72 -0
- package/neural-interface/lib/assistant-pricing.js +159 -0
- package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
- package/neural-interface/lib/assistant-route-gate.js +212 -0
- package/neural-interface/lib/assistant-router.js +1324 -0
- package/neural-interface/lib/assistant-runtime.js +3337 -0
- package/neural-interface/lib/assistant-task-prompt.js +472 -0
- package/neural-interface/lib/assistant-usage.js +1688 -0
- package/neural-interface/lib/augmented-path.js +70 -0
- package/neural-interface/lib/automation-storage-migration.js +54 -0
- package/neural-interface/lib/backup-service.js +851 -0
- package/neural-interface/lib/backup-zip-reader.js +262 -0
- package/neural-interface/lib/browser-assist-api.js +41 -0
- package/neural-interface/lib/browser-console.js +176 -0
- package/neural-interface/lib/browser-execution.js +241 -0
- package/neural-interface/lib/browser-extraction.js +191 -0
- package/neural-interface/lib/browser-language.js +83 -0
- package/neural-interface/lib/browser-screenshot.js +399 -0
- package/neural-interface/lib/browser-semantic-context.js +639 -0
- package/neural-interface/lib/browser-snapshots.js +192 -0
- package/neural-interface/lib/browser-tab-recovery.js +119 -0
- package/neural-interface/lib/browser-targets.js +70 -0
- package/neural-interface/lib/browser-tool-policy.js +926 -0
- package/neural-interface/lib/claude-accounts.js +230 -0
- package/neural-interface/lib/claude-agent-bridge.js +3203 -0
- package/neural-interface/lib/claude-bypass-policy.js +99 -0
- package/neural-interface/lib/claude-executable.js +241 -0
- package/neural-interface/lib/claude-history.js +429 -0
- package/neural-interface/lib/claude-model-catalog.js +444 -0
- package/neural-interface/lib/claude-panel-requests.js +165 -0
- package/neural-interface/lib/claude-panel-session.js +272 -0
- package/neural-interface/lib/claude-permission-rules.js +153 -0
- package/neural-interface/lib/claude-session-cleanup.js +71 -0
- package/neural-interface/lib/claude-session-list.js +82 -0
- package/neural-interface/lib/claude-session-ops.js +140 -0
- package/neural-interface/lib/claude-settings-view.js +51 -0
- package/neural-interface/lib/claude-skin-connect.js +79 -0
- package/neural-interface/lib/claude-stall-policy.js +7 -0
- package/neural-interface/lib/claude-temporary.js +435 -0
- package/neural-interface/lib/cli-update-planner.js +312 -0
- package/neural-interface/lib/codex-capabilities.d.ts +41 -0
- package/neural-interface/lib/codex-capabilities.js +148 -0
- package/neural-interface/lib/codex-collaboration-mode.js +17 -0
- package/neural-interface/lib/codex-compat-rpc.js +241 -0
- package/neural-interface/lib/codex-mcp-approvals.js +56 -0
- package/neural-interface/lib/codex-mcp-apps.js +47 -0
- package/neural-interface/lib/codex-model-context.js +202 -0
- package/neural-interface/lib/codex-plan-store.js +71 -0
- package/neural-interface/lib/codex-request-journal.js +242 -0
- package/neural-interface/lib/codex-runtime-path.js +213 -0
- package/neural-interface/lib/codex-session-catalog.js +231 -0
- package/neural-interface/lib/codex-session-settings.js +46 -0
- package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
- package/neural-interface/lib/codex-thread-history.js +165 -0
- package/neural-interface/lib/codex-user-verification.js +34 -0
- package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
- package/neural-interface/lib/confined-fs.js +256 -0
- package/neural-interface/lib/db.js +922 -0
- package/neural-interface/lib/design-md.js +9 -0
- package/neural-interface/lib/desktop/api.js +92 -0
- package/neural-interface/lib/desktop/audit.js +62 -0
- package/neural-interface/lib/desktop/build.js +423 -0
- package/neural-interface/lib/desktop/config.js +606 -0
- package/neural-interface/lib/desktop/coords.js +76 -0
- package/neural-interface/lib/desktop/fake-helper.js +1192 -0
- package/neural-interface/lib/desktop/frames.js +77 -0
- package/neural-interface/lib/desktop/grants.js +84 -0
- package/neural-interface/lib/desktop/guards.js +170 -0
- package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
- package/neural-interface/lib/desktop/lease.js +51 -0
- package/neural-interface/lib/desktop/manager.js +545 -0
- package/neural-interface/lib/desktop/press-contexts.js +103 -0
- package/neural-interface/lib/desktop/protocol.js +495 -0
- package/neural-interface/lib/desktop/service.js +1202 -0
- package/neural-interface/lib/effort-levels.js +148 -0
- package/neural-interface/lib/event-loop-monitor.js +67 -0
- package/neural-interface/lib/exec-loop-command.js +209 -0
- package/neural-interface/lib/folder-picker.ps1 +77 -0
- package/neural-interface/lib/http-guards.js +287 -0
- package/neural-interface/lib/jsonl-lines.js +94 -0
- package/neural-interface/lib/loop-logger.js +127 -0
- package/neural-interface/lib/mcp-client-config.js +133 -0
- package/neural-interface/lib/mcp-installer.js +487 -0
- package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
- package/neural-interface/lib/mcp-profile-servers.js +120 -0
- package/neural-interface/lib/memo-cache.js +84 -0
- package/neural-interface/lib/memory-api.js +758 -0
- package/neural-interface/lib/memory-map-api.js +1150 -0
- package/neural-interface/lib/memory-map-layout.js +872 -0
- package/neural-interface/lib/memory-map-worker.js +165 -0
- package/neural-interface/lib/memory-session-capture.js +81 -0
- package/neural-interface/lib/memory-timers.js +62 -0
- package/neural-interface/lib/morelogin.js +301 -0
- package/neural-interface/lib/native-binary-runtime.js +382 -0
- package/neural-interface/lib/native-loop-goal.js +33 -0
- package/neural-interface/lib/native-loop-providers.js +1002 -0
- package/neural-interface/lib/native-loop-runtime.js +747 -0
- package/neural-interface/lib/offline-page.js +54 -0
- package/neural-interface/lib/opencode-hidden-models.js +113 -0
- package/neural-interface/lib/opencode-history.js +253 -0
- package/neural-interface/lib/opencode-runtime-config.js +58 -0
- package/neural-interface/lib/opencode-v2-client.js +486 -0
- package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
- package/neural-interface/lib/path-confine.js +213 -0
- package/neural-interface/lib/plugin-installer.js +264 -0
- package/neural-interface/lib/project-storage.js +766 -0
- package/neural-interface/lib/pty-host/core.js +603 -0
- package/neural-interface/lib/pty-host/flow.js +43 -0
- package/neural-interface/lib/pty-host/host.js +47 -0
- package/neural-interface/lib/pty-host/manager.js +360 -0
- package/neural-interface/lib/pty-host/protocol.js +81 -0
- package/neural-interface/lib/pty-host/snapshot.js +133 -0
- package/neural-interface/lib/remote-policy.js +582 -0
- package/neural-interface/lib/rulesets/api.js +175 -0
- package/neural-interface/lib/rulesets/fs-safe.js +245 -0
- package/neural-interface/lib/rulesets/installer.js +1453 -0
- package/neural-interface/lib/rulesets/json-edit.js +186 -0
- package/neural-interface/lib/rulesets/lock.js +170 -0
- package/neural-interface/lib/rulesets/managed-text.js +314 -0
- package/neural-interface/lib/rulesets/normalise.js +24 -0
- package/neural-interface/lib/rulesets/render.js +84 -0
- package/neural-interface/lib/schedule-launch-intent.js +40 -0
- package/neural-interface/lib/session-cache-builder.js +524 -0
- package/neural-interface/lib/session-chunker.js +344 -0
- package/neural-interface/lib/session-indexer.js +327 -0
- package/neural-interface/lib/session-title-generator.js +232 -0
- package/neural-interface/lib/skill-prompt-bridge.js +11 -0
- package/neural-interface/lib/style-guide/api.js +375 -0
- package/neural-interface/lib/style-guide/color.js +352 -0
- package/neural-interface/lib/style-guide/export-css.js +99 -0
- package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
- package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
- package/neural-interface/lib/style-guide/fonts.json +227 -0
- package/neural-interface/lib/style-guide/import.js +1268 -0
- package/neural-interface/lib/style-guide/pointers.js +103 -0
- package/neural-interface/lib/style-guide/presets.js +232 -0
- package/neural-interface/lib/style-guide/render-design-md.js +319 -0
- package/neural-interface/lib/style-guide/schema.js +848 -0
- package/neural-interface/lib/style-guide/security.js +43 -0
- package/neural-interface/lib/style-guide/store.js +491 -0
- package/neural-interface/lib/style-guide/summary.js +106 -0
- package/neural-interface/lib/style-guide/tokens.js +170 -0
- package/neural-interface/lib/synabun-update-plan.js +324 -0
- package/neural-interface/lib/synabun-version.js +179 -0
- package/neural-interface/lib/system-restore.js +99 -0
- package/neural-interface/lib/terminal-env.js +86 -0
- package/neural-interface/lib/ui-blob-store.js +106 -0
- package/neural-interface/lib/vector-cache.js +2 -0
- package/neural-interface/lib/virtual-socket.js +60 -0
- package/neural-interface/lib/whatsapp/api.js +146 -0
- package/neural-interface/lib/whatsapp/auth-store.js +389 -0
- package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
- package/neural-interface/lib/whatsapp/brain.js +128 -0
- package/neural-interface/lib/whatsapp/bridge.js +1499 -0
- package/neural-interface/lib/whatsapp/cards.js +519 -0
- package/neural-interface/lib/whatsapp/commands.js +92 -0
- package/neural-interface/lib/whatsapp/config.js +291 -0
- package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
- package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
- package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
- package/neural-interface/lib/whatsapp/connector/package.json +8 -0
- package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
- package/neural-interface/lib/whatsapp/format.js +552 -0
- package/neural-interface/lib/whatsapp/host-core.js +1225 -0
- package/neural-interface/lib/whatsapp/host.js +119 -0
- package/neural-interface/lib/whatsapp/identity.js +288 -0
- package/neural-interface/lib/whatsapp/inbound.js +149 -0
- package/neural-interface/lib/whatsapp/installer.js +562 -0
- package/neural-interface/lib/whatsapp/manager.js +638 -0
- package/neural-interface/lib/whatsapp/paths.js +81 -0
- package/neural-interface/lib/whatsapp/protocol.js +327 -0
- package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
- package/neural-interface/lib/whatsapp/redact.js +130 -0
- package/neural-interface/lib/whatsapp/service.js +1305 -0
- package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
- package/neural-interface/package-lock.json +4431 -0
- package/neural-interface/package.json +58 -27
- package/neural-interface/public/apple-touch-icon.png +0 -0
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +1 -0
- package/neural-interface/public/favicon-16x16.png +0 -0
- package/neural-interface/public/favicon-32x32.png +0 -0
- package/neural-interface/public/icon-192.png +0 -0
- package/neural-interface/public/icon-512.png +0 -0
- package/neural-interface/public/index.html +32 -182
- package/neural-interface/public/index2d.html +2 -2
- package/neural-interface/public/install-app.html +31 -0
- package/neural-interface/public/logo-synabun.png +0 -0
- package/neural-interface/public/logoHD.png +0 -0
- package/neural-interface/public/manifest.json +2 -0
- package/neural-interface/public/mcp.svg +4 -0
- package/neural-interface/public/offline.html +670 -299
- package/neural-interface/public/onboarding.html +804 -161
- package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
- package/neural-interface/public/shared/agent-runtime-options.js +596 -0
- package/neural-interface/public/shared/api.js +339 -28
- package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
- package/neural-interface/public/shared/assistant/asst-api.js +270 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
- package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
- package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
- package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
- package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
- package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
- package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
- package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
- package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
- package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
- package/neural-interface/public/shared/assistant/asst-state.js +727 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
- package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
- package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
- package/neural-interface/public/shared/automation-context.js +75 -0
- package/neural-interface/public/shared/blob-store.js +99 -0
- package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
- package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
- package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
- package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
- package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
- package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
- package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
- package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
- package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
- package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
- package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
- package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
- package/neural-interface/public/shared/cli-status.js +169 -0
- package/neural-interface/public/shared/command-runner-model.js +30 -0
- package/neural-interface/public/shared/constants.js +22 -5
- package/neural-interface/public/shared/cp/cp-agents.js +186 -0
- package/neural-interface/public/shared/cp/cp-bash.js +252 -0
- package/neural-interface/public/shared/cp/cp-compose.js +159 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
- package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
- package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
- package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
- package/neural-interface/public/shared/cp/cp-diff.js +255 -0
- package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
- package/neural-interface/public/shared/cp/cp-events.js +846 -0
- package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
- package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
- package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
- package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
- package/neural-interface/public/shared/cp/cp-restore.js +224 -0
- package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
- package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
- package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
- package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
- package/neural-interface/public/shared/cp/cp-styles.js +349 -0
- package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
- package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
- package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
- package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
- package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
- package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
- package/neural-interface/public/shared/graph-activity.js +68 -0
- package/neural-interface/public/shared/html-shell.js +116 -17
- package/neural-interface/public/shared/i18n.js +132 -34
- package/neural-interface/public/shared/node-positions-store.js +44 -0
- package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
- package/neural-interface/public/shared/provider-icons.js +30 -0
- package/neural-interface/public/shared/pwa-install-page.js +34 -0
- package/neural-interface/public/shared/pwa-install.css +12 -0
- package/neural-interface/public/shared/pwa-install.js +28 -0
- package/neural-interface/public/shared/session-title.js +100 -0
- package/neural-interface/public/shared/settings/settings-ia.js +389 -0
- package/neural-interface/public/shared/settings/settings-kit.js +234 -0
- package/neural-interface/public/shared/settings/settings-rules.js +160 -0
- package/neural-interface/public/shared/settings/settings-search.js +463 -0
- package/neural-interface/public/shared/settings/settings-shell.js +570 -0
- package/neural-interface/public/shared/start-bridge.js +583 -0
- package/neural-interface/public/shared/state.js +5 -0
- package/neural-interface/public/shared/storage.js +50 -7
- package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
- package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
- package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
- package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
- package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
- package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
- package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
- package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
- package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
- package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
- package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
- package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
- package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
- package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
- package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
- package/neural-interface/public/shared/styles.css +8614 -1477
- package/neural-interface/public/shared/synabun-mascot.js +1625 -0
- package/neural-interface/public/shared/synabun-ticker.js +376 -0
- package/neural-interface/public/shared/term-ready.js +307 -0
- package/neural-interface/public/shared/term-renderer.js +343 -0
- package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
- package/neural-interface/public/shared/ui-assistant.js +77 -0
- package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
- package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
- package/neural-interface/public/shared/ui-codex-panel.js +12 -0
- package/neural-interface/public/shared/ui-command-runner.js +251 -468
- package/neural-interface/public/shared/ui-cost-widget.js +55 -34
- package/neural-interface/public/shared/ui-detail.js +77 -14
- package/neural-interface/public/shared/ui-explorer.js +360 -181
- package/neural-interface/public/shared/ui-file-explorer.js +485 -107
- package/neural-interface/public/shared/ui-help.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +45 -21
- package/neural-interface/public/shared/ui-judgments.js +1346 -0
- package/neural-interface/public/shared/ui-keybinds.js +3 -2
- package/neural-interface/public/shared/ui-link.js +105 -51
- package/neural-interface/public/shared/ui-loading.js +222 -11
- package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
- package/neural-interface/public/shared/ui-menubar.js +100 -31
- package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
- package/neural-interface/public/shared/ui-native-window-id.js +7 -0
- package/neural-interface/public/shared/ui-navbar.js +357 -222
- package/neural-interface/public/shared/ui-notifications.js +58 -12
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
- package/neural-interface/public/shared/ui-panels.js +15 -7
- package/neural-interface/public/shared/ui-resume.js +823 -653
- package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
- package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
- package/neural-interface/public/shared/ui-sessions.js +789 -34
- package/neural-interface/public/shared/ui-settings.js +5774 -2194
- package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
- package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
- package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
- package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
- package/neural-interface/public/shared/ui-skills.js +18 -32
- package/neural-interface/public/shared/ui-styleguide.js +35 -0
- package/neural-interface/public/shared/ui-sync.js +87 -0
- package/neural-interface/public/shared/ui-terminal.js +7863 -6385
- package/neural-interface/public/shared/ui-tool-updates.js +292 -0
- package/neural-interface/public/shared/ui-tooltip.js +156 -15
- package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
- package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
- package/neural-interface/public/shared/ui-tutorial.css +102 -0
- package/neural-interface/public/shared/ui-tutorial.js +557 -1076
- package/neural-interface/public/shared/ui-update.js +420 -68
- package/neural-interface/public/shared/ui-whatsapp.js +941 -0
- package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
- package/neural-interface/public/shared/ui-workspaces.js +2 -1
- package/neural-interface/public/shared/utils.js +58 -0
- package/neural-interface/public/shared/vterm-buffer.js +15 -5
- package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
- package/neural-interface/public/sidepanel-session.html +18 -0
- package/neural-interface/public/sw.js +10 -2
- package/neural-interface/public/synabun.png +0 -0
- package/neural-interface/public/variant/2d/graph.js +1707 -1635
- package/neural-interface/public/variant/2d/lasso.js +2 -1
- package/neural-interface/public/variant/2d/layout.js +595 -594
- package/neural-interface/public/variant/2d/main.js +557 -521
- package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
- package/neural-interface/public/variant/3d/main.js +517 -500
- package/neural-interface/public/variant/3d/map-controls.js +144 -0
- package/neural-interface/public/variant/3d/map-data.js +251 -0
- package/neural-interface/public/variant/3d/map-labels.js +241 -0
- package/neural-interface/public/variant/3d/map-pick.js +90 -0
- package/neural-interface/public/variant/3d/map-renderer.js +521 -0
- package/neural-interface/public/variant/3d/map-shaders.js +158 -0
- package/neural-interface/public/variant/3d/map-view.js +618 -0
- package/neural-interface/public/vendor/three/manifest.json +3 -0
- package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
- package/neural-interface/public/vendor/xterm/manifest.json +3 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
- package/neural-interface/scripts/build-vendor.mjs +64 -0
- package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
- package/neural-interface/scripts/rebuild-pty.js +39 -22
- package/neural-interface/scripts/vendor-three-entry.js +24 -0
- package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
- package/neural-interface/server.js +33983 -15000
- package/neural-interface/skins/default/skin.css +90 -0
- package/neural-interface/skins/default/skin.json +8 -0
- package/neural-interface/templates/rulesets/README.md +9 -0
- package/neural-interface/templates/rulesets/claude.md +3 -0
- package/neural-interface/templates/rulesets/codex.md +2 -0
- package/neural-interface/templates/rulesets/coexistence.md +6 -0
- package/neural-interface/templates/rulesets/core.md +26 -0
- package/neural-interface/templates/rulesets/cursor.md +2 -0
- package/neural-interface/templates/rulesets/gemini.md +2 -0
- package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
- package/neural-interface/templates/rulesets/manifest.json +12 -0
- package/neural-interface/templates/rulesets/opencode.md +2 -0
- package/package.json +131 -53
- package/postinstall.js +55 -26
- package/preuninstall.js +187 -0
- package/scripts/restore-data-home-from-backup.mjs +239 -0
- package/setup.js +872 -260
- package/skills/leonardo/SKILL.md +19 -10
- package/skills/leonardo/modules/image-prompter.md +18 -12
- package/skills/leonardo/modules/video-prompter.md +19 -13
- package/skills/synabun/SKILL.md +209 -185
- package/skills/synabun/icon.png +0 -0
- package/skills/synabun/modules/audit.md +380 -374
- package/skills/synabun/modules/changelog.md +15 -6
- package/skills/synabun/modules/idea.md +148 -144
- package/skills/synabun/modules/memorize.md +13 -4
- package/skills/synabun/modules/schedule.md +198 -0
- package/skills/synabun/synabunicon.png +0 -0
- package/updater.cmd +31 -0
- package/updater.mjs +382 -0
- package/updater.sh +29 -0
- package/hooks/claude-code/test-user-learning.mjs +0 -531
- package/neural-interface/public/claude-chat.css +0 -878
- package/neural-interface/public/claude-chat.html +0 -92
- package/neural-interface/public/claude-chat.js +0 -1168
- package/neural-interface/public/index-legacy.html +0 -14677
- package/neural-interface/public/index2d-legacy.html +0 -8193
- package/neural-interface/public/shared/html-term-renderer.js +0 -1022
- package/neural-interface/public/variant/3d/background.js +0 -884
- package/neural-interface/public/variant/3d/camera.js +0 -661
- package/neural-interface/public/variant/3d/gfx.js +0 -116
- package/neural-interface/public/variant/3d/graph.js +0 -2399
- package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
- package/neural-interface/templates/CLAUDE-template.md +0 -211
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — Assistant attachments (POST /api/assistant/attachments)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// The composer's paperclip takes any file. Images the brains can see and small
|
|
6
|
+
// text files still ride inline in the turn; everything else is streamed to the
|
|
7
|
+
// route in assistant-api.js and saved here, under
|
|
8
|
+
// DATA_HOME/data/attachments/<session>/<upload id>/<name>. The prompt carries
|
|
9
|
+
// the absolute path and the brain reads the file with its own tools, so a PDF
|
|
10
|
+
// reaches Claude, Codex and OpenCode the same way and a worker can be handed
|
|
11
|
+
// the path. Binary bytes never enter a prompt (a raw binary inlined in 2026-03
|
|
12
|
+
// corrupted the Claude NDJSON stream). Files are written, never opened or run.
|
|
13
|
+
|
|
14
|
+
import { createWriteStream, mkdirSync, rmSync } from 'node:fs';
|
|
15
|
+
import { randomBytes } from 'node:crypto';
|
|
16
|
+
import { join, resolve, sep } from 'node:path';
|
|
17
|
+
import { Transform } from 'node:stream';
|
|
18
|
+
import { pipeline } from 'node:stream/promises';
|
|
19
|
+
|
|
20
|
+
/** The upload cap. The composer checks the same number before it sends. */
|
|
21
|
+
export const ATTACHMENT_MAX_BYTES = 100 * 1024 * 1024;
|
|
22
|
+
// Most file systems cap a name at 255 bytes; this leaves room for the ones that count differently.
|
|
23
|
+
const NAME_MAX_BYTES = 180;
|
|
24
|
+
const WINDOWS_RESERVED = /^(?:con|prn|aux|nul|com\d|lpt\d)(?:\..*)?$/i;
|
|
25
|
+
// Control characters, characters Windows refuses, the backtick (it would break
|
|
26
|
+
// the prompt's code span) and the invisible direction marks that disguise an extension.
|
|
27
|
+
const UNSAFE_CHARS = /[\u0000-\u001f\u007f<>:"|?*`\u200b-\u200f\u202a-\u202e\u2066-\u2069]/g;
|
|
28
|
+
|
|
29
|
+
function attachmentError(code, message, status) {
|
|
30
|
+
return Object.assign(new Error(message), { code, status });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** "The file is larger than 100 MB" — the refusal both the store and the route give. */
|
|
34
|
+
export function tooLargeMessage(maxBytes) {
|
|
35
|
+
const mb = maxBytes / (1024 * 1024);
|
|
36
|
+
return `The file is larger than ${Number.isInteger(mb) ? `${mb} MB` : `${maxBytes} bytes`}`;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function clipBytes(text, max) {
|
|
40
|
+
let out = '';
|
|
41
|
+
let bytes = 0;
|
|
42
|
+
for (const ch of text) {
|
|
43
|
+
const size = Buffer.byteLength(ch);
|
|
44
|
+
if (bytes + size > max) break;
|
|
45
|
+
out += ch;
|
|
46
|
+
bytes += size;
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A name safe to create inside the attachments folder: the last path segment
|
|
53
|
+
* only, no control or reserved characters, no leading dots ("..", hidden
|
|
54
|
+
* files), at most 180 bytes with the extension kept. Never empty.
|
|
55
|
+
*/
|
|
56
|
+
export function sanitizeAttachmentName(name) {
|
|
57
|
+
let base = String(name ?? '').normalize('NFC').split(/[\\/]/).pop() || '';
|
|
58
|
+
base = base.replace(UNSAFE_CHARS, '').replace(/\s+/g, ' ').replace(/^[\s.]+|[\s.]+$/g, '');
|
|
59
|
+
if (WINDOWS_RESERVED.test(base)) base = `_${base}`;
|
|
60
|
+
if (Buffer.byteLength(base) > NAME_MAX_BYTES) {
|
|
61
|
+
const dot = base.lastIndexOf('.');
|
|
62
|
+
const ext = dot > 0 && base.length - dot <= 16 ? base.slice(dot) : '';
|
|
63
|
+
base = `${clipBytes(base.slice(0, base.length - ext.length), NAME_MAX_BYTES - Buffer.byteLength(ext)).trimEnd()}${ext}`;
|
|
64
|
+
}
|
|
65
|
+
return base || 'attachment';
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** The per-session folder: the assistant session id when it is a plain id, else "unsorted". */
|
|
69
|
+
export function attachmentSessionFolder(sessionId) {
|
|
70
|
+
const id = String(sessionId ?? '').trim();
|
|
71
|
+
return /^[A-Za-z0-9][A-Za-z0-9_-]{0,79}$/.test(id) ? id : 'unsorted';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** A MIME type as the browser reported it, or application/octet-stream. */
|
|
75
|
+
export function normalizeAttachmentMime(value) {
|
|
76
|
+
const mime = String(value ?? '').trim().toLowerCase();
|
|
77
|
+
return mime.length <= 127 && /^[a-z0-9][\w.+-]*\/[\w.+-]+$/.test(mime) ? mime : 'application/octet-stream';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function uploadFolder(ms) {
|
|
81
|
+
const stamp = new Date(ms).toISOString().slice(0, 19).replace(/[-:]/g, '').replace('T', '-');
|
|
82
|
+
return `${stamp}-${randomBytes(4).toString('hex')}`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* createAttachmentStore({ root }) → { root, maxBytes, save(source, meta) }.
|
|
87
|
+
* save() streams `source` (the request) to <root>/<session>/<upload id>/<name>
|
|
88
|
+
* and resolves { path, name, size, mime } with the absolute path. Past
|
|
89
|
+
* `maxBytes` it stops, removes what it wrote and rejects with
|
|
90
|
+
* ATTACHMENT_TOO_LARGE (413); an aborted upload is removed the same way.
|
|
91
|
+
*/
|
|
92
|
+
export function createAttachmentStore({ root, maxBytes = ATTACHMENT_MAX_BYTES, now = Date.now } = {}) {
|
|
93
|
+
if (!root) throw new Error('createAttachmentStore requires a root');
|
|
94
|
+
const base = resolve(root);
|
|
95
|
+
|
|
96
|
+
async function save(source, { name, sessionId = null, mime = '' } = {}) {
|
|
97
|
+
const fileName = sanitizeAttachmentName(name);
|
|
98
|
+
const dir = join(base, attachmentSessionFolder(sessionId), uploadFolder(now()));
|
|
99
|
+
const path = join(dir, fileName);
|
|
100
|
+
// The name and the folders are sanitized above; this is the backstop.
|
|
101
|
+
if (!path.startsWith(`${base}${sep}`)) throw attachmentError('ATTACHMENT_INVALID_NAME', 'Invalid attachment name', 400);
|
|
102
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
103
|
+
let size = 0;
|
|
104
|
+
const cap = new Transform({
|
|
105
|
+
transform(chunk, _encoding, done) {
|
|
106
|
+
size += chunk.length;
|
|
107
|
+
if (size > maxBytes) done(attachmentError('ATTACHMENT_TOO_LARGE', tooLargeMessage(maxBytes), 413));
|
|
108
|
+
else done(null, chunk);
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
try {
|
|
112
|
+
await pipeline(source, cap, createWriteStream(path, { flags: 'wx', mode: 0o600 }));
|
|
113
|
+
} catch (error) {
|
|
114
|
+
rmSync(dir, { recursive: true, force: true });
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
return { path, name: fileName, size, mime: normalizeAttachmentMime(mime) };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return { root: base, maxBytes, save };
|
|
121
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — Assistant brain: Claude (Agent SDK via ClaudeSession)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Reuses the sidepanel's ClaudeSession end to end (streaming, permission cards,
|
|
6
|
+
// resume, idle reaping, cost accounting). The session talks to a virtual socket
|
|
7
|
+
// whose outbound packets are already the unified envelope, so they are forwarded
|
|
8
|
+
// verbatim to the assistant UI. Persona, memory hooks, role headers, the account
|
|
9
|
+
// config dir and the budget cap ride in through the ClaudeSession opts.
|
|
10
|
+
|
|
11
|
+
import { createVirtualSocket } from '../virtual-socket.js';
|
|
12
|
+
import { claudePlanHookDecision, claudePlanPermission, claudeReadOnlyHookDecision, claudeReadOnlyPermission, planDenyMessage, readOnlyDenyMessage } from '../assistant-plan-permissions.js';
|
|
13
|
+
import { planModeInstructions } from '../assistant-persona.js';
|
|
14
|
+
import { isComputerTool } from '../remote-policy.js';
|
|
15
|
+
|
|
16
|
+
const PERMISSION_MODES = new Set(['default', 'acceptEdits', 'plan', 'bypassPermissions']);
|
|
17
|
+
const APPROVAL_MODES = new Set(['default', 'acceptEdits', 'bypassPermissions']);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The SDK permission mode for an approval mode + the plan flag. Plan mode is
|
|
21
|
+
* the SDK's 'plan'; approving the plan (ExitPlanMode) returns to the approval
|
|
22
|
+
* mode — bypass included, which is why the session allows bypass up front.
|
|
23
|
+
*/
|
|
24
|
+
export function claudeSdkMode(approvalMode, planMode) {
|
|
25
|
+
if (planMode || approvalMode === 'plan') return 'plan';
|
|
26
|
+
return APPROVAL_MODES.has(approvalMode) ? approvalMode : 'default';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Never gate these behind a permission card: routing must not wait on an
|
|
30
|
+
// approval prompt, and computer use is fully autonomous (its guards live in
|
|
31
|
+
// the desktop service, not in the host's permission layer).
|
|
32
|
+
export const CLAUDE_BRAIN_ALLOWED_TOOLS = Object.freeze([
|
|
33
|
+
'mcp__SynaBun__agent_route', 'mcp__SynaBun__agent_catalog', 'mcp__SynaBun__agent_status', 'mcp__SynaBun__agent_read',
|
|
34
|
+
'mcp__SynaBun__agent_list', 'mcp__SynaBun__agent_wait', 'mcp__SynaBun__agent_usage',
|
|
35
|
+
'mcp__SynaBun__computer', 'mcp__SynaBun__computer_apps', 'mcp__SynaBun__computer_ax', 'mcp__SynaBun__computer_status',
|
|
36
|
+
]);
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The tools pre-approved for this brain. A remote (WhatsApp) brain pre-approves
|
|
40
|
+
* no computer-use tool, whatever its level: its PreToolUse hook decides each
|
|
41
|
+
* call (lib/remote-policy.js remoteComputerUse: refused, asked once per turn,
|
|
42
|
+
* or allowed), so nothing here can let one through.
|
|
43
|
+
*/
|
|
44
|
+
export function claudeBrainAllowedTools(remoteLevel = null) {
|
|
45
|
+
return remoteLevel ? CLAUDE_BRAIN_ALLOWED_TOOLS.filter((name) => !isComputerTool(name)) : [...CLAUDE_BRAIN_ALLOWED_TOOLS];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Bypass as a switch target: always for a desktop session (no remote level), only at autonomous for a remote one. */
|
|
49
|
+
export function claudeBypassAllowed(remoteLevel = null) {
|
|
50
|
+
return !remoteLevel || remoteLevel === 'autonomous';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function createClaudeBrain({ session, sink, deps = {}, persona = '', hooks = null, mcpHeaders = {} } = {}) {
|
|
54
|
+
if (!deps.ClaudeSession) throw new Error('Claude brain requires deps.ClaudeSession');
|
|
55
|
+
const brain = session.brain || {};
|
|
56
|
+
const windowId = `assistant-${session.id}`;
|
|
57
|
+
let providerSessionId = session.providerSessionId || null;
|
|
58
|
+
let costUsd = 0;
|
|
59
|
+
let disposed = false;
|
|
60
|
+
const socket = createVirtualSocket({
|
|
61
|
+
name: `claude-brain-${session.id}`,
|
|
62
|
+
onSend: (packet) => {
|
|
63
|
+
if (disposed || !packet || typeof packet !== 'object') return;
|
|
64
|
+
if (packet.type === 'event') {
|
|
65
|
+
const event = packet.event || {};
|
|
66
|
+
if (event.type === 'system' && event.subtype === 'init' && event.session_id) providerSessionId = event.session_id;
|
|
67
|
+
if (event.type === 'result') {
|
|
68
|
+
if (event.session_id) providerSessionId = event.session_id;
|
|
69
|
+
const cost = Number(event.total_cost_usd);
|
|
70
|
+
if (Number.isFinite(cost)) costUsd = cost;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (packet.type === 'engine') { sink.send({ ...packet, brain: 'claude-code' }); return; }
|
|
74
|
+
sink.send(packet);
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
let approvalMode = APPROVAL_MODES.has(brain.permissionMode) ? brain.permissionMode : 'default';
|
|
78
|
+
let planMode = brain.planMode === true || brain.permissionMode === 'plan';
|
|
79
|
+
const permissionMode = claudeSdkMode(approvalMode, planMode);
|
|
80
|
+
const allowedTools = claudeBrainAllowedTools(deps.remoteLevel);
|
|
81
|
+
// A remote (WhatsApp) session at the read-only level plans read-only (its level
|
|
82
|
+
// is read now, so a lowered level applies without a restart); every other
|
|
83
|
+
// session's plan mode refuses code changes only.
|
|
84
|
+
const planReadOnly = () => typeof deps.planReadOnly === 'function' && deps.planReadOnly() === true;
|
|
85
|
+
const inner = new deps.ClaudeSession(socket, {
|
|
86
|
+
ownerKey: session.id,
|
|
87
|
+
windowId,
|
|
88
|
+
sessionId: providerSessionId,
|
|
89
|
+
model: brain.model || null,
|
|
90
|
+
effort: brain.effort || null,
|
|
91
|
+
cwd: brain.cwd || deps.PACKAGE_ROOT || null,
|
|
92
|
+
permissionMode,
|
|
93
|
+
// The mode an approved plan continues in, and bypass allowed as a switch
|
|
94
|
+
// target (the SDK refuses bypassPermissions later without it). A remote
|
|
95
|
+
// session (WhatsApp) allows it only at the autonomous level.
|
|
96
|
+
planExitMode: approvalMode,
|
|
97
|
+
allowDangerouslySkipPermissions: claudeBypassAllowed(deps.remoteLevel),
|
|
98
|
+
// Plan mode refuses code changes (Edit, Write, MultiEdit, NotebookEdit, a
|
|
99
|
+
// file-writing MCP tool) whatever the approval mode; reads run without a
|
|
100
|
+
// card, and everything else is asked as outside plan mode. ExitPlanMode
|
|
101
|
+
// still waits for the user. The hook refuses before the user's allow rules
|
|
102
|
+
// run (canUseTool alone never sees an allow-listed tool), subagents included.
|
|
103
|
+
planPermission: (tool, input, { approvalMode: mode = 'default' } = {}) => (planReadOnly()
|
|
104
|
+
? claudeReadOnlyPermission(tool, input)
|
|
105
|
+
: claudePlanPermission(tool, input, { approvalMode: mode, preApproved: allowedTools })),
|
|
106
|
+
planHook: (tool, input) => (planReadOnly() ? claudeReadOnlyHookDecision(tool, input) : claudePlanHookDecision(tool, input)),
|
|
107
|
+
planDenyMessage: (tool) => (planReadOnly() ? readOnlyDenyMessage(tool) : planDenyMessage(tool, { host: 'claude' })),
|
|
108
|
+
// What plan mode means here, inside the CLI's own plan-mode reminder. A remote
|
|
109
|
+
// session keeps the CLI's read-only wording: its level can hold plan mode read-only.
|
|
110
|
+
planModeInstructions: deps.remoteLevel ? undefined : planModeInstructions({ provider: 'claude-code' }),
|
|
111
|
+
systemPromptAppend: persona || undefined,
|
|
112
|
+
// User-level settings (global permissions, CLAUDE.md) apply; project hooks
|
|
113
|
+
// are CLI-oriented (greeting, loop driver, stop nudges) and are not loaded.
|
|
114
|
+
settingSources: Array.isArray(deps.settingSources) ? deps.settingSources : ['user'],
|
|
115
|
+
hooks: hooks || undefined,
|
|
116
|
+
mcpHeaders: {
|
|
117
|
+
'X-Synabun-Role': 'assistant', 'X-Synabun-Terminal': session.id, 'X-Synabun-Memory-Session': session.id,
|
|
118
|
+
...(deps.desktopGrant ? { 'X-Synabun-Desktop-Grant': deps.desktopGrant } : {}),
|
|
119
|
+
...mcpHeaders,
|
|
120
|
+
},
|
|
121
|
+
// A remote (WhatsApp) session never pre-approves computer use: its PreToolUse hook refuses, asks or allows each call.
|
|
122
|
+
allowedTools,
|
|
123
|
+
// The user-level SynaBun hooks run in this CLI too (settingSources 'user').
|
|
124
|
+
// The marker tells them the brain recalls in-process (assistant-memory.js):
|
|
125
|
+
// prompt-submit.mjs steps aside (it injected every memory twice and paid Jev
|
|
126
|
+
// twice) and stop.mjs skips the claim check (a relayed worker "tests pass"
|
|
127
|
+
// has its evidence in the worker's turn, not here). Hooks read it from env.
|
|
128
|
+
env: {
|
|
129
|
+
...(typeof deps.claudeAccountEnv === 'function' ? deps.claudeAccountEnv(brain.accountId) : {}),
|
|
130
|
+
SYNABUN_ASSISTANT_SESSION: String(session.id),
|
|
131
|
+
},
|
|
132
|
+
maxBudgetUsd: Number(deps.maxBudgetUsd) > 0 ? Number(deps.maxBudgetUsd) : undefined,
|
|
133
|
+
});
|
|
134
|
+
sink.send({ type: 'engine', engine: 'sdk', brain: 'claude-code', sdkVersion: deps.sdkVersion || null });
|
|
135
|
+
|
|
136
|
+
const handle = (msg) => { if (!disposed) return inner.handleMessage(msg); return undefined; };
|
|
137
|
+
function applyModes(mode, plan) {
|
|
138
|
+
if (mode === 'plan') planMode = true;
|
|
139
|
+
else if (APPROVAL_MODES.has(mode)) approvalMode = mode;
|
|
140
|
+
if (typeof plan === 'boolean') planMode = plan;
|
|
141
|
+
// The session's own setter; a session without it (an older bridge, a test double) takes the field.
|
|
142
|
+
if (typeof inner.setPlanExitMode === 'function') inner.setPlanExitMode(approvalMode);
|
|
143
|
+
else if (inner.opts && typeof inner.opts === 'object') inner.opts.planExitMode = approvalMode;
|
|
144
|
+
return claudeSdkMode(approvalMode, planMode);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Per-turn model switch. ClaudeSession._handleQuery pushes the prompt before
|
|
148
|
+
// calling setModel (the turn can start on the old model) and skips the switch
|
|
149
|
+
// entirely when its model was null, so the brain switches first itself.
|
|
150
|
+
async function applyTurnModel(model) {
|
|
151
|
+
const want = model || null;
|
|
152
|
+
if (typeof inner.setModel === 'function') {
|
|
153
|
+
const switched = await inner.setModel(want);
|
|
154
|
+
if (!switched.ok) sink.send({ type: 'stderr', text: `Model switch failed: ${switched.error}` });
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if ((inner.model || null) === want) return;
|
|
158
|
+
if (inner.q?.setModel) {
|
|
159
|
+
try { await inner.q.setModel(want || undefined); }
|
|
160
|
+
catch (error) { sink.send({ type: 'stderr', text: `Model switch failed: ${error?.message || error}` }); return; }
|
|
161
|
+
}
|
|
162
|
+
inner.model = want; // ensureQuery() reads it when the next query is created
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
kind: 'claude-code',
|
|
167
|
+
async start() { return true; },
|
|
168
|
+
async sendUserTurn({ text, images = [], cwd = null, model = null, effort = null, permissionMode: mode = null, planMode: plan = null } = {}) {
|
|
169
|
+
await applyTurnModel(model);
|
|
170
|
+
const query = { type: 'query', prompt: text, windowId };
|
|
171
|
+
if (Array.isArray(images) && images.length) query.images = images;
|
|
172
|
+
if (providerSessionId) query.sessionId = providerSessionId;
|
|
173
|
+
if (cwd) query.cwd = cwd;
|
|
174
|
+
if (effort) query.effort = effort;
|
|
175
|
+
if ((mode && PERMISSION_MODES.has(mode)) || typeof plan === 'boolean') query.permissionMode = applyModes(mode, plan);
|
|
176
|
+
await handle(query);
|
|
177
|
+
return true;
|
|
178
|
+
},
|
|
179
|
+
async abort() { await handle({ type: 'abort' }); },
|
|
180
|
+
async setPermissionMode(mode, { planMode: plan = null } = {}) {
|
|
181
|
+
if (!PERMISSION_MODES.has(mode) && typeof plan !== 'boolean') return;
|
|
182
|
+
await handle({ type: 'set_permission_mode', mode: applyModes(mode, plan) });
|
|
183
|
+
},
|
|
184
|
+
respondControl(requestId, response) { handle({ type: 'control_response', request_id: requestId, response }); },
|
|
185
|
+
async compact() { await handle({ type: 'compact' }); },
|
|
186
|
+
async mcpStatus() { await handle({ type: 'mcp_status' }); },
|
|
187
|
+
async resume(sessionId) { providerSessionId = sessionId || null; inner.sessionId = providerSessionId; if (inner.q) await inner._endQuery?.({ graceful: true }); },
|
|
188
|
+
async listSessions() { return []; },
|
|
189
|
+
isBusy() { return !!(inner.inTurn || inner.pendingPerms?.size > 0 || inner.pendingTurns > 0); },
|
|
190
|
+
// Background agents or scheduled wakeups still running after their turn
|
|
191
|
+
// ended. Not "busy" (the mailbox may deliver), but disposing would kill them.
|
|
192
|
+
hasPendingWork() { return !!inner._hasPendingWork?.(); },
|
|
193
|
+
identity() {
|
|
194
|
+
return {
|
|
195
|
+
providerSessionId: inner.sessionId || providerSessionId, providerThreadId: null, accountId: brain.accountId || 'default',
|
|
196
|
+
model: inner.model || brain.model || null, effort: inner.effort || brain.effort || null, cwd: inner.cwd || brain.cwd || null,
|
|
197
|
+
costUsd, busy: !!(inner.inTurn || inner.pendingPerms?.size > 0),
|
|
198
|
+
};
|
|
199
|
+
},
|
|
200
|
+
async dispose() {
|
|
201
|
+
if (disposed) return;
|
|
202
|
+
disposed = true;
|
|
203
|
+
try { inner.destroy(); } catch {}
|
|
204
|
+
socket.close();
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// SynaBun — Codex PreToolUse hook: the browser policy of an Assistant task run.
|
|
2
|
+
// Installed only on the Codex workers the Assistant dispatches
|
|
3
|
+
// (native-loop-providers.js, createCodexNativeLoopAdapter with runMode "task"),
|
|
4
|
+
// as `codex exec` session flags the user's Codex trusts by hash
|
|
5
|
+
// (lib/assistant-route-gate-codex.js codexBrowserPolicyHook). Reads the
|
|
6
|
+
// PreToolUse payload from stdin and asks lib/browser-tool-policy.js here, with
|
|
7
|
+
// no server round trip; a refusal becomes permissionDecision "deny" with the
|
|
8
|
+
// reason. Script paths resolve against the payload's cwd, else
|
|
9
|
+
// SYNABUN_BROWSER_POLICY_CWD (the run's project). An unreadable payload allows
|
|
10
|
+
// the call: the policy is a speed bump, not a sandbox. A policy module that
|
|
11
|
+
// cannot load fails closed (logged on stderr): shell commands, web search and
|
|
12
|
+
// every MCP tool but SynaBun's are denied with that reason.
|
|
13
|
+
|
|
14
|
+
let browserToolDenial = null;
|
|
15
|
+
let loadError = null;
|
|
16
|
+
try { ({ browserToolDenial } = await import('../browser-tool-policy.js')); } catch (error) { loadError = error; }
|
|
17
|
+
|
|
18
|
+
// Codex's shell family and web search, by the names its hooks report.
|
|
19
|
+
const SHELL_OR_WEB = /^(?:bash|shell|shell_command|exec_command|local_shell|container\.exec|unified_exec|web_search|web_search_preview)$/i;
|
|
20
|
+
|
|
21
|
+
/** The refusal while the policy module is missing, else null. */
|
|
22
|
+
function unloadedDenial(tool) {
|
|
23
|
+
const synabun = /^mcp__(?:[a-z0-9-]+_)*synabun__/i.test(tool) || /^synabun[_.:/-]/i.test(tool);
|
|
24
|
+
if (synabun || !(SHELL_OR_WEB.test(tool) || /^mcp__/i.test(tool))) return null;
|
|
25
|
+
return `SynaBun browser policy: ${tool} was refused — SynaBun's browser policy could not load (${loadError?.message || 'browserToolDenial is missing'}), so no command, web search or other server's tool can be checked for a browser launch. SynaBun's own tools still work. Stop and report this`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let raw = '';
|
|
29
|
+
try { for await (const chunk of process.stdin) raw += chunk; } catch {}
|
|
30
|
+
let payload = {};
|
|
31
|
+
try { payload = JSON.parse(raw || '{}') || {}; } catch {}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
const tool = String(payload.tool_name || payload.toolName || payload.tool || '');
|
|
35
|
+
const input = payload.tool_input && typeof payload.tool_input === 'object' ? payload.tool_input : {};
|
|
36
|
+
const cwd = (typeof payload.cwd === 'string' && payload.cwd) || process.env.SYNABUN_BROWSER_POLICY_CWD || process.cwd();
|
|
37
|
+
if (typeof browserToolDenial !== 'function') process.stderr.write(`[SynaBun] browser policy could not load (${loadError?.message || 'browserToolDenial is missing'}); denying shell, web search and other servers' tools\n`);
|
|
38
|
+
const reason = !tool ? null : typeof browserToolDenial === 'function' ? browserToolDenial(tool, input, { host: 'codex', cwd }) : unloadedDenial(tool);
|
|
39
|
+
// Codex prints "Command blocked by PreToolUse hook: <reason>. Command: <cmd>", so
|
|
40
|
+
// the reason goes without its own final period.
|
|
41
|
+
if (reason) process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny', permissionDecisionReason: reason.replace(/[.\s]+$/, '') } }));
|
|
42
|
+
} catch {}
|
|
43
|
+
process.exit(0);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// SynaBun — Codex PreToolUse hook for the Assistant's route gate.
|
|
2
|
+
// Installed only on the assistant brain's app-server (session flag, see
|
|
3
|
+
// lib/assistant-route-gate-codex.js). Asks the Neural Interface whether the
|
|
4
|
+
// tool may run; a refusal becomes permissionDecision "deny" with the reason.
|
|
5
|
+
// The call's whole tool_input travels (the remote denylist reads paths from
|
|
6
|
+
// it), marked inputComplete; one too big to send goes as its command/action
|
|
7
|
+
// only, marked incomplete. Any failure (no env, server unreachable, bad reply)
|
|
8
|
+
// allows the call — except in a WhatsApp session (SYNABUN_ROUTE_GATE_REMOTE=1),
|
|
9
|
+
// where a call SynaBun could not check is denied.
|
|
10
|
+
|
|
11
|
+
const url = process.env.SYNABUN_ROUTE_GATE_URL;
|
|
12
|
+
const session = process.env.SYNABUN_ROUTE_GATE_SESSION;
|
|
13
|
+
const token = process.env.SYNABUN_ROUTE_GATE_TOKEN;
|
|
14
|
+
const remote = process.env.SYNABUN_ROUTE_GATE_REMOTE === '1';
|
|
15
|
+
const MAX_INPUT_BYTES = 256 * 1024;
|
|
16
|
+
const UNCHECKED = 'SynaBun could not check this call, so a WhatsApp session does not run it.';
|
|
17
|
+
|
|
18
|
+
let raw = '';
|
|
19
|
+
try { for await (const chunk of process.stdin) raw += chunk; } catch {}
|
|
20
|
+
let input = {};
|
|
21
|
+
try { input = JSON.parse(raw || '{}'); } catch {}
|
|
22
|
+
|
|
23
|
+
/** { input, inputComplete }: the whole tool_input when the host gave one small enough to send. */
|
|
24
|
+
function callArguments(toolInput) {
|
|
25
|
+
if (!toolInput || typeof toolInput !== 'object' || Array.isArray(toolInput)) return { input: {}, inputComplete: false };
|
|
26
|
+
let size = Infinity;
|
|
27
|
+
try { size = Buffer.byteLength(JSON.stringify(toolInput)); } catch {}
|
|
28
|
+
if (size <= MAX_INPUT_BYTES) return { input: toolInput, inputComplete: true };
|
|
29
|
+
const subset = {};
|
|
30
|
+
for (const key of ['command', 'action']) {
|
|
31
|
+
if (typeof toolInput[key] === 'string' && toolInput[key].length <= 64 * 1024) subset[key] = toolInput[key];
|
|
32
|
+
}
|
|
33
|
+
return { input: subset, inputComplete: false };
|
|
34
|
+
}
|
|
35
|
+
// Codex prints "Command blocked by PreToolUse hook: <reason>. Command: <cmd>", so the
|
|
36
|
+
// reason goes without its own final period.
|
|
37
|
+
function deny(reason) {
|
|
38
|
+
process.stdout.write(JSON.stringify({ hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny', permissionDecisionReason: String(reason).replace(/[.\s]+$/, '') } }));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (url && session && token) {
|
|
42
|
+
try {
|
|
43
|
+
const response = await fetch(url, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: { 'content-type': 'application/json' },
|
|
46
|
+
body: JSON.stringify({ session, token, host: 'codex', tool: String(input.tool_name || input.toolName || input.tool || ''), agent: input.agent_id || null, ...callArguments(input.tool_input) }),
|
|
47
|
+
signal: AbortSignal.timeout(5000),
|
|
48
|
+
});
|
|
49
|
+
const decision = await response.json();
|
|
50
|
+
if (decision && decision.allow === false) deny(decision.reason || 'SynaBun refused this call.');
|
|
51
|
+
else if (remote && !(decision && decision.allow === true)) deny(UNCHECKED);
|
|
52
|
+
} catch {
|
|
53
|
+
if (remote) deny(UNCHECKED);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
process.exit(0);
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — Assistant brain: Codex (app-server via the codex-skin handler)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Drives the existing `handleCodexSkinWebSocket` (accounts, thread lifecycle,
|
|
6
|
+
// approvals, MCP pins, rate limits) through a virtual socket, speaking the
|
|
7
|
+
// sidepanel protocol with a fixed ownership envelope. Packets coming back are
|
|
8
|
+
// translated into the unified envelope; the persona rides as
|
|
9
|
+
// `developerInstructions` on every query (collaborationMode.settings).
|
|
10
|
+
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
12
|
+
import { createVirtualSocket } from '../virtual-socket.js';
|
|
13
|
+
import { createCodexEnvelopeTranslator, codexControlResponse } from '../assistant-envelope.js';
|
|
14
|
+
import { baseModelId, contextVariantOf } from '../assistant-catalog.js';
|
|
15
|
+
import { codexPlanPermission, codexReadOnlyPermission, planDenyMessage, readOnlyDenyMessage } from '../assistant-plan-permissions.js';
|
|
16
|
+
import { planModeInstructions } from '../assistant-persona.js';
|
|
17
|
+
|
|
18
|
+
const READY_TIMEOUT_MS = 90_000;
|
|
19
|
+
// Approvals the Codex sidepanel's Auto-accept answers on its own (cdx-requests.js).
|
|
20
|
+
const AUTO_ACCEPT_METHODS = new Set(['item/commandExecution/requestApproval', 'item/fileChange/requestApproval', 'item/permissions/requestApproval']);
|
|
21
|
+
|
|
22
|
+
/** The assistant's Codex approval mode: 'auto' (auto-accept) or 'default'. Claude's names read as auto. */
|
|
23
|
+
export function codexApprovalMode(mode) {
|
|
24
|
+
return mode === 'auto' || mode === 'acceptEdits' || mode === 'bypassPermissions' ? 'auto' : 'default';
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function createCodexBrain({ session, sink, deps = {}, persona = '' } = {}) {
|
|
28
|
+
if (typeof deps.handleCodexSkinWebSocket !== 'function') throw new Error('Codex brain requires deps.handleCodexSkinWebSocket');
|
|
29
|
+
const brain = session.brain || {};
|
|
30
|
+
const ownerSessionId = session.id;
|
|
31
|
+
const connectionEpoch = randomUUID();
|
|
32
|
+
const windowId = `assistant-${session.id}`;
|
|
33
|
+
const pendingControls = new Map();
|
|
34
|
+
let threadId = session.providerThreadId || null;
|
|
35
|
+
let disposed = false;
|
|
36
|
+
let readyResolve = null;
|
|
37
|
+
let readyPromise = null;
|
|
38
|
+
let turnActive = false;
|
|
39
|
+
// The query sent whose turn has not started (its requestId). Codex answers a
|
|
40
|
+
// query it refuses before any turn starts (turn/start rejected, a pending
|
|
41
|
+
// approval, a turn already running) with an `error` for it and nothing else.
|
|
42
|
+
let startingRequest = null;
|
|
43
|
+
let lastTurn = null;
|
|
44
|
+
let usage = null;
|
|
45
|
+
// Approval mode and plan mode are independent: plan runs Codex's native plan
|
|
46
|
+
// collaboration mode (read-only sandbox, so a patch has to ask) and its policy
|
|
47
|
+
// (codexPlanPermission) declines patches and file-write grants, allows reads,
|
|
48
|
+
// and leaves every other approval to the approval mode, as outside plan. The
|
|
49
|
+
// server-side MCP auto-accept is off in plan so every approval reaches it.
|
|
50
|
+
let approvalMode = codexApprovalMode(brain.permissionMode);
|
|
51
|
+
let planMode = brain.planMode === true || brain.permissionMode === 'plan';
|
|
52
|
+
// A remote (WhatsApp) session: Codex cannot ask before ordinary commands, so the
|
|
53
|
+
// brain is read-only for good — the read-only sandbox (network off) on every
|
|
54
|
+
// turn, every escalation declined as in plan mode, never auto-accept.
|
|
55
|
+
const remoteReadOnly = deps.remoteReadOnly === true;
|
|
56
|
+
const readOnlyTurn = () => (remoteReadOnly ? { sandboxMode: 'read-only' } : {});
|
|
57
|
+
function applyModes(mode, plan) {
|
|
58
|
+
if (mode === 'plan') planMode = true;
|
|
59
|
+
else if (mode) approvalMode = codexApprovalMode(mode);
|
|
60
|
+
if (typeof plan === 'boolean') planMode = plan;
|
|
61
|
+
}
|
|
62
|
+
// Route gate: 'hook' when the app-server runs the trusted PreToolUse hook,
|
|
63
|
+
// 'reactive' otherwise (the runtime interrupts ungated tool starts).
|
|
64
|
+
let gateMode = deps.routeGate ? 'reactive' : null;
|
|
65
|
+
// Whether the last query asked for Codex's plan collaboration mode: only that
|
|
66
|
+
// turn's proposed plan is a plan (the translator reads it as the turn starts).
|
|
67
|
+
let queryPlanMode = false;
|
|
68
|
+
|
|
69
|
+
const translator = createCodexEnvelopeTranslator({
|
|
70
|
+
priceUsage: typeof deps.priceCodexUsage === 'function' ? deps.priceCodexUsage : null,
|
|
71
|
+
brain: { cwd: brain.cwd || null, model: brain.model || null },
|
|
72
|
+
planTurn: () => queryPlanMode,
|
|
73
|
+
emit: (packet) => {
|
|
74
|
+
if (disposed) return;
|
|
75
|
+
// A WhatsApp session's brain answers every approval read-only (anything that
|
|
76
|
+
// would leave the read-only sandbox is declined). Plan mode declines code
|
|
77
|
+
// changes, allows reads, and hands the rest to the approval mode (auto
|
|
78
|
+
// allows it here, default leaves it to a card below).
|
|
79
|
+
let planned = null;
|
|
80
|
+
if (packet.type === 'control_request') {
|
|
81
|
+
if (remoteReadOnly) planned = codexReadOnlyPermission(packet);
|
|
82
|
+
else if (planMode) planned = codexPlanPermission(packet, { approvalMode });
|
|
83
|
+
}
|
|
84
|
+
if (planned) {
|
|
85
|
+
const method = packet.request?.brain_native?.method || packet.request?.method || '';
|
|
86
|
+
const tool = packet.request?.brain_native?.params?._meta?.tool_name || packet.request?.tool_name || 'request';
|
|
87
|
+
const response = planned === 'allow'
|
|
88
|
+
? { behavior: 'allow', ...(!remoteReadOnly && approvalMode === 'auto' ? { always: true } : {}) }
|
|
89
|
+
: { behavior: 'deny', decline: true, message: remoteReadOnly ? readOnlyDenyMessage(tool) : planDenyMessage(tool, { host: 'codex' }) };
|
|
90
|
+
send({ type: 'server_request_response', ...codexControlResponse(packet, response) });
|
|
91
|
+
sink.send({ type: 'stderr', text: `${planMode ? 'Plan mode' : 'Read-only (WhatsApp)'}: ${planned === 'allow' ? 'allowed' : 'declined'} ${String(method).split('/').slice(1, -1).join('/') || 'request'} ${tool}${planned === 'allow' ? '' : remoteReadOnly ? ' (read-only)' : ' (no code changes)'}` });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (packet.type === 'control_request' && !planMode && !remoteReadOnly && approvalMode === 'auto' && AUTO_ACCEPT_METHODS.has(packet.request?.brain_native?.method || packet.request?.method)) {
|
|
95
|
+
// Auto-accept: approve at once (for the session when offered), as the Codex sidepanel does.
|
|
96
|
+
send({ type: 'server_request_response', ...codexControlResponse(packet, { behavior: 'allow', always: true }) });
|
|
97
|
+
sink.send({ type: 'stderr', text: `Auto-accepted: ${String(packet.request?.brain_native?.method || packet.request?.method).split('/').slice(1, -1).join('/')}` });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (packet.type === 'control_request') pendingControls.set(packet.request_id, packet);
|
|
101
|
+
// That error is the refused query's only answer: its turn, which never started, ends here.
|
|
102
|
+
const refused = packet.type === 'error' && !!startingRequest && packet.requestId === startingRequest;
|
|
103
|
+
if (packet.type === 'done' || packet.type === 'aborted' || packet.type === 'error') {
|
|
104
|
+
if (packet.type !== 'error') { turnActive = false; startingRequest = null; }
|
|
105
|
+
for (const [id, pending] of pendingControls) if (pending.request?.provider === 'codex') pendingControls.delete(id);
|
|
106
|
+
}
|
|
107
|
+
sink.send(packet);
|
|
108
|
+
if (refused) {
|
|
109
|
+
startingRequest = null;
|
|
110
|
+
turnActive = false;
|
|
111
|
+
sink.send({ type: 'done', code: 1 });
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
// The thread hook is metering: a throw there must not leave the brain waiting for ready.
|
|
115
|
+
onThread: (id) => { if (id) { threadId = id; try { deps.onCodexThread?.(id); } catch {} } readyResolve?.(); },
|
|
116
|
+
onTurnStart: () => { turnActive = true; startingRequest = null; },
|
|
117
|
+
onTurnEnd: (info) => { turnActive = false; lastTurn = info; },
|
|
118
|
+
onUsage: (value) => { usage = value; try { deps.onCodexUsage?.(); } catch {} },
|
|
119
|
+
});
|
|
120
|
+
const socket = createVirtualSocket({
|
|
121
|
+
name: `codex-brain-${session.id}`,
|
|
122
|
+
onSend: (packet) => {
|
|
123
|
+
if (disposed || !packet || typeof packet !== 'object') return;
|
|
124
|
+
if (packet.type === 'ready') readyResolve?.();
|
|
125
|
+
translator.handle(packet);
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
deps.handleCodexSkinWebSocket(socket);
|
|
129
|
+
const send = (message) => socket.receive({ ...message, sessionId: ownerSessionId, connectionEpoch });
|
|
130
|
+
// A query: busy from before it is sent (a refusal may come back at once) until its turn ends or Codex refuses it.
|
|
131
|
+
const sendQuery = (message) => {
|
|
132
|
+
const requestId = randomUUID();
|
|
133
|
+
startingRequest = requestId;
|
|
134
|
+
turnActive = true;
|
|
135
|
+
send({ ...message, type: 'query', requestId });
|
|
136
|
+
};
|
|
137
|
+
sink.send({ type: 'engine', engine: 'codex', brain: 'codex' });
|
|
138
|
+
|
|
139
|
+
let startPromise = null;
|
|
140
|
+
function start() {
|
|
141
|
+
if (!startPromise) startPromise = boot();
|
|
142
|
+
return startPromise;
|
|
143
|
+
}
|
|
144
|
+
async function boot() {
|
|
145
|
+
if (disposed) throw new Error('Codex brain disposed');
|
|
146
|
+
if (readyPromise) return readyPromise;
|
|
147
|
+
let routeGate = null;
|
|
148
|
+
if (typeof deps.routeGate === 'function') {
|
|
149
|
+
try { routeGate = await deps.routeGate(); } catch { routeGate = null; }
|
|
150
|
+
gateMode = routeGate ? 'hook' : 'reactive';
|
|
151
|
+
}
|
|
152
|
+
if (disposed) throw new Error('Codex brain disposed');
|
|
153
|
+
readyPromise = new Promise((resolve, reject) => {
|
|
154
|
+
const timer = setTimeout(() => reject(new Error('Codex app-server did not become ready')), READY_TIMEOUT_MS);
|
|
155
|
+
timer.unref?.();
|
|
156
|
+
readyResolve = () => { clearTimeout(timer); resolve(true); };
|
|
157
|
+
});
|
|
158
|
+
send({
|
|
159
|
+
type: 'bootstrap', windowId, accountId: brain.accountId || 'default', mcpProfile: brain.mcpProfile || null,
|
|
160
|
+
cwd: brain.cwd || deps.PACKAGE_ROOT || undefined, threadId: threadId || null, role: 'assistant',
|
|
161
|
+
// Unlocks the capability-gated `computer` MCP group for this brain only.
|
|
162
|
+
desktopGrant: deps.desktopGrant || null,
|
|
163
|
+
...(routeGate ? { routeGate } : {}),
|
|
164
|
+
});
|
|
165
|
+
return readyPromise;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
kind: 'codex',
|
|
170
|
+
start,
|
|
171
|
+
async sendUserTurn({ text, images = [], cwd = null, model = null, effort = null, permissionMode: mode = null, planMode: plan = null } = {}) {
|
|
172
|
+
await start();
|
|
173
|
+
applyModes(mode, plan);
|
|
174
|
+
queryPlanMode = planMode;
|
|
175
|
+
// "<id>[extended]" = the model at its extended context window (the sidepanel's contextMode).
|
|
176
|
+
const picked = model || brain.model || null;
|
|
177
|
+
sendQuery({
|
|
178
|
+
prompt: text, images: Array.isArray(images) && images.length ? images : undefined,
|
|
179
|
+
cwd: cwd || brain.cwd || deps.PACKAGE_ROOT || undefined, model: picked ? baseModelId(picked) : null, effort: effort || brain.effort || null,
|
|
180
|
+
contextMode: contextVariantOf(picked) === 'extended' ? 'extended' : undefined,
|
|
181
|
+
threadId: threadId || null, autoAccept: approvalMode === 'auto' && !planMode && !remoteReadOnly, planMode,
|
|
182
|
+
// A plan turn carries what plan mode means here (a WhatsApp session's read-only brain does not).
|
|
183
|
+
developerInstructions: [persona, planMode && !remoteReadOnly ? planModeInstructions({ provider: 'codex' }) : ''].filter(Boolean).join('\n\n') || null,
|
|
184
|
+
windowId, ...readOnlyTurn(),
|
|
185
|
+
});
|
|
186
|
+
return true;
|
|
187
|
+
},
|
|
188
|
+
async abort() { send({ type: 'interrupt', threadId: threadId || null }); },
|
|
189
|
+
async setPermissionMode(mode, { planMode: plan = null } = {}) { applyModes(mode, plan); sink.send({ type: 'mode_changed', mode: approvalMode, planMode }); },
|
|
190
|
+
respondControl(requestId, response) {
|
|
191
|
+
const pending = pendingControls.get(String(requestId));
|
|
192
|
+
if (!pending) { sink.send({ type: 'error', message: `No pending Codex request ${requestId}` }); return; }
|
|
193
|
+
pendingControls.delete(String(requestId));
|
|
194
|
+
send({ type: 'server_request_response', ...codexControlResponse(pending, response) });
|
|
195
|
+
},
|
|
196
|
+
// A turn of its own: busy until its `done`, like sendUserTurn (the runtime starts nothing meanwhile).
|
|
197
|
+
async compact() { queryPlanMode = false; sendQuery({ prompt: '/compact', threadId: threadId || null, cwd: brain.cwd || undefined, windowId, ...readOnlyTurn() }); },
|
|
198
|
+
async mcpStatus() { send({ type: 'mcp_status' }); },
|
|
199
|
+
async resume(id) { if (!id) return; threadId = id; send({ type: 'thread_resume', threadId: id, cwd: brain.cwd || undefined }); },
|
|
200
|
+
async listSessions() { return []; },
|
|
201
|
+
isBusy() { return turnActive || pendingControls.size > 0; },
|
|
202
|
+
get gateMode() { return gateMode; },
|
|
203
|
+
identity() {
|
|
204
|
+
return { providerSessionId: threadId, providerThreadId: threadId, accountId: brain.accountId || 'default', model: brain.model || null, effort: brain.effort || null, cwd: brain.cwd || null, usage, lastTurn, busy: turnActive };
|
|
205
|
+
},
|
|
206
|
+
async dispose() {
|
|
207
|
+
if (disposed) return;
|
|
208
|
+
disposed = true;
|
|
209
|
+
try { send({ type: 'release', windowId }); } catch {}
|
|
210
|
+
socket.close();
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|