synabun 2.0.9 → 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 +115 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +68 -4
- 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/launcher.mjs +9 -3
- 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 +43 -5
- 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 +3680 -206
- package/neural-interface/i18n/pt-BR.json +3628 -157
- package/neural-interface/lib/account-usage.js +5 -3
- package/neural-interface/lib/app-controls-api.js +161 -0
- package/neural-interface/lib/assistant-api.js +148 -35
- 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 +122 -44
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +59 -0
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +97 -0
- package/neural-interface/lib/assistant-catalog.js +23 -9
- package/neural-interface/lib/assistant-dispatch.js +874 -156
- package/neural-interface/lib/assistant-envelope.js +22 -2
- 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 +183 -26
- 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-model-catalog.js +64 -14
- 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-settings-schema.js +109 -47
- 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 +164 -67
- package/neural-interface/lib/exec-loop-command.js +4 -1
- package/neural-interface/lib/http-guards.js +8 -2
- package/neural-interface/lib/install-details.js +4 -1
- package/neural-interface/lib/launch-cache.js +293 -0
- package/neural-interface/lib/login-start.js +524 -0
- 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 +565 -50
- package/neural-interface/lib/native-loop-runtime.js +287 -41
- package/neural-interface/lib/opencode-config.js +557 -0
- package/neural-interface/lib/opencode-db-schema.js +58 -0
- package/neural-interface/lib/opencode-history.js +49 -204
- 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 +310 -0
- package/neural-interface/lib/opencode-provider-view.js +81 -0
- package/neural-interface/lib/opencode-runtime-config.js +32 -15
- package/neural-interface/lib/opencode-serve-records.js +624 -0
- package/neural-interface/lib/opencode-v2-client.js +53 -131
- package/neural-interface/lib/opencode-v2-ws-requests.js +35 -195
- package/neural-interface/lib/opencode-worker-activity.js +229 -0
- package/neural-interface/lib/opencode-worker-data.js +27 -0
- package/neural-interface/lib/opencode2-client.js +796 -0
- package/neural-interface/lib/opencode2-proxy.js +76 -0
- package/neural-interface/lib/opencode2-translate.js +1057 -0
- 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/process-identity.js +361 -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 +18 -10
- package/neural-interface/lib/session-title-generator.js +58 -18
- 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/style-guide/api.js +4 -3
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/untrusted-file-headers.js +27 -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 +1354 -50
- package/neural-interface/package.json +6 -2
- package/neural-interface/public/index.html +5 -3
- 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 +76 -16
- 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 +205 -19
- package/neural-interface/public/shared/assistant/asst-api.js +11 -3
- 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 +241 -112
- package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
- 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-hosts.js +49 -2
- 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 +84 -12
- package/neural-interface/public/shared/assistant/asst-panel.js +303 -44
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +93 -58
- package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
- package/neural-interface/public/shared/assistant/asst-render.js +770 -100
- package/neural-interface/public/shared/assistant/asst-route.js +83 -12
- package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
- package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
- package/neural-interface/public/shared/assistant/asst-scenes.js +530 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
- 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 +25 -15
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +102 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +165 -13
- package/neural-interface/public/shared/automation-context.js +5 -2
- package/neural-interface/public/shared/cc-dropdown.js +550 -0
- 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 +58 -150
- package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
- package/neural-interface/public/shared/cdx/cdx-render.js +62 -32
- 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 +15 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +201 -74
- 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/cp/cp-markdown.js +4 -57
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/data-cache.js +223 -0
- package/neural-interface/public/shared/desktop-bridge.js +11 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
- package/neural-interface/public/shared/desktop-titlebar.js +214 -28
- package/neural-interface/public/shared/desktop-update-view.js +35 -5
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/file-links.js +73 -8
- package/neural-interface/public/shared/html-shell.js +78 -86
- package/neural-interface/public/shared/i18n.js +2 -0
- package/neural-interface/public/shared/launch-prefetch.js +59 -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-caps.js +3 -2
- 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 +9 -2
- 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-modelpicker.js +54 -17
- 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 +140 -254
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +97 -203
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -22
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +20 -13
- 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 +53 -82
- 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 +48 -40
- 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 +205 -62
- package/neural-interface/public/shared/opencode-providers.js +39 -0
- 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 +452 -0
- package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
- package/neural-interface/public/shared/settings/settings-app.js +243 -0
- package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
- package/neural-interface/public/shared/settings/settings-data.js +90 -0
- package/neural-interface/public/shared/settings/settings-ia.js +23 -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/sidepanel-session-status.js +49 -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 +2065 -2150
- 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-assistant.js +27 -5
- package/neural-interface/public/shared/ui-automation-studio.js +155 -152
- package/neural-interface/public/shared/ui-bookmarks.js +2 -1
- package/neural-interface/public/shared/ui-claude-panel.js +153 -13
- package/neural-interface/public/shared/ui-codex-panel.js +1 -0
- 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 +21 -9
- package/neural-interface/public/shared/ui-file-links.js +1 -0
- package/neural-interface/public/shared/ui-image-gallery.js +56 -52
- package/neural-interface/public/shared/ui-invite.js +18 -2
- package/neural-interface/public/shared/ui-keybinds.js +26 -1
- package/neural-interface/public/shared/ui-link.js +9 -9
- package/neural-interface/public/shared/ui-menubar.js +229 -40
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +9 -1
- package/neural-interface/public/shared/ui-navbar.js +4 -24
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-schedules-studio.js +2267 -953
- package/neural-interface/public/shared/ui-sessions.js +20 -7
- package/neural-interface/public/shared/ui-settings.js +679 -496
- package/neural-interface/public/shared/ui-sidebar.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +56 -5
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
- package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
- package/neural-interface/public/shared/ui-skills.js +42 -2781
- package/neural-interface/public/shared/ui-styleguide.js +5 -2
- package/neural-interface/public/shared/ui-sync.js +22 -5
- package/neural-interface/public/shared/ui-terminal.js +159 -199
- 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 +14 -5
- 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 -61
- package/neural-interface/public/shared/ui-tutorial.css +47 -100
- package/neural-interface/public/shared/ui-tutorial.js +285 -499
- package/neural-interface/public/shared/ui-update.js +121 -16
- package/neural-interface/public/shared/ui-whiteboard.js +313 -59
- 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 +36 -2
- package/neural-interface/public/variant/2d/minimap.js +11 -13
- package/neural-interface/public/variant/3d/main.js +72 -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/highlight/LICENSE +29 -0
- package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
- package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
- package/neural-interface/public/vendor/highlight/manifest.json +5 -0
- package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
- package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
- package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
- package/neural-interface/public/vendor/marked/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
- package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
- package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -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 +116 -3
- package/neural-interface/server.js +4834 -2541
- 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 +5 -5
- 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,5 @@
|
|
|
1
|
+
import { workerRestart } from '../worker-restart.js';
|
|
2
|
+
import { t } from '../i18n.js';
|
|
1
3
|
import { hostedSidepanelId, sidepanelHost } from '../ui-sidepanel-runtime.js';
|
|
2
4
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
3
5
|
// OpenCode V2 — Panel container
|
|
@@ -10,19 +12,21 @@ import { hostedSidepanelId, sidepanelHost } from '../ui-sidepanel-runtime.js';
|
|
|
10
12
|
|
|
11
13
|
import { state, emit, on } from '../state.js';
|
|
12
14
|
import { storage } from '../storage.js';
|
|
15
|
+
import { frameRect } from '../app-frame.js';
|
|
13
16
|
import { fetchProjects } from '../api.js';
|
|
14
17
|
import { injectStyles } from './ocp-v2-styles.js';
|
|
15
|
-
import { connect, api, hasSessionStore, onSessionCompacted, onEvent, supports, isDescendantSession } from './ocp-v2-ws.js';
|
|
18
|
+
import { connect, api, hasSessionStore, onSessionCompacted, onEvent, onReconnect, supports, isDescendantSession } from './ocp-v2-ws.js';
|
|
16
19
|
import {
|
|
17
|
-
menuSessions, pickReusableEmptySession,
|
|
20
|
+
menuSessions, pickReusableEmptySession, createPendingRenames,
|
|
21
|
+
sessionBusyFromEvent, sessionBusyFromStatus, tabPillState, automationTurnPhase,
|
|
18
22
|
} from './ocp-v2-sessions-logic.js';
|
|
19
23
|
import {
|
|
20
|
-
forkSession,
|
|
24
|
+
forkSession, undoLastTurn, restoreReverted,
|
|
21
25
|
loadSelectedSession, applySessionSelections, restoreDraftAttachments,
|
|
22
26
|
readTranscriptExport, stopForNavigation, createSessionForNavigation, renameSession,
|
|
23
27
|
navigateAfter, adoptReusableSession, landWithoutTabs, shouldNameCreatedSession, renameBox,
|
|
24
28
|
} from './ocp-v2-session-actions.js';
|
|
25
|
-
import { captureBinding,
|
|
29
|
+
import { captureBinding, latestFor, createNavigation } from './ocp-v2-binding.js';
|
|
26
30
|
import { createConfirmations } from './ocp-v2-confirm-logic.js';
|
|
27
31
|
import { syncConfirmRow } from './ocp-v2-confirm.js';
|
|
28
32
|
import { closeWithPromptsConfirm, prefilledDraft, samePrompts } from './ocp-v2-composer-logic.js';
|
|
@@ -41,7 +45,7 @@ import { createAutoAcceptControl } from './ocp-v2-autoaccept-button.js';
|
|
|
41
45
|
import { mountTodoWidget } from './ocp-v2-session-widgets.js';
|
|
42
46
|
import { mountChangesBar } from './ocp-v2-changes.js';
|
|
43
47
|
import { mountEnvironmentPopover } from './ocp-v2-status.js';
|
|
44
|
-
import {
|
|
48
|
+
import { newSessionPlan, checkoutOutcome } from './ocp-v2-changes-logic.js';
|
|
45
49
|
import { mountRenderer } from './ocp-v2-render.js';
|
|
46
50
|
import { offerGreeting } from './ocp-v2-greeting.js';
|
|
47
51
|
import { mountCompose, focusCompose, appendPathToCompose } from './ocp-v2-send.js';
|
|
@@ -82,6 +86,9 @@ let OCP_WINDOW_ID = (() => {
|
|
|
82
86
|
let STOR_TABS = `opencode-v2-tabs-${OCP_WINDOW_ID}`;
|
|
83
87
|
let STOR_AUTOMATIONS = `opencode-v2-automations-${OCP_WINDOW_ID}`;
|
|
84
88
|
let STOR_TITLE_STATES = `opencode-v2-title-states-${OCP_WINDOW_ID}`;
|
|
89
|
+
// The tabs whose session was working when last seen: after a reload their placeholder pills say so and
|
|
90
|
+
// the panel boots to ask OpenCode (ui-sidepanel-tray.js). Never read as the truth: OpenCode's answer is.
|
|
91
|
+
let STOR_BUSY = `opencode-v2-busy-${OCP_WINDOW_ID}`;
|
|
85
92
|
const STOR_WINDOW_REGISTRY = 'opencode-v2-windows';
|
|
86
93
|
const HEAL_DEBOUNCE_MS = 800;
|
|
87
94
|
const HEAL_RETRY_MAX_MS = 30000;
|
|
@@ -94,9 +101,17 @@ let _tabPills = new Map(); // sessionId -> pill element
|
|
|
94
101
|
let _tabInfoCache = new Map(); // sessionId -> last-known session info (title, etc.)
|
|
95
102
|
const _automationRunIds = new Map(); // sessionId -> native loop runId
|
|
96
103
|
const _automationRunning = new Set();
|
|
104
|
+
// sessionId → what a live automation run's turn does ('working', 'waiting' on the user, 'idle' between turns:
|
|
105
|
+
// automationTurnPhase of the run's descriptor): its pill follows the turn, not the run.
|
|
106
|
+
const _automationTurn = new Map();
|
|
107
|
+
// sessionId → working (true) or idle (false), for the tabs that are not on screen: OpenCode's run events
|
|
108
|
+
// and session:status answers say it (noteSessionBusy); the session on screen leaves its own run state
|
|
109
|
+
// here when the user moves on (renderPill), so its pill keeps moving while its turn goes on.
|
|
110
|
+
const _sessionBusy = new Map();
|
|
97
111
|
const _automationContinuedManually = new Set();
|
|
98
112
|
const _automationManualSendInFlight = new Set();
|
|
99
113
|
const _foreignActiveAutomationSessions = new Set();
|
|
114
|
+
const _workerRestarts = new Map();
|
|
100
115
|
const _workerEnds = new Map(); // sessionId -> end card of the dispatched worker it belongs to (ui-worker-end.js)
|
|
101
116
|
let _renderer = null;
|
|
102
117
|
let _visible = false;
|
|
@@ -125,30 +140,20 @@ let _composer = null; // the primary panel's composer (mountCompose)
|
|
|
125
140
|
let _cliBanner = null; // the CLI banner and send-block (ui-cli-banner.js)
|
|
126
141
|
let _cliWasBlocked = false; // the banner held sends back last time it said (a change to usable heals the serve)
|
|
127
142
|
// Where the panel goes. Every choice of the user (a tab, a session in the
|
|
128
|
-
// menu, New session, a project
|
|
143
|
+
// menu, New session, a project) begins an intent, and a navigation
|
|
129
144
|
// binds the panel only while its intent is the latest one: a later choice wins
|
|
130
145
|
// over an older one that is still in flight (ocp-v2-binding.js). What the
|
|
131
146
|
// panel starts by itself (boot, the recovery, an automation asking for focus)
|
|
132
147
|
// only observes: it never overtakes a choice of the user.
|
|
133
148
|
const _nav = createNavigation(getDefaultStore());
|
|
134
|
-
// What
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
//
|
|
149
|
+
// What destroys is asked in the panel, in two steps, never with a native
|
|
150
|
+
// dialog (ocp-v2-confirm-logic.js). `surface` says where the question is
|
|
151
|
+
// drawn: 'menu' under its row of the session menu, 'panel' above the compose
|
|
152
|
+
// box.
|
|
138
153
|
const _confirms = createConfirmations({ store: getDefaultStore() });
|
|
139
154
|
let _confirmSlotEl = null;
|
|
140
155
|
const _menuConfirmAnchors = new Map(); // question key -> the menu row it is asked under
|
|
141
156
|
_confirms.onChange(() => { syncSessionMenuConfirm(); syncPanelConfirm(); });
|
|
142
|
-
// Share links whose sharing this panel stopped. OpenCode goes on reporting
|
|
143
|
-
// them (createStoppedShares in ocp-v2-sessions-logic.js), so the store takes
|
|
144
|
-
// such a link out of any session info it is handed, and so do the session
|
|
145
|
-
// menu and the tab cache. One list for every window, kept across reloads.
|
|
146
|
-
const STOR_STOPPED_SHARES = 'opencode-v2-stopped-shares';
|
|
147
|
-
const _stoppedShares = createStoppedShares({
|
|
148
|
-
load: () => JSON.parse(storage.getItem(STOR_STOPPED_SHARES) || '{}'),
|
|
149
|
-
save: (entries) => storage.setItem(STOR_STOPPED_SHARES, JSON.stringify(entries)),
|
|
150
|
-
});
|
|
151
|
-
getDefaultStore().setSessionInfoFilter?.((info) => _stoppedShares.clean(info));
|
|
152
157
|
|
|
153
158
|
function forkClonedOpenCodePersistence() {
|
|
154
159
|
try {
|
|
@@ -173,6 +178,7 @@ function forkClonedOpenCodePersistence() {
|
|
|
173
178
|
STOR_TABS = `opencode-v2-tabs-${OCP_WINDOW_ID}`;
|
|
174
179
|
STOR_AUTOMATIONS = `opencode-v2-automations-${OCP_WINDOW_ID}`;
|
|
175
180
|
STOR_TITLE_STATES = `opencode-v2-title-states-${OCP_WINDOW_ID}`;
|
|
181
|
+
STOR_BUSY = `opencode-v2-busy-${OCP_WINDOW_ID}`;
|
|
176
182
|
if (transferableTabs.length) storage.setItem(STOR_TABS, JSON.stringify(transferableTabs));
|
|
177
183
|
if (transferableRows.length) storage.setItem(STOR_AUTOMATIONS, JSON.stringify(transferableRows));
|
|
178
184
|
if (Object.keys(transferableTitleStates).length) storage.setItem(STOR_TITLE_STATES, JSON.stringify(transferableTitleStates));
|
|
@@ -188,6 +194,7 @@ function cleanStaleOpenCodeWindows() {
|
|
|
188
194
|
storage.removeItem(`opencode-v2-tabs-${windowId}`);
|
|
189
195
|
storage.removeItem(`opencode-v2-automations-${windowId}`);
|
|
190
196
|
storage.removeItem(`opencode-v2-title-states-${windowId}`);
|
|
197
|
+
storage.removeItem(`opencode-v2-busy-${windowId}`);
|
|
191
198
|
delete registry[windowId];
|
|
192
199
|
}
|
|
193
200
|
registry[OCP_WINDOW_ID] = now;
|
|
@@ -243,6 +250,8 @@ function saveAutomationTabs() {
|
|
|
243
250
|
sessionId,
|
|
244
251
|
runId,
|
|
245
252
|
running: _automationRunning.has(sessionId),
|
|
253
|
+
// What its turn did when this was written (automationTurnPhase): a reload's placeholder pill follows it.
|
|
254
|
+
turn: _automationTurn.get(sessionId) || null,
|
|
246
255
|
ownerId: nativeLoopWindowId,
|
|
247
256
|
continuedManually: _automationContinuedManually.has(sessionId),
|
|
248
257
|
}));
|
|
@@ -264,6 +273,44 @@ function saveAutomationTabs() {
|
|
|
264
273
|
} catch {}
|
|
265
274
|
}
|
|
266
275
|
|
|
276
|
+
// ── What the tabs that are not on screen are doing (_sessionBusy) ──
|
|
277
|
+
|
|
278
|
+
function saveBusySessions() {
|
|
279
|
+
try {
|
|
280
|
+
const busy = _tabSessionIds.filter((sid) => _sessionBusy.get(sid) === true);
|
|
281
|
+
if (busy.length) storage.setItem(STOR_BUSY, JSON.stringify(busy));
|
|
282
|
+
else storage.removeItem(STOR_BUSY);
|
|
283
|
+
} catch {}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** Record what a session is doing; true when that changed. */
|
|
287
|
+
function rememberBusy(sessionId, busy) {
|
|
288
|
+
if (!sessionId || _sessionBusy.get(sessionId) === !!busy) return false;
|
|
289
|
+
_sessionBusy.set(sessionId, !!busy);
|
|
290
|
+
saveBusySessions();
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** A tab's session started or ended a turn while another one is on screen: its pill follows. */
|
|
295
|
+
function noteSessionBusy(sessionId, busy) {
|
|
296
|
+
if (rememberBusy(sessionId, busy) && _tabSessionIds.includes(sessionId)) renderPill();
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Ask OpenCode what every tab that is not on screen is doing: after a boot (only the session on screen
|
|
301
|
+
* is read back by its rehydrate) and after the socket came back (their events of the outage reached no
|
|
302
|
+
* one). A server that does not answer session:status leaves what is known.
|
|
303
|
+
*/
|
|
304
|
+
async function probeTabStatuses() {
|
|
305
|
+
const activeSid = getState().sessionId;
|
|
306
|
+
await Promise.all(_tabSessionIds.filter((sid) => sid && sid !== activeSid).map(async (sid) => {
|
|
307
|
+
let res = null;
|
|
308
|
+
try { res = await api.sessionStatus({ sessionId: sid, cwd: _tabInfoCache.get(sid)?.directory || undefined }); } catch { res = null; }
|
|
309
|
+
const busy = sessionBusyFromStatus(res);
|
|
310
|
+
if (busy !== null && sid !== getState().sessionId && _tabSessionIds.includes(sid)) noteSessionBusy(sid, busy);
|
|
311
|
+
}));
|
|
312
|
+
}
|
|
313
|
+
|
|
267
314
|
try {
|
|
268
315
|
const rows = JSON.parse(storage.getItem(STOR_AUTOMATIONS) || '[]');
|
|
269
316
|
for (const row of Array.isArray(rows) ? rows : []) {
|
|
@@ -416,6 +463,7 @@ function buildPanel() {
|
|
|
416
463
|
onAttachPath: (path) => appendPathToCompose(path),
|
|
417
464
|
});
|
|
418
465
|
_contextMenu = mountContextMenu(actions, panel, getDefaultStore(), {
|
|
466
|
+
bounds: frameRect, // the popover stays in the app frame
|
|
419
467
|
compact: createCompactControl(getDefaultStore()),
|
|
420
468
|
autoAccept: createAutoAcceptControl(getDefaultStore()),
|
|
421
469
|
onManage: () => environment.open(),
|
|
@@ -532,10 +580,6 @@ function buildPanel() {
|
|
|
532
580
|
const result = failIfRefused(await forkSession(getDefaultStore(), api), 'Fork failed');
|
|
533
581
|
if (result?.ok) await openCreatedSession(result.session, { activate: !result.moved, nav });
|
|
534
582
|
},
|
|
535
|
-
// Asked every time, in the session menu: /share only opens the question
|
|
536
|
-
// there, and its button publishes the transcript at a public URL.
|
|
537
|
-
share: () => shareActiveSession(),
|
|
538
|
-
unshare: () => stopSharingActiveSession(),
|
|
539
583
|
};
|
|
540
584
|
composer = _composer = mountCompose(compose, getDefaultStore(), {
|
|
541
585
|
slashActions,
|
|
@@ -608,10 +652,12 @@ function buildPanel() {
|
|
|
608
652
|
// Sessions change outside this panel too (another window, the CLI, a title
|
|
609
653
|
// OpenCode generated): keep the open menu and the tab list in step.
|
|
610
654
|
onEvent((eventType, ev) => {
|
|
655
|
+
// A tab that is not on screen goes on running its turn: its pill says what OpenCode says it does.
|
|
656
|
+
const run = sessionBusyFromEvent(eventType, ev);
|
|
657
|
+
if (run && run.sessionId !== getState().sessionId && _tabSessionIds.includes(run.sessionId)) noteSessionBusy(run.sessionId, run.busy);
|
|
611
658
|
if (eventType !== 'session.updated' && eventType !== 'session.deleted' && eventType !== 'session.created') return;
|
|
612
659
|
if (eventType === 'session.deleted') {
|
|
613
660
|
const sid = ev?.info?.id || ev?.sessionID || ev?.sessionId;
|
|
614
|
-
if (sid) _stoppedShares.resume(sid);
|
|
615
661
|
if (sid && _tabSessionIds.includes(sid)) {
|
|
616
662
|
handlePillClose(sid).catch((err) => console.warn('[ocp-v2-panel] close of a deleted session failed', err));
|
|
617
663
|
}
|
|
@@ -626,6 +672,11 @@ function buildPanel() {
|
|
|
626
672
|
const sid = getState().sessionId;
|
|
627
673
|
if (sid) refreshSessionMessages(sid).catch((err) => console.warn('[ocp-v2-panel] post-compaction refresh failed', err));
|
|
628
674
|
});
|
|
675
|
+
|
|
676
|
+
// Back after an outage: what the other tabs did meanwhile reached no one (the session on screen heals itself).
|
|
677
|
+
onReconnect(() => {
|
|
678
|
+
if (_booted) probeTabStatuses().catch((err) => console.warn('[ocp-v2-panel] tab status probe failed', err));
|
|
679
|
+
});
|
|
629
680
|
}
|
|
630
681
|
|
|
631
682
|
// A reverted prompt goes back into the composer with what it carried, each
|
|
@@ -833,7 +884,7 @@ function updateOpenCodeTitleLocally(sessionId, title) {
|
|
|
833
884
|
? active.sessionInfo
|
|
834
885
|
: _tabInfoCache.get(sessionId);
|
|
835
886
|
const updated = { ...(current || {}), id: sessionId, title };
|
|
836
|
-
_tabInfoCache.set(sessionId,
|
|
887
|
+
_tabInfoCache.set(sessionId, updated);
|
|
837
888
|
if (sessionId === active.sessionId) setSession(sessionId, updated);
|
|
838
889
|
ensureTab(sessionId, updated);
|
|
839
890
|
renderPill();
|
|
@@ -1027,8 +1078,6 @@ let _sessionMenuSearch = '';
|
|
|
1027
1078
|
let _sessionMenuArchived = false;
|
|
1028
1079
|
let _sessionMenuBodyEl = null;
|
|
1029
1080
|
let _sessionMenuRefreshTimer = null;
|
|
1030
|
-
let _sharePolicy = null; // OpenCode's `share` setting, read once per menu open
|
|
1031
|
-
const _sharePolicyReads = latestOnly();
|
|
1032
1081
|
// The list under the search box: the newest read wins, and only for the
|
|
1033
1082
|
// filters (search text, archived or not) the menu still shows.
|
|
1034
1083
|
const _sessionMenuReads = latestFor();
|
|
@@ -1098,20 +1147,6 @@ async function renderSessionMenu() {
|
|
|
1098
1147
|
_sessionMenuEl.appendChild(_sessionMenuBodyEl);
|
|
1099
1148
|
_menuConfirmAnchors.clear();
|
|
1100
1149
|
|
|
1101
|
-
// Whether sharing is allowed at all (D2: hidden when the config disables it).
|
|
1102
|
-
// The policy is the project's: an answer for an earlier opening of the menu,
|
|
1103
|
-
// or for the session the panel has left, is not this menu's.
|
|
1104
|
-
_sharePolicy = null;
|
|
1105
|
-
const policyIsFresh = _sharePolicyReads.begin();
|
|
1106
|
-
const policyAt = captureBinding(getDefaultStore());
|
|
1107
|
-
api.sessionSharePolicy({ cwd: policyAt.cwd || undefined }).then((res) => {
|
|
1108
|
-
if (!policyIsFresh() || !policyAt.isCurrent()) return;
|
|
1109
|
-
if (!replyFailed(res)) {
|
|
1110
|
-
_sharePolicy = res.data?.share || 'manual';
|
|
1111
|
-
scheduleSessionMenuRefresh(0);
|
|
1112
|
-
}
|
|
1113
|
-
}).catch(() => {});
|
|
1114
|
-
|
|
1115
1150
|
await refreshSessionMenuBody();
|
|
1116
1151
|
setTimeout(() => input.focus(), 0);
|
|
1117
1152
|
}
|
|
@@ -1149,8 +1184,7 @@ async function refreshSessionMenuBody() {
|
|
|
1149
1184
|
const cwd = s.cwd || storage.getItem(STOR_PROJECT) || '';
|
|
1150
1185
|
// Sessions of every project are listed, so one from another registered
|
|
1151
1186
|
// project can be resumed; sub-agent sessions open from their parent instead.
|
|
1152
|
-
|
|
1153
|
-
const all = menuSessions(sessions, { search }).slice(0, SESSION_MENU_LIMIT).map((row) => _stoppedShares.clean(row));
|
|
1187
|
+
const all = menuSessions(sessions, { search }).slice(0, SESSION_MENU_LIMIT);
|
|
1154
1188
|
|
|
1155
1189
|
body.innerHTML = '';
|
|
1156
1190
|
_menuConfirmAnchors.clear();
|
|
@@ -1195,82 +1229,14 @@ async function refreshSessionMenuBody() {
|
|
|
1195
1229
|
syncSessionMenuConfirm();
|
|
1196
1230
|
}
|
|
1197
1231
|
|
|
1198
|
-
//
|
|
1199
|
-
// only asks: the question under it says what becomes public, and its button
|
|
1200
|
-
// shares. Nothing is published by one click, and never by a native dialog.
|
|
1201
|
-
async function shareActiveSession() {
|
|
1202
|
-
const sid = getState().sessionId;
|
|
1203
|
-
if (!sid) return null;
|
|
1204
|
-
if (!_sessionMenuEl?.classList.contains('open')) openSessionMenu();
|
|
1205
|
-
const result = await shareSession(getDefaultStore(), api, () => _confirms.ask({
|
|
1206
|
-
key: `share:${sid}`, surface: 'menu', text: SHARE_CONFIRM_TEXT, confirmLabel: 'Share publicly',
|
|
1207
|
-
}), { stopped: _stoppedShares });
|
|
1208
|
-
if (result && result.ok === false && !result.cancelled && !result.moved) pushError({ message: result.error || 'Share failed' });
|
|
1209
|
-
if (result?.ok && result.url) {
|
|
1210
|
-
try { await navigator.clipboard.writeText(result.url); } catch {}
|
|
1211
|
-
if (_sessionMenuEl?.classList.contains('open')) scheduleSessionMenuRefresh(0);
|
|
1212
|
-
else openSessionMenu();
|
|
1213
|
-
}
|
|
1214
|
-
return result;
|
|
1215
|
-
}
|
|
1216
|
-
|
|
1217
|
-
// Stop sharing: the link goes from everything the panel holds of that
|
|
1218
|
-
// session (the store, the tab cache, the menu), also when the panel was on
|
|
1219
|
-
// another session by the time OpenCode answered.
|
|
1220
|
-
async function stopSharingActiveSession() {
|
|
1221
|
-
const sid = getState().sessionId;
|
|
1222
|
-
const result = await unshareSession(getDefaultStore(), api, { stopped: _stoppedShares });
|
|
1223
|
-
if (result && result.ok === false && !result.moved) pushError({ message: result.error || 'Could not stop sharing' });
|
|
1224
|
-
if (sid) forgetStoppedShare(sid);
|
|
1225
|
-
return result;
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1228
|
-
function forgetStoppedShare(sessionId) {
|
|
1229
|
-
const cached = _tabInfoCache.get(sessionId);
|
|
1230
|
-
if (cached) _tabInfoCache.set(sessionId, _stoppedShares.clean(cached));
|
|
1231
|
-
const known = getState().knownSessions;
|
|
1232
|
-
if (known?.has?.(sessionId)) known.set(sessionId, _stoppedShares.clean(known.get(sessionId)));
|
|
1233
|
-
scheduleSessionMenuRefresh(0);
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
// Share / export / fork for the session that is open.
|
|
1232
|
+
// Export / fork for the session that is open.
|
|
1237
1233
|
function appendActiveSessionActions(body, s) {
|
|
1238
1234
|
if (!s.sessionId) return;
|
|
1239
|
-
const share = shareView(s.sessionInfo, _sharePolicy, supports);
|
|
1240
1235
|
const report = (result, fallback) => {
|
|
1241
1236
|
if (result && result.ok === false && !result.cancelled && !result.moved) pushError({ message: result.error || fallback });
|
|
1242
1237
|
return result;
|
|
1243
1238
|
};
|
|
1244
1239
|
|
|
1245
|
-
// Asked every time, under this item: the click only opens the question.
|
|
1246
|
-
// (The item is there while its question is armed, whatever the policy read
|
|
1247
|
-
// says by then: /share asks before that read is back.)
|
|
1248
|
-
const shareKey = `share:${s.sessionId}`;
|
|
1249
|
-
if ((share.canShare && _sharePolicy) || _confirms.isArmed(shareKey)) {
|
|
1250
|
-
const shareItem = menuItem('Share session…', () => {
|
|
1251
|
-
shareActiveSession().catch((err) => pushError({ message: err?.message || 'Share failed' }));
|
|
1252
|
-
}, { muted: true });
|
|
1253
|
-
_menuConfirmAnchors.set(shareKey, shareItem);
|
|
1254
|
-
body.appendChild(shareItem);
|
|
1255
|
-
}
|
|
1256
|
-
if (share.showLink) {
|
|
1257
|
-
body.appendChild(menuItem('Copy share link', async () => {
|
|
1258
|
-
// A failed copy is reported in the session whose link it was.
|
|
1259
|
-
const at = captureBinding(getDefaultStore());
|
|
1260
|
-
try { await navigator.clipboard.writeText(share.url); } catch (err) {
|
|
1261
|
-
if (at.isCurrent()) pushError({ message: err?.message || 'Copy failed' });
|
|
1262
|
-
}
|
|
1263
|
-
}, { muted: true, meta: 'public' }));
|
|
1264
|
-
const url = document.createElement('div');
|
|
1265
|
-
url.className = 'ocpv2-session-share-url';
|
|
1266
|
-
url.textContent = share.url;
|
|
1267
|
-
body.appendChild(url);
|
|
1268
|
-
}
|
|
1269
|
-
if (share.canUnshare) {
|
|
1270
|
-
body.appendChild(menuItem('Stop sharing', () => {
|
|
1271
|
-
stopSharingActiveSession().catch((err) => pushError({ message: err?.message || 'Could not stop sharing' }));
|
|
1272
|
-
}, { muted: true }));
|
|
1273
|
-
}
|
|
1274
1240
|
if (s.messageOrder.length) {
|
|
1275
1241
|
body.appendChild(menuItem('Export transcript', () => {
|
|
1276
1242
|
closeSessionMenu();
|
|
@@ -1310,7 +1276,7 @@ function buildSessionMenuItem(sess, s, cwd, { archived, filters }) {
|
|
|
1310
1276
|
labelEl.textContent = title;
|
|
1311
1277
|
item.appendChild(labelEl);
|
|
1312
1278
|
|
|
1313
|
-
const meta =
|
|
1279
|
+
const meta = projectName || '';
|
|
1314
1280
|
if (meta) {
|
|
1315
1281
|
const metaEl = document.createElement('span');
|
|
1316
1282
|
metaEl.className = 'ocpv2-session-item-meta';
|
|
@@ -1506,7 +1472,7 @@ async function restoreSessionSelections(sid, info) {
|
|
|
1506
1472
|
applySessionSelections(getDefaultStore(), full);
|
|
1507
1473
|
// Fresh metadata too: keeps the title right after a switch.
|
|
1508
1474
|
getDefaultStore().setSessionInfo(full);
|
|
1509
|
-
_tabInfoCache.set(sid,
|
|
1475
|
+
_tabInfoCache.set(sid, { ...(_tabInfoCache.get(sid) || {}), ...full });
|
|
1510
1476
|
if (!info) ensureTab(sid, full);
|
|
1511
1477
|
});
|
|
1512
1478
|
}
|
|
@@ -1628,7 +1594,7 @@ async function boot() {
|
|
|
1628
1594
|
const info = byId.get(sid);
|
|
1629
1595
|
if (info) {
|
|
1630
1596
|
liveTabs.push(sid);
|
|
1631
|
-
_tabInfoCache.set(sid,
|
|
1597
|
+
_tabInfoCache.set(sid, info);
|
|
1632
1598
|
ensureOpenCodeTitleState(sid, info, { manual: true });
|
|
1633
1599
|
}
|
|
1634
1600
|
}
|
|
@@ -1638,7 +1604,7 @@ async function boot() {
|
|
|
1638
1604
|
if (!liveTabs.length && _pendingAutomationAttach?.sessionId) {
|
|
1639
1605
|
const { sessionId, info } = _pendingAutomationAttach;
|
|
1640
1606
|
liveTabs.push(sessionId);
|
|
1641
|
-
_tabInfoCache.set(sessionId,
|
|
1607
|
+
_tabInfoCache.set(sessionId, info || { id: sessionId });
|
|
1642
1608
|
ensureOpenCodeTitleState(sessionId, info, { manual: true });
|
|
1643
1609
|
_tabSessionIds = [...liveTabs];
|
|
1644
1610
|
saveTabSessions();
|
|
@@ -1672,6 +1638,10 @@ async function boot() {
|
|
|
1672
1638
|
create: (nav) => startFreshSession({ cwd: lastProject || undefined, nav }),
|
|
1673
1639
|
});
|
|
1674
1640
|
}
|
|
1641
|
+
// The other tabs: their turns may have outlived the page too. Asked before the placeholders go
|
|
1642
|
+
// (a short wait at most), so a working tab's pill does not blink idle in between.
|
|
1643
|
+
const probed = probeTabStatuses().catch((err) => console.warn('[ocp-v2-panel] tab status probe failed', err));
|
|
1644
|
+
await Promise.race([probed, new Promise((resolveWait) => setTimeout(resolveWait, 600))]);
|
|
1675
1645
|
_booted = true;
|
|
1676
1646
|
// Tell ui-sidepanel-tray we own opencode pills now — it drops any
|
|
1677
1647
|
// placeholder pills it was rendering from storage.
|
|
@@ -1894,14 +1864,6 @@ function promptNameNewSession(targetSessionId = null) {
|
|
|
1894
1864
|
<label class="ocpv2-name-modal-label">Branch</label>
|
|
1895
1865
|
<select class="ocpv2-name-modal-select" data-role="branch" disabled></select>
|
|
1896
1866
|
</div>
|
|
1897
|
-
<div class="ocpv2-name-modal-row ocpv2-name-modal-worktree" hidden>
|
|
1898
|
-
<label class="ocpv2-name-modal-label">Worktree</label>
|
|
1899
|
-
<label class="ocpv2-name-modal-check">
|
|
1900
|
-
<input type="checkbox" data-role="worktree" />
|
|
1901
|
-
<span>Run in a new git worktree</span>
|
|
1902
|
-
</label>
|
|
1903
|
-
</div>
|
|
1904
|
-
<div class="ocpv2-name-modal-worktrees" hidden></div>
|
|
1905
1867
|
<input type="text" class="ocpv2-name-modal-input" placeholder="Session name..." maxlength="120" />
|
|
1906
1868
|
<div class="ocpv2-name-modal-actions">
|
|
1907
1869
|
<button type="button" class="ocpv2-name-modal-btn skip">Skip</button>
|
|
@@ -1926,14 +1888,6 @@ function promptNameNewSession(targetSessionId = null) {
|
|
|
1926
1888
|
|
|
1927
1889
|
let branchOriginal = null;
|
|
1928
1890
|
let branchesKnown = false;
|
|
1929
|
-
// A session in a new worktree starts from what the project has checked out
|
|
1930
|
-
// now; the project's own checkout is never switched for it.
|
|
1931
|
-
const syncBranchLock = () => {
|
|
1932
|
-
const locked = !!worktreeCheck?.checked;
|
|
1933
|
-
if (locked && branchOriginal) branchSel.value = branchOriginal;
|
|
1934
|
-
branchSel.disabled = locked || !branchesKnown;
|
|
1935
|
-
branchSel.title = locked ? 'A new worktree starts from the branch the project has checked out.' : '';
|
|
1936
|
-
};
|
|
1937
1891
|
let branchRequest = 0;
|
|
1938
1892
|
async function refreshBranches(path) {
|
|
1939
1893
|
const request = ++branchRequest;
|
|
@@ -1956,75 +1910,13 @@ function promptNameNewSession(targetSessionId = null) {
|
|
|
1956
1910
|
if (branchOriginal) branchSel.value = branchOriginal;
|
|
1957
1911
|
branchesKnown = true;
|
|
1958
1912
|
}
|
|
1959
|
-
|
|
1913
|
+
branchSel.disabled = !branchesKnown;
|
|
1960
1914
|
}
|
|
1961
1915
|
|
|
1962
|
-
// Worktrees: an isolated checkout OpenCode creates for the session, so its
|
|
1963
|
-
// edits stay out of the main working tree. Offered only when the server can.
|
|
1964
|
-
const worktreeRow = overlay.querySelector('.ocpv2-name-modal-worktree');
|
|
1965
|
-
const worktreeCheck = overlay.querySelector('input[data-role="worktree"]');
|
|
1966
|
-
const worktreeList = overlay.querySelector('.ocpv2-name-modal-worktrees');
|
|
1967
|
-
worktreeCheck?.addEventListener('change', syncBranchLock);
|
|
1968
1916
|
refreshBranches(projectSel?.value || initialProject);
|
|
1969
|
-
const worktreeReads = latestOnly();
|
|
1970
|
-
// Removing a worktree is asked in the dialog, under its row.
|
|
1971
|
-
const worktreeConfirmAnchors = new Map();
|
|
1972
|
-
const dialogQuestion = (view) => view.surface === 'dialog';
|
|
1973
|
-
const offWorktreeConfirm = _confirms.onChange(() => {
|
|
1974
|
-
syncConfirmRow(_confirms, worktreeList, 'dialog', (key) => worktreeConfirmAnchors.get(key));
|
|
1975
|
-
});
|
|
1976
|
-
async function refreshWorktrees(path) {
|
|
1977
|
-
// The rows are read again: a question about one of them is off.
|
|
1978
|
-
_confirms.cancel(dialogQuestion);
|
|
1979
|
-
worktreeConfirmAnchors.clear();
|
|
1980
|
-
const canCreate = supports('worktree:create') && !!path;
|
|
1981
|
-
worktreeRow.hidden = !canCreate;
|
|
1982
|
-
if (!canCreate) worktreeCheck.checked = false;
|
|
1983
|
-
syncBranchLock();
|
|
1984
|
-
worktreeList.hidden = true;
|
|
1985
|
-
worktreeList.textContent = '';
|
|
1986
|
-
if (!path || !supports('worktree:list', 'worktree:remove')) return;
|
|
1987
|
-
const latest = worktreeReads.begin();
|
|
1988
|
-
const res = await api.worktreeList({ cwd: path }).catch(() => null);
|
|
1989
|
-
// A newer read (another project picked, a worktree removed) owns the list.
|
|
1990
|
-
if (!latest() || replyFailed(res) || !Array.isArray(res.data) || !res.data.length || projectSel?.value !== path) return;
|
|
1991
|
-
worktreeList.hidden = false;
|
|
1992
|
-
for (const tree of res.data) {
|
|
1993
|
-
const row = document.createElement('div');
|
|
1994
|
-
row.className = 'ocpv2-permission-more';
|
|
1995
|
-
const name = document.createElement('code');
|
|
1996
|
-
name.textContent = tree.branch ? `${tree.name} (${tree.branch})` : tree.name;
|
|
1997
|
-
name.title = tree.directory;
|
|
1998
|
-
const remove = document.createElement('button');
|
|
1999
|
-
remove.type = 'button';
|
|
2000
|
-
remove.className = 'ocpv2-permission-link';
|
|
2001
|
-
remove.textContent = 'Remove';
|
|
2002
|
-
remove.addEventListener('click', async () => {
|
|
2003
|
-
// This click only asks; the button of the question removes it.
|
|
2004
|
-
const key = `worktree-remove:${tree.directory}`;
|
|
2005
|
-
worktreeConfirmAnchors.set(key, row);
|
|
2006
|
-
const agreed = await _confirms.ask({
|
|
2007
|
-
key, surface: 'dialog', confirmLabel: 'Remove worktree',
|
|
2008
|
-
text: `Remove the worktree "${tree.name}"? Its directory and uncommitted changes are deleted.`,
|
|
2009
|
-
});
|
|
2010
|
-
if (!agreed) return;
|
|
2011
|
-
const removed = await api.worktreeRemove({ cwd: path, directory: tree.directory }).catch((err) => ({ ok: false, error: err?.message }));
|
|
2012
|
-
// The failure is about the worktree, not about a session: it is shown
|
|
2013
|
-
// wherever the panel is. The list is this dialog's: it is read again
|
|
2014
|
-
// only while the dialog is open and still on that project.
|
|
2015
|
-
if (replyFailed(removed)) { pushError({ message: replyError(removed, 'Could not remove the worktree') }); return; }
|
|
2016
|
-
if (done || projectSel?.value !== path) return;
|
|
2017
|
-
refreshWorktrees(path);
|
|
2018
|
-
});
|
|
2019
|
-
row.append(name, remove);
|
|
2020
|
-
worktreeList.appendChild(row);
|
|
2021
|
-
}
|
|
2022
|
-
}
|
|
2023
|
-
refreshWorktrees(projectSel?.value || initialProject);
|
|
2024
1917
|
|
|
2025
1918
|
projectSel?.addEventListener('change', () => {
|
|
2026
1919
|
refreshBranches(projectSel.value);
|
|
2027
|
-
refreshWorktrees(projectSel.value);
|
|
2028
1920
|
});
|
|
2029
1921
|
|
|
2030
1922
|
setTimeout(() => { input.focus(); input.select(); }, 10);
|
|
@@ -2033,8 +1925,6 @@ function promptNameNewSession(targetSessionId = null) {
|
|
|
2033
1925
|
const close = () => {
|
|
2034
1926
|
if (done) return;
|
|
2035
1927
|
done = true;
|
|
2036
|
-
offWorktreeConfirm();
|
|
2037
|
-
_confirms.cancel(dialogQuestion);
|
|
2038
1928
|
overlay.remove();
|
|
2039
1929
|
};
|
|
2040
1930
|
|
|
@@ -2043,29 +1933,20 @@ function promptNameNewSession(targetSessionId = null) {
|
|
|
2043
1933
|
const nextTitle = input.value.trim();
|
|
2044
1934
|
const chosenProject = projectSel?.value || '';
|
|
2045
1935
|
const chosenBranch = branchSel?.value || '';
|
|
2046
|
-
const wantsWorktree = !!worktreeCheck?.checked && !!chosenProject;
|
|
2047
1936
|
close();
|
|
2048
1937
|
// Skip leaves the freshly-created session in place — same as Claude/Codex
|
|
2049
1938
|
// where dismissing the rename modal keeps the empty new tab.
|
|
2050
1939
|
if (cancel) return;
|
|
2051
1940
|
|
|
2052
1941
|
const plan = newSessionPlan({
|
|
2053
|
-
project: chosenProject, branch: chosenBranch, currentBranch: branchOriginal || '',
|
|
2054
|
-
wantsWorktree, cwd: getState().cwd || '',
|
|
1942
|
+
project: chosenProject, branch: chosenBranch, currentBranch: branchOriginal || '', cwd: getState().cwd || '',
|
|
2055
1943
|
});
|
|
2056
1944
|
const projectChanged = plan.projectChanged;
|
|
2057
1945
|
// What Save starts is a navigation of its own when it creates a session
|
|
2058
|
-
// (in
|
|
2059
|
-
//
|
|
2060
|
-
//
|
|
2061
|
-
const nav =
|
|
2062
|
-
|
|
2063
|
-
// The worktree first: an isolated session never switches the branch of the
|
|
2064
|
-
// project's own checkout.
|
|
2065
|
-
if (plan.worktree) {
|
|
2066
|
-
await startSessionInNewWorktree(chosenProject, nextTitle, nav);
|
|
2067
|
-
return;
|
|
2068
|
-
}
|
|
1946
|
+
// (in another project): it owns the panel from this click on, unless the
|
|
1947
|
+
// user chooses something else while it waits. A Save that only names the
|
|
1948
|
+
// session navigates nowhere and begins no intent.
|
|
1949
|
+
const nav = projectChanged ? _nav.begin() : null;
|
|
2069
1950
|
|
|
2070
1951
|
if (plan.checkout) {
|
|
2071
1952
|
// A session started after a failed switch would run on the wrong base.
|
|
@@ -2133,40 +2014,6 @@ function promptNameNewSession(targetSessionId = null) {
|
|
|
2133
2014
|
});
|
|
2134
2015
|
}
|
|
2135
2016
|
|
|
2136
|
-
// "Run in a new git worktree": OpenCode creates the worktree (and runs the
|
|
2137
|
-
// project's start command in it), then the session is created inside it. The
|
|
2138
|
-
// project stays the remembered default; only this session lives in the worktree.
|
|
2139
|
-
async function startSessionInNewWorktree(projectPath, title, nav = _nav.begin()) {
|
|
2140
|
-
// Subscribe before creating: the ready event can beat the reply. Events are
|
|
2141
|
-
// held until the reply names this worktree, so another creation finishing
|
|
2142
|
-
// (or failing) first is not mistaken for this one.
|
|
2143
|
-
const watch = watchWorktree(onEvent, { timeoutMs: 60_000 });
|
|
2144
|
-
const created = await api.worktreeCreate({ cwd: projectPath }).catch((err) => ({ ok: false, error: err?.message }));
|
|
2145
|
-
if (replyFailed(created) || !created.data?.directory) {
|
|
2146
|
-
watch.cancel();
|
|
2147
|
-
pushError({ message: replyError(created, 'Could not create the worktree') });
|
|
2148
|
-
return;
|
|
2149
|
-
}
|
|
2150
|
-
watch.identify(created.data.name);
|
|
2151
|
-
const state = await watch.result;
|
|
2152
|
-
if (!state.ok) {
|
|
2153
|
-
pushError({ message: state.error });
|
|
2154
|
-
return;
|
|
2155
|
-
}
|
|
2156
|
-
// Up to a minute has passed. The session is created in the worktree either
|
|
2157
|
-
// way; it takes the panel only when the user did not navigate meanwhile
|
|
2158
|
-
// (`nav`), and is a tab otherwise.
|
|
2159
|
-
if (nav.isCurrent()) {
|
|
2160
|
-
const prevSid = getState().sessionId;
|
|
2161
|
-
if (prevSid) ensureTab(prevSid, getState().sessionInfo);
|
|
2162
|
-
}
|
|
2163
|
-
try {
|
|
2164
|
-
await startFreshSession({ title: title || undefined, cwd: created.data.directory, nav });
|
|
2165
|
-
} catch (err) {
|
|
2166
|
-
pushError({ message: err?.message || 'New session failed' });
|
|
2167
|
-
}
|
|
2168
|
-
}
|
|
2169
|
-
|
|
2170
2017
|
async function closeCurrentSession() {
|
|
2171
2018
|
// Update the UI first; server cleanup is best-effort and must not block the
|
|
2172
2019
|
// only visible tab from closing.
|
|
@@ -2291,7 +2138,7 @@ function saveTabSessions() {
|
|
|
2291
2138
|
|
|
2292
2139
|
function ensureTab(sessionId, info = null) {
|
|
2293
2140
|
if (!sessionId) return;
|
|
2294
|
-
if (info) _tabInfoCache.set(sessionId,
|
|
2141
|
+
if (info) _tabInfoCache.set(sessionId, info);
|
|
2295
2142
|
if (!_tabSessionIds.includes(sessionId)) {
|
|
2296
2143
|
_tabSessionIds.push(sessionId);
|
|
2297
2144
|
saveTabSessions();
|
|
@@ -2388,9 +2235,11 @@ function removeTab(sessionId, { byUser = false } = {}) {
|
|
|
2388
2235
|
_automationRunIds.delete(sessionId);
|
|
2389
2236
|
unregisterAutomationSession(sessionId);
|
|
2390
2237
|
_automationRunning.delete(sessionId);
|
|
2238
|
+
_automationTurn.delete(sessionId);
|
|
2391
2239
|
_automationContinuedManually.delete(sessionId);
|
|
2392
2240
|
_automationManualSendInFlight.delete(sessionId);
|
|
2393
2241
|
saveAutomationTabs();
|
|
2242
|
+
if (_sessionBusy.delete(sessionId)) saveBusySessions();
|
|
2394
2243
|
const pill = _tabPills.get(sessionId);
|
|
2395
2244
|
if (pill?.isConnected) pill.remove();
|
|
2396
2245
|
_tabPills.delete(sessionId);
|
|
@@ -2449,7 +2298,17 @@ async function closeTabByUser(sessionId, context) {
|
|
|
2449
2298
|
// Assistant session that dispatched it.
|
|
2450
2299
|
function workerEndCard(sessionId) {
|
|
2451
2300
|
const view = sessionId ? _workerEnds.get(sessionId) : null;
|
|
2452
|
-
if (!view)
|
|
2301
|
+
if (!view) {
|
|
2302
|
+
const restart = _workerRestarts.get(sessionId);
|
|
2303
|
+
if (!restart?.key) return null;
|
|
2304
|
+
return { sig: restart.stamp, build: () => {
|
|
2305
|
+
const el = document.createElement('div');
|
|
2306
|
+
el.className = 'ocpv2-post-plan-card ocpv2-post-plan-body';
|
|
2307
|
+
el.setAttribute('role', 'status');
|
|
2308
|
+
el.textContent = t(restart.key);
|
|
2309
|
+
return el;
|
|
2310
|
+
} };
|
|
2311
|
+
}
|
|
2453
2312
|
return {
|
|
2454
2313
|
sig: view.sig,
|
|
2455
2314
|
build: () => buildWorkerEndCard(view, {
|
|
@@ -2481,6 +2340,8 @@ function renderPill() {
|
|
|
2481
2340
|
if (!tray) return;
|
|
2482
2341
|
const activeSid = getState().sessionId;
|
|
2483
2342
|
if (activeSid) ensureTab(activeSid, getState().sessionInfo);
|
|
2343
|
+
// What the session on screen is doing stays known for its tab once the user moves on.
|
|
2344
|
+
if (activeSid) rememberBusy(activeSid, !!getState().running);
|
|
2484
2345
|
|
|
2485
2346
|
// Drop pills for sessions no longer in the tab list
|
|
2486
2347
|
for (const [sid, pill] of Array.from(_tabPills.entries())) {
|
|
@@ -2501,7 +2362,14 @@ function renderPill() {
|
|
|
2501
2362
|
if (labelEl) labelEl.textContent = tabLabelFor(sid);
|
|
2502
2363
|
const isActive = sid === activeSid;
|
|
2503
2364
|
pill.classList.toggle('ocpv2-pill-active', isActive);
|
|
2504
|
-
pill
|
|
2365
|
+
// One pill per session, each with its own state: a tab the user left goes on showing its turn, an
|
|
2366
|
+
// automation its turn (not its run), and a session that waits on the user says so.
|
|
2367
|
+
const state = tabPillState({
|
|
2368
|
+
sessionId: sid, activeSessionId: activeSid, running: !!getState().running,
|
|
2369
|
+
busy: _sessionBusy.get(sid) === true, automation: _automationTurn.get(sid) || null,
|
|
2370
|
+
});
|
|
2371
|
+
pill.classList.toggle('ocpv2-pill-running', state === 'working');
|
|
2372
|
+
pill.classList.toggle('ocpv2-pill-waiting', state === 'waiting');
|
|
2505
2373
|
pill.style.display = (isActive && _visible) ? 'none' : '';
|
|
2506
2374
|
}
|
|
2507
2375
|
// The sub-agent pills of the session on screen sit under its pill.
|
|
@@ -2624,6 +2492,16 @@ export async function endHostedOpenCodeSessions() {
|
|
|
2624
2492
|
|
|
2625
2493
|
export function isOpencodePanelOpen() { return _visible || isChildPanelOpen(); }
|
|
2626
2494
|
|
|
2495
|
+
/**
|
|
2496
|
+
* Boot the panel without showing it (ui-sidepanel-tray.js, when a tab saved while it worked comes back
|
|
2497
|
+
* after a reload): its tabs come back and OpenCode is asked what each session does, so their pills say it.
|
|
2498
|
+
*/
|
|
2499
|
+
export async function bootOpencodePanel() {
|
|
2500
|
+
if (!_panelEl) buildPanel();
|
|
2501
|
+
await connect();
|
|
2502
|
+
await boot();
|
|
2503
|
+
}
|
|
2504
|
+
|
|
2627
2505
|
export async function toggleOpencodePanel() {
|
|
2628
2506
|
if (_visible || isChildPanelOpen()) {
|
|
2629
2507
|
requestOpencodeView({ hideAll: true });
|
|
@@ -2641,7 +2519,9 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
|
|
|
2641
2519
|
// Establish ownership before connect()/boot(): native provider events use a
|
|
2642
2520
|
// separate socket and may report a Task child while this attach is awaiting.
|
|
2643
2521
|
const previousRunId = _automationRunIds.get(sessionId);
|
|
2644
|
-
const
|
|
2522
|
+
const restart = workerRestart(run);
|
|
2523
|
+
const running = restart.active;
|
|
2524
|
+
_workerRestarts.set(sessionId, restart);
|
|
2645
2525
|
// The user continued this run's session by hand after the run ended: the tab stays theirs.
|
|
2646
2526
|
const released = !running && previousRunId === run.runId
|
|
2647
2527
|
&& (_automationContinuedManually.has(sessionId) || _automationManualSendInFlight.has(sessionId));
|
|
@@ -2653,12 +2533,16 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
|
|
|
2653
2533
|
}
|
|
2654
2534
|
if (running) _automationRunning.add(sessionId);
|
|
2655
2535
|
else _automationRunning.delete(sessionId);
|
|
2536
|
+
// Every update of the run (its turn starts, waits on you, ends) comes through here: the pill follows it.
|
|
2537
|
+
const phase = automationTurnPhase(run);
|
|
2538
|
+
if (phase) _automationTurn.set(sessionId, phase);
|
|
2539
|
+
else _automationTurn.delete(sessionId);
|
|
2656
2540
|
saveAutomationTabs();
|
|
2657
2541
|
const info = {
|
|
2658
2542
|
id: sessionId,
|
|
2659
2543
|
title: run.title || 'Automation',
|
|
2660
2544
|
directory: run.cwd || '',
|
|
2661
|
-
|
|
2545
|
+
tools: run.tools || null,
|
|
2662
2546
|
time: { updated: Date.now() },
|
|
2663
2547
|
};
|
|
2664
2548
|
if (!_booted) _pendingAutomationAttach = { sessionId, info };
|
|
@@ -2688,16 +2572,17 @@ export async function attachOpenCodeAutomation(run, { focus = !!run?.focus, isCa
|
|
|
2688
2572
|
if (!_visible) await showPrimaryOpencodePanel();
|
|
2689
2573
|
await switchToSession(sessionId, info, { nav });
|
|
2690
2574
|
} else if (getState().sessionId === sessionId) {
|
|
2691
|
-
setRunning(running);
|
|
2575
|
+
setRunning(running && !restart.suspended);
|
|
2692
2576
|
await rehydrateActiveSession().catch(() => {});
|
|
2693
2577
|
}
|
|
2694
|
-
if (getState().sessionId === sessionId) setRunning(running);
|
|
2578
|
+
if (getState().sessionId === sessionId) setRunning(running && !restart.suspended);
|
|
2579
|
+
_renderer?.render();
|
|
2695
2580
|
// (A dispatched worker's failure, with its reason, is on its end card.)
|
|
2696
2581
|
if (run.status === 'failed' && run.error && !isDispatchedRun(run) && getState().sessionId === sessionId
|
|
2697
2582
|
&& _tabInfoCache.get(sessionId)?._automationLifecycleError !== run.error) {
|
|
2698
2583
|
const cachedInfo = _tabInfoCache.get(sessionId) || info;
|
|
2699
2584
|
cachedInfo._automationLifecycleError = run.error;
|
|
2700
|
-
_tabInfoCache.set(sessionId,
|
|
2585
|
+
_tabInfoCache.set(sessionId, cachedInfo);
|
|
2701
2586
|
pushError({ message: run.error });
|
|
2702
2587
|
}
|
|
2703
2588
|
trackWorkerEnd(run, { apply: (view) => showWorkerEnd(sessionId, view) });
|
|
@@ -2711,6 +2596,7 @@ export async function detachOpenCodeAutomation(runId) {
|
|
|
2711
2596
|
const [sessionId] = entry;
|
|
2712
2597
|
_automationRunIds.delete(sessionId);
|
|
2713
2598
|
_automationRunning.delete(sessionId);
|
|
2599
|
+
_automationTurn.delete(sessionId);
|
|
2714
2600
|
_automationContinuedManually.delete(sessionId);
|
|
2715
2601
|
_automationManualSendInFlight.delete(sessionId);
|
|
2716
2602
|
saveAutomationTabs();
|