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,96 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — Skills Studio 2.0: snippets
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Pieces the editor inserts for you. A body snippet goes in at the caret, on lines of its own (never inside the
|
|
6
|
+
// frontmatter: a caret there inserts at the start of the body). A frontmatter snippet is keys, merged into the
|
|
7
|
+
// frontmatter through the same one-key patch as the form (ss-frontmatter.js patch): the keys already there, their
|
|
8
|
+
// comments and order stay. The words follow the runtimes as they are (SK-067, Q14): pre-approved tools run without
|
|
9
|
+
// asking and do not restrict other tools; a skill names its files by a path relative to its folder, or
|
|
10
|
+
// ${CLAUDE_SKILL_DIR} in Claude Code; nothing claims "five trigger phrases" make a skill fire. Names and
|
|
11
|
+
// descriptions are i18n keys (`skillsStudio.snippets.<id>`); the inserted text is the skill's own words, English.
|
|
12
|
+
// The user's own snippets (the presets of P0, ss-presets.js) are body snippets. No DOM and no imports.
|
|
13
|
+
|
|
14
|
+
/** @typedef {{ id: string, kind: 'body'|'frontmatter', types: string[], text?: string, patch?: object, group: string }} Snippet */
|
|
15
|
+
|
|
16
|
+
/** @type {Snippet[]} */
|
|
17
|
+
export const SNIPPETS = Object.freeze([
|
|
18
|
+
{ id: 'role', kind: 'body', group: 'structure', types: ['skill', 'agent'], text: '## Role\n\nYou are [who]. Your job is to [what], for [whom].\n' },
|
|
19
|
+
{ id: 'steps', kind: 'body', group: 'structure', types: ['skill', 'command', 'agent'], text: '## Steps\n\n1. Read what the user gave and check it is complete.\n2. Do the task.\n3. Check the result.\n4. Report what changed, briefly.\n' },
|
|
20
|
+
{ id: 'constraints', kind: 'body', group: 'structure', types: [], text: '## Rules\n\n- Never change files outside the project.\n- Ask before deleting anything.\n- Say what you are about to do before you do it.\n' },
|
|
21
|
+
{ id: 'output', kind: 'body', group: 'structure', types: [], text: '## Output\n\nAnswer with:\n\n1. A one-line summary.\n2. What you found, most important first.\n3. What to do next.\n' },
|
|
22
|
+
{ id: 'examples', kind: 'body', group: 'structure', types: ['skill', 'agent'], text: '## Examples\n\n<example>\nuser: "[a request this skill should handle]"\nassistant: "[what a good answer does]"\n</example>\n' },
|
|
23
|
+
{ id: 'context', kind: 'body', group: 'workflow', types: ['skill', 'command'], text: '## First, gather context\n\nBefore you change anything, read the files involved and look for how the project already does it.\n' },
|
|
24
|
+
{ id: 'errors', kind: 'body', group: 'workflow', types: ['skill', 'command'], text: '## When something fails\n\nSay what failed and why, suggest the next step, and do not repeat the same attempt unchanged.\n' },
|
|
25
|
+
{ id: 'input-check', kind: 'body', group: 'workflow', types: ['skill', 'command'], text: '## Input\n\nThe user\'s words are in $ARGUMENTS. If they are empty or unclear, ask before you start.\n' },
|
|
26
|
+
{ id: 'confirm', kind: 'body', group: 'workflow', types: ['skill', 'command'], text: '## Before anything destructive\n\nList exactly what will be changed or removed and wait for a clear yes.\n' },
|
|
27
|
+
{ id: 'scope', kind: 'body', group: 'workflow', types: ['skill', 'agent'], text: '## Scope\n\nThis covers: [what].\nIt does not cover: [what not]; say so and suggest the right tool.\n' },
|
|
28
|
+
{ id: 'references', kind: 'body', group: 'files', types: ['skill'], text: '## References\n\nRead these only when the task needs them:\n\n- [references/guide.md](references/guide.md): [what it holds]\n' },
|
|
29
|
+
{ id: 'variables', kind: 'body', group: 'files', types: ['skill', 'command'], text: '## Variables\n\n- $ARGUMENTS: what the user typed after the name.\n- ${CLAUDE_SKILL_DIR}: this skill\'s folder in Claude Code (elsewhere, use paths relative to this file).\n' },
|
|
30
|
+
{ id: 'dynamic', kind: 'body', group: 'files', types: ['skill', 'command'], text: '## Current state\n\n- Branch: !`git branch --show-current`\n' },
|
|
31
|
+
{ id: 'fm-tools-readonly', kind: 'frontmatter', group: 'frontmatter', types: ['skill'], patch: { 'allowed-tools': ['Read', 'Grep', 'Glob'] } },
|
|
32
|
+
{ id: 'fm-agent-tools', kind: 'frontmatter', group: 'frontmatter', types: ['agent'], patch: { tools: 'Read, Grep, Glob' } },
|
|
33
|
+
{ id: 'fm-manual', kind: 'frontmatter', group: 'frontmatter', types: ['skill'], patch: { 'disable-model-invocation': true } },
|
|
34
|
+
{ id: 'fm-hint', kind: 'frontmatter', group: 'frontmatter', types: ['skill', 'command'], patch: { 'argument-hint': '[target]' } },
|
|
35
|
+
{ id: 'fm-when', kind: 'frontmatter', group: 'frontmatter', types: ['skill'], patch: { when_to_use: 'Use when [the situation]. For example: "[a request]".' } },
|
|
36
|
+
{ id: 'fm-fork', kind: 'frontmatter', group: 'frontmatter', types: ['skill'], patch: { context: 'fork', agent: 'Explore' } },
|
|
37
|
+
{ id: 'fm-model', kind: 'frontmatter', group: 'frontmatter', types: ['agent'], patch: { model: 'sonnet' } },
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
export const SNIPPET_GROUPS = Object.freeze(['structure', 'workflow', 'files', 'frontmatter', 'custom']);
|
|
41
|
+
|
|
42
|
+
/** The snippets for a kind of artifact: the built-in ones that fit it, then the user's own. */
|
|
43
|
+
export function snippetsFor(type, custom = []) {
|
|
44
|
+
const builtIn = SNIPPETS.filter((s) => !s.types.length || s.types.includes(type));
|
|
45
|
+
// A preset comes from the synced UI state (or a file someone handed over): every field is taken as text.
|
|
46
|
+
const typesOf = (p) => (Array.isArray(p.types) ? p.types.filter((x) => typeof x === 'string') : []);
|
|
47
|
+
const own = (Array.isArray(custom) ? custom : []).filter((p) => p && typeof p.snippet === 'string' && p.id != null && (!typesOf(p).length || typesOf(p).includes(type)))
|
|
48
|
+
.map((p) => ({ id: `custom:${String(p.id)}`, kind: 'body', group: 'custom', types: typesOf(p), text: p.snippet, name: String(p.name ?? ''), description: typeof p.description === 'string' ? p.description : '', custom: true }));
|
|
49
|
+
// One snippet once: a preset that is a built-in's exact text is not listed twice.
|
|
50
|
+
const texts = new Set(builtIn.map((s) => s.text).filter(Boolean));
|
|
51
|
+
return [...builtIn, ...own.filter((s) => !texts.has(s.text))];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Where the body of a text starts (after its frontmatter), as an index. */
|
|
55
|
+
export function bodyStart(text) {
|
|
56
|
+
const s = String(text ?? '');
|
|
57
|
+
const bom = s.charCodeAt(0) === 0xFEFF ? 1 : 0;
|
|
58
|
+
const m = /^---[ \t]*\n[\s\S]*?\n---[ \t]*(?:\n|$)/.exec(s.slice(bom));
|
|
59
|
+
return m ? bom + m[0].length : bom;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Insert a snippet.
|
|
64
|
+
* @param {string} text the document ("\n" line breaks)
|
|
65
|
+
* @param {Snippet} snippet
|
|
66
|
+
* @param {{ caret?: number, fm?: { patch: (text: string, changes: object) => object } }} [o] `fm`: ss-frontmatter.js (frontmatter snippets)
|
|
67
|
+
* @returns {{ ok: true, text: string, caret: number, at: number } | { ok: false, reason: string }}
|
|
68
|
+
*/
|
|
69
|
+
export function applySnippet(text, snippet, { caret = null, fm = null } = {}) {
|
|
70
|
+
const s = String(text ?? '');
|
|
71
|
+
if (snippet?.kind === 'frontmatter') {
|
|
72
|
+
if (!fm || typeof fm.patch !== 'function') return { ok: false, reason: 'no-parser' };
|
|
73
|
+
const result = fm.patch(s, snippet.patch || {});
|
|
74
|
+
if (!result.ok) return { ok: false, reason: result.reason || 'invalid' };
|
|
75
|
+
return { ok: true, text: result.text, caret: Math.min(caret ?? 0, result.text.length), at: 0, changed: result.changed !== false };
|
|
76
|
+
}
|
|
77
|
+
const piece = String(snippet?.text ?? '');
|
|
78
|
+
if (!piece.trim()) return { ok: false, reason: 'empty' };
|
|
79
|
+
const start = bodyStart(s);
|
|
80
|
+
let at = Number.isInteger(caret) ? Math.max(0, Math.min(caret, s.length)) : s.length;
|
|
81
|
+
if (at < start) at = start; // never inside the frontmatter
|
|
82
|
+
const before = s.slice(0, at);
|
|
83
|
+
const after = s.slice(at);
|
|
84
|
+
const pad = before.length > start && !before.endsWith('\n\n') ? (before.endsWith('\n') ? '\n' : '\n\n') : '';
|
|
85
|
+
const body = piece.endsWith('\n') ? piece : `${piece}\n`;
|
|
86
|
+
const trail = after.length && !after.startsWith('\n') ? '\n' : '';
|
|
87
|
+
const next = before + pad + body + trail + after;
|
|
88
|
+
return { ok: true, text: next, caret: before.length + pad.length + body.length, at: before.length + pad.length, changed: true };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Whether a snippet matches a search, through the words the view shows for it. */
|
|
92
|
+
export function snippetMatches(snippet, query, words = (s) => `${s.name || ''} ${s.description || ''}`) {
|
|
93
|
+
const q = String(query ?? '').trim().toLowerCase();
|
|
94
|
+
if (!q) return true;
|
|
95
|
+
return `${snippet.id} ${words(snippet)} ${snippet.kind === 'frontmatter' ? Object.keys(snippet.patch || {}).join(' ') : ''}`.toLowerCase().includes(q);
|
|
96
|
+
}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — Skills Studio 2.0: what a Library row opens as
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// A row of the Library (sx-library.js) opens in one workspace, in one of four modes:
|
|
6
|
+
// library a skill in SynaBun's managed library: edits go to its draft (PATCH /v2/drafts), Versions lists its
|
|
7
|
+
// revisions, Publish installs one of them into the runtimes' folders (owner decision 2026-10-22:
|
|
8
|
+
// runtime folders are destinations, not edited in place);
|
|
9
|
+
// adopt a skill folder of the owner's that is not in the library yet: it opens as it is on disk, and the
|
|
10
|
+
// first save takes the folder into the library (POST /v2/skills { artifactId }) with the edit as its
|
|
11
|
+
// draft, so it reaches the folder again only through Publish;
|
|
12
|
+
// inplace an agent or a command (one file): the library holds skill folders only, so it is saved where it is,
|
|
13
|
+
// over the revision it was opened at (the P0 routes: PUT /api/skills-studio/artifact/:id);
|
|
14
|
+
// readonly what SynaBun does not write: a skill it ships, a plugin's, a Claude account's, a runtime's own
|
|
15
|
+
// (Codex system skills, managed settings), a folder no route can reach. A skill can be copied into the
|
|
16
|
+
// library ("Customize a copy").
|
|
17
|
+
// Also here: the P0 artifact id of an entry (when those routes can reach it), and the install targets a skill can
|
|
18
|
+
// be published to, read from the catalog's roots. No DOM; imports only ss-ids.js.
|
|
19
|
+
|
|
20
|
+
import { encodeArtifactId } from '../ss-ids.js';
|
|
21
|
+
|
|
22
|
+
const READ_ONLY_REASON = { synabun: 'bundled', plugin: 'plugin', account: 'account', system: 'system', shared: 'shared' };
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* The artifact id the P0 routes (/api/skills-studio/artifact/:id) take for an entry, encoded, or null when they
|
|
26
|
+
* cannot reach it: they read Claude Code's own folders only (~/.claude/skills|commands|agents of the default
|
|
27
|
+
* account, a registered project's .claude/…), and the bundled source.
|
|
28
|
+
*/
|
|
29
|
+
export function v1IdFor(entry) {
|
|
30
|
+
if (!entry || typeof entry.path !== 'string' || !entry.path) return null;
|
|
31
|
+
const kind = entry.kind;
|
|
32
|
+
if (!['skill', 'command', 'agent'].includes(kind)) return null;
|
|
33
|
+
const bundled = entry.sourceKind === 'bundled' || entry.family === 'synabun';
|
|
34
|
+
const claudeOwn = entry.family === 'claude' && entry.sourceKind === 'native'
|
|
35
|
+
&& (entry.scope === 'project' || (entry.scope === 'user' && (!entry.accountId || entry.accountId === 'default')));
|
|
36
|
+
if (!bundled && !claudeOwn) return null;
|
|
37
|
+
if (bundled && kind !== 'skill') return null;
|
|
38
|
+
return encodeArtifactId(`${kind}:${entry.path}`);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** The entry of a row the P0 routes reach, when one of its locations is such (an account's link, a project's own). */
|
|
42
|
+
function addressableEntry(row) {
|
|
43
|
+
for (const e of [row.primary, ...(row.entries || [])]) if (e && v1IdFor(e)) return e;
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* What a row opens as.
|
|
49
|
+
* @param {object} row a row of sx-library.js buildRows()
|
|
50
|
+
* @param {{ guest?: boolean, caps?: Set<string> }} [o] caps: the service's capabilities (GET /v2/capabilities)
|
|
51
|
+
* @returns {{ mode: 'library'|'adopt'|'inplace'|'readonly', editable: boolean, reason: string|null,
|
|
52
|
+
* canCustomize: boolean, canAdopt: boolean, canPublish: boolean, hasVersions: boolean, v1Id: string|null,
|
|
53
|
+
* artifactId: string|null, skillId: string|null, readsFiles: 'library'|'v1'|'catalog'|'head' }}
|
|
54
|
+
*/
|
|
55
|
+
export function subjectOf(row, { guest = false, caps = new Set() } = {}) {
|
|
56
|
+
const entry = row?.primary || null;
|
|
57
|
+
const skill = row?.skill || null;
|
|
58
|
+
const v1Entry = addressableEntry(row || {});
|
|
59
|
+
const v1Id = v1Entry ? v1IdFor(v1Entry) : null;
|
|
60
|
+
const catalogFiles = caps.has('catalog-file');
|
|
61
|
+
const out = {
|
|
62
|
+
mode: 'readonly', editable: false, reason: null, canCustomize: false, canAdopt: false, canPublish: false, hasVersions: false,
|
|
63
|
+
v1Id, artifactId: entry?.id || null, skillId: skill?.skillId || null,
|
|
64
|
+
readsFiles: v1Id ? 'v1' : catalogFiles ? 'catalog' : 'head',
|
|
65
|
+
};
|
|
66
|
+
if (!row) return out;
|
|
67
|
+
if (skill && row.source !== 'synabun') {
|
|
68
|
+
out.mode = 'library';
|
|
69
|
+
out.readsFiles = 'library';
|
|
70
|
+
out.hasVersions = true;
|
|
71
|
+
out.canPublish = !guest;
|
|
72
|
+
out.editable = !guest;
|
|
73
|
+
if (guest) out.reason = 'guest';
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
if (row.source === 'synabun') {
|
|
77
|
+
// What SynaBun ships: its library copy holds the versions (`upstream`); it is installed, never edited.
|
|
78
|
+
out.mode = 'readonly';
|
|
79
|
+
out.reason = 'bundled';
|
|
80
|
+
out.readsFiles = skill ? 'library' : out.readsFiles;
|
|
81
|
+
out.hasVersions = !!skill;
|
|
82
|
+
out.canPublish = !!skill && !guest;
|
|
83
|
+
out.canCustomize = !guest && row.kind === 'skill';
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
if (row.binary) {
|
|
87
|
+
out.reason = 'not-text';
|
|
88
|
+
out.canAdopt = false;
|
|
89
|
+
return out;
|
|
90
|
+
}
|
|
91
|
+
if (row.kind === 'skill') {
|
|
92
|
+
if (!row.readOnly && entry && (entry.scope === 'user' || entry.scope === 'project')) {
|
|
93
|
+
out.mode = 'adopt';
|
|
94
|
+
out.editable = !guest;
|
|
95
|
+
out.canAdopt = !guest;
|
|
96
|
+
out.reason = guest ? 'guest' : null;
|
|
97
|
+
return out;
|
|
98
|
+
}
|
|
99
|
+
out.reason = guest ? 'guest' : (READ_ONLY_REASON[row.source] || 'not-writable');
|
|
100
|
+
out.canCustomize = !guest && (out.readsFiles !== 'head');
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
// An agent or a command: saved where it is, through the routes that reach it.
|
|
104
|
+
if (!row.readOnly && v1Id) {
|
|
105
|
+
out.mode = 'inplace';
|
|
106
|
+
out.editable = !guest;
|
|
107
|
+
out.reason = guest ? 'guest' : null;
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
out.reason = guest ? 'guest' : (READ_ONLY_REASON[row.source] || (row.readOnly ? 'not-writable' : 'not-addressable'));
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// ── Install targets ──
|
|
115
|
+
|
|
116
|
+
/** The key an install plan gives a target (lib/skills/deploy.js normalizeTarget). */
|
|
117
|
+
export function targetKey(t) {
|
|
118
|
+
const scope = t?.scope === 'project' ? 'project' : 'user';
|
|
119
|
+
return scope === 'project' ? `${t.runtime}:project:${t.projectPath}` : `${t.runtime}:user:${t?.accountId || 'default'}`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** A target as a request names it: only the fields a target has. */
|
|
123
|
+
export function wholeTarget(t) {
|
|
124
|
+
const out = { runtime: t.runtime };
|
|
125
|
+
if (t.scope === 'project') { out.scope = 'project'; out.projectPath = t.projectPath; } else out.scope = 'user';
|
|
126
|
+
if (t.accountId && t.accountId !== 'default') out.accountId = t.accountId;
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** The keys of a list of targets, each once, sorted: a selection as it can be compared with another. */
|
|
131
|
+
export const selectionKeys = (targets) => [...new Set((Array.isArray(targets) ? targets : []).map(targetKey))].sort();
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Whether two asks of Publish are the same: one revision and exactly the same targets. A plan answers only what it
|
|
135
|
+
* was asked for: shown or installed for anything else (another version picked, a target ticked meanwhile), it would
|
|
136
|
+
* install what the owner no longer sees.
|
|
137
|
+
* @param {{ revisionId: string|null, targets: object[] }|null} a @param {{ revisionId: string|null, targets: object[] }|null} b
|
|
138
|
+
*/
|
|
139
|
+
export function sameAsk(a, b) {
|
|
140
|
+
if (!a || !b || !a.revisionId || a.revisionId !== b.revisionId) return false;
|
|
141
|
+
const x = selectionKeys(a.targets); const y = selectionKeys(b.targets);
|
|
142
|
+
return x.length > 0 && x.length === y.length && x.every((k, i) => k === y[i]);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const RUNTIME_OF_FAMILY = { claude: 'claude', codex: 'codex', opencode: 'opencode', shared: 'agents' };
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* The targets a skill can be installed into: each runtime's own skills folder for each account, the shared
|
|
149
|
+
* ~/.agents/skills (only while the owner turned it on), and the folders of the projects asked for.
|
|
150
|
+
* @param {object} o
|
|
151
|
+
* @param {object[]} [o.roots] the catalog's roots (GET /catalog `roots`)
|
|
152
|
+
* @param {{ sharedAgentsRoot?: boolean }} [o.config]
|
|
153
|
+
* @param {{ path: string, label: string }[]} [o.projects] projects to offer targets for
|
|
154
|
+
* @returns {{ key, target, runtime, scope, accountId, projectPath, projectLabel, path, status, policy, shared, runtimes }[]}
|
|
155
|
+
* `runtimes`: every runtime that reads that folder (OpenCode reads Claude Code's; Codex's project folder is shared)
|
|
156
|
+
*/
|
|
157
|
+
export function installTargets({ roots = [], config = {}, projects = [] } = {}) {
|
|
158
|
+
const out = [];
|
|
159
|
+
const seen = new Set();
|
|
160
|
+
const push = (t) => { if (seen.has(t.key)) return; seen.add(t.key); out.push(t); };
|
|
161
|
+
for (const root of Array.isArray(roots) ? roots : []) {
|
|
162
|
+
if (root?.kind !== 'skills' || !RUNTIME_OF_FAMILY[root.family]) continue;
|
|
163
|
+
if (root.sourceKind !== 'native' && root.sourceKind !== 'shared') continue;
|
|
164
|
+
const write = root.policy?.write;
|
|
165
|
+
if (write !== 'owner' && write !== 'owner-opt-in') continue;
|
|
166
|
+
const runtime = RUNTIME_OF_FAMILY[root.family];
|
|
167
|
+
if (root.scope === 'project') continue; // projects come from `projects`, one row per runtime
|
|
168
|
+
const accountId = root.accountId || 'default';
|
|
169
|
+
const target = { runtime, scope: 'user', ...(accountId !== 'default' ? { accountId } : {}) };
|
|
170
|
+
const readers = Array.isArray(root.runtimes) && root.runtimes.length ? root.runtimes.filter((r) => typeof r === 'string') : [runtime === 'agents' ? 'codex' : runtime, ...(runtime === 'agents' ? ['opencode'] : [])];
|
|
171
|
+
push({ key: targetKey(target), target, runtime, scope: 'user', accountId, projectPath: null, projectLabel: null, path: root.path, status: root.status, policy: root.policy || null, shared: runtime === 'agents', off: runtime === 'agents' && !config.sharedAgentsRoot, runtimes: readers });
|
|
172
|
+
}
|
|
173
|
+
for (const p of Array.isArray(projects) ? projects : []) {
|
|
174
|
+
if (!p?.path) continue;
|
|
175
|
+
for (const runtime of ['claude', 'codex', 'opencode']) {
|
|
176
|
+
const target = { runtime, scope: 'project', projectPath: p.path };
|
|
177
|
+
const sub = runtime === 'claude' ? '.claude/skills' : runtime === 'codex' ? '.agents/skills' : '.opencode/skills';
|
|
178
|
+
// Who reads a project's folders (lib/skills/roots.js): .claude/skills and .agents/skills are read by OpenCode too.
|
|
179
|
+
const readers = runtime === 'opencode' ? ['opencode'] : [runtime, 'opencode'];
|
|
180
|
+
push({ key: targetKey(target), target, runtime, scope: 'project', accountId: 'default', projectPath: p.path, projectLabel: p.label || p.path, path: `${p.path.replace(/[\\/]+$/, '')}/${sub}`, status: null, policy: null, shared: false, off: false, runtimes: readers });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const order = { claude: 0, codex: 1, opencode: 2, agents: 3 };
|
|
184
|
+
return out.sort((a, b) => (a.scope === b.scope ? 0 : a.scope === 'user' ? -1 : 1) || (a.projectLabel || '').localeCompare(b.projectLabel || '') || (order[a.runtime] - order[b.runtime]) || a.accountId.localeCompare(b.accountId));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* What a target has of a skill now: an installation of the library (current or older than the revision shown), a
|
|
189
|
+
* folder of its name SynaBun did not install, an old bridge, or nothing.
|
|
190
|
+
* @param {object} t a target of installTargets()
|
|
191
|
+
* @param {object} o
|
|
192
|
+
* @param {object|null} o.skill the library skill (GET /skills summary)
|
|
193
|
+
* @param {object|null} o.row its Library row
|
|
194
|
+
* @param {string|null} [o.revisionId] the revision the Publish tab shows
|
|
195
|
+
*/
|
|
196
|
+
export function targetState(t, { skill = null, row = null, revisionId = null } = {}) {
|
|
197
|
+
const install = (skill?.installations || []).find((i) => i.runtime === t.runtime && (i.scope || 'user') === t.scope
|
|
198
|
+
&& (t.scope === 'project' ? i.projectPath === t.projectPath : (i.accountId || 'default') === t.accountId));
|
|
199
|
+
if (install) {
|
|
200
|
+
const current = revisionId ? install.sourceRevisionId === revisionId : !install.updateAvailable;
|
|
201
|
+
return { state: current ? 'installed' : 'outdated', installation: install, path: install.destination };
|
|
202
|
+
}
|
|
203
|
+
const name = row?.folderName || skill?.name || '';
|
|
204
|
+
const inFolder = (row?.entries || []).find((e) => e.kind === 'skill' && e.path && t.path && e.path.startsWith(`${t.path.replace(/[\\/]+$/, '')}/`) && e.path.slice(t.path.replace(/[\\/]+$/, '').length + 1) === name);
|
|
205
|
+
if (inFolder) return { state: 'present', installation: null, path: inFolder.path };
|
|
206
|
+
const bridge = (row?.bridges || []).find((b) => b.runtime === t.runtime && t.scope === 'user');
|
|
207
|
+
if (bridge) return { state: 'bridge', installation: null, path: bridge.entry?.path || null };
|
|
208
|
+
return { state: 'none', installation: null, path: null };
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Targets checked to start with: where the skill is already, else the owner's assistants (Settings → Skills → My
|
|
213
|
+
* assistants; detected from what is installed and used when none were chosen), each in its own user folder for the
|
|
214
|
+
* default account: never everything. A folder another assistant reads too is counted for it: OpenCode reads Claude
|
|
215
|
+
* Code's skills folder, so with both among the assistants only Claude Code's is ticked (no second copy unless asked;
|
|
216
|
+
* `seenThrough` says which). Without any list: Claude Code.
|
|
217
|
+
* @param {object[]} targets installTargets()
|
|
218
|
+
* @param {{ skill?: object|null, row?: object|null, assistants?: string[]|null }} [o]
|
|
219
|
+
*/
|
|
220
|
+
export function defaultTargets(targets, { skill = null, row = null, assistants = null } = {}) {
|
|
221
|
+
const there = targets.filter((t) => !t.off && ['installed', 'outdated', 'present'].includes(targetState(t, { skill, row }).state));
|
|
222
|
+
if (there.length) return new Set(there.map((t) => t.key));
|
|
223
|
+
const own = (runtime) => targets.find((t) => t.runtime === runtime && t.scope === 'user' && t.accountId === 'default' && !t.off) || null;
|
|
224
|
+
const wanted = Array.isArray(assistants) && assistants.length ? assistants.filter((r) => ['claude', 'codex', 'opencode'].includes(r)) : ['claude'];
|
|
225
|
+
// Every assistant gets its own folder: a terminal OpenCode reads Claude Code's folder, but SynaBun's own OpenCode
|
|
226
|
+
// serves (the panel, an Assistant brain) start with OPENCODE_DISABLE_CLAUDE_CODE=1 and never see it (checked with
|
|
227
|
+
// opencode 2.1.4), so an OpenCode among the assistants is ticked for a real copy.
|
|
228
|
+
const picked = ['claude', 'codex', 'opencode'].filter((runtime) => wanted.includes(runtime)).map(own).filter(Boolean);
|
|
229
|
+
if (!picked.length) { const claude = own('claude'); return new Set(claude ? [claude.key] : []); }
|
|
230
|
+
return new Set(picked.map((t) => t.key));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The runtime whose ticked (or installed) folder a terminal copy of this runtime reads too, in this scope: 'claude'
|
|
235
|
+
* for an OpenCode tile when Claude Code's folder is ticked or holds the skill (a terminal OpenCode reads it; SynaBun's
|
|
236
|
+
* own OpenCode serves do not, so this is a hint, never a reason to leave OpenCode out); else null.
|
|
237
|
+
* @param {string} runtime @param {object[]} targets @param {Set<string>} checked
|
|
238
|
+
* @param {{ scope?: string, skill?: object|null, row?: object|null }} [o]
|
|
239
|
+
*/
|
|
240
|
+
export function seenThrough(runtime, targets, checked, { scope = 'user', skill = null, row = null } = {}) {
|
|
241
|
+
for (const t of targets) {
|
|
242
|
+
if (t.runtime === runtime || t.off || !(t.runtimes || []).includes(runtime)) continue;
|
|
243
|
+
const inScope = scope.startsWith('project:') ? t.scope === 'project' && t.projectPath === scope.slice(8) : t.scope === 'user' && t.accountId === 'default';
|
|
244
|
+
if (!inScope) continue;
|
|
245
|
+
if (checked?.has?.(t.key) || ['installed', 'outdated', 'present'].includes(targetState(t, { skill, row }).state)) return t.runtime;
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|