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,524 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun — start at login, for an npm or Git install (Settings > App)
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// The server starts in the background when the user logs in, with no window
|
|
6
|
+
// and no terminal, through the same launcher the Start Server button uses
|
|
7
|
+
// (launcher.mjs → lib/start-launcher.js runLauncher, in its background mode:
|
|
8
|
+
// nothing happens when a server already answers or a start is under way, and
|
|
9
|
+
// the server gets the login shell's environment, so an nvm or Homebrew Node
|
|
10
|
+
// and the user's CLIs are found as in a terminal). Every path in the entry is
|
|
11
|
+
// absolute: the PATH a login starts programs with is not the user's.
|
|
12
|
+
//
|
|
13
|
+
// macOS ~/Library/LaunchAgents/ai.synabun.server.plist (RunAtLoad; the
|
|
14
|
+
// launcher's process group is left alone when it exits)
|
|
15
|
+
// Windows HKCU\...\Run "SynaBun Server": wscript.exe runs a small script of
|
|
16
|
+
// SynaBun's (DATA_HOME/runtime/login/synabun-hidden.vbs) that starts
|
|
17
|
+
// node with no window. A console program started from Run would
|
|
18
|
+
// show a console. A packaged entry (a GUI program) runs directly
|
|
19
|
+
// Linux ~/.config/autostart/synabun-server.desktop (XDG autostart)
|
|
20
|
+
//
|
|
21
|
+
// The entry itself is the setting: on while it is there, off when it is gone.
|
|
22
|
+
// It is read back from the system for every answer (inspect), and put back in
|
|
23
|
+
// place on every start of the server while it is on (heal: another Node, a
|
|
24
|
+
// moved install). One the user turned off in the system (disabled in Startup
|
|
25
|
+
// apps, in Login Items, or in the desktop's autostart settings) stays off and
|
|
26
|
+
// is reported as off.
|
|
27
|
+
//
|
|
28
|
+
// The SynaBun desktop app on the same data folder opens at login on its own
|
|
29
|
+
// (packaging/desktop/src/login-item.mjs, which names both apps' entries the
|
|
30
|
+
// same way: NPM_LOGIN, DESKTOP_LOGIN; a test keeps the two equal). Two starts
|
|
31
|
+
// at login would start two servers on one data folder: while the app's entry is
|
|
32
|
+
// there and on for this data folder (read from the system, desktopLoginOwner),
|
|
33
|
+
// this one is refused ('desktop-app'); turning the app's on removes this one.
|
|
34
|
+
//
|
|
35
|
+
// Pure: the file calls and the programs it runs are handed in (tests/login-start.test.mjs).
|
|
36
|
+
|
|
37
|
+
import { execFileSync } from 'node:child_process';
|
|
38
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
|
|
39
|
+
import { homedir, tmpdir } from 'node:os';
|
|
40
|
+
import { dirname, join as nativeJoin, posix, win32 } from 'node:path';
|
|
41
|
+
import { desktopExecArg, launcherOverrides, winQuote } from '../../lib/start-launcher.js';
|
|
42
|
+
|
|
43
|
+
/** The names of the entries (packaging/desktop/src/login-item.mjs NPM_LOGIN must be equal). */
|
|
44
|
+
export const NPM_LOGIN = Object.freeze({
|
|
45
|
+
macLabel: 'ai.synabun.server',
|
|
46
|
+
winName: 'SynaBun Server',
|
|
47
|
+
linuxFile: 'synabun-server.desktop',
|
|
48
|
+
});
|
|
49
|
+
/** What the launcher is started with at login (lib/start-launcher.js parseLauncherArgs reads them). */
|
|
50
|
+
export const LOGIN_ARGS = Object.freeze(['--via=login', '--background']);
|
|
51
|
+
/**
|
|
52
|
+
* The desktop app's own login entries (packaging/desktop/src/login-item.mjs DESKTOP_LOGIN must be equal): read from
|
|
53
|
+
* the system to know whether the app opens at login on this data folder, never from the app's settings file.
|
|
54
|
+
*/
|
|
55
|
+
export const DESKTOP_LOGIN = Object.freeze({
|
|
56
|
+
macLabel: 'ai.synabun.app.login',
|
|
57
|
+
winName: 'ai.synabun.app',
|
|
58
|
+
linuxFile: 'synabun-app.desktop',
|
|
59
|
+
env: 'SYNABUN_DESKTOP_LOGIN',
|
|
60
|
+
flag: '--synabun-login',
|
|
61
|
+
dataFlag: '--synabun-data-home=',
|
|
62
|
+
portFlag: '--synabun-port=',
|
|
63
|
+
});
|
|
64
|
+
export const HIDDEN_SCRIPT = 'synabun-hidden.vbs';
|
|
65
|
+
export const LINUX_MARKER = 'X-SynaBun-Login=server';
|
|
66
|
+
|
|
67
|
+
const RUN_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run';
|
|
68
|
+
const APPROVED_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run';
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Runs its arguments as one command line with no window. ASCII only, no path
|
|
72
|
+
* in it: what it starts comes in as its arguments, which the registry holds as
|
|
73
|
+
* Unicode (Windows Script Host reads the file itself in the ANSI code page).
|
|
74
|
+
*/
|
|
75
|
+
export const HIDDEN_SCRIPT_SOURCE = [
|
|
76
|
+
"' SynaBun: runs its arguments as one command, with no window (start at login).",
|
|
77
|
+
"' Generated by SynaBun. Do not edit.",
|
|
78
|
+
'Option Explicit',
|
|
79
|
+
'Dim shell, command, i, a, n',
|
|
80
|
+
'command = ""',
|
|
81
|
+
'For i = 0 To WScript.Arguments.Count - 1',
|
|
82
|
+
' a = WScript.Arguments(i)',
|
|
83
|
+
" ' Backslashes before the closing quote are doubled, or the last one would escape it.",
|
|
84
|
+
' n = 0',
|
|
85
|
+
' Do While n < Len(a)',
|
|
86
|
+
' If Mid(a, Len(a) - n, 1) <> "\\" Then Exit Do',
|
|
87
|
+
' n = n + 1',
|
|
88
|
+
' Loop',
|
|
89
|
+
' command = command & " """ & a & String(n, "\\") & """"',
|
|
90
|
+
'Next',
|
|
91
|
+
'Set shell = CreateObject("WScript.Shell")',
|
|
92
|
+
'shell.Run Trim(command), 0, False',
|
|
93
|
+
'',
|
|
94
|
+
].join('\r\n');
|
|
95
|
+
|
|
96
|
+
function defaultRun(file, args, { timeout = 5000 } = {}) {
|
|
97
|
+
return execFileSync(file, args, { encoding: 'utf8', timeout, stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const DEFAULT_FS = { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync };
|
|
101
|
+
|
|
102
|
+
const failure = (code, message) => Object.assign(new Error(message || code), { code });
|
|
103
|
+
|
|
104
|
+
function xmlEscape(value) {
|
|
105
|
+
return String(value).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function systemTool(env, name) {
|
|
109
|
+
const root = env.SystemRoot || env.SYSTEMROOT || env.windir;
|
|
110
|
+
return root ? win32.join(root, 'System32', name) : name;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* One REG_SZ value of a `reg export` file, or null. `reg query` prints in the console's code page, which turns a
|
|
115
|
+
* non-ASCII folder name (C:\Users\João) into other characters; the export (UTF-16) keeps it.
|
|
116
|
+
*/
|
|
117
|
+
export function parseRegExport(text, name) {
|
|
118
|
+
const quoted = `"${String(name).replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"=`;
|
|
119
|
+
for (const line of String(text || '').replace(/^\uFEFF/, '').split(/\r?\n/)) {
|
|
120
|
+
if (!line.toLowerCase().startsWith(quoted.toLowerCase())) continue;
|
|
121
|
+
const rest = line.slice(quoted.length);
|
|
122
|
+
if (!rest.startsWith('"') || !rest.endsWith('"')) return null;
|
|
123
|
+
return rest.slice(1, -1).replace(/\\(["\\])/g, '$1');
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function decodeRegFile(buffer) {
|
|
129
|
+
const bytes = Buffer.isBuffer(buffer) ? buffer : Buffer.from(String(buffer ?? ''), 'utf8');
|
|
130
|
+
return bytes[0] === 0xff && bytes[1] === 0xfe ? bytes.subarray(2).toString('utf16le') : bytes.toString('utf8');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** One value of a registry key, read through `reg export` (Unicode-safe), or null. */
|
|
134
|
+
export function readRegValue(key, name, { run = defaultRun, fs = DEFAULT_FS, env = process.env, tmp = tmpdir() } = {}) {
|
|
135
|
+
const file = nativeJoin(tmp, `synabun-login-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.reg`);
|
|
136
|
+
try {
|
|
137
|
+
run(systemTool(env, 'reg.exe'), ['export', key, file, '/y']);
|
|
138
|
+
return parseRegExport(decodeRegFile(fs.readFileSync(file)), name);
|
|
139
|
+
} catch {
|
|
140
|
+
return null;
|
|
141
|
+
} finally {
|
|
142
|
+
try { fs.rmSync(file, { force: true }); } catch {}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** The data of one value in `reg query` output, or null. */
|
|
147
|
+
export function parseRegQuery(output, name) {
|
|
148
|
+
for (const line of String(output || '').split(/\r?\n/)) {
|
|
149
|
+
const match = /^\s{2,}(.+?)\s{2,}(REG_[A-Z_]+)\s{2,}(.*)$/.exec(line) || /^\s{2,}(.+?)\s{2,}(REG_[A-Z_]+)\s*$/.exec(line);
|
|
150
|
+
if (match && match[1].toLowerCase() === String(name).toLowerCase()) return (match[3] ?? '').trim();
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Windows' Startup apps switch, from its REG_BINARY: an odd first byte is "disabled". null when unknown. */
|
|
156
|
+
export function startupApproved(hex) {
|
|
157
|
+
const first = /^[0-9a-f]{2}/i.exec(String(hex || '').trim());
|
|
158
|
+
if (!first) return null;
|
|
159
|
+
return (parseInt(first[0], 16) & 1) === 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** The [Desktop Entry] keys of a .desktop file (the first value of a key counts). */
|
|
163
|
+
function desktopEntryKeys(text) {
|
|
164
|
+
const out = {};
|
|
165
|
+
let inGroup = false;
|
|
166
|
+
for (const raw of String(text || '').split(/\r?\n/)) {
|
|
167
|
+
const line = raw.trim();
|
|
168
|
+
if (!line || line.startsWith('#')) continue;
|
|
169
|
+
if (line.startsWith('[')) { inGroup = line === '[Desktop Entry]'; continue; }
|
|
170
|
+
const at = line.indexOf('=');
|
|
171
|
+
if (inGroup && at > 0 && !(line.slice(0, at).trim() in out)) out[line.slice(0, at).trim()] = line.slice(at + 1).trim();
|
|
172
|
+
}
|
|
173
|
+
return out;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* The entry this install would write now, as data: no side effects.
|
|
178
|
+
* { kind: 'launch-agent' | 'run-value' | 'autostart', path?, content?, key?, name?, value?, helper? }
|
|
179
|
+
* `entry` is a packaged build's entry executable (it brings its own Node): `<entry> launcher …`.
|
|
180
|
+
*/
|
|
181
|
+
export function buildLoginPlan({
|
|
182
|
+
platform = process.platform, nodePath = process.execPath, packageRoot, home = homedir(), env = process.env, dataHome, entry = null,
|
|
183
|
+
} = {}) {
|
|
184
|
+
if (!packageRoot) throw new Error('packageRoot is required');
|
|
185
|
+
const overrides = launcherOverrides({ env, home, platform });
|
|
186
|
+
const args = [...LOGIN_ARGS, ...(overrides.dataHome ? ['--data-home', overrides.dataHome] : []), ...(overrides.port ? ['--port', String(overrides.port)] : [])];
|
|
187
|
+
|
|
188
|
+
if (platform === 'win32') {
|
|
189
|
+
const launcher = entry || win32.join(packageRoot, 'launcher.mjs');
|
|
190
|
+
const program = entry ? [entry, 'launcher', ...args] : [nodePath, launcher, ...args];
|
|
191
|
+
const mark = winQuote(launcher);
|
|
192
|
+
if (entry) return { kind: 'run-value', key: RUN_KEY, name: NPM_LOGIN.winName, value: program.map(winQuote).join(' '), helper: null, mark, refuse: null };
|
|
193
|
+
const helperPath = win32.join(dataHome, 'runtime', 'login', HIDDEN_SCRIPT);
|
|
194
|
+
// wscript's own options stay bare (//B: no message boxes); everything else is one quoted argument each.
|
|
195
|
+
const value = [winQuote(systemTool(env, 'wscript.exe')), '//B', '//NoLogo', ...[helperPath, ...program].map(winQuote)].join(' ');
|
|
196
|
+
// WshShell.Run expands %NAME% in what it runs, and nothing escapes it: such a path cannot be started this way.
|
|
197
|
+
const refuse = [helperPath, ...program].some(word => word.includes('%')) ? 'bad-path' : null;
|
|
198
|
+
return { kind: 'run-value', key: RUN_KEY, name: NPM_LOGIN.winName, value, helper: { path: helperPath, content: HIDDEN_SCRIPT_SOURCE }, mark, refuse };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const launcher = entry || posix.join(packageRoot, 'launcher.mjs');
|
|
202
|
+
const program = entry ? [entry, 'launcher', ...args] : [nodePath, launcher, ...args];
|
|
203
|
+
if (platform === 'darwin') {
|
|
204
|
+
const shell = /^\/[\w./-]+$/.test(String(env.SHELL || '')) ? env.SHELL : null;
|
|
205
|
+
const content = [
|
|
206
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
207
|
+
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
|
|
208
|
+
'<plist version="1.0">',
|
|
209
|
+
'<dict>',
|
|
210
|
+
` <key>Label</key><string>${NPM_LOGIN.macLabel}</string>`,
|
|
211
|
+
' <key>ProgramArguments</key>',
|
|
212
|
+
' <array>',
|
|
213
|
+
...program.map(word => ` <string>${xmlEscape(word)}</string>`),
|
|
214
|
+
' </array>',
|
|
215
|
+
` <key>WorkingDirectory</key><string>${xmlEscape(packageRoot)}</string>`,
|
|
216
|
+
// The launcher reads the login shell's environment (PATH, nvm): it is told which shell that is.
|
|
217
|
+
...(shell ? [' <key>EnvironmentVariables</key>', ' <dict>', ` <key>SHELL</key><string>${xmlEscape(shell)}</string>`, ' </dict>'] : []),
|
|
218
|
+
' <key>RunAtLoad</key><true/>',
|
|
219
|
+
// The server outlives the launcher: launchd must not end it with the launcher's process group.
|
|
220
|
+
' <key>AbandonProcessGroup</key><true/>',
|
|
221
|
+
' <key>ProcessType</key><string>Interactive</string>',
|
|
222
|
+
' <key>StandardOutPath</key><string>/dev/null</string>',
|
|
223
|
+
' <key>StandardErrorPath</key><string>/dev/null</string>',
|
|
224
|
+
'</dict>',
|
|
225
|
+
'</plist>',
|
|
226
|
+
'',
|
|
227
|
+
].join('\n');
|
|
228
|
+
return { kind: 'launch-agent', path: posix.join(home, 'Library', 'LaunchAgents', `${NPM_LOGIN.macLabel}.plist`), content, mark: `<string>${xmlEscape(launcher)}</string>` };
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const config = String(env.XDG_CONFIG_HOME || '');
|
|
232
|
+
const dir = posix.join(config.startsWith('/') ? config : posix.join(home, '.config'), 'autostart');
|
|
233
|
+
const content = [
|
|
234
|
+
'[Desktop Entry]',
|
|
235
|
+
'Type=Application',
|
|
236
|
+
'Name=SynaBun server',
|
|
237
|
+
'Comment=Starts the SynaBun server in the background when you log in',
|
|
238
|
+
`Exec=${program.map(desktopExecArg).join(' ')}`,
|
|
239
|
+
'Terminal=false',
|
|
240
|
+
'NoDisplay=true',
|
|
241
|
+
'X-GNOME-Autostart-enabled=true',
|
|
242
|
+
LINUX_MARKER,
|
|
243
|
+
'',
|
|
244
|
+
].join('\n');
|
|
245
|
+
return { kind: 'autostart', path: posix.join(dir, NPM_LOGIN.linuxFile), content, mark: desktopExecArg(launcher) };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The entry as the system has it: 'on' (in place), 'stale' (there, but it
|
|
250
|
+
* starts something else: another Node, a moved install), 'disabled' (turned
|
|
251
|
+
* off in the system) or 'off' (not there).
|
|
252
|
+
*/
|
|
253
|
+
export function inspectLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun, uid = typeof process.getuid === 'function' ? process.getuid() : null } = {}) {
|
|
254
|
+
if (plan.kind === 'run-value') {
|
|
255
|
+
const reg = systemTool(env, 'reg.exe');
|
|
256
|
+
const value = readRegValue(plan.key, plan.name, { run, fs, env });
|
|
257
|
+
if (value == null) return 'off';
|
|
258
|
+
let approved = null;
|
|
259
|
+
try { approved = startupApproved(parseRegQuery(run(reg, ['query', APPROVED_KEY, '/v', plan.name]), plan.name)); } catch {}
|
|
260
|
+
if (approved === false) return 'disabled';
|
|
261
|
+
const helperOk = !plan.helper || (() => { try { return fs.readFileSync(plan.helper.path, 'utf8') === plan.helper.content; } catch { return false; } })();
|
|
262
|
+
return value === plan.value && helperOk ? 'on' : 'stale';
|
|
263
|
+
}
|
|
264
|
+
let text = null;
|
|
265
|
+
try { text = fs.readFileSync(plan.path, 'utf8'); } catch { return 'off'; }
|
|
266
|
+
if (plan.kind === 'autostart') {
|
|
267
|
+
const keys = desktopEntryKeys(text);
|
|
268
|
+
if (/^true$/i.test(keys.Hidden || '') || /^false$/i.test(keys['X-GNOME-Autostart-enabled'] || 'true')) return 'disabled';
|
|
269
|
+
}
|
|
270
|
+
if (plan.kind === 'launch-agent' && uid != null) {
|
|
271
|
+
// Login Items > Allow in the Background, switched off, disables the job.
|
|
272
|
+
try {
|
|
273
|
+
const out = run('/bin/launchctl', ['print-disabled', `gui/${uid}`]);
|
|
274
|
+
if (new RegExp(`"${NPM_LOGIN.macLabel.replace(/\./g, '\\.')}"\\s*=>\\s*(?:true|disabled)`).test(String(out))) return 'disabled';
|
|
275
|
+
} catch {}
|
|
276
|
+
}
|
|
277
|
+
return text === plan.content ? 'on' : 'stale';
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function writeAtomic(fs, path, content, mode) {
|
|
281
|
+
fs.mkdirSync(dirname(path), { recursive: true });
|
|
282
|
+
const temp = `${path}.${process.pid}.tmp`;
|
|
283
|
+
fs.writeFileSync(temp, content, mode ? { mode } : undefined);
|
|
284
|
+
fs.renameSync(temp, path);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* Put the entry in place. Throws { code: 'write-failed' | 'no-wscript' }. With `enable` (the user turned it on
|
|
289
|
+
* in Settings) a switch the system holds for it is turned on too: Windows' Startup apps, launchd's disabled list.
|
|
290
|
+
*/
|
|
291
|
+
export function applyLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun, uid = typeof process.getuid === 'function' ? process.getuid() : null, enable = false } = {}) {
|
|
292
|
+
if (plan.refuse) throw failure(plan.refuse, 'a path with % in it cannot be started at login on Windows');
|
|
293
|
+
try {
|
|
294
|
+
if (plan.kind === 'run-value') {
|
|
295
|
+
const wscript = systemTool(env, 'wscript.exe');
|
|
296
|
+
if (plan.helper && win32.isAbsolute(wscript) && !fs.existsSync(wscript)) throw failure('no-wscript', `${wscript} is missing`);
|
|
297
|
+
if (plan.helper) writeAtomic(fs, plan.helper.path, plan.helper.content);
|
|
298
|
+
run(systemTool(env, 'reg.exe'), ['add', plan.key, '/v', plan.name, '/t', 'REG_SZ', '/d', plan.value, '/f']);
|
|
299
|
+
// No Startup apps record: enabled.
|
|
300
|
+
if (enable) { try { run(systemTool(env, 'reg.exe'), ['delete', APPROVED_KEY, '/v', plan.name, '/f']); } catch {} }
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
writeAtomic(fs, plan.path, plan.content, 0o644);
|
|
304
|
+
if (enable && plan.kind === 'launch-agent' && uid != null) { try { run('/bin/launchctl', ['enable', `gui/${uid}/${NPM_LOGIN.macLabel}`]); } catch {} }
|
|
305
|
+
} catch (error) {
|
|
306
|
+
if (error.code === 'no-wscript') throw error;
|
|
307
|
+
throw failure('write-failed', error.message);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/** The entry as it is written now (the file, or the Run value), or null. */
|
|
312
|
+
export function readLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun } = {}) {
|
|
313
|
+
if (plan.kind === 'run-value') return readRegValue(plan.key, plan.name, { run, fs, env });
|
|
314
|
+
try { return fs.readFileSync(plan.path, 'utf8'); } catch { return null; }
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** Take the entry away. Throws { code: 'write-failed' } when it stays. */
|
|
318
|
+
export function removeLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun, uid = typeof process.getuid === 'function' ? process.getuid() : null } = {}) {
|
|
319
|
+
try {
|
|
320
|
+
if (plan.kind === 'run-value') {
|
|
321
|
+
try { run(systemTool(env, 'reg.exe'), ['delete', plan.key, '/v', plan.name, '/f']); } catch (error) {
|
|
322
|
+
if (inspectLoginEntry(plan, { env, fs, run }) !== 'off') throw error;
|
|
323
|
+
}
|
|
324
|
+
if (plan.helper) fs.rmSync(plan.helper.path, { force: true });
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (plan.kind === 'launch-agent' && uid != null) {
|
|
328
|
+
// Loaded since the last login (it ran once then): unload it too.
|
|
329
|
+
try { run('/bin/launchctl', ['bootout', `gui/${uid}/${NPM_LOGIN.macLabel}`]); } catch {}
|
|
330
|
+
}
|
|
331
|
+
fs.rmSync(plan.path, { force: true });
|
|
332
|
+
} catch (error) {
|
|
333
|
+
throw failure('write-failed', error.message);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// ── The desktop app's entry, as the system has it ──
|
|
338
|
+
|
|
339
|
+
/** The strings of a plist's ProgramArguments array. */
|
|
340
|
+
function plistArguments(text) {
|
|
341
|
+
const block = /<key>\s*ProgramArguments\s*<\/key>\s*<array>([\s\S]*?)<\/array>/.exec(String(text || ''));
|
|
342
|
+
const unxml = (v) => v.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, "'").replace(/&/g, '&');
|
|
343
|
+
return block ? [...block[1].matchAll(/<string>([\s\S]*?)<\/string>/g)].map(m => unxml(m[1])) : [];
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/** The words of a .desktop Exec value (its quoting and escapes undone). */
|
|
347
|
+
function desktopExecWords(value) {
|
|
348
|
+
const text = String(value || '').replace(/\\\\/g, '\\').replace(/%%/g, '%');
|
|
349
|
+
const words = [];
|
|
350
|
+
let word = '';
|
|
351
|
+
let quoted = false;
|
|
352
|
+
let any = false;
|
|
353
|
+
for (let i = 0; i < text.length; i++) {
|
|
354
|
+
const ch = text[i];
|
|
355
|
+
if (quoted) {
|
|
356
|
+
if (ch === '\\' && i + 1 < text.length) { word += text[++i]; continue; }
|
|
357
|
+
if (ch === '"') { quoted = false; continue; }
|
|
358
|
+
word += ch;
|
|
359
|
+
} else if (ch === '"') { quoted = true; any = true; } else if (/\s/.test(ch)) {
|
|
360
|
+
if (word || any) words.push(word);
|
|
361
|
+
word = ''; any = false;
|
|
362
|
+
} else word += ch;
|
|
363
|
+
}
|
|
364
|
+
if (word || any) words.push(word);
|
|
365
|
+
return words;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/** The words of a Windows command line (CommandLineToArgvW's quoting). */
|
|
369
|
+
function windowsWords(line) {
|
|
370
|
+
const text = String(line || '');
|
|
371
|
+
const words = [];
|
|
372
|
+
let word = '';
|
|
373
|
+
let quoted = false;
|
|
374
|
+
let any = false;
|
|
375
|
+
let i = 0;
|
|
376
|
+
while (i < text.length) {
|
|
377
|
+
const ch = text[i];
|
|
378
|
+
if (ch === '\\') {
|
|
379
|
+
let slashes = 0;
|
|
380
|
+
while (text[i] === '\\') { slashes++; i++; }
|
|
381
|
+
if (text[i] === '"') {
|
|
382
|
+
word += '\\'.repeat(Math.floor(slashes / 2));
|
|
383
|
+
if (slashes % 2) { word += '"'; any = true; i++; }
|
|
384
|
+
} else word += '\\'.repeat(slashes);
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
i++;
|
|
388
|
+
if (ch === '"') { quoted = !quoted; any = true; continue; }
|
|
389
|
+
if (!quoted && /\s/.test(ch)) { if (word || any) words.push(word); word = ''; any = false; continue; }
|
|
390
|
+
word += ch;
|
|
391
|
+
}
|
|
392
|
+
if (word || any) words.push(word);
|
|
393
|
+
return words;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const samePath = (a, b, platform) => {
|
|
397
|
+
if (!a || !b) return false;
|
|
398
|
+
const norm = (value) => (platform === 'win32' ? win32.resolve(value) : posix.resolve(value)).replace(/[\\/]+$/, '');
|
|
399
|
+
return platform === 'linux' ? norm(a) === norm(b) : norm(a).toLowerCase() === norm(b).toLowerCase();
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* The desktop app's program when its login entry, as the system has it now (there, not switched off, its program
|
|
404
|
+
* still there), opens it on `dataHome`; otherwise null. The app's own settings file is not asked: an entry the user
|
|
405
|
+
* removed or switched off while the app was closed never blocks this install.
|
|
406
|
+
*/
|
|
407
|
+
export function desktopLoginOwner(dataHome, {
|
|
408
|
+
platform = process.platform, home = homedir(), env = process.env, fs = DEFAULT_FS, run = defaultRun,
|
|
409
|
+
uid = typeof process.getuid === 'function' ? process.getuid() : null,
|
|
410
|
+
} = {}) {
|
|
411
|
+
const usual = platform === 'win32' ? (env.APPDATA ? win32.resolve(env.APPDATA, 'synabun') : null) : posix.join(home, '.synabun');
|
|
412
|
+
const owns = (program, folder) => (program && fs.existsSync(program) && samePath(folder || usual, dataHome, platform) ? program : null);
|
|
413
|
+
try {
|
|
414
|
+
if (platform === 'darwin') {
|
|
415
|
+
const text = fs.readFileSync(posix.join(home, 'Library', 'LaunchAgents', `${DESKTOP_LOGIN.macLabel}.plist`), 'utf8');
|
|
416
|
+
if (uid != null) {
|
|
417
|
+
try {
|
|
418
|
+
const out = run('/bin/launchctl', ['print-disabled', `gui/${uid}`]);
|
|
419
|
+
if (new RegExp(`"${DESKTOP_LOGIN.macLabel.replace(/\./g, '\\.')}"\\s*=>\\s*(?:true|disabled)`).test(String(out))) return null;
|
|
420
|
+
} catch {}
|
|
421
|
+
}
|
|
422
|
+
// `open -a <app> --env …`, or (a Mac whose `open` has no --env) the app's own program with its environment.
|
|
423
|
+
const words = plistArguments(text);
|
|
424
|
+
const unxml = (v) => v.replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&');
|
|
425
|
+
const direct = /^(.+\.app)\/Contents\/MacOS\/[^/]+$/.exec(words[0] || '');
|
|
426
|
+
const bundle = words.indexOf('-a') >= 0 ? words[words.indexOf('-a') + 1] : direct ? direct[1] : null;
|
|
427
|
+
const folder = words.find(w => w.startsWith('SYNABUN_DATA_HOME='))?.slice('SYNABUN_DATA_HOME='.length)
|
|
428
|
+
?? (/<key>SYNABUN_DATA_HOME<\/key>\s*<string>([\s\S]*?)<\/string>/.exec(text)?.[1] ? unxml(/<key>SYNABUN_DATA_HOME<\/key>\s*<string>([\s\S]*?)<\/string>/.exec(text)[1]) : undefined);
|
|
429
|
+
return owns(bundle, folder);
|
|
430
|
+
}
|
|
431
|
+
if (platform === 'win32') {
|
|
432
|
+
const value = readRegValue(RUN_KEY, DESKTOP_LOGIN.winName, { run, fs, env });
|
|
433
|
+
if (value == null) return null;
|
|
434
|
+
let approved = null;
|
|
435
|
+
try { approved = startupApproved(parseRegQuery(run(systemTool(env, 'reg.exe'), ['query', APPROVED_KEY, '/v', DESKTOP_LOGIN.winName]), DESKTOP_LOGIN.winName)); } catch {}
|
|
436
|
+
if (approved === false) return null;
|
|
437
|
+
const words = windowsWords(value);
|
|
438
|
+
const data = words.find(w => w.startsWith(DESKTOP_LOGIN.dataFlag));
|
|
439
|
+
let folder = null;
|
|
440
|
+
if (data) { try { folder = Buffer.from(data.slice(DESKTOP_LOGIN.dataFlag.length), 'base64url').toString('utf8') || null; } catch {} }
|
|
441
|
+
return words.includes(DESKTOP_LOGIN.flag) ? owns(words[0], folder) : null;
|
|
442
|
+
}
|
|
443
|
+
const config = String(env.XDG_CONFIG_HOME || '');
|
|
444
|
+
const file = posix.join(config.startsWith('/') ? config : posix.join(home, '.config'), 'autostart', DESKTOP_LOGIN.linuxFile);
|
|
445
|
+
const keys = desktopEntryKeys(fs.readFileSync(file, 'utf8'));
|
|
446
|
+
if (/^true$/i.test(keys.Hidden || '') || /^false$/i.test(keys['X-GNOME-Autostart-enabled'] || 'true')) return null;
|
|
447
|
+
const words = desktopExecWords(keys.Exec);
|
|
448
|
+
const vars = words[0] === 'env' ? words.slice(1).filter(w => /^[A-Za-z_][A-Za-z0-9_]*=/.test(w)) : [];
|
|
449
|
+
const program = words[0] === 'env' ? words.slice(1).find(w => !/^[A-Za-z_][A-Za-z0-9_]*=/.test(w)) : words[0];
|
|
450
|
+
const folder = vars.find(w => w.startsWith('SYNABUN_DATA_HOME='))?.slice('SYNABUN_DATA_HOME='.length);
|
|
451
|
+
return owns(program, folder);
|
|
452
|
+
} catch {
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* The start at login of this install.
|
|
459
|
+
*
|
|
460
|
+
* status() { supported, reason, enabled, state, owner }: reason 'desktop' (the desktop
|
|
461
|
+
* app has its own: Settings reads it from the app), 'not-here' (a test run or a
|
|
462
|
+
* throwaway data folder) or 'unsupported'; owner is the desktop app's program
|
|
463
|
+
* when it opens at login on this data folder
|
|
464
|
+
* set(enabled) turn it on or off; resolves to status(). Throws { code }: 'desktop-app', 'not-here',
|
|
465
|
+
* 'write-failed', 'no-wscript', 'refused'
|
|
466
|
+
* heal() on a server start: this install's own entry, when stale, is put back in place; an entry that
|
|
467
|
+
* starts another install, or one the user turned off, is left as it is
|
|
468
|
+
*/
|
|
469
|
+
export function createLoginStart({
|
|
470
|
+
platform = process.platform, nodePath = process.execPath, packageRoot, home = homedir(), env = process.env, dataHome,
|
|
471
|
+
entry = null, desktopShell = false, allowed = () => true, fs = DEFAULT_FS, run = defaultRun, uid,
|
|
472
|
+
log = () => {},
|
|
473
|
+
} = {}) {
|
|
474
|
+
const ops = { env, fs, run, ...(uid !== undefined ? { uid } : {}) };
|
|
475
|
+
const plan = () => buildLoginPlan({ platform, nodePath, packageRoot, home, env, dataHome, entry });
|
|
476
|
+
const support = () => {
|
|
477
|
+
if (desktopShell) return { supported: false, reason: 'desktop' };
|
|
478
|
+
if (!['darwin', 'win32', 'linux'].includes(platform)) return { supported: false, reason: 'unsupported' };
|
|
479
|
+
if (!allowed()) return { supported: false, reason: 'not-here' };
|
|
480
|
+
return { supported: true, reason: null };
|
|
481
|
+
};
|
|
482
|
+
|
|
483
|
+
function status() {
|
|
484
|
+
const { supported, reason } = support();
|
|
485
|
+
const owner = desktopLoginOwner(dataHome, { platform, home, env, ...ops });
|
|
486
|
+
if (!supported) return { supported, reason, enabled: false, state: 'off', owner };
|
|
487
|
+
let state = 'off';
|
|
488
|
+
try { state = inspectLoginEntry(plan(), ops); } catch {}
|
|
489
|
+
return { supported, reason, enabled: state === 'on' || state === 'stale', state, owner };
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
async function set(enabled) {
|
|
493
|
+
const { supported, reason } = support();
|
|
494
|
+
if (!supported) throw failure(reason, `start at login is not available here (${reason})`);
|
|
495
|
+
const target = plan();
|
|
496
|
+
if (enabled) {
|
|
497
|
+
const owner = desktopLoginOwner(dataHome, { platform, home, env, ...ops });
|
|
498
|
+
if (owner) throw failure('desktop-app', `the SynaBun app opens at login on this data folder (${owner})`);
|
|
499
|
+
applyLoginEntry(target, { ...ops, enable: true });
|
|
500
|
+
} else {
|
|
501
|
+
removeLoginEntry(target, ops);
|
|
502
|
+
}
|
|
503
|
+
const after = status();
|
|
504
|
+
log(`start at login ${enabled ? 'on' : 'off'}: ${after.state}`);
|
|
505
|
+
if (enabled ? after.state !== 'on' : after.enabled) throw failure('refused', after.state);
|
|
506
|
+
return after;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
function heal() {
|
|
510
|
+
const { supported } = support();
|
|
511
|
+
if (!supported) return { changed: false, state: 'off' };
|
|
512
|
+
const target = plan();
|
|
513
|
+
const state = inspectLoginEntry(target, ops);
|
|
514
|
+
if (state !== 'stale') return { changed: false, state };
|
|
515
|
+
// Only this install's own entry (another Node, other pins): one that starts another install on this data folder
|
|
516
|
+
// (an npm install, a Git checkout run by hand) is that install's, and stays as it is.
|
|
517
|
+
if (!String(readLoginEntry(target, ops) || '').includes(target.mark)) return { changed: false, state };
|
|
518
|
+
applyLoginEntry(target, ops);
|
|
519
|
+
log('start at login: the entry now starts this install');
|
|
520
|
+
return { changed: true, state: inspectLoginEntry(target, ops) };
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
return { status, set, heal, plan };
|
|
524
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Registry conversion is read-only. An explicit switch is authoritative; missing switches are on.
|
|
2
|
+
function asObject(value) {
|
|
3
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
export function agentAccessFrom(registry) {
|
|
7
|
+
const reg = asObject(registry);
|
|
8
|
+
if (reg.agentAccess && typeof reg.agentAccess === 'object' && !Array.isArray(reg.agentAccess)) return { ...reg.agentAccess };
|
|
9
|
+
const profile = asObject(asObject(reg.profiles)[reg.activeProfile]);
|
|
10
|
+
if (!Array.isArray(profile.servers)) return {};
|
|
11
|
+
const granted = new Set(profile.servers);
|
|
12
|
+
// The old reconciliation marker distinguishes a de-selection from a genuinely new server.
|
|
13
|
+
const known = new Set(Array.isArray(reg.profileDefaults?.knownServers)
|
|
14
|
+
? reg.profileDefaults.knownServers : Object.keys(asObject(reg.servers)));
|
|
15
|
+
return Object.fromEntries(Object.entries(asObject(reg.servers))
|
|
16
|
+
.filter(([name, entry]) => !entry?.builtin && known.has(name) && !granted.has(name))
|
|
17
|
+
.map(([name]) => [name, false]));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function agentServerNames(registry) {
|
|
21
|
+
const reg = asObject(registry);
|
|
22
|
+
const access = agentAccessFrom(reg);
|
|
23
|
+
return Object.entries(asObject(reg.servers))
|
|
24
|
+
.filter(([name, entry]) => !entry?.builtin && access[name] !== false)
|
|
25
|
+
.map(([name]) => name);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Tools that mutate ad state or spend budget, keyed by MCP server name.
|
|
30
|
+
*
|
|
31
|
+
* FleetView agents run with `--permission-mode bypassPermissions`, so the read-only
|
|
32
|
+
* allowlist in .claude/settings.json does not apply to them. These are pushed as
|
|
33
|
+
* `--disallowedTools` instead: agents keep full read/reporting access, while anything
|
|
34
|
+
* that creates, edits, activates, or deletes stays with a human.
|
|
35
|
+
*/
|
|
36
|
+
export const MCP_SERVER_WRITE_TOOLS = {
|
|
37
|
+
'meta-ads': [
|
|
38
|
+
'ads_create_campaign', 'ads_create_ad_set', 'ads_create_ad', 'ads_create_creative',
|
|
39
|
+
'ads_update_entity', 'ads_activate_entity', 'ads_boost_ig_post',
|
|
40
|
+
'ads_create_custom_audience', 'ads_update_custom_audience',
|
|
41
|
+
'ads_update_custom_audience_users', 'ads_delete_custom_audience',
|
|
42
|
+
'ads_catalog_create', 'ads_catalog_update_catalog',
|
|
43
|
+
'ads_catalog_product_create', 'ads_catalog_update_product', 'ads_catalog_delete_product',
|
|
44
|
+
'ads_catalog_create_product_set', 'ads_catalog_update_product_set', 'ads_catalog_product_set_delete',
|
|
45
|
+
'ads_catalog_create_product_feed', 'ads_catalog_update_product_feed',
|
|
46
|
+
'ads_catalog_create_product_feed_upload_session', 'ads_catalog_product_feed_delete',
|
|
47
|
+
'ads_catalog_create_feed_rule', 'ads_catalog_product_feed_delete_rule',
|
|
48
|
+
'ads_catalog_event_source_connect', 'ads_catalog_event_source_disconnect',
|
|
49
|
+
'ads_pixel_event_create', 'ads_pixel_event_update', 'ads_pixel_event_delete',
|
|
50
|
+
'ads_pixel_parameter_create', 'ads_pixel_parameter_update', 'ads_pixel_parameter_delete',
|
|
51
|
+
'ads_experiment_abtest_create_test', 'ads_experiment_abtest_update_test',
|
|
52
|
+
'ads_experiment_lift_create_test',
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/** Fully-qualified deny list for whichever servers an agent's --mcp-config actually grants. */
|
|
57
|
+
export function buildAgentDisallowedTools(mcpConfigJson) {
|
|
58
|
+
let serverNames = [];
|
|
59
|
+
try {
|
|
60
|
+
serverNames = Object.keys(asObject(JSON.parse(mcpConfigJson || '{}')).mcpServers || {});
|
|
61
|
+
} catch { return []; }
|
|
62
|
+
const deny = [];
|
|
63
|
+
for (const server of serverNames) {
|
|
64
|
+
for (const tool of MCP_SERVER_WRITE_TOOLS[server] || []) deny.push(`mcp__${server}__${tool}`);
|
|
65
|
+
}
|
|
66
|
+
return deny;
|
|
67
|
+
}
|
|
@@ -102,32 +102,3 @@ export function mergeGeminiMcpConfig(existing, definition) {
|
|
|
102
102
|
},
|
|
103
103
|
};
|
|
104
104
|
}
|
|
105
|
-
|
|
106
|
-
export function toOpenCodeMcpEntry(mcpConfig) {
|
|
107
|
-
const source = asObject(mcpConfig);
|
|
108
|
-
const { type: _type, command, args, env, environment, headers, oauth: _oauth, url, ...rest } = source;
|
|
109
|
-
if (isRemoteMcp(source)) {
|
|
110
|
-
// OpenCode names the URL-addressed transport "remote"; there is no http/sse split.
|
|
111
|
-
const entry = { type: 'remote', url, ...rest };
|
|
112
|
-
const hdrs = hasKeys(headers);
|
|
113
|
-
if (hdrs) entry.headers = { ...hdrs };
|
|
114
|
-
if (entry.enabled === undefined) entry.enabled = true;
|
|
115
|
-
return entry;
|
|
116
|
-
}
|
|
117
|
-
const entry = { type: 'local', ...rest };
|
|
118
|
-
if (command) entry.command = Array.isArray(command) ? [...command] : [command, ...(args || [])];
|
|
119
|
-
const envObj = environment || env;
|
|
120
|
-
if (envObj && Object.keys(envObj).length > 0) entry.environment = { ...envObj };
|
|
121
|
-
return entry;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export function mergeOpenCodeMcpConfig(existing, name, mcpConfig) {
|
|
125
|
-
const config = asObject(existing);
|
|
126
|
-
return {
|
|
127
|
-
...config,
|
|
128
|
-
mcp: {
|
|
129
|
-
...asObject(config.mcp),
|
|
130
|
-
[name]: toOpenCodeMcpEntry(mcpConfig),
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
}
|