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,1065 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// OpenCode V2 — Multi-panel manager
|
|
3
|
+
// Tracks the primary OCP v2 panel and the sub-agent panels of its sessions.
|
|
4
|
+
// Sub-agent rules (ocp-v2-subagents-logic.js has them without the DOM):
|
|
5
|
+
// • One panel and one pill per sub-agent session, at any depth (a sub-agent
|
|
6
|
+
// of a sub-agent too). A new sub-agent never destroys or reuses another
|
|
7
|
+
// one's panel, and there is no cap.
|
|
8
|
+
// • All of them stay live: a panel that is off screen follows its session.
|
|
9
|
+
// • Spawned MINIMIZED — a sub-agent appears as a tray pill; nothing opens
|
|
10
|
+
// by itself. An automation's sub-agents get neither pill nor panel.
|
|
11
|
+
// • The pills and panels belong to their parent session: the tray shows the
|
|
12
|
+
// set of the session the main panel is on, and keeps the others.
|
|
13
|
+
// • Which OpenCode panel is on screen is decided in one function
|
|
14
|
+
// (decideVisibility), applied here by requestOpencodeView().
|
|
15
|
+
// • A sub-agent costs what its pill needs (its run state and the requests
|
|
16
|
+
// that wait for the user) until its panel is first shown: then its
|
|
17
|
+
// session is read whole.
|
|
18
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
subscribeSessionCreated, subscribeSession, onEvent, api, hasSessionStore, supports,
|
|
22
|
+
onReconnect, isDescendantSession, rememberSessionParent, handOverRequests,
|
|
23
|
+
} from './ocp-v2-ws.js';
|
|
24
|
+
import { rehydratePanelSession, rehydrateSessionState } from './ocp-v2-rehydrate.js';
|
|
25
|
+
import { captureBinding, latestOnly } from './ocp-v2-binding.js';
|
|
26
|
+
import { storage } from '../storage.js';
|
|
27
|
+
import { on } from '../state.js';
|
|
28
|
+
import { setSidepanelVisible } from '../ui-sidepanel-windows.js';
|
|
29
|
+
import { createPanelStore } from './ocp-v2-state.js';
|
|
30
|
+
import { createChildPanel } from './ocp-v2-childpanel.js';
|
|
31
|
+
import { inheritChildPanelMcpProfile } from './ocp-v2-profile-inheritance.js';
|
|
32
|
+
import { notify as uiNotify, NOTIF_TYPE } from '../ui-notifications.js';
|
|
33
|
+
import {
|
|
34
|
+
isAutomationSession, onAutomationSessionRegistered, shouldMaterializeChildPanel,
|
|
35
|
+
} from './ocp-v2-automation-ownership.js';
|
|
36
|
+
import {
|
|
37
|
+
MAIN_VIEW, decideVisibility, createSubagentRegistry, placeSubagent, descendantsOf, trayPills,
|
|
38
|
+
createClosedSubagents, createShownSubagent, createLimiter, trayGroupHeight, trayGroupScrolls,
|
|
39
|
+
lineageOf, entriesUnder, createUnsentPrompts, unsentSubagentNotice,
|
|
40
|
+
} from './ocp-v2-subagents-logic.js';
|
|
41
|
+
|
|
42
|
+
export { MAIN_VIEW };
|
|
43
|
+
|
|
44
|
+
const AGENT_TOOL_NAMES = new Set([
|
|
45
|
+
'task', 'agent', 'Task', 'Agent',
|
|
46
|
+
// OpenCode SDK variants observed in the wild — the spawn tool name has
|
|
47
|
+
// drifted across SDK versions. Keep the set permissive so a renamed tool
|
|
48
|
+
// still spawns the child pill.
|
|
49
|
+
'invoke', 'Invoke', 'subagent', 'Subagent', 'sub_agent', 'spawn', 'Spawn',
|
|
50
|
+
'explore', 'Explore', 'plan', 'Plan',
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
function readParentID(info) {
|
|
54
|
+
if (!info) return '';
|
|
55
|
+
return (
|
|
56
|
+
info.parentID || info.parentId || info.parent_id ||
|
|
57
|
+
info.session?.parentID || info.session?.parentId ||
|
|
58
|
+
info.properties?.info?.parentID || info.properties?.info?.parentId ||
|
|
59
|
+
''
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let _primary = null; // { panelId, store, getSessionId, ownsSession, keepPrompts }
|
|
64
|
+
let _mainView = null; // { owner, isVisible }: the main panel in the shared slot
|
|
65
|
+
let _started = false;
|
|
66
|
+
let _primaryWsUnsub = null;
|
|
67
|
+
// Every sub-agent panel: sessionId → { panelId, sessionId, parentSessionId,
|
|
68
|
+
// rootSessionId, depth, startedAt, store, instance, wsUnsub, runSub }.
|
|
69
|
+
const _panels = createSubagentRegistry();
|
|
70
|
+
// child session → parent session, learned from session events and from the
|
|
71
|
+
// children the server listed: how a sub-agent of a sub-agent finds its set.
|
|
72
|
+
const _parentOf = new Map();
|
|
73
|
+
// One orphan scan at a time counts: a newer one (the next binding, a rescan)
|
|
74
|
+
// takes over from the one still waiting for its answer.
|
|
75
|
+
const _orphanScans = latestOnly();
|
|
76
|
+
// Transcripts of sub-agent panels are read a few at a time.
|
|
77
|
+
const _hydrations = createLimiter(4);
|
|
78
|
+
// Prompts that were on their way to a sub-agent when its panel went away, and
|
|
79
|
+
// whose send then failed: kept for that sub-agent until its panel is opened again.
|
|
80
|
+
const _unsent = createUnsentPrompts();
|
|
81
|
+
// Sub-agents that were announced before the chain of their parents reached a
|
|
82
|
+
// tab (a parent whose own parent link arrives later, with session.updated):
|
|
83
|
+
// child → { parentSid, childInfo, taskInfo }, the newest UNPLACED_MAX. Each is
|
|
84
|
+
// placed when its parent gets its panel (placeWaitingChildren).
|
|
85
|
+
const UNPLACED_MAX = 256;
|
|
86
|
+
const _unplaced = new Map();
|
|
87
|
+
// The sub-agents whose panel the user closed (one list for every window, kept
|
|
88
|
+
// across reloads): nothing but "Open sub-agent" brings one back.
|
|
89
|
+
const STOR_CLOSED = 'opencode-v2-subagents-closed';
|
|
90
|
+
const _closed = createClosedSubagents({
|
|
91
|
+
load: () => JSON.parse(storage.getItem(STOR_CLOSED) || '{}'),
|
|
92
|
+
save: (entries) => {
|
|
93
|
+
if (Object.keys(entries).length) storage.setItem(STOR_CLOSED, JSON.stringify(entries));
|
|
94
|
+
else storage.removeItem(STOR_CLOSED);
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
// The sub-agent panel that is on screen, for this window, across a reload.
|
|
98
|
+
const STOR_SHOWN = 'ocp-v2-subagent-shown';
|
|
99
|
+
const _shown = createShownSubagent({
|
|
100
|
+
load: () => JSON.parse(sessionStorage.getItem(STOR_SHOWN) || 'null'),
|
|
101
|
+
save: (view) => {
|
|
102
|
+
if (view) sessionStorage.setItem(STOR_SHOWN, JSON.stringify(view));
|
|
103
|
+
else sessionStorage.removeItem(STOR_SHOWN);
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// The main panel says where it is in the shared slot (before it boots: it can
|
|
108
|
+
// be shown before it is registered as the primary).
|
|
109
|
+
export function registerMainView({ owner, isVisible }) {
|
|
110
|
+
_mainView = { owner, isVisible };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// ownsSession(id) is this session a tab of the main panel? (its
|
|
114
|
+
// sub-agents get panels here; another window's do not)
|
|
115
|
+
// keepPrompts(items, label)
|
|
116
|
+
// prompts that were waiting in a sub-agent panel that
|
|
117
|
+
// went away by itself: kept for the user on notices
|
|
118
|
+
export function registerPrimaryPanel({ panelId, store, getSessionId, ownsSession, keepPrompts }) {
|
|
119
|
+
_primary = { panelId, store, getSessionId, ownsSession, keepPrompts };
|
|
120
|
+
startManager();
|
|
121
|
+
syncSubagentTray();
|
|
122
|
+
// Retroactive scan: sub-agent sessions may already exist server-side
|
|
123
|
+
// (created before this panel registered, or surviving a page reload).
|
|
124
|
+
// Without this, their tray pills never appear.
|
|
125
|
+
scanForOrphanChildren().catch((err) => {
|
|
126
|
+
console.warn('[ocp-v2-manager] initial orphan scan failed', err);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function bindPrimarySession(store, sessionId) {
|
|
131
|
+
if (_primaryWsUnsub) { try { _primaryWsUnsub(); } catch {} _primaryWsUnsub = null; }
|
|
132
|
+
if (sessionId) _primaryWsUnsub = subscribeSession(sessionId, store);
|
|
133
|
+
// The pills in the tray are those of the session the main panel is on. A
|
|
134
|
+
// sub-agent panel of another session does not stay on screen over it.
|
|
135
|
+
const shown = visibleEntry();
|
|
136
|
+
if (shown && shown.rootSessionId !== (sessionId || '')) requestOpencodeView({ hide: shown.panelId });
|
|
137
|
+
syncSubagentTray();
|
|
138
|
+
// Whenever the primary's active session changes, re-scan: the new active
|
|
139
|
+
// session may already have sub-agents server-side.
|
|
140
|
+
if (sessionId) {
|
|
141
|
+
scanForOrphanChildren().catch((err) => {
|
|
142
|
+
console.warn('[ocp-v2-manager] bind-time orphan scan failed', err);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const listOf = (res) => (Array.isArray(res?.data) ? res.data : (res?.data?.sessions || []));
|
|
148
|
+
|
|
149
|
+
async function scanForOrphanChildren() {
|
|
150
|
+
if (!_primary) return;
|
|
151
|
+
const parentSid = _primary.getSessionId?.();
|
|
152
|
+
if (!parentSid || isAutomationSession(parentSid)) return;
|
|
153
|
+
// The scan is for the session the primary panel is on now. Its answer may
|
|
154
|
+
// spawn child panels only while the panel is still on that binding and no
|
|
155
|
+
// newer scan was started.
|
|
156
|
+
const at = captureBinding(_primary.store, { sessionId: parentSid });
|
|
157
|
+
const latest = _orphanScans.begin();
|
|
158
|
+
let sessions = [];
|
|
159
|
+
try {
|
|
160
|
+
// session.children is the direct question, asked for the session and then
|
|
161
|
+
// for every child it lists (sub-agents of sub-agents); a server without it
|
|
162
|
+
// lists every session and descendantsOf picks the tree out.
|
|
163
|
+
if (supports('session:children')) sessions = await readChildTree(parentSid, () => latest() && at.isCurrent());
|
|
164
|
+
else sessions = descendantsOf(listOf(await api.sessionList()), parentSid);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
console.warn('[ocp-v2-manager] child session lookup for orphan scan failed', err);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// Ownership can arrive from the native event socket while session:list is
|
|
170
|
+
// in flight. Recheck before materializing anything from the response.
|
|
171
|
+
if (isAutomationSession(parentSid)) return;
|
|
172
|
+
// So can a session switch: a child of the session the panel has left is not
|
|
173
|
+
// materialized under the one it is on now.
|
|
174
|
+
if (!latest() || !at.isCurrent()) return;
|
|
175
|
+
// Every sub-agent of the session gets its panel and its pill back, in the
|
|
176
|
+
// order they were started (the user's closes excepted). Nothing is shown,
|
|
177
|
+
// and nothing is announced: these did not just start.
|
|
178
|
+
for (const session of sessions) {
|
|
179
|
+
const childSid = session?.id || session?.sessionID;
|
|
180
|
+
if (!childSid || !readParentID(session)) continue;
|
|
181
|
+
_parentOf.set(childSid, readParentID(session));
|
|
182
|
+
// The server listed this link: requests are routed and auto-accept is
|
|
183
|
+
// inherited along it, as along one that a session event carried.
|
|
184
|
+
rememberSessionParent(childSid, readParentID(session));
|
|
185
|
+
}
|
|
186
|
+
for (const session of sessions) {
|
|
187
|
+
const childSid = session?.id || session?.sessionID;
|
|
188
|
+
const parent = readParentID(session);
|
|
189
|
+
if (!childSid || !parent) continue;
|
|
190
|
+
ensureChildSpawn(parent, childSid, session, null, lookupParentTaskInfo(childSid, parent), { announce: false });
|
|
191
|
+
}
|
|
192
|
+
_scanned.add(parentSid);
|
|
193
|
+
restoreShown();
|
|
194
|
+
noteShown();
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// After a reload: the sub-agent panel that was on screen is on screen again.
|
|
198
|
+
// Once, when the user has the main panel on screen on the session it belonged
|
|
199
|
+
// to and that session's children were read (nothing opens by itself: a panel
|
|
200
|
+
// an automation booted waits for the user to open OpenCode).
|
|
201
|
+
const _scanned = new Set(); // sessions whose children were read since the page loaded
|
|
202
|
+
function restoreShown() {
|
|
203
|
+
const root = _primary?.getSessionId?.() || '';
|
|
204
|
+
if (!root) return;
|
|
205
|
+
const was = _shown.restoreFor(root, { mainVisible: !!_mainView?.isVisible?.(), ready: _scanned.has(root) });
|
|
206
|
+
const entry = was ? _panels.get(was) : null;
|
|
207
|
+
if (entry && entry.rootSessionId === root) requestOpencodeView({ show: entry.panelId });
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function startManager() {
|
|
211
|
+
if (_started) return;
|
|
212
|
+
_started = true;
|
|
213
|
+
// The primary panel heals itself on a reconnect; the sub-agent panels are
|
|
214
|
+
// re-read here, or they would come back without their cards or stay "running".
|
|
215
|
+
onReconnect(() => {
|
|
216
|
+
for (const entry of _panels.all()) {
|
|
217
|
+
// (A few at a time, like the first read: there can be many of them.)
|
|
218
|
+
_hydrations(() => hydrateChildPanel(entry.store, entry.sessionId))
|
|
219
|
+
.then((out) => {
|
|
220
|
+
// Its header said "reconnecting" since the socket closed.
|
|
221
|
+
// (A panel that was never shown had what its pill needs read, and no transcript.)
|
|
222
|
+
if ((out.transcript || out.pill) && _panels.get(entry.sessionId)?.store === entry.store) entry.store.setServerStatus({ status: 'ready' });
|
|
223
|
+
})
|
|
224
|
+
.catch((err) => console.warn('[ocp-v2-manager] child rehydrate after reconnect failed', err));
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
onAutomationSessionRegistered(({ sessionId }) => {
|
|
228
|
+
destroyPanelsOf(sessionId);
|
|
229
|
+
});
|
|
230
|
+
// The main panel went on or off screen: the pills dock to its pill or stand alone.
|
|
231
|
+
// (The restore after a reload is tried once the main panel's own show is over.)
|
|
232
|
+
on('opencode-panel:visibility', (visible) => {
|
|
233
|
+
syncSubagentTray();
|
|
234
|
+
noteShown();
|
|
235
|
+
if (visible) setTimeout(() => { restoreShown(); noteShown(); }, 0);
|
|
236
|
+
});
|
|
237
|
+
// The room under the group changes with the window.
|
|
238
|
+
if (typeof window !== 'undefined') window.addEventListener('resize', () => { _groupLayoutKey = ''; scheduleTraySync(); });
|
|
239
|
+
subscribeSessionCreated((event) => {
|
|
240
|
+
const info = event?.info || event?.properties?.info || event;
|
|
241
|
+
const childId = info?.id || event?.id || event?.sessionID || event?.sessionId;
|
|
242
|
+
const parentID = readParentID(info) || readParentID(event);
|
|
243
|
+
if (!childId || !parentID) return;
|
|
244
|
+
ensureChildSpawn(parentID, childId, info, null, lookupParentTaskInfo(childId, parentID));
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
onEvent((eventType, ev) => {
|
|
248
|
+
if (!_primary) return;
|
|
249
|
+
// Some OpenCode SDK builds emit `session.created` WITHOUT parentID first,
|
|
250
|
+
// then a `session.updated` enriches the info object. Catch the linkage on
|
|
251
|
+
// updates too — without this, a sub-agent whose parentID arrives late is
|
|
252
|
+
// never paired with its parent and the pill never spawns.
|
|
253
|
+
if (eventType === 'session.updated') {
|
|
254
|
+
const info = ev?.info || ev?.session || ev;
|
|
255
|
+
const childId = info?.id || ev?.sessionID || ev?.sessionId;
|
|
256
|
+
const parentID = readParentID(info) || readParentID(ev);
|
|
257
|
+
if (!childId || !parentID) return;
|
|
258
|
+
if (childId === _primary.getSessionId?.()) return;
|
|
259
|
+
if (_panels.has(childId)) return;
|
|
260
|
+
// (The sub-agents that named this session as their parent before its own
|
|
261
|
+
// parent was known are placed with it: placeWaitingChildren.)
|
|
262
|
+
ensureChildSpawn(parentID, childId, info, null, lookupParentTaskInfo(childId, parentID));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
// A sub-agent session OpenCode deleted takes its panel with it. (The
|
|
266
|
+
// session in the main panel is the main panel's to close: releaseSubagentPanels.)
|
|
267
|
+
if (eventType === 'session.deleted') {
|
|
268
|
+
const gone = ev?.info?.id || ev?.sessionID || ev?.sessionId;
|
|
269
|
+
if (!gone) return;
|
|
270
|
+
_parentOf.delete(gone);
|
|
271
|
+
_unplaced.delete(gone);
|
|
272
|
+
_closed.forget(gone);
|
|
273
|
+
const entry = _panels.get(gone);
|
|
274
|
+
// (Its requests went with the session: none is handed to a parent's panel.)
|
|
275
|
+
if (entry) destroyPanel(entry, { lost: true, requests: false });
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// Fallback: many OpenCode SDK builds emit `session.created` for sub-agents
|
|
280
|
+
// either late or without `parentID`. Also detect child-session ids from the
|
|
281
|
+
// agent tool's metadata on `message.part.updated`. Without this fallback, a
|
|
282
|
+
// Task tool can run to completion while the child panel never spawns.
|
|
283
|
+
onEvent((eventType, ev) => {
|
|
284
|
+
if (!_primary) return;
|
|
285
|
+
if (eventType !== 'message.part.updated') return;
|
|
286
|
+
// The spawn is tied to the session the tool ran in (the session in the
|
|
287
|
+
// main panel, another tab, or a sub-agent), not to the one on screen.
|
|
288
|
+
const parentSid = ev?.sessionID || ev?.sessionId;
|
|
289
|
+
if (!parentSid) return;
|
|
290
|
+
|
|
291
|
+
const part = ev.part || {};
|
|
292
|
+
if (part.type !== 'tool') return;
|
|
293
|
+
const toolName = part.tool || part.name || '';
|
|
294
|
+
const childSid = part?.state?.metadata?.sessionId
|
|
295
|
+
|| part?.state?.metadata?.sessionID
|
|
296
|
+
|| part?.metadata?.sessionId
|
|
297
|
+
|| part?.metadata?.sessionID
|
|
298
|
+
|| part?.state?.input?.sessionId
|
|
299
|
+
|| part?.state?.input?.sessionID
|
|
300
|
+
|| '';
|
|
301
|
+
const replayPart = part;
|
|
302
|
+
if (!childSid) return;
|
|
303
|
+
// If the tool name isn't a known agent tool, only continue when the
|
|
304
|
+
// session id metadata is present AND it differs from the parent (which
|
|
305
|
+
// means it really is a child session id, not noise).
|
|
306
|
+
const isKnownAgent = AGENT_TOOL_NAMES.has(toolName);
|
|
307
|
+
if (!isKnownAgent && (childSid === parentSid)) return;
|
|
308
|
+
// The triggering event was already dispatched by the WS layer BEFORE the
|
|
309
|
+
// child store was registered, so per-session fanout dropped it. Replay
|
|
310
|
+
// into the child store after spawn so the agent-tool input/output isn't
|
|
311
|
+
// lost from the child transcript.
|
|
312
|
+
const replay = replayPart ? (store) => store.upsertPart(replayPart) : null;
|
|
313
|
+
// Pull the task brief from the parent's tool input so the child header can
|
|
314
|
+
// show "explore · do X" instead of an opaque "idle".
|
|
315
|
+
const taskInfo = describeAgentTask(replayPart, ev, toolName);
|
|
316
|
+
ensureChildSpawn(parentSid, childSid, null, replay, taskInfo, { inferred: true });
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// The descendants of `rootSid` as the server lists them: its children, then
|
|
321
|
+
// the children of each of those. `wanted()` turns false once the scan was
|
|
322
|
+
// overtaken; nothing more is asked then.
|
|
323
|
+
async function readChildTree(rootSid, wanted) {
|
|
324
|
+
const out = [];
|
|
325
|
+
const seen = new Set([rootSid]);
|
|
326
|
+
let level = [rootSid];
|
|
327
|
+
for (let depth = 0; depth < 12 && level.length; depth += 1) {
|
|
328
|
+
const next = [];
|
|
329
|
+
for (const parent of level) {
|
|
330
|
+
if (!wanted()) return out;
|
|
331
|
+
const children = listOf(await api.sessionChildren({ sessionId: parent }))
|
|
332
|
+
.filter((s) => readParentID(s) === parent);
|
|
333
|
+
for (const child of children) {
|
|
334
|
+
const id = child?.id || child?.sessionID;
|
|
335
|
+
if (!id || seen.has(id)) continue;
|
|
336
|
+
seen.add(id);
|
|
337
|
+
out.push(child);
|
|
338
|
+
next.push(id);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
level = next;
|
|
342
|
+
}
|
|
343
|
+
return descendantsOf([{ id: rootSid }, ...out], rootSid);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function describeAgentTask(part, ev, toolName) {
|
|
347
|
+
const input = part?.state?.input || part?.input || ev?.state?.input || ev?.input || {};
|
|
348
|
+
const description = String(input.description || '').trim();
|
|
349
|
+
const prompt = String(input.prompt || '').trim();
|
|
350
|
+
const subagentType = String(input.subagent_type || input.agent || input.agentType || '').trim();
|
|
351
|
+
const summary = description || (prompt ? prompt.split(/\r?\n/, 1)[0] : '');
|
|
352
|
+
return {
|
|
353
|
+
subagentType: subagentType || toolName || '',
|
|
354
|
+
summary: summary || '',
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// When a child arrives via session.created (no tool part attached), scan the
|
|
359
|
+
// parent's recent message parts for the agent-tool call whose metadata points
|
|
360
|
+
// to this child's sessionId. Lets the header show "explore · do X" even when
|
|
361
|
+
// the spawn was reported through the SDK's session events rather than the
|
|
362
|
+
// tool-call replay path.
|
|
363
|
+
// The task card is in the transcript of the session that started the
|
|
364
|
+
// sub-agent: the main panel's for a sub-agent of the session it is on, the
|
|
365
|
+
// parent's own panel for a sub-agent of a sub-agent.
|
|
366
|
+
function lookupParentTaskInfo(childSid, parentSid = _parentOf.get(childSid)) {
|
|
367
|
+
if (!childSid) return null;
|
|
368
|
+
for (const store of [_panels.get(parentSid)?.store, _primary?.store]) {
|
|
369
|
+
const found = store ? taskInfoIn(store.getState(), childSid) : null;
|
|
370
|
+
if (found) return found;
|
|
371
|
+
}
|
|
372
|
+
return null;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
function taskInfoIn(s, childSid) {
|
|
376
|
+
const order = s.messageOrder || [];
|
|
377
|
+
for (let i = order.length - 1; i >= 0; i--) {
|
|
378
|
+
const msg = s.messages?.get?.(order[i]);
|
|
379
|
+
if (!msg?.parts) continue;
|
|
380
|
+
for (const part of msg.parts.values()) {
|
|
381
|
+
if (part?.type !== 'tool') continue;
|
|
382
|
+
const toolName = part.tool || part.name || '';
|
|
383
|
+
const metaSid =
|
|
384
|
+
part?.state?.metadata?.sessionId ||
|
|
385
|
+
part?.state?.metadata?.sessionID ||
|
|
386
|
+
part?.metadata?.sessionId ||
|
|
387
|
+
part?.metadata?.sessionID ||
|
|
388
|
+
part?.state?.input?.sessionId ||
|
|
389
|
+
part?.state?.input?.sessionID ||
|
|
390
|
+
'';
|
|
391
|
+
if (metaSid !== childSid) continue;
|
|
392
|
+
return describeAgentTask(part, null, toolName);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// A session whose sub-agents get their panels here: the one the main panel is
|
|
399
|
+
// on, or another of its tabs.
|
|
400
|
+
function isRootSession(sessionId) {
|
|
401
|
+
if (!_primary || !sessionId) return false;
|
|
402
|
+
if (sessionId === _primary.getSessionId?.()) return true;
|
|
403
|
+
try { return _primary.ownsSession?.(sessionId) === true; } catch { return false; }
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// The automation's session that `sessionId` is, or is below, at any depth
|
|
407
|
+
// ('' when there is none).
|
|
408
|
+
// chain the parents its panel was made with, should a link be forgotten
|
|
409
|
+
function automationOver(sessionId, chain = []) {
|
|
410
|
+
return [...lineageOf(sessionId, _parentOf), ...chain].find((id) => isAutomationSession(id)) || '';
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// A sub-agent whose chain of parents does not reach a tab (yet).
|
|
414
|
+
function waitForParent(childSid, { parentSid, childInfo, taskInfo }) {
|
|
415
|
+
const was = _unplaced.get(childSid);
|
|
416
|
+
_unplaced.delete(childSid);
|
|
417
|
+
_unplaced.set(childSid, { parentSid, childInfo: childInfo || was?.childInfo || null, taskInfo: taskInfo || was?.taskInfo || null });
|
|
418
|
+
while (_unplaced.size > UNPLACED_MAX) _unplaced.delete(_unplaced.keys().next().value);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// A sub-agent got its panel: the sub-agents that named it as their parent
|
|
422
|
+
// before its own parent link was known are placed now, and theirs after them.
|
|
423
|
+
function placeWaitingChildren(parentSid, { announce }) {
|
|
424
|
+
for (const [childSid, was] of [..._unplaced]) {
|
|
425
|
+
if (was.parentSid !== parentSid || !_unplaced.has(childSid)) continue;
|
|
426
|
+
_unplaced.delete(childSid);
|
|
427
|
+
ensureChildSpawn(parentSid, childSid, was.childInfo, null, was.taskInfo || lookupParentTaskInfo(childSid, parentSid), { announce });
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// The panel of `childSid`, made when it has none. Returns its entry, or null
|
|
432
|
+
// when the sub-agent gets no panel: its lineage does not lead to a tab of this
|
|
433
|
+
// panel, an automation owns it, or the user closed it (`reopen` lifts that).
|
|
434
|
+
// announce a sub-agent that just started (a toast, the pill's entrance)
|
|
435
|
+
// inferred the parent is what a task tool's part, a task card or a crumb
|
|
436
|
+
// says, not what the server reported for the session
|
|
437
|
+
function ensureChildSpawn(parentSid, childSid, childInfo, replay, taskInfo, { announce = true, reopen = false, inferred = false } = {}) {
|
|
438
|
+
if (!_primary || !parentSid || !childSid || parentSid === childSid) return null;
|
|
439
|
+
// A link that is only inferred never replaces a known one: a sub-agent
|
|
440
|
+
// stays where its session says it is, and an automation's sub-agent stays
|
|
441
|
+
// an automation's, whatever names it as its own.
|
|
442
|
+
const known = _parentOf.get(childSid);
|
|
443
|
+
if (inferred && known && known !== parentSid) parentSid = known;
|
|
444
|
+
_parentOf.set(childSid, parentSid);
|
|
445
|
+
if (!shouldMaterializeChildPanel(parentSid, childSid)) {
|
|
446
|
+
destroyPanelsOf(parentSid);
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
// A session an automation owns has no pill and no panel here, and neither
|
|
450
|
+
// has anything below it, at any depth. Checked on the whole chain of
|
|
451
|
+
// parents, whatever announced the sub-agent, and for one that has a panel
|
|
452
|
+
// as for a new one: a session can become an automation's at any moment.
|
|
453
|
+
const existing = _panels.get(childSid);
|
|
454
|
+
const owner = automationOver(childSid, existing?.chain);
|
|
455
|
+
if (owner) {
|
|
456
|
+
destroyPanelsOf(owner);
|
|
457
|
+
return null;
|
|
458
|
+
}
|
|
459
|
+
if (existing) {
|
|
460
|
+
if (typeof replay === 'function') {
|
|
461
|
+
try { replay(existing.store); } catch (err) {
|
|
462
|
+
console.warn('[ocp-v2-manager] child event replay failed', err);
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
if (taskInfo && existing.instance?.setTaskInfo) {
|
|
466
|
+
try {
|
|
467
|
+
existing.instance.setTaskInfo(taskInfo);
|
|
468
|
+
if (taskInfo.subagentType || taskInfo.summary) existing.briefed = true;
|
|
469
|
+
} catch {}
|
|
470
|
+
}
|
|
471
|
+
return existing;
|
|
472
|
+
}
|
|
473
|
+
const placed = placeSubagent({ parentSessionId: parentSid, childSessionId: childSid, parentOf: _parentOf, isRoot: isRootSession });
|
|
474
|
+
if (!placed) {
|
|
475
|
+
// The chain of its parents does not reach a tab (yet). When the link that
|
|
476
|
+
// is missing arrives, the sub-agent is placed with its parent.
|
|
477
|
+
waitForParent(childSid, { parentSid, childInfo, taskInfo });
|
|
478
|
+
return null;
|
|
479
|
+
}
|
|
480
|
+
// An automation's sub-agents stay inside its one tab, at every depth.
|
|
481
|
+
if (placed.chain.some((sessionId) => isAutomationSession(sessionId))) return null;
|
|
482
|
+
// The user closed this sub-agent's panel: no event and no scan brings it back.
|
|
483
|
+
if (!reopen && _closed.isClosed(childSid)) return null;
|
|
484
|
+
_closed.reopen(childSid);
|
|
485
|
+
return spawnChildPanel({
|
|
486
|
+
childSessionId: childSid,
|
|
487
|
+
childInfo,
|
|
488
|
+
parentPanelId: _primary.panelId,
|
|
489
|
+
parentSessionId: parentSid,
|
|
490
|
+
rootSessionId: placed.rootSessionId,
|
|
491
|
+
chain: placed.chain,
|
|
492
|
+
parentTitle: parentTitleFor(_primary, parentSid),
|
|
493
|
+
replay,
|
|
494
|
+
taskInfo,
|
|
495
|
+
announce,
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// The title of the session that spawned the sub-agent. A sub-agent that has
|
|
500
|
+
// sub-agents itself is known by its own panel. Else the primary panel's store
|
|
501
|
+
// knows it while it is bound to that session; a child of a session the
|
|
502
|
+
// panel is not on (a spawn that arrives after a tab switch) gets that
|
|
503
|
+
// session's own title from what the store has seen of it, never the title of
|
|
504
|
+
// the session on screen.
|
|
505
|
+
function parentTitleFor(reg, parentSid) {
|
|
506
|
+
try {
|
|
507
|
+
const own = _panels.get(parentSid);
|
|
508
|
+
if (own) return own.instance.title();
|
|
509
|
+
const s = reg.store?.getState?.();
|
|
510
|
+
const bound = reg.getSessionId?.() || '';
|
|
511
|
+
const info = !parentSid || parentSid === bound ? s?.sessionInfo : s?.knownSessions?.get?.(parentSid);
|
|
512
|
+
return String(info?.title || info?.slug || (parentSid || bound).slice(0, 8) || 'parent').trim() || 'parent';
|
|
513
|
+
} catch { return 'parent'; }
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// The tool profile the user chose for a session (the project bar saves it
|
|
517
|
+
// under this key): what a sub-agent of a session that is not on screen inherits.
|
|
518
|
+
const MCP_SESSION_PROFILE_KEY = 'synabun-opencode-session-mcp-profiles';
|
|
519
|
+
function savedSessionProfile(sessionId) {
|
|
520
|
+
try {
|
|
521
|
+
const parsed = JSON.parse(storage.getItem(MCP_SESSION_PROFILE_KEY) || '{}');
|
|
522
|
+
return (parsed && typeof parsed === 'object' && parsed[sessionId]) || null;
|
|
523
|
+
} catch { return null; }
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
function spawnChildPanel({ childSessionId, childInfo, parentPanelId, parentSessionId, rootSessionId, chain, parentTitle, replay, taskInfo, announce }) {
|
|
527
|
+
const panelId = `ocp-v2-child-${childSessionId.slice(0, 8)}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`;
|
|
528
|
+
const store = createPanelStore();
|
|
529
|
+
store.setSession(childSessionId, childInfo || null);
|
|
530
|
+
store.setParentSession(parentSessionId, parentPanelId);
|
|
531
|
+
// The parent's profile: the primary store's only while it is bound to that
|
|
532
|
+
// parent (see inheritChildPanelMcpProfile).
|
|
533
|
+
inheritChildPanelMcpProfile(store, _primary?.store, childInfo, { parentSessionId, savedProfile: savedSessionProfile });
|
|
534
|
+
|
|
535
|
+
const wsUnsub = subscribeSession(childSessionId, store);
|
|
536
|
+
|
|
537
|
+
// Replay must run AFTER subscribe so the part lands in the child store; the
|
|
538
|
+
// store de-dupes by id, so a later WS event for the same part is harmless.
|
|
539
|
+
if (typeof replay === 'function') {
|
|
540
|
+
try { replay(store); } catch (err) {
|
|
541
|
+
console.warn('[ocp-v2-manager] initial child event replay failed', err);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// Surface a toast so the user gets immediate visual feedback that a
|
|
546
|
+
// sub-agent spawned — the tray pill alone is easy to miss when the user
|
|
547
|
+
// is looking at the panel content. (Not for the pills a reload rebuilds.)
|
|
548
|
+
if (announce) {
|
|
549
|
+
try {
|
|
550
|
+
uiNotify('panel', NOTIF_TYPE.ACTION, `↳ Sub-agent of ${parentTitle}`, {
|
|
551
|
+
panel: 'opencode',
|
|
552
|
+
provider: 'opencode',
|
|
553
|
+
});
|
|
554
|
+
} catch (err) {
|
|
555
|
+
console.warn('[ocp-v2-manager] spawn notification failed', err);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// When this sub-agent has just become idle, re-poke the parent's plan
|
|
560
|
+
// lifecycle so a PLAN COMPLETE deferred by an in-flight sub-agent finalizes
|
|
561
|
+
// now. Lazy import avoids a static cycle (plan.js → manager.js → plan.js).
|
|
562
|
+
const childRunSub = store.subscribe((event, state) => {
|
|
563
|
+
if (event?.type !== 'running:set' || state.running) return;
|
|
564
|
+
if (!_primary?.store) return;
|
|
565
|
+
// The plan turn this sub-agent was part of is its parent's: when the
|
|
566
|
+
// primary panel is on another session, that session's plan is not poked.
|
|
567
|
+
if (_primary.getSessionId?.() !== parentSessionId) return;
|
|
568
|
+
if (!_primary.store.getState().planTurnActive) return;
|
|
569
|
+
const at = captureBinding(_primary.store);
|
|
570
|
+
// ...and it is that plan turn that is poked, not one begun after it.
|
|
571
|
+
const planTurn = _primary.store.getState().planTurnId;
|
|
572
|
+
import('./ocp-v2-plan.js').then(({ maybeFinalizePlanTurn }) => {
|
|
573
|
+
if (!at.isCurrent()) return;
|
|
574
|
+
maybeFinalizePlanTurn('child:idle', _primary.store, { lenient: true, planTurn }).catch(() => {});
|
|
575
|
+
}).catch(() => {});
|
|
576
|
+
});
|
|
577
|
+
|
|
578
|
+
const entry = {
|
|
579
|
+
panelId,
|
|
580
|
+
sessionId: childSessionId,
|
|
581
|
+
parentSessionId,
|
|
582
|
+
rootSessionId,
|
|
583
|
+
chain,
|
|
584
|
+
depth: Math.max(0, chain.length - 1),
|
|
585
|
+
startedAt: Number(childInfo?.time?.created) || Date.now(),
|
|
586
|
+
// Its session was read whole (the panel was shown once); its brief is known.
|
|
587
|
+
hydrated: false,
|
|
588
|
+
hydration: null,
|
|
589
|
+
briefed: !!(taskInfo && (taskInfo.subagentType || taskInfo.summary)),
|
|
590
|
+
store,
|
|
591
|
+
instance: null,
|
|
592
|
+
wsUnsub,
|
|
593
|
+
runSub: childRunSub,
|
|
594
|
+
};
|
|
595
|
+
entry.instance = createChildPanel({
|
|
596
|
+
panelId,
|
|
597
|
+
sessionId: childSessionId,
|
|
598
|
+
store,
|
|
599
|
+
parentPanelId,
|
|
600
|
+
parentSessionId,
|
|
601
|
+
rootSessionId,
|
|
602
|
+
parentTitle,
|
|
603
|
+
depth: entry.depth,
|
|
604
|
+
getChain: () => chain.map((sessionId) => ({ sessionId, title: parentTitleFor(_primary, sessionId) })),
|
|
605
|
+
taskInfo,
|
|
606
|
+
announce,
|
|
607
|
+
// Rebuilt from the server's list, not just started: it ran before.
|
|
608
|
+
started: !announce,
|
|
609
|
+
onUndelivered: (item, detail) => keepUnsent(entry, item, detail),
|
|
610
|
+
takeUnsent: () => _unsent.take(childSessionId),
|
|
611
|
+
onRequestView: (request) => requestOpencodeView(request),
|
|
612
|
+
onVisibility: (visible) => onChildVisibility(entry, visible),
|
|
613
|
+
onOpenAncestor: (sessionId) => openChildSession(_parentOf.get(sessionId) || rootSessionId, sessionId),
|
|
614
|
+
onOpenChild: (grandchildSid) => openChildSession(childSessionId, grandchildSid),
|
|
615
|
+
onStateChange: scheduleTraySync,
|
|
616
|
+
onClose: (id, detail) => onChildClosed(entry, detail),
|
|
617
|
+
});
|
|
618
|
+
_panels.add(entry);
|
|
619
|
+
_unplaced.delete(childSessionId);
|
|
620
|
+
syncSubagentTray();
|
|
621
|
+
|
|
622
|
+
// What its pill needs is read now; its transcript when its panel is first
|
|
623
|
+
// shown (showsFirstTime).
|
|
624
|
+
readPillState(entry);
|
|
625
|
+
// Sub-agents of this one that were announced before it could be placed.
|
|
626
|
+
placeWaitingChildren(childSessionId, { announce });
|
|
627
|
+
return entry;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// A prompt was on its way to a sub-agent when its panel went away (the user
|
|
631
|
+
// closed it, its parent's tab was closed, its session was deleted somewhere
|
|
632
|
+
// else), and the send then failed. It is kept for that sub-agent: back in its
|
|
633
|
+
// compose box when its panel is opened again, or now, when it already is
|
|
634
|
+
// open again. The main panel says so, once.
|
|
635
|
+
function keepUnsent(entry, item, { error = '' } = {}) {
|
|
636
|
+
if (!_unsent.keep(entry.sessionId, item)) return;
|
|
637
|
+
let label = '';
|
|
638
|
+
try { label = entry.instance?.title?.() || ''; } catch { label = ''; }
|
|
639
|
+
const { sessionId, parentSessionId } = entry;
|
|
640
|
+
try {
|
|
641
|
+
_primary?.store?.pushError({
|
|
642
|
+
message: unsentSubagentNotice({ item, label, error }),
|
|
643
|
+
notice: true,
|
|
644
|
+
// The way to it, whatever became of its task card. (A notice that
|
|
645
|
+
// offers something goes when that is chosen.)
|
|
646
|
+
actions: [{
|
|
647
|
+
label: 'Open sub-agent',
|
|
648
|
+
run: (err) => { if (openWithUnsent({ sessionId, parentSessionId, label })) _primary?.store?.dismissError?.(err.id); },
|
|
649
|
+
}],
|
|
650
|
+
});
|
|
651
|
+
} catch (err) { console.warn('[ocp-v2-manager] reporting an unsent sub-agent prompt failed', err); }
|
|
652
|
+
const now = _panels.get(entry.sessionId);
|
|
653
|
+
if (now && now !== entry) { try { now.instance?.restoreUnsent?.(); } catch {} }
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// "Open sub-agent" on that notice: its panel, with the prompt back in its
|
|
657
|
+
// compose box. A sub-agent that cannot have a panel any more (its parent is
|
|
658
|
+
// no tab of this window now, or an automation owns it) has what was kept for
|
|
659
|
+
// it moved to notices of the main panel (Put back / Discard): nothing stays
|
|
660
|
+
// where nobody can get at it. False when neither could be done.
|
|
661
|
+
function openWithUnsent({ sessionId, parentSessionId, label }) {
|
|
662
|
+
if (openChildSession(parentSessionId, sessionId) || _panels.has(sessionId)) return true;
|
|
663
|
+
const items = _unsent.peek(sessionId);
|
|
664
|
+
if (!items.length) return true;
|
|
665
|
+
if (typeof _primary?.keepPrompts !== 'function') return false;
|
|
666
|
+
try { _primary.keepPrompts(items, label); } catch (err) {
|
|
667
|
+
console.warn('[ocp-v2-manager] keeping an unsent sub-agent prompt failed', err);
|
|
668
|
+
return false;
|
|
669
|
+
}
|
|
670
|
+
_unsent.take(sessionId);
|
|
671
|
+
return true;
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// The panel is gone (the user closed it, or destroyPanel took it down).
|
|
675
|
+
function onChildClosed(entry, { byUser = false, waiting = [], label = '' } = {}) {
|
|
676
|
+
if (_panels.get(entry.sessionId) !== entry) return;
|
|
677
|
+
_panels.remove(entry.sessionId);
|
|
678
|
+
try { entry.wsUnsub?.(); } catch {}
|
|
679
|
+
try { entry.runSub?.(); } catch {}
|
|
680
|
+
// A request that was waiting for the user in this panel still waits in
|
|
681
|
+
// OpenCode: it shows in the nearest parent that has a panel, at once.
|
|
682
|
+
if (entry.handRequestsOver !== false) {
|
|
683
|
+
try { handOverRequests(entry.store, { within: entry.rootSessionId }); } catch (err) { console.warn('[ocp-v2-manager] handing over a closed panel\'s requests failed', err); }
|
|
684
|
+
}
|
|
685
|
+
// Closed by the user: it stays closed. Gone with its session or its parent's
|
|
686
|
+
// tab (`released`): nothing to remember.
|
|
687
|
+
if (byUser && !entry.released) _closed.close(entry.sessionId, entry.rootSessionId);
|
|
688
|
+
// Nobody was asked about what was still unsent in its compose box: kept for the user.
|
|
689
|
+
if (!byUser && waiting.length) {
|
|
690
|
+
try { _primary?.keepPrompts?.(waiting, label); } catch (err) { console.warn('[ocp-v2-manager] keeping a closed sub-agent panel\'s prompts failed', err); }
|
|
691
|
+
}
|
|
692
|
+
requestOpencodeView({ removed: entry.panelId });
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
// Takes a sub-agent panel down because its session, or its parent's, went.
|
|
696
|
+
// lost nobody closed it by hand: what was waiting in it is kept (onChildClosed)
|
|
697
|
+
// requests false when the sessions themselves are gone (deleted, or their
|
|
698
|
+
// tab was closed): no request of theirs is handed to a parent
|
|
699
|
+
function destroyPanel(entry, { lost = true, requests = true } = {}) {
|
|
700
|
+
if (!entry || _panels.get(entry.sessionId) !== entry) return;
|
|
701
|
+
entry.released = true;
|
|
702
|
+
if (!requests) entry.handRequestsOver = false;
|
|
703
|
+
try { entry.instance?.unmount?.({ byUser: !lost }); } catch (err) { console.warn('[ocp-v2-manager] closing a sub-agent panel failed', err); }
|
|
704
|
+
// (unmount reports through onClose; this is for a panel that threw on the way.)
|
|
705
|
+
if (_panels.get(entry.sessionId) === entry) onChildClosed(entry, { byUser: !lost });
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// The panel of `sessionId` and every panel below it go, at any depth: the
|
|
709
|
+
// session became an automation's (or is one).
|
|
710
|
+
function destroyPanelsOf(sessionId) {
|
|
711
|
+
if (!sessionId) return;
|
|
712
|
+
for (const entry of entriesUnder(_panels.all(), sessionId, _parentOf)) destroyPanel(entry, { lost: true });
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/**
|
|
716
|
+
* The parent session left the main panel for good: its tab was closed or its
|
|
717
|
+
* session is gone. Its sub-agents' panels and pills go with it.
|
|
718
|
+
* lost it went by itself (deleted somewhere else, lost by OpenCode): the
|
|
719
|
+
* user could not be asked, so what was still unsent in those panels
|
|
720
|
+
* is kept on notices. A tab the user closed was asked about it
|
|
721
|
+
* (subagentPromptsWaiting is part of that question).
|
|
722
|
+
*/
|
|
723
|
+
export function releaseSubagentPanels(rootSessionId, { lost = false } = {}) {
|
|
724
|
+
if (!rootSessionId) return;
|
|
725
|
+
for (const entry of _panels.ofRoot(rootSessionId)) destroyPanel(entry, { lost, requests: false });
|
|
726
|
+
_closed.forgetRoot(rootSessionId);
|
|
727
|
+
syncSubagentTray();
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
/** What is still unsent in the sub-agent panels of `rootSessionId` (their queues and drafts). */
|
|
731
|
+
export function subagentPromptsWaiting(rootSessionId) {
|
|
732
|
+
const waiting = [];
|
|
733
|
+
for (const entry of _panels.ofRoot(rootSessionId)) {
|
|
734
|
+
try { waiting.push(...(entry.instance?.waiting?.() || [])); } catch { /* a panel that cannot say holds nothing */ }
|
|
735
|
+
}
|
|
736
|
+
return waiting;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// ── Which panel is on screen ────────────────────────────────────────────────
|
|
740
|
+
|
|
741
|
+
function visibleEntry() {
|
|
742
|
+
return _panels.all().find((entry) => entry.instance?.isVisible?.()) || null;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
// True while requestOpencodeView applies its own decision: a panel that goes
|
|
746
|
+
// off screen then was told to, and is not reported as yielded.
|
|
747
|
+
let _applying = false;
|
|
748
|
+
|
|
749
|
+
/**
|
|
750
|
+
* The one way an OpenCode panel goes on or off screen: the main panel, every
|
|
751
|
+
* sub-agent panel, the pills, the breadcrumbs, the task cards and the navbar
|
|
752
|
+
* button ask here, and decideVisibility (ocp-v2-subagents-logic.js) answers.
|
|
753
|
+
* Showing a panel goes through the shared side panel controller, which takes
|
|
754
|
+
* the slot from whatever other provider (Claude, Codex) had it.
|
|
755
|
+
*/
|
|
756
|
+
export function requestOpencodeView(request) {
|
|
757
|
+
const entries = _panels.all();
|
|
758
|
+
const views = [MAIN_VIEW, ...entries.map((entry) => entry.panelId)];
|
|
759
|
+
const visible = [
|
|
760
|
+
...(_mainView?.isVisible?.() ? [MAIN_VIEW] : []),
|
|
761
|
+
...entries.filter((entry) => entry.instance?.isVisible?.()).map((entry) => entry.panelId),
|
|
762
|
+
];
|
|
763
|
+
const plan = decideVisibility({ views, visible, request });
|
|
764
|
+
const apply = (id, next) => {
|
|
765
|
+
if (id === MAIN_VIEW) { if (_mainView?.owner) setSidepanelVisible(_mainView.owner, next); return; }
|
|
766
|
+
try { _panels.byPanelId(id)?.instance?.applyRequested?.(next); } catch (err) { console.warn('[ocp-v2-manager] sub-agent panel visibility failed', err); }
|
|
767
|
+
};
|
|
768
|
+
const was = _applying;
|
|
769
|
+
_applying = true;
|
|
770
|
+
try {
|
|
771
|
+
for (const id of plan.hide) apply(id, false);
|
|
772
|
+
for (const id of plan.show) apply(id, true);
|
|
773
|
+
} finally { _applying = was; }
|
|
774
|
+
syncSubagentTray();
|
|
775
|
+
noteShown();
|
|
776
|
+
return plan;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// The shared controller put a sub-agent panel on or off screen. Off, and not
|
|
780
|
+
// by a decision made here: another provider's panel has the slot now.
|
|
781
|
+
function onChildVisibility(entry, visible) {
|
|
782
|
+
if (visible) showsFirstTime(entry);
|
|
783
|
+
if (!visible && !_applying && _panels.get(entry.sessionId) === entry) requestOpencodeView({ yielded: entry.panelId });
|
|
784
|
+
else scheduleTraySync();
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// The session of a sub-agent's panel, read whole (info, transcript, run
|
|
788
|
+
// state, requests, todos): once, the first time the panel is on screen. From
|
|
789
|
+
// then on the panel follows its session as the main panel does, also across
|
|
790
|
+
// a reconnect. Until then the sub-agent costs what its pill needs (readPillState).
|
|
791
|
+
function hydrateEntry(entry) {
|
|
792
|
+
if (!entry.hydration) {
|
|
793
|
+
entry.hydrated = true;
|
|
794
|
+
entry.hydration = _hydrations(() => hydrateChildPanel(entry.store, entry.sessionId)).catch((err) => {
|
|
795
|
+
console.warn('[ocp-v2-manager] hydrate child panel failed', err);
|
|
796
|
+
return null;
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
return entry.hydration;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
function showsFirstTime(entry) {
|
|
803
|
+
if (_panels.get(entry.sessionId) !== entry) return;
|
|
804
|
+
hydrateEntry(entry);
|
|
805
|
+
resolveTaskInfo(entry).catch((err) => console.warn('[ocp-v2-manager] looking up a sub-agent\'s brief failed', err));
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// The brief of a sub-agent is on the task card in its parent's transcript. A
|
|
809
|
+
// parent that is a sub-agent itself has its transcript read when its own
|
|
810
|
+
// panel is first shown, so the brief of a sub-agent below it may not be known
|
|
811
|
+
// when its pill is made: it is looked up when its own panel is shown, after
|
|
812
|
+
// the parent's transcript was read for it.
|
|
813
|
+
async function resolveTaskInfo(entry) {
|
|
814
|
+
if (entry.briefed) return;
|
|
815
|
+
const lookup = () => lookupParentTaskInfo(entry.sessionId, entry.parentSessionId);
|
|
816
|
+
let info = lookup();
|
|
817
|
+
const parent = _panels.get(entry.parentSessionId);
|
|
818
|
+
if (!info && parent) {
|
|
819
|
+
await hydrateEntry(parent);
|
|
820
|
+
info = lookup();
|
|
821
|
+
}
|
|
822
|
+
// (The panel may have been closed, or told its brief by an event, meanwhile.)
|
|
823
|
+
if (!info || entry.briefed || _panels.get(entry.sessionId) !== entry) return;
|
|
824
|
+
entry.briefed = true;
|
|
825
|
+
try { entry.instance?.setTaskInfo?.(info); } catch {}
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
// Remembers the sub-agent panel that is on screen, for the reload.
|
|
829
|
+
function noteShown() {
|
|
830
|
+
const entry = visibleEntry();
|
|
831
|
+
_shown.note(entry ? { rootSessionId: entry.rootSessionId, sessionId: entry.sessionId } : null);
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
// ── The tray ────────────────────────────────────────────────────────────────
|
|
835
|
+
|
|
836
|
+
let _groupEl = null; // the pills of the session the main panel is on
|
|
837
|
+
let _summaryEl = null;
|
|
838
|
+
let _traySyncQueued = false;
|
|
839
|
+
let _groupLayoutKey = ''; // what the group's height was last measured for
|
|
840
|
+
let _groupHeight; // the height the group may take (trayGroupHeight), once measured
|
|
841
|
+
|
|
842
|
+
// Store events come in bursts (every streamed token): one tray pass per tick.
|
|
843
|
+
function scheduleTraySync() {
|
|
844
|
+
if (_traySyncQueued) return;
|
|
845
|
+
_traySyncQueued = true;
|
|
846
|
+
setTimeout(() => { _traySyncQueued = false; syncSubagentTray(); }, 0);
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
function tabPillOf(tray, sessionId) {
|
|
850
|
+
for (const node of tray.children || []) {
|
|
851
|
+
if (node?.dataset?.sessionId !== sessionId) continue;
|
|
852
|
+
if (String(node.dataset.owner || '').startsWith('ocp-v2-child-')) continue;
|
|
853
|
+
if (node.classList?.contains('ocpv2-session-pill')) return node;
|
|
854
|
+
}
|
|
855
|
+
return null;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/**
|
|
859
|
+
* Brings the tray in line with the sub-agent panels: the pills of the session
|
|
860
|
+
* the main panel is on, in the order the sub-agents were started, in one
|
|
861
|
+
* bounded group under that session's pill; a count once the group scrolls; and
|
|
862
|
+
* on every parent session's pill whether its sub-agents run or wait. The pills
|
|
863
|
+
* of other sessions' sub-agents are kept out of the tray, as they are.
|
|
864
|
+
*/
|
|
865
|
+
export function syncSubagentTray() {
|
|
866
|
+
const tray = typeof document !== 'undefined' ? document.getElementById('term-minimized-tray') : null;
|
|
867
|
+
if (!tray) return;
|
|
868
|
+
const shownRoot = _primary?.getSessionId?.() || '';
|
|
869
|
+
const entries = _panels.all();
|
|
870
|
+
const byId = new Map(entries.map((entry) => [entry.sessionId, entry]));
|
|
871
|
+
const plan = trayPills({
|
|
872
|
+
entries,
|
|
873
|
+
shownRoot,
|
|
874
|
+
visiblePanelId: visibleEntry()?.panelId || '',
|
|
875
|
+
stateOf: (entry) => entry.instance?.pillState?.() || { state: 'idle' },
|
|
876
|
+
});
|
|
877
|
+
|
|
878
|
+
if (!_groupEl) {
|
|
879
|
+
_groupEl = document.createElement('div');
|
|
880
|
+
_groupEl.classList.add('ocpv2-subagent-pills');
|
|
881
|
+
_summaryEl = document.createElement('div');
|
|
882
|
+
_summaryEl.classList.add('ocpv2-subagent-summary');
|
|
883
|
+
_summaryEl.hidden = true;
|
|
884
|
+
_groupEl.appendChild(_summaryEl);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
// The pills of this session, in order; every other pill leaves the group.
|
|
888
|
+
const wanted = plan.pills.map((pill) => byId.get(pill.sessionId)?.instance?.pill).filter(Boolean);
|
|
889
|
+
for (const node of [...(_groupEl.children || [])]) {
|
|
890
|
+
if (node !== _summaryEl && !wanted.includes(node)) node.remove();
|
|
891
|
+
}
|
|
892
|
+
wanted.forEach((pill, index) => {
|
|
893
|
+
if (_groupEl.children[index + 1] !== pill) _groupEl.insertBefore(pill, _groupEl.children[index + 1] || null);
|
|
894
|
+
});
|
|
895
|
+
|
|
896
|
+
if (_summaryEl.textContent !== plan.summary.text) _summaryEl.textContent = plan.summary.text;
|
|
897
|
+
_summaryEl.classList.toggle('ocpv2-summary-waiting', plan.summary.waiting > 0);
|
|
898
|
+
|
|
899
|
+
// The group sits right under its parent session's pill (or stands alone
|
|
900
|
+
// while that pill is hidden because the main panel is on screen).
|
|
901
|
+
const parentPill = shownRoot ? tabPillOf(tray, shownRoot) : null;
|
|
902
|
+
if (!wanted.length) {
|
|
903
|
+
if (_groupEl.parentNode) _groupEl.remove();
|
|
904
|
+
} else if (parentPill) {
|
|
905
|
+
if (parentPill.nextSibling !== _groupEl) tray.insertBefore(_groupEl, parentPill.nextSibling);
|
|
906
|
+
} else if (_groupEl.parentNode !== tray) {
|
|
907
|
+
tray.appendChild(_groupEl);
|
|
908
|
+
}
|
|
909
|
+
const docked = !!wanted.length && !!parentPill && parentPill.style?.display !== 'none';
|
|
910
|
+
_groupEl.classList.toggle('ocpv2-pills-docked', docked);
|
|
911
|
+
// The tray ends inside the window: the group takes the room the other pills
|
|
912
|
+
// leave (trayGroupHeight), however little that is, and scrolls inside it.
|
|
913
|
+
// Measured when the pills or their place changed, not on every state change
|
|
914
|
+
// of a sub-agent.
|
|
915
|
+
const layoutKey = `${wanted.length}|${shownRoot}|${docked}|${tray.children.length}`;
|
|
916
|
+
if (wanted.length && layoutKey !== _groupLayoutKey) {
|
|
917
|
+
_groupLayoutKey = layoutKey;
|
|
918
|
+
try {
|
|
919
|
+
const trayBox = tray.getBoundingClientRect();
|
|
920
|
+
_groupHeight = trayGroupHeight({ trayTop: trayBox.top, othersHeight: trayBox.height - _groupEl.getBoundingClientRect().height, viewportHeight: window.innerHeight });
|
|
921
|
+
_groupEl.style.maxHeight = `${_groupHeight}px`;
|
|
922
|
+
} catch { /* the stylesheet's bound holds */ }
|
|
923
|
+
}
|
|
924
|
+
// More pills than the group shows at once (its rows, or the room it got):
|
|
925
|
+
// it scrolls, and the count line says how many there are and how many wait.
|
|
926
|
+
const scrolls = plan.scrolls || trayGroupScrolls({ count: wanted.length, height: _groupHeight });
|
|
927
|
+
_summaryEl.hidden = !scrolls;
|
|
928
|
+
wanted.forEach((pill, index) => pill.classList.toggle('ocpv2-pill-docked', docked && index === 0 && !scrolls));
|
|
929
|
+
|
|
930
|
+
// What each parent session's own pill says about its sub-agents.
|
|
931
|
+
for (const node of tray.children || []) {
|
|
932
|
+
const sessionId = node?.dataset?.sessionId;
|
|
933
|
+
if (!sessionId || node === _groupEl || String(node.dataset.owner || '').startsWith('ocp-v2-child-')) continue;
|
|
934
|
+
if (!node.classList?.contains('ocpv2-session-pill')) continue;
|
|
935
|
+
const flags = plan.parents.get(sessionId) || { hasChild: false, running: false, waiting: false };
|
|
936
|
+
node.classList.toggle('ocpv2-pill-has-child', flags.hasChild);
|
|
937
|
+
node.classList.toggle('ocpv2-pill-child-running', flags.running && !flags.waiting);
|
|
938
|
+
node.classList.toggle('ocpv2-pill-child-waiting', flags.waiting);
|
|
939
|
+
node.classList.toggle('ocpv2-pill-parent-docked', docked && sessionId === shownRoot && !scrolls);
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
// A sub-agent that waits for an answer is brought into view inside the group.
|
|
943
|
+
const waitingPill = plan.firstWaiting ? byId.get(plan.firstWaiting)?.instance?.pill : null;
|
|
944
|
+
if (waitingPill && waitingPill !== _lastWaitingPill && scrolls) {
|
|
945
|
+
try {
|
|
946
|
+
const top = waitingPill.offsetTop - (_summaryEl.offsetHeight || 0) - 4;
|
|
947
|
+
if (top < _groupEl.scrollTop || top + waitingPill.offsetHeight > _groupEl.scrollTop + _groupEl.clientHeight) _groupEl.scrollTop = Math.max(0, top);
|
|
948
|
+
} catch { /* no layout */ }
|
|
949
|
+
}
|
|
950
|
+
_lastWaitingPill = waitingPill || null;
|
|
951
|
+
}
|
|
952
|
+
let _lastWaitingPill = null;
|
|
953
|
+
|
|
954
|
+
// What a pill needs of its session: is it running, and which requests wait
|
|
955
|
+
// for the user (the events before the pill was made reached no store). Read
|
|
956
|
+
// when the pill is made and again after the socket came back. Not its
|
|
957
|
+
// transcript, its session info or its todos: those are the panel's, read
|
|
958
|
+
// when it is first shown.
|
|
959
|
+
const PILL_API = {
|
|
960
|
+
sessionStatus: (args) => api.sessionStatus(args),
|
|
961
|
+
permissionList: (args) => api.permissionList(args),
|
|
962
|
+
questionList: (args) => api.questionList(args),
|
|
963
|
+
};
|
|
964
|
+
|
|
965
|
+
// The directory a sub-agent's session runs in: its own, else its parent session's.
|
|
966
|
+
function directoryOf(entry) {
|
|
967
|
+
const s = entry.store.getState();
|
|
968
|
+
if (s.cwd || s.sessionInfo?.directory) return s.cwd || s.sessionInfo.directory;
|
|
969
|
+
const main = _primary?.store?.getState?.();
|
|
970
|
+
if (!main) return undefined;
|
|
971
|
+
if (_primary.getSessionId?.() === entry.rootSessionId) return main.cwd || main.sessionInfo?.directory || undefined;
|
|
972
|
+
return main.knownSessions?.get?.(entry.rootSessionId)?.directory || undefined;
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
function pillRead(entry) {
|
|
976
|
+
return rehydrateSessionState(entry.store, PILL_API, {
|
|
977
|
+
sessionId: entry.sessionId,
|
|
978
|
+
cwd: directoryOf(entry),
|
|
979
|
+
hasPanel: hasSessionStore,
|
|
980
|
+
isDescendant: isDescendantSession,
|
|
981
|
+
isCurrent: () => _panels.get(entry.sessionId)?.store === entry.store,
|
|
982
|
+
});
|
|
983
|
+
}
|
|
984
|
+
|
|
985
|
+
function readPillState(entry) {
|
|
986
|
+
return _hydrations(() => {
|
|
987
|
+
// Closed meanwhile, or shown: then the panel's own read covers it.
|
|
988
|
+
if (_panels.get(entry.sessionId) !== entry || entry.hydrated) return null;
|
|
989
|
+
return pillRead(entry);
|
|
990
|
+
}).catch((err) => {
|
|
991
|
+
console.warn('[ocp-v2-manager] reading what a sub-agent\'s pill needs failed', err);
|
|
992
|
+
return null;
|
|
993
|
+
});
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
// Session info, transcript, run state and the sub-agent's own pending approvals,
|
|
997
|
+
// read from the server (for a panel that was never shown: what its pill
|
|
998
|
+
// needs, see above). Runs when the panel is first shown and again after
|
|
999
|
+
// the socket came back: a permission request or the end of the turn that
|
|
1000
|
+
// happened during the outage reached no panel. Answers that arrive after the
|
|
1001
|
+
// panel was closed are dropped (`isCurrent`).
|
|
1002
|
+
function hydrateChildPanel(store, sessionId, { refreshInfo = true } = {}) {
|
|
1003
|
+
const entry = _panels.get(sessionId);
|
|
1004
|
+
if (entry && entry.store === store && !entry.hydrated) {
|
|
1005
|
+
return pillRead(entry).then((live) => ({ info: false, transcript: false, pill: true, live, moved: false, unavailable: false, error: '' }));
|
|
1006
|
+
}
|
|
1007
|
+
return rehydratePanelSession(store, api, {
|
|
1008
|
+
sessionId,
|
|
1009
|
+
refreshInfo,
|
|
1010
|
+
hasPanel: hasSessionStore,
|
|
1011
|
+
isDescendant: isDescendantSession,
|
|
1012
|
+
isCurrent: () => _panels.get(sessionId)?.store === store,
|
|
1013
|
+
});
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
// A task card's "Open sub-agent", or a crumb: show the child session's panel,
|
|
1017
|
+
// making it when it has none (also one the user had closed). Returns true when
|
|
1018
|
+
// a panel was shown.
|
|
1019
|
+
export function openChildSession(parentSessionId, childSessionId) {
|
|
1020
|
+
if (!parentSessionId || !childSessionId) return false;
|
|
1021
|
+
const entry = ensureChildSpawn(parentSessionId, childSessionId, null, null, lookupParentTaskInfo(childSessionId, parentSessionId), { announce: false, reopen: true, inferred: true });
|
|
1022
|
+
if (!entry) return false;
|
|
1023
|
+
requestOpencodeView({ show: entry.panelId });
|
|
1024
|
+
return !!entry.instance?.isVisible?.();
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/** Every sub-agent panel, in the order the sub-agents were started. */
|
|
1028
|
+
export function getChildPanels() {
|
|
1029
|
+
return _panels.all().map((entry) => ({
|
|
1030
|
+
panelId: entry.panelId,
|
|
1031
|
+
sessionId: entry.sessionId,
|
|
1032
|
+
parentSessionId: entry.parentSessionId,
|
|
1033
|
+
rootSessionId: entry.rootSessionId,
|
|
1034
|
+
visible: !!entry.instance?.isVisible?.(),
|
|
1035
|
+
}));
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
/** The panel of one sub-agent session, or null. */
|
|
1039
|
+
export function getChildPanel(sessionId) {
|
|
1040
|
+
return _panels.get(sessionId)?.instance || null;
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
// True when a sub-agent of `parentSessionId` (the session in the main panel)
|
|
1044
|
+
// is still running. Used by the plan lifecycle to defer PLAN COMPLETE
|
|
1045
|
+
// finalization until the sub-agents have reported back.
|
|
1046
|
+
export function hasRunningChildForParent(parentSessionId) {
|
|
1047
|
+
if (!parentSessionId) return false;
|
|
1048
|
+
if (!_primary || _primary.getSessionId?.() !== parentSessionId) return false;
|
|
1049
|
+
return _panels.ofRoot(parentSessionId).some((entry) => {
|
|
1050
|
+
try { return !!entry.store?.getState?.().running; } catch { return false; }
|
|
1051
|
+
});
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
export function isChildPanelOpen() {
|
|
1055
|
+
return !!visibleEntry();
|
|
1056
|
+
}
|
|
1057
|
+
|
|
1058
|
+
export function getVisibleChildPanel() {
|
|
1059
|
+
return visibleEntry()?.instance || null;
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
export function destroyChildPanelById(panelId) {
|
|
1063
|
+
const entry = _panels.byPanelId(panelId);
|
|
1064
|
+
if (entry) destroyPanel(entry, { lost: true });
|
|
1065
|
+
}
|