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
|
@@ -91,6 +91,10 @@
|
|
|
91
91
|
.steps-viewport {
|
|
92
92
|
position: relative;
|
|
93
93
|
overflow: hidden;
|
|
94
|
+
/* Progressive fallback: absolute-positioned steps do not size their parent.
|
|
95
|
+
JavaScript replaces this with the active step's measured height, but the
|
|
96
|
+
welcome screen must remain visible while initialization is pending. */
|
|
97
|
+
height: min(533px, calc(90vh - 56px));
|
|
94
98
|
transition: height 0.45s cubic-bezier(0.4, 0, 0.2, 1);
|
|
95
99
|
}
|
|
96
100
|
|
|
@@ -443,6 +447,172 @@
|
|
|
443
447
|
white-space: nowrap;
|
|
444
448
|
}
|
|
445
449
|
|
|
450
|
+
/* ── MCP Toggle List (Step 5) — 2×2 grid ── */
|
|
451
|
+
.mcp-toggle-list {
|
|
452
|
+
display: grid;
|
|
453
|
+
grid-template-columns: 1fr 1fr;
|
|
454
|
+
gap: 8px;
|
|
455
|
+
margin-bottom: 14px;
|
|
456
|
+
}
|
|
457
|
+
.mcp-toggle-row {
|
|
458
|
+
display: flex;
|
|
459
|
+
align-items: center;
|
|
460
|
+
gap: 12px;
|
|
461
|
+
padding: 10px 14px;
|
|
462
|
+
border: 1px solid var(--b-light);
|
|
463
|
+
border-radius: var(--r-card);
|
|
464
|
+
background: var(--s-subtle);
|
|
465
|
+
transition: border-color 0.25s ease, background 0.25s ease;
|
|
466
|
+
min-width: 0; /* allow grid cell to shrink below intrinsic width */
|
|
467
|
+
}
|
|
468
|
+
.mcp-toggle-row.connected {
|
|
469
|
+
border-color: var(--accent-border);
|
|
470
|
+
background: var(--accent-bg);
|
|
471
|
+
}
|
|
472
|
+
.mcp-toggle-row .mtr-body { flex: 1 1 0; min-width: 0; overflow: hidden; }
|
|
473
|
+
.mcp-toggle-row .mtr-name {
|
|
474
|
+
font-size: 13px;
|
|
475
|
+
font-weight: 600;
|
|
476
|
+
color: var(--t-bright);
|
|
477
|
+
margin-bottom: 2px;
|
|
478
|
+
}
|
|
479
|
+
.mcp-toggle-row .mtr-path {
|
|
480
|
+
font-size: 11px;
|
|
481
|
+
color: var(--t-muted);
|
|
482
|
+
font-family: var(--mono, monospace);
|
|
483
|
+
white-space: nowrap;
|
|
484
|
+
overflow: hidden;
|
|
485
|
+
text-overflow: ellipsis;
|
|
486
|
+
}
|
|
487
|
+
.mcp-toggle-row .mtr-toggle {
|
|
488
|
+
flex-shrink: 0;
|
|
489
|
+
width: 36px; height: 20px;
|
|
490
|
+
border-radius: 10px;
|
|
491
|
+
background: var(--s-hover);
|
|
492
|
+
border: 1px solid var(--b-light);
|
|
493
|
+
position: relative;
|
|
494
|
+
cursor: pointer;
|
|
495
|
+
transition: background 0.2s ease, border-color 0.2s ease;
|
|
496
|
+
padding: 0;
|
|
497
|
+
}
|
|
498
|
+
.mcp-toggle-row .mtr-toggle::after {
|
|
499
|
+
content: '';
|
|
500
|
+
position: absolute;
|
|
501
|
+
top: 2px; left: 2px;
|
|
502
|
+
width: 14px; height: 14px;
|
|
503
|
+
border-radius: 50%;
|
|
504
|
+
background: var(--t-secondary);
|
|
505
|
+
transition: left 0.2s ease, background 0.2s ease;
|
|
506
|
+
}
|
|
507
|
+
.mcp-toggle-row .mtr-toggle.on {
|
|
508
|
+
background: var(--accent-border);
|
|
509
|
+
border-color: var(--accent-border);
|
|
510
|
+
}
|
|
511
|
+
.mcp-toggle-row .mtr-toggle.on::after {
|
|
512
|
+
left: 18px;
|
|
513
|
+
background: var(--t-bright);
|
|
514
|
+
}
|
|
515
|
+
.mcp-toggle-row .mtr-toggle:disabled,
|
|
516
|
+
.mcp-toggle-row .mtr-toggle.busy {
|
|
517
|
+
opacity: 0.4;
|
|
518
|
+
cursor: wait;
|
|
519
|
+
}
|
|
520
|
+
.mcp-other-section {
|
|
521
|
+
border: 1px solid var(--b-light);
|
|
522
|
+
border-radius: var(--r-card);
|
|
523
|
+
background: var(--s-subtle);
|
|
524
|
+
overflow: hidden;
|
|
525
|
+
}
|
|
526
|
+
.mcp-other-header {
|
|
527
|
+
display: flex;
|
|
528
|
+
align-items: center;
|
|
529
|
+
justify-content: space-between;
|
|
530
|
+
padding: 10px 14px;
|
|
531
|
+
cursor: pointer;
|
|
532
|
+
font-size: 12px;
|
|
533
|
+
color: var(--t-secondary);
|
|
534
|
+
user-select: none;
|
|
535
|
+
transition: background 0.2s ease;
|
|
536
|
+
}
|
|
537
|
+
.mcp-other-header:hover { background: var(--s-hover); }
|
|
538
|
+
.mcp-other-chevron { transition: transform 0.2s ease; }
|
|
539
|
+
.mcp-other-section.open .mcp-other-chevron { transform: rotate(180deg); }
|
|
540
|
+
.mcp-other-body { padding: 0 14px 12px; }
|
|
541
|
+
|
|
542
|
+
/* ── Rules (Step 5 option, Step 6 installer) ── */
|
|
543
|
+
.rules-option {
|
|
544
|
+
display: flex;
|
|
545
|
+
align-items: center;
|
|
546
|
+
gap: 10px;
|
|
547
|
+
margin-bottom: 14px;
|
|
548
|
+
font-size: 12px;
|
|
549
|
+
color: var(--t-secondary);
|
|
550
|
+
cursor: pointer;
|
|
551
|
+
user-select: none;
|
|
552
|
+
}
|
|
553
|
+
/* A step whose height follows what the installer reports: on a short window it scrolls (its parts keep their
|
|
554
|
+
height instead of being squeezed) rather than being cut off. */
|
|
555
|
+
.step[data-step="6"] { max-height: calc(90vh - 58px); }
|
|
556
|
+
.step[data-step="6"] > * { flex-shrink: 0; }
|
|
557
|
+
.step[data-step="6"] .subtitle { margin-bottom: 16px; }
|
|
558
|
+
/* The step's one primary action: what it does, then the button. */
|
|
559
|
+
.rules-install-all {
|
|
560
|
+
display: flex;
|
|
561
|
+
align-items: center;
|
|
562
|
+
gap: 14px;
|
|
563
|
+
padding: 12px 14px;
|
|
564
|
+
margin-bottom: 12px;
|
|
565
|
+
border: 1px solid var(--accent-border);
|
|
566
|
+
border-radius: var(--r-card);
|
|
567
|
+
background: var(--accent-bg);
|
|
568
|
+
}
|
|
569
|
+
.rules-install-all .ria-text { flex: 1 1 0; min-width: 0; font-size: 12px; color: var(--t-primary); line-height: 1.5; }
|
|
570
|
+
.rules-install-all .action-btn { flex-shrink: 0; padding: 9px 18px; font-size: 12px; white-space: nowrap; }
|
|
571
|
+
/* What the installer answered, and where the rules live. */
|
|
572
|
+
.rules-result { margin-bottom: 12px; font-size: 12px; color: var(--t-primary); line-height: 1.5; overflow-wrap: anywhere; }
|
|
573
|
+
.rules-result.ok .rr-message::before { content: '\2713'; margin-right: 8px; color: var(--green); }
|
|
574
|
+
.rules-result.fail .rr-message { color: var(--red); }
|
|
575
|
+
.rules-result .rr-where { margin-top: 4px; font-size: 11px; color: var(--t-muted); }
|
|
576
|
+
.rules-list {
|
|
577
|
+
display: flex;
|
|
578
|
+
flex-direction: column;
|
|
579
|
+
gap: 8px;
|
|
580
|
+
margin-bottom: 12px;
|
|
581
|
+
}
|
|
582
|
+
.rules-list:empty { display: none; }
|
|
583
|
+
.rules-list .mcp-toggle-row.has-note { align-items: flex-start; }
|
|
584
|
+
.rules-list .mtr-state {
|
|
585
|
+
margin-left: 6px;
|
|
586
|
+
font-size: 10px;
|
|
587
|
+
font-weight: 500;
|
|
588
|
+
color: var(--t-muted);
|
|
589
|
+
}
|
|
590
|
+
.rules-list .mtr-state.ok { color: var(--green); }
|
|
591
|
+
.rules-list .mtr-note { margin-top: 4px; font-size: 11px; color: var(--t-secondary); line-height: 1.45; overflow-wrap: anywhere; }
|
|
592
|
+
.rules-actions { display: flex; gap: 6px; flex-shrink: 0; }
|
|
593
|
+
.rules-actions button, .rules-note button {
|
|
594
|
+
padding: 5px 10px;
|
|
595
|
+
border-radius: 8px;
|
|
596
|
+
border: 1px solid var(--b-light);
|
|
597
|
+
background: var(--s-light);
|
|
598
|
+
color: var(--t-primary);
|
|
599
|
+
font-size: 11px;
|
|
600
|
+
font-family: inherit;
|
|
601
|
+
cursor: pointer;
|
|
602
|
+
white-space: nowrap;
|
|
603
|
+
transition: all var(--ease);
|
|
604
|
+
}
|
|
605
|
+
.rules-actions button:hover, .rules-note button:hover { background: var(--s-medium); color: var(--t-bright); border-color: var(--b-hover); }
|
|
606
|
+
.rules-actions button.primary { border-color: var(--accent-border); background: var(--s-active); color: var(--t-bright); font-weight: 600; }
|
|
607
|
+
.rules-actions button:disabled, .rules-note button:disabled { opacity: 0.4; cursor: default; }
|
|
608
|
+
.rules-note { font-size: 11px; color: var(--t-muted); margin-bottom: 12px; line-height: 1.5; }
|
|
609
|
+
.rules-note button { margin-left: 8px; }
|
|
610
|
+
/* Under the installer: the text SynaBun cannot install, to paste by hand. */
|
|
611
|
+
.rules-manual-label { margin: 4px 0 8px; font-size: 10px; color: var(--t-muted); text-transform: uppercase; letter-spacing: 0.5px; }
|
|
612
|
+
.rules-extra { margin-top: 8px; }
|
|
613
|
+
#rulesViewCode, #rulesCursorCode, #rulesCoexistCode { max-height: 160px; }
|
|
614
|
+
#rulesViewCode { margin-bottom: 12px; }
|
|
615
|
+
|
|
446
616
|
/* ── Dependency List ── */
|
|
447
617
|
.dep-list {
|
|
448
618
|
list-style: none;
|
|
@@ -603,10 +773,11 @@
|
|
|
603
773
|
color: var(--t-secondary);
|
|
604
774
|
text-align: center;
|
|
605
775
|
margin-top: 16px;
|
|
606
|
-
opacity:
|
|
776
|
+
opacity: 1;
|
|
607
777
|
transition: opacity 0.6s ease;
|
|
608
778
|
line-height: 1.8;
|
|
609
779
|
}
|
|
780
|
+
.onboarding-animated .welcome-desc:not(.visible) { opacity: 0; }
|
|
610
781
|
.welcome-desc.visible { opacity: 1; }
|
|
611
782
|
|
|
612
783
|
/* ── Welcome Choice Cards ── */
|
|
@@ -614,11 +785,12 @@
|
|
|
614
785
|
display: flex;
|
|
615
786
|
gap: 14px;
|
|
616
787
|
margin-top: 28px;
|
|
617
|
-
opacity:
|
|
788
|
+
opacity: 1;
|
|
618
789
|
transition: opacity 0.5s ease;
|
|
619
790
|
width: 100%;
|
|
620
791
|
max-width: 440px;
|
|
621
792
|
}
|
|
793
|
+
.onboarding-animated .welcome-choices:not(.visible) { opacity: 0; }
|
|
622
794
|
.welcome-choices.visible { opacity: 1; }
|
|
623
795
|
.welcome-choice {
|
|
624
796
|
flex: 1;
|
|
@@ -906,9 +1078,16 @@
|
|
|
906
1078
|
|
|
907
1079
|
<!-- Step 0: Welcome -->
|
|
908
1080
|
<div class="step active" data-step="0" style="align-items:center;">
|
|
909
|
-
<div id="synabun-bg"
|
|
1081
|
+
<div id="synabun-bg" aria-hidden="true">
|
|
1082
|
+
<!-- Static first-paint fallback. The animation replaces this SVG. -->
|
|
1083
|
+
<svg viewBox="0 0 280 140" width="380" height="190" style="overflow:visible">
|
|
1084
|
+
<g class="syna-eye"><g class="syna-lid"><rect x="80" y="24" width="38" height="72" rx="19" fill="#ffffff"/></g></g>
|
|
1085
|
+
<g class="syna-eye"><g class="syna-lid"><rect x="162" y="24" width="38" height="72" rx="19" fill="#ffffff"/></g></g>
|
|
1086
|
+
<path class="syna-mouth" d="M118,116 Q140,130 162,116" fill="none" stroke="rgba(255,255,255,0.25)" stroke-width="2.5" stroke-linecap="round"/>
|
|
1087
|
+
</svg>
|
|
1088
|
+
</div>
|
|
910
1089
|
<div style="display:flex;flex-direction:column;align-items:center;">
|
|
911
|
-
<div class="typewriter-line" id="typewriter"
|
|
1090
|
+
<div class="typewriter-line" id="typewriter">Hi! I'm SynaBun!</div>
|
|
912
1091
|
<div class="welcome-desc" id="welcomeDesc">
|
|
913
1092
|
Persistent vector memory for your AI coding tools.<br>
|
|
914
1093
|
How would you like to get started?
|
|
@@ -1040,29 +1219,73 @@
|
|
|
1040
1219
|
<span class="mascot-toast" id="mascotToast"></span>
|
|
1041
1220
|
</div>
|
|
1042
1221
|
<h2>AI Tool Integration</h2>
|
|
1043
|
-
<p class="subtitle">
|
|
1044
|
-
<div class="
|
|
1045
|
-
<
|
|
1046
|
-
<
|
|
1047
|
-
|
|
1048
|
-
<
|
|
1049
|
-
|
|
1222
|
+
<p class="subtitle">Toggle on the AI coding tools you use. SynaBun registers itself with each one and installs its rules automatically.</p>
|
|
1223
|
+
<div class="mcp-toggle-list" id="mcpToggleList"></div>
|
|
1224
|
+
<label class="rules-option" for="rulesInstallOpt">
|
|
1225
|
+
<span class="key-backup-checkbox-wrap">
|
|
1226
|
+
<input type="checkbox" id="rulesInstallOpt" checked>
|
|
1227
|
+
<span class="key-backup-checkmark"><svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg></span>
|
|
1228
|
+
</span>
|
|
1229
|
+
<span>Install SynaBun's rules with each tool I connect</span>
|
|
1230
|
+
</label>
|
|
1231
|
+
<div class="mcp-other-section" id="mcpOtherSection">
|
|
1232
|
+
<div class="mcp-other-header" id="mcpOtherHeader">
|
|
1233
|
+
<span>Other providers (Cursor, Windsurf, etc.)</span>
|
|
1234
|
+
<svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
|
|
1235
|
+
</div>
|
|
1236
|
+
<div class="mcp-other-body" id="mcpOtherBody" style="display:none;">
|
|
1237
|
+
<div style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Add this MCP server JSON to your tool's config file:</div>
|
|
1238
|
+
<div class="code-copy-wrap" id="mcpCodeWrap">
|
|
1239
|
+
<div class="instructions-preview" id="mcpSetupCode"></div>
|
|
1240
|
+
<span class="code-copy-label">copy</span>
|
|
1241
|
+
</div>
|
|
1242
|
+
<div style="margin-top:6px;font-size:11px;color:var(--t-muted);">Cursor: Settings → MCP Servers, or <code>.cursor/mcp.json</code>. Windsurf: <code>~/.codeium/windsurf/mcp_config.json</code>.</div>
|
|
1050
1243
|
</div>
|
|
1051
|
-
<div id="mcpSetupHint" style="margin-top:6px;font-size:11px;color:var(--t-muted);"></div>
|
|
1052
1244
|
</div>
|
|
1053
1245
|
</div>
|
|
1054
1246
|
|
|
1055
|
-
<!-- Step 6:
|
|
1247
|
+
<!-- Step 6: Install SynaBun rules. The installer leads; the copy boxes at the bottom are only for what it cannot write. -->
|
|
1056
1248
|
<div class="step right" data-step="6">
|
|
1057
|
-
<div
|
|
1058
|
-
|
|
1249
|
+
<div class="step-eyes"></div>
|
|
1250
|
+
<h2>Install SynaBun Rules</h2>
|
|
1251
|
+
<p class="subtitle">SynaBun installs its rules where each connected tool loads them for every project, and keeps them up to date. There is nothing to paste.</p>
|
|
1252
|
+
<div class="rules-note" id="rulesNote" role="status" style="display:none;"></div>
|
|
1253
|
+
<div class="rules-install-all" id="rulesInstallAll" style="display:none;">
|
|
1254
|
+
<div class="ria-text" id="rulesInstallAllHelp"></div>
|
|
1255
|
+
<button type="button" class="action-btn" id="rulesInstallAllBtn" aria-describedby="rulesInstallAllHelp"></button>
|
|
1256
|
+
</div>
|
|
1257
|
+
<div class="rules-result" id="rulesResult" role="status" style="display:none;">
|
|
1258
|
+
<div class="rr-message" id="rulesResultMessage"></div>
|
|
1259
|
+
<div class="rr-where" id="rulesResultWhere"></div>
|
|
1059
1260
|
</div>
|
|
1060
|
-
<
|
|
1061
|
-
<
|
|
1062
|
-
<div id="
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1261
|
+
<div class="rules-list" id="rulesList"></div>
|
|
1262
|
+
<div class="instructions-preview" id="rulesViewCode" role="region" tabindex="0" style="display:none;"></div>
|
|
1263
|
+
<div class="rules-note" id="rulesIdle" style="display:none;"></div>
|
|
1264
|
+
<div class="rules-manual-label">Manual setup</div>
|
|
1265
|
+
<div class="mcp-other-section" id="rulesCursorSection">
|
|
1266
|
+
<div class="mcp-other-header" id="rulesCursorHeader">
|
|
1267
|
+
<span>Cursor (its rules are pasted by hand)</span>
|
|
1268
|
+
<svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
|
|
1269
|
+
</div>
|
|
1270
|
+
<div class="mcp-other-body" id="rulesCursorBody" style="display:none;">
|
|
1271
|
+
<div id="rulesCursorHelp" style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Cursor keeps its User Rules inside the app, so SynaBun cannot install them. Copy the rules and paste them into Cursor Settings → Rules.</div>
|
|
1272
|
+
<div class="code-copy-wrap" id="rulesCursorWrap">
|
|
1273
|
+
<div class="instructions-preview" id="rulesCursorCode"></div>
|
|
1274
|
+
<span class="code-copy-label">copy</span>
|
|
1275
|
+
</div>
|
|
1276
|
+
</div>
|
|
1277
|
+
</div>
|
|
1278
|
+
<div class="mcp-other-section rules-extra" id="rulesCoexistSection">
|
|
1279
|
+
<div class="mcp-other-header" id="rulesCoexistHeader">
|
|
1280
|
+
<span>Using another memory tool too? (optional snippet)</span>
|
|
1281
|
+
<svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
|
|
1282
|
+
</div>
|
|
1283
|
+
<div class="mcp-other-body" id="rulesCoexistBody" style="display:none;">
|
|
1284
|
+
<div id="rulesCoexistHelp" style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Copy this, name the other tool in it, and paste it into your instructions file. SynaBun never installs it.</div>
|
|
1285
|
+
<div class="code-copy-wrap" id="rulesCoexistWrap">
|
|
1286
|
+
<div class="instructions-preview" id="rulesCoexistCode"></div>
|
|
1287
|
+
<span class="code-copy-label">copy</span>
|
|
1288
|
+
</div>
|
|
1066
1289
|
</div>
|
|
1067
1290
|
</div>
|
|
1068
1291
|
</div>
|
|
@@ -1073,7 +1296,7 @@
|
|
|
1073
1296
|
<h2 style="text-align:center;margin-bottom:12px;">Setup Complete!</h2>
|
|
1074
1297
|
<ul class="checklist" id="checklist"></ul>
|
|
1075
1298
|
<div id="restartNotice" style="margin:16px 0 0;padding:12px 14px;background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.10);border-radius:var(--r-card);font-size:12px;color:var(--t-primary);line-height:1.5;">
|
|
1076
|
-
<span style="color:var(--t-bright);font-weight:600;">Restart required</span> — Relaunch <span id="restartToolName" style="color:var(--t-bright);font-weight:500;"></span> for the MCP changes to be picked up.
|
|
1299
|
+
<span style="color:var(--t-bright);font-weight:600;">Restart required</span> — Relaunch <span id="restartToolName" style="color:var(--t-bright);font-weight:500;"></span> for the MCP changes and SynaBun's rules to be picked up.
|
|
1077
1300
|
</div>
|
|
1078
1301
|
<div style="text-align:center;margin-top:16px;">
|
|
1079
1302
|
<button class="action-btn" id="launchBtn" style="font-size:15px;padding:12px 32px;">Launch Neural Interface</button>
|
|
@@ -1183,30 +1406,45 @@
|
|
|
1183
1406
|
|
|
1184
1407
|
<script type="module">
|
|
1185
1408
|
|
|
1409
|
+
// The rules step is the installer of Settings → AI connections: the same client calls and the same reading
|
|
1410
|
+
// of the status (see STEP 6). Both modules are import-free, so the wizard still loads nothing of the app.
|
|
1411
|
+
import { fetchRulesStatus, fetchRulesTextWithFallback, installRules, installAllRules } from './shared/api.js';
|
|
1412
|
+
import {
|
|
1413
|
+
describeRulesHost, describeRulesInstall, describeRulesInstallAll, describeRulesInPlace, rulesInstallPlan, catalogueTranslator,
|
|
1414
|
+
} from './shared/settings/settings-rules.js';
|
|
1415
|
+
|
|
1186
1416
|
// ═══════════════════════════════════════════
|
|
1187
1417
|
// STATE
|
|
1188
1418
|
// ═══════════════════════════════════════════
|
|
1189
1419
|
|
|
1190
1420
|
const TOTAL_STEPS = 8;
|
|
1191
1421
|
let currentStep = 0;
|
|
1422
|
+
// Step 6: a connected tool still has no rules. Leaving the step then is a skip, and the Next button says so.
|
|
1423
|
+
let rulesPending = false;
|
|
1192
1424
|
|
|
1193
1425
|
const wizardState = {
|
|
1194
1426
|
collectionName: 'claude_memory',
|
|
1195
1427
|
collectionDisplayName: 'Claude Memory',
|
|
1196
1428
|
dbLocationPath: null,
|
|
1197
1429
|
selectedTool: null,
|
|
1198
|
-
|
|
1430
|
+
enabledTools: [], // tool ids toggled on via Step 5 install toggles
|
|
1431
|
+
dataHome: '',
|
|
1432
|
+
packageRoot: '',
|
|
1433
|
+
mcpCommand: '',
|
|
1434
|
+
mcpArgs: [],
|
|
1199
1435
|
buildReady: false,
|
|
1200
1436
|
mcpWritten: false,
|
|
1201
1437
|
projects: [],
|
|
1202
1438
|
};
|
|
1203
1439
|
|
|
1440
|
+
// Tools with server-side MCP install/uninstall endpoints. Each row maps a
|
|
1441
|
+
// toggle to the POST/DELETE endpoint that writes the provider's config file.
|
|
1442
|
+
// `id` is also the host name of the rules API (/api/setup/rules/:host).
|
|
1204
1443
|
const TOOLS = [
|
|
1205
|
-
{ id: 'claude', name: 'Claude Code',
|
|
1206
|
-
{ id: '
|
|
1207
|
-
{ id: '
|
|
1208
|
-
{ id: '
|
|
1209
|
-
{ id: 'other', name: 'Other', instrFile: 'AGENTS.md' },
|
|
1444
|
+
{ id: 'claude', name: 'Claude Code', api: '/api/claude-code/mcp', configPath: '~/.claude.json' },
|
|
1445
|
+
{ id: 'gemini', name: 'Gemini CLI', api: '/api/setup/gemini/mcp', configPath: '~/.gemini/settings.json' },
|
|
1446
|
+
{ id: 'codex', name: 'Codex CLI', api: '/api/setup/codex/mcp', configPath: '~/.codex/config.toml' },
|
|
1447
|
+
{ id: 'opencode', name: 'OpenCode', api: '/api/opencode/mcp', configPath: '~/.config/opencode/config.json' },
|
|
1210
1448
|
];
|
|
1211
1449
|
|
|
1212
1450
|
// ═══════════════════════════════════════════
|
|
@@ -1286,10 +1524,11 @@ function goToStep(n) {
|
|
|
1286
1524
|
function updateNav() {
|
|
1287
1525
|
$prevBtn.disabled = currentStep === 0;
|
|
1288
1526
|
|
|
1289
|
-
const labels = ['', 'Next', 'Next', 'Next', 'Next', 'Next', 'Next', 'Finish'];
|
|
1290
|
-
|
|
1527
|
+
const labels = ['Begin', 'Next', 'Next', 'Next', 'Next', 'Next', 'Next', 'Finish'];
|
|
1528
|
+
const label = currentStep === 6 && rulesPending ? 'Skip' : (labels[currentStep] || 'Next');
|
|
1529
|
+
$nextBtn.textContent = label + ' \u2192';
|
|
1291
1530
|
|
|
1292
|
-
if (currentStep ===
|
|
1531
|
+
if (currentStep === TOTAL_STEPS - 1) {
|
|
1293
1532
|
$nextBtn.style.display = 'none';
|
|
1294
1533
|
} else {
|
|
1295
1534
|
$nextBtn.style.display = '';
|
|
@@ -1329,7 +1568,13 @@ function validateStep(n) {
|
|
|
1329
1568
|
return true;
|
|
1330
1569
|
}
|
|
1331
1570
|
case 5: {
|
|
1332
|
-
|
|
1571
|
+
// Allow advancing once any tool is toggled on OR the user copied the generic JSON.
|
|
1572
|
+
if (wizardState.enabledTools.length === 0 && !wizardState.mcpWritten) return false;
|
|
1573
|
+
// Default the restart hint (Step 7) to the first toggled-on tool; fall
|
|
1574
|
+
// back to Claude if only the generic JSON was copied.
|
|
1575
|
+
if (!wizardState.selectedTool) {
|
|
1576
|
+
wizardState.selectedTool = wizardState.enabledTools[0] || 'claude';
|
|
1577
|
+
}
|
|
1333
1578
|
return true;
|
|
1334
1579
|
}
|
|
1335
1580
|
default:
|
|
@@ -1357,6 +1602,7 @@ async function onStepEnter(n) {
|
|
|
1357
1602
|
}
|
|
1358
1603
|
}
|
|
1359
1604
|
if (n === 3) await onBuildStep();
|
|
1605
|
+
if (n === 5) await onToolIntegrationStep();
|
|
1360
1606
|
if (n === 6) await onRulesetStep();
|
|
1361
1607
|
if (n === 7) await onCompleteStep();
|
|
1362
1608
|
// Re-measure after async content loads — but only if user is still on this step
|
|
@@ -1626,13 +1872,13 @@ function renderHappyBun() {}
|
|
|
1626
1872
|
resizeViewport(0);
|
|
1627
1873
|
|
|
1628
1874
|
try {
|
|
1629
|
-
|
|
1630
|
-
|
|
1875
|
+
// Post the File itself so the browser streams it from disk instead of
|
|
1876
|
+
// holding a multi-GB backup in memory.
|
|
1631
1877
|
$statusText.textContent = 'Validating backup...';
|
|
1632
1878
|
const previewRes = await fetch('/api/system/restore/preview', {
|
|
1633
1879
|
method: 'POST',
|
|
1634
1880
|
headers: { 'Content-Type': 'application/zip' },
|
|
1635
|
-
body:
|
|
1881
|
+
body: file,
|
|
1636
1882
|
});
|
|
1637
1883
|
if (!previewRes.ok) {
|
|
1638
1884
|
let errMsg = 'Invalid backup file';
|
|
@@ -1643,7 +1889,7 @@ function renderHappyBun() {}
|
|
|
1643
1889
|
|
|
1644
1890
|
// Show confirmation
|
|
1645
1891
|
$statusEl.style.display = 'none';
|
|
1646
|
-
showRestoreConfirm(m,
|
|
1892
|
+
showRestoreConfirm(m, file);
|
|
1647
1893
|
|
|
1648
1894
|
} catch (err) {
|
|
1649
1895
|
$statusDot.className = 'wiz-status-dot red';
|
|
@@ -1652,7 +1898,7 @@ function renderHappyBun() {}
|
|
|
1652
1898
|
}
|
|
1653
1899
|
}
|
|
1654
1900
|
|
|
1655
|
-
function showRestoreConfirm(m,
|
|
1901
|
+
function showRestoreConfirm(m, file) {
|
|
1656
1902
|
const fileCount = (m.files || []).length;
|
|
1657
1903
|
const hasDb = !!(m.database);
|
|
1658
1904
|
|
|
@@ -1706,7 +1952,7 @@ function renderHappyBun() {}
|
|
|
1706
1952
|
const restoreRes = await fetch('/api/system/restore', {
|
|
1707
1953
|
method: 'POST',
|
|
1708
1954
|
headers: { 'Content-Type': 'application/zip' },
|
|
1709
|
-
body:
|
|
1955
|
+
body: file,
|
|
1710
1956
|
});
|
|
1711
1957
|
if (!restoreRes.ok) {
|
|
1712
1958
|
let errMsg = 'Restore failed';
|
|
@@ -1801,31 +2047,71 @@ function renderHappyBun() {}
|
|
|
1801
2047
|
|
|
1802
2048
|
async function onDepsStep() {
|
|
1803
2049
|
const $list = document.getElementById('depList');
|
|
1804
|
-
|
|
2050
|
+
|
|
2051
|
+
function createDepItem(name) {
|
|
2052
|
+
const li = document.createElement('li');
|
|
2053
|
+
li.className = 'dep-item checking visible';
|
|
2054
|
+
|
|
2055
|
+
const icon = document.createElement('div');
|
|
2056
|
+
icon.className = 'dep-icon';
|
|
2057
|
+
|
|
2058
|
+
const info = document.createElement('div');
|
|
2059
|
+
info.className = 'dep-info';
|
|
2060
|
+
|
|
2061
|
+
const title = document.createElement('div');
|
|
2062
|
+
title.className = 'dep-name';
|
|
2063
|
+
title.textContent = name;
|
|
2064
|
+
|
|
2065
|
+
const detail = document.createElement('div');
|
|
2066
|
+
detail.className = 'dep-detail';
|
|
2067
|
+
detail.textContent = 'Checking\u2026';
|
|
2068
|
+
|
|
2069
|
+
info.append(title, detail);
|
|
2070
|
+
li.append(icon, info);
|
|
2071
|
+
return li;
|
|
2072
|
+
}
|
|
2073
|
+
|
|
2074
|
+
function showCheckError(message) {
|
|
2075
|
+
const li = createDepItem('Environment check unavailable');
|
|
2076
|
+
li.classList.remove('checking');
|
|
2077
|
+
li.classList.add('fail');
|
|
2078
|
+
li.querySelector('.dep-icon').textContent = '!';
|
|
2079
|
+
li.querySelector('.dep-detail').textContent = message;
|
|
2080
|
+
$list.replaceChildren(li);
|
|
2081
|
+
resizeViewport(1);
|
|
2082
|
+
}
|
|
2083
|
+
|
|
2084
|
+
// Never leave this step blank while the server is still warming up.
|
|
2085
|
+
$list.replaceChildren(createDepItem('Node.js'), createDepItem('npm'));
|
|
2086
|
+
resizeViewport(1);
|
|
1805
2087
|
|
|
1806
2088
|
let deps;
|
|
2089
|
+
const controller = new AbortController();
|
|
2090
|
+
const timeout = setTimeout(() => controller.abort(), 8000);
|
|
1807
2091
|
try {
|
|
1808
|
-
const res = await fetch('/api/setup/check-deps');
|
|
2092
|
+
const res = await fetch('/api/setup/check-deps', { signal: controller.signal });
|
|
2093
|
+
if (!res.ok) throw new Error(`Server returned ${res.status}`);
|
|
1809
2094
|
const data = await res.json();
|
|
2095
|
+
if (!Array.isArray(data.deps) || data.deps.length === 0) {
|
|
2096
|
+
throw new Error('Server returned no dependency results');
|
|
2097
|
+
}
|
|
1810
2098
|
deps = data.deps;
|
|
1811
|
-
} catch {
|
|
1812
|
-
|
|
2099
|
+
} catch (err) {
|
|
2100
|
+
showCheckError(err.name === 'AbortError'
|
|
2101
|
+
? 'The server took too long to respond. Go back and try again.'
|
|
2102
|
+
: 'Could not complete the check. Make sure the SynaBun server is running.');
|
|
1813
2103
|
return;
|
|
2104
|
+
} finally {
|
|
2105
|
+
clearTimeout(timeout);
|
|
1814
2106
|
}
|
|
1815
2107
|
|
|
1816
|
-
//
|
|
2108
|
+
// Replace the placeholders with the actual results. Keep them visible so a
|
|
2109
|
+
// slow response can never produce another empty panel.
|
|
1817
2110
|
const items = deps.map(dep => {
|
|
1818
|
-
const li =
|
|
1819
|
-
li.className = 'dep-item checking';
|
|
1820
|
-
li.innerHTML = `
|
|
1821
|
-
<div class="dep-icon"></div>
|
|
1822
|
-
<div class="dep-info">
|
|
1823
|
-
<div class="dep-name">${dep.name}</div>
|
|
1824
|
-
<div class="dep-detail">Checking\u2026</div>
|
|
1825
|
-
</div>`;
|
|
1826
|
-
$list.appendChild(li);
|
|
2111
|
+
const li = createDepItem(dep.name || 'Dependency');
|
|
1827
2112
|
return { li, dep };
|
|
1828
2113
|
});
|
|
2114
|
+
$list.replaceChildren(...items.map(({ li }) => li));
|
|
1829
2115
|
|
|
1830
2116
|
// Pre-size viewport to account for all items before animation
|
|
1831
2117
|
resizeViewport(1);
|
|
@@ -1834,12 +2120,8 @@ async function onDepsStep() {
|
|
|
1834
2120
|
for (let i = 0; i < items.length; i++) {
|
|
1835
2121
|
const { li, dep } = items[i];
|
|
1836
2122
|
|
|
1837
|
-
// Reveal with stagger
|
|
1838
|
-
await wait(250);
|
|
1839
|
-
li.classList.add('visible');
|
|
1840
|
-
|
|
1841
2123
|
// Simulate a brief check delay, then resolve
|
|
1842
|
-
await wait(
|
|
2124
|
+
await wait(180 + Math.random() * 100);
|
|
1843
2125
|
|
|
1844
2126
|
li.classList.remove('checking');
|
|
1845
2127
|
const icon = li.querySelector('.dep-icon');
|
|
@@ -2046,15 +2328,58 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
|
|
|
2046
2328
|
wizardState.projects.forEach((p, i) => {
|
|
2047
2329
|
const card = document.createElement('div');
|
|
2048
2330
|
card.className = 'onboard-project-card';
|
|
2049
|
-
card.style.cssText = 'display:flex;
|
|
2331
|
+
card.style.cssText = 'display:flex;flex-direction:column;gap:8px;padding:10px 12px;background:rgba(109,213,140,0.06);border:1px solid rgba(109,213,140,0.2);border-radius:8px;font-size:12px';
|
|
2332
|
+
const safePath = p.path.replace(/\\/g, '/');
|
|
2050
2333
|
card.innerHTML = `
|
|
2051
|
-
<
|
|
2052
|
-
|
|
2053
|
-
<div style="
|
|
2054
|
-
|
|
2334
|
+
<div style="display:flex;align-items:center;gap:10px">
|
|
2335
|
+
<svg viewBox="0 0 24 24" style="width:18px;height:18px;fill:none;stroke:rgba(109,213,140,0.8);stroke-width:2;flex-shrink:0"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
|
|
2336
|
+
<div style="flex:1;min-width:0">
|
|
2337
|
+
<div style="color:var(--t-bright);font-weight:500">${p.label}</div>
|
|
2338
|
+
<div style="color:var(--t-muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${safePath}">${safePath}</div>
|
|
2339
|
+
</div>
|
|
2340
|
+
<button class="onboard-project-remove" style="background:none;border:none;color:var(--t-muted);cursor:pointer;font-size:16px;padding:2px 6px;line-height:1;opacity:0.5" title="Remove">×</button>
|
|
2055
2341
|
</div>
|
|
2056
|
-
<button class="onboard-project-remove" style="background:none;border:none;color:var(--t-muted);cursor:pointer;font-size:16px;padding:2px 6px;line-height:1;opacity:0.5" title="Remove">×</button>
|
|
2057
2342
|
`;
|
|
2343
|
+
if (p.dubiousOwnership && !p.trusted) {
|
|
2344
|
+
const trustRow = document.createElement('div');
|
|
2345
|
+
trustRow.className = 'onboard-trust-row';
|
|
2346
|
+
trustRow.style.cssText = 'display:flex;align-items:center;gap:8px;padding:6px 8px;background:rgba(255,183,77,0.08);border:1px solid rgba(255,183,77,0.25);border-radius:6px;font-size:11px;color:rgba(255,204,128,0.9)';
|
|
2347
|
+
trustRow.innerHTML = `
|
|
2348
|
+
<span>⚠ Git ownership mismatch — workspace needs to be trusted</span>
|
|
2349
|
+
<button class="onboard-trust-btn" style="margin-left:auto;background:rgba(255,183,77,0.2);border:1px solid rgba(255,183,77,0.35);color:#ffe0b2;padding:4px 10px;border-radius:5px;font-size:11px;cursor:pointer">Trust workspace</button>
|
|
2350
|
+
`;
|
|
2351
|
+
const $btn = trustRow.querySelector('.onboard-trust-btn');
|
|
2352
|
+
$btn.addEventListener('click', async () => {
|
|
2353
|
+
$btn.disabled = true;
|
|
2354
|
+
$btn.textContent = 'Trusting...';
|
|
2355
|
+
try {
|
|
2356
|
+
const r = await fetch('/api/terminal/trust-workspace', {
|
|
2357
|
+
method: 'POST',
|
|
2358
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2359
|
+
body: JSON.stringify({ path: p.trustPath || safePath }),
|
|
2360
|
+
});
|
|
2361
|
+
const d = await r.json();
|
|
2362
|
+
if (d.ok) {
|
|
2363
|
+
p.trusted = true;
|
|
2364
|
+
renderProjectList();
|
|
2365
|
+
} else {
|
|
2366
|
+
$btn.disabled = false;
|
|
2367
|
+
$btn.textContent = 'Trust workspace';
|
|
2368
|
+
$error.textContent = d.error || 'Trust failed';
|
|
2369
|
+
}
|
|
2370
|
+
} catch {
|
|
2371
|
+
$btn.disabled = false;
|
|
2372
|
+
$btn.textContent = 'Trust workspace';
|
|
2373
|
+
$error.textContent = 'Trust failed';
|
|
2374
|
+
}
|
|
2375
|
+
});
|
|
2376
|
+
card.appendChild(trustRow);
|
|
2377
|
+
} else if (p.trusted) {
|
|
2378
|
+
const okRow = document.createElement('div');
|
|
2379
|
+
okRow.style.cssText = 'font-size:11px;color:rgba(109,213,140,0.8)';
|
|
2380
|
+
okRow.textContent = '✓ Workspace trusted';
|
|
2381
|
+
card.appendChild(okRow);
|
|
2382
|
+
}
|
|
2058
2383
|
card.querySelector('.onboard-project-remove').addEventListener('click', () => {
|
|
2059
2384
|
wizardState.projects.splice(i, 1);
|
|
2060
2385
|
renderProjectList();
|
|
@@ -2104,15 +2429,16 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
|
|
|
2104
2429
|
|
|
2105
2430
|
// Register via API
|
|
2106
2431
|
$addBtn.innerHTML = '<div class="spinner" style="width:14px;height:14px"></div> Registering...';
|
|
2432
|
+
let integData = null;
|
|
2107
2433
|
try {
|
|
2108
2434
|
const res = await fetch('/api/claude-code/integrations', {
|
|
2109
2435
|
method: 'POST',
|
|
2110
2436
|
headers: { 'Content-Type': 'application/json' },
|
|
2111
2437
|
body: JSON.stringify({ target: 'project', projectPath: folderPath, label }),
|
|
2112
2438
|
});
|
|
2113
|
-
|
|
2114
|
-
if (!
|
|
2115
|
-
$error.textContent =
|
|
2439
|
+
integData = await res.json();
|
|
2440
|
+
if (!integData.ok) {
|
|
2441
|
+
$error.textContent = integData.error || 'Failed to register project.';
|
|
2116
2442
|
$addBtn.disabled = false;
|
|
2117
2443
|
$addBtn.innerHTML = origHTML;
|
|
2118
2444
|
return;
|
|
@@ -2124,7 +2450,12 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
|
|
|
2124
2450
|
return;
|
|
2125
2451
|
}
|
|
2126
2452
|
|
|
2127
|
-
|
|
2453
|
+
const projectEntry = { path: folderPath, label };
|
|
2454
|
+
if (integData && integData.dubiousOwnership && integData.trustPath) {
|
|
2455
|
+
projectEntry.dubiousOwnership = true;
|
|
2456
|
+
projectEntry.trustPath = integData.trustPath;
|
|
2457
|
+
}
|
|
2458
|
+
wizardState.projects.push(projectEntry);
|
|
2128
2459
|
$addBtn.disabled = false;
|
|
2129
2460
|
$addBtn.innerHTML = origHTML;
|
|
2130
2461
|
renderProjectList();
|
|
@@ -2132,71 +2463,149 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
|
|
|
2132
2463
|
}
|
|
2133
2464
|
|
|
2134
2465
|
// ═══════════════════════════════════════════
|
|
2135
|
-
// STEP 5: Tool
|
|
2466
|
+
// STEP 5: Tool Integration (install toggles + generic JSON fallback)
|
|
2136
2467
|
// ═══════════════════════════════════════════
|
|
2137
2468
|
|
|
2138
|
-
const $
|
|
2469
|
+
const $toggleList = document.getElementById('mcpToggleList');
|
|
2470
|
+
|
|
2471
|
+
// Render one toggle row per installable tool. Statuses populate on enter.
|
|
2139
2472
|
TOOLS.forEach(t => {
|
|
2140
|
-
const
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2145
|
-
|
|
2473
|
+
const row = document.createElement('div');
|
|
2474
|
+
row.className = 'mcp-toggle-row';
|
|
2475
|
+
row.dataset.id = t.id;
|
|
2476
|
+
row.innerHTML = `
|
|
2477
|
+
<div class="mtr-body">
|
|
2478
|
+
<div class="mtr-name">${t.name}</div>
|
|
2479
|
+
<div class="mtr-path" data-role="path">${t.configPath}</div>
|
|
2480
|
+
<div class="mtr-path" data-role="rules" style="display:none"></div>
|
|
2481
|
+
</div>
|
|
2482
|
+
<button class="mtr-toggle" data-role="toggle" aria-label="Toggle ${t.name}"></button>
|
|
2483
|
+
`;
|
|
2484
|
+
row.querySelector('[data-role="toggle"]').addEventListener('click', () => toggleTool(t.id));
|
|
2485
|
+
$toggleList.appendChild(row);
|
|
2146
2486
|
});
|
|
2147
2487
|
|
|
2148
|
-
function
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
const json = JSON.stringify({ mcpServers: { SynaBun: { command: 'node', args: [mcpPath], env: { DOTENV_PATH: envPath } } } }, null, 2);
|
|
2162
|
-
return {
|
|
2163
|
-
label: 'Add to Cursor Settings > MCP Servers, or paste into .cursor/mcp.json:',
|
|
2164
|
-
code: json,
|
|
2165
|
-
hint: 'Settings > MCP > Add Server, or save as .cursor/mcp.json',
|
|
2166
|
-
};
|
|
2167
|
-
}
|
|
2168
|
-
if (id === 'windsurf') {
|
|
2169
|
-
const json = JSON.stringify({ mcpServers: { SynaBun: { command: 'node', args: [mcpPath], env: { DOTENV_PATH: envPath } } } }, null, 2);
|
|
2170
|
-
return {
|
|
2171
|
-
label: 'Add to ~/.codeium/windsurf/mcp_config.json:',
|
|
2172
|
-
code: json,
|
|
2173
|
-
hint: 'Cascade sidebar > hammer icon > Configure',
|
|
2174
|
-
};
|
|
2175
|
-
}
|
|
2176
|
-
// codex, other
|
|
2177
|
-
const json = JSON.stringify({ mcpServers: { SynaBun: { command: 'node', args: [mcpPath], env: { DOTENV_PATH: envPath } } } }, null, 2);
|
|
2178
|
-
return {
|
|
2179
|
-
label: 'Add to your project\'s .mcp.json:',
|
|
2180
|
-
code: json,
|
|
2181
|
-
hint: 'Save as .mcp.json in your project root.',
|
|
2182
|
-
};
|
|
2488
|
+
async function onToolIntegrationStep() {
|
|
2489
|
+
// Fetch each provider's install state so toggles reflect reality.
|
|
2490
|
+
await Promise.all(TOOLS.map(async (t) => {
|
|
2491
|
+
try {
|
|
2492
|
+
const res = await fetch(t.api);
|
|
2493
|
+
const data = await res.json();
|
|
2494
|
+
const connected = !!data.connected;
|
|
2495
|
+
updateToggleRow(t.id, { connected });
|
|
2496
|
+
if (connected && !wizardState.enabledTools.includes(t.id)) {
|
|
2497
|
+
wizardState.enabledTools.push(t.id);
|
|
2498
|
+
}
|
|
2499
|
+
} catch { updateToggleRow(t.id, { connected: false }); }
|
|
2500
|
+
}));
|
|
2183
2501
|
}
|
|
2184
2502
|
|
|
2185
|
-
function
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
|
|
2503
|
+
function updateToggleRow(id, { connected, busy }) {
|
|
2504
|
+
const row = $toggleList.querySelector(`[data-id="${id}"]`);
|
|
2505
|
+
if (!row) return;
|
|
2506
|
+
const toggle = row.querySelector('[data-role="toggle"]');
|
|
2507
|
+
const path = row.querySelector('[data-role="path"]');
|
|
2508
|
+
const tool = TOOLS.find(t => t.id === id);
|
|
2509
|
+
if (typeof connected === 'boolean') {
|
|
2510
|
+
row.classList.toggle('connected', connected);
|
|
2511
|
+
toggle.classList.toggle('on', connected);
|
|
2512
|
+
path.textContent = connected ? `Registered in ${tool.configPath}` : tool.configPath;
|
|
2513
|
+
}
|
|
2514
|
+
if (typeof busy === 'boolean') {
|
|
2515
|
+
toggle.classList.toggle('busy', busy);
|
|
2516
|
+
toggle.disabled = busy;
|
|
2517
|
+
}
|
|
2518
|
+
}
|
|
2196
2519
|
|
|
2520
|
+
// What the MCP toggle's response says about the tool's rules (its `rules`
|
|
2521
|
+
// object), as one line under the row: where they went, or why they did not.
|
|
2522
|
+
function showToggleRules(id, rules, { connected, wanted }) {
|
|
2523
|
+
const row = $toggleList.querySelector(`[data-id="${id}"]`);
|
|
2524
|
+
const line = row?.querySelector('[data-role="rules"]');
|
|
2525
|
+
if (!line) return;
|
|
2526
|
+
let text = '';
|
|
2527
|
+
if (connected) {
|
|
2528
|
+
if (!rules) text = wanted ? `Rules not installed yet. ${RESTART_HINT}` : '';
|
|
2529
|
+
else if (rules.skipped) text = 'Rules not installed (you can install them in the next step)';
|
|
2530
|
+
else if (rules.ok === false) text = `Rules not installed: ${rules.error || rules.state || 'refused'}`;
|
|
2531
|
+
else if (rules.path) text = `Rules installed: ${rules.path}`;
|
|
2532
|
+
} else if (rules && rules.ok !== false && rules.kept && rules.kept.length) {
|
|
2533
|
+
// Disconnected. A copy the user edited is theirs: SynaBun left it where it is (and for OpenCode, so is a copy
|
|
2534
|
+
// their own line in config.json points at).
|
|
2535
|
+
text = `Your ${rules.kept[0].reason === 'listed-in-config' ? '' : 'edited '}rules were left in place: ${rules.kept[0].path}`;
|
|
2536
|
+
} else if (rules && rules.ok === false && rules.error) {
|
|
2537
|
+
// Disconnected, but rules could not be taken out (damaged markers, a symlink): say which and why.
|
|
2538
|
+
text = `Rules not removed: ${rules.error}`;
|
|
2539
|
+
}
|
|
2540
|
+
line.textContent = text;
|
|
2541
|
+
line.title = text;
|
|
2542
|
+
line.style.display = text ? '' : 'none';
|
|
2197
2543
|
requestAnimationFrame(() => resizeViewport(currentStep));
|
|
2198
2544
|
}
|
|
2199
2545
|
|
|
2546
|
+
async function toggleTool(id) {
|
|
2547
|
+
const tool = TOOLS.find(t => t.id === id);
|
|
2548
|
+
if (!tool) return;
|
|
2549
|
+
const row = $toggleList.querySelector(`[data-id="${id}"]`);
|
|
2550
|
+
const toggle = row.querySelector('[data-role="toggle"]');
|
|
2551
|
+
const wasOn = toggle.classList.contains('on');
|
|
2552
|
+
// Connecting a tool installs its rules too, unless the box is unchecked.
|
|
2553
|
+
const wantRules = document.getElementById('rulesInstallOpt')?.checked !== false;
|
|
2554
|
+
updateToggleRow(id, { busy: true });
|
|
2555
|
+
try {
|
|
2556
|
+
const res = await fetch(tool.api, wasOn ? { method: 'DELETE' } : {
|
|
2557
|
+
method: 'POST',
|
|
2558
|
+
headers: { 'Content-Type': 'application/json' },
|
|
2559
|
+
body: JSON.stringify(wantRules ? {} : { rules: false }),
|
|
2560
|
+
});
|
|
2561
|
+
const data = await res.json().catch(() => ({}));
|
|
2562
|
+
if (!res.ok || data.ok === false) {
|
|
2563
|
+
showMascotToast(data.error || `${tool.name} ${wasOn ? 'uninstall' : 'install'} failed`);
|
|
2564
|
+
updateToggleRow(id, { busy: false });
|
|
2565
|
+
return;
|
|
2566
|
+
}
|
|
2567
|
+
const nowOn = !wasOn;
|
|
2568
|
+
updateToggleRow(id, { connected: nowOn, busy: false });
|
|
2569
|
+
showToggleRules(id, data.rules, { connected: nowOn, wanted: wantRules });
|
|
2570
|
+
if (nowOn) {
|
|
2571
|
+
if (!wizardState.enabledTools.includes(id)) wizardState.enabledTools.push(id);
|
|
2572
|
+
wizardState.mcpWritten = true;
|
|
2573
|
+
showMascotToast(`${tool.name} connected`);
|
|
2574
|
+
} else {
|
|
2575
|
+
wizardState.enabledTools = wizardState.enabledTools.filter(x => x !== id);
|
|
2576
|
+
showMascotToast(`${tool.name} disconnected`);
|
|
2577
|
+
}
|
|
2578
|
+
} catch (err) {
|
|
2579
|
+
showMascotToast(`Failed: ${err.message}`);
|
|
2580
|
+
updateToggleRow(id, { busy: false });
|
|
2581
|
+
}
|
|
2582
|
+
}
|
|
2583
|
+
|
|
2584
|
+
// Generic MCP JSON for tools without a server integration (Cursor, Windsurf, other).
|
|
2585
|
+
function getGenericMcpJson() {
|
|
2586
|
+
const dataHome = (wizardState.dataHome || '').replace(/\\/g, '/');
|
|
2587
|
+
const pkgRoot = (wizardState.packageRoot || dataHome).replace(/\\/g, '/');
|
|
2588
|
+
const mcpPath = pkgRoot + '/mcp-server/run.mjs';
|
|
2589
|
+
const envPath = dataHome + '/.env';
|
|
2590
|
+
const env = { DOTENV_PATH: envPath, SYNABUN_DATA_HOME: dataHome, MEMORY_DATA_DIR: dataHome + '/mcp-data' };
|
|
2591
|
+
// A packaged application is started through its own executable; the server says which.
|
|
2592
|
+
const packaged = wizardState.mcpCommand && wizardState.mcpCommand !== 'node';
|
|
2593
|
+
const command = packaged ? wizardState.mcpCommand : 'node';
|
|
2594
|
+
const args = packaged ? wizardState.mcpArgs : [mcpPath];
|
|
2595
|
+
return JSON.stringify({ mcpServers: { SynaBun: { command, args, env } } }, null, 2);
|
|
2596
|
+
}
|
|
2597
|
+
|
|
2598
|
+
// "Other providers" collapsible — shows the generic MCP JSON for paste-based setups.
|
|
2599
|
+
const $otherHeader = document.getElementById('mcpOtherHeader');
|
|
2600
|
+
const $otherBody = document.getElementById('mcpOtherBody');
|
|
2601
|
+
const $otherSection = document.getElementById('mcpOtherSection');
|
|
2602
|
+
$otherHeader.addEventListener('click', () => {
|
|
2603
|
+
const isOpen = $otherSection.classList.toggle('open');
|
|
2604
|
+
$otherBody.style.display = isOpen ? '' : 'none';
|
|
2605
|
+
if (isOpen) document.getElementById('mcpSetupCode').textContent = getGenericMcpJson();
|
|
2606
|
+
requestAnimationFrame(() => resizeViewport(currentStep));
|
|
2607
|
+
});
|
|
2608
|
+
|
|
2200
2609
|
function showMascotToast(msg, duration = 2000) {
|
|
2201
2610
|
const toast = document.getElementById('mascotToast');
|
|
2202
2611
|
if (!toast) return;
|
|
@@ -2207,6 +2616,7 @@ function showMascotToast(msg, duration = 2000) {
|
|
|
2207
2616
|
|
|
2208
2617
|
document.getElementById('mcpCodeWrap').addEventListener('click', () => {
|
|
2209
2618
|
const code = document.getElementById('mcpSetupCode').textContent;
|
|
2619
|
+
if (!code) return;
|
|
2210
2620
|
navigator.clipboard.writeText(code);
|
|
2211
2621
|
wizardState.mcpWritten = true;
|
|
2212
2622
|
const label = document.querySelector('#mcpCodeWrap .code-copy-label');
|
|
@@ -2217,47 +2627,255 @@ document.getElementById('mcpCodeWrap').addEventListener('click', () => {
|
|
|
2217
2627
|
});
|
|
2218
2628
|
|
|
2219
2629
|
// ═══════════════════════════════════════════
|
|
2220
|
-
// STEP 6:
|
|
2630
|
+
// STEP 6: Install SynaBun rules
|
|
2221
2631
|
// ═══════════════════════════════════════════
|
|
2632
|
+
// The installer, as Settings → AI connections → SynaBun rules shows it: one
|
|
2633
|
+
// button that installs the rules for every connected tool, then one row per
|
|
2634
|
+
// tool with where its rules live, what state they are in (GET /api/setup/rules)
|
|
2635
|
+
// and the action that state calls for, and under them what the installer
|
|
2636
|
+
// answered. The calls are the shared client's (shared/api.js). What a state is
|
|
2637
|
+
// called, which action it gets and every sentence about it come from
|
|
2638
|
+
// shared/settings/settings-rules.js and the Settings strings (i18n/en.json), so
|
|
2639
|
+
// the two surfaces cannot drift apart. Nothing is pasted in this step: the two
|
|
2640
|
+
// boxes under "Manual setup" hold what SynaBun cannot install (Cursor's User
|
|
2641
|
+
// Rules, the coexistence snippet). Nothing here has to be clicked to continue.
|
|
2642
|
+
|
|
2643
|
+
const RESTART_HINT = 'Restart SynaBun to finish this update.';
|
|
2644
|
+
const RULES_SETTINGS_PATH = 'Settings → AI connections → SynaBun rules';
|
|
2645
|
+
let rulesStatus = null; // null: the route is missing or failed
|
|
2646
|
+
let rulesTx = null; // the Settings strings; null until they are loaded
|
|
2647
|
+
let rulesReport = null; // what the last install answered: { message, note, ok }
|
|
2648
|
+
let rulesBusy = false; // an install is on its way: every button of the step waits
|
|
2649
|
+
let rulesViewHost = ''; // the tool whose rules text is open under the list
|
|
2650
|
+
const rulesTextCache = {};
|
|
2651
|
+
|
|
2652
|
+
// The wizard's names for the tools (the ones Step 5 shows), for every sentence that names one.
|
|
2653
|
+
const RULES_TOOL_NAMES = Object.fromEntries(TOOLS.map(t => [t.id, t.name]));
|
|
2654
|
+
const ruleToolNames = (hosts) => hosts.map(host => RULES_TOOL_NAMES[host] || host).join(', ');
|
|
2655
|
+
|
|
2656
|
+
// The words of this step are the Settings ones. One request; a failed one is tried again on the next visit.
|
|
2657
|
+
async function loadRulesStrings() {
|
|
2658
|
+
if (rulesTx) return rulesTx;
|
|
2659
|
+
try {
|
|
2660
|
+
const res = await fetch('/i18n/en.json');
|
|
2661
|
+
if (res.ok) rulesTx = catalogueTranslator(await res.json());
|
|
2662
|
+
} catch { /* the step says so and offers to try again */ }
|
|
2663
|
+
return rulesTx;
|
|
2664
|
+
}
|
|
2222
2665
|
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2666
|
+
// The rendered text for a host, from the rules route or the older read-only endpoint.
|
|
2667
|
+
async function loadRulesText(host) {
|
|
2668
|
+
if (!rulesTextCache[host]) rulesTextCache[host] = await fetchRulesTextWithFallback(host);
|
|
2669
|
+
return rulesTextCache[host];
|
|
2670
|
+
}
|
|
2226
2671
|
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2672
|
+
function enabledRuleTools() {
|
|
2673
|
+
return wizardState.enabledTools.map(id => TOOLS.find(t => t.id === id)).filter(Boolean);
|
|
2674
|
+
}
|
|
2230
2675
|
|
|
2231
|
-
|
|
2232
|
-
|
|
2676
|
+
function renderRulesStep() {
|
|
2677
|
+
const el = (id) => document.getElementById(id);
|
|
2678
|
+
const tx = rulesTx;
|
|
2679
|
+
const plan = rulesInstallPlan(rulesStatus);
|
|
2680
|
+
const ready = !!tx && !!rulesStatus;
|
|
2681
|
+
|
|
2682
|
+
// What stands in the way, if anything: the step's own text, the installer, or no connected tool.
|
|
2683
|
+
const note = !tx ? 'This step could not load its text. Check that SynaBun is running, then try again.'
|
|
2684
|
+
: !rulesStatus ? `The rules installer did not answer. ${RESTART_HINT} The rules can also be installed later in ${RULES_SETTINGS_PATH}.`
|
|
2685
|
+
: !plan.connected.length ? 'No tool is connected yet. Connect one in the previous step and its rules are installed with it.'
|
|
2686
|
+
: '';
|
|
2687
|
+
const $note = el('rulesNote');
|
|
2688
|
+
$note.textContent = note;
|
|
2689
|
+
if (note && !ready) {
|
|
2690
|
+
const retry = document.createElement('button');
|
|
2691
|
+
retry.type = 'button';
|
|
2692
|
+
retry.textContent = 'Try again';
|
|
2693
|
+
retry.disabled = rulesBusy;
|
|
2694
|
+
retry.addEventListener('click', () => onRulesetStep());
|
|
2695
|
+
$note.appendChild(retry);
|
|
2696
|
+
}
|
|
2697
|
+
$note.style.display = note ? '' : 'none';
|
|
2698
|
+
|
|
2699
|
+
// The primary action, while a connected tool still has rules to install or update.
|
|
2700
|
+
rulesPending = ready && plan.pending.length > 0;
|
|
2701
|
+
el('rulesInstallAll').style.display = rulesPending ? '' : 'none';
|
|
2702
|
+
if (tx) {
|
|
2703
|
+
el('rulesInstallAllHelp').textContent = tx('settings.redesign.control.set002.help');
|
|
2704
|
+
el('rulesInstallAllBtn').textContent = tx('settings.redesign.control.set002.label');
|
|
2705
|
+
el('rulesCursorHelp').textContent = tx('settings.redesign.setup.cursorHelp');
|
|
2706
|
+
el('rulesCoexistHelp').textContent = tx('settings.redesign.setup.coexistHelp');
|
|
2707
|
+
}
|
|
2708
|
+
el('rulesInstallAllBtn').disabled = rulesBusy;
|
|
2709
|
+
|
|
2710
|
+
// The result: what the last install answered, or, with nothing left to install, the rules that are in place
|
|
2711
|
+
// (the toggles of Step 5 installed them) and the file each tool reads.
|
|
2712
|
+
const report = rulesReport || (ready && !rulesPending ? describeRulesInPlace(rulesStatus, { tx, labels: RULES_TOOL_NAMES }) : null);
|
|
2713
|
+
const $result = el('rulesResult');
|
|
2714
|
+
$result.style.display = report ? '' : 'none';
|
|
2715
|
+
if (report) {
|
|
2716
|
+
$result.className = 'rules-result ' + (report.ok === false ? 'fail' : 'ok');
|
|
2717
|
+
el('rulesResultMessage').textContent = report.message;
|
|
2718
|
+
el('rulesResultWhere').textContent = report.note || '';
|
|
2719
|
+
el('rulesResultWhere').style.display = report.note ? '' : 'none';
|
|
2720
|
+
}
|
|
2721
|
+
|
|
2722
|
+
// One row per tool that has rules or is connected. Without a status only the tools connected in Step 5 are known.
|
|
2723
|
+
const $list = el('rulesList');
|
|
2724
|
+
$list.innerHTML = '';
|
|
2725
|
+
const idle = [];
|
|
2726
|
+
for (const tool of (tx ? (rulesStatus ? TOOLS : enabledRuleTools()) : [])) {
|
|
2727
|
+
const info = rulesStatus?.hosts?.[tool.id];
|
|
2728
|
+
const view = describeRulesHost(info, { label: tool.name, version: rulesStatus?.version, tx });
|
|
2729
|
+
// Rules are for a tool that talks to SynaBun. One that is not connected and has none is only named, under
|
|
2730
|
+
// the list: connecting it in Step 5 installs them.
|
|
2731
|
+
if (view.known && view.state === 'not-installed' && !plan.connected.includes(tool.id)) { idle.push(tool.name); continue; }
|
|
2732
|
+
const row = document.createElement('div');
|
|
2733
|
+
row.className = 'mcp-toggle-row' + (view.good ? ' connected' : '') + (view.note ? ' has-note' : '');
|
|
2734
|
+
row.dataset.host = tool.id;
|
|
2735
|
+
row.innerHTML = `
|
|
2736
|
+
<div class="mtr-body">
|
|
2737
|
+
<div class="mtr-name">${tool.name}<span class="mtr-state${view.good ? ' ok' : ''}" data-role="state"></span></div>
|
|
2738
|
+
<div class="mtr-path" data-role="path"></div>
|
|
2739
|
+
<div class="mtr-note" data-role="note" style="display:none"></div>
|
|
2740
|
+
</div>
|
|
2741
|
+
<div class="rules-actions">
|
|
2742
|
+
${view.action ? '<button type="button" class="primary" data-role="primary"></button>' : ''}
|
|
2743
|
+
${view.known ? '<button type="button" data-role="view"></button>' : ''}
|
|
2744
|
+
</div>
|
|
2745
|
+
`;
|
|
2746
|
+
row.querySelector('[data-role="state"]').textContent = view.badge;
|
|
2747
|
+
const $path = row.querySelector('[data-role="path"]');
|
|
2748
|
+
$path.textContent = view.pathText;
|
|
2749
|
+
$path.title = view.path;
|
|
2750
|
+
const $rowNote = row.querySelector('[data-role="note"]');
|
|
2751
|
+
$rowNote.textContent = view.note;
|
|
2752
|
+
$rowNote.style.display = view.note ? '' : 'none';
|
|
2753
|
+
const $primary = row.querySelector('[data-role="primary"]');
|
|
2754
|
+
if ($primary) {
|
|
2755
|
+
$primary.textContent = view.actionLabel;
|
|
2756
|
+
$primary.disabled = rulesBusy;
|
|
2757
|
+
$primary.addEventListener('click', () => installToolRules(tool));
|
|
2758
|
+
}
|
|
2759
|
+
const $view = row.querySelector('[data-role="view"]');
|
|
2760
|
+
if ($view) {
|
|
2761
|
+
$view.textContent = tx(rulesViewHost === tool.id ? 'settings.redesign.setup.hide' : 'settings.redesign.setup.view');
|
|
2762
|
+
$view.setAttribute('aria-expanded', String(rulesViewHost === tool.id));
|
|
2763
|
+
$view.setAttribute('aria-controls', 'rulesViewCode');
|
|
2764
|
+
$view.addEventListener('click', () => viewRules(tool));
|
|
2765
|
+
}
|
|
2766
|
+
$list.appendChild(row);
|
|
2767
|
+
}
|
|
2768
|
+
el('rulesViewCode').style.display = rulesViewHost && $list.querySelector(`[data-host="${rulesViewHost}"] [data-role="view"]`) ? '' : 'none';
|
|
2769
|
+
// The other tools, in one line. With no tool connected at all, the note at the top already says it.
|
|
2770
|
+
const $idle = el('rulesIdle');
|
|
2771
|
+
$idle.textContent = idle.length && plan.connected.length ? `${tx('settings.redesign.setup.notConnected')}: ${idle.join(', ')}. Connecting a tool in the previous step installs its rules.` : '';
|
|
2772
|
+
$idle.style.display = $idle.textContent ? '' : 'none';
|
|
2233
2773
|
|
|
2234
|
-
|
|
2774
|
+
updateNav();
|
|
2775
|
+
requestAnimationFrame(() => resizeViewport(currentStep));
|
|
2776
|
+
}
|
|
2777
|
+
|
|
2778
|
+
// Run one install, keep what it answered for the result line, then read the status again.
|
|
2779
|
+
async function runRulesInstall(work) {
|
|
2780
|
+
if (rulesBusy) return;
|
|
2781
|
+
rulesBusy = true;
|
|
2782
|
+
renderRulesStep();
|
|
2235
2783
|
try {
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2784
|
+
rulesReport = await work();
|
|
2785
|
+
} catch (err) {
|
|
2786
|
+
// The server's own sentence (an edited copy, damaged markers, another SynaBun at work). A route that is not
|
|
2787
|
+
// there is the server that was not restarted.
|
|
2788
|
+
const message = err?.message === 'HTTP 404' ? RESTART_HINT : (err?.message || rulesTx('settings.redesign.setup.rulesActionFailed'));
|
|
2789
|
+
rulesReport = { message, note: '', ok: false };
|
|
2790
|
+
}
|
|
2791
|
+
rulesStatus = await fetchRulesStatus();
|
|
2792
|
+
rulesBusy = false;
|
|
2793
|
+
renderRulesStep();
|
|
2794
|
+
}
|
|
2795
|
+
|
|
2796
|
+
// "Install for all": every connected tool, by the installer's own rule. Same call as the button in Settings.
|
|
2797
|
+
function installAllToolRules() {
|
|
2798
|
+
runRulesInstall(async () => {
|
|
2799
|
+
const report = describeRulesInstallAll(await installAllRules(), { tx: rulesTx, labels: RULES_TOOL_NAMES });
|
|
2800
|
+
return { message: report.message, note: report.note, ok: report.failed.length === 0 };
|
|
2801
|
+
});
|
|
2802
|
+
}
|
|
2803
|
+
|
|
2804
|
+
// One tool's Install, Update or Replace. Replace is behind the confirm that says the edited copy is backed up.
|
|
2805
|
+
function installToolRules(tool) {
|
|
2806
|
+
const view = describeRulesHost(rulesStatus?.hosts?.[tool.id], { label: tool.name, version: rulesStatus?.version, tx: rulesTx });
|
|
2807
|
+
if (!view.action) return;
|
|
2808
|
+
if (view.force && !confirm(rulesTx('settings.redesign.setup.replaceYourEditedRulesWithSynabun', { label: tool.name }))) return;
|
|
2809
|
+
delete rulesTextCache[tool.id];
|
|
2810
|
+
runRulesInstall(async () => {
|
|
2811
|
+
const result = await installRules(tool.id, { force: view.force });
|
|
2812
|
+
return { message: describeRulesInstall(result, view.state, { label: tool.name, tx: rulesTx }), note: '', ok: true };
|
|
2813
|
+
});
|
|
2814
|
+
}
|
|
2815
|
+
|
|
2816
|
+
// View shows the exact text a tool receives, under the list; a second press hides it.
|
|
2817
|
+
async function viewRules(tool) {
|
|
2818
|
+
const $code = document.getElementById('rulesViewCode');
|
|
2819
|
+
if (rulesViewHost === tool.id) {
|
|
2820
|
+
rulesViewHost = '';
|
|
2821
|
+
} else {
|
|
2822
|
+
try { $code.textContent = await loadRulesText(tool.id); }
|
|
2823
|
+
catch { $code.textContent = rulesTx('settings.redesign.setup.couldNotLoadTheRules', { label: tool.name, RESTART_HINT }); }
|
|
2824
|
+
$code.setAttribute('aria-label', rulesTx('settings.redesign.setup.previewRules', { name: tool.name }));
|
|
2825
|
+
rulesViewHost = tool.id;
|
|
2247
2826
|
}
|
|
2248
|
-
|
|
2827
|
+
renderRulesStep();
|
|
2249
2828
|
}
|
|
2250
2829
|
|
|
2251
|
-
document.getElementById('
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
});
|
|
2830
|
+
document.getElementById('rulesInstallAllBtn').addEventListener('click', () => installAllToolRules());
|
|
2831
|
+
|
|
2832
|
+
// A click-to-copy code box (the pattern of the MCP JSON box in Step 5). The
|
|
2833
|
+
// label says "copied!" only once the clipboard took the text; a browser that
|
|
2834
|
+
// refuses (no permission, no focus, no secure context) gets "copy failed".
|
|
2835
|
+
function wireRulesCopyBox(wrapId, codeId) {
|
|
2836
|
+
document.getElementById(wrapId).addEventListener('click', async () => {
|
|
2837
|
+
const $code = document.getElementById(codeId);
|
|
2838
|
+
if (!$code.dataset.loaded) return;
|
|
2839
|
+
const label = document.querySelector(`#${wrapId} .code-copy-label`);
|
|
2840
|
+
let copied = false;
|
|
2841
|
+
try {
|
|
2842
|
+
await navigator.clipboard.writeText($code.textContent);
|
|
2843
|
+
copied = true;
|
|
2844
|
+
} catch { /* reported on the label below */ }
|
|
2845
|
+
label.textContent = copied ? 'copied!' : 'copy failed';
|
|
2846
|
+
label.style.opacity = '1';
|
|
2847
|
+
clearTimeout(label._timer);
|
|
2848
|
+
label._timer = setTimeout(() => { label.textContent = 'copy'; label.style.opacity = ''; }, copied ? 2000 : 4000);
|
|
2849
|
+
});
|
|
2850
|
+
}
|
|
2851
|
+
|
|
2852
|
+
// A collapsible copy-only section, for text SynaBun cannot install: loads it the first time it opens.
|
|
2853
|
+
function wireRulesExtra(sectionId, headerId, bodyId, wrapId, codeId, host, name) {
|
|
2854
|
+
const $section = document.getElementById(sectionId);
|
|
2855
|
+
const $body = document.getElementById(bodyId);
|
|
2856
|
+
const $code = document.getElementById(codeId);
|
|
2857
|
+
document.getElementById(headerId).addEventListener('click', async () => {
|
|
2858
|
+
const isOpen = $section.classList.toggle('open');
|
|
2859
|
+
$body.style.display = isOpen ? '' : 'none';
|
|
2860
|
+
if (isOpen && !$code.dataset.loaded) {
|
|
2861
|
+
$code.textContent = 'Loading...';
|
|
2862
|
+
try { $code.textContent = await loadRulesText(host); $code.dataset.loaded = '1'; }
|
|
2863
|
+
catch { $code.textContent = `The ${name} could not be loaded. ${RESTART_HINT}`; }
|
|
2864
|
+
}
|
|
2865
|
+
requestAnimationFrame(() => resizeViewport(currentStep));
|
|
2866
|
+
});
|
|
2867
|
+
wireRulesCopyBox(wrapId, codeId);
|
|
2868
|
+
}
|
|
2869
|
+
|
|
2870
|
+
wireRulesExtra('rulesCursorSection', 'rulesCursorHeader', 'rulesCursorBody', 'rulesCursorWrap', 'rulesCursorCode', 'cursor', 'Cursor rules');
|
|
2871
|
+
wireRulesExtra('rulesCoexistSection', 'rulesCoexistHeader', 'rulesCoexistBody', 'rulesCoexistWrap', 'rulesCoexistCode', 'coexistence', 'coexistence snippet');
|
|
2872
|
+
|
|
2873
|
+
async function onRulesetStep() {
|
|
2874
|
+
rulesReport = null;
|
|
2875
|
+
[rulesStatus] = await Promise.all([fetchRulesStatus(), loadRulesStrings()]);
|
|
2876
|
+
renderRulesStep();
|
|
2877
|
+
if (currentStep === 6) resizeViewport(6);
|
|
2878
|
+
}
|
|
2261
2879
|
|
|
2262
2880
|
// ═══════════════════════════════════════════
|
|
2263
2881
|
// STEP 7: Complete
|
|
@@ -2266,11 +2884,14 @@ document.getElementById('rulesetCodeWrap').addEventListener('click', () => {
|
|
|
2266
2884
|
async function onCompleteStep() {
|
|
2267
2885
|
renderHappyBun();
|
|
2268
2886
|
|
|
2269
|
-
|
|
2270
|
-
|
|
2887
|
+
// List every tool the user toggled on; fall back to the selected tool if none.
|
|
2888
|
+
const enabled = wizardState.enabledTools.length
|
|
2889
|
+
? wizardState.enabledTools.map(id => TOOLS.find(t => t.id === id)).filter(Boolean)
|
|
2890
|
+
: [TOOLS.find(t => t.id === wizardState.selectedTool) || TOOLS[0]];
|
|
2891
|
+
document.getElementById('restartToolName').textContent = enabled.map(t => t.name).join(', ');
|
|
2271
2892
|
|
|
2272
|
-
// Auto-register hooks globally
|
|
2273
|
-
if (
|
|
2893
|
+
// Auto-register hooks globally when Claude Code was toggled on
|
|
2894
|
+
if (enabled.some(t => t.id === 'claude')) {
|
|
2274
2895
|
try {
|
|
2275
2896
|
await fetch('/api/claude-code/integrations', {
|
|
2276
2897
|
method: 'POST',
|
|
@@ -2281,12 +2902,23 @@ async function onCompleteStep() {
|
|
|
2281
2902
|
} catch { /* non-critical — user can enable via Settings later */ }
|
|
2282
2903
|
}
|
|
2283
2904
|
|
|
2905
|
+
// Rules count as installed when every connected tool has its copy in place. When they are not, the item says
|
|
2906
|
+
// for which tools and where the installer is from now on.
|
|
2907
|
+
rulesStatus = await fetchRulesStatus();
|
|
2908
|
+
const rulesPlan = rulesInstallPlan(rulesStatus);
|
|
2909
|
+
const rulesMissing = rulesPlan.connected.filter(host => !rulesPlan.inPlace.includes(host));
|
|
2910
|
+
const rulesInstalled = rulesPlan.connected.length > 0 && rulesMissing.length === 0;
|
|
2911
|
+
const rulesLabel = rulesInstalled ? 'Rules installed'
|
|
2912
|
+
: !rulesStatus ? `Rules not installed: the installer did not answer (${RULES_SETTINGS_PATH})`
|
|
2913
|
+
: !rulesPlan.connected.length ? 'Rules not installed: no tool is connected'
|
|
2914
|
+
: `Rules not installed for ${ruleToolNames(rulesMissing)} (${RULES_SETTINGS_PATH})`;
|
|
2915
|
+
|
|
2284
2916
|
const items = [
|
|
2285
2917
|
{ label: 'Memory name set', done: !!wizardState.collectionName },
|
|
2286
2918
|
{ label: 'Dependencies installed & MCP built', done: wizardState.buildReady },
|
|
2287
2919
|
{ label: 'Projects registered', done: (wizardState.projects || []).length > 0 },
|
|
2288
|
-
{ label: '
|
|
2289
|
-
{ label:
|
|
2920
|
+
{ label: 'AI tool integration enabled', done: wizardState.enabledTools.length > 0 || wizardState.mcpWritten },
|
|
2921
|
+
{ label: rulesLabel, done: rulesInstalled },
|
|
2290
2922
|
];
|
|
2291
2923
|
|
|
2292
2924
|
const $list = document.getElementById('checklist');
|
|
@@ -2317,11 +2949,22 @@ async function init() {
|
|
|
2317
2949
|
window.location.href = '/';
|
|
2318
2950
|
return;
|
|
2319
2951
|
}
|
|
2320
|
-
if (data.
|
|
2321
|
-
wizardState.
|
|
2952
|
+
if (data.dataHome) {
|
|
2953
|
+
wizardState.dataHome = data.dataHome;
|
|
2954
|
+
}
|
|
2955
|
+
if (data.packageRoot) {
|
|
2956
|
+
wizardState.packageRoot = data.packageRoot;
|
|
2957
|
+
}
|
|
2958
|
+
if (data.mcpCommand && Array.isArray(data.mcpArgs)) {
|
|
2959
|
+
wizardState.mcpCommand = data.mcpCommand;
|
|
2960
|
+
wizardState.mcpArgs = data.mcpArgs;
|
|
2322
2961
|
}
|
|
2323
2962
|
} catch {}
|
|
2324
2963
|
|
|
2964
|
+
// Enable the entrance animation only after every top-level initializer has
|
|
2965
|
+
// run successfully. Until this point the static welcome remains usable and
|
|
2966
|
+
// visible instead of collapsing to a navigation-only shell.
|
|
2967
|
+
document.documentElement.classList.add('onboarding-animated');
|
|
2325
2968
|
updateNav();
|
|
2326
2969
|
startMascot();
|
|
2327
2970
|
// Resize after mascot SVG is injected so scrollHeight includes it
|