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,1002 @@
|
|
|
1
|
+
import { detectProject as memoryProject } from '../../mcp-server/dist/config.js';
|
|
2
|
+
import { Codex } from '@openai/codex-sdk';
|
|
3
|
+
import { query as claudeQuery } from '@anthropic-ai/claude-agent-sdk';
|
|
4
|
+
import { CLAUDE_EFFORT_LEVELS } from './claude-model-catalog.js';
|
|
5
|
+
import { CLAUDE_NOT_INSTALLED, resolveClaudeSdkExecutable } from './claude-executable.js';
|
|
6
|
+
import { extractOpenCodeText } from './session-title-generator.js';
|
|
7
|
+
import { patchCodexLineSplitting } from './jsonl-lines.js';
|
|
8
|
+
import { dirname } from 'node:path';
|
|
9
|
+
import { codexReasoningEffort } from './effort-levels.js';
|
|
10
|
+
import { codexStreamMedia, collectCodexMedia, openCodeMediaPart, ownCodexImages } from './assistant-media.js';
|
|
11
|
+
import { browserToolDenial } from './browser-tool-policy.js';
|
|
12
|
+
import { CODEX_BROWSER_POLICY_UNTRUSTED_NOTE, codexBrowserPolicyHook } from './assistant-route-gate-codex.js';
|
|
13
|
+
|
|
14
|
+
function stringEnv(source) {
|
|
15
|
+
const out = {};
|
|
16
|
+
for (const [key, value] of Object.entries(source || {})) {
|
|
17
|
+
if (value !== undefined && value !== null) out[key] = String(value);
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function cleanClaudeEnvironment(source = process.env) {
|
|
23
|
+
const env = {};
|
|
24
|
+
for (const [key, value] of Object.entries(source || {})) {
|
|
25
|
+
if (key === 'CLAUDECODE' || key === 'TERM_PROGRAM' || key === 'TERM_PROGRAM_VERSION') continue;
|
|
26
|
+
if (key.startsWith('VSCODE_')) continue;
|
|
27
|
+
env[key] = value;
|
|
28
|
+
}
|
|
29
|
+
env.ENABLE_TOOL_SEARCH = 'true';
|
|
30
|
+
return env;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function settleWithin(promise, timeoutMs = 1500) {
|
|
34
|
+
let timer;
|
|
35
|
+
try {
|
|
36
|
+
return await Promise.race([
|
|
37
|
+
Promise.resolve(promise),
|
|
38
|
+
new Promise((resolveWait) => { timer = setTimeout(resolveWait, timeoutMs); }),
|
|
39
|
+
]);
|
|
40
|
+
} finally {
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function createInputQueue() {
|
|
46
|
+
const values = [];
|
|
47
|
+
let wake = null;
|
|
48
|
+
let closed = false;
|
|
49
|
+
return {
|
|
50
|
+
push(value) {
|
|
51
|
+
if (closed) return false;
|
|
52
|
+
values.push(value);
|
|
53
|
+
if (wake) { const resolveWake = wake; wake = null; resolveWake(); }
|
|
54
|
+
return true;
|
|
55
|
+
},
|
|
56
|
+
close() {
|
|
57
|
+
closed = true;
|
|
58
|
+
if (wake) { const resolveWake = wake; wake = null; resolveWake(); }
|
|
59
|
+
},
|
|
60
|
+
async *[Symbol.asyncIterator]() {
|
|
61
|
+
while (!closed || values.length) {
|
|
62
|
+
while (values.length) yield values.shift();
|
|
63
|
+
if (closed) return;
|
|
64
|
+
await new Promise((resolveWake) => { wake = resolveWake; });
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function asAbortError(reason = 'aborted') {
|
|
71
|
+
const error = new Error(reason);
|
|
72
|
+
error.name = 'AbortError';
|
|
73
|
+
return error;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function providerErrorMessage(error, fallback = 'Provider request failed') {
|
|
77
|
+
if (!error) return fallback;
|
|
78
|
+
if (typeof error === 'string') return error;
|
|
79
|
+
return error?.data?.message || error?.message || error?.name || fallback;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function codexFailureMessage(error) {
|
|
83
|
+
const raw = providerErrorMessage(error, 'Codex turn failed');
|
|
84
|
+
try {
|
|
85
|
+
const parsed = JSON.parse(raw);
|
|
86
|
+
return parsed?.error?.message || parsed?.message || raw;
|
|
87
|
+
} catch { return raw; }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Every level Codex accepts passes through unchanged (max stays max); off → undefined. */
|
|
91
|
+
export function normalizeCodexEffort(effort) {
|
|
92
|
+
return codexReasoningEffort(effort);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function normalizeOpenCodeModel(model) {
|
|
96
|
+
if (!model) return undefined;
|
|
97
|
+
if (typeof model === 'object') return model;
|
|
98
|
+
const value = String(model).trim();
|
|
99
|
+
const slash = value.indexOf('/');
|
|
100
|
+
if (slash <= 0 || slash === value.length - 1) return undefined;
|
|
101
|
+
return { providerID: value.slice(0, slash), modelID: value.slice(slash + 1) };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// ── Task-mode (assistant dispatch) policy helpers ────────────────────────────
|
|
105
|
+
//
|
|
106
|
+
// permissionPolicy: 'auto' (unattended, today's behavior) | 'ask' (route
|
|
107
|
+
// permission prompts through a broker so the orchestrator/user can answer) |
|
|
108
|
+
// 'restricted' (unattended but sandboxed where the provider supports it).
|
|
109
|
+
// capability: 'read-only' | 'workspace' | 'full' — how much the worker may touch.
|
|
110
|
+
|
|
111
|
+
export const PERMISSION_POLICIES = new Set(['auto', 'ask', 'restricted']);
|
|
112
|
+
export const CAPABILITIES = new Set(['read-only', 'workspace', 'full']);
|
|
113
|
+
export const CLAUDE_READ_ONLY_DISALLOWED_TOOLS = ['Write', 'Edit', 'MultiEdit', 'NotebookEdit', 'Bash'];
|
|
114
|
+
|
|
115
|
+
export function normalizePermissionPolicy(policy) {
|
|
116
|
+
const value = String(policy || 'auto').trim().toLowerCase();
|
|
117
|
+
return PERMISSION_POLICIES.has(value) ? value : 'auto';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function normalizeCapability(capability) {
|
|
121
|
+
const value = String(capability || 'full').trim().toLowerCase();
|
|
122
|
+
return CAPABILITIES.has(value) ? value : 'full';
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function codexSandboxModeFor({ permissionPolicy, capability } = {}) {
|
|
126
|
+
const cap = normalizeCapability(capability);
|
|
127
|
+
if (cap === 'read-only') return 'read-only';
|
|
128
|
+
if (cap === 'workspace' || normalizePermissionPolicy(permissionPolicy) === 'restricted') return 'workspace-write';
|
|
129
|
+
return 'danger-full-access';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function policyUnsupportedError(provider, policy) {
|
|
133
|
+
const error = new Error(`${provider} native adapter does not support permission policy "${policy}"`);
|
|
134
|
+
error.code = 'PERMISSION_POLICY_UNSUPPORTED';
|
|
135
|
+
return error;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Final assistant text carried by a Codex SDK stream event, or null. */
|
|
139
|
+
export function codexAgentMessageText(event) {
|
|
140
|
+
if (!event) return null;
|
|
141
|
+
if (event.type === 'item.completed' && event.item?.type === 'agent_message') {
|
|
142
|
+
const text = event.item.text ?? event.item.content;
|
|
143
|
+
return typeof text === 'string' ? text : null;
|
|
144
|
+
}
|
|
145
|
+
if (event.type === 'agent_message') {
|
|
146
|
+
const text = event.text ?? event.message;
|
|
147
|
+
return typeof text === 'string' ? text : null;
|
|
148
|
+
}
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// ── Codex output schemas ─────────────────────────────────────────────────────
|
|
153
|
+
//
|
|
154
|
+
// Codex sends an output schema as a strict response_format: every object must
|
|
155
|
+
// set additionalProperties:false and list every property in `required`, or the
|
|
156
|
+
// turn fails in seconds with "Invalid schema for response_format".
|
|
157
|
+
|
|
158
|
+
const SCHEMA_UNIONS = ['anyOf', 'oneOf', 'allOf'];
|
|
159
|
+
const SCALAR_TYPES = new Set(['string', 'number', 'integer', 'boolean']);
|
|
160
|
+
const isSchema = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
161
|
+
|
|
162
|
+
/** A schema that also accepts null: how a strict schema says a field may be left out. */
|
|
163
|
+
function nullableSchema(schema) {
|
|
164
|
+
if (!isSchema(schema)) return schema;
|
|
165
|
+
const types = Array.isArray(schema.type) ? schema.type : typeof schema.type === 'string' ? [schema.type] : null;
|
|
166
|
+
if (types?.includes('null')) return schema;
|
|
167
|
+
// A plain scalar widens its type. Anything else (an enum or const would still refuse null, an
|
|
168
|
+
// object, an array, a union) gets null as a branch of its own.
|
|
169
|
+
if (types && types.every((type) => SCALAR_TYPES.has(type)) && !('enum' in schema) && !('const' in schema)) return { ...schema, type: [...types, 'null'] };
|
|
170
|
+
if (!types && Array.isArray(schema.anyOf)) {
|
|
171
|
+
return schema.anyOf.some((branch) => branch?.type === 'null') ? schema : { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };
|
|
172
|
+
}
|
|
173
|
+
return { anyOf: [schema, { type: 'null' }] };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* A copy of an output schema in the strict form Codex accepts: every object gets
|
|
178
|
+
* additionalProperties:false and requires all its properties, and a property the
|
|
179
|
+
* caller left optional also accepts null (see dropOptionalNulls). Recurses into
|
|
180
|
+
* properties, items, anyOf / oneOf / allOf and $defs. The caller's schema is not touched.
|
|
181
|
+
*/
|
|
182
|
+
export function strictCodexSchema(schema) {
|
|
183
|
+
if (Array.isArray(schema)) return schema.map(strictCodexSchema);
|
|
184
|
+
if (!isSchema(schema)) return schema;
|
|
185
|
+
const out = { ...schema };
|
|
186
|
+
for (const key of SCHEMA_UNIONS) if (Array.isArray(out[key])) out[key] = out[key].map(strictCodexSchema);
|
|
187
|
+
if (out.items && typeof out.items === 'object') out.items = strictCodexSchema(out.items);
|
|
188
|
+
for (const key of ['$defs', 'definitions']) {
|
|
189
|
+
if (isSchema(out[key])) out[key] = Object.fromEntries(Object.entries(out[key]).map(([name, value]) => [name, strictCodexSchema(value)]));
|
|
190
|
+
}
|
|
191
|
+
const isObject = out.type === 'object' || (Array.isArray(out.type) && out.type.includes('object')) || isSchema(out.properties);
|
|
192
|
+
if (!isObject) return out;
|
|
193
|
+
const wasRequired = new Set(Array.isArray(schema.required) ? schema.required : []);
|
|
194
|
+
out.properties = Object.fromEntries(Object.entries(isSchema(schema.properties) ? schema.properties : {}).map(([name, value]) => {
|
|
195
|
+
const strict = strictCodexSchema(value);
|
|
196
|
+
return [name, wasRequired.has(name) ? strict : nullableSchema(strict)];
|
|
197
|
+
}));
|
|
198
|
+
out.required = Object.keys(out.properties);
|
|
199
|
+
out.additionalProperties = false;
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** The schema itself and every anyOf / oneOf / allOf branch under it: the shapes a value may have. */
|
|
204
|
+
function schemaBranches(schema) {
|
|
205
|
+
if (!isSchema(schema)) return [];
|
|
206
|
+
const out = [schema];
|
|
207
|
+
for (const key of SCHEMA_UNIONS) for (const branch of Array.isArray(schema[key]) ? schema[key] : []) out.push(...schemaBranches(branch));
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* A structured answer read back against the caller's own schema: a null in a field that schema
|
|
213
|
+
* left optional (strictCodexSchema made it required and nullable) means "left out", so the key
|
|
214
|
+
* is dropped. A null in a field the caller required stays.
|
|
215
|
+
*/
|
|
216
|
+
export function dropOptionalNulls(value, schema) {
|
|
217
|
+
if (Array.isArray(value)) {
|
|
218
|
+
const items = schemaBranches(schema).map((branch) => branch.items).find(isSchema) || null;
|
|
219
|
+
return value.map((item) => dropOptionalNulls(item, items));
|
|
220
|
+
}
|
|
221
|
+
if (!value || typeof value !== 'object') return value;
|
|
222
|
+
const shapes = schemaBranches(schema).filter((branch) => isSchema(branch.properties));
|
|
223
|
+
const out = {};
|
|
224
|
+
for (const [key, item] of Object.entries(value)) {
|
|
225
|
+
const owners = shapes.filter((shape) => Object.hasOwn(shape.properties, key));
|
|
226
|
+
if (item === null && owners.length && owners.every((shape) => !(Array.isArray(shape.required) && shape.required.includes(key)))) continue;
|
|
227
|
+
out[key] = dropOptionalNulls(item, owners[0]?.properties[key] || null);
|
|
228
|
+
}
|
|
229
|
+
return out;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** The final message of a turn that had an output schema, as the object it is (optional nulls dropped), else null. */
|
|
233
|
+
function codexStructuredOutput(text, schema) {
|
|
234
|
+
let value = null;
|
|
235
|
+
try { value = JSON.parse(String(text || '').trim()); } catch { return null; }
|
|
236
|
+
return value && typeof value === 'object' ? dropOptionalNulls(value, schema) : null;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/** Create one durable Codex SDK thread and reuse it for every loop iteration. */
|
|
240
|
+
export async function createCodexNativeLoopAdapter(options = {}) {
|
|
241
|
+
const {
|
|
242
|
+
runId, cwd, model, effort, codexHome, codexPath, browserSessionId,
|
|
243
|
+
browserTabId, mcpProfile, onIdentity = () => {}, onEvent = () => {},
|
|
244
|
+
CodexClass = Codex,
|
|
245
|
+
extraEnv = {}, permissionPolicy: rawPolicy = 'auto', capability: rawCapability = 'full',
|
|
246
|
+
outputSchema = null, desktopGrantProvider = null, modelContextWindow = null, contextMode = null,
|
|
247
|
+
// Image creation runs (assistant dispatch): 'image' → each turn returns the images it generated.
|
|
248
|
+
collectMedia = null,
|
|
249
|
+
// Assistant task runs: the browser policy's hook and the run's notes (a function: never in the state file).
|
|
250
|
+
runMode = 'loop', onNote = null, browserPolicyTrust = null,
|
|
251
|
+
} = options;
|
|
252
|
+
const permissionPolicy = normalizePermissionPolicy(rawPolicy);
|
|
253
|
+
const capability = normalizeCapability(rawCapability);
|
|
254
|
+
// "<id>[extended]" (the Assistant's extended-context row) runs <id> with the
|
|
255
|
+
// larger window the dispatcher read from the catalog; never silently at 272k.
|
|
256
|
+
const legacyExtended = /\[extended\]$/i.test(String(model || ''));
|
|
257
|
+
const extended = contextMode === 'extended' || legacyExtended;
|
|
258
|
+
const runModel = legacyExtended ? String(model).replace(/\[extended\]$/i, '') : model;
|
|
259
|
+
if (extended && !(Number(modelContextWindow) > 0)) throw new Error(`Extended context is unavailable for ${runModel}.`);
|
|
260
|
+
// The Codex SDK drives `codex exec`, which has no approval channel: an 'ask'
|
|
261
|
+
// policy would hang or fail mid-turn. Refuse up front so the dispatcher can
|
|
262
|
+
// offer 'restricted' instead.
|
|
263
|
+
if (permissionPolicy === 'ask') throw policyUnsupportedError('Codex', permissionPolicy);
|
|
264
|
+
// Assistant task runs: SynaBun's browser policy as a PreToolUse hook the
|
|
265
|
+
// user's Codex trusts (the brain's route-gate mechanism), and no web search
|
|
266
|
+
// of Codex's own. Without a trusted hook the policy is instructions only
|
|
267
|
+
// (the task prompt), and the run's notes say so.
|
|
268
|
+
const task = runMode === 'task';
|
|
269
|
+
let browserPolicy = null;
|
|
270
|
+
if (task) {
|
|
271
|
+
try { browserPolicy = await codexBrowserPolicyHook({ codexBin: codexPath || null, ...(browserPolicyTrust ? { trust: browserPolicyTrust } : {}) }); } catch { browserPolicy = null; }
|
|
272
|
+
if (!browserPolicy) { try { onNote?.(CODEX_BROWSER_POLICY_UNTRUSTED_NOTE); } catch {} }
|
|
273
|
+
}
|
|
274
|
+
const pins = stringEnv({
|
|
275
|
+
SYNABUN_TERMINAL_SESSION: runId,
|
|
276
|
+
SYNABUN_PROJECT: cwd ? memoryProject(cwd) : 'global',
|
|
277
|
+
SYNABUN_BROWSER_SESSION: browserSessionId,
|
|
278
|
+
SYNABUN_BROWSER_TAB: browserTabId,
|
|
279
|
+
SYNABUN_PROFILE: mcpProfile,
|
|
280
|
+
SYNABUN_TOOL_CATALOG_MODE: 'deferred',
|
|
281
|
+
// Computer-use workers: the grant unlocks the `computer` group in the MCP child.
|
|
282
|
+
SYNABUN_DESKTOP_GRANT: typeof desktopGrantProvider === 'function' ? desktopGrantProvider() || undefined : undefined,
|
|
283
|
+
});
|
|
284
|
+
const env = stringEnv({ ...process.env, ...pins, CODEX_HOME: codexHome, ...(browserPolicy ? { SYNABUN_BROWSER_POLICY_CWD: cwd || process.cwd() } : {}), ...stringEnv(extraEnv) });
|
|
285
|
+
const config = {};
|
|
286
|
+
if (Object.keys(pins).length) config.mcp_servers = { SynaBun: { env: pins } };
|
|
287
|
+
if (extended) config.model_context_window = Math.floor(Number(modelContextWindow));
|
|
288
|
+
if (browserPolicy) Object.assign(config, browserPolicy.config);
|
|
289
|
+
// The SDK is always told which Codex to start: the user's own installation.
|
|
290
|
+
// SynaBun carries none, and left to itself the SDK would look for one inside
|
|
291
|
+
// its own packages and report that as a broken install.
|
|
292
|
+
if (!codexPath && CodexClass === Codex) {
|
|
293
|
+
const error = new Error('Codex CLI not found. Codex is installed separately from SynaBun: install it, then run this again.');
|
|
294
|
+
error.code = 'CODEX_NOT_INSTALLED';
|
|
295
|
+
throw error;
|
|
296
|
+
}
|
|
297
|
+
const codex = new CodexClass({
|
|
298
|
+
...(codexPath ? { codexPathOverride: codexPath } : {}),
|
|
299
|
+
env,
|
|
300
|
+
config,
|
|
301
|
+
});
|
|
302
|
+
// The SDK reads `codex exec --json` with readline, which also breaks lines at
|
|
303
|
+
// U+2028 / U+2029: a command printing one ended the run with "Failed to parse item".
|
|
304
|
+
patchCodexLineSplitting(codex);
|
|
305
|
+
const parent = dirname(cwd || process.cwd());
|
|
306
|
+
const thread = codex.startThread({
|
|
307
|
+
workingDirectory: cwd || process.cwd(),
|
|
308
|
+
model: runModel || undefined,
|
|
309
|
+
modelReasoningEffort: normalizeCodexEffort(effort),
|
|
310
|
+
approvalPolicy: 'never',
|
|
311
|
+
sandboxMode: codexSandboxModeFor({ permissionPolicy, capability }),
|
|
312
|
+
skipGitRepoCheck: true,
|
|
313
|
+
networkAccessEnabled: true,
|
|
314
|
+
...(task ? { webSearchMode: 'disabled' } : {}),
|
|
315
|
+
additionalDirectories: parent && parent !== cwd ? [parent] : undefined,
|
|
316
|
+
});
|
|
317
|
+
let alive = true;
|
|
318
|
+
let activeAbort = null;
|
|
319
|
+
let activeTurn = null;
|
|
320
|
+
// Every runTurn is its own `codex exec`, which numbers its items from item_0
|
|
321
|
+
// again: the sidepanel keys a turn's items by this sequence.
|
|
322
|
+
let providerTurn = 0;
|
|
323
|
+
// Generated images already returned by an earlier turn, and when the thread began (its rollout's day).
|
|
324
|
+
const mediaSeen = new Set();
|
|
325
|
+
let threadStartedMs = 0;
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
identity: () => ({ providerThreadId: thread.id, providerSessionId: thread.id }),
|
|
329
|
+
isAlive: () => alive,
|
|
330
|
+
describe: () => ({
|
|
331
|
+
provider: 'codex', permissionPolicy, capability, sandboxMode: codexSandboxModeFor({ permissionPolicy, capability }),
|
|
332
|
+
...(task ? { browserPolicy: browserPolicy ? 'hook' : 'instructions' } : {}),
|
|
333
|
+
}),
|
|
334
|
+
async runTurn(prompt, meta = {}) {
|
|
335
|
+
if (!alive) throw new Error('Codex native loop is closed');
|
|
336
|
+
if (activeTurn) throw new Error('Codex native loop already has an active turn');
|
|
337
|
+
providerTurn += 1;
|
|
338
|
+
const turn = providerTurn;
|
|
339
|
+
onEvent({
|
|
340
|
+
provider: 'codex',
|
|
341
|
+
runId,
|
|
342
|
+
iteration: meta.iteration,
|
|
343
|
+
providerTurn: turn,
|
|
344
|
+
event: { type: 'synabun.user_prompt', text: String(prompt || '') },
|
|
345
|
+
});
|
|
346
|
+
activeAbort = new AbortController();
|
|
347
|
+
activeTurn = (async () => {
|
|
348
|
+
const turnOptions = { signal: activeAbort.signal };
|
|
349
|
+
const schema = meta.outputSchema || outputSchema;
|
|
350
|
+
// Codex takes strict schemas only: it gets a strict copy, and the answer is read back
|
|
351
|
+
// against the caller's own.
|
|
352
|
+
if (schema && typeof schema === 'object') turnOptions.outputSchema = strictCodexSchema(schema);
|
|
353
|
+
const turnStartedMs = Date.now();
|
|
354
|
+
if (!threadStartedMs) threadStartedMs = turnStartedMs;
|
|
355
|
+
const streamed = await thread.runStreamed(prompt, turnOptions);
|
|
356
|
+
let failure = null;
|
|
357
|
+
let completed = false;
|
|
358
|
+
let text = '';
|
|
359
|
+
let usage = null;
|
|
360
|
+
const media = [];
|
|
361
|
+
try {
|
|
362
|
+
for await (const event of streamed.events) {
|
|
363
|
+
if (event?.type === 'thread.started' && event.thread_id) {
|
|
364
|
+
onIdentity({ providerThreadId: event.thread_id, providerSessionId: event.thread_id });
|
|
365
|
+
}
|
|
366
|
+
const agentText = codexAgentMessageText(event);
|
|
367
|
+
if (agentText !== null) text = agentText;
|
|
368
|
+
const saved = codexStreamMedia(event);
|
|
369
|
+
if (saved) media.push(saved);
|
|
370
|
+
if (event?.type === 'turn.failed') failure = codexFailureMessage(event.error);
|
|
371
|
+
if (event?.type === 'turn.completed') { completed = true; if (event.usage) usage = event.usage; }
|
|
372
|
+
if (event?.type === 'error') failure = codexFailureMessage(event);
|
|
373
|
+
onEvent({ provider: 'codex', runId, iteration: meta.iteration, providerTurn: turn, event });
|
|
374
|
+
}
|
|
375
|
+
} catch (error) {
|
|
376
|
+
if (failure) throw new Error(failure, { cause: error });
|
|
377
|
+
throw error;
|
|
378
|
+
}
|
|
379
|
+
if (failure) throw new Error(failure);
|
|
380
|
+
if (!completed) throw new Error('Codex stream ended before turn.completed');
|
|
381
|
+
const identity = { providerThreadId: thread.id, providerSessionId: thread.id };
|
|
382
|
+
onIdentity(identity);
|
|
383
|
+
// Image creation runs only. The stream carries no image tool items today (the rollout, or
|
|
384
|
+
// generated_images/, does); either way only this thread's own saved files count.
|
|
385
|
+
let found = [];
|
|
386
|
+
if (collectMedia && thread.id) {
|
|
387
|
+
try {
|
|
388
|
+
found = ownCodexImages({ codexHome, threadId: thread.id, items: media });
|
|
389
|
+
if (!found.length) found = await collectCodexMedia({ codexHome, threadId: thread.id, sinceMs: turnStartedMs - 1000, threadStartedMs });
|
|
390
|
+
} catch { found = []; }
|
|
391
|
+
}
|
|
392
|
+
const fresh = found.filter((item) => !mediaSeen.has(item.path));
|
|
393
|
+
for (const item of fresh) mediaSeen.add(item.path);
|
|
394
|
+
// With an output schema the final message is the JSON itself.
|
|
395
|
+
const structured = turnOptions.outputSchema ? codexStructuredOutput(text, schema) : null;
|
|
396
|
+
return { ...identity, text, usage, result: { text, usage }, ...(structured ? { structured } : {}), ...(fresh.length ? { media: fresh } : {}) };
|
|
397
|
+
})();
|
|
398
|
+
try { return await activeTurn; }
|
|
399
|
+
finally { activeTurn = null; activeAbort = null; }
|
|
400
|
+
},
|
|
401
|
+
async abort(reason = 'aborted') {
|
|
402
|
+
if (activeAbort) activeAbort.abort(asAbortError(reason));
|
|
403
|
+
return true;
|
|
404
|
+
},
|
|
405
|
+
async dispose() {
|
|
406
|
+
alive = false;
|
|
407
|
+
if (activeAbort) activeAbort.abort(asAbortError('disposed'));
|
|
408
|
+
},
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/** Create one streaming-input Claude Agent SDK query for the whole loop. */
|
|
413
|
+
export async function createClaudeNativeLoopAdapter(options = {}) {
|
|
414
|
+
const {
|
|
415
|
+
runId, cwd, model, effort, browserSessionId, browserTabId,
|
|
416
|
+
mcpUrl, onIdentity = () => {}, onEvent = () => {}, queryFactory = claudeQuery,
|
|
417
|
+
includePartialMessages = process.platform !== 'win32',
|
|
418
|
+
// Which Claude Code runs the loop: the answer of resolveClaudeSdkExecutable()
|
|
419
|
+
// (lib/claude-executable.js), as the host worked it out. A caller without
|
|
420
|
+
// one names the pieces instead: the cli-config override and the installed CLI.
|
|
421
|
+
claudeExecutable = null, sdkExecutable = null, claudeBin = null, logWarn = console.warn,
|
|
422
|
+
// Task-mode options (assistant dispatch).
|
|
423
|
+
extraEnv = {}, permissionPolicy: rawPolicy = 'auto', permissionBroker = null,
|
|
424
|
+
capability: rawCapability = 'full', maxBudgetUsd = null, outputSchema = null, runMode = 'loop',
|
|
425
|
+
desktopGrantProvider = null,
|
|
426
|
+
} = options;
|
|
427
|
+
const permissionPolicy = normalizePermissionPolicy(rawPolicy);
|
|
428
|
+
const capability = normalizeCapability(rawCapability);
|
|
429
|
+
const askMode = permissionPolicy === 'ask' && typeof permissionBroker?.request === 'function';
|
|
430
|
+
const input = createInputQueue();
|
|
431
|
+
const abortController = new AbortController();
|
|
432
|
+
let alive = true;
|
|
433
|
+
let sessionId = null;
|
|
434
|
+
let activeTurn = null;
|
|
435
|
+
const env = stringEnv({
|
|
436
|
+
...cleanClaudeEnvironment(),
|
|
437
|
+
SYNABUN_TERMINAL_SESSION: runId,
|
|
438
|
+
SYNABUN_PROJECT: cwd ? memoryProject(cwd) : 'global',
|
|
439
|
+
SYNABUN_PROFILE: 'full',
|
|
440
|
+
SYNABUN_BROWSER_SESSION: browserSessionId,
|
|
441
|
+
SYNABUN_BROWSER_TAB: browserTabId,
|
|
442
|
+
SYNABUN_RUN_MODE: runMode === 'task' ? 'task' : undefined,
|
|
443
|
+
...stringEnv(extraEnv),
|
|
444
|
+
});
|
|
445
|
+
const brokerRequest = async (request) => {
|
|
446
|
+
try {
|
|
447
|
+
const reply = await permissionBroker.request({
|
|
448
|
+
runId, provider: 'claude-code', signal: abortController.signal, ...request,
|
|
449
|
+
});
|
|
450
|
+
return reply && typeof reply === 'object' ? reply : { behavior: 'deny' };
|
|
451
|
+
} catch (error) {
|
|
452
|
+
return { behavior: 'deny', message: providerErrorMessage(error, 'Permission request failed') };
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
const headers = stringEnv({
|
|
456
|
+
'X-Synabun-Terminal': runId,
|
|
457
|
+
'X-Synabun-Project': cwd ? memoryProject(cwd) : 'global',
|
|
458
|
+
'X-Synabun-Memory-Session': runId,
|
|
459
|
+
'X-Synabun-Browser-Session': browserSessionId,
|
|
460
|
+
'X-Synabun-Browser-Tab': browserTabId,
|
|
461
|
+
// Computer-use workers: the grant unlocks the `computer` MCP group.
|
|
462
|
+
'X-Synabun-Desktop-Grant': typeof desktopGrantProvider === 'function' ? desktopGrantProvider() || undefined : undefined,
|
|
463
|
+
});
|
|
464
|
+
// Under 'ask' the orchestrator answers permission prompts (and AskUserQuestion
|
|
465
|
+
// becomes a relayed question); otherwise the run is unattended and both
|
|
466
|
+
// interactive tools stay denied. ExitPlanMode is never useful for a worker.
|
|
467
|
+
const denyMatcher = askMode ? 'ExitPlanMode' : 'AskUserQuestion|ExitPlanMode';
|
|
468
|
+
const denyMessage = askMode
|
|
469
|
+
? 'Dispatched workers do not use plan mode.'
|
|
470
|
+
: 'This unattended automation cannot wait for interactive input.';
|
|
471
|
+
const queryOptions = {
|
|
472
|
+
cwd: cwd || process.cwd(),
|
|
473
|
+
permissionMode: askMode ? 'default' : 'bypassPermissions',
|
|
474
|
+
...(askMode ? {} : { allowDangerouslySkipPermissions: true }),
|
|
475
|
+
includePartialMessages: !!includePartialMessages,
|
|
476
|
+
systemPrompt: { type: 'preset', preset: 'claude_code' },
|
|
477
|
+
settingSources: ['user', 'project', 'local'],
|
|
478
|
+
hooks: {
|
|
479
|
+
PreToolUse: [{
|
|
480
|
+
matcher: denyMatcher,
|
|
481
|
+
hooks: [async () => ({
|
|
482
|
+
hookSpecificOutput: {
|
|
483
|
+
hookEventName: 'PreToolUse',
|
|
484
|
+
permissionDecision: 'deny',
|
|
485
|
+
permissionDecisionReason: denyMessage,
|
|
486
|
+
},
|
|
487
|
+
})],
|
|
488
|
+
},
|
|
489
|
+
// Assistant task runs: SynaBun's browser policy (browser-tool-policy.js)
|
|
490
|
+
// on every call, subagents' included, before the bypass and canUseTool.
|
|
491
|
+
...(runMode === 'task' ? [{
|
|
492
|
+
hooks: [async (input) => {
|
|
493
|
+
const reason = browserToolDenial(input?.tool_name, input?.tool_input || {}, { host: 'claude', cwd: cwd || process.cwd() });
|
|
494
|
+
return reason ? { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny', permissionDecisionReason: reason } } : {};
|
|
495
|
+
}],
|
|
496
|
+
}] : [])],
|
|
497
|
+
},
|
|
498
|
+
env,
|
|
499
|
+
abortController,
|
|
500
|
+
canUseTool: async (toolName, toolInput) => {
|
|
501
|
+
if (toolName === 'ExitPlanMode') return { behavior: 'deny', message: denyMessage };
|
|
502
|
+
if (toolName === 'AskUserQuestion') {
|
|
503
|
+
if (!askMode) return { behavior: 'deny', message: denyMessage };
|
|
504
|
+
const reply = await brokerRequest({ kind: 'ask', toolName, input: toolInput, questions: toolInput?.questions || [] });
|
|
505
|
+
if (reply.behavior === 'allow') {
|
|
506
|
+
const answers = reply.answers || reply.updatedInput?.answers || {};
|
|
507
|
+
return { behavior: 'allow', updatedInput: { ...(toolInput || {}), answers } };
|
|
508
|
+
}
|
|
509
|
+
return { behavior: 'deny', message: reply.message || 'The question was not answered.' };
|
|
510
|
+
}
|
|
511
|
+
// Computer use is fully autonomous: its guards live in the desktop service,
|
|
512
|
+
// so the orchestrator is never asked to approve individual actions.
|
|
513
|
+
if (askMode && /^mcp__SynaBun__computer(_apps|_ax|_status)?$/.test(String(toolName))) return { behavior: 'allow', updatedInput: toolInput };
|
|
514
|
+
if (askMode) {
|
|
515
|
+
const reply = await brokerRequest({ kind: 'tool', toolName, input: toolInput });
|
|
516
|
+
if (reply.behavior === 'allow') {
|
|
517
|
+
const allowed = { behavior: 'allow', updatedInput: reply.updatedInput || toolInput };
|
|
518
|
+
if (reply.updatedPermissions) allowed.updatedPermissions = reply.updatedPermissions;
|
|
519
|
+
return allowed;
|
|
520
|
+
}
|
|
521
|
+
return { behavior: 'deny', message: reply.message || 'Denied by the orchestrator.' };
|
|
522
|
+
}
|
|
523
|
+
return { behavior: 'allow', updatedInput: toolInput };
|
|
524
|
+
},
|
|
525
|
+
};
|
|
526
|
+
if (mcpUrl) queryOptions.mcpServers = { SynaBun: { type: 'http', url: mcpUrl, headers } };
|
|
527
|
+
if (model) queryOptions.model = model;
|
|
528
|
+
if (effort && CLAUDE_EFFORT_LEVELS.includes(effort)) queryOptions.effort = effort;
|
|
529
|
+
if (capability === 'read-only') queryOptions.disallowedTools = [...CLAUDE_READ_ONLY_DISALLOWED_TOOLS];
|
|
530
|
+
if (Number(maxBudgetUsd) > 0) queryOptions.maxBudgetUsd = Number(maxBudgetUsd);
|
|
531
|
+
if (outputSchema && typeof outputSchema === 'object') queryOptions.outputFormat = { type: 'json_schema', schema: outputSchema };
|
|
532
|
+
// The loop runs the user's own Claude Code: SynaBun carries none, and the SDK
|
|
533
|
+
// is never left to look for one. The SDK uses pathToClaudeCodeExecutable
|
|
534
|
+
// verbatim with no validation, so the path was vetted where it was resolved
|
|
535
|
+
// (a bare command name would ENOENT under shell:false).
|
|
536
|
+
//
|
|
537
|
+
// Pre-flight only: an unattended loop has no one to prompt, and retries are
|
|
538
|
+
// owned by native-loop-runtime.js. Without a Claude Code to start, the run
|
|
539
|
+
// fails here, with the reason, instead of somewhere inside the first turn.
|
|
540
|
+
const executable = claudeExecutable || resolveClaudeSdkExecutable({ launcher: claudeBin, sdkExecutable });
|
|
541
|
+
if (executable.ignored) logWarn(`[native-loop] ignoring sdkExecutable override — ${executable.ignored}`);
|
|
542
|
+
if (executable.path) {
|
|
543
|
+
queryOptions.pathToClaudeCodeExecutable = executable.path;
|
|
544
|
+
} else if (queryFactory === claudeQuery) {
|
|
545
|
+
const error = new Error(executable.reason || CLAUDE_NOT_INSTALLED);
|
|
546
|
+
error.code = 'CLAUDE_NOT_INSTALLED';
|
|
547
|
+
throw error;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
const q = queryFactory({ prompt: input, options: queryOptions });
|
|
551
|
+
const deltaBuffer = new Map();
|
|
552
|
+
const forwardEvent = (event) => onEvent({ provider: 'claude-code', runId, event });
|
|
553
|
+
const flushDelta = (key) => {
|
|
554
|
+
const slot = deltaBuffer.get(key);
|
|
555
|
+
if (!slot) return;
|
|
556
|
+
deltaBuffer.delete(key);
|
|
557
|
+
clearTimeout(slot.timer);
|
|
558
|
+
const inner = slot.event.event;
|
|
559
|
+
const delta = inner.delta?.type === 'thinking_delta'
|
|
560
|
+
? { ...inner.delta, thinking: slot.text }
|
|
561
|
+
: { ...inner.delta, text: slot.text };
|
|
562
|
+
forwardEvent({ ...slot.event, event: { ...inner, delta } });
|
|
563
|
+
};
|
|
564
|
+
const flushDeltas = () => {
|
|
565
|
+
for (const key of [...deltaBuffer.keys()]) flushDelta(key);
|
|
566
|
+
};
|
|
567
|
+
const emitEvent = (event) => {
|
|
568
|
+
const inner = event?.type === 'stream_event' ? event.event : null;
|
|
569
|
+
const isDelta = inner?.type === 'content_block_delta'
|
|
570
|
+
&& (inner.delta?.type === 'text_delta' || inner.delta?.type === 'thinking_delta');
|
|
571
|
+
if (!isDelta) {
|
|
572
|
+
flushDeltas();
|
|
573
|
+
forwardEvent(event);
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
const key = `${event.parent_tool_use_id || ''}:${inner.index}`;
|
|
577
|
+
let slot = deltaBuffer.get(key);
|
|
578
|
+
if (!slot) {
|
|
579
|
+
slot = { event, text: '', timer: null };
|
|
580
|
+
slot.timer = setTimeout(() => flushDelta(key), 40);
|
|
581
|
+
slot.timer.unref?.();
|
|
582
|
+
deltaBuffer.set(key, slot);
|
|
583
|
+
}
|
|
584
|
+
slot.text += inner.delta.type === 'thinking_delta'
|
|
585
|
+
? (inner.delta.thinking || '')
|
|
586
|
+
: (inner.delta.text || '');
|
|
587
|
+
};
|
|
588
|
+
// total_cost_usd is this CLI process's running total, not the turn's charge:
|
|
589
|
+
// a warm task run reported $7.87 after turn 1 and $7.99 after a $0.12 turn 2.
|
|
590
|
+
// A turn resolves with its own charge (costUsd) beside the total.
|
|
591
|
+
let reportedCostUsd = 0;
|
|
592
|
+
const turnCost = (event) => {
|
|
593
|
+
const total = Number(event?.total_cost_usd);
|
|
594
|
+
if (!Number.isFinite(total) || total <= 0) return { costUsd: 0, totalCostUsd: reportedCostUsd };
|
|
595
|
+
// A smaller total is a fresh counter (a restarted process): it counts in full.
|
|
596
|
+
const costUsd = total >= reportedCostUsd ? total - reportedCostUsd : total;
|
|
597
|
+
reportedCostUsd = total;
|
|
598
|
+
return { costUsd: Number(costUsd.toFixed(8)), totalCostUsd: total };
|
|
599
|
+
};
|
|
600
|
+
let pumpError = null;
|
|
601
|
+
const pump = (async () => {
|
|
602
|
+
try {
|
|
603
|
+
for await (const event of q) {
|
|
604
|
+
if (!alive) break;
|
|
605
|
+
const eventSessionId = event?.session_id || null;
|
|
606
|
+
if (eventSessionId && eventSessionId !== sessionId) {
|
|
607
|
+
sessionId = eventSessionId;
|
|
608
|
+
onIdentity({ providerSessionId: sessionId });
|
|
609
|
+
}
|
|
610
|
+
emitEvent(event);
|
|
611
|
+
if (event?.type === 'result' && activeTurn) {
|
|
612
|
+
const turn = activeTurn;
|
|
613
|
+
activeTurn = null;
|
|
614
|
+
const cost = turnCost(event);
|
|
615
|
+
if (event.subtype === 'success') {
|
|
616
|
+
turn.resolve({
|
|
617
|
+
providerSessionId: sessionId,
|
|
618
|
+
result: event,
|
|
619
|
+
text: typeof event.result === 'string' ? event.result : '',
|
|
620
|
+
usage: event.usage || null,
|
|
621
|
+
costUsd: cost.costUsd,
|
|
622
|
+
totalCostUsd: cost.totalCostUsd,
|
|
623
|
+
structured: event.structured_output ?? null,
|
|
624
|
+
});
|
|
625
|
+
} else {
|
|
626
|
+
const error = new Error((event.errors && event.errors[0]) || event.error || event.result || 'Claude turn failed');
|
|
627
|
+
error.subtype = event.subtype || null;
|
|
628
|
+
if (event.subtype === 'error_max_budget_usd') error.code = 'BUDGET_CAP';
|
|
629
|
+
else if (event.subtype === 'error_max_turns') error.code = 'MAX_TURNS';
|
|
630
|
+
error.costUsd = cost.costUsd;
|
|
631
|
+
error.totalCostUsd = cost.totalCostUsd;
|
|
632
|
+
error.usage = event.usage || null;
|
|
633
|
+
turn.reject(error);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
} catch (error) {
|
|
638
|
+
pumpError = error;
|
|
639
|
+
} finally {
|
|
640
|
+
flushDeltas();
|
|
641
|
+
if (alive) {
|
|
642
|
+
alive = false;
|
|
643
|
+
input.close();
|
|
644
|
+
if (activeTurn) {
|
|
645
|
+
const turn = activeTurn; activeTurn = null;
|
|
646
|
+
turn.reject(pumpError || new Error('Claude session ended before the turn completed'));
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
if (pumpError) throw pumpError;
|
|
651
|
+
})();
|
|
652
|
+
pump.catch((error) => onEvent({
|
|
653
|
+
provider: 'claude-code',
|
|
654
|
+
runId,
|
|
655
|
+
event: { type: 'synabun.error', message: error?.message || String(error) },
|
|
656
|
+
}));
|
|
657
|
+
|
|
658
|
+
return {
|
|
659
|
+
identity: () => ({ providerSessionId: sessionId }),
|
|
660
|
+
isAlive: () => alive,
|
|
661
|
+
describe: () => ({ provider: 'claude-code', permissionPolicy, capability, askMode }),
|
|
662
|
+
runTurn(prompt, meta = {}) {
|
|
663
|
+
if (!alive) return Promise.reject(new Error('Claude native loop is closed'));
|
|
664
|
+
if (activeTurn) return Promise.reject(new Error('Claude native loop already has an active turn'));
|
|
665
|
+
onEvent({
|
|
666
|
+
provider: 'claude-code',
|
|
667
|
+
runId,
|
|
668
|
+
event: { type: 'synabun.user_prompt', text: String(prompt || ''), iteration: meta.iteration },
|
|
669
|
+
});
|
|
670
|
+
return new Promise((resolveTurn, rejectTurn) => {
|
|
671
|
+
activeTurn = { resolve: resolveTurn, reject: rejectTurn, iteration: meta.iteration };
|
|
672
|
+
const ok = input.push({
|
|
673
|
+
type: 'user',
|
|
674
|
+
message: { role: 'user', content: [{ type: 'text', text: prompt }] },
|
|
675
|
+
parent_tool_use_id: null,
|
|
676
|
+
session_id: sessionId || '',
|
|
677
|
+
});
|
|
678
|
+
if (!ok) {
|
|
679
|
+
activeTurn = null;
|
|
680
|
+
rejectTurn(new Error('Claude input stream is closed'));
|
|
681
|
+
}
|
|
682
|
+
});
|
|
683
|
+
},
|
|
684
|
+
async abort(reason = 'aborted') {
|
|
685
|
+
if (activeTurn) {
|
|
686
|
+
const turn = activeTurn; activeTurn = null;
|
|
687
|
+
turn.reject(asAbortError(reason));
|
|
688
|
+
}
|
|
689
|
+
if (!alive) return true;
|
|
690
|
+
try {
|
|
691
|
+
await Promise.race([
|
|
692
|
+
Promise.resolve(q.interrupt?.()),
|
|
693
|
+
new Promise((resolveWait) => setTimeout(resolveWait, 1000)),
|
|
694
|
+
]);
|
|
695
|
+
} catch {}
|
|
696
|
+
return true;
|
|
697
|
+
},
|
|
698
|
+
async dispose() {
|
|
699
|
+
if (activeTurn) {
|
|
700
|
+
const turn = activeTurn; activeTurn = null;
|
|
701
|
+
turn.reject(asAbortError('disposed'));
|
|
702
|
+
}
|
|
703
|
+
alive = false;
|
|
704
|
+
input.close();
|
|
705
|
+
flushDeltas();
|
|
706
|
+
try { abortController.abort(asAbortError('disposed')); } catch {}
|
|
707
|
+
await Promise.race([pump, new Promise((resolveWait) => setTimeout(resolveWait, 1000))]).catch(() => {});
|
|
708
|
+
},
|
|
709
|
+
};
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/** Use a loop-owned OpenCode serve while retaining one native session. */
|
|
713
|
+
export async function createOpenCodeNativeLoopAdapter(options = {}) {
|
|
714
|
+
const {
|
|
715
|
+
runId, cwd, title, model, client, release = async () => {},
|
|
716
|
+
onIdentity = () => {}, onEvent = () => {},
|
|
717
|
+
permissionPolicy: rawPolicy = 'auto', permissionBroker = null,
|
|
718
|
+
capability: rawCapability = 'full', outputSchema = null,
|
|
719
|
+
// Task mode: an explicit OpenCode agent and the effort as a model variant.
|
|
720
|
+
agent = null, effort = null, runMode = 'loop',
|
|
721
|
+
// Image / video creation runs: 'image' | 'video' → each turn returns the files its model generated.
|
|
722
|
+
collectMedia = null,
|
|
723
|
+
} = options;
|
|
724
|
+
if (!client?.session?.create || (!client?.session?.promptAsync && !client?.session?.prompt)) {
|
|
725
|
+
throw new Error('OpenCode native loop requires an isolated SDK client');
|
|
726
|
+
}
|
|
727
|
+
const permissionPolicy = normalizePermissionPolicy(rawPolicy);
|
|
728
|
+
const capability = normalizeCapability(rawCapability);
|
|
729
|
+
const askMode = permissionPolicy === 'ask' && typeof permissionBroker?.request === 'function';
|
|
730
|
+
let alive = true;
|
|
731
|
+
let activeAbort = null;
|
|
732
|
+
let activeTurn = null;
|
|
733
|
+
const eventSource = client.onEvent ? client : client.event;
|
|
734
|
+
let sessionId = null;
|
|
735
|
+
// Assistant text assembled from the SSE stream (message.updated gives roles,
|
|
736
|
+
// message.part.updated gives text parts keyed by message id).
|
|
737
|
+
const messageRoles = new Map();
|
|
738
|
+
const messageOrder = [];
|
|
739
|
+
const textParts = new Map(); // messageID → Map(partID → text)
|
|
740
|
+
const rememberMessage = (info) => {
|
|
741
|
+
if (!info?.id) return;
|
|
742
|
+
if (!messageRoles.has(info.id)) messageOrder.push(info.id);
|
|
743
|
+
if (info.role) messageRoles.set(info.id, info.role);
|
|
744
|
+
else if (!messageRoles.has(info.id)) messageRoles.set(info.id, null);
|
|
745
|
+
};
|
|
746
|
+
// Generated images / videos (`file` parts), kept only for image / video creation runs.
|
|
747
|
+
const mediaParts = new Map(); // partID → { messageID, media }
|
|
748
|
+
const mediaReturned = new Set();
|
|
749
|
+
const rememberPart = (part) => {
|
|
750
|
+
if (!part?.messageID) return;
|
|
751
|
+
if (part.type === 'file') {
|
|
752
|
+
const media = collectMedia ? openCodeMediaPart(part) : null;
|
|
753
|
+
if (media) mediaParts.set(part.id || `${part.messageID}:${mediaParts.size}`, { messageID: part.messageID, media });
|
|
754
|
+
return;
|
|
755
|
+
}
|
|
756
|
+
if (part.type !== 'text' || typeof part.text !== 'string') return;
|
|
757
|
+
if (!messageRoles.has(part.messageID)) rememberMessage({ id: part.messageID, role: null });
|
|
758
|
+
let parts = textParts.get(part.messageID);
|
|
759
|
+
if (!parts) { parts = new Map(); textParts.set(part.messageID, parts); }
|
|
760
|
+
parts.set(part.id || `${parts.size}`, part.text);
|
|
761
|
+
};
|
|
762
|
+
/** { media } with the generated files not returned yet (none: {}). */
|
|
763
|
+
const turnMedia = (extraParts = []) => {
|
|
764
|
+
for (const part of extraParts) rememberPart(part);
|
|
765
|
+
const media = [];
|
|
766
|
+
for (const [id, { messageID, media: item }] of mediaParts) {
|
|
767
|
+
if (mediaReturned.has(id) || messageRoles.get(messageID) === 'user') continue;
|
|
768
|
+
mediaReturned.add(id);
|
|
769
|
+
media.push(item);
|
|
770
|
+
}
|
|
771
|
+
return media.length ? { media } : {};
|
|
772
|
+
};
|
|
773
|
+
const latestAssistantText = () => {
|
|
774
|
+
for (let index = messageOrder.length - 1; index >= 0; index--) {
|
|
775
|
+
const id = messageOrder[index];
|
|
776
|
+
if (messageRoles.get(id) === 'user') continue;
|
|
777
|
+
const parts = textParts.get(id);
|
|
778
|
+
const text = parts ? [...parts.values()].join('\n').trim() : '';
|
|
779
|
+
if (text) return text;
|
|
780
|
+
}
|
|
781
|
+
return '';
|
|
782
|
+
};
|
|
783
|
+
const fetchAssistantText = async () => {
|
|
784
|
+
const local = latestAssistantText();
|
|
785
|
+
if (local || typeof client.session?.messages !== 'function') return local;
|
|
786
|
+
try {
|
|
787
|
+
const response = await settleWithin(client.session.messages({ sessionID: sessionId, directory: cwd || undefined }), 5000);
|
|
788
|
+
const rows = Array.isArray(response?.data) ? response.data : Array.isArray(response) ? response : [];
|
|
789
|
+
for (let index = rows.length - 1; index >= 0; index--) {
|
|
790
|
+
const row = rows[index];
|
|
791
|
+
if (row?.info?.role && row.info.role !== 'assistant') continue;
|
|
792
|
+
const text = extractOpenCodeText(row);
|
|
793
|
+
if (text) return text;
|
|
794
|
+
}
|
|
795
|
+
} catch {}
|
|
796
|
+
return '';
|
|
797
|
+
};
|
|
798
|
+
const brokerRequest = async (request) => {
|
|
799
|
+
try {
|
|
800
|
+
const reply = await permissionBroker.request({ runId, provider: 'opencode', signal: activeAbort?.signal, ...request });
|
|
801
|
+
return reply && typeof reply === 'object' ? reply : { behavior: 'deny' };
|
|
802
|
+
} catch (error) {
|
|
803
|
+
return { behavior: 'deny', message: providerErrorMessage(error, 'Permission request failed') };
|
|
804
|
+
}
|
|
805
|
+
};
|
|
806
|
+
const settleActiveTurn = (error = null, payload = null) => {
|
|
807
|
+
const turn = activeTurn;
|
|
808
|
+
if (!turn || turn.mode !== 'async' || turn.settled) return;
|
|
809
|
+
turn.settled = true;
|
|
810
|
+
if (error) turn.reject(error);
|
|
811
|
+
else turn.resolve({ providerSessionId: sessionId, ...(payload || {}) });
|
|
812
|
+
};
|
|
813
|
+
const finishTurnWithText = () => {
|
|
814
|
+
const turn = activeTurn;
|
|
815
|
+
if (!turn || turn.mode !== 'async' || turn.settled || turn.finishing) return;
|
|
816
|
+
turn.finishing = true;
|
|
817
|
+
fetchAssistantText()
|
|
818
|
+
.then((text) => settleActiveTurn(null, { text, result: { text }, ...turnMedia() }))
|
|
819
|
+
.catch(() => settleActiveTurn(null, { text: '', result: { text: '' }, ...turnMedia() }));
|
|
820
|
+
};
|
|
821
|
+
const unsubscribe = eventSource?.onEvent?.((envelope) => {
|
|
822
|
+
const event = envelope?.event || {};
|
|
823
|
+
const sid = event.sessionID || event.sessionId || event.part?.sessionID || event.info?.sessionID
|
|
824
|
+
|| event.info?.id || event.session?.id || null;
|
|
825
|
+
const eventType = envelope?.eventType || '';
|
|
826
|
+
if (!sessionId) return;
|
|
827
|
+
if (sid && sid !== sessionId) {
|
|
828
|
+
// Another session on the run's own isolated serve is a child (a `task` sub-agent): its
|
|
829
|
+
// messages are forwarded for the usage meter only. Turn control, permissions and questions
|
|
830
|
+
// stay with the run's own session.
|
|
831
|
+
if (/^(message[.:]updated|session[.:](created|updated))$/i.test(eventType)) {
|
|
832
|
+
onEvent({ provider: 'opencode', runId, eventType, event, childSession: true });
|
|
833
|
+
}
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
836
|
+
if (/^message[.:]updated$/i.test(eventType)) rememberMessage(event.info || event.message?.info || null);
|
|
837
|
+
if (/^message[.:]part[.:]updated$/i.test(eventType)) rememberPart(event.part || null);
|
|
838
|
+
if (/question\.asked/i.test(eventType)) {
|
|
839
|
+
const requestID = event.id || event.requestID;
|
|
840
|
+
if (requestID && askMode && client.question?.reply) {
|
|
841
|
+
brokerRequest({ kind: 'ask', toolName: 'question', input: event, questions: event.questions || [] })
|
|
842
|
+
.then((reply) => {
|
|
843
|
+
if (reply.behavior === 'allow') {
|
|
844
|
+
return client.question.reply({ requestID, answers: reply.answers || [], directory: cwd || undefined });
|
|
845
|
+
}
|
|
846
|
+
return client.question?.reject?.({ requestID, directory: cwd || undefined });
|
|
847
|
+
})
|
|
848
|
+
.catch(() => {});
|
|
849
|
+
} else if (requestID && client.question?.reject) {
|
|
850
|
+
client.question.reject({ requestID, directory: cwd || undefined }).catch(() => {});
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
if (/permission\.asked/i.test(eventType)) {
|
|
854
|
+
const requestID = event.id || event.requestID || event.permissionID;
|
|
855
|
+
if (requestID && askMode && client.permission?.reply) {
|
|
856
|
+
brokerRequest({ kind: 'tool', toolName: event.permission || event.type || 'permission', input: event })
|
|
857
|
+
.then((reply) => {
|
|
858
|
+
const decision = reply.behavior === 'allow' ? (reply.always ? 'always' : 'once') : 'reject';
|
|
859
|
+
return client.permission.reply({ requestID, reply: decision, directory: cwd || undefined });
|
|
860
|
+
})
|
|
861
|
+
.catch(() => {});
|
|
862
|
+
} else if (requestID && client.permission?.reply) {
|
|
863
|
+
client.permission.reply({ requestID, reply: 'always', directory: cwd || undefined }).catch(() => {});
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
// promptAsync acknowledges immediately, so the durable SSE stream is the
|
|
867
|
+
// source of truth for turn completion. This avoids holding a five-minute
|
|
868
|
+
// synchronous fetch open and misclassifying a long, healthy turn as
|
|
869
|
+
// `native:iteration-error | fetch failed`.
|
|
870
|
+
const ownsTurnEvent = !!sid && sid === sessionId;
|
|
871
|
+
if (ownsTurnEvent && /^session[.:]idle$/i.test(eventType)) finishTurnWithText();
|
|
872
|
+
if (ownsTurnEvent && /^session[.:]error$/i.test(eventType)) {
|
|
873
|
+
const detail = providerErrorMessage(
|
|
874
|
+
event.error || event.info?.error || event.data?.error || event,
|
|
875
|
+
'OpenCode session failed',
|
|
876
|
+
);
|
|
877
|
+
settleActiveTurn(new Error(String(detail)));
|
|
878
|
+
}
|
|
879
|
+
onEvent({ provider: 'opencode', runId, eventType, event });
|
|
880
|
+
}) || (() => {});
|
|
881
|
+
try {
|
|
882
|
+
await client.waitUntilConnected?.(10_000);
|
|
883
|
+
const created = await client.session.create({ directory: cwd || undefined, title: title || 'SynaBun automation' });
|
|
884
|
+
sessionId = created?.data?.id || created?.data?.sessionID || created?.id || created?.sessionID;
|
|
885
|
+
if (!sessionId) throw new Error('OpenCode did not return a session id');
|
|
886
|
+
onIdentity({ providerSessionId: sessionId });
|
|
887
|
+
} catch (error) {
|
|
888
|
+
try { unsubscribe(); } catch {}
|
|
889
|
+
await release().catch(() => {});
|
|
890
|
+
throw error;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
// What the serve stored, for the usage meter's reconcile at a turn's end (assistant-usage.js).
|
|
894
|
+
// A call that fails, times out or is missing on an older serve throws: the caller then knows
|
|
895
|
+
// the turn was not reconciled.
|
|
896
|
+
const storedRows = async (method, id) => {
|
|
897
|
+
if (typeof client.session?.[method] !== 'function') throw new Error(`OpenCode session.${method} is not available`);
|
|
898
|
+
const response = await settleWithin(client.session[method]({ sessionID: id, directory: cwd || undefined }), 5000);
|
|
899
|
+
if (!response || response.error) throw new Error(providerErrorMessage(response?.error, `OpenCode session.${method} did not answer`));
|
|
900
|
+
const rows = Array.isArray(response.data) ? response.data : Array.isArray(response) ? response : null;
|
|
901
|
+
if (!rows) throw new Error(`OpenCode session.${method} returned no list`);
|
|
902
|
+
return rows;
|
|
903
|
+
};
|
|
904
|
+
|
|
905
|
+
return {
|
|
906
|
+
identity: () => ({ providerSessionId: sessionId }),
|
|
907
|
+
isAlive: () => alive,
|
|
908
|
+
describe: () => ({ provider: 'opencode', permissionPolicy, capability, askMode }),
|
|
909
|
+
/** { children(sessionId) → sessions, messages(sessionId) → [{ info }] } on this run's own serve. */
|
|
910
|
+
usageFetchers: () => ({
|
|
911
|
+
children: (id) => storedRows('children', id),
|
|
912
|
+
messages: (id) => storedRows('messages', id),
|
|
913
|
+
}),
|
|
914
|
+
async runTurn(prompt, meta = {}) {
|
|
915
|
+
if (!alive) throw new Error('OpenCode native loop is closed');
|
|
916
|
+
if (activeTurn) throw new Error('OpenCode native loop already has an active turn');
|
|
917
|
+
await client.waitUntilConnected?.(10_000);
|
|
918
|
+
activeAbort = new AbortController();
|
|
919
|
+
const request = {
|
|
920
|
+
sessionID: sessionId,
|
|
921
|
+
parts: [{ type: 'text', text: prompt }],
|
|
922
|
+
model: normalizeOpenCodeModel(model),
|
|
923
|
+
agent: capability === 'read-only' ? 'plan' : (agent ? String(agent) : 'build'),
|
|
924
|
+
directory: cwd || undefined,
|
|
925
|
+
signal: activeAbort.signal,
|
|
926
|
+
};
|
|
927
|
+
// Loops predate variants and may carry Claude-style effort names; only
|
|
928
|
+
// assistant task runs (routed with catalog-validated efforts) send one.
|
|
929
|
+
if (effort && runMode === 'task') request.variant = String(effort);
|
|
930
|
+
const schema = meta.outputSchema || outputSchema;
|
|
931
|
+
if (schema && typeof schema === 'object') request.format = { type: 'json_schema', schema };
|
|
932
|
+
const validateResponse = (response) => {
|
|
933
|
+
const assistantError = response?.data?.info?.error;
|
|
934
|
+
if (response?.error || assistantError || (Number(response?.status) >= 400)) {
|
|
935
|
+
const detail = providerErrorMessage(
|
|
936
|
+
response?.error || assistantError || response?.data?.error,
|
|
937
|
+
`OpenCode prompt failed (${response?.status || 'unknown status'})`,
|
|
938
|
+
);
|
|
939
|
+
throw new Error(String(detail));
|
|
940
|
+
}
|
|
941
|
+
};
|
|
942
|
+
|
|
943
|
+
// Newer OpenCode serves expose promptAsync. Prefer it so an unattended
|
|
944
|
+
// browser turn can run for as long as its loop budget without sitting
|
|
945
|
+
// behind the SDK's synchronous fetch timeout. Retain the synchronous path
|
|
946
|
+
// for older installed OpenCode versions.
|
|
947
|
+
if (client.session.promptAsync) {
|
|
948
|
+
let resolveTurn;
|
|
949
|
+
let rejectTurn;
|
|
950
|
+
const completion = new Promise((resolve, reject) => {
|
|
951
|
+
resolveTurn = resolve;
|
|
952
|
+
rejectTurn = reject;
|
|
953
|
+
});
|
|
954
|
+
// Abort may arrive while promptAsync's acknowledgement is still in
|
|
955
|
+
// flight. Attach a handler immediately so that early rejection is not
|
|
956
|
+
// reported as an unhandled promise before runTurn begins awaiting it.
|
|
957
|
+
completion.catch(() => {});
|
|
958
|
+
const turn = {
|
|
959
|
+
mode: 'async', completion,
|
|
960
|
+
resolve: resolveTurn, reject: rejectTurn, settled: false,
|
|
961
|
+
};
|
|
962
|
+
activeTurn = turn;
|
|
963
|
+
try {
|
|
964
|
+
const response = await client.session.promptAsync(request);
|
|
965
|
+
validateResponse(response);
|
|
966
|
+
return await completion;
|
|
967
|
+
} finally {
|
|
968
|
+
if (activeTurn === turn) activeTurn = null;
|
|
969
|
+
activeAbort = null;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
const turn = { mode: 'sync' };
|
|
974
|
+
activeTurn = turn;
|
|
975
|
+
try {
|
|
976
|
+
const response = await client.session.prompt(request);
|
|
977
|
+
validateResponse(response);
|
|
978
|
+
const text = extractOpenCodeText(response);
|
|
979
|
+
const replyParts = Array.isArray(response?.data?.parts) && response?.data?.info?.role !== 'user' ? response.data.parts : [];
|
|
980
|
+
return { providerSessionId: sessionId, text, result: { text }, ...turnMedia(replyParts) };
|
|
981
|
+
} finally {
|
|
982
|
+
if (activeTurn === turn) activeTurn = null;
|
|
983
|
+
activeAbort = null;
|
|
984
|
+
}
|
|
985
|
+
},
|
|
986
|
+
async abort(reason = 'aborted') {
|
|
987
|
+
if (activeAbort) activeAbort.abort(asAbortError(reason));
|
|
988
|
+
settleActiveTurn(asAbortError(reason));
|
|
989
|
+
try {
|
|
990
|
+
await settleWithin(client.session.abort({ sessionID: sessionId, directory: cwd || undefined }));
|
|
991
|
+
} catch {}
|
|
992
|
+
return true;
|
|
993
|
+
},
|
|
994
|
+
async dispose() {
|
|
995
|
+
alive = false;
|
|
996
|
+
if (activeAbort) activeAbort.abort(asAbortError('disposed'));
|
|
997
|
+
settleActiveTurn(asAbortError('disposed'));
|
|
998
|
+
try { unsubscribe(); } catch {}
|
|
999
|
+
await settleWithin(release());
|
|
1000
|
+
},
|
|
1001
|
+
};
|
|
1002
|
+
}
|