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,440 @@
|
|
|
1
|
+
// The Workspace tour's board: hand-drawn ink on an SVG layer. One layer sits
|
|
2
|
+
// over the Assistant panel's root (the transcript is the whiteboard), a second,
|
|
3
|
+
// fixed one covers the page for the highlight ring, which rings controls in the
|
|
4
|
+
// panel, its header and the title bar alike. Shapes come from tour-ink.js
|
|
5
|
+
// (smooth closed and open curves, a slow seeded wander, no hard corner) and are
|
|
6
|
+
// revealed pen-first with stroke-dashoffset through WAAPI on the Assistant's
|
|
7
|
+
// eased curves; handwriting (Caveat) is wiped in with a clip-path, or rises in
|
|
8
|
+
// where the engine cannot animate a clip-path on SVG text (checked once).
|
|
9
|
+
// Erasing un-draws the newest stroke first. The highlight is ONE ring that
|
|
10
|
+
// springs from control to control: its shape (centre, size, pads, corners) is
|
|
11
|
+
// sprung on the shared ticker (the mascot's loop) and the ring (softRingPath:
|
|
12
|
+
// a few anchors, exact sides and corners) is made from it each frame, so it
|
|
13
|
+
// morphs without a jitter; it is drawn on with a
|
|
14
|
+
// WAAPI stroke reveal and fades in place when no control is meant. Both layers
|
|
15
|
+
// keep a hole where the mascot is (setKeepOut): ink never paints over it. Under
|
|
16
|
+
// reduced motion everything is placed finished. Only SVG path data, transform,
|
|
17
|
+
// opacity and the keep-out's rect ever change.
|
|
18
|
+
import { subscribe } from '../synabun-ticker.js';
|
|
19
|
+
import { arrowGeometry, closedSmoothPath, ellipsePoints, pointsToSmoothPath, softBoxPath, softRingPath, springStep, underlinePoints } from './tour-ink.js';
|
|
20
|
+
|
|
21
|
+
const NS = 'http://www.w3.org/2000/svg';
|
|
22
|
+
export const EASE = {
|
|
23
|
+
draw: 'cubic-bezier(.2,0,.38,.9)', // --asst-ease-standard: a pen that starts and settles
|
|
24
|
+
enter: 'cubic-bezier(0,0,.38,.9)', // --asst-ease-enter
|
|
25
|
+
exit: 'cubic-bezier(.2,0,1,.9)', // --asst-ease-exit
|
|
26
|
+
emphasized: 'cubic-bezier(.4,.14,.3,1)', // --asst-ease-emphasized
|
|
27
|
+
spring: 'linear(0, 0.35 9%, 0.78 21%, 1.03 40%, 0.99 60%, 1)', // --asst-ease-spring
|
|
28
|
+
};
|
|
29
|
+
export const INK = { stroke: 380, label: 340, ring: 460, arrow: 360, erase: 220, stagger: 30 };
|
|
30
|
+
|
|
31
|
+
let clipSupport = null;
|
|
32
|
+
/** Can this engine animate a clip-path on SVG text? (Chromium yes; WebKit has not.) Checked once. */
|
|
33
|
+
function clipAnimates(svg) {
|
|
34
|
+
if (clipSupport != null) return clipSupport;
|
|
35
|
+
clipSupport = false;
|
|
36
|
+
try {
|
|
37
|
+
const probe = document.createElementNS(NS, 'text');
|
|
38
|
+
probe.textContent = 'x';
|
|
39
|
+
svg.appendChild(probe);
|
|
40
|
+
const anim = probe.animate([{ clipPath: 'inset(0px 100% 0px 0px)' }, { clipPath: 'inset(0px 0% 0px 0px)' }], { duration: 1000, fill: 'both' });
|
|
41
|
+
anim.pause();
|
|
42
|
+
anim.currentTime = 500;
|
|
43
|
+
const value = getComputedStyle(probe).clipPath || '';
|
|
44
|
+
clipSupport = /inset\(/.test(value) && /50%/.test(value);
|
|
45
|
+
anim.cancel();
|
|
46
|
+
probe.remove();
|
|
47
|
+
} catch { clipSupport = false; }
|
|
48
|
+
return clipSupport;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
let maskSeq = 0;
|
|
52
|
+
const FAR = 100000; // the mask's extent: the whole layer, whatever it holds
|
|
53
|
+
|
|
54
|
+
export function createStage(host, { fixed = false, reduced = () => false, className = '' } = {}) {
|
|
55
|
+
const svg = document.createElementNS(NS, 'svg');
|
|
56
|
+
svg.setAttribute('class', `${fixed ? 'tour-page' : 'tour-board'}${className ? ` ${className}` : ''}`);
|
|
57
|
+
svg.setAttribute('aria-hidden', 'true');
|
|
58
|
+
svg.setAttribute('focusable', 'false');
|
|
59
|
+
// Every stroke goes in one group; while the mascot is on the board the group is masked with a hole
|
|
60
|
+
// where the mascot is (setKeepOut), so nothing on this layer ever paints over it.
|
|
61
|
+
const maskId = `tour-keepout-${(maskSeq += 1)}`;
|
|
62
|
+
svg.innerHTML = `<defs><mask id="${maskId}" maskUnits="userSpaceOnUse" x="${-FAR}" y="${-FAR}" width="${2 * FAR}" height="${2 * FAR}">`
|
|
63
|
+
+ `<rect x="${-FAR}" y="${-FAR}" width="${2 * FAR}" height="${2 * FAR}" fill="#fff"/><rect class="tour-keepout" fill="#000" x="0" y="0" width="0" height="0"/></mask></defs>`
|
|
64
|
+
+ '<g class="tour-inkset"></g>';
|
|
65
|
+
const ink = svg.lastChild;
|
|
66
|
+
const hole = svg.querySelector('.tour-keepout');
|
|
67
|
+
host.appendChild(svg);
|
|
68
|
+
const live = new Set(); // { el, kind, anim }
|
|
69
|
+
let seq = 0;
|
|
70
|
+
// Client → layer coordinates: the board's origin is read once per shape (the panel may still be sliding in
|
|
71
|
+
// when the tour opens), never per frame; the keep-out, which moves every frame of a flight, uses the last read.
|
|
72
|
+
let at = null;
|
|
73
|
+
const measure = () => { at = fixed ? { left: 0, top: 0 } : host.getBoundingClientRect(); return at; };
|
|
74
|
+
const origin = () => measure();
|
|
75
|
+
const local = (p, o = origin()) => ({ x: p.x - o.left, y: p.y - o.top });
|
|
76
|
+
const localPts = (pts, o = origin()) => pts.map(([x, y]) => [x - o.left, y - o.top]);
|
|
77
|
+
let keepOut = null;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* The mascot's box (a client rect, or null when it is not on the board): a
|
|
81
|
+
* hole in this layer, so no ink paints over it. Cheap enough for every frame
|
|
82
|
+
* of a flight: four attributes, no layout read.
|
|
83
|
+
*/
|
|
84
|
+
function setKeepOut(rect) {
|
|
85
|
+
const o = at || measure();
|
|
86
|
+
if (!rect || !(rect.width > 0) || !(rect.height > 0)) {
|
|
87
|
+
if (keepOut) { ink.removeAttribute('mask'); keepOut = null; }
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const x = rect.left - o.left;
|
|
91
|
+
const y = rect.top - o.top;
|
|
92
|
+
const r = Math.min(16, rect.width / 2, rect.height / 2);
|
|
93
|
+
const next = `${x.toFixed(1)} ${y.toFixed(1)} ${rect.width.toFixed(1)} ${rect.height.toFixed(1)}`;
|
|
94
|
+
if (keepOut === next) return;
|
|
95
|
+
hole.setAttribute('x', x.toFixed(1));
|
|
96
|
+
hole.setAttribute('y', y.toFixed(1));
|
|
97
|
+
hole.setAttribute('width', rect.width.toFixed(1));
|
|
98
|
+
hole.setAttribute('height', rect.height.toFixed(1));
|
|
99
|
+
hole.setAttribute('rx', r.toFixed(1));
|
|
100
|
+
if (!keepOut) ink.setAttribute('mask', `url(#${maskId})`);
|
|
101
|
+
keepOut = next;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function pathEl(d, cls) {
|
|
105
|
+
const el = document.createElementNS(NS, 'path');
|
|
106
|
+
el.setAttribute('class', `tour-ink ${cls}`);
|
|
107
|
+
el.setAttribute('d', d);
|
|
108
|
+
el.setAttribute('pathLength', '1');
|
|
109
|
+
ink.appendChild(el);
|
|
110
|
+
return el;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Reveal a path pen-first (pathLength 1: the dash is the whole stroke). Resolves when drawn. */
|
|
114
|
+
function reveal(el, duration = INK.stroke, delay = 0) {
|
|
115
|
+
const handle = { el, kind: 'path', anim: null };
|
|
116
|
+
live.add(handle);
|
|
117
|
+
el.style.strokeDasharray = '1 1';
|
|
118
|
+
if (reduced() || duration <= 0) { el.style.strokeDashoffset = '0'; return Promise.resolve(handle); }
|
|
119
|
+
el.style.strokeDashoffset = '1';
|
|
120
|
+
const anim = el.animate([{ strokeDashoffset: 1 }, { strokeDashoffset: 0 }], { duration, delay, easing: EASE.draw, fill: 'forwards' });
|
|
121
|
+
handle.anim = anim;
|
|
122
|
+
return anim.finished.then(() => { el.style.strokeDashoffset = '0'; anim.cancel(); handle.anim = null; return handle; }).catch(() => handle);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** A smooth stroke through client points. */
|
|
126
|
+
function stroke(points, { cls = 'ink', duration = INK.stroke, delay = 0, closed = false } = {}) {
|
|
127
|
+
const pts = localPts(points.map(p => (Array.isArray(p) ? p : [p.x, p.y])));
|
|
128
|
+
return reveal(pathEl(closed ? closedSmoothPath(pts) : pointsToSmoothPath(pts), cls), duration, delay);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** A client rect in this layer's coordinates. */
|
|
132
|
+
const localRect = (r, o = origin()) => ({ left: r.left - o.left, top: r.top - o.top, width: r.width, height: r.height });
|
|
133
|
+
|
|
134
|
+
/** Path data already in this layer's coordinates, revealed pen-first. */
|
|
135
|
+
function path(d, { cls = 'ink', duration = INK.stroke, delay = 0 } = {}) {
|
|
136
|
+
return reveal(pathEl(d, cls), duration, delay);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** A rounded hand-drawn box around a client rect (tour-ink.js softBoxPath: exact sides and corners). */
|
|
140
|
+
function box(rect, { pad = 0, radius = 10, seed = `b${seq++}`, cls = 'ink', duration = INK.stroke, delay = 0 } = {}) {
|
|
141
|
+
return path(softBoxPath(localRect(rect), { pad, radius, seed }).d, { cls, duration, delay });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** A soft ring around a client rect (one-off ink; the travelling highlight is createHighlight). */
|
|
145
|
+
function ring(rect, { pad = 6, seed = `r${seq++}`, cls = 'gold', duration = INK.ring, delay = 0 } = {}) {
|
|
146
|
+
return path(softRingPath(localRect(rect), { pad, seed }).d, { cls, duration, delay });
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** A bowed arrow between client points; the head (one stroke: wing, tip, wing) is drawn after the shaft. */
|
|
150
|
+
async function arrow(from, to, { curve = 0.16, seed = `a${seq++}`, cls = 'gold', duration = INK.arrow, delay = 0, head = 7 } = {}) {
|
|
151
|
+
const g = arrowGeometry(from, to, { curve, seed, head });
|
|
152
|
+
await stroke(g.shaft, { cls, duration, delay });
|
|
153
|
+
const [a, tip, b] = localPts(g.head);
|
|
154
|
+
const r2 = v => Math.round(v * 100) / 100;
|
|
155
|
+
return reveal(pathEl(`M ${r2(a[0])} ${r2(a[1])} L ${r2(tip[0])} ${r2(tip[1])} L ${r2(b[0])} ${r2(b[1])}`, `${cls} tour-head`), 150);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Handwriting (Caveat) at a client point, written left to right. With
|
|
160
|
+
* `place(size)` the writing is measured first (size: { w, top, bottom }, px
|
|
161
|
+
* from its baseline) and goes where place() says ({ x, y, anchor }, client
|
|
162
|
+
* px), before a stroke of it is shown.
|
|
163
|
+
*/
|
|
164
|
+
function label(text, at, { cls = '', anchor = 'start', duration = INK.label, delay = 0, place = null } = {}) {
|
|
165
|
+
const el = document.createElementNS(NS, 'text');
|
|
166
|
+
el.setAttribute('class', `tour-hand ${cls}`.trim());
|
|
167
|
+
const put = (p, a) => {
|
|
168
|
+
const q = local(p);
|
|
169
|
+
el.setAttribute('x', String(Math.round(q.x * 10) / 10));
|
|
170
|
+
el.setAttribute('y', String(Math.round(q.y * 10) / 10));
|
|
171
|
+
el.setAttribute('text-anchor', a);
|
|
172
|
+
};
|
|
173
|
+
put(at, anchor);
|
|
174
|
+
el.textContent = text;
|
|
175
|
+
ink.appendChild(el);
|
|
176
|
+
if (typeof place === 'function') {
|
|
177
|
+
try {
|
|
178
|
+
el.setAttribute('text-anchor', 'start');
|
|
179
|
+
const bb = el.getBBox();
|
|
180
|
+
const y0 = Number(el.getAttribute('y')) || 0;
|
|
181
|
+
const spot = place({ w: bb.width, top: bb.y - y0, bottom: bb.y + bb.height - y0 });
|
|
182
|
+
if (spot) put(spot, spot.anchor || anchor);
|
|
183
|
+
else el.setAttribute('text-anchor', anchor);
|
|
184
|
+
} catch { el.setAttribute('text-anchor', anchor); }
|
|
185
|
+
}
|
|
186
|
+
const handle = { el, kind: 'text', anim: null };
|
|
187
|
+
live.add(handle);
|
|
188
|
+
if (reduced() || duration <= 0) return Promise.resolve(handle);
|
|
189
|
+
let width = 60;
|
|
190
|
+
try { width = Math.max(1, el.getBBox().width); } catch { /* not laid out */ }
|
|
191
|
+
const ms = Math.max(duration, Math.min(900, width * 4)); // about 4 ms a px: a pen, not a wipe
|
|
192
|
+
const anim = clipAnimates(svg)
|
|
193
|
+
? el.animate([{ clipPath: 'inset(-30% 100% -30% -6%)' }, { clipPath: 'inset(-30% -6% -30% -6%)' }], { duration: ms, delay, easing: EASE.draw, fill: 'both' })
|
|
194
|
+
: el.animate([{ opacity: 0, transform: 'translateY(3px)' }, { opacity: 1, transform: 'none' }], { duration: Math.min(ms, 420), delay, easing: EASE.enter, fill: 'both' });
|
|
195
|
+
handle.anim = anim;
|
|
196
|
+
return anim.finished.then(() => { anim.cancel(); handle.anim = null; return handle; }).catch(() => handle);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** A short wavy underline under a client rect. */
|
|
200
|
+
function underline(rect, { seed = `u${seq++}`, cls = 'gold', duration = 280, delay = 0, offset = 4 } = {}) {
|
|
201
|
+
return stroke(underlinePoints(rect, { seed, offset }), { cls, duration, delay });
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** An open ellipse (a drum's top, a clock face, a globe). */
|
|
205
|
+
function ellipse(cx, cy, rx, ry, { seed = `e${seq++}`, cls = 'ink', duration = 340, delay = 0, turns = 1.04, start } = {}) {
|
|
206
|
+
return stroke(ellipsePoints(cx, cy, rx, ry, { seed, turns, start }), { cls, duration, delay });
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Everything on the layer leaves, newest first: strokes un-draw toward their
|
|
211
|
+
* start, writing fades and sinks. A wipe, never a cut.
|
|
212
|
+
*/
|
|
213
|
+
async function erase({ duration = INK.erase, stagger = INK.stagger } = {}) {
|
|
214
|
+
const items = [...live].reverse();
|
|
215
|
+
live.clear();
|
|
216
|
+
if (!items.length) return;
|
|
217
|
+
if (reduced()) { for (const h of items) { h.anim?.cancel(); h.el.remove(); } return; }
|
|
218
|
+
await Promise.all(items.map((h, i) => {
|
|
219
|
+
// Continue from where a reveal in flight has got to (its current dash), never from finished.
|
|
220
|
+
let from = 0;
|
|
221
|
+
if (h.kind === 'path' && h.anim) {
|
|
222
|
+
try { from = Number(getComputedStyle(h.el).strokeDashoffset.replace('px', '')) || 0; } catch { from = 0; }
|
|
223
|
+
}
|
|
224
|
+
h.anim?.cancel();
|
|
225
|
+
const delay = Math.min(i, 8) * stagger;
|
|
226
|
+
let anim;
|
|
227
|
+
if (h.kind === 'path') {
|
|
228
|
+
h.el.style.strokeDashoffset = String(from);
|
|
229
|
+
anim = h.el.animate([{ strokeDashoffset: from }, { strokeDashoffset: -1 }], { duration, delay, easing: EASE.exit, fill: 'forwards' });
|
|
230
|
+
} else {
|
|
231
|
+
anim = h.el.animate([{ opacity: 1, transform: 'none' }, { opacity: 0, transform: 'translateY(2px)' }], { duration: duration * 0.9, delay, easing: EASE.exit, fill: 'forwards' });
|
|
232
|
+
}
|
|
233
|
+
return anim.finished.catch(() => {}).then(() => h.el.remove());
|
|
234
|
+
}));
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function clear() { for (const h of live) { h.anim?.cancel(); h.el.remove(); } live.clear(); }
|
|
238
|
+
function destroy() { clear(); svg.remove(); }
|
|
239
|
+
|
|
240
|
+
/** The client boxes of what is on the layer now (strokes and writing), for layout: [{ left, top, right, bottom, kind }]. */
|
|
241
|
+
function boxes() {
|
|
242
|
+
const out = [];
|
|
243
|
+
for (const h of live) {
|
|
244
|
+
try {
|
|
245
|
+
const r = h.el.getBoundingClientRect();
|
|
246
|
+
if (r.width || r.height) out.push({ left: r.left, top: r.top, right: r.right, bottom: r.bottom, kind: h.kind });
|
|
247
|
+
} catch { /* not laid out */ }
|
|
248
|
+
}
|
|
249
|
+
return out;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return {
|
|
253
|
+
el: svg, ink, stroke, path, box, ring, arrow, label, underline, ellipse, erase, clear, destroy, local, localRect, measure, setKeepOut, boxes,
|
|
254
|
+
get count() { return live.size; },
|
|
255
|
+
get keepOut() { return keepOut; },
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/** Two short dashes and a dot to the side of a point: a tiny sparkle (celebration). */
|
|
260
|
+
export function sparkle(stage, at, { cls = 'gold' } = {}) {
|
|
261
|
+
const arms = [[-1, -1], [1, -1], [0.1, 1.25]];
|
|
262
|
+
return Promise.all(arms.map(([ax, ay], i) => stage.stroke(
|
|
263
|
+
[{ x: at.x + ax * 5, y: at.y + ay * 5 }, { x: at.x + ax * 11, y: at.y + ay * 11 }],
|
|
264
|
+
{ cls, duration: 160, delay: i * 50 },
|
|
265
|
+
)));
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* The one highlight ring. to(rect, shape) rings a control: the first time it
|
|
270
|
+
* is drawn on there (a WAAPI stroke reveal, pen-first), after that it springs
|
|
271
|
+
* from the control it rings now: centre, size, pads and corner radius all
|
|
272
|
+
* glide on one spring, and the ring (softRingPath) is made from that shape
|
|
273
|
+
* every frame, so it morphs without a jump, a jitter or a shimmer; to(null) lets it
|
|
274
|
+
* fade where it is. A resize or scroll is the host's to call: refresh(rect)
|
|
275
|
+
* moves it there. Frames come from the shared ticker, only while it moves.
|
|
276
|
+
* shape: { pad, padY, corner, radius } (px: the gap round the control, the gap
|
|
277
|
+
* above and below it, the control's own corner radius, the ring's largest).
|
|
278
|
+
*/
|
|
279
|
+
export function createHighlight(stage, { reduced = () => false, seed = 'tour-highlight' } = {}) {
|
|
280
|
+
const el = document.createElementNS(NS, 'path');
|
|
281
|
+
el.setAttribute('class', 'tour-ink gold tour-highlight');
|
|
282
|
+
el.setAttribute('pathLength', '1');
|
|
283
|
+
el.style.strokeDasharray = '1 1';
|
|
284
|
+
el.style.strokeDashoffset = '1';
|
|
285
|
+
el.style.opacity = '0';
|
|
286
|
+
(stage.ink || stage.el).appendChild(el);
|
|
287
|
+
const MORPH = [15, 0.8]; // ω, ζ: a glide that lands with a hint of give
|
|
288
|
+
const FADE = [16, 1];
|
|
289
|
+
const KEYS = ['cx', 'cy', 'w', 'h', 'pad', 'padY', 'corner', 'radius', 'tail'];
|
|
290
|
+
const s = { op: 0, vop: 0 };
|
|
291
|
+
for (const k of KEYS) { s[k] = 0; s[`v${k}`] = 0; }
|
|
292
|
+
let goal = null; // the shape it springs to
|
|
293
|
+
let shown = false; // a target is ringed (op → 1)
|
|
294
|
+
let reveal = null; // the draw-on in flight
|
|
295
|
+
let stop = null;
|
|
296
|
+
let resolveSettled = null;
|
|
297
|
+
let settledPromise = Promise.resolve();
|
|
298
|
+
let lastD = '';
|
|
299
|
+
|
|
300
|
+
// `tail`: how far the pen's close bows out past the start (softRingPath's, 3.2 px): a control that sits at the panel's
|
|
301
|
+
// edge (the hand-off's composer) asks for less, so the ring stays inside the panel.
|
|
302
|
+
const shapeOf = (rect, { pad = 7, padY = 5, corner = 6, radius = 999, tail = 3.2 } = {}) => ({
|
|
303
|
+
cx: rect.left + rect.width / 2,
|
|
304
|
+
cy: rect.top + rect.height / 2,
|
|
305
|
+
w: rect.width,
|
|
306
|
+
h: rect.height,
|
|
307
|
+
pad: Number(pad) || 0,
|
|
308
|
+
padY: Number(padY) || 0,
|
|
309
|
+
corner: Math.max(0, Number(corner) || 0),
|
|
310
|
+
radius: Number.isFinite(Number(radius)) ? Number(radius) : 999,
|
|
311
|
+
tail: Number.isFinite(Number(tail)) ? Math.max(0, Number(tail)) : 3.2,
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
const ringOf = (g, local = true) => {
|
|
315
|
+
const rect = { left: g.cx - g.w / 2, top: g.cy - g.h / 2, width: Math.max(0, g.w), height: Math.max(0, g.h) };
|
|
316
|
+
return softRingPath(local && stage.localRect ? stage.localRect(rect) : rect, { pad: g.pad, padY: g.padY, corner: g.corner, maxRadius: g.radius, tail: g.tail, seed });
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
function paint() {
|
|
320
|
+
const d = ringOf(s).d;
|
|
321
|
+
if (d !== lastD) { el.setAttribute('d', d); lastD = d; }
|
|
322
|
+
el.style.opacity = String(Math.max(0, Math.min(1, s.op)).toFixed(3));
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
const shapeSettled = () => !goal || KEYS.every(k => Math.abs(s[k] - goal[k]) < 0.3 && Math.abs(s[`v${k}`]) < 2);
|
|
326
|
+
const fadeSettled = () => Math.abs(s.op - (shown ? 1 : 0)) < 0.01 && Math.abs(s.vop) < 0.05;
|
|
327
|
+
|
|
328
|
+
function onFrame(_now, dtMs) {
|
|
329
|
+
const dt = dtMs / 1000;
|
|
330
|
+
if (goal) {
|
|
331
|
+
for (const k of KEYS) {
|
|
332
|
+
const r = springStep(s[k], s[`v${k}`], goal[k], MORPH[0], MORPH[1], dt);
|
|
333
|
+
s[k] = r.x;
|
|
334
|
+
s[`v${k}`] = r.v;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const o = springStep(s.op, s.vop, shown ? 1 : 0, FADE[0], FADE[1], dt);
|
|
338
|
+
s.op = o.x;
|
|
339
|
+
s.vop = o.v;
|
|
340
|
+
if (shapeSettled() && fadeSettled()) {
|
|
341
|
+
if (goal) for (const k of KEYS) { s[k] = goal[k]; s[`v${k}`] = 0; }
|
|
342
|
+
s.op = shown ? 1 : 0;
|
|
343
|
+
s.vop = 0;
|
|
344
|
+
paint();
|
|
345
|
+
if (!shown) goal = null;
|
|
346
|
+
halt();
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
paint();
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function run() {
|
|
353
|
+
if (stop) return;
|
|
354
|
+
stop = subscribe(onFrame, { fps: 60 });
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
function halt() {
|
|
358
|
+
stop?.();
|
|
359
|
+
stop = null;
|
|
360
|
+
if (!reveal) { resolveSettled?.(); resolveSettled = null; }
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/** Draw the ring on, pen-first: a WAAPI stroke reveal (the hurry speeds it up with the board's). */
|
|
364
|
+
function drawOn() {
|
|
365
|
+
reveal?.cancel();
|
|
366
|
+
el.style.strokeDashoffset = '1';
|
|
367
|
+
const anim = el.animate([{ strokeDashoffset: 1 }, { strokeDashoffset: 0 }], { duration: INK.ring, easing: EASE.draw, fill: 'forwards' });
|
|
368
|
+
reveal = anim;
|
|
369
|
+
const done = () => {
|
|
370
|
+
if (reveal !== anim) return;
|
|
371
|
+
el.style.strokeDashoffset = '0';
|
|
372
|
+
anim.cancel();
|
|
373
|
+
reveal = null;
|
|
374
|
+
if (!stop) { resolveSettled?.(); resolveSettled = null; }
|
|
375
|
+
};
|
|
376
|
+
anim.finished.then(done, done);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/** Ring `rect` (a client rect), or fade (null). Resolves when the ring has arrived and is drawn (or at once when calm). */
|
|
380
|
+
function to(rect, shape = {}) {
|
|
381
|
+
if (!rect) {
|
|
382
|
+
shown = false;
|
|
383
|
+
if (reduced()) { reveal?.cancel(); reveal = null; s.op = 0; s.vop = 0; paint(); halt(); return Promise.resolve(); }
|
|
384
|
+
return start();
|
|
385
|
+
}
|
|
386
|
+
const next = shapeOf(rect, shape);
|
|
387
|
+
const fresh = s.op < 0.05 && !shown;
|
|
388
|
+
goal = next;
|
|
389
|
+
shown = true;
|
|
390
|
+
if (reduced()) {
|
|
391
|
+
reveal?.cancel();
|
|
392
|
+
reveal = null;
|
|
393
|
+
Object.assign(s, next, { op: 1, vop: 0 });
|
|
394
|
+
for (const k of KEYS) s[`v${k}`] = 0;
|
|
395
|
+
el.style.strokeDashoffset = '0';
|
|
396
|
+
paint();
|
|
397
|
+
halt();
|
|
398
|
+
return Promise.resolve();
|
|
399
|
+
}
|
|
400
|
+
if (fresh) {
|
|
401
|
+
// Nothing on screen: it is drawn on where it rings, pen-first, rather than flying in from nowhere.
|
|
402
|
+
Object.assign(s, next);
|
|
403
|
+
for (const k of KEYS) s[`v${k}`] = 0;
|
|
404
|
+
s.op = 1;
|
|
405
|
+
s.vop = 0;
|
|
406
|
+
paint(); // the path exists before the reveal starts
|
|
407
|
+
drawOn();
|
|
408
|
+
} else paint();
|
|
409
|
+
return start();
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
function start() {
|
|
413
|
+
settledPromise = new Promise((resolve) => { resolveSettled?.(); resolveSettled = resolve; });
|
|
414
|
+
run();
|
|
415
|
+
return settledPromise;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
/** The control moved (a resize, a scroll): glide there without a new draw. */
|
|
419
|
+
function refresh(rect, shape) {
|
|
420
|
+
if (!rect || !shown || !goal) return;
|
|
421
|
+
goal = shapeOf(rect, shape || { pad: goal.pad, padY: goal.padY, corner: goal.corner, radius: goal.radius, tail: goal.tail });
|
|
422
|
+
if (reduced()) { Object.assign(s, goal); paint(); return; }
|
|
423
|
+
run();
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
return {
|
|
427
|
+
el,
|
|
428
|
+
to,
|
|
429
|
+
refresh,
|
|
430
|
+
/** Where it rings now, or null. */
|
|
431
|
+
get target() { return shown && goal ? { ...goal } : null; },
|
|
432
|
+
/** The client box the ring's stroke covers when it has arrived (its shape at the goal), or null. */
|
|
433
|
+
get box() {
|
|
434
|
+
if (!shown || !goal) return null;
|
|
435
|
+
const h = ringOf(goal, false).hull;
|
|
436
|
+
return { left: h.left - 1, top: h.top - 1, right: h.right + 1, bottom: h.bottom + 1 };
|
|
437
|
+
},
|
|
438
|
+
destroy() { reveal?.cancel(); reveal = null; halt(); el.remove(); },
|
|
439
|
+
};
|
|
440
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// What the Workspace tour remembers, in the UI state (storage.js): whether it was
|
|
2
|
+
// completed or skipped, whether it was ever started, and its cursor (a beat id;
|
|
3
|
+
// tour-beats.js resumeBeat reads the older tours' cursors too). No DOM, no
|
|
4
|
+
// engine: the empty state's starter row asks tourOffered() without loading the
|
|
5
|
+
// tour. The just-in-time tips (tour-tips.js) keep the ones already shown here.
|
|
6
|
+
import { KEYS } from '../constants.js';
|
|
7
|
+
|
|
8
|
+
/** The first-visit starter row shows until the tour is completed or skipped. */
|
|
9
|
+
export function tourOffered(storage) {
|
|
10
|
+
try { return !storage.getItem(KEYS.TUTORIAL_COMPLETED) && !storage.getItem(KEYS.TUTORIAL_SKIPPED); } catch { return false; }
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** A returning user (the tour was started, completed or skipped before): ? opens on the chapter list. */
|
|
14
|
+
export function tourReturning(storage) {
|
|
15
|
+
try { return [KEYS.TUTORIAL_COMPLETED, KEYS.TUTORIAL_SKIPPED, KEYS.TUTORIAL_STARTED].some(k => !!storage.getItem(k)); } catch { return false; }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** The tour was completed ('completed') or skipped ('skipped'). */
|
|
19
|
+
export function markTourSeen(storage, how) {
|
|
20
|
+
try {
|
|
21
|
+
if (how === 'completed') storage.setItem(KEYS.TUTORIAL_COMPLETED, 'true');
|
|
22
|
+
else if (how === 'skipped') storage.setItem(KEYS.TUTORIAL_SKIPPED, 'true');
|
|
23
|
+
} catch { /* storage unavailable: the row shows again next time */ }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** The tips already shown (a set of ids). */
|
|
27
|
+
export function tipsSeen(storage) {
|
|
28
|
+
try {
|
|
29
|
+
const list = JSON.parse(storage.getItem(KEYS.TOUR_TIPS) || '[]');
|
|
30
|
+
return new Set(Array.isArray(list) ? list.filter(x => typeof x === 'string') : []);
|
|
31
|
+
} catch { return new Set(); }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Remember that tip `id` was shown: never twice. */
|
|
35
|
+
export function markTipSeen(storage, id) {
|
|
36
|
+
const seen = tipsSeen(storage);
|
|
37
|
+
if (seen.has(id)) return;
|
|
38
|
+
seen.add(id);
|
|
39
|
+
try { storage.setItem(KEYS.TOUR_TIPS, JSON.stringify([...seen])); } catch { /* shown again next time */ }
|
|
40
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// Just-in-time tips: the Workspace tour's long tail. One beat each, at the moment a
|
|
2
|
+
// control first matters (the first worker card, the first usage strip, the first
|
|
3
|
+
// route card, the first time ⋯ opens, the first time computer use is switched on):
|
|
4
|
+
// one line in the tour's caption, the one highlight ring on the control, and, when
|
|
5
|
+
// the empty state's character is on screen, its arm pointing there. Shown once,
|
|
6
|
+
// ever (tour-state.js keeps the ids); gone at the next input of any kind, which
|
|
7
|
+
// still does what it does; never while the tour itself runs. Nothing here changes
|
|
8
|
+
// anything: it only says what a control is.
|
|
9
|
+
import { createHighlight, createStage, EASE } from './tour-stage.js';
|
|
10
|
+
import { markTipSeen, tipsSeen } from './tour-state.js';
|
|
11
|
+
|
|
12
|
+
export const TIP_IDS = Object.freeze(['run', 'usage', 'route', 'more', 'computer']);
|
|
13
|
+
const LIFE_MS = 14000; // a tip nobody answers leaves on its own
|
|
14
|
+
|
|
15
|
+
let current = null;
|
|
16
|
+
|
|
17
|
+
/** The tip on screen (for tests): { id, dismiss() } or null. */
|
|
18
|
+
export function currentTip() {
|
|
19
|
+
return current;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Show tip `id` once: `target` is the control it is about, `root` the panel root it
|
|
24
|
+
* sits in (its caption goes at the foot of the transcript). Returns the tip, or null
|
|
25
|
+
* when it was shown before, the tour runs, or there is nothing to point at.
|
|
26
|
+
*/
|
|
27
|
+
/** The tour's stylesheet, loaded once (a tip can come before the tour ever ran). */
|
|
28
|
+
let styles = null;
|
|
29
|
+
export function ensureTourStyles(href = '/shared/tour/tour.css') {
|
|
30
|
+
if (styles) return styles;
|
|
31
|
+
if (document.querySelector(`link[href="${href}"]`)) { styles = Promise.resolve(); return styles; }
|
|
32
|
+
const link = document.createElement('link');
|
|
33
|
+
link.rel = 'stylesheet';
|
|
34
|
+
link.href = href;
|
|
35
|
+
styles = Promise.race([new Promise((done) => { link.onload = link.onerror = done; }), new Promise(done => setTimeout(done, 1500))]);
|
|
36
|
+
document.head.append(link);
|
|
37
|
+
return styles;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function showTip(id, { storage, tr, root, target, renderer = null, reduced = () => false, pageHost = document.body } = {}) {
|
|
41
|
+
if (!TIP_IDS.includes(id) || !storage || !target?.isConnected || !root?.isConnected) return null;
|
|
42
|
+
if (root.classList.contains('tour-on') || document.querySelector('.asst-root.tour-on')) return null; // the tour speaks for itself
|
|
43
|
+
if (tipsSeen(storage).has(id)) return null;
|
|
44
|
+
const line = tr(`tour.tips.${id}`);
|
|
45
|
+
if (!line || line === `tour.tips.${id}`) return null;
|
|
46
|
+
markTipSeen(storage, id);
|
|
47
|
+
current?.dismiss({ calm: true });
|
|
48
|
+
|
|
49
|
+
const transcript = root.querySelector('.asst-transcript');
|
|
50
|
+
const tip = document.createElement('div');
|
|
51
|
+
tip.className = 'tour-caption tour-tip';
|
|
52
|
+
tip.setAttribute('aria-hidden', 'true');
|
|
53
|
+
tip.innerHTML = '<div class="tour-caption-bg"></div><div class="tour-caption-body"><div class="tour-line"></div></div>';
|
|
54
|
+
tip.querySelector('.tour-line').textContent = line;
|
|
55
|
+
// At the foot of the transcript, over the conversation's last lines, never over the composer.
|
|
56
|
+
const rb = root.getBoundingClientRect();
|
|
57
|
+
const tb = (transcript || root).getBoundingClientRect();
|
|
58
|
+
tip.style.bottom = `${Math.max(8, Math.round(rb.bottom - tb.bottom + 8))}px`;
|
|
59
|
+
root.appendChild(tip);
|
|
60
|
+
const announcer = root.querySelector('.asst-announce');
|
|
61
|
+
if (announcer) announcer.textContent = line;
|
|
62
|
+
|
|
63
|
+
const page = createStage(pageHost, { fixed: true, reduced, className: 'tour-tip-layer' });
|
|
64
|
+
try { page.el.style.zIndex = String(Math.max(11001, (parseInt(getComputedStyle(root.closest('.assistant-panel') || root).zIndex, 10) || 0) + 1)); } catch { /* the stylesheet's */ }
|
|
65
|
+
const ring = createHighlight(page, { reduced, seed: `tip-${id}` });
|
|
66
|
+
ring.to(target.getBoundingClientRect(), { pad: 5 });
|
|
67
|
+
// The character points when it is the empty state's, on screen and free.
|
|
68
|
+
const hero = renderer?.mascot?.();
|
|
69
|
+
const pointing = hero?.kind === 'hero' && !hero.parked?.() ? hero : null;
|
|
70
|
+
try { pointing?.rig?.point?.(target, { poke: true }); } catch { /* an older rig */ }
|
|
71
|
+
|
|
72
|
+
let gone = false;
|
|
73
|
+
const onInput = () => dismiss();
|
|
74
|
+
const timer = setTimeout(() => dismiss(), LIFE_MS);
|
|
75
|
+
// Any input dismisses: the event goes on to do what it does (capture, passive, never stopped).
|
|
76
|
+
window.addEventListener('pointerdown', onInput, { capture: true, passive: true });
|
|
77
|
+
window.addEventListener('keydown', onInput, { capture: true, passive: true });
|
|
78
|
+
window.addEventListener('wheel', onInput, { capture: true, passive: true });
|
|
79
|
+
|
|
80
|
+
function dismiss({ calm = false } = {}) {
|
|
81
|
+
if (gone) return;
|
|
82
|
+
gone = true;
|
|
83
|
+
clearTimeout(timer);
|
|
84
|
+
window.removeEventListener('pointerdown', onInput, true);
|
|
85
|
+
window.removeEventListener('keydown', onInput, true);
|
|
86
|
+
window.removeEventListener('wheel', onInput, true);
|
|
87
|
+
try { pointing?.rig?.point?.(null); } catch { /* gone */ }
|
|
88
|
+
if (current === handle) current = null;
|
|
89
|
+
const leave = () => { ring.destroy(); page.destroy(); tip.remove(); };
|
|
90
|
+
if (calm || reduced() || typeof tip.animate !== 'function') { leave(); return; }
|
|
91
|
+
ring.to(null);
|
|
92
|
+
tip.animate([{ opacity: 1, transform: 'none' }, { opacity: 0, transform: 'translateY(6px)' }], { duration: 200, easing: EASE.exit, fill: 'forwards' })
|
|
93
|
+
.finished.then(leave, leave);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const handle = { id, el: tip, dismiss };
|
|
97
|
+
current = handle;
|
|
98
|
+
return handle;
|
|
99
|
+
}
|