synabun 2.0.10 → 2.2.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 +207 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +22 -0
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +13 -13
- package/hooks/claude-code/pre-websearch.mjs +12 -1
- package/hooks/claude-code/shared.mjs +5 -0
- package/hooks/claude-code/stop.mjs +1 -1
- package/lib/claude-hooks.js +172 -18
- package/lib/client-config-repair.js +30 -17
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +7 -6
- package/lib/first-launch-protection.js +57 -12
- package/lib/mcp-dist.js +176 -0
- package/lib/release-npm-ci.mjs +138 -0
- package/lib/release-publish.mjs +91 -0
- package/lib/release-scan.mjs +50 -0
- package/lib/server-crash-record.js +123 -0
- package/lib/server-exit.js +318 -0
- package/lib/server-supervisor.js +508 -0
- package/lib/start-launcher.js +37 -4
- package/lib/tools-cli.js +45 -0
- package/lib/update-snapshot.js +302 -0
- package/lib/virustotal.mjs +203 -0
- package/lib/windows-crash-event.js +269 -0
- package/mcp-server/dist/http.d.ts +20 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +59 -12
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts +33 -27
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +128 -143
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/preload.js +1 -1
- package/mcp-server/dist/preload.js.map +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
- package/mcp-server/dist/services/budget-judgments.js +5 -3
- package/mcp-server/dist/services/budget-judgments.js.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +81 -28
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/identity.d.ts +2 -2
- package/mcp-server/dist/services/identity.js +2 -2
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
- package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-sessions.js +28 -2
- package/mcp-server/dist/services/memory-sessions.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +18 -11
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +67 -11
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/server-instructions.d.ts +7 -2
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
- package/mcp-server/dist/services/server-instructions.js +22 -63
- package/mcp-server/dist/services/server-instructions.js.map +1 -1
- package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
- package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-catalog.js +339 -0
- package/mcp-server/dist/services/tool-catalog.js.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
- package/mcp-server/dist/services/tool-list.d.ts +108 -0
- package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list.js +334 -0
- package/mcp-server/dist/services/tool-list.js.map +1 -0
- package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
- package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-runtime.js +400 -0
- package/mcp-server/dist/services/tool-runtime.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +1 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
- package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +14 -14
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +29 -19
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
- package/mcp-server/dist/tools/choice.d.ts +6 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -1
- package/mcp-server/dist/tools/choice.js +18 -13
- package/mcp-server/dist/tools/choice.js.map +1 -1
- package/mcp-server/dist/tools/git-tools.js +2 -2
- package/mcp-server/dist/tools/git-tools.js.map +1 -1
- package/mcp-server/dist/tools/image-tools.d.ts +1 -1
- package/mcp-server/dist/tools/image-tools.js +1 -1
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
- package/mcp-server/dist/tools/morelogin.js +9 -6
- package/mcp-server/dist/tools/morelogin.js.map +1 -1
- package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
- package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill-tools.js +642 -0
- package/mcp-server/dist/tools/skill-tools.js.map +1 -0
- package/mcp-server/dist/tools/skill.d.ts +7 -0
- package/mcp-server/dist/tools/skill.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill.js +11 -0
- package/mcp-server/dist/tools/skill.js.map +1 -0
- package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
- package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/tool-groups.js +147 -0
- package/mcp-server/dist/tools/tool-groups.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-format.js +7 -4
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -1
- package/mcp-server/src/http.ts +75 -12
- package/mcp-server/src/index.ts +147 -154
- package/mcp-server/src/preload.ts +12 -12
- package/mcp-server/src/services/budget-judgments.ts +5 -3
- package/mcp-server/src/services/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/identity.ts +2 -2
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/memory-sessions.ts +24 -3
- package/mcp-server/src/services/neural-interface.ts +81 -21
- package/mcp-server/src/services/server-instructions.ts +29 -64
- package/mcp-server/src/services/tool-catalog.ts +403 -0
- package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
- package/mcp-server/src/services/tool-list.ts +410 -0
- package/mcp-server/src/services/tool-runtime.ts +457 -0
- package/mcp-server/src/services/typesafe-config.ts +1 -1
- package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +29 -20
- package/mcp-server/src/tools/choice.ts +17 -12
- package/mcp-server/src/tools/git-tools.ts +2 -2
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/morelogin.ts +6 -4
- package/mcp-server/src/tools/skill-tools.ts +592 -0
- package/mcp-server/src/tools/skill.ts +13 -0
- package/mcp-server/src/tools/tool-groups.ts +164 -0
- package/mcp-server/src/tools/whiteboard-format.ts +9 -3
- package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
- package/neural-interface/i18n/en.json +3953 -228
- package/neural-interface/i18n/pt-BR.json +3901 -179
- package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
- package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
- package/neural-interface/lib/antigravity/acp-connection.js +299 -0
- package/neural-interface/lib/antigravity/bypass.js +100 -0
- package/neural-interface/lib/antigravity/catalog.js +273 -0
- package/neural-interface/lib/antigravity/home.js +260 -0
- package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
- package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
- package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
- package/neural-interface/lib/antigravity/policy.js +74 -0
- package/neural-interface/lib/antigravity/tool-call.js +178 -0
- package/neural-interface/lib/antigravity/transcripts.js +252 -0
- package/neural-interface/lib/antigravity/usage.js +43 -0
- package/neural-interface/lib/assistant-api.js +128 -28
- package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
- package/neural-interface/lib/assistant-brains/claude.js +4 -3
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
- package/neural-interface/lib/assistant-brains/codex.js +9 -5
- package/neural-interface/lib/assistant-brains/opencode.js +120 -54
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
- package/neural-interface/lib/assistant-budget-planner.js +7 -3
- package/neural-interface/lib/assistant-budget-split.js +42 -15
- package/neural-interface/lib/assistant-catalog.js +81 -15
- package/neural-interface/lib/assistant-config.js +6 -3
- package/neural-interface/lib/assistant-dispatch.js +1073 -200
- package/neural-interface/lib/assistant-envelope.js +156 -2
- package/neural-interface/lib/assistant-evidence.js +80 -0
- package/neural-interface/lib/assistant-hidden-models.js +7 -5
- package/neural-interface/lib/assistant-persona.js +93 -19
- package/neural-interface/lib/assistant-plan-permissions.js +25 -9
- package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
- package/neural-interface/lib/assistant-route-gate.js +6 -4
- package/neural-interface/lib/assistant-router.js +245 -38
- package/neural-interface/lib/assistant-runtime.js +214 -30
- package/neural-interface/lib/assistant-task-prompt.js +87 -21
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/assistant-usage.js +29 -0
- package/neural-interface/lib/backup-service.js +626 -4
- package/neural-interface/lib/backup-zip-reader.js +10 -5
- package/neural-interface/lib/backup-zip-writer.js +257 -0
- package/neural-interface/lib/browser-execution.js +10 -2
- package/neural-interface/lib/browser-guard-cdp.js +84 -0
- package/neural-interface/lib/browser-network-guard.js +476 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +198 -38
- package/neural-interface/lib/claude-agent-bridge.js +11 -2
- package/neural-interface/lib/claude-history-cache.js +210 -0
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-model-catalog.js +5 -1
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install-api.js +1 -1
- package/neural-interface/lib/cli-install.js +163 -154
- package/neural-interface/lib/cli-resolver.js +13 -3
- package/neural-interface/lib/cli-update-planner.js +52 -41
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-rollout-reader.js +52 -0
- package/neural-interface/lib/codex-worker-app-server.js +191 -0
- package/neural-interface/lib/confined-fs.js +30 -3
- package/neural-interface/lib/crash-notice-api.js +98 -0
- package/neural-interface/lib/editor-completion-opencode.js +68 -68
- package/neural-interface/lib/editor-git-api.js +3 -20
- package/neural-interface/lib/exec-loop-command.js +13 -10
- package/neural-interface/lib/file-explorer-api.js +74 -40
- package/neural-interface/lib/file-explorer-watch.js +9 -3
- package/neural-interface/lib/git-bash/install.js +52 -6
- package/neural-interface/lib/git-bash/manager.js +59 -17
- package/neural-interface/lib/git-bash/pins.js +12 -0
- package/neural-interface/lib/git-read.js +2 -2
- package/neural-interface/lib/git-status-runner.js +390 -0
- package/neural-interface/lib/git-status-watchdog.js +40 -0
- package/neural-interface/lib/greeting/budgets.js +1 -0
- package/neural-interface/lib/greeting/engine.js +2 -2
- package/neural-interface/lib/greeting/sources.js +10 -12
- package/neural-interface/lib/greeting/writer.js +1 -1
- package/neural-interface/lib/http-guards.js +8 -2
- package/neural-interface/lib/install-details.js +4 -1
- package/neural-interface/lib/mcp-agent-servers.js +67 -0
- package/neural-interface/lib/mcp-client-config.js +35 -33
- package/neural-interface/lib/mcp-external-servers.js +332 -0
- package/neural-interface/lib/mcp-installer.js +2 -1
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/memory-session-capture.js +17 -3
- package/neural-interface/lib/morelogin.js +177 -25
- package/neural-interface/lib/native-loop-providers.js +965 -66
- package/neural-interface/lib/native-loop-runtime.js +290 -42
- package/neural-interface/lib/opencode-config.js +557 -0
- package/neural-interface/lib/opencode-db-schema.js +17 -34
- package/neural-interface/lib/opencode-history.js +48 -218
- package/neural-interface/lib/opencode-mcp-ready.js +108 -0
- package/neural-interface/lib/opencode-native-boundary.js +53 -0
- package/neural-interface/lib/opencode-protocol.js +249 -112
- package/neural-interface/lib/opencode-runtime-config.js +32 -22
- package/neural-interface/lib/opencode-serve-records.js +39 -21
- package/neural-interface/lib/opencode-v2-client.js +48 -153
- package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
- package/neural-interface/lib/opencode-worker-data.js +27 -0
- package/neural-interface/lib/opencode2-client.js +73 -37
- package/neural-interface/lib/opencode2-proxy.js +23 -63
- package/neural-interface/lib/opencode2-translate.js +51 -2
- package/neural-interface/lib/owner-authority.js +249 -0
- package/neural-interface/lib/page-session.js +275 -0
- package/neural-interface/lib/path-confine.js +12 -9
- package/neural-interface/lib/peer-identity.js +793 -0
- package/neural-interface/lib/pty-host/core.js +28 -1
- package/neural-interface/lib/pty-host/lifetime.js +12 -0
- package/neural-interface/lib/pty-host/manager.js +12 -1
- package/neural-interface/lib/remote-policy.js +1 -1
- package/neural-interface/lib/request-gate.js +20 -2
- package/neural-interface/lib/rulesets/api.js +7 -6
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +180 -36
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/rulesets/render.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +81 -31
- package/neural-interface/lib/session-title-generator.js +58 -36
- package/neural-interface/lib/skills/api-v2.js +495 -0
- package/neural-interface/lib/skills/bundle.js +418 -0
- package/neural-interface/lib/skills/catalog.js +298 -0
- package/neural-interface/lib/skills/creation-api.js +191 -0
- package/neural-interface/lib/skills/creation-brief.js +247 -0
- package/neural-interface/lib/skills/creation-sources.js +285 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +569 -0
- package/neural-interface/lib/skills/digest.js +119 -0
- package/neural-interface/lib/skills/discover.js +111 -0
- package/neural-interface/lib/skills/draft-confinement.js +216 -0
- package/neural-interface/lib/skills/eval-confinement.js +399 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +135 -0
- package/neural-interface/lib/skills/evals-api.js +212 -0
- package/neural-interface/lib/skills/evals.js +1573 -0
- package/neural-interface/lib/skills/export.js +203 -0
- package/neural-interface/lib/skills/frontmatter.js +64 -0
- package/neural-interface/lib/skills/health.js +75 -0
- package/neural-interface/lib/skills/json-edit.js +165 -0
- package/neural-interface/lib/skills/known-bridge-digests.json +441 -0
- package/neural-interface/lib/skills/known-bridges.js +96 -0
- package/neural-interface/lib/skills/library.js +823 -0
- package/neural-interface/lib/skills/local-store.js +21 -0
- package/neural-interface/lib/skills/migration.js +433 -0
- package/neural-interface/lib/skills/operations.js +45 -0
- package/neural-interface/lib/skills/ownership.js +427 -0
- package/neural-interface/lib/skills/packages.js +88 -0
- package/neural-interface/lib/skills/reviews.js +212 -0
- package/neural-interface/lib/skills/revision.js +80 -0
- package/neural-interface/lib/skills/roots.js +269 -0
- package/neural-interface/lib/skills/runtime-checks.js +358 -0
- package/neural-interface/lib/skills/scan-assets.js +252 -0
- package/neural-interface/lib/skills/scan-context.js +26 -0
- package/neural-interface/lib/skills/scan-shell.js +324 -0
- package/neural-interface/lib/skills/scan.js +364 -0
- package/neural-interface/lib/skills/scanners.js +54 -0
- package/neural-interface/lib/skills/service.js +530 -0
- package/neural-interface/lib/skills/telemetry.js +119 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/synabun-version.js +1 -1
- package/neural-interface/lib/system-activity.js +1 -1
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/whatsapp/brain.js +7 -3
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/whatsapp/cards.js +22 -9
- package/neural-interface/lib/whatsapp/config.js +1 -1
- package/neural-interface/lib/worker-confinement.js +1268 -0
- package/neural-interface/lib/worker-guard-setting.js +56 -0
- package/neural-interface/lib/worker-mcp-channel.js +175 -0
- package/neural-interface/lib/worker-question.js +74 -0
- package/neural-interface/lib/worker-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +238 -0
- package/neural-interface/lib/worker-sandbox.js +329 -0
- package/neural-interface/package-lock.json +34 -12
- package/neural-interface/package.json +3 -2
- package/neural-interface/public/index.html +3 -1
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +3 -3
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +125 -31
- package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
- package/neural-interface/public/shared/agy/agy-client.js +266 -0
- package/neural-interface/public/shared/agy/agy-commands.js +120 -0
- package/neural-interface/public/shared/agy/agy-copy.js +326 -0
- package/neural-interface/public/shared/agy/agy-diff.js +161 -0
- package/neural-interface/public/shared/agy/agy-events.js +469 -0
- package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
- package/neural-interface/public/shared/agy/agy-options.js +232 -0
- package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
- package/neural-interface/public/shared/agy/agy-render.js +392 -0
- package/neural-interface/public/shared/agy/agy-setup.js +149 -0
- package/neural-interface/public/shared/agy/agy-styles.js +604 -0
- package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
- package/neural-interface/public/shared/api.js +1527 -1336
- package/neural-interface/public/shared/app-frame.js +192 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +36 -6
- package/neural-interface/public/shared/assistant/asst-api.js +1 -1
- package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
- package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
- package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +105 -44
- package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
- package/neural-interface/public/shared/assistant/asst-control.js +205 -26
- package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
- package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
- package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -0
- package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
- package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
- package/neural-interface/public/shared/assistant/asst-panel.js +151 -19
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
- package/neural-interface/public/shared/assistant/asst-render.js +445 -82
- package/neural-interface/public/shared/assistant/asst-route.js +304 -53
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
- package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
- package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
- package/neural-interface/public/shared/assistant/asst-state.js +87 -24
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
- package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
- package/neural-interface/public/shared/automation-context.js +5 -2
- package/neural-interface/public/shared/cc-dropdown.js +89 -19
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
- package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
- package/neural-interface/public/shared/cdx/cdx-output.js +34 -10
- package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
- package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
- package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
- package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-controller.js +218 -0
- package/neural-interface/public/shared/cli-install-view.js +11 -12
- package/neural-interface/public/shared/cli-status.js +11 -10
- package/neural-interface/public/shared/constants.js +5 -4
- package/neural-interface/public/shared/context-menu-areas.js +34 -0
- package/neural-interface/public/shared/context-menu-logic.js +243 -0
- package/neural-interface/public/shared/context-menu-model.js +367 -0
- package/neural-interface/public/shared/context-menu.js +372 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
- package/neural-interface/public/shared/cp/cp-restore.js +162 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/desktop-bridge.js +17 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
- package/neural-interface/public/shared/desktop-titlebar.js +13 -4
- package/neural-interface/public/shared/desktop-update-view.js +21 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/explorer/fx-api.js +4 -4
- package/neural-interface/public/shared/explorer/fx-links.js +3 -3
- package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
- package/neural-interface/public/shared/explorer/fx-main.js +48 -16
- package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
- package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
- package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
- package/neural-interface/public/shared/html-shell.js +30 -15
- package/neural-interface/public/shared/i18n.js +2 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +74 -259
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -21
- package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +60 -50
- package/neural-interface/public/shared/page-session.js +96 -0
- package/neural-interface/public/shared/provider-icons.js +4 -2
- package/neural-interface/public/shared/registry.js +5 -3
- package/neural-interface/public/shared/retired-2d.js +3 -0
- package/neural-interface/public/shared/schedules-view.js +195 -61
- package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
- package/neural-interface/public/shared/settings/settings-data.js +3 -1
- package/neural-interface/public/shared/settings/settings-ia.js +6 -6
- package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
- package/neural-interface/public/shared/settings/settings-rules.js +2 -2
- package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
- package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
- package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
- package/neural-interface/public/shared/showcase-privacy.js +6 -1
- package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
- package/neural-interface/public/shared/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +222 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +133 -0
- package/neural-interface/public/shared/skills/ss-doc.js +173 -0
- package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
- package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
- package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
- package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
- package/neural-interface/public/shared/skills/ss-evals.js +417 -0
- package/neural-interface/public/shared/skills/ss-form.js +159 -0
- package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
- package/neural-interface/public/shared/skills/ss-ids.js +32 -0
- package/neural-interface/public/shared/skills/ss-lint.js +149 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +513 -0
- package/neural-interface/public/shared/skills/ss-resources.js +165 -0
- package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
- package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
- package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
- package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
- package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai.js +237 -0
- package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
- package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
- package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
- package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
- package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
- package/neural-interface/public/shared/skills/studio/sx-dom.js +230 -0
- package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
- package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
- package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
- package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
- package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
- package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
- package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
- package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
- package/neural-interface/public/shared/skills/studio/sx-install-flow.js +282 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +690 -0
- package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
- package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
- package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
- package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
- package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
- package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
- package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
- package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
- package/neural-interface/public/shared/skills/studio/sx-subject.js +249 -0
- package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
- package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
- package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
- package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +426 -0
- package/neural-interface/public/shared/state.js +1 -1
- package/neural-interface/public/shared/streaming-markdown.js +58 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +1822 -1756
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- package/neural-interface/public/shared/text-cache.js +29 -0
- package/neural-interface/public/shared/tool-list-picker.js +55 -0
- package/neural-interface/public/shared/tool-list-storage.js +24 -0
- package/neural-interface/public/shared/tool-list-view.js +112 -0
- package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
- package/neural-interface/public/shared/tour/tour-actor.js +268 -0
- package/neural-interface/public/shared/tour/tour-beats.js +336 -0
- package/neural-interface/public/shared/tour/tour-engine.js +884 -0
- package/neural-interface/public/shared/tour/tour-ink.js +390 -0
- package/neural-interface/public/shared/tour/tour-stage.js +440 -0
- package/neural-interface/public/shared/tour/tour-state.js +40 -0
- package/neural-interface/public/shared/tour/tour-tips.js +99 -0
- package/neural-interface/public/shared/tour/tour.css +144 -0
- package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
- package/neural-interface/public/shared/ui-assistant.js +2 -0
- package/neural-interface/public/shared/ui-automation-studio.js +111 -140
- package/neural-interface/public/shared/ui-claude-panel.js +376 -82
- package/neural-interface/public/shared/ui-cli-banner.js +23 -167
- package/neural-interface/public/shared/ui-command-runner.js +6 -3
- package/neural-interface/public/shared/ui-context-menu.js +295 -0
- package/neural-interface/public/shared/ui-cost-widget.js +57 -59
- package/neural-interface/public/shared/ui-crash-notice.js +187 -0
- package/neural-interface/public/shared/ui-detail.js +15 -3
- package/neural-interface/public/shared/ui-file-explorer.js +48 -6
- package/neural-interface/public/shared/ui-file-links.js +2 -2
- package/neural-interface/public/shared/ui-games.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +50 -47
- package/neural-interface/public/shared/ui-judgments.js +1 -1
- package/neural-interface/public/shared/ui-keybinds.js +33 -2
- package/neural-interface/public/shared/ui-link.js +3 -3
- package/neural-interface/public/shared/ui-menubar.js +10 -20
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
- package/neural-interface/public/shared/ui-navbar.js +49 -24
- package/neural-interface/public/shared/ui-notifications.js +1 -0
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-resume.js +9 -7
- package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
- package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
- package/neural-interface/public/shared/ui-sessions.js +27 -15
- package/neural-interface/public/shared/ui-settings.js +683 -526
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
- package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
- package/neural-interface/public/shared/ui-skills.js +33 -2830
- package/neural-interface/public/shared/ui-styleguide.js +5 -2
- package/neural-interface/public/shared/ui-sync.js +15 -5
- package/neural-interface/public/shared/ui-terminal.js +270 -190
- package/neural-interface/public/shared/ui-tool-updates.js +6 -4
- package/neural-interface/public/shared/ui-tooltip.js +81 -51
- package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
- package/neural-interface/public/shared/ui-trash.js +6 -4
- package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
- package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
- package/neural-interface/public/shared/ui-tutorial.css +47 -100
- package/neural-interface/public/shared/ui-tutorial.js +285 -509
- package/neural-interface/public/shared/ui-update.js +38 -2
- package/neural-interface/public/shared/ui-whiteboard.js +312 -59
- package/neural-interface/public/shared/ui-worker-end.js +5 -1
- package/neural-interface/public/shared/ui-workspaces.js +3 -2
- package/neural-interface/public/shared/view-variant.js +66 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +3 -3
- package/neural-interface/public/shared/whiteboard-list.js +172 -0
- package/neural-interface/public/shared/worker-end.js +10 -3
- package/neural-interface/public/shared/worker-questions.js +34 -0
- package/neural-interface/public/shared/worker-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +2 -2
- package/neural-interface/public/variant/2d/background.js +2 -1
- package/neural-interface/public/variant/2d/context-menu.js +8 -2
- package/neural-interface/public/variant/2d/graph.js +42 -20
- package/neural-interface/public/variant/2d/hulls.js +14 -9
- package/neural-interface/public/variant/2d/lasso.js +11 -7
- package/neural-interface/public/variant/2d/main.js +32 -1
- package/neural-interface/public/variant/2d/minimap.js +11 -13
- package/neural-interface/public/variant/3d/main.js +69 -6
- package/neural-interface/public/variant/3d/map-controls.js +24 -9
- package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat.css +17 -0
- package/neural-interface/public/vendor/caveat/manifest.json +12 -0
- package/neural-interface/public/vendor/yaml/LICENSE +13 -0
- package/neural-interface/public/vendor/yaml/manifest.json +4 -0
- package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
- package/neural-interface/scripts/build-vendor.mjs +32 -0
- package/neural-interface/server.js +4553 -2855
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +34 -12
- package/package.json +17 -3
- package/postinstall.js +9 -4
- package/preuninstall.js +1 -1
- package/setup.js +97 -322
- package/skills/skill-forge/SKILL.md +177 -0
- package/skills/skill-forge/evals/evals.json +54 -0
- package/skills/skill-forge/references/package.md +105 -0
- package/skills/skill-forge/references/review-and-recovery.md +63 -0
- package/skills/skill-forge/references/runtime-profiles.md +20 -0
- package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
- package/skills/synabun/SKILL.md +10 -7
- package/skills/synabun/modules/audit.md +1 -5
- package/skills/synabun/modules/changelog.md +1 -5
- package/skills/synabun/modules/idea.md +1 -1
- package/skills/synabun/modules/memorize.md +6 -9
- package/skills/synabun/modules/schedule.md +6 -6
- package/mcp-server/dist/services/profiles.d.ts +0 -120
- package/mcp-server/dist/services/profiles.d.ts.map +0 -1
- package/mcp-server/dist/services/profiles.js +0 -387
- package/mcp-server/dist/services/profiles.js.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
- package/mcp-server/dist/tools/leonardo.d.ts +0 -13
- package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo.js +0 -21
- package/mcp-server/dist/tools/leonardo.js.map +0 -1
- package/mcp-server/dist/tools/profile.d.ts +0 -17
- package/mcp-server/dist/tools/profile.d.ts.map +0 -1
- package/mcp-server/dist/tools/profile.js +0 -114
- package/mcp-server/dist/tools/profile.js.map +0 -1
- package/mcp-server/src/services/profiles.ts +0 -428
- package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
- package/mcp-server/src/tools/leonardo.ts +0 -30
- package/mcp-server/src/tools/profile.ts +0 -122
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
- package/neural-interface/lib/mcp-profile-servers.js +0 -120
- package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
- package/skills/leonardo/SKILL.md +0 -168
- package/skills/leonardo/icon.svg +0 -1
- package/skills/leonardo/modules/browser-guide.md +0 -378
- package/skills/leonardo/modules/image-prompter.md +0 -283
- package/skills/leonardo/modules/model-advisor.md +0 -100
- package/skills/leonardo/modules/prompt-library.md +0 -110
- package/skills/leonardo/modules/style-guide.md +0 -186
- package/skills/leonardo/modules/video-prompter.md +0 -317
- /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
|
@@ -16,12 +16,12 @@ export function readOpenCodeSessionLink(event = {}) {
|
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
export function
|
|
19
|
+
export function bindOpenCodeChildSessionTools({
|
|
20
20
|
eventType,
|
|
21
21
|
event,
|
|
22
22
|
sourceRuntime,
|
|
23
23
|
sessionToRuntime,
|
|
24
|
-
|
|
24
|
+
sessionTools,
|
|
25
25
|
runtimes,
|
|
26
26
|
}) {
|
|
27
27
|
if (!CHILD_LINK_EVENT_TYPES.has(eventType)) return { bound: false, reason: 'event-type' };
|
|
@@ -41,10 +41,10 @@ export function bindOpenCodeChildSessionProfile({
|
|
|
41
41
|
runtimes?.get(previousRuntimeId)?.sessions?.delete(childSessionId);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
const
|
|
44
|
+
const tools = sourceRuntime.tools || sessionTools?.get(parentSessionId) || null;
|
|
45
45
|
sessionToRuntime.set(childSessionId, sourceRuntimeId);
|
|
46
|
-
if (
|
|
47
|
-
else
|
|
46
|
+
if (tools) sessionTools.set(childSessionId, tools);
|
|
47
|
+
else sessionTools.delete(childSessionId);
|
|
48
48
|
sourceRuntime.sessions?.add(childSessionId);
|
|
49
49
|
|
|
50
50
|
return {
|
|
@@ -52,27 +52,27 @@ export function bindOpenCodeChildSessionProfile({
|
|
|
52
52
|
childSessionId,
|
|
53
53
|
parentSessionId,
|
|
54
54
|
runtimeId: sourceRuntimeId,
|
|
55
|
-
|
|
55
|
+
tools,
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
|
-
* The MCP
|
|
60
|
+
* The MCP tools a sub-agent panel starts with: its parent's. The primary
|
|
61
61
|
* panel's store speaks for the parent only while it is bound to that parent
|
|
62
|
-
* (`parentSessionId`): after a switch its
|
|
63
|
-
* then the parent's saved choice (`
|
|
62
|
+
* (`parentSessionId`): after a switch its tools is another session's, and
|
|
63
|
+
* then the parent's saved choice (`savedTools(parentSessionId)`) or what the
|
|
64
64
|
* child session itself carries is used. Without `parentSessionId` the parent
|
|
65
65
|
* store is trusted as before.
|
|
66
66
|
*/
|
|
67
|
-
export function
|
|
67
|
+
export function inheritChildPanelTools(childStore, parentStore, childInfo = null, { parentSessionId, savedTools } = {}) {
|
|
68
68
|
const parentState = parentStore?.getState?.() || null;
|
|
69
69
|
const parentIsBound = !parentSessionId || parentState?.sessionId === parentSessionId;
|
|
70
|
-
const
|
|
70
|
+
const parentTools = parentIsBound ? (parentState?.tools || null) : null;
|
|
71
71
|
let saved = null;
|
|
72
|
-
if (!
|
|
73
|
-
try { saved =
|
|
72
|
+
if (!parentTools && parentSessionId && typeof savedTools === 'function') {
|
|
73
|
+
try { saved = savedTools(parentSessionId) || null; } catch { saved = null; }
|
|
74
74
|
}
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
77
|
-
return
|
|
75
|
+
const tools = parentTools || saved || childInfo?.tools || null;
|
|
76
|
+
if (tools) childStore?.setTools?.(tools);
|
|
77
|
+
return tools;
|
|
78
78
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { t } from '../i18n.js';
|
|
2
|
+
import { answerWorkerQuestion } from '../worker-questions.js';
|
|
1
3
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
4
|
// OpenCode V2 — WebSocket client (multi-panel)
|
|
3
5
|
// One WS connection serves every OCP v2 panel on the page. Panels register a
|
|
@@ -6,6 +8,7 @@
|
|
|
6
8
|
// listeners (used by the panel manager to spawn child panels).
|
|
7
9
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
8
10
|
|
|
11
|
+
import { createOutcomeNotifications } from './ocp-v2-outcome-notifications.js';
|
|
9
12
|
import { getDefaultStore } from './ocp-v2-state.js';
|
|
10
13
|
import { notify as uiNotify, NOTIF_TYPE } from '../ui-notifications.js';
|
|
11
14
|
import { nativeLoopWindowId } from '../ui-native-window-id.js';
|
|
@@ -20,24 +23,19 @@ import { createAskTracker, createTurnClock, readOpenAsks, unreadAsksNotice, TURN
|
|
|
20
23
|
// predates the list; cleared on every disconnect and refilled on reconnect.
|
|
21
24
|
export const capabilities = createCapabilities();
|
|
22
25
|
export const supports = (...types) => capabilities.hasAll(...types);
|
|
23
|
-
// The @opencode-ai/sdk version the server answered `init` with ('' from a
|
|
24
|
-
// server that does not say).
|
|
25
|
-
let _sdkVersion = '';
|
|
26
|
-
export const sdkVersion = () => _sdkVersion;
|
|
27
26
|
|
|
28
27
|
const _notifiedPermissionIds = new Set();
|
|
29
|
-
|
|
30
|
-
// duplicates until the next time `running` flips back to true (new turn).
|
|
31
|
-
// ERROR locks out future DONE; DONE allows a later ERROR through.
|
|
32
|
-
const _outcomeKey = new WeakMap(); // store → NOTIF_TYPE.DONE | NOTIF_TYPE.ERROR
|
|
33
|
-
const _outcomeSubscribed = new WeakSet(); // stores already wired for reset
|
|
28
|
+
const _outcomes = createOutcomeNotifications();
|
|
34
29
|
|
|
35
30
|
function _fireOutcomeNotify(store, type) {
|
|
36
|
-
const last = _outcomeKey.get(store);
|
|
37
|
-
if (last === type) return;
|
|
38
|
-
if (last === NOTIF_TYPE.ERROR && type === NOTIF_TYPE.DONE) return;
|
|
39
|
-
_outcomeKey.set(store, type);
|
|
40
31
|
const s = store.getState();
|
|
32
|
+
// A sub-agent finishing is an intermediate step of its parent's task, not
|
|
33
|
+
// news on its own: ensureChildSpawn gives every Task/subagent call its own
|
|
34
|
+
// panel and store, so without this a multi-step turn popped one "done" per
|
|
35
|
+
// sub-agent plus one for the task itself. Its own errors still surface —
|
|
36
|
+
// those need attention wherever they happen.
|
|
37
|
+
if (type !== NOTIF_TYPE.ERROR && s.parentSessionId) return;
|
|
38
|
+
if (!_outcomes.take(s, type === NOTIF_TYPE.ERROR ? 'error' : 'done')) return;
|
|
41
39
|
const baseLabel = s.sessionInfo?.title || s.sessionInfo?.info?.title || 'OpenCode';
|
|
42
40
|
const label = s.parentSessionId ? `↳ ${baseLabel}` : baseLabel;
|
|
43
41
|
try {
|
|
@@ -45,18 +43,6 @@ function _fireOutcomeNotify(store, type) {
|
|
|
45
43
|
} catch (err) { console.warn('[ocp-v2-ws] outcome notify failed', err); }
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
function _ensureOutcomeReset(store) {
|
|
49
|
-
if (_outcomeSubscribed.has(store)) return;
|
|
50
|
-
_outcomeSubscribed.add(store);
|
|
51
|
-
try {
|
|
52
|
-
store.subscribe((event, state) => {
|
|
53
|
-
if (event?.type === 'running:set' && state.running) {
|
|
54
|
-
_outcomeKey.delete(store);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
} catch (err) { console.warn('[ocp-v2-ws] outcome subscribe failed', err); }
|
|
58
|
-
}
|
|
59
|
-
|
|
60
46
|
let _ws = null;
|
|
61
47
|
let _connecting = null;
|
|
62
48
|
let _reqSeq = 0;
|
|
@@ -146,7 +132,7 @@ function broadcastServerStatus(payload) {
|
|
|
146
132
|
}
|
|
147
133
|
|
|
148
134
|
// Why OpenCode cannot be used, as the server says it (an OpenCode version
|
|
149
|
-
// SynaBun does not
|
|
135
|
+
// SynaBun does not drive, a port held by an OpenCode server it did not start,
|
|
150
136
|
// a web page where the API should be): one line in each panel's error list,
|
|
151
137
|
// never a second copy of the same sentence while the panel keeps retrying.
|
|
152
138
|
function broadcastServerProblem(text) {
|
|
@@ -173,7 +159,6 @@ export function disconnect() {
|
|
|
173
159
|
export function subscribeSession(sessionId, store) {
|
|
174
160
|
if (!store) return () => {};
|
|
175
161
|
_allStores.add(store);
|
|
176
|
-
_ensureOutcomeReset(store);
|
|
177
162
|
if (!sessionId) {
|
|
178
163
|
// Not yet bound — caller should call again once a session exists.
|
|
179
164
|
return () => { _allStores.delete(store); };
|
|
@@ -252,7 +237,6 @@ function handleMessage(msg) {
|
|
|
252
237
|
p.timeout.cancel();
|
|
253
238
|
if (msg.type === 'init:result') {
|
|
254
239
|
capabilities.set(msg.capabilities);
|
|
255
|
-
if (typeof msg.sdkVersion === 'string') _sdkVersion = msg.sdkVersion;
|
|
256
240
|
if (msg.ready === false && msg.problem) broadcastServerProblem(msg.problem);
|
|
257
241
|
asksReady();
|
|
258
242
|
}
|
|
@@ -382,7 +366,7 @@ export function isKnownDescendantSession(sessionId, ancestorId) {
|
|
|
382
366
|
// ── What waits on the user, read from the server ───────────────────────────
|
|
383
367
|
// The stream says what is asked and answered while the socket is up. What was asked before (the page loaded,
|
|
384
368
|
// a panel was bound to another session, the socket was down) is read from the server (permission:list and
|
|
385
|
-
// question:list
|
|
369
|
+
// question:list), one session at a time: its clocks wait until then. After a
|
|
386
370
|
// reconnect every bound session is read again (rebuildAsks). A list that cannot be read is read again a few
|
|
387
371
|
// times; then the session's clocks count again and its panel says so (noteUnreadAsks).
|
|
388
372
|
|
|
@@ -651,6 +635,41 @@ function request(payload, timeoutMs = 30000, { turnOf = '' } = {}) {
|
|
|
651
635
|
});
|
|
652
636
|
}
|
|
653
637
|
|
|
638
|
+
const workerQuestionRuns = new Map();
|
|
639
|
+
export const hasWorkerQuestions = (sessionId) => workerQuestionRuns.has(sessionId);
|
|
640
|
+
export const forgetWorkerQuestions = (sessionId) => workerQuestionRuns.delete(sessionId);
|
|
641
|
+
const workerQuestions = (run) => (run?.pending || []).filter((p) => p.kind === 'question').map((p) => ({ ...p.input, id: p.protocol?.id, sessionID: run.providerSessionId, _workerRequestId: p.requestId }));
|
|
642
|
+
|
|
643
|
+
export function syncOpenCodeWorkerQuestions(run) {
|
|
644
|
+
if (run.runMode !== 'task') return;
|
|
645
|
+
const sid = run.providerSessionId;
|
|
646
|
+
const previous = workerQuestions(workerQuestionRuns.get(sid));
|
|
647
|
+
workerQuestionRuns.set(sid, run);
|
|
648
|
+
const next = workerQuestions(run);
|
|
649
|
+
for (const req of previous) if (!next.some((n) => n.id === req.id)) _asks.note('question.replied', { id: req.id, sessionID: sid });
|
|
650
|
+
for (const req of next) _asks.note('question.asked', req);
|
|
651
|
+
for (const store of _storesBySession.get(sid) || []) {
|
|
652
|
+
for (const req of previous) if (!next.some((n) => n.id === req.id)) store.removePendingQuestion(req.id);
|
|
653
|
+
for (const req of next) store.addPendingQuestion(req);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
async function answerOpenCodeWorker({ sessionId, requestId, answers }, reject = false) {
|
|
658
|
+
let run = workerQuestionRuns.get(sessionId);
|
|
659
|
+
let pending = workerQuestions(run).find((q) => q.id === requestId);
|
|
660
|
+
// An SSE question can precede the run update. Read the authoritative pending request before answering.
|
|
661
|
+
if (!pending) {
|
|
662
|
+
const res = await fetch(`/api/assistant/runs/${encodeURIComponent(run.runId)}`);
|
|
663
|
+
if (!res.ok) throw new Error(t('workerQuestion.deliveryFailed'));
|
|
664
|
+
const body = await res.json();
|
|
665
|
+
if (!body.run) throw new Error(t('workerQuestion.deliveryFailed'));
|
|
666
|
+
run = body.run; pending = workerQuestions(run).find((q) => q.id === requestId);
|
|
667
|
+
}
|
|
668
|
+
if (pending) await answerWorkerQuestion(run.runId, pending._workerRequestId, { decision: reject ? 'deny' : 'answer', answers });
|
|
669
|
+
for (const store of _storesBySession.get(sessionId) || []) store.removePendingQuestion(requestId);
|
|
670
|
+
return { ok: true, data: true };
|
|
671
|
+
}
|
|
672
|
+
|
|
654
673
|
export const api = {
|
|
655
674
|
init: () => request({ type: 'init', windowId: nativeLoopWindowId }),
|
|
656
675
|
// options: { search, archived, roots, limit }. A server without
|
|
@@ -663,17 +682,17 @@ export const api = {
|
|
|
663
682
|
sessionMessages:(sessionId) => request({ type: 'session:messages', sessionId }),
|
|
664
683
|
sessionContext: ({ sessionId, cwd } = {}) => request({ type: 'session:context', sessionId, cwd }),
|
|
665
684
|
// `human` / `greetingId`: lib/greeting/ (a server that does not know them ignores them).
|
|
666
|
-
send: ({ sessionId, parts, model, agent, mode, variant, cwd,
|
|
667
|
-
request({ type: 'message:send', sessionId, parts, model, agent, mode, variant, cwd,
|
|
685
|
+
send: ({ sessionId, parts, model, agent, mode, variant, cwd, tools, noAbortPrev, human, greetingId }) =>
|
|
686
|
+
request({ type: 'message:send', sessionId, parts, model, agent, mode, variant, cwd, tools, noAbortPrev: !!noAbortPrev, ...(human ? { human: true } : {}), ...(greetingId ? { greetingId } : {}) }, TURN_LIMIT_MS, { turnOf: sessionId }),
|
|
668
687
|
abort: (sessionId) => request({ type: 'message:abort', sessionId }),
|
|
669
|
-
compact: ({ sessionId, cwd,
|
|
688
|
+
compact: ({ sessionId, cwd, tools } = {}) => request({ type: 'session:compact', sessionId, cwd, tools }, 5 * 60 * 1000),
|
|
670
689
|
permissionReply: ({ sessionId, permissionId, response, cwd, message }) =>
|
|
671
690
|
request({ type: 'permission:reply', sessionId, permissionId, response, cwd, message }),
|
|
672
|
-
questionList: ({ cwd, sessionId } = {}) => request({ type: 'question:list', cwd, sessionId }),
|
|
673
|
-
questionReply: ({ requestId, answers, cwd, sessionId }) => request({ type: 'question:reply', requestId, answers, cwd, sessionId }),
|
|
674
|
-
questionReject: ({ requestId, sessionId }) => request({ type: 'question:reject', requestId, sessionId }),
|
|
675
|
-
|
|
676
|
-
|
|
691
|
+
questionList: ({ cwd, sessionId } = {}) => workerQuestionRuns.has(sessionId) ? Promise.resolve({ data: workerQuestions(workerQuestionRuns.get(sessionId)) }) : request({ type: 'question:list', cwd, sessionId }),
|
|
692
|
+
questionReply: ({ requestId, answers, cwd, sessionId }) => workerQuestionRuns.has(sessionId) ? answerOpenCodeWorker({ requestId, answers, sessionId }) : request({ type: 'question:reply', requestId, answers, cwd, sessionId }),
|
|
693
|
+
questionReject: ({ requestId, sessionId }) => workerQuestionRuns.has(sessionId) ? answerOpenCodeWorker({ requestId, sessionId }, true) : request({ type: 'question:reject', requestId, sessionId }),
|
|
694
|
+
toolsGet: (sessionId) => gated({ type: 'mcp:tools:get', sessionId }),
|
|
695
|
+
toolsSet: (sessionId, tools) => gated({ type: 'mcp:tools:set', sessionId, tools }, 45_000),
|
|
677
696
|
|
|
678
697
|
// ── Newer request types: sent only when the server lists them (see
|
|
679
698
|
// ocp-v2-caps.js); otherwise they resolve { ok:false, unsupported:true }.
|
|
@@ -684,16 +703,12 @@ export const api = {
|
|
|
684
703
|
sessionUnrevert: ({ sessionId, cwd } = {}) => gated({ type: 'session:unrevert', sessionId, cwd }),
|
|
685
704
|
sessionFork: ({ sessionId, messageID, cwd } = {}) => gated({ type: 'session:fork', sessionId, messageID, cwd }),
|
|
686
705
|
sessionChildren: ({ sessionId, cwd } = {}) => gated({ type: 'session:children', sessionId, cwd }),
|
|
687
|
-
sessionShare: ({ sessionId, cwd } = {}) => gated({ type: 'session:share', sessionId, cwd }),
|
|
688
|
-
sessionUnshare: ({ sessionId, cwd } = {}) => gated({ type: 'session:unshare', sessionId, cwd }),
|
|
689
|
-
sessionSharePolicy: ({ cwd } = {}) => gated({ type: 'session:share:policy', cwd }),
|
|
690
|
-
messageDelete: ({ sessionId, messageID, cwd } = {}) => gated({ type: 'message:delete', sessionId, messageID, cwd }),
|
|
691
706
|
commandList: ({ cwd } = {}) => gated({ type: 'command:list', cwd }),
|
|
692
707
|
// A command is a turn: it can run as long as a prompt does.
|
|
693
|
-
commandRun: ({ sessionId, command, arguments: args, agent, model, variant, parts, cwd,
|
|
694
|
-
gated({ type: 'command:run', sessionId, command, arguments: args, agent, model, variant, parts, cwd,
|
|
695
|
-
sessionShell: ({ sessionId, command, agent, model, cwd,
|
|
696
|
-
gated({ type: 'session:shell', sessionId, command, agent, model, cwd,
|
|
708
|
+
commandRun: ({ sessionId, command, arguments: args, agent, model, variant, parts, cwd, tools } = {}) =>
|
|
709
|
+
gated({ type: 'command:run', sessionId, command, arguments: args, agent, model, variant, parts, cwd, tools }, TURN_LIMIT_MS, { turnOf: sessionId }),
|
|
710
|
+
sessionShell: ({ sessionId, command, agent, model, cwd, tools } = {}) =>
|
|
711
|
+
gated({ type: 'session:shell', sessionId, command, agent, model, cwd, tools }, 10 * 60 * 1000),
|
|
697
712
|
findFiles: ({ query, cwd, dirs } = {}) => gated({ type: 'find:files', query, cwd, dirs }, 10000),
|
|
698
713
|
findSymbols: ({ sessionId, query, cwd } = {}) => gated({ type: 'find:symbols', sessionId, query, cwd }, 10000),
|
|
699
714
|
resourceList: ({ sessionId, cwd } = {}) => gated({ type: 'resource:list', sessionId, cwd }, 15000),
|
|
@@ -703,14 +718,9 @@ export const api = {
|
|
|
703
718
|
vcsGet: ({ cwd } = {}) => gated({ type: 'vcs:get', cwd }),
|
|
704
719
|
vcsStatus: ({ cwd } = {}) => gated({ type: 'vcs:status', cwd }),
|
|
705
720
|
vcsDiff: ({ cwd, mode } = {}) => gated({ type: 'vcs:diff', cwd, mode }, 60_000),
|
|
706
|
-
worktreeList: ({ cwd } = {}) => gated({ type: 'worktree:list', cwd }),
|
|
707
|
-
worktreeCreate: ({ cwd, name } = {}) => gated({ type: 'worktree:create', cwd, name }, 60_000),
|
|
708
|
-
worktreeRemove: ({ cwd, directory } = {}) => gated({ type: 'worktree:remove', cwd, directory }, 60_000),
|
|
709
721
|
mcpStatus: ({ sessionId, cwd } = {}) => gated({ type: 'mcp:status', sessionId, cwd }),
|
|
710
722
|
mcpConnect: ({ sessionId, name, cwd } = {}) => gated({ type: 'mcp:connect', sessionId, name, cwd }, 60_000),
|
|
711
723
|
mcpDisconnect: ({ sessionId, name, cwd } = {}) => gated({ type: 'mcp:disconnect', sessionId, name, cwd }, 60_000),
|
|
712
|
-
// OAuth: OpenCode opens the browser and waits for the callback.
|
|
713
|
-
mcpAuthenticate: ({ sessionId, name, cwd } = {}) => gated({ type: 'mcp:authenticate', sessionId, name, cwd }, 5 * 60 * 1000 + 5000),
|
|
714
724
|
// Registers a server on the serve running this session and, with `persist`,
|
|
715
725
|
// saves it to the OpenCode config in the same request (see ocp-v2-status.js).
|
|
716
726
|
mcpAdd: ({ sessionId, name, config, persist, cwd } = {}) => gated({ type: 'mcp:add', sessionId, name, config, persist: persist === true, cwd }, 60_000),
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — the page secret's recovery: an open tab outlives a server restart
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// The server tells the owner's own page from a local process by a secret it mints per boot and hands the page as
|
|
6
|
+
// an HttpOnly cookie (lib/page-session.js). The page's code never sees or sends that cookie: the browser does. A
|
|
7
|
+
// restart mints a new secret, and a tab that stayed open still carries the old cookie, so its first owner write
|
|
8
|
+
// (a dispatch, Protect workers, a route card, a Skills Studio install…) would come back 403 UI_ONLY or
|
|
9
|
+
// PAGE_SECRET_REQUIRED and the owner would have to reload. The owner wants zero friction, so this module wraps the
|
|
10
|
+
// page's fetch once: when a same-origin write is refused with one of those two codes, it asks GET /api/page-session
|
|
11
|
+
// (which sets this boot's cookie), then sends the very same request once more and hands back that answer. No
|
|
12
|
+
// reload, no toast (the toast fires on the error jsonFetch throws, and it throws only on the final answer), no lost
|
|
13
|
+
// action. Anything else (a read, another 403, a refusal the refresh did not cure, a body that cannot be sent
|
|
14
|
+
// twice) is handed back as it came, so nothing changes for a request this is not about.
|
|
15
|
+
//
|
|
16
|
+
// No imports and nothing done at load under Node: tests load it with node --test and a fake fetch. In a browser it
|
|
17
|
+
// installs itself on window.fetch when the page loads it (index.html, index2d.html and sidepanel-session.html load
|
|
18
|
+
// it as their first module script, before any module that writes), and once only.
|
|
19
|
+
|
|
20
|
+
/** The route that hands an open tab this boot's cookie (lib/page-session.js PAGE_SECRET_REFRESH_PATH). */
|
|
21
|
+
export const PAGE_SECRET_REFRESH_PATH = '/api/page-session';
|
|
22
|
+
/** The refusals that mean "the page secret is missing or stale", and nothing else. */
|
|
23
|
+
export const PAGE_SECRET_CODES = Object.freeze(['UI_ONLY', 'PAGE_SECRET_REQUIRED']);
|
|
24
|
+
const SAFE_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
|
|
25
|
+
|
|
26
|
+
/** Whether an answer is the server refusing a write for want of this boot's page secret. */
|
|
27
|
+
export function isPageSecretRefusal(status, body) {
|
|
28
|
+
return Number(status) === 403 && !!body && typeof body === 'object' && PAGE_SECRET_CODES.includes(body.code);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* What a request is, for the retry: its method, whether it is same-origin, and the arguments that send it again,
|
|
33
|
+
* or null when it is not a write, goes elsewhere, or cannot be sent twice (a streamed body).
|
|
34
|
+
*/
|
|
35
|
+
export function replayPlan(input, init, origin = null) {
|
|
36
|
+
const isRequest = typeof Request !== 'undefined' && input instanceof Request;
|
|
37
|
+
const method = String(init?.method || (isRequest ? input.method : '') || 'GET').toUpperCase();
|
|
38
|
+
if (SAFE_METHODS.has(method)) return null;
|
|
39
|
+
const url = isRequest ? input.url : (input instanceof URL ? input.href : String(input ?? ''));
|
|
40
|
+
if (!sameOrigin(url, origin)) return null;
|
|
41
|
+
const body = init?.body;
|
|
42
|
+
if (body && typeof body === 'object' && typeof body.getReader === 'function') return null; // a stream is read once
|
|
43
|
+
// fetch(request) reads the request's body: a copy taken before the first send is what the second one sends.
|
|
44
|
+
const again = isRequest ? input.clone() : input;
|
|
45
|
+
return { method, url, args: init === undefined ? [again] : [again, init] };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function sameOrigin(url, origin) {
|
|
49
|
+
if (!/^[a-z][a-z0-9+.-]*:/i.test(url) && !url.startsWith('//')) return true; // a path of this page
|
|
50
|
+
if (!origin) return false;
|
|
51
|
+
try { return new URL(url).origin === new URL(origin).origin; } catch { return false; }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* A fetch over `fetchImpl` that recovers the page secret once: the refresh is one request at a time (writes refused
|
|
56
|
+
* together share it), the refused request is sent again only when the refresh answered, and the second answer is
|
|
57
|
+
* final whatever it says.
|
|
58
|
+
*/
|
|
59
|
+
export function createPageSessionFetch(fetchImpl, { refreshPath = PAGE_SECRET_REFRESH_PATH, origin = null, onRecover = null } = {}) {
|
|
60
|
+
if (typeof fetchImpl !== 'function') throw new TypeError('createPageSessionFetch needs a fetch');
|
|
61
|
+
let refreshing = null;
|
|
62
|
+
function refreshCookie() {
|
|
63
|
+
if (!refreshing) {
|
|
64
|
+
refreshing = (async () => {
|
|
65
|
+
try {
|
|
66
|
+
const res = await fetchImpl(refreshPath, { method: 'GET', credentials: 'same-origin', cache: 'no-store', headers: { Accept: 'application/json' } });
|
|
67
|
+
return !!res && res.ok === true;
|
|
68
|
+
} catch { return false; } finally { refreshing = null; }
|
|
69
|
+
})();
|
|
70
|
+
}
|
|
71
|
+
return refreshing;
|
|
72
|
+
}
|
|
73
|
+
return async function pageSessionFetch(input, init) {
|
|
74
|
+
const plan = replayPlan(input, init, origin);
|
|
75
|
+
const res = await fetchImpl(input, init);
|
|
76
|
+
if (!plan || !res || res.status !== 403 || typeof res.clone !== 'function') return res;
|
|
77
|
+
let body = null;
|
|
78
|
+
try { body = await res.clone().json(); } catch { return res; }
|
|
79
|
+
if (!isPageSecretRefusal(res.status, body)) return res;
|
|
80
|
+
if (!(await refreshCookie())) return res;
|
|
81
|
+
try { onRecover?.({ method: plan.method, url: plan.url, code: body.code }); } catch { /* a listener's own error */ }
|
|
82
|
+
return fetchImpl(...plan.args);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Wrap `target.fetch` (the window's) once; returns true when it did, false when it already had or there is none. */
|
|
87
|
+
export function installPageSessionRecovery(target = globalThis) {
|
|
88
|
+
if (!target || typeof target.fetch !== 'function' || target.__synabunPageSession) return false;
|
|
89
|
+
const original = target.fetch.bind(target);
|
|
90
|
+
const origin = target.location && typeof target.location.origin === 'string' ? target.location.origin : null;
|
|
91
|
+
target.fetch = createPageSessionFetch(original, { origin });
|
|
92
|
+
try { Object.defineProperty(target, '__synabunPageSession', { value: true, configurable: true }); } catch { target.__synabunPageSession = true; }
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (typeof window !== 'undefined' && typeof document !== 'undefined') installPageSessionRecovery(window);
|
|
@@ -4,7 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
const SVG_CLAUDE = '<svg viewBox="0 0 24 24" fill="currentColor"><path d="M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z"/></svg>';
|
|
6
6
|
const SVG_OPENAI = '<svg viewBox="0 0 24 24" fill="currentColor"><path d="M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 0 0-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 0 1 .476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 0 1 4.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 0 1-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 0 0 5.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0 0 10.205 0a5.947 5.947 0 0 0-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 0 0 4.162 1.713z"/></svg>';
|
|
7
|
-
|
|
7
|
+
// A line drawing: its paths carry fill="none" themselves, because some places fill every icon they hold
|
|
8
|
+
// (`.resume-provider-icon svg { fill: currentColor }`), which would turn the strokes into a solid triangle.
|
|
9
|
+
const SVG_ANTIGRAVITY = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 20 12 4l7.5 16" fill="none"/><path d="M8.2 20a3.8 3.8 0 0 1 7.6 0" fill="none"/></svg>';
|
|
8
10
|
const SVG_OPENCODE = '<svg viewBox="0 0 240 300" fill="currentColor"><path fill-rule="evenodd" d="M0 0h240v300H0V0zm60 60v180h120V60H60z"/><rect x="60" y="120" width="120" height="120" opacity=".45"/></svg>';
|
|
9
11
|
const SVG_SHELL = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>';
|
|
10
12
|
const SVG_BROWSER = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>';
|
|
@@ -15,7 +17,7 @@ const PROVIDER_META = {
|
|
|
15
17
|
'claude-code': { id: 'claude-code', label: 'Claude Code', shortLabel: 'Claude', icon: SVG_CLAUDE, color: '#D4A27F' },
|
|
16
18
|
codex: { id: 'codex', label: 'Codex', shortLabel: 'Codex', icon: SVG_OPENAI, color: '#74C7A5' },
|
|
17
19
|
opencode: { id: 'opencode', label: 'OpenCode', shortLabel: 'OpenCode', icon: SVG_OPENCODE, color: '#E8E0DC' },
|
|
18
|
-
|
|
20
|
+
antigravity: { id: 'antigravity', label: 'Antigravity', shortLabel: 'Antigravity', icon: SVG_ANTIGRAVITY, color: '#669DF6' },
|
|
19
21
|
synabun: { id: 'synabun', label: 'SynaBun', shortLabel: 'SynaBun', icon: SVG_SYNABUN, color: '#FFD23C' },
|
|
20
22
|
shell: { id: 'shell', label: 'Shell', shortLabel: 'Shell', icon: SVG_SHELL, color: '#AAAAAA' },
|
|
21
23
|
browser: { id: 'browser', label: 'Browser', shortLabel: 'Browser', icon: SVG_BROWSER, color: '#4FC3F7' },
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
// Each variant (3D / 2D) registers its identity, capabilities, and UI
|
|
6
6
|
// extensions on boot. Shared UI reads the registry to decide what to render.
|
|
7
7
|
|
|
8
|
+
import { resolveViewVariant } from './view-variant.js';
|
|
9
|
+
|
|
8
10
|
const _registry = {
|
|
9
|
-
variant:
|
|
11
|
+
variant: resolveViewVariant(), // 3D only; the 2D implementation is deprecated
|
|
10
12
|
capabilities: new Set(), // e.g. 'camera-hud', 'minimap', 'hulls', 'lasso', 'controls-panel'
|
|
11
13
|
navbarButtons: [], // { zone, order, html, init } (legacy, kept for compat)
|
|
12
14
|
menuItems: [], // { menu, order, type, id, label, shortcut?, init }
|
|
@@ -23,7 +25,7 @@ const _registry = {
|
|
|
23
25
|
* @param {{ variant: string, capabilities?: string[] }} config
|
|
24
26
|
*/
|
|
25
27
|
export function registerVariant(config) {
|
|
26
|
-
_registry.variant = config.variant;
|
|
28
|
+
_registry.variant = resolveViewVariant(config.variant);
|
|
27
29
|
_registry.capabilities = new Set(config.capabilities || []);
|
|
28
30
|
}
|
|
29
31
|
|
|
@@ -72,7 +74,7 @@ export function registerKeyboardShortcut(spec) {
|
|
|
72
74
|
|
|
73
75
|
// ── Query API ──
|
|
74
76
|
|
|
75
|
-
export function getVariant() { return _registry.variant; }
|
|
77
|
+
export function getVariant() { return resolveViewVariant(_registry.variant); }
|
|
76
78
|
export function hasCapability(name) { return _registry.capabilities.has(name); }
|
|
77
79
|
export function getNavbarButtons() { return _registry.navbarButtons; }
|
|
78
80
|
export function getMenuItems() { return _registry.menuItems; }
|