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,295 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — The app's right-click menu
|
|
3
|
+
// A right-click anywhere that has no menu of its own opens the app's menu
|
|
4
|
+
// instead of the browser's: page actions, then what fits what was clicked
|
|
5
|
+
// (selected text, a link, an image, a memory, the memory map, the 2D graph,
|
|
6
|
+
// the focus-mode whiteboard), then the app's panels and tools. The
|
|
7
|
+
// ContextMenu key and Shift+F10 open it at the focused element.
|
|
8
|
+
//
|
|
9
|
+
// The rule: the app's menu opens unless the element under the pointer shows
|
|
10
|
+
// a menu of its own for that very click. Such an element takes the event
|
|
11
|
+
// (preventDefault) only when it opens its menu: the terminal's viewport, a
|
|
12
|
+
// File Explorer row or its empty tree, an editor tab, a 2D graph card, an
|
|
13
|
+
// Automation Studio item or folder, the map's canvas (OrbitControls takes
|
|
14
|
+
// every right-click there for right-drag pan; the map opens this menu itself
|
|
15
|
+
// when the right button comes up where it went down). An area that only
|
|
16
|
+
// suppressed the browser's menu would leave the user with nothing, so none
|
|
17
|
+
// does. NATIVE_CONTEXTMENU_SELECTORS names exact elements, never a whole
|
|
18
|
+
// screen or panel. Fields keep the browser's menu (spelling, paste), and so
|
|
19
|
+
// does any right-click with Shift held.
|
|
20
|
+
//
|
|
21
|
+
// The items are context-menu-model.js; the component is context-menu.js;
|
|
22
|
+
// the areas registry is context-menu-areas.js. Every action is a function the
|
|
23
|
+
// app already has: a registered keybind action, a bus event the menubar
|
|
24
|
+
// emits, a panel's button, sendToPanel, the memory card's functions.
|
|
25
|
+
// ═══════════════════════════════════════════
|
|
26
|
+
|
|
27
|
+
import { openContextMenu, isContextMenuOpen } from './context-menu.js';
|
|
28
|
+
import { isEditableTarget, isMenuKey, nativeMenuReason, selectionPayload, usableImage, usableLink } from './context-menu-logic.js';
|
|
29
|
+
import { buildAppMenu } from './context-menu-model.js';
|
|
30
|
+
import { areaAt, registerContextMenuArea } from './context-menu-areas.js';
|
|
31
|
+
import { t } from './i18n.js';
|
|
32
|
+
import { state, emit } from './state.js';
|
|
33
|
+
import { actionForKey, getShortcutLabel, hasAction, runAction } from './ui-keybinds.js';
|
|
34
|
+
import { isGuest, hasPermission } from './ui-sync.js';
|
|
35
|
+
import { sendToPanel } from './ui-claude-panel.js';
|
|
36
|
+
import { closeMemoryCard, focusLinkedMemories, getOpenCardsSnapshot } from './ui-detail.js';
|
|
37
|
+
import { formatMemoryForCLI } from './ui-terminal.js';
|
|
38
|
+
import { fetchMemory } from './api.js';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Where the browser's menu stays: the exact elements with a menu of their own (also for a click their handler did
|
|
42
|
+
* not take, such as Shift+F10 on them or a moment before they are wired), the other menus themselves, code editors,
|
|
43
|
+
* and what is not SynaBun's page or sits above the menu. Never a whole screen or panel: the rest of a panel gets the
|
|
44
|
+
* app's menu. Add `data-native-contextmenu` to an element to keep the browser's menu there.
|
|
45
|
+
*/
|
|
46
|
+
export const NATIVE_CONTEXTMENU_SELECTORS = [
|
|
47
|
+
'[data-native-contextmenu]',
|
|
48
|
+
'.term-viewport', '.xterm', '#term-context-menu', // terminals (docked and floating) and their menu
|
|
49
|
+
'#fe-tree', '.fe-ctx-flyout', // the File Explorer's tree (rows and its empty space) and its menus
|
|
50
|
+
'.cm-editor', '.fe-editor-menu', // a code editor anywhere; the editor's menus and palette
|
|
51
|
+
'#context-menu', // the 2D graph's card menu
|
|
52
|
+
'.explorer-ctx-menu', '.as-context-menu', // the Explorer's and the Automation Studio's menus
|
|
53
|
+
'.browser-canvas', // the SynaBun browser's view of another site (Back / Reload here would act on SynaBun)
|
|
54
|
+
'#loading-overlay', // the loading / restart screen, above the menu
|
|
55
|
+
];
|
|
56
|
+
const OPT_OUT = NATIVE_CONTEXTMENU_SELECTORS.join(', ');
|
|
57
|
+
const SEARCH_MAX = 500; // a search for the selection takes its first 500 characters
|
|
58
|
+
const KEY_ECHO_MS = 800; // the contextmenu event a menu key sends after its keydown already opened the menu
|
|
59
|
+
|
|
60
|
+
let _installed = false;
|
|
61
|
+
let _keyboardOpenedAt = -Infinity;
|
|
62
|
+
|
|
63
|
+
// ═══════════════════════════════════════════
|
|
64
|
+
// AREAS (context-menu-areas.js; re-exported here for the pages that already import this module)
|
|
65
|
+
// ═══════════════════════════════════════════
|
|
66
|
+
|
|
67
|
+
export { registerContextMenuArea };
|
|
68
|
+
|
|
69
|
+
// A row of the memory Explorer.
|
|
70
|
+
const explorerArea = {
|
|
71
|
+
id: 'memory-explorer',
|
|
72
|
+
match(el) {
|
|
73
|
+
const row = el?.closest?.('.explorer-memory[data-id]');
|
|
74
|
+
return row ? { kind: 'memory', memory: { id: row.dataset.id } } : null;
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// A memory card (ui-detail.js names its element after the memory's first 8 characters).
|
|
79
|
+
const cardArea = {
|
|
80
|
+
id: 'memory-card',
|
|
81
|
+
match(el) {
|
|
82
|
+
const card = el?.closest?.('.detail-card');
|
|
83
|
+
if (!card?.id) return null;
|
|
84
|
+
const open = getOpenCardsSnapshot().find((c) => card.id === `detail-card-${String(c.memoryId).slice(0, 8)}`);
|
|
85
|
+
return open ? { kind: 'memory', memory: { id: open.memoryId, card: true } } : null;
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
// ═══════════════════════════════════════════
|
|
90
|
+
// WHAT WAS CLICKED
|
|
91
|
+
// ═══════════════════════════════════════════
|
|
92
|
+
|
|
93
|
+
const elementOf = (node) => (node && node.nodeType !== 1 ? node.parentElement : node) || null;
|
|
94
|
+
|
|
95
|
+
// The selected text, when the right-click is on it (or the keyboard opened the menu while something is selected).
|
|
96
|
+
function selectionAt(el) {
|
|
97
|
+
const sel = window.getSelection?.();
|
|
98
|
+
if (!sel || sel.isCollapsed || !sel.rangeCount) return '';
|
|
99
|
+
const text = selectionPayload(sel.toString());
|
|
100
|
+
if (!text) return '';
|
|
101
|
+
if (!el || el === document.body || el === document.documentElement) return text;
|
|
102
|
+
for (let i = 0; i < sel.rangeCount; i++) {
|
|
103
|
+
try { if (sel.getRangeAt(i).intersectsNode(el)) return text; } catch { /* a node from another document */ }
|
|
104
|
+
}
|
|
105
|
+
return '';
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function linkAt(el) {
|
|
109
|
+
const a = el?.closest?.('a[href]');
|
|
110
|
+
if (!a) return null;
|
|
111
|
+
const raw = a.getAttribute('href');
|
|
112
|
+
let resolved = null;
|
|
113
|
+
try { resolved = new URL(raw, document.baseURI).href; } catch { /* not an address */ }
|
|
114
|
+
return usableLink(raw, resolved);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function imageAt(el) {
|
|
118
|
+
const img = el?.closest?.('img');
|
|
119
|
+
return img ? usableImage(img.currentSrc || img.src) : null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** What the menu is about for an element (null: the page itself). */
|
|
123
|
+
export function contextAt(el) {
|
|
124
|
+
return { selection: selectionAt(el), link: linkAt(el), image: imageAt(el), area: areaAt(el) };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ═══════════════════════════════════════════
|
|
128
|
+
// WHAT THE MENU CAN DO (the app's own functions)
|
|
129
|
+
// ═══════════════════════════════════════════
|
|
130
|
+
|
|
131
|
+
async function copyText(text) {
|
|
132
|
+
const value = String(text ?? '');
|
|
133
|
+
try {
|
|
134
|
+
if (navigator.clipboard?.writeText) { await navigator.clipboard.writeText(value); return true; }
|
|
135
|
+
} catch { /* not allowed here (an address that is not secure): the fallback below */ }
|
|
136
|
+
const area = document.createElement('textarea');
|
|
137
|
+
area.value = value;
|
|
138
|
+
area.setAttribute('readonly', '');
|
|
139
|
+
area.style.cssText = 'position:fixed;top:-1000px;left:0;opacity:0;';
|
|
140
|
+
document.body.appendChild(area);
|
|
141
|
+
area.select();
|
|
142
|
+
let ok = false;
|
|
143
|
+
try { ok = document.execCommand('copy'); } catch { /* nothing more to try */ }
|
|
144
|
+
area.remove();
|
|
145
|
+
return ok;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function toggleFullscreen() {
|
|
149
|
+
if (document.fullscreenElement) return document.exitFullscreen?.();
|
|
150
|
+
return document.documentElement.requestFullscreen?.();
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// The search bar's own path: its input event shows "Searching…", waits its debounce and searches.
|
|
154
|
+
function searchMemories(text) {
|
|
155
|
+
const query = selectionPayload(text, SEARCH_MAX);
|
|
156
|
+
const input = document.getElementById('search-input');
|
|
157
|
+
if (!input || !query) return;
|
|
158
|
+
input.value = query;
|
|
159
|
+
input.dispatchEvent(new Event('input', { bubbles: true }));
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const findNode = (id) => state.allNodes?.find((n) => n.id === id) || null;
|
|
163
|
+
|
|
164
|
+
// A memory the page has (the slim graph copy is enough to open it), else the one the server has.
|
|
165
|
+
async function withMemory(id, fn) {
|
|
166
|
+
const node = findNode(id);
|
|
167
|
+
if (node) return fn(node);
|
|
168
|
+
const full = await fetchMemory(id).catch(() => null);
|
|
169
|
+
if (full?.payload) return fn({ id, payload: full.payload });
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// The AI panel gets the whole memory (the graph's copy of its content is cut at 500 characters).
|
|
174
|
+
async function sendMemory(id) {
|
|
175
|
+
const full = await fetchMemory(id).catch(() => null);
|
|
176
|
+
const node = full?.payload ? { id, payload: full.payload } : findNode(id);
|
|
177
|
+
if (node) await sendToPanel(formatMemoryForCLI(node));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export const ACTIONS = {
|
|
181
|
+
back: () => history.back(),
|
|
182
|
+
forward: () => history.forward(),
|
|
183
|
+
reload: () => location.reload(),
|
|
184
|
+
copyText,
|
|
185
|
+
toggleFullscreen,
|
|
186
|
+
openInNewTab: (href) => { window.open(href, '_blank', 'noopener,noreferrer'); },
|
|
187
|
+
searchMemories,
|
|
188
|
+
sendText: (text) => sendToPanel(text),
|
|
189
|
+
runAction: (actionId) => runAction(actionId),
|
|
190
|
+
press: (id) => document.getElementById(id)?.click(),
|
|
191
|
+
emit: (name, payload) => emit(name, payload),
|
|
192
|
+
openMemory: (id) => withMemory(id, (node) => emit('node-selected', node)),
|
|
193
|
+
showLinked: (id) => withMemory(id, (node) => { emit('node-selected', node); focusLinkedMemories(node.id); }),
|
|
194
|
+
sendMemory,
|
|
195
|
+
closeCard: (id) => closeMemoryCard(id),
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
function canGoBack() {
|
|
199
|
+
const nav = window.navigation;
|
|
200
|
+
return typeof nav?.canGoBack === 'boolean' ? nav.canGoBack : history.length > 1;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function canGoForward() {
|
|
204
|
+
const nav = window.navigation;
|
|
205
|
+
return typeof nav?.canGoForward === 'boolean' ? nav.canGoForward : true; // unknown without the Navigation API
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/** The menu model's environment as the page is now (labels, keys and states are read at every open). */
|
|
209
|
+
export function menuEnv() {
|
|
210
|
+
return {
|
|
211
|
+
t,
|
|
212
|
+
shortcut: (actionId) => getShortcutLabel(actionId),
|
|
213
|
+
hasAction,
|
|
214
|
+
hasElement: (id) => !!document.getElementById(id),
|
|
215
|
+
isActive: (id) => !!document.getElementById(id)?.classList.contains('active'),
|
|
216
|
+
allowed: (perm) => !isGuest() || hasPermission(perm),
|
|
217
|
+
appIcon: (id) => (id && document.getElementById(id)?.querySelector('.menu-icon')?.innerHTML) || '',
|
|
218
|
+
page: {
|
|
219
|
+
url: location.href,
|
|
220
|
+
canGoBack: canGoBack(),
|
|
221
|
+
canGoForward: canGoForward(),
|
|
222
|
+
fullscreen: !!document.fullscreenElement,
|
|
223
|
+
fullscreenEnabled: document.fullscreenEnabled !== false && typeof document.documentElement.requestFullscreen === 'function',
|
|
224
|
+
},
|
|
225
|
+
act: ACTIONS,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// ═══════════════════════════════════════════
|
|
230
|
+
// OPENING
|
|
231
|
+
// ═══════════════════════════════════════════
|
|
232
|
+
|
|
233
|
+
// One menu at a time: the menubar, the dropdowns that listen for it, and the menus that only close on a click.
|
|
234
|
+
function closeOtherMenus() {
|
|
235
|
+
emit('panel:close-all-dropdowns');
|
|
236
|
+
document.getElementById('term-context-menu')?.classList.remove('open');
|
|
237
|
+
document.getElementById('context-menu')?.classList.remove('open');
|
|
238
|
+
document.querySelectorAll('.as-context-menu, .explorer-ctx-menu').forEach((el) => el.remove());
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function open(ctx, placement) {
|
|
242
|
+
const items = buildAppMenu(ctx, menuEnv());
|
|
243
|
+
closeOtherMenus();
|
|
244
|
+
return openContextMenu({ items, label: t('contextMenu.label'), ...placement });
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Open the app's menu from an area that detects its own right-click (the memory map, where a right-drag pans):
|
|
249
|
+
* what is at `target`, with `area` in place of what the registered areas would say.
|
|
250
|
+
* @param {{ x?: number, y?: number, target?: Element | null, area?: object | null, keyboard?: boolean,
|
|
251
|
+
* anchorRect?: DOMRect | null, returnFocus?: Element | null }} o
|
|
252
|
+
*/
|
|
253
|
+
export function openAppContextMenu({ x, y, target = null, area = null, keyboard = false, anchorRect = null, returnFocus } = {}) {
|
|
254
|
+
const el = elementOf(target);
|
|
255
|
+
const ctx = contextAt(el);
|
|
256
|
+
if (area) ctx.area = area;
|
|
257
|
+
return open(ctx, { x, y, anchorRect, keyboard, returnFocus: returnFocus === undefined ? document.activeElement : returnFocus });
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function onContextMenu(event) {
|
|
261
|
+
// The menu key's own contextmenu event, after its keydown opened the menu.
|
|
262
|
+
if (isContextMenuOpen() && performance.now() - _keyboardOpenedAt < KEY_ECHO_MS) { event.preventDefault(); return; }
|
|
263
|
+
const el = elementOf(event.target);
|
|
264
|
+
const reason = nativeMenuReason(event, {
|
|
265
|
+
inOwnMenu: !!el?.closest?.('.app-ctx-menu'),
|
|
266
|
+
editable: isEditableTarget(el),
|
|
267
|
+
optedOut: !!el?.closest?.(OPT_OUT),
|
|
268
|
+
});
|
|
269
|
+
if (reason === 'own-menu') { event.preventDefault(); return; }
|
|
270
|
+
if (reason) return;
|
|
271
|
+
event.preventDefault();
|
|
272
|
+
open(contextAt(el), { x: event.clientX, y: event.clientY, keyboard: false, returnFocus: document.activeElement });
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function onKeyDown(event) {
|
|
276
|
+
if (event.defaultPrevented || !isMenuKey(event) || isContextMenuOpen() || actionForKey(event)) return;
|
|
277
|
+
const active = document.activeElement;
|
|
278
|
+
const el = active && active !== document.body && active !== document.documentElement ? active : null;
|
|
279
|
+
if (el && (isEditableTarget(el) || el.closest(OPT_OUT) || el.closest('.app-ctx-menu'))) return;
|
|
280
|
+
event.preventDefault();
|
|
281
|
+
_keyboardOpenedAt = performance.now();
|
|
282
|
+
open(contextAt(el), { anchorRect: el?.getBoundingClientRect() || null, keyboard: true, returnFocus: el });
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** Install the app's right-click menu (once per page). */
|
|
286
|
+
export function initAppContextMenu() {
|
|
287
|
+
if (_installed) return;
|
|
288
|
+
_installed = true;
|
|
289
|
+
registerContextMenuArea(explorerArea);
|
|
290
|
+
registerContextMenuArea(cardArea);
|
|
291
|
+
// Bubble phase at the window: every handler of the page has had the event first.
|
|
292
|
+
window.addEventListener('contextmenu', onContextMenu);
|
|
293
|
+
// A menu key the user bound to an action stays that action (actionForKey), whichever listener runs first.
|
|
294
|
+
document.addEventListener('keydown', onKeyDown);
|
|
295
|
+
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import { on, emit } from './state.js';
|
|
10
10
|
import { KEYS } from './constants.js';
|
|
11
11
|
import { storage } from './storage.js';
|
|
12
|
+
import { clampToFrame } from './app-frame.js';
|
|
12
13
|
|
|
13
14
|
// ── State ──
|
|
14
15
|
|
|
@@ -39,10 +40,10 @@ export function initCostWidget() {
|
|
|
39
40
|
if (!_docked) {
|
|
40
41
|
const savedPos = _loadPos();
|
|
41
42
|
if (savedPos) {
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
_widget.style.left =
|
|
45
|
-
_widget.style.top =
|
|
43
|
+
// Inside the app frame (about 270 × 60 of it on screen)
|
|
44
|
+
const at = clampToFrame(savedPos.left, savedPos.top, 270, 60);
|
|
45
|
+
_widget.style.left = at.x + 'px';
|
|
46
|
+
_widget.style.top = at.y + 'px';
|
|
46
47
|
} else {
|
|
47
48
|
_widget.style.right = '24px';
|
|
48
49
|
_widget.style.bottom = '24px';
|
|
@@ -531,47 +532,47 @@ function _toggleCollapse() {
|
|
|
531
532
|
|
|
532
533
|
// ── Drag ──
|
|
533
534
|
|
|
534
|
-
function _makeDraggable(header) {
|
|
535
|
-
header.style.cursor = '
|
|
536
|
-
|
|
537
|
-
header.addEventListener('mousedown', (e) => {
|
|
535
|
+
function _makeDraggable(header) {
|
|
536
|
+
header.style.cursor = 'move';
|
|
537
|
+
|
|
538
|
+
header.addEventListener('mousedown', (e) => {
|
|
538
539
|
if (e.target.closest('.cw-collapse') || e.target.closest('.cw-scan')) return;
|
|
539
540
|
e.preventDefault();
|
|
540
541
|
|
|
541
542
|
// If docked, undock on drag
|
|
542
543
|
if (_docked) _undock();
|
|
543
|
-
|
|
544
|
-
const rect = _widget.getBoundingClientRect();
|
|
545
|
-
_drag = {
|
|
546
|
-
startX: e.clientX,
|
|
547
|
-
startY: e.clientY,
|
|
548
|
-
origLeft: rect.left,
|
|
549
|
-
origTop: rect.top,
|
|
550
|
-
width: rect.width,
|
|
551
|
-
height: rect.height,
|
|
552
|
-
};
|
|
553
|
-
let dragRaf = 0;
|
|
554
|
-
let pendingPos = null;
|
|
555
|
-
const applyDrag = () => {
|
|
556
|
-
dragRaf = 0;
|
|
557
|
-
if (!_widget || !pendingPos) return;
|
|
558
|
-
_widget.style.left = pendingPos.left + 'px';
|
|
559
|
-
_widget.style.top = pendingPos.top + 'px';
|
|
560
|
-
};
|
|
561
|
-
const scheduleDrag = (left, top) => {
|
|
562
|
-
pendingPos = { left, top };
|
|
563
|
-
if (!dragRaf) dragRaf = requestAnimationFrame(applyDrag);
|
|
564
|
-
};
|
|
565
|
-
const flushDrag = () => {
|
|
566
|
-
if (dragRaf) {
|
|
567
|
-
cancelAnimationFrame(dragRaf);
|
|
568
|
-
dragRaf = 0;
|
|
569
|
-
}
|
|
570
|
-
applyDrag();
|
|
571
|
-
};
|
|
572
|
-
header.style.cursor = '
|
|
573
|
-
|
|
574
|
-
// Reset right/bottom positioning and switch to left/top
|
|
544
|
+
|
|
545
|
+
const rect = _widget.getBoundingClientRect();
|
|
546
|
+
_drag = {
|
|
547
|
+
startX: e.clientX,
|
|
548
|
+
startY: e.clientY,
|
|
549
|
+
origLeft: rect.left,
|
|
550
|
+
origTop: rect.top,
|
|
551
|
+
width: rect.width,
|
|
552
|
+
height: rect.height,
|
|
553
|
+
};
|
|
554
|
+
let dragRaf = 0;
|
|
555
|
+
let pendingPos = null;
|
|
556
|
+
const applyDrag = () => {
|
|
557
|
+
dragRaf = 0;
|
|
558
|
+
if (!_widget || !pendingPos) return;
|
|
559
|
+
_widget.style.left = pendingPos.left + 'px';
|
|
560
|
+
_widget.style.top = pendingPos.top + 'px';
|
|
561
|
+
};
|
|
562
|
+
const scheduleDrag = (left, top) => {
|
|
563
|
+
pendingPos = { left, top };
|
|
564
|
+
if (!dragRaf) dragRaf = requestAnimationFrame(applyDrag);
|
|
565
|
+
};
|
|
566
|
+
const flushDrag = () => {
|
|
567
|
+
if (dragRaf) {
|
|
568
|
+
cancelAnimationFrame(dragRaf);
|
|
569
|
+
dragRaf = 0;
|
|
570
|
+
}
|
|
571
|
+
applyDrag();
|
|
572
|
+
};
|
|
573
|
+
header.style.cursor = 'move';
|
|
574
|
+
|
|
575
|
+
// Reset right/bottom positioning and switch to left/top
|
|
575
576
|
_widget.style.right = 'auto';
|
|
576
577
|
_widget.style.bottom = 'auto';
|
|
577
578
|
_widget.style.left = _drag.origLeft + 'px';
|
|
@@ -581,25 +582,22 @@ function _makeDraggable(header) {
|
|
|
581
582
|
if (!_drag) return;
|
|
582
583
|
const dx = ev.clientX - _drag.startX;
|
|
583
584
|
const dy = ev.clientY - _drag.startY;
|
|
584
|
-
let newLeft = _drag.origLeft + dx;
|
|
585
|
-
let newTop = _drag.origTop + dy;
|
|
586
|
-
// Constrain to
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
_savePos(parseInt(_widget.style.left), parseInt(_widget.style.top));
|
|
601
|
-
_drag = null;
|
|
602
|
-
}
|
|
585
|
+
let newLeft = _drag.origLeft + dx;
|
|
586
|
+
let newTop = _drag.origTop + dy;
|
|
587
|
+
// Constrain to the app frame
|
|
588
|
+
({ x: newLeft, y: newTop } = clampToFrame(newLeft, newTop, _drag.width, _drag.height));
|
|
589
|
+
scheduleDrag(newLeft, newTop);
|
|
590
|
+
};
|
|
591
|
+
|
|
592
|
+
const onUp = () => {
|
|
593
|
+
document.removeEventListener('mousemove', onMove);
|
|
594
|
+
document.removeEventListener('mouseup', onUp);
|
|
595
|
+
header.style.cursor = 'move';
|
|
596
|
+
if (_drag) {
|
|
597
|
+
flushDrag();
|
|
598
|
+
_savePos(parseInt(_widget.style.left), parseInt(_widget.style.top));
|
|
599
|
+
_drag = null;
|
|
600
|
+
}
|
|
603
601
|
};
|
|
604
602
|
|
|
605
603
|
document.addEventListener('mousemove', onMove);
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — the notice after an automatic restart: the page side
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Asks GET /api/system/crash-notice when the page starts and every time its sync
|
|
6
|
+
// socket connects: a page that was open through the crash is not reloaded, its
|
|
7
|
+
// sockets reconnect (ui-sync.js `session:info`). What crash-notice-view.js says is
|
|
8
|
+
// drawn in the update toast's shape (bottom right, styles.css .update-check-toast,
|
|
9
|
+
// .crash-notice) once the loading screen is gone, and stays until it is dismissed.
|
|
10
|
+
// Dismiss asks the server to drop it (POST /api/system/crash-notice/dismiss), which
|
|
11
|
+
// tells every other window (`sync:crash-notice:changed`); this browser also keeps
|
|
12
|
+
// the id it dismissed, for a server that could not remove its record. Open logs
|
|
13
|
+
// is Settings > App's own: the desktop app's bridge, or POST
|
|
14
|
+
// /api/system/app/open-folder, which only a page on this computer may ask. Never
|
|
15
|
+
// asked by an invite guest, and never drawn for one, whatever reaches its sync
|
|
16
|
+
// socket: /api/system is the owner's (the server sends `crash-notice:` to the
|
|
17
|
+
// owner's pages only).
|
|
18
|
+
|
|
19
|
+
import { on } from './state.js';
|
|
20
|
+
import { getLocale, t } from './i18n.js';
|
|
21
|
+
import { desktopApp } from './desktop-bridge.js';
|
|
22
|
+
import { isGuest } from './ui-sync.js';
|
|
23
|
+
import { crashNoticeView, isLoopbackHost, readCrashNotice } from './crash-notice-view.js';
|
|
24
|
+
|
|
25
|
+
const NOTICE_URL = '/api/system/crash-notice';
|
|
26
|
+
const OPEN_FOLDER_URL = '/api/system/app/open-folder';
|
|
27
|
+
const WRITE = Object.freeze({ 'Content-Type': 'application/json', 'X-SynaBun-UI': '1', Accept: 'application/json' });
|
|
28
|
+
const DISMISSED_KEY = 'synabun-crash-notice-dismissed';
|
|
29
|
+
const NOTICE_ID = 'crash-notice';
|
|
30
|
+
|
|
31
|
+
const translate = (key, params) => t(`crashNotice.${key}`, params);
|
|
32
|
+
|
|
33
|
+
let _wired = false;
|
|
34
|
+
let _asking = null;
|
|
35
|
+
let _current = null; // { id, el }
|
|
36
|
+
let _waiting = null; // the notice that waits for the loading screen to go
|
|
37
|
+
let _guest = false; // what the last `session:info` said (ui-sync.js isGuest() is the socket's own word)
|
|
38
|
+
|
|
39
|
+
const guestPage = () => _guest || isGuest();
|
|
40
|
+
|
|
41
|
+
function esc(value) {
|
|
42
|
+
return String(value ?? '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function dismissedHere(id) {
|
|
46
|
+
try { return localStorage.getItem(DISMISSED_KEY) === id; } catch { return false; }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function rememberDismissed(id) {
|
|
50
|
+
try { localStorage.setItem(DISMISSED_KEY, id); } catch { /* storage refused: the server's word is enough */ }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function canOpenLogs() {
|
|
54
|
+
if (typeof desktopApp()?.openFolder === 'function') return true;
|
|
55
|
+
return isLoopbackHost(location.hostname);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function hide() {
|
|
59
|
+
const current = _current;
|
|
60
|
+
_current = null;
|
|
61
|
+
if (!current) return;
|
|
62
|
+
current.el.classList.remove('show');
|
|
63
|
+
setTimeout(() => current.el.remove(), 250);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** The loading screen covers the page while it starts: the notice waits for it to go. */
|
|
67
|
+
function whenPageShown(run) {
|
|
68
|
+
const overlay = document.getElementById('loading-overlay');
|
|
69
|
+
if (!overlay || overlay.classList.contains('hidden')) { run(); return; }
|
|
70
|
+
const watch = new MutationObserver(() => {
|
|
71
|
+
if (!overlay.classList.contains('hidden')) return;
|
|
72
|
+
watch.disconnect();
|
|
73
|
+
run();
|
|
74
|
+
});
|
|
75
|
+
watch.observe(overlay, { attributes: true, attributeFilter: ['class'] });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function show(view) {
|
|
79
|
+
hide();
|
|
80
|
+
document.querySelectorAll(`#${NOTICE_ID}`).forEach((el) => el.remove());
|
|
81
|
+
const el = document.createElement('div');
|
|
82
|
+
el.className = 'update-check-toast crash-notice';
|
|
83
|
+
el.id = NOTICE_ID;
|
|
84
|
+
el.setAttribute('role', 'status');
|
|
85
|
+
el.setAttribute('aria-label', view.label);
|
|
86
|
+
el.dataset.noticeId = view.id;
|
|
87
|
+
const buttons = view.actions.map((item) => `<button class="action-btn action-btn--ghost crash-notice-btn" type="button" data-crash-action="${esc(item.id)}" id="crash-notice-${esc(item.id)}">${esc(item.label)}</button>`).join('');
|
|
88
|
+
el.innerHTML = `
|
|
89
|
+
<div class="utc-icon utc-icon--err" aria-hidden="true">!</div>
|
|
90
|
+
<div class="utc-body">
|
|
91
|
+
<div class="utc-title" id="crash-notice-title">${esc(view.title)}</div>
|
|
92
|
+
<div class="utc-sub" id="crash-notice-when">${esc(view.when)}</div>
|
|
93
|
+
${view.how ? `<div class="utc-sub" id="crash-notice-how">${esc(view.how)}</div>` : ''}
|
|
94
|
+
<div class="crash-notice-lost-title" id="crash-notice-lost-title">${esc(view.lostTitle)}</div>
|
|
95
|
+
<ul class="utc-list crash-notice-lost" aria-labelledby="crash-notice-lost-title">${view.lost.map((line) => `<li>${esc(line)}</li>`).join('')}</ul>
|
|
96
|
+
<div class="utc-sub crash-notice-note" id="crash-notice-note" role="status" hidden></div>
|
|
97
|
+
<div class="update-notice-actions">${buttons}</div>
|
|
98
|
+
</div>`;
|
|
99
|
+
el.querySelectorAll('[data-crash-action]').forEach((btn) => {
|
|
100
|
+
btn.addEventListener('click', (event) => {
|
|
101
|
+
event.stopPropagation();
|
|
102
|
+
if (btn.dataset.crashAction === 'dismiss') dismiss(view.id);
|
|
103
|
+
else if (btn.dataset.crashAction === 'logs') openLogs(el);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
document.body.appendChild(el);
|
|
107
|
+
requestAnimationFrame(() => el.classList.add('show'));
|
|
108
|
+
_current = { id: view.id, el };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Show this notice (or none): once per crash, never one this browser dismissed, never on a guest's page. */
|
|
112
|
+
function present(notice) {
|
|
113
|
+
if (!notice || guestPage()) {
|
|
114
|
+
_waiting = null;
|
|
115
|
+
hide();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// A notice something else took off the page is drawn again: it stays until it is dismissed.
|
|
119
|
+
if (_current && !_current.el.isConnected) _current = null;
|
|
120
|
+
if (dismissedHere(notice.id) || _current?.id === notice.id || _waiting?.id === notice.id) return;
|
|
121
|
+
_waiting = notice;
|
|
122
|
+
whenPageShown(() => {
|
|
123
|
+
if (_waiting !== notice) return;
|
|
124
|
+
_waiting = null;
|
|
125
|
+
if (dismissedHere(notice.id) || guestPage()) return;
|
|
126
|
+
show(crashNoticeView(notice, { t: translate, locale: getLocale(), canOpenLogs: canOpenLogs() }));
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Ask the server; an older server (404) or a guest (403) has nothing to say. */
|
|
131
|
+
export function checkCrashNotice() {
|
|
132
|
+
if (guestPage()) return Promise.resolve(null);
|
|
133
|
+
if (_asking) return _asking;
|
|
134
|
+
_asking = (async () => {
|
|
135
|
+
try {
|
|
136
|
+
const res = await fetch(NOTICE_URL, { headers: { Accept: 'application/json' }, cache: 'no-store' });
|
|
137
|
+
if (!res.ok) return null;
|
|
138
|
+
const notice = readCrashNotice(await res.json());
|
|
139
|
+
present(notice);
|
|
140
|
+
return notice;
|
|
141
|
+
} catch {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
})().finally(() => { _asking = null; });
|
|
145
|
+
return _asking;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function dismiss(id) {
|
|
149
|
+
rememberDismissed(id);
|
|
150
|
+
hide();
|
|
151
|
+
try {
|
|
152
|
+
const res = await fetch(`${NOTICE_URL}/dismiss`, { method: 'POST', headers: WRITE, body: JSON.stringify({ id }) });
|
|
153
|
+
const next = res.ok ? readCrashNotice(await res.json()) : null;
|
|
154
|
+
// A newer crash came while this one was shown: that one is news.
|
|
155
|
+
if (next && next.id !== id) present(next);
|
|
156
|
+
} catch { /* the server is away: this browser keeps it dismissed */ }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async function openLogs(el) {
|
|
160
|
+
const note = el.querySelector('#crash-notice-note');
|
|
161
|
+
const bridge = desktopApp();
|
|
162
|
+
let ok = false;
|
|
163
|
+
if (typeof bridge?.openFolder === 'function') {
|
|
164
|
+
try { ok = !!(await bridge.openFolder('logs'))?.ok; } catch { ok = false; }
|
|
165
|
+
} else {
|
|
166
|
+
try {
|
|
167
|
+
const res = await fetch(OPEN_FOLDER_URL, { method: 'POST', headers: WRITE, body: JSON.stringify({ which: 'logs' }) });
|
|
168
|
+
ok = res.ok;
|
|
169
|
+
} catch { ok = false; }
|
|
170
|
+
}
|
|
171
|
+
if (!note) return;
|
|
172
|
+
note.hidden = ok;
|
|
173
|
+
note.textContent = ok ? '' : translate('openLogsFailed');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/** Wire the notice once: ask now, and again every time the sync socket connects. */
|
|
177
|
+
export function initCrashNotice() {
|
|
178
|
+
if (_wired) return;
|
|
179
|
+
_wired = true;
|
|
180
|
+
on('session:info', (info) => {
|
|
181
|
+
_guest = !!info?.isGuest;
|
|
182
|
+
if (_guest) present(null);
|
|
183
|
+
else checkCrashNotice();
|
|
184
|
+
});
|
|
185
|
+
on('sync:crash-notice:changed', (message) => present(readCrashNotice(message)));
|
|
186
|
+
checkCrashNotice();
|
|
187
|
+
}
|