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
|
@@ -4,20 +4,18 @@
|
|
|
4
4
|
// input tokens before a line of code, and every request would show up as a
|
|
5
5
|
// session in the OpenCode panel. So completions get a serve of their own:
|
|
6
6
|
//
|
|
7
|
-
// - its own XDG_CONFIG_HOME (DATA_HOME/data/editor-complete/) whose
|
|
8
|
-
// holds what makes the user's models reachable (their
|
|
9
|
-
// the provider allow / deny
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
7
|
+
// - its own XDG_CONFIG_HOME (DATA_HOME/data/editor-complete/) whose
|
|
8
|
+
// opencode.json holds what makes the user's models reachable (their
|
|
9
|
+
// provider blocks and the provider allow / deny rules, as the user wrote
|
|
10
|
+
// them) and one agent, `synabun-complete`: the completion instruction as
|
|
11
|
+
// its system prompt, every tool denied. No MCP servers, no instruction
|
|
12
|
+
// files, no plugins. A provider block that names a file by a path relative
|
|
13
|
+
// to the user's configuration ({file:./key}) is written with that path
|
|
14
|
+
// made whole: here it would be looked for in this folder;
|
|
14
15
|
// - OPENCODE_DISABLE_CLAUDE_CODE and OPENCODE_DISABLE_PROJECT_CONFIG, so no
|
|
15
16
|
// CLAUDE.md, AGENTS.md or opencode.json of a folder above is read either;
|
|
16
17
|
// - the user's own data home, so stored provider credentials keep working.
|
|
17
18
|
//
|
|
18
|
-
// Measured on OpenCode 1.18.34 (2026-10-12): about 200 input tokens of overhead
|
|
19
|
-
// per request against 5,500 with the tools left on, and 810 with an AGENTS.md
|
|
20
|
-
// one folder up and project configuration left on.
|
|
21
19
|
//
|
|
22
20
|
// Started on the first request, stopped after ten idle minutes and at server
|
|
23
21
|
// shutdown. One request is one session in an empty working folder: create,
|
|
@@ -26,13 +24,21 @@
|
|
|
26
24
|
// that folder are deleted: every request that arrives meanwhile waits for the
|
|
27
25
|
// same start, so no request's own session is ever taken for a leftover. A start
|
|
28
26
|
// that fails after its process was spawned (the serve never answers, its client
|
|
29
|
-
// cannot be built, a stop is asked for meanwhile) stops that process
|
|
30
|
-
//
|
|
27
|
+
// cannot be built, a stop is asked for meanwhile) stops that process (SIGTERM,
|
|
28
|
+
// then SIGKILL when it does not end) and fails for everybody who waited for it;
|
|
29
|
+
// stop() ends a start that is under way too. Another server that took the port
|
|
30
|
+
// (trackServe says 'foreign') is left running while the start tries another.
|
|
31
31
|
// There is no fallback to the shared serve. Everything that touches a process,
|
|
32
32
|
// a port or the network is injected: tests run against a fake.
|
|
33
33
|
|
|
34
34
|
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
35
35
|
import { isAbsolute, join, resolve, sep } from 'node:path';
|
|
36
|
+
import { checkOpencodeServer, newServePassword, servePasswordReader } from './opencode-protocol.js';
|
|
37
|
+
import { OPENCODE_CONFIG_FILE, OPENCODE_CONFIG_SCHEMA } from './opencode-config.js';
|
|
38
|
+
|
|
39
|
+
// The serve gets a password of its own, is healthy only when OpenCode 2's /api
|
|
40
|
+
// answers JSON (lib/opencode-protocol.js), and is spoken to through
|
|
41
|
+
// lib/opencode2-client.js; its configuration is OpenCode 2's opencode.json.
|
|
36
42
|
|
|
37
43
|
export const COMPLETION_AGENT = 'synabun-complete';
|
|
38
44
|
/** Every session of this serve carries this title: no title is generated, and leftovers of a crash are recognisable. */
|
|
@@ -41,9 +47,13 @@ export const IDLE_STOP_MS = 10 * 60_000;
|
|
|
41
47
|
export const START_TIMEOUT_MS = 15_000;
|
|
42
48
|
/** How long a start waits for the sessions a crash left behind to be listed and deleted. */
|
|
43
49
|
export const SWEEP_TIMEOUT_MS = 5000;
|
|
50
|
+
/** How many ports a start tries when another server takes the one it was given. */
|
|
51
|
+
export const START_ATTEMPTS = 3;
|
|
44
52
|
|
|
45
|
-
// What of the user's OpenCode configuration decides which models can be reached
|
|
46
|
-
|
|
53
|
+
// What of the user's OpenCode configuration decides which models can be reached: the provider blocks and the
|
|
54
|
+
// provider allow / deny rules, in either shape the user wrote them (OpenCode 2 reads both).
|
|
55
|
+
const PROVIDER_KEYS = ['providers', 'provider'];
|
|
56
|
+
const CARRIED_LISTS = ['policies', 'disabled_providers', 'enabled_providers'];
|
|
47
57
|
// Reasoning settings a model may offer, the lightest first: a completion wants the least.
|
|
48
58
|
const LIGHT_VARIANTS = ['none', 'minimal', 'low'];
|
|
49
59
|
|
|
@@ -76,18 +86,21 @@ function rebaseFileReferences(value, dir, seen) {
|
|
|
76
86
|
}
|
|
77
87
|
|
|
78
88
|
/**
|
|
79
|
-
* The configuration of the dedicated serve.
|
|
80
|
-
* @param {object | null} userConfig the user's own OpenCode configuration (
|
|
89
|
+
* The configuration of the dedicated serve (its opencode.json).
|
|
90
|
+
* @param {object | null} userConfig the user's own OpenCode configuration (opencode.json, then opencode.jsonc over it)
|
|
81
91
|
* @param {{ system: string, configDir?: string | null, log?: (tag: string, message: string) => void }} o `system`:
|
|
82
92
|
* the completion instruction, the agent's whole prompt; `configDir`: the folder the user's configuration is in,
|
|
83
93
|
* which a relative {file:…} reference of a provider is resolved against. Without it, a provider that holds such
|
|
84
94
|
* a reference is left out (and logged): from the serve's own folder it would name another file, or none.
|
|
85
95
|
*/
|
|
86
96
|
export function buildCompletionServeConfig(userConfig, { system, configDir = null, log = () => {} }) {
|
|
87
|
-
const config = { $schema:
|
|
88
|
-
for (const key of
|
|
97
|
+
const config = { $schema: OPENCODE_CONFIG_SCHEMA, update: 'disable', share: 'disabled', snapshots: false };
|
|
98
|
+
for (const key of CARRIED_LISTS) {
|
|
99
|
+
const value = isObject(userConfig) ? userConfig[key] : undefined;
|
|
100
|
+
if (Array.isArray(value)) config[key] = structuredClone(value);
|
|
101
|
+
}
|
|
102
|
+
for (const key of PROVIDER_KEYS) {
|
|
89
103
|
const value = isObject(userConfig) ? userConfig[key] : undefined;
|
|
90
|
-
if (key !== 'provider') { if (Array.isArray(value)) config[key] = structuredClone(value); continue; }
|
|
91
104
|
if (!isObject(value)) continue;
|
|
92
105
|
const providers = {};
|
|
93
106
|
for (const [id, definition] of Object.entries(value)) {
|
|
@@ -99,15 +112,15 @@ export function buildCompletionServeConfig(userConfig, { system, configDir = nul
|
|
|
99
112
|
}
|
|
100
113
|
providers[id] = carried;
|
|
101
114
|
}
|
|
102
|
-
if (Object.keys(providers).length || !Object.keys(value).length) config
|
|
115
|
+
if (Object.keys(providers).length || !Object.keys(value).length) config[key] = providers;
|
|
103
116
|
}
|
|
104
|
-
config.
|
|
117
|
+
config.agents = {
|
|
105
118
|
[COMPLETION_AGENT]: {
|
|
106
119
|
description: 'SynaBun code editor autocomplete',
|
|
107
120
|
mode: 'primary',
|
|
108
|
-
|
|
109
|
-
temperature: 0.1,
|
|
110
|
-
|
|
121
|
+
system,
|
|
122
|
+
request: { body: { temperature: 0.1 } },
|
|
123
|
+
permissions: [{ action: '*', resource: '*', effect: 'deny' }],
|
|
111
124
|
},
|
|
112
125
|
};
|
|
113
126
|
return config;
|
|
@@ -117,7 +130,7 @@ export function buildCompletionServeConfig(userConfig, { system, configDir = nul
|
|
|
117
130
|
* The environment of the dedicated serve: the server's own, pointed at the lean configuration and told to read
|
|
118
131
|
* nothing else.
|
|
119
132
|
* @param {object} base the environment to start from (process.env)
|
|
120
|
-
* @param {{ configHome: string }} o the XDG_CONFIG_HOME that holds opencode/
|
|
133
|
+
* @param {{ configHome: string }} o the XDG_CONFIG_HOME that holds opencode/opencode.json
|
|
121
134
|
*/
|
|
122
135
|
export function completionServeEnvironment(base, { configHome }) {
|
|
123
136
|
const env = { ...base };
|
|
@@ -149,7 +162,7 @@ export function splitModelId(id) {
|
|
|
149
162
|
return { providerID: text.slice(0, slash), modelID: text.slice(slash + 1) };
|
|
150
163
|
}
|
|
151
164
|
|
|
152
|
-
/** Each connected model's variant names, from the serve's
|
|
165
|
+
/** Each connected model's variant names, from the serve's provider list: Map("provider/model" → string[]). */
|
|
153
166
|
export function variantsByModel(providers) {
|
|
154
167
|
const out = new Map();
|
|
155
168
|
const body = isObject(providers?.data) && (providers.data.all || providers.data.connected) ? providers.data : providers;
|
|
@@ -165,7 +178,7 @@ export function variantsByModel(providers) {
|
|
|
165
178
|
}
|
|
166
179
|
|
|
167
180
|
/**
|
|
168
|
-
* The text and the token counts of a prompt's answer (`
|
|
181
|
+
* The text and the token counts of a prompt's answer (the client's `session.prompt`).
|
|
169
182
|
* @returns {{ text: string, tokens: { input: number, output: number }, error: string | null }} `input` counts the
|
|
170
183
|
* tokens read from and written to the provider's cache too; `output` counts reasoning
|
|
171
184
|
*/
|
|
@@ -191,16 +204,31 @@ function abortError() {
|
|
|
191
204
|
|
|
192
205
|
/**
|
|
193
206
|
* @param {object} deps
|
|
194
|
-
* @param {string} deps.dataDir DATA_HOME/data/editor-complete: holds opencode/
|
|
207
|
+
* @param {string} deps.dataDir DATA_HOME/data/editor-complete: holds opencode/opencode.json and the empty work folder
|
|
195
208
|
* @param {string} deps.system the completion instruction (the agent's prompt)
|
|
196
209
|
* @param {() => object | null} deps.readUserConfig the user's OpenCode configuration, read at each start
|
|
197
210
|
* @param {() => string | null} [deps.userConfigDir] the folder that configuration is in (relative {file:…}
|
|
198
211
|
* references of its providers are resolved against it)
|
|
199
|
-
* @param {() => number | null} deps.allocPort a free port (server.js
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
*
|
|
212
|
+
* @param {() => number | null | Promise<number | null>} deps.allocPort a free port (server.js: what an earlier
|
|
213
|
+
* SynaBun left running goes first, then allocOpencodeIsoPort)
|
|
214
|
+
* @param {(o: { port: number, env: object, cwd: string, password: string }) => object}
|
|
215
|
+
* deps.spawnServe starts `opencode serve` on the port with that password and returns its process
|
|
216
|
+
* (`on('exit')`, `kill()`)
|
|
217
|
+
* @param {(proc: object, signal?: string) => void} [deps.killServe] stops that process: SIGTERM, or SIGKILL for a
|
|
218
|
+
* failed start's process that did not end (default: proc.kill(signal))
|
|
219
|
+
* @param {(o: { port: number, password?: string | null, version?: string }) => object}
|
|
220
|
+
* deps.createClient lib/opencode-v2-client.js createClientInstance
|
|
221
|
+
* @param {() => Promise<{ major?: number | null, supported?: boolean, reason?: string } | null>}
|
|
222
|
+
* [deps.detectOpencode] which OpenCode the serve will be (server.js detectOpencode): one SynaBun does not drive
|
|
223
|
+
* never starts
|
|
224
|
+
* @param {(run: () => Promise<any>) => Promise<any>} [deps.startOneAtATime] runs a start
|
|
225
|
+
* in its turn among every serve SynaBun starts (server.js oneOpencodeStartAtATime); by itself when not given
|
|
226
|
+
* @param {number} [deps.exitWaitMs] how long a failed start waits for its process to exit after SIGTERM, and again
|
|
227
|
+
* after SIGKILL, before its turn ends
|
|
228
|
+
* @param {(o: { port: number, proc: object }) => any} [deps.trackServe] told once something answers on the port
|
|
229
|
+
* (server.js keeps the serve on record from its spawn, so that a crash of SynaBun does not leave it running for
|
|
230
|
+
* good); 'foreign' (or a promise of it): what answers is not this start's process but another server that took
|
|
231
|
+
* the port, which is left running while the start ends its own process and tries another port
|
|
204
232
|
* @param {typeof fetch} [deps.fetchImpl]
|
|
205
233
|
* @param {object} [deps.env] the environment the serve starts from
|
|
206
234
|
* @param {number} [deps.idleMs] the serve is stopped after this long without a request
|
|
@@ -210,9 +238,12 @@ function abortError() {
|
|
|
210
238
|
*/
|
|
211
239
|
export function createOpencodeCompletionEngine({
|
|
212
240
|
dataDir, system, readUserConfig = () => null, userConfigDir = () => null, allocPort, spawnServe,
|
|
213
|
-
killServe = (proc) => { try { proc.kill(
|
|
241
|
+
killServe = (proc, signal = 'SIGTERM') => { try { proc.kill(signal); } catch { /* gone */ } },
|
|
214
242
|
createClient, fetchImpl = (...args) => fetch(...args), env = process.env, now = Date.now,
|
|
215
243
|
idleMs = IDLE_STOP_MS, startTimeoutMs = START_TIMEOUT_MS, sweepTimeoutMs = SWEEP_TIMEOUT_MS, healthPollMs = 100, log = () => {},
|
|
244
|
+
detectOpencode = async () => null, newPassword = newServePassword,
|
|
245
|
+
passwordFrom = 'env', checkServer = checkOpencodeServer,
|
|
246
|
+
startOneAtATime = (run) => run(), exitWaitMs = 3000, trackServe = () => {},
|
|
216
247
|
} = {}) {
|
|
217
248
|
if (!dataDir || !system) throw new Error('createOpencodeCompletionEngine requires dataDir and system');
|
|
218
249
|
if (typeof allocPort !== 'function' || typeof spawnServe !== 'function' || typeof createClient !== 'function') {
|
|
@@ -229,7 +260,6 @@ export function createOpencodeCompletionEngine({
|
|
|
229
260
|
const deleting = new Set(); // session deletions on their way: a stop waits for them (drain)
|
|
230
261
|
|
|
231
262
|
const sleep = (ms) => new Promise((done) => setTimeout(done, ms));
|
|
232
|
-
const serveUrl = (port, path) => `http://127.0.0.1:${port}${path}${path.includes('?') ? '&' : '?'}directory=${encodeURIComponent(workDir)}`;
|
|
233
263
|
|
|
234
264
|
function touch() {
|
|
235
265
|
lastUsed = now();
|
|
@@ -266,7 +296,7 @@ export function createOpencodeCompletionEngine({
|
|
|
266
296
|
|
|
267
297
|
async function start() {
|
|
268
298
|
const mine = epoch;
|
|
269
|
-
|
|
299
|
+
let port = await allocPort();
|
|
270
300
|
if (port == null) throw new Error('No free port for the completion server');
|
|
271
301
|
mkdirSync(join(dataDir, 'opencode'), { recursive: true });
|
|
272
302
|
mkdirSync(workDir, { recursive: true });
|
|
@@ -274,41 +304,106 @@ export function createOpencodeCompletionEngine({
|
|
|
274
304
|
try { userConfig = readUserConfig(); } catch (error) { log('editor-complete:serve', `could not read the OpenCode configuration: ${error?.message || error}`); }
|
|
275
305
|
let configDir = null;
|
|
276
306
|
try { configDir = userConfigDir() || null; } catch { configDir = null; }
|
|
277
|
-
writeFileSync(join(dataDir, 'opencode',
|
|
307
|
+
writeFileSync(join(dataDir, 'opencode', OPENCODE_CONFIG_FILE), `${JSON.stringify(buildCompletionServeConfig(userConfig, { system, configDir, log }), null, 2)}\n`, 'utf8');
|
|
308
|
+
|
|
309
|
+
// An OpenCode SynaBun does not drive (OpenCode 1, an OpenCode 2 older than the minimum) never starts; a version
|
|
310
|
+
// not known here (a command line in Settings) is told by what answers.
|
|
311
|
+
const detected = await detectOpencode();
|
|
312
|
+
if (detected && typeof detected === 'object' && detected.supported === false && detected.major != null) {
|
|
313
|
+
throw new Error(detected.reason || `OpenCode ${detected.major} is not supported`);
|
|
314
|
+
}
|
|
315
|
+
if (mine !== epoch) throw new Error('The completion server was stopped while it was starting');
|
|
316
|
+
const password = passwordFrom === 'stdout' ? null : newPassword();
|
|
317
|
+
|
|
318
|
+
// Another server that takes the port while the serve boots is a start collision: it is left running, this start's
|
|
319
|
+
// own process is ended, and the start tries another port (START_ATTEMPTS ports at most).
|
|
320
|
+
for (let attempt = 1; ; attempt++) {
|
|
321
|
+
try {
|
|
322
|
+
return await startOn(port, { mine, password });
|
|
323
|
+
} catch (error) {
|
|
324
|
+
if (!error?.portTaken || attempt >= START_ATTEMPTS || mine !== epoch) throw error;
|
|
325
|
+
log('editor-complete:serve', `another server answers on port ${port}: it is left running, and the completion server tries another port`);
|
|
326
|
+
port = await allocPort();
|
|
327
|
+
if (port == null) throw new Error('No free port for the completion server');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
278
331
|
|
|
279
|
-
|
|
332
|
+
// A start that failed holds its turn until its process has exited (OpenCode 2 cannot open its database while a
|
|
333
|
+
// serve that is going holds it). It was sent SIGTERM (end()); one still running after `exitWaitMs` is sent SIGKILL
|
|
334
|
+
// (killServe, through its handle: SynaBun's own child, never another pid) and waited for once more. One that
|
|
335
|
+
// outlives even that stays on record (server.js keeps a serve on record until its exit is seen). True once it exited.
|
|
336
|
+
async function waitForExit(serve) {
|
|
337
|
+
const exited = async () => {
|
|
338
|
+
for (let waited = 0; serve.proc && !serve.exited && waited < exitWaitMs; waited += 25) await sleep(25);
|
|
339
|
+
return !serve.proc || serve.exited;
|
|
340
|
+
};
|
|
341
|
+
if (await exited()) return true;
|
|
342
|
+
log('editor-complete:serve', `the completion server's process did not end within ${Math.round(exitWaitMs / 1000)} s of SIGTERM: SIGKILL`);
|
|
343
|
+
try { killServe(serve.proc, 'SIGKILL'); } catch { /* already gone */ }
|
|
344
|
+
if (await exited()) return true;
|
|
345
|
+
log('editor-complete:serve', 'the completion server\'s process still runs after SIGKILL: it stays on record');
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
async function startOn(port, { mine, password }) {
|
|
350
|
+
const started = { port, proc: null, client: null, variants: new Map(), providers: null, providersAt: 0, exited: false, killed: false, halt: null, password };
|
|
280
351
|
// What a stop wakes: a start that waits (for the serve to answer, for the next look) goes on at once.
|
|
281
352
|
const halted = new Promise((done) => { started.halt = done; });
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
353
|
+
// Both are checked before and after each wait: a stop may have been asked for, or the process may be gone.
|
|
354
|
+
const stillWanted = () => {
|
|
355
|
+
if (mine !== epoch) throw new Error('The completion server was stopped while it was starting');
|
|
356
|
+
if (started.exited) throw new Error('The completion server stopped while it was starting. Is OpenCode installed?');
|
|
357
|
+
};
|
|
358
|
+
// Whatever goes wrong once a process runs, before the serve is ready, it does not stay behind.
|
|
286
359
|
try {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
started.proc?.on?.('error', () => { started.exited = true; });
|
|
292
|
-
|
|
293
|
-
// Both are checked before and after each wait: a stop may have been asked for, or the process may be gone.
|
|
294
|
-
const stillWanted = () => {
|
|
295
|
-
if (mine !== epoch) throw new Error('The completion server was stopped while it was starting');
|
|
296
|
-
if (started.exited) throw new Error('The completion server stopped while it was starting. Is OpenCode installed?');
|
|
297
|
-
};
|
|
298
|
-
const deadline = now() + startTimeoutMs;
|
|
299
|
-
for (;;) {
|
|
360
|
+
// One start at a time with every other serve SynaBun starts (OpenCode 2 cannot open its database while
|
|
361
|
+
// another serve is opening it): from the spawn until this serve answers, or until a failed start's process
|
|
362
|
+
// is gone.
|
|
363
|
+
const check = await startOneAtATime(async () => {
|
|
300
364
|
stillWanted();
|
|
365
|
+
started.proc = spawnServe({ port, env: completionServeEnvironment(env, { configHome: dataDir }), cwd: workDir, password, passwordFrom });
|
|
366
|
+
if (passwordFrom === 'stdout') {
|
|
367
|
+
const readPassword = servePasswordReader();
|
|
368
|
+
started.proc?.stdout?.on('data', chunk => { started.password = readPassword(chunk); });
|
|
369
|
+
}
|
|
370
|
+
starts++;
|
|
371
|
+
spawned = started;
|
|
372
|
+
started.proc?.on?.('exit', () => {
|
|
373
|
+
started.exited = true;
|
|
374
|
+
if (entry === started) { entry = null; if (idleTimer) { clearTimeout(idleTimer); idleTimer = null; } }
|
|
375
|
+
});
|
|
376
|
+
started.proc?.on?.('error', () => { started.exited = true; });
|
|
301
377
|
try {
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
378
|
+
const deadline = now() + startTimeoutMs;
|
|
379
|
+
for (;;) {
|
|
380
|
+
stillWanted();
|
|
381
|
+
// OpenCode 2's API answering JSON, never a web page (lib/opencode-protocol.js).
|
|
382
|
+
const answer = passwordFrom === 'stdout' && !started.password ? null
|
|
383
|
+
: await Promise.race([checkServer({ port, password: started.password, fetchImpl, timeoutMs: 2000 }), halted]);
|
|
384
|
+
if (answer?.ok) {
|
|
385
|
+
// Only this start's own process counts: another server that took the port answers for itself.
|
|
386
|
+
let verdict = null;
|
|
387
|
+
try { verdict = await trackServe({ port, proc: started.proc }); } catch { /* the record is the caller's */ }
|
|
388
|
+
if (verdict === 'foreign') throw Object.assign(new Error(`Another server answers on port ${port}`), { portTaken: true });
|
|
389
|
+
return answer;
|
|
390
|
+
}
|
|
391
|
+
stillWanted();
|
|
392
|
+
if (now() >= deadline) {
|
|
393
|
+
const what = answer && answer.state && answer.state !== 'down' ? `: ${answer.error}` : '';
|
|
394
|
+
throw new Error(`The completion server did not answer within ${Math.round(startTimeoutMs / 1000)} seconds${what}`);
|
|
395
|
+
}
|
|
396
|
+
await Promise.race([sleep(healthPollMs), halted]);
|
|
397
|
+
}
|
|
398
|
+
} catch (error) {
|
|
399
|
+
end(started);
|
|
400
|
+
await waitForExit(started);
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
});
|
|
309
404
|
stillWanted();
|
|
310
405
|
|
|
311
|
-
started.client = createClient({ port });
|
|
406
|
+
started.client = createClient({ port, password: started.password, version: check.version || '' });
|
|
312
407
|
// It answers, and takes no request yet. First the sessions a crash left behind go: a sweep that ran beside the
|
|
313
408
|
// first requests would find their sessions in its listing and delete them under the model call. Meanwhile,
|
|
314
409
|
// which lighter reasoning setting each model offers; worth a short wait, as without it the first completions
|
|
@@ -335,9 +430,11 @@ export function createOpencodeCompletionEngine({
|
|
|
335
430
|
|
|
336
431
|
async function loadProviders(serve, { signal } = {}) {
|
|
337
432
|
if (serve.providers && now() - serve.providersAt < 60_000) return serve.providers;
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
433
|
+
if (signal?.aborted) throw abortError();
|
|
434
|
+
// The client answers with the provider list SynaBun reads ({ all, default, connected }).
|
|
435
|
+
const listed = await serve.client.getClient().provider.list({ directory: workDir });
|
|
436
|
+
if (listed?.error) throw new Error(`The completion server answered ${listed.response?.status || 'an error'} for its model list`);
|
|
437
|
+
serve.providers = listed.data;
|
|
341
438
|
serve.providersAt = now();
|
|
342
439
|
serve.variants = variantsByModel(serve.providers);
|
|
343
440
|
return serve.providers;
|
|
@@ -420,7 +517,7 @@ export function createOpencodeCompletionEngine({
|
|
|
420
517
|
return {
|
|
421
518
|
complete,
|
|
422
519
|
/**
|
|
423
|
-
* The serve's
|
|
520
|
+
* The serve's provider list (every known provider, and which are connected), or null while the serve is
|
|
424
521
|
* not running and `start` is not set.
|
|
425
522
|
*/
|
|
426
523
|
async providers({ start: startIt = false, signal } = {}) {
|
|
@@ -111,7 +111,10 @@ export function buildExecInvocation({
|
|
|
111
111
|
if (model) args.push('--model', String(model));
|
|
112
112
|
break;
|
|
113
113
|
case 'opencode':
|
|
114
|
-
|
|
114
|
+
// A private server for this run (`--standalone`; without it the CLI uses
|
|
115
|
+
// the machine's background service, which has none of the loop's
|
|
116
|
+
// configuration) and `--auto` (approve what is not denied).
|
|
117
|
+
args.push('run', '--standalone', '--auto');
|
|
115
118
|
if (model) args.push('--model', String(model));
|
|
116
119
|
args.push('--format', 'default');
|
|
117
120
|
break;
|
|
@@ -407,7 +407,10 @@ export function isOwnerOrigin(origin, { port, machineName = thisMachine.names, o
|
|
|
407
407
|
* proxy's (`publicOrigins`, left out of the listed names), never a listed name
|
|
408
408
|
* on another port, whatever Sec-Fetch-Site says or leaves out: BAD_ORIGIN.
|
|
409
409
|
* `localAddresses` gives this computer's addresses (thisMachineAddresses when
|
|
410
|
-
* it is left out). A request without Origin still passes
|
|
410
|
+
* it is left out). A request without Origin still passes, unless `requireOrigin`
|
|
411
|
+
* is set: then a write must carry one (every browser sends it on a write; a
|
|
412
|
+
* local process that fetched a page for its cookie and sends none is refused,
|
|
413
|
+
* ORIGIN_REQUIRED). First users: the Skills Studio's owner-only writes.
|
|
411
414
|
*
|
|
412
415
|
* `allowedOrigins` (an array or a function) are the tunnel's and the invite
|
|
413
416
|
* proxy's public URLs: their host names count as ours, as for a WebSocket.
|
|
@@ -418,7 +421,7 @@ export function isOwnerOrigin(origin, { port, machineName = thisMachine.names, o
|
|
|
418
421
|
*/
|
|
419
422
|
export function ownerRouteGuard({
|
|
420
423
|
isGuestRequest = null, port, allowedOrigins = [], machineName, refuseCrossSite = false,
|
|
421
|
-
ownOriginsOnly = false, publicOrigins = [], localAddresses = thisMachineAddresses,
|
|
424
|
+
ownOriginsOnly = false, publicOrigins = [], localAddresses = thisMachineAddresses, requireOrigin = false,
|
|
422
425
|
} = {}) {
|
|
423
426
|
// The names the owner listed for this computer: the listed ones, without the tunnel's and the invite proxy's.
|
|
424
427
|
const ownNames = () => { const theirs = listedNames(publicOrigins); return listedNames(allowedOrigins).filter((name) => !theirs.includes(name)); };
|
|
@@ -426,6 +429,9 @@ export function ownerRouteGuard({
|
|
|
426
429
|
|| isOwnerOrigin(req.headers.origin, { port, machineName, ownNames, addresses: localAddresses });
|
|
427
430
|
function refusal(req) {
|
|
428
431
|
if (!isAllowedHost(req?.headers?.host, { allowedHosts: allowedOrigins, machineName })) return { status: 403, code: 'BAD_HOST', error: 'Unexpected Host header.' };
|
|
432
|
+
if (requireOrigin && !SAFE_METHODS.has(req.method) && typeof req?.headers?.origin !== 'string') {
|
|
433
|
+
return { status: 403, code: 'ORIGIN_REQUIRED', error: 'This change is made from SynaBun\'s own page, which sends its Origin.' };
|
|
434
|
+
}
|
|
429
435
|
if (!SAFE_METHODS.has(req.method) && !(ownOriginsOnly ? ownerOrigin(req) : isAllowedWebSocketOrigin(req, { port, allowedOrigins, machineName }))) {
|
|
430
436
|
return { status: 403, code: 'BAD_ORIGIN', error: 'Unexpected Origin header.' };
|
|
431
437
|
}
|
|
@@ -14,6 +14,7 @@ import { execFile as nodeExecFile } from 'node:child_process';
|
|
|
14
14
|
import { existsSync, readFileSync } from 'node:fs';
|
|
15
15
|
import path from 'node:path';
|
|
16
16
|
import { redactDeep, redactSecrets } from '../../lib/log-redact.js';
|
|
17
|
+
import { mcpDistBuilt } from '../../lib/mcp-dist.js';
|
|
17
18
|
|
|
18
19
|
const COMMAND_TIMEOUT_MS = 8000;
|
|
19
20
|
const OUTPUT_MAX = 2000;
|
|
@@ -111,6 +112,7 @@ export async function collectInstallDetails({
|
|
|
111
112
|
browserExecutable = null,
|
|
112
113
|
exists = existsSync,
|
|
113
114
|
readJson = readJsonFile,
|
|
115
|
+
readText = null,
|
|
114
116
|
version = runVersion,
|
|
115
117
|
} = {}) {
|
|
116
118
|
const windows = platform === 'win32';
|
|
@@ -135,7 +137,8 @@ export async function collectInstallDetails({
|
|
|
135
137
|
const packages = installed ? packagesInLock(installed) : installedFromLock(shrinkwrap, packageRoot, { exists });
|
|
136
138
|
return { name, folder, packages, dependencies: directDependencies(dir, { readJson, stopAt: packageRoot }) };
|
|
137
139
|
});
|
|
138
|
-
|
|
140
|
+
// Built: dist/index.js and every module it imports (lib/mcp-dist.js), not the entry file alone.
|
|
141
|
+
const mcpBuilt = exists(path.join(packageRoot, 'mcp-server', 'dist', 'index.js')) && mcpDistBuilt(packageRoot, { exists, ...(readText ? { readText } : {}) });
|
|
139
142
|
|
|
140
143
|
return redactDeep({
|
|
141
144
|
kind: packaged ? 'app' : 'source',
|