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
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
4
|
|
|
5
5
|
import { isBindingToken } from './ocp-v2-binding.js';
|
|
6
|
+
import { knownDescendant, requestOwner } from './ocp-v2-rehydrate.js';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* The compose box shows the outgoing prompt at once as a local message. The
|
|
@@ -115,3 +116,403 @@ export function settleFailedSend(turn, parked, { item, error = '' } = {}) {
|
|
|
115
116
|
const kept = !!(turn.sessionId && item && parked?.park(turn.sessionId, { item, error }));
|
|
116
117
|
return { here: false, parked: kept };
|
|
117
118
|
}
|
|
119
|
+
|
|
120
|
+
// ── How long a turn may take ────────────────────────────────────────────────
|
|
121
|
+
// A turn can wait on the user for as long as they take (a permission, a
|
|
122
|
+
// question): the clock that gives up on a turn nobody hears from again counts
|
|
123
|
+
// only the time it works.
|
|
124
|
+
|
|
125
|
+
/** The working time a turn's send waits for its answer (message:send, command:run, an async turn's idle). */
|
|
126
|
+
export const TURN_LIMIT_MS = 30 * 60 * 1000;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Runs `onExpire` once `ms` of unpaused time went by. `paused()` says whether
|
|
130
|
+
* the turn waits on the user now; `subscribe(fn)` calls `fn` whenever that may
|
|
131
|
+
* have changed and returns an unsubscribe. `cancel()` stops it for good.
|
|
132
|
+
*/
|
|
133
|
+
export function createTurnClock({
|
|
134
|
+
ms, paused = () => false, subscribe = () => () => {}, onExpire = () => {},
|
|
135
|
+
now = Date.now, setTimer = setTimeout, clearTimer = clearTimeout,
|
|
136
|
+
} = {}) {
|
|
137
|
+
let left = Math.max(0, Number(ms) || 0);
|
|
138
|
+
let since = 0;
|
|
139
|
+
let timer = null;
|
|
140
|
+
let done = false;
|
|
141
|
+
let unsubscribe = () => {};
|
|
142
|
+
const finish = () => {
|
|
143
|
+
done = true;
|
|
144
|
+
timer = null;
|
|
145
|
+
try { unsubscribe(); } catch { /* gone */ }
|
|
146
|
+
};
|
|
147
|
+
const run = () => {
|
|
148
|
+
if (done || timer) return;
|
|
149
|
+
since = now();
|
|
150
|
+
timer = setTimer(() => { finish(); onExpire(); }, left);
|
|
151
|
+
};
|
|
152
|
+
const hold = () => {
|
|
153
|
+
if (!timer) return;
|
|
154
|
+
clearTimer(timer);
|
|
155
|
+
timer = null;
|
|
156
|
+
left = Math.max(0, left - (now() - since));
|
|
157
|
+
};
|
|
158
|
+
const sync = () => {
|
|
159
|
+
if (done) return;
|
|
160
|
+
if (paused()) hold(); else run();
|
|
161
|
+
};
|
|
162
|
+
unsubscribe = subscribe(sync) || (() => {});
|
|
163
|
+
sync();
|
|
164
|
+
return {
|
|
165
|
+
cancel() {
|
|
166
|
+
if (done) return;
|
|
167
|
+
if (timer) clearTimer(timer);
|
|
168
|
+
finish();
|
|
169
|
+
},
|
|
170
|
+
/** The working time left (ms). */
|
|
171
|
+
left: () => (timer ? Math.max(0, left - (now() - since)) : left),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const ASKED = new Set(['permission.asked', 'question.asked']);
|
|
176
|
+
const ANSWERED = new Set(['permission.replied', 'question.replied', 'question.rejected']);
|
|
177
|
+
const askIdOf = (ev) => String(ev?.requestID || ev?.id || ev?.permissionID || '');
|
|
178
|
+
const askKindOf = (eventType) => (String(eventType).startsWith('permission.') ? 'permission' : 'question');
|
|
179
|
+
|
|
180
|
+
/** The two lists a session's open requests are read from (permission:list, question:list). */
|
|
181
|
+
export const ASK_KINDS = Object.freeze(['permission', 'question']);
|
|
182
|
+
/** How often a list is read before the panel gives up on it, the first read included. */
|
|
183
|
+
export const ASK_READ_ATTEMPTS = 3;
|
|
184
|
+
/** The waits before the second and the third read of a list. */
|
|
185
|
+
export const ASK_RETRY_MS = Object.freeze([1000, 4000]);
|
|
186
|
+
const LIST_STATES = new Set(['ok', 'failed', 'unsupported', 'unresolved']);
|
|
187
|
+
|
|
188
|
+
// One event applied to the open requests (request id → { owner, kind, stale }); true when what waits changed.
|
|
189
|
+
function applyAskEvent(open, eventType, ev) {
|
|
190
|
+
if (ASKED.has(eventType)) {
|
|
191
|
+
const id = askIdOf(ev);
|
|
192
|
+
const owner = requestOwner(ev);
|
|
193
|
+
if (!id || !owner) return false;
|
|
194
|
+
const known = open.get(id);
|
|
195
|
+
open.set(id, { owner, kind: askKindOf(eventType), stale: false });
|
|
196
|
+
return known?.owner !== owner;
|
|
197
|
+
}
|
|
198
|
+
if (ANSWERED.has(eventType)) return open.delete(askIdOf(ev));
|
|
199
|
+
if (eventType === 'session.idle' || eventType === 'session.error') {
|
|
200
|
+
const sid = String(ev?.sessionID || ev?.sessionId || '');
|
|
201
|
+
let gone = false;
|
|
202
|
+
for (const [id, entry] of open) if (entry.owner === sid) { open.delete(id); gone = true; }
|
|
203
|
+
return gone;
|
|
204
|
+
}
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* The requests that wait on the user, by the session that raised them, from
|
|
210
|
+
* the panel's event stream (every session's events reach it): asked by
|
|
211
|
+
* permission.asked / question.asked, gone with their answer, and gone with the
|
|
212
|
+
* turn (session.idle, session.error). `waits(sessionId)` is true while that
|
|
213
|
+
* session, or a sub-agent below it (`parentOf`: child → parent), has one.
|
|
214
|
+
*
|
|
215
|
+
* What the stream cannot tell (what was asked before the page loaded, or while
|
|
216
|
+
* the socket was down) is read from the server, list by list: each session's
|
|
217
|
+
* permissions and its questions (readOpenAsks). `read(want, { attempt, partial })`
|
|
218
|
+
* resolves `{ lists }`, each `{ sessionId, kind, state, requests }`; `want` is
|
|
219
|
+
* null for every session a panel is bound to, else `[{ sessionId, kinds }]`.
|
|
220
|
+
* • A list that was read (state ok, or unresolved: read, but a request in it
|
|
221
|
+
* is of a session whose place could not be established) replaces what was
|
|
222
|
+
* known of its kind for its session and the sub-agents known below it, also
|
|
223
|
+
* when it came back empty. Events that arrived while it was read are applied
|
|
224
|
+
* again on top.
|
|
225
|
+
* • A session whose list failed or is unresolved keeps waiting (no clock of it
|
|
226
|
+
* counts) and has that list read again, ASK_READ_ATTEMPTS times in all. Then,
|
|
227
|
+
* or at once for a list the server cannot give (unsupported), the panel gives
|
|
228
|
+
* up on it: what was known of it from before the outage goes, its clocks
|
|
229
|
+
* count again, and the rebuild resolves `{ gaveUp: [{ sessionId, kinds }] }`
|
|
230
|
+
* so that the panel says so. Nothing could be read at all: `{ unread: true }`.
|
|
231
|
+
* `hold()` (the socket closed): every session counts as waiting until the first
|
|
232
|
+
* read of the `rebuild(read)` that follows, and what was known turns into
|
|
233
|
+
* unconfirmed, to be confirmed or dropped by the lists. A newer `hold()` makes
|
|
234
|
+
* an older rebuild void (it resolves null).
|
|
235
|
+
* `expect(sessionIds)` + `rebuild(read, { sessions })` read only those sessions
|
|
236
|
+
* (a page load, a panel bound to another session): they wait from `expect` until
|
|
237
|
+
* their lists are in, and no other session is held.
|
|
238
|
+
*/
|
|
239
|
+
export function createAskTracker({ parentOf = new Map(), attempts = ASK_READ_ATTEMPTS, retryMs = ASK_RETRY_MS, setTimer = setTimeout } = {}) {
|
|
240
|
+
let open = new Map(); // request id → { owner, kind, stale }
|
|
241
|
+
let held = false; // the socket is down, or the first read after it is out: everything waits
|
|
242
|
+
const pending = new Map(); // session → the kinds whose list is still to be read (it waits meanwhile)
|
|
243
|
+
let generation = 0;
|
|
244
|
+
let replay = null; // the events noted while a read is out
|
|
245
|
+
const listeners = new Set();
|
|
246
|
+
const changed = () => {
|
|
247
|
+
for (const fn of [...listeners]) {
|
|
248
|
+
try { fn(); } catch (e) { console.warn('[ocp-v2-send] ask listener failed', e); }
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
const under = (owner, root) => owner === root || knownDescendant(owner, root, parentOf);
|
|
252
|
+
const expect = (sessionId, kinds) => {
|
|
253
|
+
let set = pending.get(sessionId);
|
|
254
|
+
if (!set) pending.set(sessionId, (set = new Set()));
|
|
255
|
+
for (const kind of kinds) set.add(kind);
|
|
256
|
+
};
|
|
257
|
+
const settle = (sessionId, kind) => {
|
|
258
|
+
const set = pending.get(sessionId);
|
|
259
|
+
if (!set) return;
|
|
260
|
+
set.delete(kind);
|
|
261
|
+
if (!set.size) pending.delete(sessionId);
|
|
262
|
+
};
|
|
263
|
+
// An entry still to be confirmed by a list that will be read again.
|
|
264
|
+
const awaited = (entry) => {
|
|
265
|
+
for (const [root, kinds] of pending) if (kinds.has(entry.kind) && under(entry.owner, root)) return true;
|
|
266
|
+
return false;
|
|
267
|
+
};
|
|
268
|
+
const sleep = (ms) => new Promise((done) => { setTimer(done, Math.max(0, Number(ms) || 0)); });
|
|
269
|
+
const delayAfter = (attempt) => (Array.isArray(retryMs) ? retryMs[Math.min(attempt, retryMs.length) - 1] : retryMs) || 0;
|
|
270
|
+
const wantedOf = (sessions) => (Array.isArray(sessions)
|
|
271
|
+
? [...new Set(sessions.map((id) => String(id || '')).filter(Boolean))].map((sessionId) => ({ sessionId, kinds: [...ASK_KINDS] }))
|
|
272
|
+
: null);
|
|
273
|
+
|
|
274
|
+
return {
|
|
275
|
+
note(eventType, ev) {
|
|
276
|
+
replay?.push([eventType, ev]);
|
|
277
|
+
if (applyAskEvent(open, eventType, ev) && !held) changed();
|
|
278
|
+
},
|
|
279
|
+
waits(sessionId) {
|
|
280
|
+
const sid = String(sessionId || '');
|
|
281
|
+
if (!sid) return false;
|
|
282
|
+
if (held) return true;
|
|
283
|
+
for (const [root, kinds] of pending) if (kinds.size && under(sid, root)) return true;
|
|
284
|
+
for (const { owner } of open.values()) if (owner === sid || knownDescendant(owner, sid, parentOf)) return true;
|
|
285
|
+
return false;
|
|
286
|
+
},
|
|
287
|
+
hold() {
|
|
288
|
+
generation += 1;
|
|
289
|
+
replay = null;
|
|
290
|
+
pending.clear();
|
|
291
|
+
for (const entry of open.values()) entry.stale = true;
|
|
292
|
+
if (held) return;
|
|
293
|
+
held = true;
|
|
294
|
+
changed();
|
|
295
|
+
},
|
|
296
|
+
/** These sessions wait from now until their lists are read (rebuild with `sessions`). */
|
|
297
|
+
expect(sessionIds) {
|
|
298
|
+
const wanted = wantedOf(sessionIds) || [];
|
|
299
|
+
for (const { sessionId, kinds } of wanted) expect(sessionId, kinds);
|
|
300
|
+
if (wanted.length && !held) changed();
|
|
301
|
+
},
|
|
302
|
+
/** These sessions wait for no read of their own (their parent's lists hold their requests). */
|
|
303
|
+
release(sessionIds) {
|
|
304
|
+
let gone = false;
|
|
305
|
+
for (const { sessionId } of wantedOf(sessionIds) || []) gone = pending.delete(sessionId) || gone;
|
|
306
|
+
if (gone && !held) changed();
|
|
307
|
+
},
|
|
308
|
+
async rebuild(read, { sessions = null } = {}) {
|
|
309
|
+
const mine = generation;
|
|
310
|
+
const partial = Array.isArray(sessions);
|
|
311
|
+
let want = wantedOf(sessions);
|
|
312
|
+
if (partial) {
|
|
313
|
+
if (!want.length) return { gaveUp: [] };
|
|
314
|
+
for (const { sessionId, kinds } of want) expect(sessionId, kinds);
|
|
315
|
+
}
|
|
316
|
+
const gaveUp = new Map(); // session → kinds given up on
|
|
317
|
+
for (let attempt = 1; ; attempt += 1) {
|
|
318
|
+
replay = [];
|
|
319
|
+
let snapshot = null;
|
|
320
|
+
try { snapshot = await read(want, { attempt, partial }); } catch { snapshot = null; }
|
|
321
|
+
if (mine !== generation) return null;
|
|
322
|
+
const events = replay || [];
|
|
323
|
+
replay = null;
|
|
324
|
+
const last = attempt >= attempts;
|
|
325
|
+
const lists = Array.isArray(snapshot?.lists) ? snapshot.lists : null;
|
|
326
|
+
if (!lists && !want) {
|
|
327
|
+
// Nothing came back, and nothing says which sessions were read.
|
|
328
|
+
if (!last) {
|
|
329
|
+
await sleep(delayAfter(attempt));
|
|
330
|
+
if (mine !== generation) return null;
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
for (const [id, entry] of open) if (entry.stale) open.delete(id);
|
|
334
|
+
held = false;
|
|
335
|
+
changed();
|
|
336
|
+
return { gaveUp: [], unread: true };
|
|
337
|
+
}
|
|
338
|
+
const results = [];
|
|
339
|
+
for (const list of lists || []) {
|
|
340
|
+
const sessionId = String(list?.sessionId || '');
|
|
341
|
+
if (!sessionId || !ASK_KINDS.includes(list?.kind)) continue;
|
|
342
|
+
results.push({
|
|
343
|
+
sessionId,
|
|
344
|
+
kind: list.kind,
|
|
345
|
+
state: LIST_STATES.has(list.state) ? list.state : 'failed',
|
|
346
|
+
requests: Array.isArray(list.requests) ? list.requests : [],
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
for (const { sessionId, kinds } of want || []) {
|
|
350
|
+
for (const kind of kinds) {
|
|
351
|
+
if (results.some((list) => list.sessionId === sessionId && list.kind === kind)) continue;
|
|
352
|
+
// Not in the answer: nothing came back (failed), or no panel is bound to it any more (not asked).
|
|
353
|
+
if (lists) settle(sessionId, kind);
|
|
354
|
+
else results.push({ sessionId, kind, state: 'failed', requests: [] });
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
const next = new Map(open);
|
|
358
|
+
for (const list of results) {
|
|
359
|
+
if (list.state !== 'ok' && list.state !== 'unresolved') continue;
|
|
360
|
+
const listed = new Map();
|
|
361
|
+
for (const req of list.requests) {
|
|
362
|
+
const id = askIdOf(req);
|
|
363
|
+
const owner = requestOwner(req);
|
|
364
|
+
if (id && owner) listed.set(id, owner);
|
|
365
|
+
}
|
|
366
|
+
// What the list does not hold is no longer open, for its session and the sub-agents known below it.
|
|
367
|
+
for (const [id, entry] of next) {
|
|
368
|
+
if (entry.kind === list.kind && under(entry.owner, list.sessionId) && !listed.has(id)) next.delete(id);
|
|
369
|
+
}
|
|
370
|
+
for (const [id, owner] of listed) next.set(id, { owner, kind: list.kind, stale: false });
|
|
371
|
+
}
|
|
372
|
+
const again = new Map(); // session → kinds to read again
|
|
373
|
+
for (const list of results) {
|
|
374
|
+
if (list.state === 'ok') { settle(list.sessionId, list.kind); continue; }
|
|
375
|
+
if (list.state === 'unsupported' || last) {
|
|
376
|
+
settle(list.sessionId, list.kind);
|
|
377
|
+
if (!gaveUp.has(list.sessionId)) gaveUp.set(list.sessionId, new Set());
|
|
378
|
+
gaveUp.get(list.sessionId).add(list.kind);
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
expect(list.sessionId, [list.kind]);
|
|
382
|
+
if (!again.has(list.sessionId)) again.set(list.sessionId, new Set());
|
|
383
|
+
again.get(list.sessionId).add(list.kind);
|
|
384
|
+
}
|
|
385
|
+
for (const [eventType, ev] of events) applyAskEvent(next, eventType, ev);
|
|
386
|
+
// Known from before the outage and confirmed by no list that is still to come: it goes.
|
|
387
|
+
for (const [id, entry] of next) if (entry.stale && !awaited(entry)) next.delete(id);
|
|
388
|
+
open = next;
|
|
389
|
+
if (!partial) held = false;
|
|
390
|
+
changed();
|
|
391
|
+
if (!again.size) {
|
|
392
|
+
return { gaveUp: [...gaveUp].map(([sessionId, kinds]) => ({ sessionId, kinds: ASK_KINDS.filter((kind) => kinds.has(kind)) })) };
|
|
393
|
+
}
|
|
394
|
+
await sleep(delayAfter(attempt));
|
|
395
|
+
if (mine !== generation) return null;
|
|
396
|
+
want = [...again].map(([sessionId, kinds]) => ({ sessionId, kinds: ASK_KINDS.filter((kind) => kinds.has(kind)) }));
|
|
397
|
+
}
|
|
398
|
+
},
|
|
399
|
+
clear() {
|
|
400
|
+
if (!open.size) return;
|
|
401
|
+
open.clear();
|
|
402
|
+
changed();
|
|
403
|
+
},
|
|
404
|
+
subscribe(fn) {
|
|
405
|
+
listeners.add(fn);
|
|
406
|
+
return () => listeners.delete(fn);
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* The sentence a panel shows when the open requests of its session could not
|
|
413
|
+
* be read (the tracker gave up on `kinds`): its turn's clock counts again.
|
|
414
|
+
*/
|
|
415
|
+
export function unreadAsksNotice(kinds = ASK_KINDS) {
|
|
416
|
+
const set = new Set(Array.isArray(kinds) && kinds.length ? kinds : ASK_KINDS);
|
|
417
|
+
const what = set.has('permission') && set.has('question') ? 'permissions and questions'
|
|
418
|
+
: set.has('permission') ? 'permissions' : 'questions';
|
|
419
|
+
return `Could not read this session's open ${what} from OpenCode: its 30-minute turn limit runs as if none were waiting.`;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* What waits on the user in the sessions panels are bound to, read from the
|
|
424
|
+
* server: for each `{ sessionId, cwd, kinds }` (both kinds unless it says), the
|
|
425
|
+
* open permissions (`api.permissionList`) and questions (`api.questionList`) of
|
|
426
|
+
* the serve that runs that session, with its sub-agents' (they run on the same
|
|
427
|
+
* serve). Each list comes back with its `state`: ok; failed; unsupported (the
|
|
428
|
+
* server has no such request type); or unresolved: read, but it holds a request
|
|
429
|
+
* of a session whose place under this one could not be established.
|
|
430
|
+
* A request of a session that is neither one of these nor known below one has
|
|
431
|
+
* its place read (`ancestry(owner, sessionId)`: true, false, or null when that
|
|
432
|
+
* could not be read; it remembers what it learns), so that a sub-agent spawned
|
|
433
|
+
* while nobody watched holds its parent's clock too: at most `maxLookups`
|
|
434
|
+
* lookups within `lookupMs`, each given only the time that is left (a lookup
|
|
435
|
+
* still waiting on the server then counts as not read). `isDescendant`, a
|
|
436
|
+
* yes / no answer, is accepted in its place.
|
|
437
|
+
* Resolves `{ lists, requests, complete }`: `complete` when every list is ok.
|
|
438
|
+
*/
|
|
439
|
+
export async function readOpenAsks(api, sessions, {
|
|
440
|
+
ancestry = null, isDescendant = null, known = () => false,
|
|
441
|
+
maxLookups = 20, lookupMs = 5000, now = Date.now, setTimer = setTimeout, clearTimer = clearTimeout,
|
|
442
|
+
} = {}) {
|
|
443
|
+
const listOf = (res) => {
|
|
444
|
+
const data = res?.data;
|
|
445
|
+
if (Array.isArray(data)) return data;
|
|
446
|
+
if (Array.isArray(data?.questions)) return data.questions;
|
|
447
|
+
if (Array.isArray(data?.data)) return data.data;
|
|
448
|
+
return null;
|
|
449
|
+
};
|
|
450
|
+
const failed = (res) => !res || res.ok === false || res.error != null || (typeof res.status === 'number' && res.status >= 400);
|
|
451
|
+
const readList = async (call) => {
|
|
452
|
+
let res;
|
|
453
|
+
try { res = await call(); } catch { res = null; }
|
|
454
|
+
if (res?.unsupported) return { state: 'unsupported', requests: [] };
|
|
455
|
+
const list = failed(res) ? null : listOf(res);
|
|
456
|
+
if (!list) return { state: 'failed', requests: [] };
|
|
457
|
+
return { state: 'ok', requests: list.filter((req) => askIdOf(req) && requestOwner(req)) };
|
|
458
|
+
};
|
|
459
|
+
const lists = [];
|
|
460
|
+
for (const { sessionId, cwd, kinds } of Array.isArray(sessions) ? sessions : []) {
|
|
461
|
+
if (!sessionId) continue;
|
|
462
|
+
const root = String(sessionId);
|
|
463
|
+
const wanted = ASK_KINDS.filter((kind) => !Array.isArray(kinds) || kinds.includes(kind));
|
|
464
|
+
const read = await Promise.all(wanted.map((kind) => readList(() => (kind === 'permission'
|
|
465
|
+
? api.permissionList({ sessionId, cwd })
|
|
466
|
+
: api.questionList({ sessionId, cwd })))));
|
|
467
|
+
wanted.forEach((kind, i) => lists.push({ sessionId: root, kind, ...read[i] }));
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Sub-agents spawned while nobody watched: their place under a session that was read, a few at most and for
|
|
471
|
+
// a few seconds at most (the clocks stay held meanwhile).
|
|
472
|
+
const lookup = typeof ancestry === 'function' ? ancestry
|
|
473
|
+
: typeof isDescendant === 'function' ? async (owner, root) => (await isDescendant(owner, root)) === true
|
|
474
|
+
: null;
|
|
475
|
+
const roots = [...new Set(lists.map((list) => list.sessionId))];
|
|
476
|
+
const until = now() + lookupMs;
|
|
477
|
+
let lookups = 0;
|
|
478
|
+
const place = async (owner, root) => {
|
|
479
|
+
if (!lookup) return false;
|
|
480
|
+
const left = until - now();
|
|
481
|
+
if (lookups >= maxLookups || left <= 0) return null;
|
|
482
|
+
lookups += 1;
|
|
483
|
+
let timer = null;
|
|
484
|
+
const late = new Promise((done) => { timer = setTimer(() => done(null), left); });
|
|
485
|
+
try {
|
|
486
|
+
const answer = await Promise.race([Promise.resolve().then(() => lookup(owner, root)).catch(() => null), late]);
|
|
487
|
+
return answer === true ? true : answer === false ? false : null;
|
|
488
|
+
} finally {
|
|
489
|
+
clearTimer(timer);
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
const unplaced = new Map(); // owner → the sessions whose lists hold a request of it
|
|
493
|
+
for (const list of lists) {
|
|
494
|
+
if (list.state !== 'ok') continue;
|
|
495
|
+
for (const req of list.requests) {
|
|
496
|
+
const owner = requestOwner(req);
|
|
497
|
+
if (roots.includes(owner) || roots.some((root) => known(owner, root))) continue;
|
|
498
|
+
if (!unplaced.has(owner)) unplaced.set(owner, new Set());
|
|
499
|
+
unplaced.get(owner).add(list.sessionId);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
for (const [owner, under] of unplaced) {
|
|
503
|
+
const unknown = [];
|
|
504
|
+
let placed = false;
|
|
505
|
+
for (const root of under) {
|
|
506
|
+
const answer = await place(owner, root);
|
|
507
|
+
if (answer === true) { placed = true; break; }
|
|
508
|
+
if (answer === null) unknown.push(root);
|
|
509
|
+
}
|
|
510
|
+
if (placed) continue;
|
|
511
|
+
for (const list of lists) {
|
|
512
|
+
if (list.state === 'ok' && unknown.includes(list.sessionId) && list.requests.some((req) => requestOwner(req) === owner)) list.state = 'unresolved';
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
const requests = new Map();
|
|
516
|
+
for (const list of lists) for (const req of list.requests) requests.set(askIdOf(req), req);
|
|
517
|
+
return { lists, requests: [...requests.values()], complete: lists.every((list) => list.state === 'ok') };
|
|
518
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
// instance for back-compat with shared bindings.
|
|
7
7
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
8
8
|
|
|
9
|
-
import { api, supports, capabilities, onEvent } from './ocp-v2-ws.js';
|
|
9
|
+
import { api, supports, capabilities, onEvent, sessionWaitsOnUser, onAsksChanged } from './ocp-v2-ws.js';
|
|
10
10
|
import { getDefaultStore, agentForMode } from './ocp-v2-state.js';
|
|
11
11
|
import { mountModelPicker } from './ocp-v2-modelpicker.js';
|
|
12
12
|
import { mountVariantPicker } from './ocp-v2-variantpicker.js';
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
} from './ocp-v2-plan.js';
|
|
31
31
|
import {
|
|
32
32
|
trackOptimisticMessage, beginTurn, currentTurn, endTurn, settleFailedSend, TRANSCRIPT_SAFETY_POLL_MS,
|
|
33
|
+
createTurnClock, TURN_LIMIT_MS,
|
|
33
34
|
} from './ocp-v2-send-logic.js';
|
|
34
35
|
import { hydrateTranscript } from './ocp-v2-rehydrate.js';
|
|
35
36
|
import { captureBinding, trackBinding, isBindingToken, searchOnBinding } from './ocp-v2-binding.js';
|
|
@@ -1005,7 +1006,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1005
1006
|
if (s.running) { store.pushError({ message: 'Wait for the current turn to finish before compacting.' }); return; }
|
|
1006
1007
|
const at = captureBinding(store);
|
|
1007
1008
|
const res = await api.compact({
|
|
1008
|
-
sessionId: at.sessionId, cwd: at.cwd || undefined,
|
|
1009
|
+
sessionId: at.sessionId, cwd: at.cwd || undefined, tools: at.tools || undefined,
|
|
1009
1010
|
});
|
|
1010
1011
|
// A failure of the session the panel has left is not this one's banner.
|
|
1011
1012
|
if (at.isCurrent() && (res?.error || res?.ok === false)) store.pushError({ message: res?.error || 'Compact failed' });
|
|
@@ -1091,7 +1092,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1091
1092
|
variant: turn.variant || undefined,
|
|
1092
1093
|
parts: parts.length ? parts : undefined,
|
|
1093
1094
|
cwd: turn.cwd || undefined,
|
|
1094
|
-
|
|
1095
|
+
tools: turn.tools || undefined,
|
|
1095
1096
|
}), outcome);
|
|
1096
1097
|
}
|
|
1097
1098
|
|
|
@@ -1129,7 +1130,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1129
1130
|
agent: turn.agent || undefined,
|
|
1130
1131
|
model: turn.model || undefined,
|
|
1131
1132
|
cwd: turn.cwd || undefined,
|
|
1132
|
-
|
|
1133
|
+
tools: turn.tools || undefined,
|
|
1133
1134
|
}));
|
|
1134
1135
|
}
|
|
1135
1136
|
|
|
@@ -1466,7 +1467,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1466
1467
|
mode,
|
|
1467
1468
|
variant: turn.variant || undefined,
|
|
1468
1469
|
cwd: options.cwd || turn.cwd || undefined,
|
|
1469
|
-
|
|
1470
|
+
tools: turn.tools || undefined,
|
|
1470
1471
|
// A person's own message (the greeting engine keeps when they were last here), and the
|
|
1471
1472
|
// greeting this session opened with, told to the model once.
|
|
1472
1473
|
human: true,
|
|
@@ -1512,7 +1513,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1512
1513
|
async function waitForAsyncTurn({ stopPolling, drainOnce, isPlanTurn, planTurn, turn, run }) {
|
|
1513
1514
|
let done = false;
|
|
1514
1515
|
let cleanup = null;
|
|
1515
|
-
let
|
|
1516
|
+
let clock = null;
|
|
1516
1517
|
|
|
1517
1518
|
await new Promise((resolve) => {
|
|
1518
1519
|
// The composer was unmounted: nobody waits for the end of this turn any
|
|
@@ -1521,7 +1522,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1521
1522
|
if (done) return;
|
|
1522
1523
|
done = true;
|
|
1523
1524
|
_turnWatches.delete(abandon);
|
|
1524
|
-
|
|
1525
|
+
clock?.cancel();
|
|
1525
1526
|
stopPolling();
|
|
1526
1527
|
if (unsubInner) unsubInner();
|
|
1527
1528
|
resolve();
|
|
@@ -1530,7 +1531,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1530
1531
|
if (done) return;
|
|
1531
1532
|
done = true;
|
|
1532
1533
|
_turnWatches.delete(abandon);
|
|
1533
|
-
|
|
1534
|
+
clock?.cancel();
|
|
1534
1535
|
stopPolling();
|
|
1535
1536
|
if (unsubInner) unsubInner();
|
|
1536
1537
|
await drainOnce(true);
|
|
@@ -1544,11 +1545,17 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
|
|
|
1544
1545
|
const unsubInner = store.subscribe((event, state) => {
|
|
1545
1546
|
if ((event?.type === 'running:set' && !state.running) || !turn.isCurrent()) cleanup();
|
|
1546
1547
|
});
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1548
|
+
// Working time only: the clock stops while the session waits on the user (a permission, a question).
|
|
1549
|
+
clock = createTurnClock({
|
|
1550
|
+
ms: TURN_LIMIT_MS,
|
|
1551
|
+
paused: () => sessionWaitsOnUser(turn.sessionId),
|
|
1552
|
+
subscribe: onAsksChanged,
|
|
1553
|
+
onExpire: () => {
|
|
1554
|
+
if (run.isCurrent()) store.pushError({ message: 'OpenCode turn timed out waiting for session.idle.' });
|
|
1555
|
+
endTurn(store, run);
|
|
1556
|
+
cleanup();
|
|
1557
|
+
},
|
|
1558
|
+
});
|
|
1552
1559
|
_turnWatches.add(abandon);
|
|
1553
1560
|
if (!store.getState().running) cleanup();
|
|
1554
1561
|
});
|
|
@@ -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
|
/**
|