synabun 1.3.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +205 -662
- package/LICENSE-COMMERCIAL.md +33 -0
- package/NOTICE +17 -0
- package/README.md +175 -853
- package/THIRD-PARTY-LICENSES.md +136 -0
- package/benchmarks/browser-live-results.json +79 -0
- package/benchmarks/browser-v2-results.json +258 -0
- package/benchmarks/fixtures/browser/README.md +57 -0
- package/benchmarks/fixtures/browser/page-state.json +132 -0
- package/benchmarks/fixtures/browser/social.json +92 -0
- package/benchmarks/fixtures/browser/target.json +319 -0
- package/benchmarks/fixtures/desktop/README.md +58 -0
- package/benchmarks/fixtures/desktop/abstention.json +59 -0
- package/benchmarks/fixtures/desktop/adversarial.json +22 -0
- package/benchmarks/fixtures/desktop/forbidden.json +93 -0
- package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
- package/benchmarks/fixtures/desktop/target.json +136 -0
- package/bin/synabun.js +30 -0
- package/docs/whatsapp.md +325 -0
- package/hooks/claude-code/post-plan.mjs +613 -391
- package/hooks/claude-code/post-remember.mjs +246 -122
- package/hooks/claude-code/pre-compact.mjs +171 -110
- package/hooks/claude-code/pre-task.mjs +133 -0
- package/hooks/claude-code/pre-websearch.mjs +15 -4
- package/hooks/claude-code/prompt-origin.mjs +94 -0
- package/hooks/claude-code/prompt-submit.mjs +1244 -861
- package/hooks/claude-code/session-start.mjs +114 -156
- package/hooks/claude-code/shared.mjs +1228 -368
- package/hooks/claude-code/state.mjs +167 -0
- package/hooks/claude-code/stop.mjs +515 -140
- package/hooks/claude-code/subagent-start.mjs +154 -0
- package/hooks/claude-code/subagent-stop.mjs +102 -0
- package/hooks/claude-code/task-gate.mjs +150 -0
- package/launcher.mjs +40 -0
- package/lib/claude-hooks.js +137 -0
- package/lib/claude-usage-audit.js +141 -0
- package/lib/client-config-repair.js +145 -0
- package/lib/data-home-migration.js +502 -0
- package/lib/desktop-pwa.js +206 -0
- package/lib/external-tools.js +221 -0
- package/lib/first-launch-protection.js +245 -0
- package/lib/packaged-runtime.js +110 -0
- package/lib/paths.d.ts +21 -0
- package/lib/paths.js +103 -0
- package/lib/start-launcher.js +1309 -0
- package/mcp-server/dist/config.d.ts +22 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +109 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +30 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +276 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +48 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +538 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +28 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +32 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
- package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.js +128 -0
- package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.js +344 -0
- package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/browser-assist.d.ts +104 -0
- package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist.js +282 -0
- package/mcp-server/dist/services/browser-assist.js.map +1 -0
- package/mcp-server/dist/services/browser-bench.d.ts +772 -0
- package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-bench.js +424 -0
- package/mcp-server/dist/services/browser-bench.js.map +1 -0
- package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
- package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-judgments.js +363 -0
- package/mcp-server/dist/services/browser-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-risk.d.ts +166 -0
- package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-risk.js +458 -0
- package/mcp-server/dist/services/browser-risk.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +377 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.js +346 -0
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
- package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
- package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist.js +266 -0
- package/mcp-server/dist/services/desktop-assist.js.map +1 -0
- package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
- package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-bench.js +311 -0
- package/mcp-server/dist/services/desktop-bench.js.map +1 -0
- package/mcp-server/dist/services/desktop-client.d.ts +23 -0
- package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-client.js +79 -0
- package/mcp-server/dist/services/desktop-client.js.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.js +177 -0
- package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
- package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
- package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-risk.js +605 -0
- package/mcp-server/dist/services/desktop-risk.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/edit-stale.d.ts +81 -0
- package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
- package/mcp-server/dist/services/edit-stale.js +358 -0
- package/mcp-server/dist/services/edit-stale.js.map +1 -0
- package/mcp-server/dist/services/embedding-service.d.ts +16 -0
- package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-service.js +126 -0
- package/mcp-server/dist/services/embedding-service.js.map +1 -0
- package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
- package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-worker.js +52 -0
- package/mcp-server/dist/services/embedding-worker.js.map +1 -0
- package/mcp-server/dist/services/fb-regions.d.ts +71 -0
- package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
- package/mcp-server/dist/services/fb-regions.js +211 -0
- package/mcp-server/dist/services/fb-regions.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +22 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +55 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
- package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
- package/mcp-server/dist/services/file-excerpt.js +65 -0
- package/mcp-server/dist/services/file-excerpt.js.map +1 -0
- package/mcp-server/dist/services/identity.d.ts +124 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -0
- package/mcp-server/dist/services/identity.js +241 -0
- package/mcp-server/dist/services/identity.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +3 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/memory-client.d.ts +4 -0
- package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-client.js +27 -0
- package/mcp-server/dist/services/memory-client.js.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
- package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
- package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judgments.js +674 -0
- package/mcp-server/dist/services/memory-judgments.js.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.js +403 -0
- package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.js +412 -0
- package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
- package/mcp-server/dist/services/memory-schema.d.ts +16 -0
- package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-schema.js +282 -0
- package/mcp-server/dist/services/memory-schema.js.map +1 -0
- package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-sessions.js +110 -0
- package/mcp-server/dist/services/memory-sessions.js.map +1 -0
- package/mcp-server/dist/services/memory-triage.d.ts +60 -0
- package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-triage.js +189 -0
- package/mcp-server/dist/services/memory-triage.js.map +1 -0
- package/mcp-server/dist/services/memory-verification.d.ts +24 -0
- package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-verification.js +92 -0
- package/mcp-server/dist/services/memory-verification.js.map +1 -0
- package/mcp-server/dist/services/memory-writer.d.ts +26 -0
- package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-writer.js +126 -0
- package/mcp-server/dist/services/memory-writer.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +439 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +1135 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/profiles.d.ts +120 -0
- package/mcp-server/dist/services/profiles.d.ts.map +1 -0
- package/mcp-server/dist/services/profiles.js +387 -0
- package/mcp-server/dist/services/profiles.js.map +1 -0
- package/mcp-server/dist/services/secret-gate.d.ts +29 -0
- package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/secret-gate.js +43 -0
- package/mcp-server/dist/services/secret-gate.js.map +1 -0
- package/mcp-server/dist/services/server-instructions.d.ts +10 -0
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
- package/mcp-server/dist/services/server-instructions.js +101 -0
- package/mcp-server/dist/services/server-instructions.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +235 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +1185 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.js +218 -0
- package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +746 -0
- package/mcp-server/dist/services/typesafe-config.js.map +1 -0
- package/mcp-server/dist/services/typesafe.d.ts +213 -0
- package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe.js +330 -0
- package/mcp-server/dist/services/typesafe.js.map +1 -0
- package/mcp-server/dist/services/vector-cache.d.ts +68 -0
- package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
- package/mcp-server/dist/services/vector-cache.js +271 -0
- package/mcp-server/dist/services/vector-cache.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
- package/mcp-server/dist/tools/agents.d.ts +212 -0
- package/mcp-server/dist/tools/agents.d.ts.map +1 -0
- package/mcp-server/dist/tools/agents.js +407 -0
- package/mcp-server/dist/tools/agents.js.map +1 -0
- package/mcp-server/dist/tools/bluesky.d.ts +39 -0
- package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
- package/mcp-server/dist/tools/bluesky.js +1144 -0
- package/mcp-server/dist/tools/bluesky.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +106 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
- package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-batch.js +187 -0
- package/mcp-server/dist/tools/browser-batch.js.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +300 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +142 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +2009 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +34 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +112 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +16 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/choice.d.ts +160 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -0
- package/mcp-server/dist/tools/choice.js +80 -0
- package/mcp-server/dist/tools/choice.js.map +1 -0
- package/mcp-server/dist/tools/computer.d.ts +71 -0
- package/mcp-server/dist/tools/computer.d.ts.map +1 -0
- package/mcp-server/dist/tools/computer.js +174 -0
- package/mcp-server/dist/tools/computer.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +25 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
- package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/fb-groups.js +369 -0
- package/mcp-server/dist/tools/fb-groups.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +11 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.js +351 -0
- package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.js +258 -0
- package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.js +357 -0
- package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.js +321 -0
- package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.js +197 -0
- package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.js +274 -0
- package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.js +425 -0
- package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
- package/mcp-server/dist/tools/gsc.d.ts +7 -0
- package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc.js +51 -0
- package/mcp-server/dist/tools/gsc.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +14 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +21 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +401 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +56 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +171 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/morelogin.d.ts +24 -0
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
- package/mcp-server/dist/tools/morelogin.js +79 -0
- package/mcp-server/dist/tools/morelogin.js.map +1 -0
- package/mcp-server/dist/tools/profile.d.ts +17 -0
- package/mcp-server/dist/tools/profile.d.ts.map +1 -0
- package/mcp-server/dist/tools/profile.js +114 -0
- package/mcp-server/dist/tools/profile.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +71 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +147 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +56 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +157 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +62 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +201 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.js +231 -0
- package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
- package/mcp-server/dist/tools/style-guide.d.ts +8 -0
- package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide.js +12 -0
- package/mcp-server/dist/tools/style-guide.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +20 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +156 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +11 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +19 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +54 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.js +337 -0
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +16 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.js +83 -0
- package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.js +56 -0
- package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
- package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/download.js +30 -0
- package/mcp-server/dist/tools/youtube/download.js.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.js +143 -0
- package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
- package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
- package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/media.js +97 -0
- package/mcp-server/dist/tools/youtube/media.js.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.js +106 -0
- package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.js +71 -0
- package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.js +128 -0
- package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.js +147 -0
- package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
- package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
- package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/source.js +85 -0
- package/mcp-server/dist/tools/youtube/source.js.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.js +255 -0
- package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
- package/mcp-server/dist/tools/youtube.d.ts +12 -0
- package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube.js +38 -0
- package/mcp-server/dist/tools/youtube.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +806 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/mcp-server/package-lock.json +4798 -0
- package/mcp-server/package.json +55 -38
- package/mcp-server/run.mjs +12 -2
- package/mcp-server/src/config.ts +48 -3
- package/mcp-server/src/http.ts +296 -93
- package/mcp-server/src/index.ts +546 -203
- package/mcp-server/src/preload-http.ts +19 -18
- package/mcp-server/src/preload.ts +19 -18
- package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
- package/mcp-server/src/services/assistant-judgments.ts +157 -0
- package/mcp-server/src/services/browser-assist-gate.ts +383 -0
- package/mcp-server/src/services/browser-assist.ts +267 -0
- package/mcp-server/src/services/browser-bench.ts +477 -0
- package/mcp-server/src/services/browser-judgments.ts +414 -0
- package/mcp-server/src/services/browser-risk.ts +484 -0
- package/mcp-server/src/services/categories.ts +36 -19
- package/mcp-server/src/services/codex-config-heal.ts +403 -0
- package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
- package/mcp-server/src/services/desktop-assist.ts +308 -0
- package/mcp-server/src/services/desktop-bench.ts +372 -0
- package/mcp-server/src/services/desktop-client.ts +76 -0
- package/mcp-server/src/services/desktop-judgments.ts +218 -0
- package/mcp-server/src/services/desktop-risk.ts +743 -0
- package/mcp-server/src/services/edit-stale.ts +299 -0
- package/mcp-server/src/services/embedding-service.ts +108 -0
- package/mcp-server/src/services/embedding-worker.ts +46 -0
- package/mcp-server/src/services/fb-regions.ts +221 -0
- package/mcp-server/src/services/file-checksums.ts +26 -9
- package/mcp-server/src/services/file-excerpt.ts +59 -0
- package/mcp-server/src/services/identity.ts +291 -0
- package/mcp-server/src/services/local-embeddings.ts +2 -77
- package/mcp-server/src/services/memory-client.ts +23 -0
- package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
- package/mcp-server/src/services/memory-judgments.ts +901 -0
- package/mcp-server/src/services/memory-maintenance.ts +360 -0
- package/mcp-server/src/services/memory-retrieval.ts +349 -0
- package/mcp-server/src/services/memory-schema.ts +280 -0
- package/mcp-server/src/services/memory-sessions.ts +87 -0
- package/mcp-server/src/services/memory-triage.ts +182 -0
- package/mcp-server/src/services/memory-verification.ts +68 -0
- package/mcp-server/src/services/memory-writer.ts +125 -0
- package/mcp-server/src/services/neural-interface.ts +1217 -73
- package/mcp-server/src/services/profiles.ts +428 -0
- package/mcp-server/src/services/secret-gate.ts +52 -0
- package/mcp-server/src/services/server-instructions.ts +122 -0
- package/mcp-server/src/services/sqlite.ts +1456 -823
- package/mcp-server/src/services/typesafe-bench.ts +247 -0
- package/mcp-server/src/services/typesafe-config.ts +790 -0
- package/mcp-server/src/services/typesafe.ts +390 -0
- package/mcp-server/src/services/vector-cache.ts +255 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
- package/mcp-server/src/tools/agents.ts +539 -0
- package/mcp-server/src/tools/bluesky.ts +1186 -0
- package/mcp-server/src/tools/browser-advanced.ts +15 -6
- package/mcp-server/src/tools/browser-batch.ts +178 -0
- package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
- package/mcp-server/src/tools/browser-interact.ts +362 -255
- package/mcp-server/src/tools/browser-navigate.ts +164 -77
- package/mcp-server/src/tools/browser-observe.ts +2222 -1330
- package/mcp-server/src/tools/browser.ts +181 -107
- package/mcp-server/src/tools/card.ts +7 -5
- package/mcp-server/src/tools/choice.ts +103 -0
- package/mcp-server/src/tools/computer.ts +190 -0
- package/mcp-server/src/tools/discord.ts +10 -23
- package/mcp-server/src/tools/fb-groups.ts +387 -0
- package/mcp-server/src/tools/forget.ts +1 -1
- package/mcp-server/src/tools/git.ts +3 -1
- package/mcp-server/src/tools/gsc/experience.ts +440 -0
- package/mcp-server/src/tools/gsc/helpers.ts +288 -0
- package/mcp-server/src/tools/gsc/indexing.ts +495 -0
- package/mcp-server/src/tools/gsc/inspect.ts +391 -0
- package/mcp-server/src/tools/gsc/navigate.ts +236 -0
- package/mcp-server/src/tools/gsc/performance.ts +352 -0
- package/mcp-server/src/tools/gsc/settings.ts +564 -0
- package/mcp-server/src/tools/gsc.ts +95 -0
- package/mcp-server/src/tools/image.ts +3 -1
- package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
- package/mcp-server/src/tools/leonardo.ts +7 -5
- package/mcp-server/src/tools/loop.ts +118 -25
- package/mcp-server/src/tools/memories.ts +65 -5
- package/mcp-server/src/tools/morelogin.ts +81 -0
- package/mcp-server/src/tools/profile.ts +122 -0
- package/mcp-server/src/tools/recall.ts +105 -261
- package/mcp-server/src/tools/reflect.ts +171 -145
- package/mcp-server/src/tools/remember.ts +223 -115
- package/mcp-server/src/tools/style-guide-tools.ts +250 -0
- package/mcp-server/src/tools/style-guide.ts +16 -0
- package/mcp-server/src/tools/sync.ts +66 -9
- package/mcp-server/src/tools/tictactoe.ts +3 -1
- package/mcp-server/src/tools/utils.ts +22 -0
- package/mcp-server/src/tools/whiteboard-format.ts +394 -0
- package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
- package/mcp-server/src/tools/whiteboard.ts +7 -5
- package/mcp-server/src/tools/youtube/analytics.ts +106 -0
- package/mcp-server/src/tools/youtube/dedup.ts +57 -0
- package/mcp-server/src/tools/youtube/download.ts +41 -0
- package/mcp-server/src/tools/youtube/helpers.ts +183 -0
- package/mcp-server/src/tools/youtube/media.ts +109 -0
- package/mcp-server/src/tools/youtube/metadata.ts +112 -0
- package/mcp-server/src/tools/youtube/navigate.ts +81 -0
- package/mcp-server/src/tools/youtube/playlist.ts +134 -0
- package/mcp-server/src/tools/youtube/schedule.ts +158 -0
- package/mcp-server/src/tools/youtube/source.ts +101 -0
- package/mcp-server/src/tools/youtube/upload.ts +296 -0
- package/mcp-server/src/tools/youtube.ts +47 -0
- package/mcp-server/src/tui.ts +8 -9
- package/neural-interface/games/TicTacToe/1.svg +1 -0
- package/neural-interface/games/TicTacToe/2.svg +1 -0
- package/neural-interface/games/TicTacToe/3.svg +1 -0
- package/neural-interface/games/TicTacToe/4.svg +1 -0
- package/neural-interface/games/TicTacToe/5.svg +1 -0
- package/neural-interface/games/TicTacToe/6.svg +1 -0
- package/neural-interface/games/TicTacToe/7.svg +1 -0
- package/neural-interface/games/TicTacToe/8.svg +1 -0
- package/neural-interface/games/TicTacToe/9.svg +1 -0
- package/neural-interface/games/TicTacToe/Board.svg +1 -0
- package/neural-interface/games/TicTacToe/Circle.svg +1 -0
- package/neural-interface/games/TicTacToe/Cross.svg +1 -0
- package/neural-interface/i18n/en.json +7022 -0
- package/neural-interface/i18n/pt-BR.json +7026 -0
- package/neural-interface/lib/assistant-api.js +1005 -0
- package/neural-interface/lib/assistant-attachments.js +121 -0
- package/neural-interface/lib/assistant-brains/claude.js +207 -0
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
- package/neural-interface/lib/assistant-brains/codex.js +213 -0
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
- package/neural-interface/lib/assistant-brains/opencode.js +320 -0
- package/neural-interface/lib/assistant-budget.js +318 -0
- package/neural-interface/lib/assistant-catalog.js +731 -0
- package/neural-interface/lib/assistant-clarify.js +664 -0
- package/neural-interface/lib/assistant-config.js +232 -0
- package/neural-interface/lib/assistant-dispatch.js +2744 -0
- package/neural-interface/lib/assistant-envelope.js +582 -0
- package/neural-interface/lib/assistant-evidence.js +236 -0
- package/neural-interface/lib/assistant-hidden-models.js +272 -0
- package/neural-interface/lib/assistant-jev.js +117 -0
- package/neural-interface/lib/assistant-judgments.js +111 -0
- package/neural-interface/lib/assistant-media.js +335 -0
- package/neural-interface/lib/assistant-memory.js +398 -0
- package/neural-interface/lib/assistant-persona.js +444 -0
- package/neural-interface/lib/assistant-plan-permissions.js +448 -0
- package/neural-interface/lib/assistant-playbooks/design.md +87 -0
- package/neural-interface/lib/assistant-playbooks.js +72 -0
- package/neural-interface/lib/assistant-pricing.js +159 -0
- package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
- package/neural-interface/lib/assistant-route-gate.js +212 -0
- package/neural-interface/lib/assistant-router.js +1324 -0
- package/neural-interface/lib/assistant-runtime.js +3337 -0
- package/neural-interface/lib/assistant-task-prompt.js +472 -0
- package/neural-interface/lib/assistant-usage.js +1688 -0
- package/neural-interface/lib/augmented-path.js +70 -0
- package/neural-interface/lib/automation-storage-migration.js +54 -0
- package/neural-interface/lib/backup-service.js +851 -0
- package/neural-interface/lib/backup-zip-reader.js +262 -0
- package/neural-interface/lib/browser-assist-api.js +41 -0
- package/neural-interface/lib/browser-console.js +176 -0
- package/neural-interface/lib/browser-execution.js +241 -0
- package/neural-interface/lib/browser-extraction.js +191 -0
- package/neural-interface/lib/browser-language.js +83 -0
- package/neural-interface/lib/browser-screenshot.js +399 -0
- package/neural-interface/lib/browser-semantic-context.js +639 -0
- package/neural-interface/lib/browser-snapshots.js +192 -0
- package/neural-interface/lib/browser-tab-recovery.js +119 -0
- package/neural-interface/lib/browser-targets.js +70 -0
- package/neural-interface/lib/browser-tool-policy.js +926 -0
- package/neural-interface/lib/claude-accounts.js +230 -0
- package/neural-interface/lib/claude-agent-bridge.js +3203 -0
- package/neural-interface/lib/claude-bypass-policy.js +99 -0
- package/neural-interface/lib/claude-executable.js +241 -0
- package/neural-interface/lib/claude-history.js +429 -0
- package/neural-interface/lib/claude-model-catalog.js +444 -0
- package/neural-interface/lib/claude-panel-requests.js +165 -0
- package/neural-interface/lib/claude-panel-session.js +272 -0
- package/neural-interface/lib/claude-permission-rules.js +153 -0
- package/neural-interface/lib/claude-session-cleanup.js +71 -0
- package/neural-interface/lib/claude-session-list.js +82 -0
- package/neural-interface/lib/claude-session-ops.js +140 -0
- package/neural-interface/lib/claude-settings-view.js +51 -0
- package/neural-interface/lib/claude-skin-connect.js +79 -0
- package/neural-interface/lib/claude-stall-policy.js +7 -0
- package/neural-interface/lib/claude-temporary.js +435 -0
- package/neural-interface/lib/cli-update-planner.js +312 -0
- package/neural-interface/lib/codex-capabilities.d.ts +41 -0
- package/neural-interface/lib/codex-capabilities.js +148 -0
- package/neural-interface/lib/codex-collaboration-mode.js +17 -0
- package/neural-interface/lib/codex-compat-rpc.js +241 -0
- package/neural-interface/lib/codex-mcp-approvals.js +56 -0
- package/neural-interface/lib/codex-mcp-apps.js +47 -0
- package/neural-interface/lib/codex-model-context.js +202 -0
- package/neural-interface/lib/codex-plan-store.js +71 -0
- package/neural-interface/lib/codex-request-journal.js +242 -0
- package/neural-interface/lib/codex-runtime-path.js +213 -0
- package/neural-interface/lib/codex-session-catalog.js +231 -0
- package/neural-interface/lib/codex-session-settings.js +46 -0
- package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
- package/neural-interface/lib/codex-thread-history.js +165 -0
- package/neural-interface/lib/codex-user-verification.js +34 -0
- package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
- package/neural-interface/lib/confined-fs.js +256 -0
- package/neural-interface/lib/db.js +922 -0
- package/neural-interface/lib/design-md.js +9 -0
- package/neural-interface/lib/desktop/api.js +92 -0
- package/neural-interface/lib/desktop/audit.js +62 -0
- package/neural-interface/lib/desktop/build.js +423 -0
- package/neural-interface/lib/desktop/config.js +606 -0
- package/neural-interface/lib/desktop/coords.js +76 -0
- package/neural-interface/lib/desktop/fake-helper.js +1192 -0
- package/neural-interface/lib/desktop/frames.js +77 -0
- package/neural-interface/lib/desktop/grants.js +84 -0
- package/neural-interface/lib/desktop/guards.js +170 -0
- package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
- package/neural-interface/lib/desktop/lease.js +51 -0
- package/neural-interface/lib/desktop/manager.js +545 -0
- package/neural-interface/lib/desktop/press-contexts.js +103 -0
- package/neural-interface/lib/desktop/protocol.js +495 -0
- package/neural-interface/lib/desktop/service.js +1202 -0
- package/neural-interface/lib/effort-levels.js +148 -0
- package/neural-interface/lib/event-loop-monitor.js +67 -0
- package/neural-interface/lib/exec-loop-command.js +209 -0
- package/neural-interface/lib/folder-picker.ps1 +77 -0
- package/neural-interface/lib/http-guards.js +287 -0
- package/neural-interface/lib/jsonl-lines.js +94 -0
- package/neural-interface/lib/loop-logger.js +127 -0
- package/neural-interface/lib/mcp-client-config.js +133 -0
- package/neural-interface/lib/mcp-installer.js +487 -0
- package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
- package/neural-interface/lib/mcp-profile-servers.js +120 -0
- package/neural-interface/lib/memo-cache.js +84 -0
- package/neural-interface/lib/memory-api.js +758 -0
- package/neural-interface/lib/memory-map-api.js +1150 -0
- package/neural-interface/lib/memory-map-layout.js +872 -0
- package/neural-interface/lib/memory-map-worker.js +165 -0
- package/neural-interface/lib/memory-session-capture.js +81 -0
- package/neural-interface/lib/memory-timers.js +62 -0
- package/neural-interface/lib/morelogin.js +301 -0
- package/neural-interface/lib/native-binary-runtime.js +382 -0
- package/neural-interface/lib/native-loop-goal.js +33 -0
- package/neural-interface/lib/native-loop-providers.js +1002 -0
- package/neural-interface/lib/native-loop-runtime.js +747 -0
- package/neural-interface/lib/offline-page.js +54 -0
- package/neural-interface/lib/opencode-hidden-models.js +113 -0
- package/neural-interface/lib/opencode-history.js +253 -0
- package/neural-interface/lib/opencode-runtime-config.js +58 -0
- package/neural-interface/lib/opencode-v2-client.js +486 -0
- package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
- package/neural-interface/lib/path-confine.js +213 -0
- package/neural-interface/lib/plugin-installer.js +264 -0
- package/neural-interface/lib/project-storage.js +766 -0
- package/neural-interface/lib/pty-host/core.js +603 -0
- package/neural-interface/lib/pty-host/flow.js +43 -0
- package/neural-interface/lib/pty-host/host.js +47 -0
- package/neural-interface/lib/pty-host/manager.js +360 -0
- package/neural-interface/lib/pty-host/protocol.js +81 -0
- package/neural-interface/lib/pty-host/snapshot.js +133 -0
- package/neural-interface/lib/remote-policy.js +582 -0
- package/neural-interface/lib/rulesets/api.js +175 -0
- package/neural-interface/lib/rulesets/fs-safe.js +245 -0
- package/neural-interface/lib/rulesets/installer.js +1453 -0
- package/neural-interface/lib/rulesets/json-edit.js +186 -0
- package/neural-interface/lib/rulesets/lock.js +170 -0
- package/neural-interface/lib/rulesets/managed-text.js +314 -0
- package/neural-interface/lib/rulesets/normalise.js +24 -0
- package/neural-interface/lib/rulesets/render.js +84 -0
- package/neural-interface/lib/schedule-launch-intent.js +40 -0
- package/neural-interface/lib/session-cache-builder.js +524 -0
- package/neural-interface/lib/session-chunker.js +344 -0
- package/neural-interface/lib/session-indexer.js +327 -0
- package/neural-interface/lib/session-title-generator.js +232 -0
- package/neural-interface/lib/skill-prompt-bridge.js +11 -0
- package/neural-interface/lib/style-guide/api.js +375 -0
- package/neural-interface/lib/style-guide/color.js +352 -0
- package/neural-interface/lib/style-guide/export-css.js +99 -0
- package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
- package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
- package/neural-interface/lib/style-guide/fonts.json +227 -0
- package/neural-interface/lib/style-guide/import.js +1268 -0
- package/neural-interface/lib/style-guide/pointers.js +103 -0
- package/neural-interface/lib/style-guide/presets.js +232 -0
- package/neural-interface/lib/style-guide/render-design-md.js +319 -0
- package/neural-interface/lib/style-guide/schema.js +848 -0
- package/neural-interface/lib/style-guide/security.js +43 -0
- package/neural-interface/lib/style-guide/store.js +491 -0
- package/neural-interface/lib/style-guide/summary.js +106 -0
- package/neural-interface/lib/style-guide/tokens.js +170 -0
- package/neural-interface/lib/synabun-update-plan.js +324 -0
- package/neural-interface/lib/synabun-version.js +179 -0
- package/neural-interface/lib/system-restore.js +99 -0
- package/neural-interface/lib/terminal-env.js +86 -0
- package/neural-interface/lib/ui-blob-store.js +106 -0
- package/neural-interface/lib/vector-cache.js +2 -0
- package/neural-interface/lib/virtual-socket.js +60 -0
- package/neural-interface/lib/whatsapp/api.js +146 -0
- package/neural-interface/lib/whatsapp/auth-store.js +389 -0
- package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
- package/neural-interface/lib/whatsapp/brain.js +128 -0
- package/neural-interface/lib/whatsapp/bridge.js +1499 -0
- package/neural-interface/lib/whatsapp/cards.js +519 -0
- package/neural-interface/lib/whatsapp/commands.js +92 -0
- package/neural-interface/lib/whatsapp/config.js +291 -0
- package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
- package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
- package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
- package/neural-interface/lib/whatsapp/connector/package.json +8 -0
- package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
- package/neural-interface/lib/whatsapp/format.js +552 -0
- package/neural-interface/lib/whatsapp/host-core.js +1225 -0
- package/neural-interface/lib/whatsapp/host.js +119 -0
- package/neural-interface/lib/whatsapp/identity.js +288 -0
- package/neural-interface/lib/whatsapp/inbound.js +149 -0
- package/neural-interface/lib/whatsapp/installer.js +562 -0
- package/neural-interface/lib/whatsapp/manager.js +638 -0
- package/neural-interface/lib/whatsapp/paths.js +81 -0
- package/neural-interface/lib/whatsapp/protocol.js +327 -0
- package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
- package/neural-interface/lib/whatsapp/redact.js +130 -0
- package/neural-interface/lib/whatsapp/service.js +1305 -0
- package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
- package/neural-interface/package-lock.json +4431 -0
- package/neural-interface/package.json +58 -27
- package/neural-interface/public/apple-touch-icon.png +0 -0
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +1 -0
- package/neural-interface/public/favicon-16x16.png +0 -0
- package/neural-interface/public/favicon-32x32.png +0 -0
- package/neural-interface/public/icon-192.png +0 -0
- package/neural-interface/public/icon-512.png +0 -0
- package/neural-interface/public/index.html +32 -182
- package/neural-interface/public/index2d.html +2 -2
- package/neural-interface/public/install-app.html +31 -0
- package/neural-interface/public/logo-synabun.png +0 -0
- package/neural-interface/public/logoHD.png +0 -0
- package/neural-interface/public/manifest.json +2 -0
- package/neural-interface/public/mcp.svg +4 -0
- package/neural-interface/public/offline.html +670 -299
- package/neural-interface/public/onboarding.html +804 -161
- package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
- package/neural-interface/public/shared/agent-runtime-options.js +596 -0
- package/neural-interface/public/shared/api.js +339 -28
- package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
- package/neural-interface/public/shared/assistant/asst-api.js +270 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
- package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
- package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
- package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
- package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
- package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
- package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
- package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
- package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
- package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
- package/neural-interface/public/shared/assistant/asst-state.js +727 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
- package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
- package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
- package/neural-interface/public/shared/automation-context.js +75 -0
- package/neural-interface/public/shared/blob-store.js +99 -0
- package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
- package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
- package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
- package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
- package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
- package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
- package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
- package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
- package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
- package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
- package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
- package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
- package/neural-interface/public/shared/cli-status.js +169 -0
- package/neural-interface/public/shared/command-runner-model.js +30 -0
- package/neural-interface/public/shared/constants.js +22 -5
- package/neural-interface/public/shared/cp/cp-agents.js +186 -0
- package/neural-interface/public/shared/cp/cp-bash.js +252 -0
- package/neural-interface/public/shared/cp/cp-compose.js +159 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
- package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
- package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
- package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
- package/neural-interface/public/shared/cp/cp-diff.js +255 -0
- package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
- package/neural-interface/public/shared/cp/cp-events.js +846 -0
- package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
- package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
- package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
- package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
- package/neural-interface/public/shared/cp/cp-restore.js +224 -0
- package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
- package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
- package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
- package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
- package/neural-interface/public/shared/cp/cp-styles.js +349 -0
- package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
- package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
- package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
- package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
- package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
- package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
- package/neural-interface/public/shared/graph-activity.js +68 -0
- package/neural-interface/public/shared/html-shell.js +116 -17
- package/neural-interface/public/shared/i18n.js +132 -34
- package/neural-interface/public/shared/node-positions-store.js +44 -0
- package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
- package/neural-interface/public/shared/provider-icons.js +30 -0
- package/neural-interface/public/shared/pwa-install-page.js +34 -0
- package/neural-interface/public/shared/pwa-install.css +12 -0
- package/neural-interface/public/shared/pwa-install.js +28 -0
- package/neural-interface/public/shared/session-title.js +100 -0
- package/neural-interface/public/shared/settings/settings-ia.js +389 -0
- package/neural-interface/public/shared/settings/settings-kit.js +234 -0
- package/neural-interface/public/shared/settings/settings-rules.js +160 -0
- package/neural-interface/public/shared/settings/settings-search.js +463 -0
- package/neural-interface/public/shared/settings/settings-shell.js +570 -0
- package/neural-interface/public/shared/start-bridge.js +583 -0
- package/neural-interface/public/shared/state.js +5 -0
- package/neural-interface/public/shared/storage.js +50 -7
- package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
- package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
- package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
- package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
- package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
- package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
- package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
- package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
- package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
- package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
- package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
- package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
- package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
- package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
- package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
- package/neural-interface/public/shared/styles.css +8614 -1477
- package/neural-interface/public/shared/synabun-mascot.js +1625 -0
- package/neural-interface/public/shared/synabun-ticker.js +376 -0
- package/neural-interface/public/shared/term-ready.js +307 -0
- package/neural-interface/public/shared/term-renderer.js +343 -0
- package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
- package/neural-interface/public/shared/ui-assistant.js +77 -0
- package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
- package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
- package/neural-interface/public/shared/ui-codex-panel.js +12 -0
- package/neural-interface/public/shared/ui-command-runner.js +251 -468
- package/neural-interface/public/shared/ui-cost-widget.js +55 -34
- package/neural-interface/public/shared/ui-detail.js +77 -14
- package/neural-interface/public/shared/ui-explorer.js +360 -181
- package/neural-interface/public/shared/ui-file-explorer.js +485 -107
- package/neural-interface/public/shared/ui-help.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +45 -21
- package/neural-interface/public/shared/ui-judgments.js +1346 -0
- package/neural-interface/public/shared/ui-keybinds.js +3 -2
- package/neural-interface/public/shared/ui-link.js +105 -51
- package/neural-interface/public/shared/ui-loading.js +222 -11
- package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
- package/neural-interface/public/shared/ui-menubar.js +100 -31
- package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
- package/neural-interface/public/shared/ui-native-window-id.js +7 -0
- package/neural-interface/public/shared/ui-navbar.js +357 -222
- package/neural-interface/public/shared/ui-notifications.js +58 -12
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
- package/neural-interface/public/shared/ui-panels.js +15 -7
- package/neural-interface/public/shared/ui-resume.js +823 -653
- package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
- package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
- package/neural-interface/public/shared/ui-sessions.js +789 -34
- package/neural-interface/public/shared/ui-settings.js +5774 -2194
- package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
- package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
- package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
- package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
- package/neural-interface/public/shared/ui-skills.js +18 -32
- package/neural-interface/public/shared/ui-styleguide.js +35 -0
- package/neural-interface/public/shared/ui-sync.js +87 -0
- package/neural-interface/public/shared/ui-terminal.js +7863 -6385
- package/neural-interface/public/shared/ui-tool-updates.js +292 -0
- package/neural-interface/public/shared/ui-tooltip.js +156 -15
- package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
- package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
- package/neural-interface/public/shared/ui-tutorial.css +102 -0
- package/neural-interface/public/shared/ui-tutorial.js +557 -1076
- package/neural-interface/public/shared/ui-update.js +420 -68
- package/neural-interface/public/shared/ui-whatsapp.js +941 -0
- package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
- package/neural-interface/public/shared/ui-workspaces.js +2 -1
- package/neural-interface/public/shared/utils.js +58 -0
- package/neural-interface/public/shared/vterm-buffer.js +15 -5
- package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
- package/neural-interface/public/sidepanel-session.html +18 -0
- package/neural-interface/public/sw.js +10 -2
- package/neural-interface/public/synabun.png +0 -0
- package/neural-interface/public/variant/2d/graph.js +1707 -1635
- package/neural-interface/public/variant/2d/lasso.js +2 -1
- package/neural-interface/public/variant/2d/layout.js +595 -594
- package/neural-interface/public/variant/2d/main.js +557 -521
- package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
- package/neural-interface/public/variant/3d/main.js +517 -500
- package/neural-interface/public/variant/3d/map-controls.js +144 -0
- package/neural-interface/public/variant/3d/map-data.js +251 -0
- package/neural-interface/public/variant/3d/map-labels.js +241 -0
- package/neural-interface/public/variant/3d/map-pick.js +90 -0
- package/neural-interface/public/variant/3d/map-renderer.js +521 -0
- package/neural-interface/public/variant/3d/map-shaders.js +158 -0
- package/neural-interface/public/variant/3d/map-view.js +618 -0
- package/neural-interface/public/vendor/three/manifest.json +3 -0
- package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
- package/neural-interface/public/vendor/xterm/manifest.json +3 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
- package/neural-interface/scripts/build-vendor.mjs +64 -0
- package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
- package/neural-interface/scripts/rebuild-pty.js +39 -22
- package/neural-interface/scripts/vendor-three-entry.js +24 -0
- package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
- package/neural-interface/server.js +33983 -15000
- package/neural-interface/skins/default/skin.css +90 -0
- package/neural-interface/skins/default/skin.json +8 -0
- package/neural-interface/templates/rulesets/README.md +9 -0
- package/neural-interface/templates/rulesets/claude.md +3 -0
- package/neural-interface/templates/rulesets/codex.md +2 -0
- package/neural-interface/templates/rulesets/coexistence.md +6 -0
- package/neural-interface/templates/rulesets/core.md +26 -0
- package/neural-interface/templates/rulesets/cursor.md +2 -0
- package/neural-interface/templates/rulesets/gemini.md +2 -0
- package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
- package/neural-interface/templates/rulesets/manifest.json +12 -0
- package/neural-interface/templates/rulesets/opencode.md +2 -0
- package/package.json +131 -53
- package/postinstall.js +55 -26
- package/preuninstall.js +187 -0
- package/scripts/restore-data-home-from-backup.mjs +239 -0
- package/setup.js +872 -260
- package/skills/leonardo/SKILL.md +19 -10
- package/skills/leonardo/modules/image-prompter.md +18 -12
- package/skills/leonardo/modules/video-prompter.md +19 -13
- package/skills/synabun/SKILL.md +209 -185
- package/skills/synabun/icon.png +0 -0
- package/skills/synabun/modules/audit.md +380 -374
- package/skills/synabun/modules/changelog.md +15 -6
- package/skills/synabun/modules/idea.md +148 -144
- package/skills/synabun/modules/memorize.md +13 -4
- package/skills/synabun/modules/schedule.md +198 -0
- package/skills/synabun/synabunicon.png +0 -0
- package/updater.cmd +31 -0
- package/updater.mjs +382 -0
- package/updater.sh +29 -0
- package/hooks/claude-code/test-user-learning.mjs +0 -531
- package/neural-interface/public/claude-chat.css +0 -878
- package/neural-interface/public/claude-chat.html +0 -92
- package/neural-interface/public/claude-chat.js +0 -1168
- package/neural-interface/public/index-legacy.html +0 -14677
- package/neural-interface/public/index2d-legacy.html +0 -8193
- package/neural-interface/public/shared/html-term-renderer.js +0 -1022
- package/neural-interface/public/variant/3d/background.js +0 -884
- package/neural-interface/public/variant/3d/camera.js +0 -661
- package/neural-interface/public/variant/3d/gfx.js +0 -116
- package/neural-interface/public/variant/3d/graph.js +0 -2399
- package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
- package/neural-interface/templates/CLAUDE-template.md +0 -211
|
@@ -0,0 +1,846 @@
|
|
|
1
|
+
// ── SDK event → view model (DOM-free) ──
|
|
2
|
+
// The monolith's handleTabEvent keeps the events that drive tab state (init,
|
|
3
|
+
// assistant, stream deltas, tool results, result accounting). Everything else an
|
|
4
|
+
// SDK session can emit is read here into a plain description; cp-event-rows.js
|
|
5
|
+
// turns that description into DOM. Nothing in this file touches the document, so
|
|
6
|
+
// tests import it directly (tests/claude-panel-events.test.mjs).
|
|
7
|
+
|
|
8
|
+
const clip = (s, n) => {
|
|
9
|
+
const t = String(s ?? '');
|
|
10
|
+
return t.length > n ? `${t.slice(0, n - 1)}…` : t;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
// ── Engine hello ──
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The connection's first message: whether the SDK bridge answers, and what it
|
|
17
|
+
* can do. It is the only engine: a server that answers with anything else (one
|
|
18
|
+
* that was not restarted and still has the retired per-turn engine selected)
|
|
19
|
+
* is a tab without an engine, and says so.
|
|
20
|
+
*/
|
|
21
|
+
export function readEngineHello(msg) {
|
|
22
|
+
const engine = String(msg?.engine || '');
|
|
23
|
+
const sdk = engine === 'sdk';
|
|
24
|
+
return {
|
|
25
|
+
engine,
|
|
26
|
+
sdk,
|
|
27
|
+
unavailable: !sdk,
|
|
28
|
+
error: sdk ? '' : (engine === 'unavailable'
|
|
29
|
+
? String(msg?.error || 'the engine did not start')
|
|
30
|
+
: `the server answered with ${engine ? `the retired "${engine}" engine` : 'no engine'}. Restart the SynaBun server.`),
|
|
31
|
+
sdkVersion: msg?.sdkVersion || '',
|
|
32
|
+
// A server that has not been restarted since the panel was updated sends no
|
|
33
|
+
// list: every capability-gated feature stays hidden.
|
|
34
|
+
capabilities: Array.isArray(msg?.capabilities) ? msg.capabilities.filter(c => typeof c === 'string') : [],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function hasCapability(tab, name) {
|
|
39
|
+
return !!tab?.capabilities && typeof tab.capabilities.has === 'function' && tab.capabilities.has(name);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// ── Slash commands: the panel or the CLI ──
|
|
43
|
+
// A typed "/cmd" is either answered by the panel or sent on as a prompt, where
|
|
44
|
+
// the CLI runs its own implementation. Before the parity build the CLI ran
|
|
45
|
+
// every command the panel had no entry for, and the ones below; a local handler
|
|
46
|
+
// that needs bridge support must not take a command away from a server that
|
|
47
|
+
// does not have that support yet (public/ reloads before lib/ restarts).
|
|
48
|
+
const CLI_NATIVE = new Set(['init', 'doctor']);
|
|
49
|
+
const LOCAL_NEEDS = { context: 'session_requests', mcp: 'session_requests', 'add-dir': 'session_settings' };
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 'cli' (send the text through) or 'local' (the panel's handler answers).
|
|
53
|
+
* @param spec the panel's own entry for the command (may carry `needs`), or null
|
|
54
|
+
*/
|
|
55
|
+
export function slashCommandRoute(cmd, spec, { has = () => false } = {}) {
|
|
56
|
+
if (!spec) return 'cli';
|
|
57
|
+
if (CLI_NATIVE.has(cmd)) return 'cli';
|
|
58
|
+
const needs = spec.needs || LOCAL_NEEDS[cmd];
|
|
59
|
+
return needs && !has(needs) ? 'cli' : 'local';
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ── Prompt buffering ──
|
|
63
|
+
// While a permission card, a question or an elicitation waits for the user,
|
|
64
|
+
// the tab holds every incoming message so nothing renders past the prompt.
|
|
65
|
+
// The messages that *resolve* a prompt must not be held, or the card waits for
|
|
66
|
+
// itself: a new or cancelled control request, a reattach, and the MCP server's
|
|
67
|
+
// confirmation that a URL elicitation was completed in the browser.
|
|
68
|
+
export function bypassesPromptBuffer(msg) {
|
|
69
|
+
const type = msg?.type;
|
|
70
|
+
if (type === 'control_request' || type === 'control_cancelled' || type === 'reattach_result') return true;
|
|
71
|
+
return type === 'event' && msg.event?.type === 'system' && msg.event?.subtype === 'elicitation_complete';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ── Session state ──
|
|
75
|
+
// `idle` is the CLI saying the turn is over. Normally the tab has finished by
|
|
76
|
+
// then (the result arrived). If it still shows a turn running a few seconds
|
|
77
|
+
// later, with nothing received since and no prompt waiting for the user, the
|
|
78
|
+
// message that ends it was lost: the tab is released instead of spinning on.
|
|
79
|
+
export function idleEndsTurn(tab, activityWhenIdle) {
|
|
80
|
+
if (!tab || tab.closed || !tab.running) return false;
|
|
81
|
+
if (tab.sessionState !== 'idle') return false;
|
|
82
|
+
if (tab._activePerm || tab.pendingAskRequestId || tab._msgBuffer?.length) return false;
|
|
83
|
+
return tab._lastWsActivity === activityWhenIdle;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ── Turn results ──
|
|
87
|
+
|
|
88
|
+
const TERMINAL_REASONS = {
|
|
89
|
+
blocking_limit: 'the context is full and could not be compacted',
|
|
90
|
+
rapid_refill_breaker: 'the context kept refilling right after compaction',
|
|
91
|
+
prompt_too_long: 'the prompt is too long for the model',
|
|
92
|
+
image_error: 'an image could not be processed',
|
|
93
|
+
model_error: 'the model returned an error',
|
|
94
|
+
api_error: 'the API returned an error',
|
|
95
|
+
malformed_tool_use_exhausted: 'the model kept sending malformed tool calls',
|
|
96
|
+
stop_hook_prevented: 'a Stop hook blocked the turn from ending',
|
|
97
|
+
hook_stopped: 'a hook stopped the turn',
|
|
98
|
+
tool_deferred: 'a tool call was deferred',
|
|
99
|
+
tool_deferred_unavailable: 'a deferred tool is no longer available',
|
|
100
|
+
max_turns: 'the turn limit was reached',
|
|
101
|
+
budget_exhausted: 'the spend limit was reached',
|
|
102
|
+
structured_output_retry_exhausted: 'structured output could not be produced',
|
|
103
|
+
turn_setup_failed: 'the turn could not be set up',
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const STARTUP_FAILURES = {
|
|
107
|
+
org_pin_api_key_conflict: 'Managed settings require an organization sign-in, but an API key is configured.',
|
|
108
|
+
provider_not_allowed: 'Managed settings do not allow the API provider this session is set up for.',
|
|
109
|
+
org_verify_failed: "The sign-in's organization could not be verified. Check the network, then sign in again.",
|
|
110
|
+
org_pin_mismatch: 'This sign-in belongs to an organization the managed settings do not allow.',
|
|
111
|
+
managed_settings_invalid: 'Managed policy settings could not be read or leave no allowed model.',
|
|
112
|
+
remote_settings_required_unavailable: 'Managed settings the organization requires could not be loaded.',
|
|
113
|
+
gateway_signin_required: 'The Cloud gateway ended this sign-in. Sign in again.',
|
|
114
|
+
gateway_access_denied: 'The Cloud gateway refused managed settings for this account.',
|
|
115
|
+
proxy_invalid: 'A proxy setting is not a complete URL.',
|
|
116
|
+
temp_dir_unusable: 'The temp directory is unsafe or could not be created.',
|
|
117
|
+
cwd_unavailable: 'The working directory was deleted, moved or cannot be read. Pick another project.',
|
|
118
|
+
shell_tool_missing: 'No shell tool is available (Git Bash or PowerShell).',
|
|
119
|
+
session_held_by_background: 'This conversation is running as a background session. Stop it there first.',
|
|
120
|
+
worktree_resume_refused: "The session's worktree failed its safety checks.",
|
|
121
|
+
worktree_unverified: "The session's worktree could not be verified right now. Retrying may work.",
|
|
122
|
+
cli_version_too_old: 'This Claude Code version is below the minimum Anthropic requires. Update Claude Code.',
|
|
123
|
+
bypass_root: 'Bypass permissions mode cannot run as root.',
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Why a turn ended. `text` is what the transcript shows for a failed turn
|
|
128
|
+
* (empty when there is nothing to add), `notify` what the notification should be.
|
|
129
|
+
* @param ev an SDK result message
|
|
130
|
+
* @param ctx { recentlyAborted, assistantErrorShown }
|
|
131
|
+
*/
|
|
132
|
+
export function describeResult(ev, ctx = {}) {
|
|
133
|
+
const subtype = String(ev?.subtype || '');
|
|
134
|
+
const reason = String(ev?.terminal_reason || '');
|
|
135
|
+
const errors = (Array.isArray(ev?.errors) ? ev.errors : []).map(e => String(e ?? '').trim()).filter(Boolean);
|
|
136
|
+
const out = { isError: false, aborted: false, text: '', notify: 'done', subtype, reason };
|
|
137
|
+
|
|
138
|
+
if (subtype === 'success' || subtype === '') {
|
|
139
|
+
if (ev?.is_error === true) {
|
|
140
|
+
// The turn ended on an API error. The CLI also delivers that text as a
|
|
141
|
+
// synthetic assistant message; do not print it twice.
|
|
142
|
+
out.isError = true;
|
|
143
|
+
out.notify = 'error';
|
|
144
|
+
if (!ctx.assistantErrorShown) out.text = clip(String(ev.result || 'The turn ended with an API error.').trim(), 1200);
|
|
145
|
+
}
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// The result an interrupt produces: the tab already says "Aborted."
|
|
150
|
+
if (reason.startsWith('aborted') || (ctx.recentlyAborted && !errors.length && !ev?.error && !ev?.startup_failure_reason)) {
|
|
151
|
+
out.aborted = true;
|
|
152
|
+
out.notify = 'none';
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
out.isError = true;
|
|
157
|
+
out.notify = 'error';
|
|
158
|
+
let head;
|
|
159
|
+
if (subtype === 'error_max_turns') {
|
|
160
|
+
head = `Stopped: the turn limit was reached${Number(ev?.num_turns) > 0 ? ` (${ev.num_turns} turns)` : ''}.`;
|
|
161
|
+
} else if (subtype === 'error_max_budget_usd') {
|
|
162
|
+
head = `Stopped: the session's spend limit was reached${Number(ev?.total_cost_usd) > 0 ? ` ($${Number(ev.total_cost_usd).toFixed(2)} so far)` : ''}.`;
|
|
163
|
+
} else if (subtype === 'error_max_structured_output_retries') {
|
|
164
|
+
head = 'Stopped: structured output could not be produced after several retries.';
|
|
165
|
+
} else if (ev?.startup_failure_reason) {
|
|
166
|
+
head = `Claude Code did not start: ${STARTUP_FAILURES[ev.startup_failure_reason] || ev.startup_failure_reason}`;
|
|
167
|
+
} else if (TERMINAL_REASONS[reason]) {
|
|
168
|
+
head = `The turn stopped: ${TERMINAL_REASONS[reason]}.`;
|
|
169
|
+
} else if (errors.length || ev?.error || ev?.result) {
|
|
170
|
+
head = '';
|
|
171
|
+
} else {
|
|
172
|
+
head = `The turn ended with an error${reason ? ` (${reason})` : ''}.`;
|
|
173
|
+
}
|
|
174
|
+
// `error` and a string `result` are not SDK fields on an error result; the
|
|
175
|
+
// bridge and older engines still send them.
|
|
176
|
+
const detail = errors.length
|
|
177
|
+
? errors.slice(0, 3).map(e => clip(e, 600))
|
|
178
|
+
: [ev?.error, typeof ev?.result === 'string' ? ev.result : ''].map(e => String(e || '').trim()).filter(Boolean).slice(0, 1).map(e => clip(e, 600));
|
|
179
|
+
const lines = [head, ...detail.filter(d => d && d !== head)].filter(Boolean);
|
|
180
|
+
if (errors.length > 3) lines.push(`(+${errors.length - 3} more)`);
|
|
181
|
+
out.text = lines.join('\n');
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ── Formatting ──
|
|
186
|
+
|
|
187
|
+
export function fmtTokens(n) {
|
|
188
|
+
const v = Number(n) || 0;
|
|
189
|
+
const trim = (x) => x.replace(/\.0$/, '');
|
|
190
|
+
if (v >= 1_000_000) return `${trim((v / 1_000_000).toFixed(v >= 10_000_000 ? 0 : 1))}M`;
|
|
191
|
+
if (v >= 1000) return `${trim((v / 1000).toFixed(v >= 100_000 ? 0 : 1))}k`;
|
|
192
|
+
return String(Math.round(v));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
export function fmtDuration(ms) {
|
|
196
|
+
const v = Number(ms);
|
|
197
|
+
if (!Number.isFinite(v) || v < 0) return '';
|
|
198
|
+
if (v < 1000) return `${Math.round(v)}ms`;
|
|
199
|
+
const s = v / 1000;
|
|
200
|
+
if (s < 60) return `${s.toFixed(s < 10 ? 1 : 0)}s`;
|
|
201
|
+
const m = Math.floor(s / 60);
|
|
202
|
+
if (m < 60) return `${m}m ${String(Math.floor(s % 60)).padStart(2, '0')}s`;
|
|
203
|
+
return `${Math.floor(m / 60)}h ${String(m % 60).padStart(2, '0')}m`;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** A reset time as the user reads it: "14:30", or "Mon 14:30" when it is another day. */
|
|
207
|
+
export function fmtResetTime(at, now = Date.now()) {
|
|
208
|
+
let ms = Number(at);
|
|
209
|
+
if (!Number.isFinite(ms) || ms <= 0) return '';
|
|
210
|
+
if (ms < 1e12) ms *= 1000; // the API reports seconds
|
|
211
|
+
const d = new Date(ms);
|
|
212
|
+
const pad = (x) => String(x).padStart(2, '0');
|
|
213
|
+
const clock = `${pad(d.getHours())}:${pad(d.getMinutes())}`;
|
|
214
|
+
const today = new Date(now);
|
|
215
|
+
const sameDay = d.getFullYear() === today.getFullYear() && d.getMonth() === today.getMonth() && d.getDate() === today.getDate();
|
|
216
|
+
return sameDay ? clock : `${['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][d.getDay()]} ${clock}`;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// CLI output meant for a terminal: drop the colour codes.
|
|
220
|
+
export function stripAnsi(s) {
|
|
221
|
+
// eslint-disable-next-line no-control-regex
|
|
222
|
+
return String(s ?? '').replace(/\u001b\[[0-9;?]*[ -/]*[@-~]/g, '');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ── Turn footer (duration, steps, per-model usage and cost) ──
|
|
226
|
+
|
|
227
|
+
const USAGE_FIELDS = ['inputTokens', 'outputTokens', 'cacheReadInputTokens', 'cacheCreationInputTokens', 'thinkingTokens', 'webSearchRequests', 'costUSD'];
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* result.modelUsage is cumulative for the CLI process. The turn's own share is
|
|
231
|
+
* the difference from the previous result; a counter that went down means the
|
|
232
|
+
* process was replaced (or /clear reset it), and then the new value is the share.
|
|
233
|
+
*/
|
|
234
|
+
export function turnModelUsage(modelUsage, prev = {}) {
|
|
235
|
+
const models = [];
|
|
236
|
+
const next = {};
|
|
237
|
+
for (const [model, cur] of Object.entries(modelUsage && typeof modelUsage === 'object' ? modelUsage : {})) {
|
|
238
|
+
if (!cur || typeof cur !== 'object') continue;
|
|
239
|
+
const before = prev?.[model] || {};
|
|
240
|
+
const snapshot = {};
|
|
241
|
+
const delta = {};
|
|
242
|
+
let reset = false;
|
|
243
|
+
for (const f of USAGE_FIELDS) {
|
|
244
|
+
snapshot[f] = Number(cur[f]) || 0;
|
|
245
|
+
delta[f] = snapshot[f] - (Number(before[f]) || 0);
|
|
246
|
+
if (delta[f] < -1e-9) reset = true;
|
|
247
|
+
}
|
|
248
|
+
if (reset) for (const f of USAGE_FIELDS) delta[f] = snapshot[f];
|
|
249
|
+
next[model] = snapshot;
|
|
250
|
+
const input = delta.inputTokens + delta.cacheReadInputTokens + delta.cacheCreationInputTokens;
|
|
251
|
+
if (input <= 0 && delta.outputTokens <= 0 && delta.costUSD <= 0) continue;
|
|
252
|
+
models.push({
|
|
253
|
+
model,
|
|
254
|
+
input,
|
|
255
|
+
uncachedInput: delta.inputTokens,
|
|
256
|
+
cacheRead: delta.cacheReadInputTokens,
|
|
257
|
+
cacheWrite: delta.cacheCreationInputTokens,
|
|
258
|
+
output: delta.outputTokens,
|
|
259
|
+
thinking: delta.thinkingTokens,
|
|
260
|
+
webSearches: delta.webSearchRequests,
|
|
261
|
+
cost: delta.costUSD,
|
|
262
|
+
costBasis: cur.costBasis || '',
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
models.sort((a, b) => b.cost - a.cost || b.output - a.output);
|
|
266
|
+
return { models, next };
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const shortModel = (id) => String(id || '').replace(/^claude-/, '').replace(/-\d{8}$/, '');
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* The line under a finished turn. `text` is empty when the result carries
|
|
273
|
+
* nothing worth a row; `next` is the usage snapshot to pass as `prev` next time.
|
|
274
|
+
*/
|
|
275
|
+
export function describeTurnFooter(ev, prev = {}, ctx = {}) {
|
|
276
|
+
const usage = turnModelUsage(ev?.modelUsage, prev || {});
|
|
277
|
+
const next = usage.next;
|
|
278
|
+
// A resumed session's first result already carries the earlier turns, and
|
|
279
|
+
// there is no previous result to subtract: say nothing about tokens or cost.
|
|
280
|
+
const models = ctx.noBaseline ? [] : usage.models;
|
|
281
|
+
const parts = [];
|
|
282
|
+
const duration = fmtDuration(ev?.duration_ms);
|
|
283
|
+
if (duration && Number(ev?.duration_ms) > 0) parts.push(duration);
|
|
284
|
+
const steps = Number(ev?.num_turns) || 0;
|
|
285
|
+
if (steps > 1) parts.push(`${steps} steps`);
|
|
286
|
+
if (models.length === 1) {
|
|
287
|
+
const m = models[0];
|
|
288
|
+
parts.push(`${shortModel(m.model)} ${fmtTokens(m.input)} in · ${fmtTokens(m.output)} out`);
|
|
289
|
+
} else if (models.length > 1) {
|
|
290
|
+
parts.push(`${models.length} models ${fmtTokens(models.reduce((n, m) => n + m.input, 0))} in · ${fmtTokens(models.reduce((n, m) => n + m.output, 0))} out`);
|
|
291
|
+
}
|
|
292
|
+
const cost = models.reduce((n, m) => n + m.cost, 0);
|
|
293
|
+
if (cost > 0) parts.push(`$${cost < 0.01 ? cost.toFixed(4) : cost.toFixed(2)}`);
|
|
294
|
+
if (ev?.fast_mode_state === 'on') parts.push('fast mode');
|
|
295
|
+
else if (ev?.fast_mode_state === 'cooldown') parts.push('fast mode cooling down');
|
|
296
|
+
const stop = ev?.stop_reason || ctx.stopReason || '';
|
|
297
|
+
if (stop === 'max_tokens') parts.push('cut off at the output limit');
|
|
298
|
+
const title = models.map((m) => {
|
|
299
|
+
const bits = [`${m.model}: ${m.uncachedInput.toLocaleString('en-US')} input`];
|
|
300
|
+
if (m.cacheRead) bits.push(`${m.cacheRead.toLocaleString('en-US')} cache read`);
|
|
301
|
+
if (m.cacheWrite) bits.push(`${m.cacheWrite.toLocaleString('en-US')} cache write`);
|
|
302
|
+
bits.push(`${m.output.toLocaleString('en-US')} output`);
|
|
303
|
+
if (m.thinking > 0) bits.push(`${m.thinking.toLocaleString('en-US')} of it thinking`);
|
|
304
|
+
if (m.webSearches > 0) bits.push(`${m.webSearches} web search${m.webSearches === 1 ? '' : 'es'}`);
|
|
305
|
+
if (m.cost > 0) bits.push(`$${m.cost.toFixed(4)}${m.costBasis && m.costBasis !== 'list' ? ` (${m.costBasis} pricing)` : ''}`);
|
|
306
|
+
return bits.join(', ');
|
|
307
|
+
}).join('\n');
|
|
308
|
+
return { text: parts.join(' · '), title, models, cost, next };
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/** A pass-through slash command that answered only through the result text. */
|
|
312
|
+
export function localCommandOutput(ev) {
|
|
313
|
+
if (!ev || ev.subtype !== 'success' || ev.is_error) return '';
|
|
314
|
+
if (typeof ev.local_command !== 'string' || !ev.local_command) return '';
|
|
315
|
+
return typeof ev.result === 'string' ? stripAnsi(ev.result).trim() : '';
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// ── Compaction ──
|
|
319
|
+
|
|
320
|
+
export function describeCompactBoundary(ev) {
|
|
321
|
+
const m = ev?.compact_metadata || {};
|
|
322
|
+
const pre = Number(m.pre_tokens) || 0;
|
|
323
|
+
const post = Number(m.post_tokens) || 0;
|
|
324
|
+
let text = `Context compacted${m.trigger === 'auto' ? ' automatically' : ''}`;
|
|
325
|
+
if (pre > 0 && post > 0) text += `: ${fmtTokens(pre)} → ${fmtTokens(post)} tokens`;
|
|
326
|
+
else if (pre > 0) text += `: was ${fmtTokens(pre)} tokens`;
|
|
327
|
+
if (Number(m.duration_ms) > 0) text += ` in ${fmtDuration(m.duration_ms)}`;
|
|
328
|
+
return text;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// ── Rate limits ──
|
|
332
|
+
|
|
333
|
+
const LIMIT_NAMES = {
|
|
334
|
+
five_hour: '5-hour limit',
|
|
335
|
+
seven_day: 'weekly limit',
|
|
336
|
+
seven_day_opus: 'weekly Opus limit',
|
|
337
|
+
seven_day_sonnet: 'weekly Sonnet limit',
|
|
338
|
+
seven_day_overage_included: 'weekly limit',
|
|
339
|
+
overage: 'extra usage limit',
|
|
340
|
+
};
|
|
341
|
+
const LIMIT_PILLS = { five_hour: '5h', seven_day: '7d', seven_day_opus: '7d Opus', seven_day_sonnet: '7d Sonnet', seven_day_overage_included: '7d', overage: 'extra' };
|
|
342
|
+
|
|
343
|
+
/** Read a rate_limit_event into a statusline pill and a transcript line. */
|
|
344
|
+
export function describeRateLimit(info, now = Date.now()) {
|
|
345
|
+
const i = info && typeof info === 'object' ? info : {};
|
|
346
|
+
const name = LIMIT_NAMES[i.rateLimitType] || 'usage limit';
|
|
347
|
+
const short = LIMIT_PILLS[i.rateLimitType] || 'limit';
|
|
348
|
+
const resets = fmtResetTime(i.resetsAt, now);
|
|
349
|
+
let pct = Number(i.utilization);
|
|
350
|
+
if (Number.isFinite(pct)) pct = Math.round(pct <= 1 ? pct * 100 : pct); else pct = null;
|
|
351
|
+
const overage = i.isUsingOverage === true || i.overageInUse === true;
|
|
352
|
+
const key = `${i.rateLimitType || ''}:${i.status || ''}:${overage ? 'overage' : ''}`;
|
|
353
|
+
const tail = resets ? ` Resets ${resets}.` : '';
|
|
354
|
+
|
|
355
|
+
if (i.status === 'rejected') {
|
|
356
|
+
let text = `You've hit your ${name}.${tail}`;
|
|
357
|
+
if (i.overageStatus === 'rejected') text += ' Extra usage is not available.';
|
|
358
|
+
else if (overage) text += ' Extra usage is covering requests.';
|
|
359
|
+
if (i.errorCode === 'credits_required') text += ' Usage credits are required to continue.';
|
|
360
|
+
return { level: 'blocked', pill: `${short} limit${resets ? ` · ${resets}` : ''}`, text, key };
|
|
361
|
+
}
|
|
362
|
+
if (i.status === 'allowed_warning') {
|
|
363
|
+
return {
|
|
364
|
+
level: 'warn',
|
|
365
|
+
pill: `${short}${pct != null ? ` ${pct}%` : ''}`,
|
|
366
|
+
text: `Approaching your ${name}${pct != null ? `: ${pct}% used` : ''}.${tail}`,
|
|
367
|
+
key,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
if (overage) {
|
|
371
|
+
return { level: 'warn', pill: 'extra usage', text: `Now using extra usage: your ${name} is used up.${tail}`, key };
|
|
372
|
+
}
|
|
373
|
+
return { level: 'ok', pill: '', text: '', key };
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// The CLI's own limit sentences arrive as ordinary assistant text. These are the
|
|
377
|
+
// prefixes the SDK exports for recognising them (sdk.d.ts USAGE_*_PREFIXES,
|
|
378
|
+
// ORG_POLICY_LIMIT_PREFIXES); a host cannot import the SDK into a browser page.
|
|
379
|
+
const USAGE_LIMIT_ERROR_PREFIXES = ["You've hit your", "You've reached your", "You're out of usage credits", 'Your org is out of usage · add funds to continue', 'Your org is out of usage · contact your admin', "Your seat type doesn't include usage credits", "Your seat type doesn't include usage", 'Your usage allocation has been disabled by your admin', "Your group's usage limit is set to $0", 'Fable 5 requires usage credits', "You're out of extra usage", "Your seat type doesn't include extra usage"];
|
|
380
|
+
const USAGE_TRANSITION_PREFIXES = ["You're now using usage credits", "You're now using your usage allocation", 'Now using your usage allocation', 'Now using usage credits', "You're now using extra usage", 'Now using extra usage'];
|
|
381
|
+
const USAGE_WARNING_PREFIXES = ["You've used", "You're close to"];
|
|
382
|
+
const ORG_POLICY_LIMIT_PREFIXES = ['This service is disabled for your org'];
|
|
383
|
+
|
|
384
|
+
/** `blocked` | `warn` | `notice` for a limit sentence, else ''. */
|
|
385
|
+
export function classifyLimitText(text) {
|
|
386
|
+
const t = String(text || '').trimStart();
|
|
387
|
+
if (!t) return '';
|
|
388
|
+
const starts = (list) => list.some(p => t.startsWith(p));
|
|
389
|
+
if (starts(USAGE_LIMIT_ERROR_PREFIXES) || starts(ORG_POLICY_LIMIT_PREFIXES)) return 'blocked';
|
|
390
|
+
if (starts(USAGE_WARNING_PREFIXES)) return 'warn';
|
|
391
|
+
if (starts(USAGE_TRANSITION_PREFIXES)) return 'notice';
|
|
392
|
+
return '';
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// ── Assistant message state ──
|
|
396
|
+
|
|
397
|
+
const ASSISTANT_ERRORS = {
|
|
398
|
+
authentication_failed: ['Not signed in', 'The sign-in is missing or expired. Run `claude` in a terminal and use /login, then send again.'],
|
|
399
|
+
oauth_org_not_allowed: ['Organization not allowed', "This sign-in's organization is not allowed to use Claude Code here."],
|
|
400
|
+
account_on_hold: ['Account on hold', 'The account is on hold. Check billing on claude.ai.'],
|
|
401
|
+
verification_required: ['Verification required', 'Finish the account verification on claude.ai, then send again.'],
|
|
402
|
+
billing_error: ['Billing problem', 'Check the payment method or the remaining credits.'],
|
|
403
|
+
rate_limit: ['Rate limited', 'Wait for the limit to reset, or switch to another model.'],
|
|
404
|
+
overloaded: ['API overloaded', 'The API is overloaded. Send again in a moment.'],
|
|
405
|
+
invalid_request: ['Request rejected', 'The API rejected the request as invalid.'],
|
|
406
|
+
model_not_found: ['Model not available', 'This model is not available to the account. Pick another model.'],
|
|
407
|
+
server_error: ['API error', 'The API had a server error. Send again in a moment.'],
|
|
408
|
+
max_output_tokens: ['Output limit reached', 'The reply hit the output limit and was cut off.'],
|
|
409
|
+
cloud_credential_error: ['Cloud credentials', 'The cloud provider credentials are missing or expired.'],
|
|
410
|
+
unknown: ['Error', ''],
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
const blockText = (message) => (Array.isArray(message?.content) ? message.content : [])
|
|
414
|
+
.filter(b => b?.type === 'text').map(b => b.text || '').join('\n');
|
|
415
|
+
|
|
416
|
+
/** What the wrapper of an assistant message says beyond its content blocks. */
|
|
417
|
+
export function describeAssistantState(ev) {
|
|
418
|
+
const message = ev?.message || {};
|
|
419
|
+
const out = { error: null, aborted: ev?.aborted === true, truncated: message.stop_reason === 'max_tokens', timestamp: '', limit: '', uuid: ev?.uuid || '', supersedes: [] };
|
|
420
|
+
if (ev?.error) {
|
|
421
|
+
const [title, hint] = ASSISTANT_ERRORS[ev.error] || [String(ev.error).replace(/_/g, ' '), ''];
|
|
422
|
+
out.error = { kind: String(ev.error), title, hint };
|
|
423
|
+
if (ev.error === 'max_output_tokens') out.truncated = true;
|
|
424
|
+
}
|
|
425
|
+
if (typeof ev?.timestamp === 'string' && !Number.isNaN(Date.parse(ev.timestamp))) out.timestamp = ev.timestamp;
|
|
426
|
+
if (Array.isArray(ev?.supersedes)) out.supersedes = ev.supersedes.filter(u => typeof u === 'string');
|
|
427
|
+
// Limit sentences come as synthetic messages (no real model behind them).
|
|
428
|
+
if (ev?.error || message.model === '<synthetic>') out.limit = classifyLimitText(blockText(message));
|
|
429
|
+
return out;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
const httpUrl = (u) => (typeof u === 'string' && /^https?:\/\//i.test(u) ? u : '');
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* The blocks of an assistant message the three classic kinds (text, thinking,
|
|
436
|
+
* tool_use) do not cover: server-side tool calls and their results, citations
|
|
437
|
+
* on text, redacted thinking.
|
|
438
|
+
*/
|
|
439
|
+
export function splitAssistantBlocks(content) {
|
|
440
|
+
const out = { serverTools: [], serverResults: [], citations: [], redacted: 0, any: false };
|
|
441
|
+
const seen = new Set();
|
|
442
|
+
for (const b of Array.isArray(content) ? content : []) {
|
|
443
|
+
if (!b || typeof b !== 'object') continue;
|
|
444
|
+
if (b.type === 'redacted_thinking') { out.redacted++; continue; }
|
|
445
|
+
if (b.type === 'server_tool_use' || b.type === 'mcp_tool_use') {
|
|
446
|
+
if (b.id) out.serverTools.push({ id: b.id, name: b.server_name ? `${b.server_name}: ${b.name}` : String(b.name || 'server tool'), input: b.input && typeof b.input === 'object' ? b.input : {} });
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
if (typeof b.type === 'string' && b.type !== 'tool_result' && b.type.endsWith('_tool_result') && b.tool_use_id) {
|
|
450
|
+
const links = [];
|
|
451
|
+
const texts = [];
|
|
452
|
+
let isError = b.is_error === true;
|
|
453
|
+
const visit = (c) => {
|
|
454
|
+
if (c == null) return;
|
|
455
|
+
if (typeof c === 'string') { if (c.trim()) texts.push(c.trim()); return; }
|
|
456
|
+
if (Array.isArray(c)) { c.forEach(visit); return; }
|
|
457
|
+
if (typeof c !== 'object') return;
|
|
458
|
+
if (c.error_code) { isError = true; texts.push(`Error: ${c.error_code}`); return; }
|
|
459
|
+
const url = httpUrl(c.url);
|
|
460
|
+
if (url) { links.push({ title: String(c.title || url), url }); return; }
|
|
461
|
+
for (const k of ['text', 'stdout', 'stderr']) if (typeof c[k] === 'string' && c[k].trim()) texts.push(c[k].trim());
|
|
462
|
+
if (c.content != null) visit(c.content);
|
|
463
|
+
};
|
|
464
|
+
visit(b.content);
|
|
465
|
+
out.serverResults.push({ toolUseId: b.tool_use_id, kind: b.type, links, text: clip(texts.join('\n'), 4000), isError });
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
if (b.type === 'text' && Array.isArray(b.citations)) {
|
|
469
|
+
for (const c of b.citations) {
|
|
470
|
+
const url = httpUrl(c?.url);
|
|
471
|
+
const title = String(c?.title || c?.document_title || url || '').trim();
|
|
472
|
+
const key = url || title;
|
|
473
|
+
if (!key || seen.has(key)) continue;
|
|
474
|
+
seen.add(key);
|
|
475
|
+
out.citations.push({ title: title || url, url });
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
out.any = out.redacted > 0 || out.serverTools.length > 0 || out.serverResults.length > 0 || out.citations.length > 0;
|
|
480
|
+
return out;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// ── Streaming tool input ──
|
|
484
|
+
|
|
485
|
+
const PREVIEW_KEYS = ['command', 'file_path', 'notebook_path', 'pattern', 'url', 'query', 'description', 'skill', 'path', 'prompt'];
|
|
486
|
+
|
|
487
|
+
/**
|
|
488
|
+
* What a tool call is about, read from the JSON the model has typed so far
|
|
489
|
+
* (input_json_delta). The JSON is incomplete by definition: pull the first
|
|
490
|
+
* telling string field out with a tolerant match instead of parsing it.
|
|
491
|
+
*/
|
|
492
|
+
export function previewPartialToolInput(partialJson) {
|
|
493
|
+
const src = String(partialJson || '');
|
|
494
|
+
for (const key of PREVIEW_KEYS) {
|
|
495
|
+
const m = src.match(new RegExp(`"${key}"\\s*:\\s*"((?:[^"\\\\]|\\\\.)*)`));
|
|
496
|
+
if (!m || !m[1]) continue;
|
|
497
|
+
let value = m[1];
|
|
498
|
+
try { value = JSON.parse(`"${value.replace(/\\$/, '')}"`); } catch { value = value.replace(/\\n/g, ' ').replace(/\\(.)/g, '$1'); }
|
|
499
|
+
value = String(value).split('\n')[0].trim();
|
|
500
|
+
if (!value) continue;
|
|
501
|
+
if (key === 'file_path' || key === 'notebook_path' || key === 'path') value = value.split(/[/\\]/).pop() || value;
|
|
502
|
+
return { key, value: clip(value, 60) };
|
|
503
|
+
}
|
|
504
|
+
return null;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// ── Slash commands ──
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* The CLI's command list as the hint menu uses it. Rows can share a name: the
|
|
511
|
+
* one marked `builtin` is the one `/name` runs. Commands whose UX is bound to
|
|
512
|
+
* the terminal (init.terminal_slash_commands) are left out.
|
|
513
|
+
*/
|
|
514
|
+
export function normalizeSlashCommands(list, { terminalOnly = [] } = {}) {
|
|
515
|
+
const hidden = new Set((Array.isArray(terminalOnly) ? terminalOnly : []).map(n => String(n).replace(/^\//, '').toLowerCase()));
|
|
516
|
+
const byName = new Map();
|
|
517
|
+
for (const raw of Array.isArray(list) ? list : []) {
|
|
518
|
+
const c = typeof raw === 'string' ? { name: raw } : raw;
|
|
519
|
+
if (!c?.name) continue;
|
|
520
|
+
const name = String(c.name).replace(/^\//, '');
|
|
521
|
+
const key = name.toLowerCase();
|
|
522
|
+
if (hidden.has(key)) continue;
|
|
523
|
+
const row = {
|
|
524
|
+
name,
|
|
525
|
+
description: c.description || 'CLI command',
|
|
526
|
+
argumentHint: c.argumentHint || c.argument_hint || '',
|
|
527
|
+
aliases: (Array.isArray(c.aliases) ? c.aliases : []).map(a => String(a).replace(/^\//, '')).filter(Boolean),
|
|
528
|
+
builtin: c.builtin === true,
|
|
529
|
+
};
|
|
530
|
+
const existing = byName.get(key);
|
|
531
|
+
if (!existing || (row.builtin && !existing.builtin)) byName.set(key, row);
|
|
532
|
+
}
|
|
533
|
+
return [...byName.values()];
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/** Commands whose name or alias starts with what was typed; `via` names the alias that matched. */
|
|
537
|
+
export function matchSlashCommands(list, typed) {
|
|
538
|
+
const q = String(typed || '').toLowerCase();
|
|
539
|
+
if (!q) return [];
|
|
540
|
+
const out = [];
|
|
541
|
+
for (const c of Array.isArray(list) ? list : []) {
|
|
542
|
+
const name = String(c?.name || '').toLowerCase();
|
|
543
|
+
if (!name) continue;
|
|
544
|
+
if (name.startsWith(q)) { out.push({ ...c, via: '' }); continue; }
|
|
545
|
+
const alias = (c.aliases || []).find(a => String(a).toLowerCase().startsWith(q));
|
|
546
|
+
if (alias) out.push({ ...c, via: alias });
|
|
547
|
+
}
|
|
548
|
+
return out;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/** A bare "/" lists every command, as the CLI does: one row per name, in list order. */
|
|
552
|
+
export function listSlashCommands(list) {
|
|
553
|
+
const out = [];
|
|
554
|
+
const seen = new Set();
|
|
555
|
+
for (const c of Array.isArray(list) ? list : []) {
|
|
556
|
+
const name = String(c?.name || '').toLowerCase();
|
|
557
|
+
if (!name || seen.has(name)) continue;
|
|
558
|
+
seen.add(name);
|
|
559
|
+
out.push({ ...c, via: '' });
|
|
560
|
+
}
|
|
561
|
+
return out;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* How tall the slash menu may be: `room` is the space between the top of the
|
|
566
|
+
* panel and the input the menu opens above. The whole list scrolls inside that,
|
|
567
|
+
* so it never leaves the panel; two rows stay visible in the shortest panel.
|
|
568
|
+
*/
|
|
569
|
+
export function slashMenuMaxHeight(room, { cap = 320, floor = 72, gap = 8 } = {}) {
|
|
570
|
+
const r = Number(room);
|
|
571
|
+
if (!Number.isFinite(r) || r <= 0) return cap; // not laid out (hidden panel): the stylesheet's cap
|
|
572
|
+
return Math.max(floor, Math.min(cap, Math.floor(r - gap)));
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* The panel's own commands a server can serve, and the ones that wait for its
|
|
577
|
+
* restart (their `needs` capability is not advertised).
|
|
578
|
+
*/
|
|
579
|
+
export function splitCommandsByCapability(commands, has = () => false) {
|
|
580
|
+
const available = [];
|
|
581
|
+
const locked = [];
|
|
582
|
+
for (const c of Array.isArray(commands) ? commands : []) (c?.needs && !has(c.needs) ? locked : available).push(c);
|
|
583
|
+
return { available, locked };
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// ── Session info (init) ──
|
|
587
|
+
|
|
588
|
+
/** The fields of system/init the status card and the slash menu read. */
|
|
589
|
+
export function readInit(ev) {
|
|
590
|
+
const list = (v) => (Array.isArray(v) ? v : []);
|
|
591
|
+
return {
|
|
592
|
+
model: ev?.model || '',
|
|
593
|
+
cliVersion: ev?.claude_code_version || '',
|
|
594
|
+
cwd: ev?.cwd || '',
|
|
595
|
+
apiKeySource: ev?.apiKeySource || '',
|
|
596
|
+
outputStyle: ev?.output_style || '',
|
|
597
|
+
permissionMode: ev?.permissionMode || '',
|
|
598
|
+
effort: ev?.effort ?? null,
|
|
599
|
+
fastMode: ev?.fast_mode_state || '',
|
|
600
|
+
tools: list(ev?.tools).length,
|
|
601
|
+
skills: list(ev?.skills),
|
|
602
|
+
agents: list(ev?.agents),
|
|
603
|
+
plugins: list(ev?.plugins).map(p => ({ name: p?.name || '', version: p?.version || '' })).filter(p => p.name),
|
|
604
|
+
pluginErrors: list(ev?.plugin_errors).map(e => ({ plugin: e?.plugin || '', type: e?.type || '', message: e?.message || '' })).filter(e => e.plugin || e.message),
|
|
605
|
+
mcpServers: list(ev?.mcp_servers).map(s => ({ name: s?.name || '', status: s?.status || '', source: s?.source || '' })).filter(s => s.name),
|
|
606
|
+
terminalSlashCommands: list(ev?.terminal_slash_commands),
|
|
607
|
+
capabilities: list(ev?.capabilities),
|
|
608
|
+
betas: list(ev?.betas),
|
|
609
|
+
};
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
const KEY_SOURCES = { none: 'claude.ai sign-in', ANTHROPIC_API_KEY: 'ANTHROPIC_API_KEY (environment)', apiKeyHelper: 'apiKeyHelper', '/login managed key': 'Console key from /login' };
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Rows of the /status card: [label, value, tone]. `init` is readInit()'s output
|
|
616
|
+
* (null before the first turn), `account` the bridge's account info when it sent one.
|
|
617
|
+
*/
|
|
618
|
+
export function statusRows({ init = null, account = null, tab = {} } = {}) {
|
|
619
|
+
const rows = [];
|
|
620
|
+
const add = (k, v, tone = '') => { if (v !== '' && v != null) rows.push([k, String(v), tone]); };
|
|
621
|
+
add('Session', tab.sessionId ? `${tab.sessionId}${tab.label ? ` · ${tab.label}` : ''}` : '(new)');
|
|
622
|
+
if (!init) {
|
|
623
|
+
add('Details', 'Send a message to start the session; its details appear here afterwards.', 'muted');
|
|
624
|
+
return rows;
|
|
625
|
+
}
|
|
626
|
+
add('Model', init.model);
|
|
627
|
+
add('Claude Code', init.cliVersion + (tab.sdkVersion ? ` · SDK ${tab.sdkVersion}` : ''));
|
|
628
|
+
add('Working directory', init.cwd);
|
|
629
|
+
if (account?.email || account?.organization) add('Account', [account.email, account.organization, account.subscriptionType].filter(Boolean).join(' · '));
|
|
630
|
+
add('Credential', KEY_SOURCES[init.apiKeySource] || init.apiKeySource);
|
|
631
|
+
add('Permission mode', init.permissionMode);
|
|
632
|
+
if (init.effort) add('Effort', init.effort);
|
|
633
|
+
if (init.fastMode && init.fastMode !== 'off') add('Fast mode', init.fastMode);
|
|
634
|
+
if (init.outputStyle && init.outputStyle !== 'default') add('Output style', init.outputStyle);
|
|
635
|
+
add('Tools', init.tools ? `${init.tools}` : '');
|
|
636
|
+
if (init.mcpServers.length) {
|
|
637
|
+
const bad = init.mcpServers.filter(s => !/connect|ok|ready|running/i.test(s.status));
|
|
638
|
+
add('MCP servers', init.mcpServers.map(s => `${s.name} (${s.status || 'unknown'})`).join(', '), bad.length ? 'warn' : 'ok');
|
|
639
|
+
}
|
|
640
|
+
if (init.skills.length) add('Skills', `${init.skills.length}`);
|
|
641
|
+
if (init.agents.length) add('Agents', init.agents.join(', '));
|
|
642
|
+
if (init.plugins.length) add('Plugins', init.plugins.map(p => (p.version ? `${p.name} ${p.version}` : p.name)).join(', '));
|
|
643
|
+
for (const e of init.pluginErrors) add('Plugin error', `${e.plugin || 'plugin'}: ${e.message || e.type}`, 'warn');
|
|
644
|
+
if (tab.turns != null) add('Turns', `${tab.turns}`);
|
|
645
|
+
if (Number(tab.sessionCost) > 0) add('Cost', `$${Number(tab.sessionCost).toFixed(4)}`);
|
|
646
|
+
return rows;
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// ── Everything else ──
|
|
650
|
+
|
|
651
|
+
/** `type/subtype`, the name an event is logged and deduplicated under. */
|
|
652
|
+
export function eventLabel(ev) {
|
|
653
|
+
const type = String(ev?.type || 'unknown');
|
|
654
|
+
return ev?.subtype ? `${type}/${ev.subtype}` : type;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Liveness and bookkeeping frames with nothing to show.
|
|
658
|
+
const IGNORED = new Set([
|
|
659
|
+
'keep_alive',
|
|
660
|
+
'system/worker_shutting_down',
|
|
661
|
+
'system/mirror_error',
|
|
662
|
+
'system/control_request_progress',
|
|
663
|
+
]);
|
|
664
|
+
|
|
665
|
+
const RESET_TRIGGERS = { clear: 'Conversation cleared', plan_mode_exit: 'Conversation cleared to implement the plan', fresh_session: 'Fresh session started for the approved plan', onboarding: 'Conversation reset' };
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Describe an event the monolith's own branches did not consume. The `kind`
|
|
669
|
+
* says which renderer of cp-event-rows.js takes it; `unknown` is the fallback
|
|
670
|
+
* for types this panel has no renderer for.
|
|
671
|
+
*/
|
|
672
|
+
export function describeEvent(ev) {
|
|
673
|
+
const label = eventLabel(ev);
|
|
674
|
+
if (IGNORED.has(label)) return { kind: 'ignore', label };
|
|
675
|
+
switch (label) {
|
|
676
|
+
case 'system/informational': {
|
|
677
|
+
const text = stripAnsi(ev.content).trim();
|
|
678
|
+
if (!text) return { kind: 'ignore', label };
|
|
679
|
+
const level = ev.prevent_continuation ? 'warn'
|
|
680
|
+
: ev.level === 'warning' ? 'warn'
|
|
681
|
+
: ev.level === 'suggestion' ? 'notice'
|
|
682
|
+
: ev.level === 'info' ? 'transcript' : 'status';
|
|
683
|
+
return { kind: 'row', label, level, text: clip(text, 1500), key: ev.tool_use_id ? `info:${ev.tool_use_id}` : '' };
|
|
684
|
+
}
|
|
685
|
+
case 'system/notification': {
|
|
686
|
+
const text = stripAnsi(ev.text).trim();
|
|
687
|
+
if (!text) return { kind: 'ignore', label };
|
|
688
|
+
const loud = ev.priority === 'high' || ev.priority === 'immediate';
|
|
689
|
+
return { kind: 'row', label, level: loud ? 'warn' : 'status', text: clip(text, 800), key: ev.key ? `notif:${ev.key}` : '' };
|
|
690
|
+
}
|
|
691
|
+
case 'system/api_retry': {
|
|
692
|
+
const attempt = Number(ev.attempt) || 1;
|
|
693
|
+
const max = Number(ev.max_retries) || 0;
|
|
694
|
+
const why = ev.error && ev.error !== 'unknown' ? String(ev.error).replace(/_/g, ' ') : (ev.error_status ? `HTTP ${ev.error_status}` : (ev.no_response ? 'no response' : 'connection error'));
|
|
695
|
+
const wait = Number(ev.retry_delay_ms) > 0 ? fmtDuration(ev.retry_delay_ms) : '';
|
|
696
|
+
const count = max ? `${attempt}/${max}` : `${attempt}`;
|
|
697
|
+
return {
|
|
698
|
+
kind: 'retry', label,
|
|
699
|
+
verb: `Retrying ${count} · ${why}`,
|
|
700
|
+
text: `API request failed (${why}${ev.error_status ? `, ${ev.error_status}` : ''}). Retry ${count}${wait ? ` in ${wait}` : ''}.`,
|
|
701
|
+
key: 'api_retry',
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
case 'system/status':
|
|
705
|
+
return {
|
|
706
|
+
kind: 'status', label,
|
|
707
|
+
status: ev.status ?? null,
|
|
708
|
+
permissionMode: typeof ev.permissionMode === 'string' ? ev.permissionMode : '',
|
|
709
|
+
compactResult: ev.compact_result || '',
|
|
710
|
+
compactError: ev.compact_error ? clip(ev.compact_error, 600) : '',
|
|
711
|
+
};
|
|
712
|
+
case 'system/local_command_output': {
|
|
713
|
+
const text = stripAnsi(ev.content).trim();
|
|
714
|
+
return text ? { kind: 'command_output', label, text } : { kind: 'ignore', label };
|
|
715
|
+
}
|
|
716
|
+
case 'system/permission_denied':
|
|
717
|
+
return {
|
|
718
|
+
kind: 'denied', label,
|
|
719
|
+
toolUseId: ev.tool_use_id || '',
|
|
720
|
+
toolName: ev.tool_name || '',
|
|
721
|
+
reasonType: ev.decision_reason_type || '',
|
|
722
|
+
reason: clip(ev.decision_reason || ev.message || '', 400),
|
|
723
|
+
agentId: ev.agent_id || '',
|
|
724
|
+
};
|
|
725
|
+
case 'rate_limit_event':
|
|
726
|
+
return { kind: 'rate_limit', label, info: ev.rate_limit_info || {} };
|
|
727
|
+
case 'system/model_refusal_fallback':
|
|
728
|
+
case 'system/model_refusal_no_fallback': {
|
|
729
|
+
const fallback = ev.subtype === 'model_refusal_fallback';
|
|
730
|
+
const local = ev.scope === 'local';
|
|
731
|
+
const lines = [stripAnsi(ev.content).trim()];
|
|
732
|
+
if (fallback && ev.direction === 'retry') {
|
|
733
|
+
lines.push(local
|
|
734
|
+
? `That response came from ${ev.fallback_model}; the session stays on ${ev.original_model}.`
|
|
735
|
+
: `The session continues on ${ev.fallback_model} (was ${ev.original_model}).`);
|
|
736
|
+
}
|
|
737
|
+
if (ev.api_refusal_explanation) lines.push(clip(String(ev.api_refusal_explanation), 600));
|
|
738
|
+
return {
|
|
739
|
+
kind: 'refusal', label,
|
|
740
|
+
text: lines.filter(Boolean).join('\n') || 'The model declined this request.',
|
|
741
|
+
category: ev.api_refusal_category || '',
|
|
742
|
+
retracted: Array.isArray(ev.retracted_message_uuids) ? ev.retracted_message_uuids : [],
|
|
743
|
+
refusedUserUuid: ev.refused_user_message_uuid || '',
|
|
744
|
+
fallbackModel: fallback ? (ev.fallback_model || '') : '',
|
|
745
|
+
sessionModelChanged: fallback && !local && ev.direction === 'retry',
|
|
746
|
+
};
|
|
747
|
+
}
|
|
748
|
+
case 'system/session_info':
|
|
749
|
+
return { kind: 'session_info', label, info: ev.info && typeof ev.info === 'object' ? ev.info : {} };
|
|
750
|
+
case 'system/hook_started':
|
|
751
|
+
return { kind: 'hook', label, phase: 'started', id: ev.hook_id || '', ev };
|
|
752
|
+
case 'system/hook_progress':
|
|
753
|
+
return { kind: 'ignore', label }; // the response carries the whole output
|
|
754
|
+
case 'system/hook_response':
|
|
755
|
+
return { kind: 'hook', label, phase: 'done', id: ev.hook_id || '', ev };
|
|
756
|
+
case 'system/task_started':
|
|
757
|
+
case 'system/task_progress':
|
|
758
|
+
case 'system/task_updated':
|
|
759
|
+
case 'system/task_notification':
|
|
760
|
+
return { kind: 'task', label, ev };
|
|
761
|
+
case 'system/cache_cost':
|
|
762
|
+
return { kind: 'cache_cost', label, ev };
|
|
763
|
+
case 'system/session_crons':
|
|
764
|
+
return { kind: 'crons', label, crons: Array.isArray(ev.crons) ? ev.crons : [] };
|
|
765
|
+
case 'system/session_state_changed':
|
|
766
|
+
// The CLI's own word: running, idle (the turn is over), requires_action
|
|
767
|
+
// (it waits for an answer). The bridge reads it for its turn accounting too.
|
|
768
|
+
return ['running', 'idle', 'requires_action'].includes(ev.state) ? { kind: 'session_state', label, state: ev.state } : { kind: 'ignore', label };
|
|
769
|
+
case 'prompt_suggestion': {
|
|
770
|
+
const text = String(ev.suggestion || '').trim();
|
|
771
|
+
return text ? { kind: 'suggestion', label, text: clip(text, 400) } : { kind: 'ignore', label };
|
|
772
|
+
}
|
|
773
|
+
case 'system/plugins_list':
|
|
774
|
+
return {
|
|
775
|
+
kind: 'plugins', label,
|
|
776
|
+
plugins: (Array.isArray(ev.plugins) ? ev.plugins : []).map(p => ({ name: p?.name || '', version: p?.version || '' })).filter(p => p.name),
|
|
777
|
+
agents: Array.isArray(ev.agents) ? ev.agents : null,
|
|
778
|
+
};
|
|
779
|
+
case 'system/commands_changed':
|
|
780
|
+
return { kind: 'commands', label, commands: Array.isArray(ev.commands) ? ev.commands : [] };
|
|
781
|
+
case 'tool_progress':
|
|
782
|
+
return {
|
|
783
|
+
kind: 'tool_progress', label,
|
|
784
|
+
toolUseId: ev.tool_use_id || '',
|
|
785
|
+
elapsed: Number(ev.elapsed_time_seconds) || 0,
|
|
786
|
+
retry: ev.subagent_retry
|
|
787
|
+
? `retrying ${ev.subagent_retry.attempt}/${ev.subagent_retry.max_retries}${ev.subagent_retry.error_category ? ` (${String(ev.subagent_retry.error_category).replace(/_/g, ' ')})` : ''}`
|
|
788
|
+
: '',
|
|
789
|
+
};
|
|
790
|
+
case 'system/thinking_tokens':
|
|
791
|
+
return { kind: 'thinking_tokens', label, tokens: Number(ev.estimated_tokens) || 0 };
|
|
792
|
+
case 'tool_use_summary': {
|
|
793
|
+
const text = String(ev.summary || '').trim();
|
|
794
|
+
return text
|
|
795
|
+
? { kind: 'summary', label, text: clip(text, 400), toolUseIds: Array.isArray(ev.preceding_tool_use_ids) ? ev.preceding_tool_use_ids : [] }
|
|
796
|
+
: { kind: 'ignore', label };
|
|
797
|
+
}
|
|
798
|
+
case 'system/memory_recall': {
|
|
799
|
+
const memories = (Array.isArray(ev.memories) ? ev.memories : []).map(m => ({
|
|
800
|
+
path: String(m?.path || ''), scope: m?.scope || 'personal', content: typeof m?.content === 'string' ? clip(m.content, 2000) : '',
|
|
801
|
+
})).filter(m => m.path || m.content);
|
|
802
|
+
if (!memories.length) return { kind: 'ignore', label };
|
|
803
|
+
return {
|
|
804
|
+
kind: 'memory_recall', label, memories,
|
|
805
|
+
text: ev.mode === 'synthesize'
|
|
806
|
+
? 'Recalled from Claude memory (summary)'
|
|
807
|
+
: `Recalled ${memories.length} Claude memory file${memories.length === 1 ? '' : 's'}`,
|
|
808
|
+
};
|
|
809
|
+
}
|
|
810
|
+
case 'conversation_reset':
|
|
811
|
+
return { kind: 'reset', label, text: RESET_TRIGGERS[ev.trigger] || 'Conversation reset', timestamp: ev.timestamp || '', newConversationId: ev.new_conversation_id || '' };
|
|
812
|
+
case 'auth_status': {
|
|
813
|
+
const output = (Array.isArray(ev.output) ? ev.output : []).map(l => stripAnsi(l)).filter(l => l.trim());
|
|
814
|
+
return { kind: 'auth', label, authenticating: ev.isAuthenticating === true, text: output.join('\n'), error: ev.error ? String(ev.error) : '' };
|
|
815
|
+
}
|
|
816
|
+
case 'system/elicitation_complete':
|
|
817
|
+
return { kind: 'row', label, level: 'status', text: `${ev.mcp_server_name || 'MCP server'}: sign-in step completed.`, key: '', elicitationId: ev.elicitation_id || '' };
|
|
818
|
+
case 'system/plugin_install': {
|
|
819
|
+
const name = ev.name ? ` ${ev.name}` : '';
|
|
820
|
+
const text = ev.status === 'started' ? 'Installing plugins…'
|
|
821
|
+
: ev.status === 'installed' ? `Plugin marketplace${name} installed.`
|
|
822
|
+
: ev.status === 'failed' ? `Plugin install failed${name ? ` for${name}` : ''}${ev.error ? `: ${clip(ev.error, 300)}` : '.'}`
|
|
823
|
+
: 'Plugin install finished.';
|
|
824
|
+
return { kind: 'row', label, level: ev.status === 'failed' ? 'warn' : 'status', text, key: ev.status === 'failed' ? '' : 'plugin_install' };
|
|
825
|
+
}
|
|
826
|
+
case 'system/files_persisted': {
|
|
827
|
+
const ok = Array.isArray(ev.files) ? ev.files.length : 0;
|
|
828
|
+
const failed = Array.isArray(ev.failed) ? ev.failed : [];
|
|
829
|
+
if (!ok && !failed.length) return { kind: 'ignore', label };
|
|
830
|
+
const parts = [];
|
|
831
|
+
if (ok) parts.push(`${ok} file${ok === 1 ? '' : 's'} saved`);
|
|
832
|
+
if (failed.length) parts.push(`${failed.length} failed (${failed.slice(0, 3).map(f => f?.filename || '?').join(', ')})`);
|
|
833
|
+
return { kind: 'row', label, level: failed.length ? 'warn' : 'status', text: `Files persisted: ${parts.join(', ')}.`, key: '' };
|
|
834
|
+
}
|
|
835
|
+
case 'active_goal': {
|
|
836
|
+
const v = ev.value;
|
|
837
|
+
if (!v) return { kind: 'row', label, level: 'status', text: 'Goal cleared.', key: 'active_goal' };
|
|
838
|
+
return {
|
|
839
|
+
kind: 'row', label, level: 'status', key: 'active_goal',
|
|
840
|
+
text: `Goal: ${clip(v.condition, 300)}${Number(v.iterations) > 0 ? ` (iteration ${v.iterations})` : ''}${v.last_reason ? `. ${clip(v.last_reason, 200)}` : ''}`,
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
default:
|
|
844
|
+
return { kind: 'unknown', label };
|
|
845
|
+
}
|
|
846
|
+
}
|