synabun 2.0.10 → 2.1.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 +86 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +22 -0
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +2 -2
- 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 +17 -8
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +1 -1
- 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 +228 -0
- package/lib/virustotal.mjs +192 -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/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/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/neural-interface.d.ts +16 -10
- 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 +20 -62
- 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/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 +10 -10
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +22 -13
- 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/image-tools.d.ts +1 -1
- package/mcp-server/dist/tools/image-tools.js +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 +639 -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/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/neural-interface.ts +79 -20
- package/mcp-server/src/services/server-instructions.ts +27 -63
- 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/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +22 -14
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/skill-tools.ts +589 -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 +3463 -200
- package/neural-interface/i18n/pt-BR.json +3411 -151
- package/neural-interface/lib/assistant-api.js +127 -28
- 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-catalog.js +6 -7
- package/neural-interface/lib/assistant-dispatch.js +871 -156
- package/neural-interface/lib/assistant-envelope.js +3 -1
- package/neural-interface/lib/assistant-persona.js +80 -11
- package/neural-interface/lib/assistant-plan-permissions.js +10 -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 +13 -8
- package/neural-interface/lib/assistant-runtime.js +56 -18
- package/neural-interface/lib/assistant-task-prompt.js +78 -14
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/backup-service.js +620 -3
- 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 +83 -0
- package/neural-interface/lib/browser-network-guard.js +284 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +186 -31
- package/neural-interface/lib/claude-agent-bridge.js +4 -2
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install.js +18 -138
- package/neural-interface/lib/cli-resolver.js +4 -1
- package/neural-interface/lib/cli-update-planner.js +32 -31
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-worker-app-server.js +172 -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/exec-loop-command.js +4 -8
- 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 +0 -29
- package/neural-interface/lib/mcp-external-servers.js +323 -0
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/morelogin.js +30 -0
- package/neural-interface/lib/native-loop-providers.js +547 -47
- package/neural-interface/lib/native-loop-runtime.js +268 -41
- 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 +44 -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/peer-identity.js +763 -0
- package/neural-interface/lib/request-gate.js +17 -2
- package/neural-interface/lib/rulesets/api.js +1 -1
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +92 -27
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +17 -30
- 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 +294 -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 +267 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +564 -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 +214 -0
- package/neural-interface/lib/skills/eval-confinement.js +397 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +119 -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 +200 -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 +387 -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 +262 -0
- package/neural-interface/lib/skills/runtime-checks.js +355 -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 +522 -0
- package/neural-interface/lib/skills/telemetry.js +113 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/worker-confinement.js +1192 -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-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +229 -0
- package/neural-interface/lib/worker-sandbox.js +299 -0
- package/neural-interface/package-lock.json +18 -12
- package/neural-interface/package.json +2 -2
- package/neural-interface/public/index.html +3 -1
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +2 -2
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +35 -19
- 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 +33 -2
- 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 +49 -35
- package/neural-interface/public/shared/assistant/asst-control.js +157 -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-limit-dock.js +40 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -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 +106 -11
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
- package/neural-interface/public/shared/assistant/asst-render.js +401 -77
- package/neural-interface/public/shared/assistant/asst-route.js +83 -12
- package/neural-interface/public/shared/assistant/asst-scenes.js +2 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
- package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
- package/neural-interface/public/shared/assistant/asst-state.js +11 -15
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +59 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +156 -16
- 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 +8 -7
- package/neural-interface/public/shared/cdx/cdx-panel.js +45 -149
- package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
- package/neural-interface/public/shared/cdx/cdx-render.js +47 -29
- package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +11 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +52 -39
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-view.js +4 -8
- package/neural-interface/public/shared/cli-status.js +2 -2
- package/neural-interface/public/shared/constants.js +2 -2
- 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 +366 -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/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/desktop-update-view.js +20 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/html-shell.js +9 -11
- 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 +47 -252
- 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-render.js +6 -21
- 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 +0 -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 +14 -47
- package/neural-interface/public/shared/page-session.js +96 -0
- 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-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/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +219 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +130 -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 +141 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +475 -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 +236 -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 +229 -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-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 +279 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +681 -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 +248 -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 +425 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +1525 -1779
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- 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/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-automation-studio.js +91 -128
- package/neural-interface/public/shared/ui-claude-panel.js +77 -5
- 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-image-gallery.js +50 -47
- package/neural-interface/public/shared/ui-keybinds.js +26 -1
- package/neural-interface/public/shared/ui-menubar.js +8 -18
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +7 -1
- package/neural-interface/public/shared/ui-navbar.js +4 -24
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-schedules-studio.js +507 -423
- package/neural-interface/public/shared/ui-sessions.js +5 -3
- package/neural-interface/public/shared/ui-settings.js +594 -462
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +1 -1
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
- 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 +124 -180
- package/neural-interface/public/shared/ui-tool-updates.js +3 -1
- package/neural-interface/public/shared/ui-tooltip.js +10 -5
- 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 +311 -58
- package/neural-interface/public/shared/ui-worker-end.js +4 -0
- 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 +1 -1
- 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-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +1 -1
- 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 +3934 -2454
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +18 -12
- package/package.json +16 -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 +4 -4
- 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
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { t } from '../i18n.js';
|
|
2
|
+
import { migrateStoredTools } from '../tool-list-storage.js';
|
|
3
|
+
import { wireDropdowns, closeDropdowns, setDropdownDisabled, dropdownOf } from '../cc-dropdown.js';
|
|
4
|
+
import { configureToolPickerTranslation, toolPickerHTML, readToolPicker, updateToolPicker, toolWord } from '../tool-list-picker.js';
|
|
5
|
+
import { fetchToolCatalog } from '../agent-runtime-options.js';
|
|
1
6
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
7
|
// OpenCode V2 — Project bar (project + branch dropdowns)
|
|
3
8
|
// Lives at the top of the .ocpv2-compose card, mirroring legacy ocp-projectbar.
|
|
@@ -7,9 +12,9 @@
|
|
|
7
12
|
|
|
8
13
|
import { getDefaultStore } from './ocp-v2-state.js';
|
|
9
14
|
import { sendTextMessage } from './ocp-v2-send.js';
|
|
10
|
-
import { api, onEvent } from './ocp-v2-ws.js';
|
|
15
|
+
import { api, onEvent, capabilities, supports } from './ocp-v2-ws.js';
|
|
11
16
|
import { captureBinding, latestOnly } from './ocp-v2-binding.js';
|
|
12
|
-
import {
|
|
17
|
+
import { setSessionTools } from './ocp-v2-session-actions.js';
|
|
13
18
|
import { storage } from '../storage.js';
|
|
14
19
|
import { on } from '../state.js';
|
|
15
20
|
import { escapeHtml } from '../utils.js';
|
|
@@ -21,11 +26,11 @@ const subscribe = (l) => _currentStore.subscribe(l);
|
|
|
21
26
|
let _root = null;
|
|
22
27
|
let _projectDd = null;
|
|
23
28
|
let _branchDd = null;
|
|
24
|
-
let
|
|
29
|
+
let _toolsDd = null;
|
|
25
30
|
let _recallDd = null;
|
|
26
31
|
let _ctx = null;
|
|
27
32
|
let _unsubscribe = null;
|
|
28
|
-
let
|
|
33
|
+
let _toolsSyncUnsub = null;
|
|
29
34
|
let _branchCache = new Map(); // path → { branches, current, ts }
|
|
30
35
|
let _docClickWired = false;
|
|
31
36
|
let _docClickHandler = null;
|
|
@@ -33,58 +38,35 @@ let _docClickHandler = null;
|
|
|
33
38
|
let _recallProfile = 'balanced';
|
|
34
39
|
let _recallLoaded = false;
|
|
35
40
|
|
|
36
|
-
let
|
|
37
|
-
let
|
|
38
|
-
let
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
function readSessionProfiles() {
|
|
44
|
-
try {
|
|
45
|
-
const parsed = JSON.parse(storage.getItem(MCP_SESSION_PROFILE_KEY) || '{}');
|
|
46
|
-
return parsed && typeof parsed === 'object' ? parsed : {};
|
|
47
|
-
} catch { return {}; }
|
|
41
|
+
let _toolCatalog = null;
|
|
42
|
+
let _toolsSyncVersion = 0;
|
|
43
|
+
let _toolsAbort = null;
|
|
44
|
+
let _capsUnsub = null;
|
|
45
|
+
const MCP_SESSION_TOOLS_KEY = 'synabun-opencode-session-tools';
|
|
46
|
+
function readSessionTools() {
|
|
47
|
+
try { return JSON.parse(storage.getItem(MCP_SESSION_TOOLS_KEY) || '{}') || {}; } catch { return {}; }
|
|
48
48
|
}
|
|
49
|
-
|
|
50
|
-
function
|
|
51
|
-
if (!sessionId) return
|
|
52
|
-
|
|
49
|
+
function savedSessionTools(sessionId) { const value = readSessionTools()[sessionId]; return Array.isArray(value) ? value : null; }
|
|
50
|
+
function saveSessionTools(sessionId, tools) {
|
|
51
|
+
if (!sessionId || !Array.isArray(tools)) return;
|
|
52
|
+
storage.setItem(MCP_SESSION_TOOLS_KEY, JSON.stringify({ ...readSessionTools(), [sessionId]: tools }));
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if (!sessionId || !profile) return;
|
|
57
|
-
const profiles = readSessionProfiles();
|
|
58
|
-
profiles[sessionId] = profile;
|
|
59
|
-
storage.setItem(MCP_SESSION_PROFILE_KEY, JSON.stringify(profiles));
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async function syncProfileForActiveSession() {
|
|
63
|
-
const version = ++_profileSyncVersion;
|
|
64
|
-
const state = getState();
|
|
65
|
-
// The session this read is for (ocp-v2-binding.js): its answer is that
|
|
66
|
-
// session's, and reaches the selector only while the panel is still on it.
|
|
54
|
+
async function syncToolsForActiveSession() {
|
|
55
|
+
const version = ++_toolsSyncVersion;
|
|
67
56
|
const at = captureBinding(_currentStore);
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
if (!sessionId) return;
|
|
57
|
+
const state = getState();
|
|
58
|
+
if (at.sessionId) await migrateStoredTools(storage, MCP_SESSION_TOOLS_KEY, 'synabun-opencode-session-mcp-profiles', { entry: at.sessionId });
|
|
59
|
+
if (!at.isCurrent() || version !== _toolsSyncVersion) return;
|
|
60
|
+
const tools = state.sessionInfo?.tools ?? savedSessionTools(at.sessionId) ?? (at.sessionId ? null : state.tools) ?? _toolCatalog?.defaultTools;
|
|
61
|
+
if (tools) _currentStore.setTools(tools);
|
|
62
|
+
paintTools();
|
|
63
|
+
if (!at.sessionId || !supports('mcp:tools:get')) return;
|
|
76
64
|
try {
|
|
77
|
-
const result = await api.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (version !== _profileSyncVersion || !at.isCurrent()) return;
|
|
83
|
-
saveSessionProfile(sessionId, remote.profile);
|
|
84
|
-
_currentStore.setMcpProfile(remote.profile);
|
|
85
|
-
_currentProfile = remote.profile;
|
|
86
|
-
applyMcpProfileState(remote.profile, remote.presets);
|
|
87
|
-
} catch { /* socket may still be booting; local session state remains valid */ }
|
|
65
|
+
const result = await api.toolsGet(at.sessionId);
|
|
66
|
+
if (!result?.data?.pinned || !Array.isArray(result.data.tools) || version !== _toolsSyncVersion || !at.isCurrent()) return;
|
|
67
|
+
_currentStore.setTools(result.data.tools);
|
|
68
|
+
saveSessionTools(at.sessionId, result.data.tools);
|
|
69
|
+
} catch { /* reconnect keeps the local selection */ }
|
|
88
70
|
}
|
|
89
71
|
|
|
90
72
|
const RECALL_PROFILES_META = [
|
|
@@ -116,8 +98,10 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
|
|
|
116
98
|
_branchDd = makeDropdown('ocpv2-branch-dd', 'branch', 'Branch', 'ocpv2-dropdown-sm');
|
|
117
99
|
bar.appendChild(_branchDd);
|
|
118
100
|
|
|
119
|
-
|
|
120
|
-
|
|
101
|
+
_toolsDd = document.createElement('div');
|
|
102
|
+
_toolsDd.className = 'ocpv2-tools-picker';
|
|
103
|
+
_toolsDd.addEventListener('pointerdown', event => { if (event.target.closest('.cc-dropdown-trigger')) closeAllDropdowns(event.target.closest('.cc-dropdown')); });
|
|
104
|
+
bar.appendChild(_toolsDd);
|
|
121
105
|
|
|
122
106
|
_recallDd = makeDropdown('ocpv2-recall-dd', 'recall', 'Recall profile', 'ocpv2-dropdown-sm');
|
|
123
107
|
bar.appendChild(_recallDd);
|
|
@@ -149,35 +133,46 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
|
|
|
149
133
|
|
|
150
134
|
wireProjectDd();
|
|
151
135
|
wireBranchDd();
|
|
152
|
-
|
|
136
|
+
_toolsAbort = new AbortController();
|
|
137
|
+
wireDropdowns(_toolsDd, { signal: _toolsAbort.signal });
|
|
138
|
+
_capsUnsub = capabilities.subscribe(() => paintTools());
|
|
139
|
+
_toolsDd.addEventListener('change', async (event) => {
|
|
140
|
+
const previous = getState().tools;
|
|
141
|
+
const tools = readToolPicker(event.target, { inherit: false });
|
|
142
|
+
const at = captureBinding(_currentStore);
|
|
143
|
+
try {
|
|
144
|
+
if (at.sessionId) await setSessionTools(_currentStore, api, tools, { save: saveSessionTools });
|
|
145
|
+
else _currentStore.setTools(tools);
|
|
146
|
+
} catch (error) {
|
|
147
|
+
if (at.isCurrent()) { _currentStore.setTools(previous); _currentStore.pushError({ message: error.message || toolWord('saveFailed') }); }
|
|
148
|
+
}
|
|
149
|
+
if (at.isCurrent()) paintTools();
|
|
150
|
+
}, { signal: _toolsAbort.signal });
|
|
153
151
|
wireRecallDd();
|
|
154
152
|
wireDocClick();
|
|
155
153
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
_profileSyncUnsub = on('mcp:profile-changed', (msg = {}) => {
|
|
159
|
-
_defaultProfile = msg.defaultProfile || msg.profile || _defaultProfile;
|
|
160
|
-
applyMcpProfileState(getState().sessionId ? null : _defaultProfile, msg.presets);
|
|
154
|
+
_toolsSyncUnsub = on('mcp:tools-default-changed', (msg = {}) => {
|
|
155
|
+
if (_toolCatalog && Array.isArray(msg.tools)) _toolCatalog.defaultTools = msg.tools;
|
|
161
156
|
});
|
|
162
157
|
|
|
163
158
|
_unsubscribe = subscribe((event) => {
|
|
164
159
|
if (event?.type === 'config:cwd') {
|
|
165
160
|
syncToCwd(getState().cwd || '');
|
|
166
161
|
} else if (event?.type === 'session:set') {
|
|
162
|
+
closeDropdowns(_toolsDd, { cancel: true });
|
|
167
163
|
// Session switch may carry a new directory — sync best-effort.
|
|
168
164
|
// panel.js owns the canonical setCwd; this is just a defensive refresh.
|
|
169
165
|
const s = getState();
|
|
170
166
|
const dir = s.sessionInfo?.directory;
|
|
171
167
|
if (dir && dir !== getState().cwd) syncToCwd(dir);
|
|
172
|
-
|
|
173
|
-
} else if (event?.type === 'config:
|
|
168
|
+
syncToolsForActiveSession();
|
|
169
|
+
} else if (event?.type === 'config:tools') {
|
|
170
|
+
closeDropdowns(_toolsDd, { cancel: true });
|
|
174
171
|
const state = getState();
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if (ddIsOpen(_profileDd)) paintProfileMenu();
|
|
180
|
-
}
|
|
172
|
+
if (state.sessionId) saveSessionTools(state.sessionId, state.tools);
|
|
173
|
+
paintTools();
|
|
174
|
+
} else { paintTools(); }
|
|
175
|
+
|
|
181
176
|
});
|
|
182
177
|
|
|
183
178
|
// Initial paint
|
|
@@ -186,8 +181,8 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
|
|
|
186
181
|
Promise.resolve(_ctx.ensureProjectsLoaded?.()).catch(() => {});
|
|
187
182
|
// Load saved recall profile so the DD shows the current selection on first open
|
|
188
183
|
loadRecallProfile().catch(() => {});
|
|
189
|
-
// Load active
|
|
190
|
-
|
|
184
|
+
// Load active SynaBun tool list so its label is correct on first paint
|
|
185
|
+
fetchToolCatalog(false, { cwd: getState().cwd || '' }).then(catalog => { if (!_toolsDd) return; _toolCatalog = catalog; return syncToolsForActiveSession(); }).catch(() => {});
|
|
191
186
|
|
|
192
187
|
return {
|
|
193
188
|
refresh: () => syncToCwd(getState().cwd || ''),
|
|
@@ -196,9 +191,9 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
|
|
|
196
191
|
}
|
|
197
192
|
|
|
198
193
|
export function unmountProjectBar() {
|
|
199
|
-
|
|
194
|
+
_toolsSyncVersion += 1;
|
|
200
195
|
if (_unsubscribe) { try { _unsubscribe(); } catch {} }
|
|
201
|
-
if (
|
|
196
|
+
if (_toolsSyncUnsub) { try { _toolsSyncUnsub(); } catch {} }
|
|
202
197
|
if (_docClickWired && _docClickHandler) {
|
|
203
198
|
document.removeEventListener('mousedown', _docClickHandler);
|
|
204
199
|
_docClickWired = false;
|
|
@@ -208,16 +203,15 @@ export function unmountProjectBar() {
|
|
|
208
203
|
_root = null;
|
|
209
204
|
_projectDd = null;
|
|
210
205
|
_branchDd = null;
|
|
211
|
-
|
|
206
|
+
_toolsDd = null;
|
|
212
207
|
_recallDd = null;
|
|
213
208
|
_ctx = null;
|
|
214
209
|
_unsubscribe = null;
|
|
215
|
-
|
|
210
|
+
_toolsSyncUnsub = null;
|
|
216
211
|
_branchCache = new Map();
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
_mcpProfiles = [];
|
|
212
|
+
_toolsAbort?.abort();
|
|
213
|
+
_capsUnsub?.();
|
|
214
|
+
_toolCatalog = null;
|
|
221
215
|
}
|
|
222
216
|
|
|
223
217
|
// ── Dropdown construction ──────────────────────────────────────────────────
|
|
@@ -244,7 +238,7 @@ function ddSetLabel(dd, text, hasValue) {
|
|
|
244
238
|
}
|
|
245
239
|
|
|
246
240
|
// A menu that has to load something before it opens (the project list, the
|
|
247
|
-
// tool
|
|
241
|
+
// tool lists, the recall setting) opens only when it is still the one the
|
|
248
242
|
// user asked for last: not after another menu was opened or everything was
|
|
249
243
|
// closed while it loaded.
|
|
250
244
|
const _menuOpenings = latestOnly();
|
|
@@ -257,6 +251,7 @@ function ddOpen(dd) {
|
|
|
257
251
|
}
|
|
258
252
|
|
|
259
253
|
function ddClose(dd) {
|
|
254
|
+
if (dd?.classList.contains('cc-dropdown')) { closeDropdowns(dd.parentElement); return; }
|
|
260
255
|
dd?.classList.remove('open');
|
|
261
256
|
dd?.querySelector('.ocpv2-dd-menu')?.classList.remove('open');
|
|
262
257
|
}
|
|
@@ -435,132 +430,28 @@ function syncToCwd(cwd) {
|
|
|
435
430
|
}
|
|
436
431
|
}
|
|
437
432
|
|
|
438
|
-
// ──
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
if (getState().running) return;
|
|
444
|
-
if (ddIsOpen(_profileDd)) { ddClose(_profileDd); return; }
|
|
445
|
-
const wanted = _menuOpenings.begin();
|
|
446
|
-
if (!_profileLoaded) {
|
|
447
|
-
try { await loadCurrentProfile(); } catch {}
|
|
448
|
-
}
|
|
449
|
-
// The menu changes the profile of the session on screen: it does not open
|
|
450
|
-
// over a turn that started while the profiles loaded.
|
|
451
|
-
if (!wanted() || getState().running) return;
|
|
452
|
-
paintProfileMenu();
|
|
453
|
-
ddOpen(_profileDd);
|
|
454
|
-
});
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
function mcpProfileItemsFromPresets(presets) {
|
|
458
|
-
if (!presets || typeof presets !== 'object') return null;
|
|
459
|
-
return Object.entries(presets).map(([id, p]) => ({
|
|
460
|
-
id,
|
|
461
|
-
label: p?.label || id,
|
|
462
|
-
hint: `${p?.tools ?? '?'} tools`,
|
|
463
|
-
}));
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
function applyMcpProfileState(profile, presets) {
|
|
467
|
-
if (profile) _currentProfile = profile;
|
|
468
|
-
const items = mcpProfileItemsFromPresets(presets);
|
|
469
|
-
if (items) _mcpProfiles = items;
|
|
470
|
-
applyProfileLabel();
|
|
471
|
-
if (ddIsOpen(_profileDd)) paintProfileMenu();
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
function applyProfileLabel() {
|
|
475
|
-
const matched = _mcpProfiles.find((p) => p.id === _currentProfile);
|
|
476
|
-
ddSetLabel(_profileDd, matched ? matched.label : _currentProfile, !!_currentProfile);
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
async function loadCurrentProfile() {
|
|
480
|
-
try {
|
|
481
|
-
const data = await fetch('/api/mcp/profile').then((r) => r.json());
|
|
482
|
-
if (data?.ok) {
|
|
483
|
-
_defaultProfile = data.defaultProfile || data.profile || 'full';
|
|
484
|
-
applyMcpProfileState(null, data.presets);
|
|
485
|
-
await syncProfileForActiveSession();
|
|
486
|
-
}
|
|
487
|
-
} catch (err) {
|
|
488
|
-
console.warn('[ocp-v2-projectbar] loadCurrentProfile failed', err);
|
|
489
|
-
} finally {
|
|
490
|
-
_profileLoaded = true;
|
|
491
|
-
applyProfileLabel();
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
function paintProfileMenu() {
|
|
496
|
-
const menu = _profileDd?.querySelector('.ocpv2-dd-menu');
|
|
497
|
-
if (!menu) return;
|
|
498
|
-
menu.innerHTML = '';
|
|
499
|
-
if (!_mcpProfiles.length) {
|
|
500
|
-
const empty = document.createElement('div');
|
|
501
|
-
empty.className = 'ocpv2-dd-option';
|
|
502
|
-
empty.style.cssText = 'opacity:0.4;cursor:default';
|
|
503
|
-
empty.textContent = '(empty)';
|
|
504
|
-
menu.appendChild(empty);
|
|
505
|
-
return;
|
|
506
|
-
}
|
|
507
|
-
for (const p of _mcpProfiles) {
|
|
508
|
-
const opt = document.createElement('div');
|
|
509
|
-
opt.className = 'ocpv2-dd-option' + (p.id === _currentProfile ? ' selected' : '');
|
|
510
|
-
opt.style.gap = '6px';
|
|
511
|
-
opt.innerHTML = `<span>${escapeHtml(p.label)}</span><span class="ocpv2-dd-hint">${escapeHtml(p.hint)}</span>`;
|
|
512
|
-
opt.addEventListener('click', async (event) => {
|
|
513
|
-
event.stopPropagation();
|
|
514
|
-
ddClose(_profileDd);
|
|
515
|
-
if (p.id === _currentProfile) return;
|
|
516
|
-
const previous = _currentProfile;
|
|
517
|
-
const at = captureBinding(_currentStore);
|
|
518
|
-
_currentProfile = p.id;
|
|
519
|
-
applyProfileLabel();
|
|
520
|
-
try { await updateMcpProfile(p.id); }
|
|
521
|
-
catch (err) {
|
|
522
|
-
// The label is rolled back only where it was changed: after a move the
|
|
523
|
-
// selector already shows the profile of the session on screen.
|
|
524
|
-
if (at.isCurrent()) {
|
|
525
|
-
_currentProfile = previous;
|
|
526
|
-
applyProfileLabel();
|
|
527
|
-
}
|
|
528
|
-
console.error('[ocp-v2-projectbar] updateMcpProfile failed', err);
|
|
529
|
-
}
|
|
530
|
-
});
|
|
531
|
-
menu.appendChild(opt);
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
|
|
535
|
-
async function updateMcpProfile(profile) {
|
|
433
|
+
// ── Tool lists: cc-dropdown multiple mode inside the OpenCode project bar ──
|
|
434
|
+
function paintTools() {
|
|
435
|
+
if (!_toolsDd) return;
|
|
436
|
+
_toolsDd.hidden = !supports('mcp:tools:set') || !_toolCatalog;
|
|
437
|
+
if (_toolsDd.hidden) return;
|
|
536
438
|
const state = getState();
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
// captures it before the request): the answer is saved under that
|
|
542
|
-
// session's key, and the store and the selector take it only while the
|
|
543
|
-
// panel is still on that binding.
|
|
544
|
-
const changed = await setSessionMcpProfile(_currentStore, api, profile, { save: saveSessionProfile });
|
|
545
|
-
if (changed?.applied) {
|
|
546
|
-
_currentProfile = changed.profile;
|
|
547
|
-
applyProfileLabel();
|
|
548
|
-
}
|
|
549
|
-
return;
|
|
439
|
+
const catalogCwd = state.cwd || '';
|
|
440
|
+
if (_toolCatalog._cwd !== catalogCwd) {
|
|
441
|
+
_toolCatalog._cwd = catalogCwd;
|
|
442
|
+
fetchToolCatalog(false, { cwd: catalogCwd }).then(catalog => { if (catalog && (getState().cwd || '') === catalogCwd) { catalog._cwd = catalogCwd; _toolCatalog = catalog; paintTools(); } }).catch(() => {});
|
|
550
443
|
}
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
throw new Error(payload?.error || `Could not update the future-runtime MCP default (${response.status})`);
|
|
444
|
+
let input = _toolsDd.querySelector('input');
|
|
445
|
+
if (!input) {
|
|
446
|
+
// One project bar per panel mount; ids need to remain unique across windows.
|
|
447
|
+
const id = `ocpv2-tools-${globalThis.crypto.randomUUID()}`;
|
|
448
|
+
_toolsDd.innerHTML = toolPickerHTML(id, state.tools ?? _toolCatalog.defaultTools, { catalog: _toolCatalog, classes: 'ocpv2-dropdown ocpv2-dropdown-sm' });
|
|
449
|
+
_toolsDd.querySelector('.cc-dropdown-menu')?.classList.add('ocpv2-dd-menu');
|
|
450
|
+
input = _toolsDd.querySelector('input');
|
|
451
|
+
} else if (!dropdownOf(input)?.classList.contains('open')) {
|
|
452
|
+
updateToolPicker(input, state.tools ?? _toolCatalog.defaultTools, { catalog: _toolCatalog });
|
|
561
453
|
}
|
|
562
|
-
|
|
563
|
-
applyProfileLabel();
|
|
454
|
+
setDropdownDisabled(input, !!state.running);
|
|
564
455
|
}
|
|
565
456
|
|
|
566
457
|
// ── Recall dropdown wiring ─────────────────────────────────────────────────
|
|
@@ -648,3 +539,5 @@ function wireDocClick() {
|
|
|
648
539
|
document.addEventListener('mousedown', _docClickHandler);
|
|
649
540
|
_docClickWired = true;
|
|
650
541
|
}
|
|
542
|
+
|
|
543
|
+
configureToolPickerTranslation(t);
|
|
@@ -30,10 +30,10 @@ import {
|
|
|
30
30
|
compactionLabel, inlinePartText, reasoningPreview, createCardDrafts,
|
|
31
31
|
} from './ocp-v2-render-logic.js';
|
|
32
32
|
import {
|
|
33
|
-
visibleMessageOrder, revertBannerView, messageText, messageActionsFor,
|
|
33
|
+
visibleMessageOrder, revertBannerView, messageText, messageActionsFor,
|
|
34
34
|
} from './ocp-v2-sessions-logic.js';
|
|
35
35
|
import {
|
|
36
|
-
revertToMessage, restoreReverted, retryFromMessage, forkSession,
|
|
36
|
+
revertToMessage, restoreReverted, retryFromMessage, forkSession,
|
|
37
37
|
} from './ocp-v2-session-actions.js';
|
|
38
38
|
|
|
39
39
|
const _expandedReasoningIds = new Set();
|
|
@@ -486,13 +486,12 @@ function renderMessage(msg, store, actions = [], opts = {}) {
|
|
|
486
486
|
return wrap;
|
|
487
487
|
}
|
|
488
488
|
|
|
489
|
-
// ── Message actions (copy / undo / fork /
|
|
489
|
+
// ── Message actions (copy / undo / fork / retry) ────────────────────────────
|
|
490
490
|
|
|
491
491
|
const ACTION_LABELS = {
|
|
492
492
|
copy: 'Copy',
|
|
493
493
|
undo: 'Undo to here',
|
|
494
494
|
fork: 'Fork from here',
|
|
495
|
-
delete: 'Delete',
|
|
496
495
|
retry: 'Retry',
|
|
497
496
|
};
|
|
498
497
|
|
|
@@ -575,16 +574,6 @@ async function runMessageAction(action, msg, store, opts, btn) {
|
|
|
575
574
|
if (result?.ok) await opts.onOpenSession?.(result.session, { activate: !result.moved, nav });
|
|
576
575
|
return;
|
|
577
576
|
}
|
|
578
|
-
case 'delete': {
|
|
579
|
-
// Two steps, both in the panel: this click only asks, naming the
|
|
580
|
-
// message. A panel that cannot ask deletes nothing.
|
|
581
|
-
const agreed = typeof opts.confirm === 'function' && (await opts.confirm({
|
|
582
|
-
key: `message-delete:${msg.id}`, text: deleteMessageConfirmText(msg), confirmLabel: 'Delete message',
|
|
583
|
-
})) === true;
|
|
584
|
-
if (!agreed) return;
|
|
585
|
-
report(await deleteMessage(store, api, msg.id), 'Delete failed');
|
|
586
|
-
return;
|
|
587
|
-
}
|
|
588
577
|
default:
|
|
589
578
|
}
|
|
590
579
|
}
|
|
@@ -802,9 +791,6 @@ const SYNABUN_LABELS = {
|
|
|
802
791
|
discord_role: 'Discord · Role', discord_message: 'Discord · Message',
|
|
803
792
|
discord_member: 'Discord · Member', discord_onboarding: 'Discord · Onboarding',
|
|
804
793
|
discord_webhook: 'Discord · Webhook', discord_thread: 'Discord · Thread',
|
|
805
|
-
leonardo_browser_navigate: 'Leonardo · Navigate', leonardo_browser_generate: 'Leonardo · Generate',
|
|
806
|
-
leonardo_browser_library: 'Leonardo · Library', leonardo_browser_download: 'Leonardo · Download',
|
|
807
|
-
leonardo_browser_reference: 'Leonardo · Reference',
|
|
808
794
|
};
|
|
809
795
|
|
|
810
796
|
function isSynaBunTool(name) {
|
|
@@ -859,7 +845,6 @@ function synabunSummaryText(name, input) {
|
|
|
859
845
|
case 'whiteboard_update': return t(input.content || input.title);
|
|
860
846
|
case 'card_open':
|
|
861
847
|
case 'card_update': return t(input.title || input.id);
|
|
862
|
-
case 'leonardo_browser_generate': return t(input.prompt);
|
|
863
848
|
default: return '';
|
|
864
849
|
}
|
|
865
850
|
}
|
|
@@ -949,7 +934,7 @@ function renderSynaBunToolPart(part, toolName, stateStatus) {
|
|
|
949
934
|
}
|
|
950
935
|
|
|
951
936
|
// Render an MCP tool result. Tools like browser_screenshot / card_screenshot /
|
|
952
|
-
// whiteboard_screenshot
|
|
937
|
+
// whiteboard_screenshot return `{ content: [text, image] }`,
|
|
953
938
|
// which arrives here as an array (or a JSON string of one). Render image
|
|
954
939
|
// blocks as actual <img> elements; render text blocks as their text; fall
|
|
955
940
|
// back to formatJson for anything else.
|
|
@@ -1132,7 +1117,7 @@ function renderMessageError(msg, view, store) {
|
|
|
1132
1117
|
const at = captureBinding(store);
|
|
1133
1118
|
if (!at.sessionId) return;
|
|
1134
1119
|
const res = await api.compact({
|
|
1135
|
-
sessionId: at.sessionId, cwd: at.cwd || undefined,
|
|
1120
|
+
sessionId: at.sessionId, cwd: at.cwd || undefined, tools: at.tools || undefined,
|
|
1136
1121
|
});
|
|
1137
1122
|
if (at.isCurrent() && (res?.error || res?.ok === false)) store.pushError({ message: res?.error || 'Compact failed' });
|
|
1138
1123
|
}, store));
|
|
@@ -1329,7 +1314,7 @@ function renderPermissionCard(perm, store) {
|
|
|
1329
1314
|
code.textContent = pattern;
|
|
1330
1315
|
always.appendChild(code);
|
|
1331
1316
|
});
|
|
1332
|
-
// How
|
|
1317
|
+
// How far it reaches: OpenCode 2 saves the answer for the project (its saved permissions).
|
|
1333
1318
|
always.appendChild(document.createTextNode(` ${ALWAYS_ALLOW_SCOPE}.`));
|
|
1334
1319
|
body.appendChild(always);
|
|
1335
1320
|
}
|
|
@@ -1006,7 +1006,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1006
1006
|
if (s.running) { store.pushError({ message: 'Wait for the current turn to finish before compacting.' }); return; }
|
|
1007
1007
|
const at = captureBinding(store);
|
|
1008
1008
|
const res = await api.compact({
|
|
1009
|
-
sessionId: at.sessionId, cwd: at.cwd || undefined,
|
|
1009
|
+
sessionId: at.sessionId, cwd: at.cwd || undefined, tools: at.tools || undefined,
|
|
1010
1010
|
});
|
|
1011
1011
|
// A failure of the session the panel has left is not this one's banner.
|
|
1012
1012
|
if (at.isCurrent() && (res?.error || res?.ok === false)) store.pushError({ message: res?.error || 'Compact failed' });
|
|
@@ -1092,7 +1092,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1092
1092
|
variant: turn.variant || undefined,
|
|
1093
1093
|
parts: parts.length ? parts : undefined,
|
|
1094
1094
|
cwd: turn.cwd || undefined,
|
|
1095
|
-
|
|
1095
|
+
tools: turn.tools || undefined,
|
|
1096
1096
|
}), outcome);
|
|
1097
1097
|
}
|
|
1098
1098
|
|
|
@@ -1130,7 +1130,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1130
1130
|
agent: turn.agent || undefined,
|
|
1131
1131
|
model: turn.model || undefined,
|
|
1132
1132
|
cwd: turn.cwd || undefined,
|
|
1133
|
-
|
|
1133
|
+
tools: turn.tools || undefined,
|
|
1134
1134
|
}));
|
|
1135
1135
|
}
|
|
1136
1136
|
|
|
@@ -1467,7 +1467,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1467
1467
|
mode,
|
|
1468
1468
|
variant: turn.variant || undefined,
|
|
1469
1469
|
cwd: options.cwd || turn.cwd || undefined,
|
|
1470
|
-
|
|
1470
|
+
tools: turn.tools || undefined,
|
|
1471
1471
|
// A person's own message (the greeting engine keeps when they were last here), and the
|
|
1472
1472
|
// greeting this session opened with, told to the model once.
|
|
1473
1473
|
human: true,
|
|
@@ -207,59 +207,6 @@ export async function forkSession(store, api, messageId) {
|
|
|
207
207
|
return at.isCurrent() ? { ok: true, session: out.data } : { ok: true, session: out.data, moved: true };
|
|
208
208
|
}
|
|
209
209
|
|
|
210
|
-
export async function deleteMessage(store, api, messageId) {
|
|
211
|
-
const at = captureBinding(store);
|
|
212
|
-
if (!at.sessionId || !messageId) return { ok: false, error: 'No message.' };
|
|
213
|
-
if (store.getState().running) return { ok: false, error: 'Stop the running turn before you delete a message.' };
|
|
214
|
-
const out = await call(() => api.messageDelete({ ...targetOf(at), messageID: messageId }), 'Delete failed');
|
|
215
|
-
if (!at.isCurrent()) return MOVED;
|
|
216
|
-
if (!out.ok) return out;
|
|
217
|
-
// message.removed does this too; doing it here keeps the panel right if that event is lost.
|
|
218
|
-
store.removeMessage(messageId);
|
|
219
|
-
return { ok: true };
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* Publish the transcript. `confirm()` must resolve true first, every time:
|
|
224
|
-
* the caller asks in the panel (ocp-v2-confirm-logic.js), this function never
|
|
225
|
-
* shares without it. `stopped` is the panel's createStoppedShares().
|
|
226
|
-
*/
|
|
227
|
-
export async function shareSession(store, api, confirm, { stopped = null } = {}) {
|
|
228
|
-
// The session the question is about, captured before the question is asked:
|
|
229
|
-
// a confirm answered after the panel moved publishes nothing.
|
|
230
|
-
const at = captureBinding(store);
|
|
231
|
-
if (!at.sessionId) return { ok: false, error: 'No session.' };
|
|
232
|
-
let agreed = false;
|
|
233
|
-
try { agreed = (await confirm()) === true; } catch { agreed = false; }
|
|
234
|
-
if (!agreed) return { ok: false, cancelled: true };
|
|
235
|
-
if (!at.isCurrent()) return { ok: false, cancelled: true, moved: true };
|
|
236
|
-
const out = await call(() => api.sessionShare(targetOf(at)), 'Share failed');
|
|
237
|
-
// Shared again, for that session whatever is on screen by now: a link the
|
|
238
|
-
// panel had stopped before is a share once more.
|
|
239
|
-
if (out.ok) stopped?.resume(at.sessionId);
|
|
240
|
-
if (!at.isCurrent()) return MOVED;
|
|
241
|
-
if (!out.ok) return out;
|
|
242
|
-
applySession(store, at, out.data);
|
|
243
|
-
const url = out.data?.share?.url || '';
|
|
244
|
-
return url ? { ok: true, url } : { ok: false, error: 'OpenCode did not return a share link.' };
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
export async function unshareSession(store, api, { stopped = null } = {}) {
|
|
248
|
-
const at = captureBinding(store);
|
|
249
|
-
if (!at.sessionId) return { ok: false, error: 'No session.' };
|
|
250
|
-
const out = await call(() => api.sessionUnshare(targetOf(at)), 'Could not stop sharing');
|
|
251
|
-
// Sharing stopped, for that session whatever is on screen by now. OpenCode
|
|
252
|
-
// keeps the link in the session row and reports it again with every later
|
|
253
|
-
// read (createStoppedShares): the panel remembers which one it stopped.
|
|
254
|
-
if (out.ok) stopped?.stop(at.sessionId, at.sessionInfo?.share?.url || out.data?.share?.url || '');
|
|
255
|
-
if (!at.isCurrent()) return MOVED;
|
|
256
|
-
if (!out.ok) return out;
|
|
257
|
-
// The answer is read from that row too, so it can still carry the link.
|
|
258
|
-
if (out.data) applySession(store, at, { ...out.data, share: undefined });
|
|
259
|
-
else store.setSessionInfo({ share: undefined });
|
|
260
|
-
return { ok: true };
|
|
261
|
-
}
|
|
262
|
-
|
|
263
210
|
/**
|
|
264
211
|
* The transcript of the session on screen as a download: `{ ok, filename,
|
|
265
212
|
* json }`. Session id, metadata and file name are the ones captured before the
|
|
@@ -294,7 +241,7 @@ export async function loadSelectedSession(store, api, sessionId, info, apply) {
|
|
|
294
241
|
}
|
|
295
242
|
|
|
296
243
|
// ── Navigation ──────────────────────────────────────────────────────────────
|
|
297
|
-
// "New session"
|
|
244
|
+
// "New session" and a project change both end by binding the
|
|
298
245
|
// panel to a session they create. They own the panel only as long as nobody
|
|
299
246
|
// navigated meanwhile: `nav` is the binding captured at the user's gesture.
|
|
300
247
|
|
|
@@ -353,27 +300,27 @@ export async function renameSession(store, api, title, { binding } = {}) {
|
|
|
353
300
|
}
|
|
354
301
|
|
|
355
302
|
/**
|
|
356
|
-
* Switch the
|
|
303
|
+
* Switch the tool list of the session the panel is on. The answer belongs to
|
|
357
304
|
* the session it was asked for: `save(sessionId, profile)` records it under
|
|
358
305
|
* that session's key whatever is on screen by then, and the store takes it
|
|
359
306
|
* only while it is still on that binding (`applied`). Throws when the server
|
|
360
307
|
* refuses (as before). Resolves `{ sessionId, profile, applied }`, or null
|
|
361
308
|
* when there is no session.
|
|
362
309
|
*/
|
|
363
|
-
export async function
|
|
310
|
+
export async function setSessionTools(store, api, tools, { save } = {}) {
|
|
364
311
|
const at = captureBinding(store);
|
|
365
312
|
if (!at.sessionId) return null;
|
|
366
|
-
const result = await api.
|
|
313
|
+
const result = await api.toolsSet(at.sessionId, tools);
|
|
367
314
|
if (result?.error || result?.ok === false || Number(result?.status || 200) >= 400) {
|
|
368
|
-
const error = new Error(result?.error || result?.data?.error || `Could not switch
|
|
315
|
+
const error = new Error(result?.error || result?.data?.error || `Could not switch tools (${result?.status || 'unknown error'})`);
|
|
369
316
|
error.stale = !at.isCurrent();
|
|
370
317
|
throw error;
|
|
371
318
|
}
|
|
372
|
-
const effective = result?.data?.
|
|
319
|
+
const effective = result?.data?.tools || tools;
|
|
373
320
|
if (typeof save === 'function') save(at.sessionId, effective);
|
|
374
321
|
const applied = at.isCurrent();
|
|
375
|
-
if (applied) store.
|
|
376
|
-
return { sessionId: at.sessionId,
|
|
322
|
+
if (applied) store.setTools(effective);
|
|
323
|
+
return { sessionId: at.sessionId, tools: effective, applied };
|
|
377
324
|
}
|
|
378
325
|
|
|
379
326
|
/**
|