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
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
2
|
+
// Which OpenCode SynaBun talks to, and how to know it is really there.
|
|
3
|
+
//
|
|
4
|
+
// SynaBun drives OpenCode 2 and nothing else (OpenCode 1 support was removed
|
|
5
|
+
// on 2026-10-24). OpenCode 2 (`opencode --version` → "opencode v2.1.4") serves
|
|
6
|
+
// its API under /api/*, behind HTTP Basic auth (user `opencode`) with a
|
|
7
|
+
// password set per launch. Production serves generate it privately on stdout
|
|
8
|
+
// (serveSpecFor passwordFrom 'stdout'); an environment password would remain
|
|
9
|
+
// readable in the process and its shell's programs. The low-level 'env' mode
|
|
10
|
+
// remains for explicit callers/fixtures. Every other path is its web app, an HTML page with
|
|
11
|
+
// status 200. SynaBun reads the version of the binary it is about to start
|
|
12
|
+
// (the CLI resolver's cached `--version`, keyed by the file, so an upgrade in
|
|
13
|
+
// place is read again), refuses an OpenCode it does not drive with one
|
|
14
|
+
// sentence that says what was found and how to get OpenCode 2, and calls a
|
|
15
|
+
// serve healthy only when OpenCode 2's API answers JSON: an HTML page never
|
|
16
|
+
// passes.
|
|
17
|
+
//
|
|
18
|
+
// OPENCODE_MIN_VERSION is the oldest OpenCode 2 SynaBun's OpenCode layer was
|
|
19
|
+
// built and checked against (the recorded events of tests/fixtures/
|
|
20
|
+
// opencode2-events.json, the plugin hook of the route gate and the browser
|
|
21
|
+
// policy, the live smoke test). npm's `opencode-ai` package is still OpenCode
|
|
22
|
+
// 1; OpenCode 2 comes from its own installer (https://opencode.ai/v2/install),
|
|
23
|
+
// Homebrew (anomalyco/tap/opencode-v2) or WinGet (Anomaly.OpenCode).
|
|
24
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
25
|
+
|
|
26
|
+
import { randomBytes } from 'node:crypto';
|
|
27
|
+
import { request as httpRequest } from 'node:http';
|
|
28
|
+
|
|
29
|
+
export const OPENCODE_MIN_VERSION = '2.0.32';
|
|
30
|
+
export const OPENCODE_USERNAME = 'opencode';
|
|
31
|
+
|
|
32
|
+
/** "2.1.4", "opencode v2.1.4", "v1.19.3" → { major, minor, patch }; null when no version can be read. */
|
|
33
|
+
export function opencodeVersionOf(version) {
|
|
34
|
+
const match = String(version ?? '').match(/(\d+)\.(\d+)\.(\d+)/);
|
|
35
|
+
if (!match) return null;
|
|
36
|
+
const [major, minor, patch] = match.slice(1, 4).map(Number);
|
|
37
|
+
return [major, minor, patch].every(Number.isFinite) ? { major, minor, patch } : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const MINIMUM = opencodeVersionOf(OPENCODE_MIN_VERSION);
|
|
41
|
+
|
|
42
|
+
function olderThanMinimum(v) {
|
|
43
|
+
if (v.major !== MINIMUM.major) return v.major < MINIMUM.major;
|
|
44
|
+
if (v.minor !== MINIMUM.minor) return v.minor < MINIMUM.minor;
|
|
45
|
+
return v.patch < MINIMUM.patch;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The commands that install OpenCode 2 on a system, the first one first: OpenCode's own installer
|
|
50
|
+
* (https://opencode.ai/v2/install, the one `opencode upgrade` runs), its Homebrew tap, WinGet on Windows.
|
|
51
|
+
*/
|
|
52
|
+
export function opencodeInstallCommands(platform = process.platform) {
|
|
53
|
+
if (platform === 'win32') return ['winget install --id Anomaly.OpenCode --exact'];
|
|
54
|
+
if (platform === 'darwin') return ['brew install anomalyco/tap/opencode-v2', 'curl -fsSL https://opencode.ai/v2/install | bash'];
|
|
55
|
+
return ['curl -fsSL https://opencode.ai/v2/install | bash'];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** How to get OpenCode 2 on a system, as words of a sentence ("run: …, or: …"). */
|
|
59
|
+
export function opencodeInstallRoute(platform = process.platform) {
|
|
60
|
+
return opencodeInstallCommands(platform).map((command, index) => `${index ? 'or: ' : 'run: '}${command}`).join(', ');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Whether SynaBun drives the OpenCode of a version string: `{ supported,
|
|
65
|
+
* version, major, reason, code }`. `reason` is the one sentence a person reads
|
|
66
|
+
* when it does not: what was found (`path`, when known) and how to get OpenCode
|
|
67
|
+
* 2; `code` says which case it is ('unreadable' | 'opencode1' | 'newer' |
|
|
68
|
+
* 'outdated'), for a page that words it in its own language.
|
|
69
|
+
*/
|
|
70
|
+
export function opencodeSupportFor(version, { path = null, platform = process.platform } = {}) {
|
|
71
|
+
const text = version ? String(version).trim() : '';
|
|
72
|
+
const parsed = opencodeVersionOf(text);
|
|
73
|
+
const where = path ? ` (${path})` : '';
|
|
74
|
+
// What every refusal but an outdated OpenCode 2's ends with: how to get OpenCode 2, or where to pick one.
|
|
75
|
+
const getOpencode2 = `install OpenCode 2 (${opencodeInstallRoute(platform)}), or choose an OpenCode 2 under Settings → Executable paths`;
|
|
76
|
+
if (!parsed) {
|
|
77
|
+
const found = text ? `SynaBun cannot read the OpenCode version "${text}"${where}` : `SynaBun could not read the version of the OpenCode it found${where}`;
|
|
78
|
+
return { supported: false, version: text || null, major: null, code: 'unreadable', reason: `${found}, and it needs OpenCode 2 (${OPENCODE_MIN_VERSION} or newer): ${getOpencode2}.` };
|
|
79
|
+
}
|
|
80
|
+
const { major } = parsed;
|
|
81
|
+
// The version as OpenCode prints it, without its name ("opencode v2.1.4" → "2.1.4", a prerelease kept whole).
|
|
82
|
+
const shown = text.replace(/^opencode\s+/i, '').replace(/^v(?=\d)/i, '') || `${parsed.major}.${parsed.minor}.${parsed.patch}`;
|
|
83
|
+
if (major <= 1) {
|
|
84
|
+
return { supported: false, version: text, major, code: 'opencode1', reason: `SynaBun works with OpenCode 2 only, and the OpenCode it found${where} is version ${shown}: install OpenCode 2 (${opencodeInstallRoute(platform)}; npm's opencode-ai package is still OpenCode 1), or choose an OpenCode 2 under Settings → Executable paths.` };
|
|
85
|
+
}
|
|
86
|
+
if (major >= 3) {
|
|
87
|
+
return { supported: false, version: text, major, code: 'newer', reason: `OpenCode ${shown}${where} is newer than SynaBun supports: SynaBun works with OpenCode 2 only, so ${getOpencode2}.` };
|
|
88
|
+
}
|
|
89
|
+
if (olderThanMinimum(parsed)) {
|
|
90
|
+
return { supported: false, version: text, major, code: 'outdated', reason: `SynaBun needs OpenCode ${OPENCODE_MIN_VERSION} or newer, and the OpenCode it found${where} is version ${shown}: update it (run: opencode upgrade).` };
|
|
91
|
+
}
|
|
92
|
+
return { supported: true, version: text, major, code: null, reason: null };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** A fresh password for one serve launch. */
|
|
96
|
+
export function newServePassword() {
|
|
97
|
+
return randomBytes(24).toString('base64url');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** The Authorization header for a serve. */
|
|
101
|
+
export function basicAuthHeader(password, username = OPENCODE_USERNAME) {
|
|
102
|
+
return `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** The environment variables OpenCode 2 takes its serve password from (OPENCODE_PASSWORD first). */
|
|
106
|
+
export const SERVE_PASSWORD_ENV = Object.freeze(['OPENCODE_PASSWORD', 'OPENCODE_SERVER_PASSWORD']);
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The arguments and environment of `opencode serve` on `port`: its loopback
|
|
110
|
+
* host name and the launch's password. `passwordFrom`:
|
|
111
|
+
* 'env' (default) the password is OPENCODE_PASSWORD (any
|
|
112
|
+
* OPENCODE_SERVER_PASSWORD the environment carries is dropped, so
|
|
113
|
+
* the password SynaBun holds is the one the serve checks). OpenCode
|
|
114
|
+
* 2 keeps it in its own environment, so every program its shell
|
|
115
|
+
* starts inherits it, and a process of the same user can read it
|
|
116
|
+
* in the serve's start-up environment (ps eww).
|
|
117
|
+
* 'stdout' no password variable at all: OpenCode 2 makes one up and prints
|
|
118
|
+
* it once on its standard output ("server password <it>", after
|
|
119
|
+
* "server listening on …"), which SynaBun reads
|
|
120
|
+
* (servePasswordReader) and keeps out of its logs
|
|
121
|
+
* (redactServeOutput). The password is in no environment: not the
|
|
122
|
+
* serve's, not its shell's. `password` is null until it is read.
|
|
123
|
+
* A launch through a login shell removes both variables after the
|
|
124
|
+
* profile ran (`unset`, serveUnsetCommand), so a profile that
|
|
125
|
+
* exports one cannot put it back.
|
|
126
|
+
*/
|
|
127
|
+
export function serveSpecFor(port, { env = process.env, password = null, passwordFrom = 'env' } = {}) {
|
|
128
|
+
const args = ['serve', '--port', String(port), '--hostname', '127.0.0.1'];
|
|
129
|
+
const next = { ...env };
|
|
130
|
+
for (const key of SERVE_PASSWORD_ENV) delete next[key];
|
|
131
|
+
if (passwordFrom === 'stdout') return { args, env: next, password: null, passwordFrom: 'stdout' };
|
|
132
|
+
const pass = password || newServePassword();
|
|
133
|
+
next.OPENCODE_PASSWORD = pass;
|
|
134
|
+
return { args, env: next, password: pass, passwordFrom: 'env' };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** What a POSIX shell runs before `exec opencode serve` of a 'stdout' launch: the password variables gone. */
|
|
138
|
+
export function serveUnsetCommand() {
|
|
139
|
+
return `unset ${SERVE_PASSWORD_ENV.join(' ')}`;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const SERVE_PASSWORD_LINE = /(?:^|\n)server password (\S+)[ \t]*\r?\n/;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* A reader of a 'stdout' serve's output: feed it each chunk of standard output; it answers the password once its
|
|
146
|
+
* line is complete ("server password <it>" and a line end), else null. Chunks may split the line anywhere.
|
|
147
|
+
*/
|
|
148
|
+
export function servePasswordReader() {
|
|
149
|
+
let buffered = '';
|
|
150
|
+
let found = null;
|
|
151
|
+
return (chunk) => {
|
|
152
|
+
if (found) return found;
|
|
153
|
+
buffered = `${buffered}${String(chunk ?? '')}`.slice(-4096);
|
|
154
|
+
const m = SERVE_PASSWORD_LINE.exec(buffered);
|
|
155
|
+
if (m) found = m[1];
|
|
156
|
+
return found;
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** Serve output with its password line taken out (what a log may hold). */
|
|
161
|
+
export function redactServeOutput(text) {
|
|
162
|
+
return String(text ?? '').replace(/server password \S+/g, 'server password <hidden>');
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* A line-buffering redactor for either of a serve's output streams. redactServeOutput runs on whole lines only: a chunk of a
|
|
167
|
+
* stream may split the "server password <x>" line anywhere (the token across two reads), and redacting each chunk on
|
|
168
|
+
* its own would let a fragment of the password through to the log. Feed every chunk to `push`; it assembles complete
|
|
169
|
+
* lines, redacts each and hands it to `emit` (the trailing newline kept). Call `flush` once the stream ends to emit a
|
|
170
|
+
* last line that never got its newline. A partial line that grows past `maxLine` without a newline is redacted and
|
|
171
|
+
* emitted so the buffer cannot grow without bound (the password line is short and newline-terminated, so this cap is
|
|
172
|
+
* never reached mid-password).
|
|
173
|
+
*/
|
|
174
|
+
export function createServeLogRedactor(emit, { maxLine = 65536 } = {}) {
|
|
175
|
+
let buf = '';
|
|
176
|
+
const drain = (final) => {
|
|
177
|
+
let nl;
|
|
178
|
+
while ((nl = buf.indexOf('\n')) >= 0) {
|
|
179
|
+
const line = buf.slice(0, nl + 1);
|
|
180
|
+
buf = buf.slice(nl + 1);
|
|
181
|
+
emit(redactServeOutput(line));
|
|
182
|
+
}
|
|
183
|
+
if ((final || buf.length > maxLine) && buf) { emit(redactServeOutput(buf)); buf = ''; }
|
|
184
|
+
};
|
|
185
|
+
return {
|
|
186
|
+
push: (chunk) => { buf += String(chunk ?? ''); drain(false); },
|
|
187
|
+
flush: () => drain(true),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* A serve's environment with a run's own settings on top: a string value is set, null (or undefined) removes the
|
|
193
|
+
* variable, anything else is ignored. `GIT_*: null` clears every inherited git variable BEFORE the explicit
|
|
194
|
+
* settings are applied, so SynaBun's own git safety settings survive. The marker never reaches the child.
|
|
195
|
+
* A new object; `env` is not changed. Also used for evaluation runtimes, whose whole process tree needs this policy.
|
|
196
|
+
*/
|
|
197
|
+
export function withServeEnv(env, extra) {
|
|
198
|
+
const next = { ...(env || {}) };
|
|
199
|
+
if (extra && typeof extra === 'object') {
|
|
200
|
+
if (extra['GIT_*'] === null) for (const key of Object.keys(next)) if (key.startsWith('GIT_')) delete next[key];
|
|
201
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
202
|
+
if (key === 'GIT_*') continue;
|
|
203
|
+
if (typeof value === 'string') next[key] = value;
|
|
204
|
+
else if (value === null || value === undefined) delete next[key];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return next;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function isJsonResponse(res) {
|
|
211
|
+
return /\bapplication\/json\b/i.test(String(res?.headers?.get?.('content-type') || ''));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
async function readJson(res) {
|
|
215
|
+
if (!isJsonResponse(res)) return { json: null, html: /text\/html/i.test(String(res?.headers?.get?.('content-type') || '')) };
|
|
216
|
+
try { return { json: await res.json(), html: false }; } catch { return { json: null, html: false }; }
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Is OpenCode 2's API answering on `port`? Asks /api/info with `password`.
|
|
221
|
+
* Resolves `{ ok, version, state, error }`, where `state` is
|
|
222
|
+
* 'healthy' OpenCode 2's API answered JSON, from a version SynaBun drives
|
|
223
|
+
* 'unsupported' OpenCode's API answered, from a version SynaBun does not drive
|
|
224
|
+
* (`error` is opencodeSupportFor's sentence)
|
|
225
|
+
* 'locked' an OpenCode 2 serve whose password SynaBun does not hold
|
|
226
|
+
* 'html' a web page — never healthy
|
|
227
|
+
* 'down' nothing answered
|
|
228
|
+
* 'error' something answered, but not OpenCode 2's API
|
|
229
|
+
* Never throws.
|
|
230
|
+
*/
|
|
231
|
+
export async function checkOpencodeServer({ port, password = null, fetchImpl = globalThis.fetch, timeoutMs = 2000, host = '127.0.0.1' } = {}) {
|
|
232
|
+
let res;
|
|
233
|
+
try {
|
|
234
|
+
res = await fetchImpl(`http://${host}:${port}/api/info`, {
|
|
235
|
+
headers: { accept: 'application/json', ...(password ? { authorization: basicAuthHeader(password) } : {}) },
|
|
236
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
237
|
+
});
|
|
238
|
+
} catch (error) {
|
|
239
|
+
return { ok: false, version: null, state: 'down', error: String(error?.message || error) };
|
|
240
|
+
}
|
|
241
|
+
const { json, html } = await readJson(res);
|
|
242
|
+
if (res.ok && json && typeof json.version === 'string' && Array.isArray(json.urls)) {
|
|
243
|
+
const support = opencodeSupportFor(json.version);
|
|
244
|
+
if (!support.supported) return { ok: false, version: json.version, state: 'unsupported', error: support.reason };
|
|
245
|
+
return { ok: true, version: json.version, state: 'healthy', error: null };
|
|
246
|
+
}
|
|
247
|
+
if (res.status === 401 && json && /unauthori[sz]ed/i.test(String(json._tag || json.name || ''))) {
|
|
248
|
+
return { ok: false, version: null, state: 'locked', error: password ? 'the OpenCode serve refused SynaBun\'s password' : 'an OpenCode serve SynaBun did not start (it needs that serve\'s password)' };
|
|
249
|
+
}
|
|
250
|
+
return { ok: false, version: null, state: html ? 'html' : 'error', error: html ? 'answered with a web page, not the OpenCode 2 API' : `GET /api/info answered ${res.status}` };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// An upgrade must be rejected before PTY/resource lookup, even for an Origin
|
|
254
|
+
// that OpenCode permits. Never place a real credential in a URL or this probe.
|
|
255
|
+
export function probeUnauthenticatedUpgrade({ port, timeoutMs = 2000 } = {}) {
|
|
256
|
+
return new Promise(resolve => {
|
|
257
|
+
const req = httpRequest({ hostname: '127.0.0.1', port,
|
|
258
|
+
path: '/api/pty/synabun-auth-probe/connect',
|
|
259
|
+
headers: { connection: 'Upgrade', upgrade: 'websocket', 'sec-websocket-version': '13',
|
|
260
|
+
'sec-websocket-key': randomBytes(16).toString('base64'), origin: 'http://localhost:1' },
|
|
261
|
+
});
|
|
262
|
+
req.on('response', res => { res.resume(); resolve(res.statusCode); });
|
|
263
|
+
req.on('upgrade', (_res, socket) => { socket.destroy(); resolve(101); });
|
|
264
|
+
req.on('error', () => resolve(null));
|
|
265
|
+
req.setTimeout(timeoutMs, () => { req.destroy(); resolve(null); });
|
|
266
|
+
req.end();
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/** Readiness for private serves: valid client + denied anonymous HTTP AND WS.
|
|
271
|
+
* An unmanaged, passwordless API is never adopted. Errors contain no secrets.
|
|
272
|
+
*/
|
|
273
|
+
export async function checkPrivateOpencodeServer(options = {}) {
|
|
274
|
+
const check = await checkOpencodeServer(options);
|
|
275
|
+
if (!check.ok) return check;
|
|
276
|
+
const refused = () => ({ ok: false, version: check.version, state: 'unsecured',
|
|
277
|
+
error: 'OpenCode did not prove private HTTP and WebSocket authentication; it will not be used.' });
|
|
278
|
+
if (!options.password) return refused();
|
|
279
|
+
try {
|
|
280
|
+
const response = await (options.fetchImpl || globalThis.fetch)(`http://127.0.0.1:${options.port}/api/info`, {
|
|
281
|
+
headers: { accept: 'application/json' }, signal: AbortSignal.timeout(options.timeoutMs || 2000), redirect: 'error',
|
|
282
|
+
});
|
|
283
|
+
await response.body?.cancel();
|
|
284
|
+
if (response.status !== 401 || await probeUnauthenticatedUpgrade(options) !== 401) return refused();
|
|
285
|
+
} catch { return refused(); }
|
|
286
|
+
return check;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* The sentence a person reads when OpenCode cannot be used: what was found and
|
|
291
|
+
* what to do. `check` is a checkOpencodeServer answer, `detected` an
|
|
292
|
+
* opencodeSupportFor answer.
|
|
293
|
+
*/
|
|
294
|
+
export function opencodeProblemText({ check = null, detected = null, port = null } = {}) {
|
|
295
|
+
if (detected && !detected.supported) return detected.reason;
|
|
296
|
+
if (!check || check.ok) return '';
|
|
297
|
+
const where = port ? ` on port ${port}` : '';
|
|
298
|
+
switch (check.state) {
|
|
299
|
+
case 'unsupported':
|
|
300
|
+
return check.error || `The OpenCode server${where} is a version SynaBun does not drive.`;
|
|
301
|
+
case 'locked':
|
|
302
|
+
return `An OpenCode server SynaBun did not start is already running${where}, and SynaBun does not have its password. Stop that server (or free the port) and start OpenCode again from SynaBun.`;
|
|
303
|
+
case 'html':
|
|
304
|
+
return `Something${where} answers with a web page instead of the OpenCode 2 API (${check.error}).`;
|
|
305
|
+
case 'down':
|
|
306
|
+
return `OpenCode is not answering${where}.`;
|
|
307
|
+
default:
|
|
308
|
+
return `OpenCode${where} did not answer as OpenCode 2: ${check.error || 'unknown error'}.`;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — OpenCode provider views
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
// GET /api/opencode/providers/full answers with OpenCode's provider list,
|
|
5
|
+
// `{ all, default, connected }`. `all` is the whole models.dev catalog (on a
|
|
6
|
+
// typical install 231 providers and 9,069 models, about 7 MB of JSON) while a
|
|
7
|
+
// model picker only ever lists the providers that are connected (two or three).
|
|
8
|
+
// The compact view keeps those, with every field of their models a picker,
|
|
9
|
+
// the context gauge, the composer or the Assistant's catalog reads, and leaves
|
|
10
|
+
// out what none of them reads (credentials and request options included).
|
|
11
|
+
// Pure: no I/O, so the route, the catalog's in-process read and the tests share it.
|
|
12
|
+
|
|
13
|
+
const PROVIDER_FIELDS_LEFT_OUT = new Set(['env', 'options', 'key', 'npm', 'api']);
|
|
14
|
+
const MODEL_FIELDS_LEFT_OUT = new Set(['options', 'headers', 'provider']);
|
|
15
|
+
|
|
16
|
+
/** An answer of OpenCode's /provider: `{ all: [...] }` (an object; a web page or an error body is not one). */
|
|
17
|
+
export function isProviderCatalog(data) {
|
|
18
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) return false;
|
|
19
|
+
return Array.isArray(data.all) || (!!data.all && typeof data.all === 'object');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function providersOf(data) {
|
|
23
|
+
if (Array.isArray(data?.all)) return data.all;
|
|
24
|
+
return data?.all && typeof data.all === 'object' ? Object.values(data.all) : [];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function slimModel(model) {
|
|
28
|
+
if (!model || typeof model !== 'object') return model;
|
|
29
|
+
const out = {};
|
|
30
|
+
for (const [key, value] of Object.entries(model)) if (!MODEL_FIELDS_LEFT_OUT.has(key)) out[key] = value;
|
|
31
|
+
return out;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function slimProvider(provider) {
|
|
35
|
+
const out = {};
|
|
36
|
+
for (const [key, value] of Object.entries(provider || {})) {
|
|
37
|
+
if (PROVIDER_FIELDS_LEFT_OUT.has(key)) continue;
|
|
38
|
+
if (key === 'models') {
|
|
39
|
+
if (Array.isArray(value)) out.models = value.map(slimModel);
|
|
40
|
+
else if (value && typeof value === 'object') out.models = Object.fromEntries(Object.entries(value).map(([id, model]) => [id, slimModel(model)]));
|
|
41
|
+
else out.models = value;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
out[key] = value;
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The providers a picker lists: the connected ones (every provider when the
|
|
51
|
+
* answer names none), in OpenCode's order, `default` and `connected` as given.
|
|
52
|
+
*/
|
|
53
|
+
export function compactProviderCatalog(data) {
|
|
54
|
+
if (!isProviderCatalog(data)) return null;
|
|
55
|
+
const connected = Array.isArray(data.connected) ? data.connected.map((entry) => String(entry && typeof entry === 'object' ? (entry.id || entry.name || '') : entry || '')).filter(Boolean) : null;
|
|
56
|
+
const wanted = connected ? new Set(connected) : null;
|
|
57
|
+
const all = providersOf(data).filter((provider) => provider?.id && (!wanted || wanted.has(String(provider.id)))).map(slimProvider);
|
|
58
|
+
return {
|
|
59
|
+
all,
|
|
60
|
+
default: data.default && typeof data.default === 'object' ? { ...data.default } : {},
|
|
61
|
+
...(Array.isArray(data.connected) ? { connected: [...data.connected] } : {}),
|
|
62
|
+
// How many providers the whole catalog has (Settings → OpenCode says how many it hides).
|
|
63
|
+
total: providersOf(data).length,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** What makes two answers the same list for a picker: connected providers, their model ids, the defaults, the catalog's size. */
|
|
68
|
+
export function providerCatalogSignature(data) {
|
|
69
|
+
if (!isProviderCatalog(data)) return '';
|
|
70
|
+
const providers = providersOf(data);
|
|
71
|
+
const connected = Array.isArray(data.connected) ? data.connected.map(String) : null;
|
|
72
|
+
const listed = providers
|
|
73
|
+
.filter((provider) => provider?.id && (!connected || connected.includes(String(provider.id))))
|
|
74
|
+
.map((provider) => {
|
|
75
|
+
const models = Array.isArray(provider.models) ? provider.models.map((m) => m?.id || '') : Object.keys(provider.models || {});
|
|
76
|
+
return `${provider.id}:${models.join(',')}`;
|
|
77
|
+
});
|
|
78
|
+
let modelCount = 0;
|
|
79
|
+
for (const provider of providers) modelCount += Array.isArray(provider?.models) ? provider.models.length : Object.keys(provider?.models || {}).length;
|
|
80
|
+
return JSON.stringify([connected, listed, data.default || {}, providers.length, modelCount]);
|
|
81
|
+
}
|
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
import { dirname, resolve } from 'node:path';
|
|
2
2
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
3
|
+
import { mcpServersOf, normalizeMcpServers, parseJsonc, setMcpServer, withPlugin } from './opencode-config.js';
|
|
3
4
|
|
|
4
|
-
/** The browser-policy plugin (assistant-brains/
|
|
5
|
-
export const OPENCODE_BROWSER_POLICY_PLUGIN = pathToFileURL(resolve(dirname(fileURLToPath(import.meta.url)), 'assistant-brains', '
|
|
5
|
+
/** The browser-policy plugin (assistant-brains/opencode2-browser-policy/, a plugin folder) as a file URL a serve can load. */
|
|
6
|
+
export const OPENCODE_BROWSER_POLICY_PLUGIN = pathToFileURL(resolve(dirname(fileURLToPath(import.meta.url)), 'assistant-brains', 'opencode2-browser-policy')).href;
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* An Assistant task run's serve config gets SynaBun's browser policy as a
|
|
9
|
-
* plugin (`cwd`: the run's project, for the scripts it reads
|
|
10
|
-
*
|
|
10
|
+
* plugin (`cwd`: the run's project, for the scripts it reads; `roots`: the
|
|
11
|
+
* registered code projects its test runners may also run in, as the run
|
|
12
|
+
* starts), listed under `plugins`. The user's own plugins stay; an earlier
|
|
13
|
+
* entry of ours is replaced. Returns `config`.
|
|
11
14
|
*/
|
|
12
|
-
export function withOpenCodeBrowserPolicy(config, { cwd = null } = {}) {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
config.plugin = plugins;
|
|
16
|
-
return config;
|
|
15
|
+
export function withOpenCodeBrowserPolicy(config, { cwd = null, roots = [] } = {}) {
|
|
16
|
+
const list = (Array.isArray(roots) ? roots : []).filter((path) => typeof path === 'string' && path);
|
|
17
|
+
return withPlugin(config, OPENCODE_BROWSER_POLICY_PLUGIN, { ...(cwd ? { cwd: String(cwd) } : {}), ...(list.length ? { roots: list } : {}) });
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
|
-
* Build the SynaBun MCP entry used by managed OpenCode runtimes
|
|
21
|
+
* Build the SynaBun MCP entry used by managed OpenCode runtimes, in OpenCode
|
|
22
|
+
* 2's shape (`mcp.servers.SynaBun`: type local, the command as an array, its
|
|
23
|
+
* `environment`).
|
|
21
24
|
*
|
|
22
25
|
* Managed sidepanels/automations must always use a local MCP child. Reusing a
|
|
23
26
|
* user's remote entry would ignore process environment pins and collapse all
|
|
24
|
-
* sessions onto the shared HTTP server. Preserve harmless local options
|
|
25
|
-
* remove remote-only transport fields and
|
|
27
|
+
* sessions onto the shared HTTP server. Preserve harmless local options (its
|
|
28
|
+
* timeout, its working folder), but remove remote-only transport fields and a
|
|
29
|
+
* switch that turned it off, and canonicalize command/environment. SynaBun tools are always direct calls;
|
|
30
|
+
* OpenCode 2.1 otherwise hides them behind Code Mode (`execute`). Other servers keep their own settings.
|
|
26
31
|
*/
|
|
27
32
|
export function buildManagedOpenCodeSynabunEntry(existing, {
|
|
28
33
|
command,
|
|
@@ -38,7 +43,10 @@ export function buildManagedOpenCodeSynabunEntry(existing, {
|
|
|
38
43
|
environment: _environment,
|
|
39
44
|
env: _env,
|
|
40
45
|
command: _command,
|
|
46
|
+
args: _args,
|
|
41
47
|
type: _type,
|
|
48
|
+
enabled: _enabled,
|
|
49
|
+
disabled: _disabled,
|
|
42
50
|
...safeOptions
|
|
43
51
|
} = source;
|
|
44
52
|
const environment = {
|
|
@@ -50,9 +58,18 @@ export function buildManagedOpenCodeSynabunEntry(existing, {
|
|
|
50
58
|
return {
|
|
51
59
|
...safeOptions,
|
|
52
60
|
type: 'local',
|
|
53
|
-
|
|
54
|
-
|
|
61
|
+
codemode: false,
|
|
62
|
+
command: Array.isArray(command) ? [...command] : [command],
|
|
55
63
|
environment,
|
|
56
|
-
env: { ...environment },
|
|
57
64
|
};
|
|
58
65
|
}
|
|
66
|
+
|
|
67
|
+
/** Pin only SynaBun on the shared serve, preserving an inherited overlay and the owner's other servers. */
|
|
68
|
+
export function buildSharedOpenCodeConfigOverlay(config, content) {
|
|
69
|
+
const overlay = normalizeMcpServers(parseJsonc(content || '{}'));
|
|
70
|
+
const synabun = mcpServersOf(config).SynaBun;
|
|
71
|
+
const inherited = mcpServersOf(overlay).SynaBun;
|
|
72
|
+
if (!synabun && !inherited) return content;
|
|
73
|
+
setMcpServer(overlay, 'SynaBun', { ...synabun, ...inherited, codemode: false });
|
|
74
|
+
return JSON.stringify(overlay);
|
|
75
|
+
}
|