synabun 2.0.10 → 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 +86 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +22 -0
- 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/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 +37 -4
- 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 +3463 -200
- package/neural-interface/i18n/pt-BR.json +3411 -151
- package/neural-interface/lib/assistant-api.js +127 -28
- 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 +120 -54
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
- package/neural-interface/lib/assistant-catalog.js +6 -7
- package/neural-interface/lib/assistant-dispatch.js +871 -156
- package/neural-interface/lib/assistant-envelope.js +3 -1
- 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 +56 -18
- 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-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-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 +68 -68
- package/neural-interface/lib/exec-loop-command.js +4 -8
- package/neural-interface/lib/http-guards.js +8 -2
- package/neural-interface/lib/install-details.js +4 -1
- 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 +547 -47
- package/neural-interface/lib/native-loop-runtime.js +268 -41
- package/neural-interface/lib/opencode-config.js +557 -0
- package/neural-interface/lib/opencode-db-schema.js +17 -34
- package/neural-interface/lib/opencode-history.js +48 -218
- 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 +249 -112
- package/neural-interface/lib/opencode-runtime-config.js +32 -22
- package/neural-interface/lib/opencode-serve-records.js +39 -21
- package/neural-interface/lib/opencode-v2-client.js +48 -153
- package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
- package/neural-interface/lib/opencode-worker-data.js +27 -0
- package/neural-interface/lib/opencode2-client.js +73 -37
- package/neural-interface/lib/opencode2-proxy.js +23 -63
- package/neural-interface/lib/opencode2-translate.js +51 -2
- 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/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 +17 -30
- package/neural-interface/lib/session-title-generator.js +58 -36
- 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/tool-lists.js +124 -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 +18 -12
- package/neural-interface/package.json +2 -2
- package/neural-interface/public/index.html +3 -1
- 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 +35 -19
- 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 +33 -2
- 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 +49 -35
- 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-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 +7 -6
- package/neural-interface/public/shared/assistant/asst-panel.js +106 -11
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
- package/neural-interface/public/shared/assistant/asst-render.js +401 -77
- package/neural-interface/public/shared/assistant/asst-route.js +83 -12
- package/neural-interface/public/shared/assistant/asst-scenes.js +2 -0
- 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 +11 -15
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +59 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +156 -16
- package/neural-interface/public/shared/automation-context.js +5 -2
- package/neural-interface/public/shared/cc-dropdown.js +89 -19
- 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 +45 -149
- package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
- package/neural-interface/public/shared/cdx/cdx-render.js +47 -29
- 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 +11 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +52 -39
- 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/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/desktop-update-view.js +20 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/html-shell.js +9 -11
- package/neural-interface/public/shared/i18n.js +2 -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-changes-logic.js +3 -101
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
- 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-outcome-notifications.js +16 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +47 -252
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +6 -21
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
- 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 +2 -91
- 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 +0 -21
- 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 +14 -47
- 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 +195 -61
- package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
- package/neural-interface/public/shared/settings/settings-data.js +3 -1
- package/neural-interface/public/shared/settings/settings-ia.js +6 -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/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 +1525 -1779
- 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-automation-studio.js +91 -128
- package/neural-interface/public/shared/ui-claude-panel.js +77 -5
- 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 +15 -3
- package/neural-interface/public/shared/ui-image-gallery.js +50 -47
- package/neural-interface/public/shared/ui-keybinds.js +26 -1
- package/neural-interface/public/shared/ui-menubar.js +8 -18
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +7 -1
- package/neural-interface/public/shared/ui-navbar.js +4 -24
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-schedules-studio.js +507 -423
- package/neural-interface/public/shared/ui-sessions.js +5 -3
- package/neural-interface/public/shared/ui-settings.js +594 -462
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +1 -1
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
- package/neural-interface/public/shared/ui-skills.js +33 -2830
- package/neural-interface/public/shared/ui-styleguide.js +5 -2
- package/neural-interface/public/shared/ui-sync.js +15 -5
- package/neural-interface/public/shared/ui-terminal.js +124 -180
- 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 +6 -4
- 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 -65
- package/neural-interface/public/shared/ui-tutorial.css +47 -100
- package/neural-interface/public/shared/ui-tutorial.js +285 -509
- package/neural-interface/public/shared/ui-update.js +38 -2
- package/neural-interface/public/shared/ui-whiteboard.js +311 -58
- 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 +32 -1
- package/neural-interface/public/variant/2d/minimap.js +11 -13
- package/neural-interface/public/variant/3d/main.js +69 -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/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 +32 -0
- package/neural-interface/server.js +3934 -2454
- 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 +4 -4
- 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,390 @@
|
|
|
1
|
+
// The Workspace tour's ink, as pure geometry: no DOM, so node:test checks it
|
|
2
|
+
// (tests/tour-ink.test.mjs). Every shape is a few points run through one
|
|
3
|
+
// smooth Catmull-Rom curve (cubic Béziers), with a slow seeded wander (two or
|
|
4
|
+
// three waves round a shape, never a per-point jitter) so the same beat draws
|
|
5
|
+
// the same hand every time and a moving ring never shimmers. Nothing here has
|
|
6
|
+
// a hard corner: boxes and rings are rounded outlines sampled corner-aware,
|
|
7
|
+
// rings close a little past their start with a soft overlap, arrows bow once.
|
|
8
|
+
// tour-stage.js turns these into SVG paths and reveals them.
|
|
9
|
+
|
|
10
|
+
/** Seeded random in [0, 1): the same seed string gives the same wobble. */
|
|
11
|
+
export function seededRand(seed) {
|
|
12
|
+
let h = 0;
|
|
13
|
+
const text = String(seed);
|
|
14
|
+
for (let i = 0; i < text.length; i += 1) h = ((h << 5) - h + text.charCodeAt(i)) | 0;
|
|
15
|
+
h = Math.abs(h) || 1;
|
|
16
|
+
return () => {
|
|
17
|
+
h = (h * 16807) % 2147483647;
|
|
18
|
+
return (h - 1) / 2147483646;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const r2 = (v) => {
|
|
23
|
+
const r = Math.round(v * 100) / 100;
|
|
24
|
+
return String(r === 0 ? 0 : r);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* One Catmull-Rom segment p1 → p2 (neighbours p0, p3) as a cubic Bézier's two
|
|
29
|
+
* control points, centripetal (α ½): uneven spacing (a long side, then a
|
|
30
|
+
* corner's short steps) never overshoots, loops or kinks; evenly spaced points
|
|
31
|
+
* give the uniform spline (1/6 tangents, so points on a circle stay a circle).
|
|
32
|
+
*/
|
|
33
|
+
function bezierControls(p0, p1, p2, p3) {
|
|
34
|
+
const d = (a, b) => Math.sqrt(Math.max(1e-9, Math.hypot(b[0] - a[0], b[1] - a[1])));
|
|
35
|
+
const d1 = d(p0, p1);
|
|
36
|
+
const d2 = d(p1, p2);
|
|
37
|
+
const d3 = d(p2, p3);
|
|
38
|
+
const c1 = [0, 1].map(i => (d1 * d1 * p2[i] - d2 * d2 * p0[i] + (2 * d1 * d1 + 3 * d1 * d2 + d2 * d2) * p1[i]) / (3 * d1 * (d1 + d2)));
|
|
39
|
+
const c2 = [0, 1].map(i => (d3 * d3 * p1[i] - d2 * d2 * p3[i] + (2 * d3 * d3 + 3 * d3 * d2 + d2 * d2) * p2[i]) / (3 * d3 * (d3 + d2)));
|
|
40
|
+
return [c1, c2];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A phantom point before `a` (next `b`, then `c`): the curve's own bend carried on, never further out than its first step. */
|
|
44
|
+
function phantom(a, b, c) {
|
|
45
|
+
if (!c) return [2 * a[0] - b[0], 2 * a[1] - b[1]];
|
|
46
|
+
const q = [3 * a[0] - 3 * b[0] + c[0], 3 * a[1] - 3 * b[1] + c[1]]; // the quadratic through a, b, c, one step back
|
|
47
|
+
const step = Math.hypot(b[0] - a[0], b[1] - a[1]);
|
|
48
|
+
const far = Math.hypot(q[0] - a[0], q[1] - a[1]);
|
|
49
|
+
if (!(far > 1e-6)) return [2 * a[0] - b[0], 2 * a[1] - b[1]];
|
|
50
|
+
const k = Math.min(1, (1.5 * step) / far);
|
|
51
|
+
return [a[0] + (q[0] - a[0]) * k, a[1] + (q[1] - a[1]) * k];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* A smooth open path through `pts` ([x, y] pairs): a centripetal Catmull-Rom
|
|
56
|
+
* spline as cubic Béziers, its ends carrying the curve's own bend (no flat
|
|
57
|
+
* start, no wiggle at the tip of a bowed arrow).
|
|
58
|
+
*/
|
|
59
|
+
export function pointsToSmoothPath(pts) {
|
|
60
|
+
if (!pts?.length) return '';
|
|
61
|
+
if (pts.length === 1) return `M ${r2(pts[0][0])} ${r2(pts[0][1])}`;
|
|
62
|
+
if (pts.length === 2) return `M ${r2(pts[0][0])} ${r2(pts[0][1])} L ${r2(pts[1][0])} ${r2(pts[1][1])}`;
|
|
63
|
+
const n = pts.length;
|
|
64
|
+
const before = phantom(pts[0], pts[1], pts[2]);
|
|
65
|
+
const after = phantom(pts[n - 1], pts[n - 2], pts[n - 3]);
|
|
66
|
+
let d = `M ${r2(pts[0][0])} ${r2(pts[0][1])}`;
|
|
67
|
+
for (let i = 0; i < n - 1; i += 1) {
|
|
68
|
+
const p0 = i === 0 ? before : pts[i - 1];
|
|
69
|
+
const p3 = i + 2 < n ? pts[i + 2] : after;
|
|
70
|
+
const [c1, c2] = bezierControls(p0, pts[i], pts[i + 1], p3);
|
|
71
|
+
d += ` C ${r2(c1[0])} ${r2(c1[1])}, ${r2(c2[0])} ${r2(c2[1])}, ${r2(pts[i + 1][0])} ${r2(pts[i + 1][1])}`;
|
|
72
|
+
}
|
|
73
|
+
return d;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** A smooth closed path through `pts` (the curve wraps, so the seam has no corner). */
|
|
77
|
+
export function closedSmoothPath(pts) {
|
|
78
|
+
if (!pts?.length || pts.length < 3) return pointsToSmoothPath(pts);
|
|
79
|
+
const at = (i) => pts[(i + pts.length) % pts.length];
|
|
80
|
+
let d = `M ${r2(pts[0][0])} ${r2(pts[0][1])}`;
|
|
81
|
+
for (let i = 0; i < pts.length; i += 1) {
|
|
82
|
+
const [c1, c2] = bezierControls(at(i - 1), at(i), at(i + 1), at(i + 2));
|
|
83
|
+
const p2 = at(i + 1);
|
|
84
|
+
d += ` C ${r2(c1[0])} ${r2(c1[1])}, ${r2(c2[0])} ${r2(c2[1])}, ${r2(p2[0])} ${r2(p2[1])}`;
|
|
85
|
+
}
|
|
86
|
+
return `${d} Z`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* A point on the outline of a rounded rectangle (centre cx, cy; half sizes hw,
|
|
91
|
+
* hh; corner radius r), `u` of the way round (0-1, clockwise from the top
|
|
92
|
+
* centre). Even spacing by arc length, so a ring morphing between two rects
|
|
93
|
+
* keeps its points in step.
|
|
94
|
+
*/
|
|
95
|
+
export function roundedRectPoint(cx, cy, hw, hh, r, u) {
|
|
96
|
+
const rr = Math.max(0, Math.min(r, hw, hh));
|
|
97
|
+
const sx = Math.max(0, hw - rr);
|
|
98
|
+
const sy = Math.max(0, hh - rr);
|
|
99
|
+
const arc = (Math.PI / 2) * rr;
|
|
100
|
+
const segs = [sx, arc, 2 * sy, arc, 2 * sx, arc, 2 * sy, arc, sx];
|
|
101
|
+
const total = segs.reduce((a, b) => a + b, 0) || 1;
|
|
102
|
+
let left = (((u % 1) + 1) % 1) * total;
|
|
103
|
+
const corner = (ox, oy, a0, p) => {
|
|
104
|
+
const a = a0 + (Math.PI / 2) * p;
|
|
105
|
+
return [ox + Math.cos(a) * rr, oy + Math.sin(a) * rr];
|
|
106
|
+
};
|
|
107
|
+
const steps = [
|
|
108
|
+
(p) => [cx + sx * p, cy - hh],
|
|
109
|
+
(p) => corner(cx + sx, cy - sy, -Math.PI / 2, p),
|
|
110
|
+
(p) => [cx + hw, cy - sy + 2 * sy * p],
|
|
111
|
+
(p) => corner(cx + sx, cy + sy, 0, p),
|
|
112
|
+
(p) => [cx + sx - 2 * sx * p, cy + hh],
|
|
113
|
+
(p) => corner(cx - sx, cy + sy, Math.PI / 2, p),
|
|
114
|
+
(p) => [cx - hw, cy + sy - 2 * sy * p],
|
|
115
|
+
(p) => corner(cx - sx, cy - sy, Math.PI, p),
|
|
116
|
+
(p) => [cx - sx + sx * p, cy - hh],
|
|
117
|
+
];
|
|
118
|
+
for (let i = 0; i < segs.length; i += 1) {
|
|
119
|
+
if (left <= segs[i] || i === segs.length - 1) return steps[i](segs[i] ? Math.min(1, left / segs[i]) : 0);
|
|
120
|
+
left -= segs[i];
|
|
121
|
+
}
|
|
122
|
+
return [cx, cy - hh];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* A slow, smooth wander for hand-drawn outlines: two or three gentle waves
|
|
127
|
+
* round the whole shape (`u` 0-1), seeded, never a per-point jitter, so a
|
|
128
|
+
* stroke stays a clean curve and a moving shape never shimmers. ±`amp` px.
|
|
129
|
+
*/
|
|
130
|
+
export function lowWander(seed, amp = 1) {
|
|
131
|
+
const rand = seededRand(`${seed}~w`);
|
|
132
|
+
const p1 = rand() * Math.PI * 2;
|
|
133
|
+
const p2 = rand() * Math.PI * 2;
|
|
134
|
+
const k = 0.55 + 0.25 * rand();
|
|
135
|
+
return u => amp * (k * Math.sin(Math.PI * 2 * 2 * u + p1) + (1 - k) * Math.sin(Math.PI * 2 * 3 * u + p2));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** The base shape a highlight ring draws around `rect` (softRingPath): its centre, half sizes and corner radius. */
|
|
139
|
+
export function ringShape(rect, { pad = 6, padY = pad, corner = 6, minRadius = 9, maxRadius = Infinity } = {}) {
|
|
140
|
+
const cx = rect.left + rect.width / 2;
|
|
141
|
+
const cy = rect.top + rect.height / 2;
|
|
142
|
+
const a = Math.max(0, rect.width / 2);
|
|
143
|
+
const b = Math.max(0, rect.height / 2);
|
|
144
|
+
const cr = Math.max(0, Math.min(Number(corner) || 0, a, b)); // the control's own corner radius
|
|
145
|
+
let hw = Math.max(4, a + pad);
|
|
146
|
+
let hh = Math.max(4, b + padY);
|
|
147
|
+
const radius = () => Math.min(hh, hw, Math.max(minRadius, Math.min(hh * 0.9, maxRadius)));
|
|
148
|
+
// Grow until the ring's corner arcs clear the control's rounded corners by most of the pad.
|
|
149
|
+
const want = Math.min(pad, padY) * 0.6;
|
|
150
|
+
for (let i = 0; i < 4; i += 1) {
|
|
151
|
+
const r = radius();
|
|
152
|
+
// From the ring's corner centre to the control's (both inset by their radius): the control's corner reaches this far out.
|
|
153
|
+
const gap = r - (Math.hypot(Math.max(0, (a - cr) - (hw - r)), Math.max(0, (b - cr) - (hh - r))) + cr);
|
|
154
|
+
const short = want - gap;
|
|
155
|
+
if (!(short > 0.05)) break;
|
|
156
|
+
hw += short;
|
|
157
|
+
hh += short;
|
|
158
|
+
}
|
|
159
|
+
return { cx, cy, hw, hh, r: radius() };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* A rounded loop as a pen draws it, built exactly: the straight sides and the
|
|
164
|
+
* cubic corner arcs of the rounded rectangle `shape` ({ cx, cy, hw, hh, r }),
|
|
165
|
+
* clockwise, starting `start` px along it (0 is the top side's left end) and
|
|
166
|
+
* running once round and `over` px past the start. Anchors sit at every side's
|
|
167
|
+
* ends and middle and at every corner's middle, so the set is small and the
|
|
168
|
+
* same for every control. Each anchor is pushed out along the outline's normal
|
|
169
|
+
* by `offset(s, past)` (s px from the start; past 0-1 into the overlap), its
|
|
170
|
+
* handles with it: the curve stays tangent-continuous, a wander bends a side
|
|
171
|
+
* into a gentle curve, never a kink. Returns { d, anchors, hull } (hull: the
|
|
172
|
+
* box of every anchor and handle, which the curve never leaves).
|
|
173
|
+
*/
|
|
174
|
+
function loopPath(shape, { start = 0, over = 14, offset = () => 0 } = {}) {
|
|
175
|
+
const { cx, cy, hw, hh } = shape;
|
|
176
|
+
const r = Math.max(0, Math.min(shape.r, hw, hh));
|
|
177
|
+
const sx = Math.max(0, hw - r);
|
|
178
|
+
const sy = Math.max(0, hh - r);
|
|
179
|
+
const arc = (Math.PI / 2) * r;
|
|
180
|
+
// The outline as pieces, clockwise from the top side's left end: [length, kind, …].
|
|
181
|
+
const pieces = [
|
|
182
|
+
{ len: 2 * sx, line: [cx - sx, cy - hh, 1, 0] },
|
|
183
|
+
{ len: arc, arc: [cx + sx, cy - sy, -Math.PI / 2] },
|
|
184
|
+
{ len: 2 * sy, line: [cx + hw, cy - sy, 0, 1] },
|
|
185
|
+
{ len: arc, arc: [cx + sx, cy + sy, 0] },
|
|
186
|
+
{ len: 2 * sx, line: [cx + sx, cy + hh, -1, 0] },
|
|
187
|
+
{ len: arc, arc: [cx - sx, cy + sy, Math.PI / 2] },
|
|
188
|
+
{ len: 2 * sy, line: [cx - hw, cy + sy, 0, -1] },
|
|
189
|
+
{ len: arc, arc: [cx - sx, cy - sy, Math.PI] },
|
|
190
|
+
];
|
|
191
|
+
const total = pieces.reduce((a, p) => a + p.len, 0) || 1;
|
|
192
|
+
/** The piece at loop position `s` (any number: it wraps) and how far into it. */
|
|
193
|
+
const pieceAt = (s) => {
|
|
194
|
+
let left = ((s % total) + total) % total;
|
|
195
|
+
for (const p of pieces) { if (left <= p.len && p.len > 0) return { p, at: left }; left -= p.len; }
|
|
196
|
+
return { p: pieces.find(q => q.len > 0) || pieces[0], at: 0 };
|
|
197
|
+
};
|
|
198
|
+
/** Position and unit tangent at `s` along piece `p`, `at` px into it. */
|
|
199
|
+
const frameOf = (p, at) => {
|
|
200
|
+
if (p.line) { const [x, y, tx, ty] = p.line; return { x: x + tx * at, y: y + ty * at, tx, ty }; }
|
|
201
|
+
const [ox, oy, a0] = p.arc;
|
|
202
|
+
const a = a0 + (r > 0 ? at / r : 0);
|
|
203
|
+
return { x: ox + Math.cos(a) * r, y: oy + Math.sin(a) * r, tx: -Math.sin(a), ty: Math.cos(a) };
|
|
204
|
+
};
|
|
205
|
+
// Where the anchors go: every piece's start, every corner's middle and the middle of a side long enough to
|
|
206
|
+
// carry a wave (a short one would only get a ripple), from `start` to `start + total + over`.
|
|
207
|
+
const end = start + total + over;
|
|
208
|
+
const stops = [start];
|
|
209
|
+
for (let lap = Math.floor(start / total) - 1; lap <= Math.ceil(end / total); lap += 1) {
|
|
210
|
+
let s = lap * total;
|
|
211
|
+
for (const p of pieces) {
|
|
212
|
+
for (const f of (p.arc || p.len > 24 ? [0, 0.5] : [0])) { const q = s + p.len * f; if (q > start + 1e-6 && q < end - 1e-6) stops.push(q); }
|
|
213
|
+
s += p.len;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
stops.push(end);
|
|
217
|
+
stops.sort((a, b) => a - b);
|
|
218
|
+
const anchors = [];
|
|
219
|
+
for (let i = 0; i < stops.length; i += 1) {
|
|
220
|
+
if (i && stops[i] - stops[i - 1] < 1e-6) continue;
|
|
221
|
+
const s = stops[i];
|
|
222
|
+
// At a piece boundary the next piece's frame (they share the point and, on a rounded outline, the tangent).
|
|
223
|
+
const { p, at } = i === stops.length - 1 ? pieceAt(s - 1e-7) : pieceAt(s + 1e-7);
|
|
224
|
+
const fr = frameOf(p, Math.max(0, i === stops.length - 1 ? at + 1e-7 : at - 1e-7));
|
|
225
|
+
const past = s - start > total ? (s - start - total) / Math.max(1e-6, over) : 0;
|
|
226
|
+
const o = offset(s - start, past);
|
|
227
|
+
anchors.push({ x: fr.x + fr.ty * o, y: fr.y - fr.tx * o, tx: fr.tx, ty: fr.ty, s: s - start });
|
|
228
|
+
}
|
|
229
|
+
let d = `M ${r2(anchors[0].x)} ${r2(anchors[0].y)}`;
|
|
230
|
+
const xs = [anchors[0].x];
|
|
231
|
+
const ys = [anchors[0].y];
|
|
232
|
+
for (let i = 1; i < anchors.length; i += 1) {
|
|
233
|
+
const a = anchors[i - 1];
|
|
234
|
+
const b = anchors[i];
|
|
235
|
+
const len = b.s - a.s;
|
|
236
|
+
const mid = pieceAt(start + (a.s + b.s) / 2).p;
|
|
237
|
+
// A straight run: handles a third of the way along; an arc: the cubic circle's handle for its angle.
|
|
238
|
+
const h = mid.arc && r > 0 ? (4 / 3) * Math.tan(len / r / 4) * r : len / 3;
|
|
239
|
+
const c1 = [a.x + a.tx * h, a.y + a.ty * h];
|
|
240
|
+
const c2 = [b.x - b.tx * h, b.y - b.ty * h];
|
|
241
|
+
d += ` C ${r2(c1[0])} ${r2(c1[1])}, ${r2(c2[0])} ${r2(c2[1])}, ${r2(b.x)} ${r2(b.y)}`;
|
|
242
|
+
xs.push(c1[0], c2[0], b.x);
|
|
243
|
+
ys.push(c1[1], c2[1], b.y);
|
|
244
|
+
}
|
|
245
|
+
return { d, anchors, hull: { left: Math.min(...xs), top: Math.min(...ys), right: Math.max(...xs), bottom: Math.max(...ys) }, total };
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* The smooth hand-drawn ring around a control: the rounded outline ringShape
|
|
250
|
+
* gives, drawn exactly (loopPath: straight sides, round corners, no polygon,
|
|
251
|
+
* no bulge), a slow wander of about a px (lowWander: no per-point wobble),
|
|
252
|
+
* and a pen's close: it lands a hair inside at the middle of the lower-left
|
|
253
|
+
* corner (below the control, away from any text over it), goes once round
|
|
254
|
+
* clockwise and runs on up the left side past its start, drifting `tail` px
|
|
255
|
+
* outward, so the two ends overlap softly and never meet head on. Returns
|
|
256
|
+
* { d, anchors, hull }: the path data, its anchors and the box it stays in.
|
|
257
|
+
*/
|
|
258
|
+
export function softRingPath(rect, { pad = 6, padY = pad, corner = 6, seed = 'ring', wobble = 0.9, tail = 3.2, minRadius = 9, maxRadius = Infinity } = {}) {
|
|
259
|
+
const shape = ringShape(rect, { pad, padY, corner, minRadius, maxRadius });
|
|
260
|
+
const wander = lowWander(seed, wobble);
|
|
261
|
+
const r = Math.min(shape.r, shape.hw, shape.hh);
|
|
262
|
+
const sx = Math.max(0, shape.hw - r);
|
|
263
|
+
const sy = Math.max(0, shape.hh - r);
|
|
264
|
+
const arc = (Math.PI / 2) * r;
|
|
265
|
+
const total = 4 * (sx + sy) + 4 * arc;
|
|
266
|
+
const start = 4 * sx + 2 * sy + 2.5 * arc; // the middle of the lower-left corner
|
|
267
|
+
const over = Math.max(10, Math.min(28, total * 0.07));
|
|
268
|
+
const ramp = u => { const v = Math.max(0, Math.min(1, u)); return v * v * (3 - 2 * v); };
|
|
269
|
+
return loopPath(shape, {
|
|
270
|
+
start,
|
|
271
|
+
over,
|
|
272
|
+
offset: (s, past) => wander(s / total)
|
|
273
|
+
- 0.5 * (1 - ramp(s / (0.08 * total))) // lands a hair inside
|
|
274
|
+
+ tail * ramp((s - 0.9 * total) / (0.1 * total + over)) * (0.4 + 0.6 * past), // and comes round outside it
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/**
|
|
279
|
+
* A rounded hand-drawn box around a rect: drawn exactly like the ring
|
|
280
|
+
* (loopPath), a slow wander of under a px, starting on the top side a little
|
|
281
|
+
* in from the top-left corner and closing just past the start. `radius` is
|
|
282
|
+
* at least 8: no hard corner on the board. Returns { d, anchors, hull }.
|
|
283
|
+
*/
|
|
284
|
+
export function softBoxPath(rect, { pad = 0, radius = 10, seed = 'box', jitter = 0.7 } = {}) {
|
|
285
|
+
const w = rect.width + pad * 2;
|
|
286
|
+
const h = rect.height + pad * 2;
|
|
287
|
+
const r = Math.max(Math.min(8, w / 2, h / 2), Math.min(radius, w / 2, h / 2));
|
|
288
|
+
const shape = { cx: rect.left - pad + w / 2, cy: rect.top - pad + h / 2, hw: w / 2, hh: h / 2, r };
|
|
289
|
+
const wander = lowWander(seed, jitter);
|
|
290
|
+
const total = 2 * (w + h) - (8 - 2 * Math.PI) * r;
|
|
291
|
+
const start = Math.min(10, Math.max(0, w - 2 * r) * 0.2);
|
|
292
|
+
const over = Math.max(5, Math.min(10, total * 0.03));
|
|
293
|
+
return loopPath(shape, { start, over, offset: (s, past) => wander(s / total) + 0.9 * past });
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* A bowed arrow from `from` to `to` (client points): its shaft as five points
|
|
298
|
+
* on one smooth bow (`curve` × its length to the side, its peak a little past
|
|
299
|
+
* the middle, like a flick of the pen; the ends exact), and its head: two short
|
|
300
|
+
* wings at the end along the shaft's last direction (`wings`), also as one
|
|
301
|
+
* stroke through both (`head`: wing, tip, wing).
|
|
302
|
+
*/
|
|
303
|
+
export function arrowGeometry(from, to, { curve = 0.16, seed = 'arrow', head = 7 } = {}) {
|
|
304
|
+
const rand = seededRand(seed);
|
|
305
|
+
const dx = to.x - from.x;
|
|
306
|
+
const dy = to.y - from.y;
|
|
307
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
308
|
+
const nx = -dy / len;
|
|
309
|
+
const ny = dx / len;
|
|
310
|
+
const bend = curve * len;
|
|
311
|
+
const lean = 0.12 + 0.08 * rand(); // the bow peaks a little past the middle
|
|
312
|
+
const shaft = [];
|
|
313
|
+
for (let i = 0; i <= 4; i += 1) {
|
|
314
|
+
const t = i / 4;
|
|
315
|
+
const bow = Math.sin(t * Math.PI) * bend * (1 + lean * (t - 0.5) * 2);
|
|
316
|
+
shaft.push([from.x + dx * t + nx * bow, from.y + dy * t + ny * bow]);
|
|
317
|
+
}
|
|
318
|
+
// The shaft's last direction, from the smooth curve's end tangent (Catmull-Rom: the last two points).
|
|
319
|
+
const [x1, y1] = shaft[3];
|
|
320
|
+
const [x2, y2] = shaft[4];
|
|
321
|
+
const ang = Math.atan2(y2 - y1, x2 - x1);
|
|
322
|
+
const wing = side => [[x2 - Math.cos(ang + side * 0.55) * head, y2 - Math.sin(ang + side * 0.55) * head], [x2, y2]];
|
|
323
|
+
const wings = [wing(1), wing(-1)];
|
|
324
|
+
return { shaft, wings, head: [wings[0][0], [x2, y2], wings[1][0]] };
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/** A gentle underline under a rect: one smooth stroke with one slow wave and a slight lift at its end. */
|
|
328
|
+
export function underlinePoints(rect, { offset = 4, seed = 'u' } = {}) {
|
|
329
|
+
const rand = seededRand(seed);
|
|
330
|
+
const y = rect.top + rect.height + offset;
|
|
331
|
+
const phase = rand() * Math.PI;
|
|
332
|
+
const amp = 0.9 + 0.5 * rand();
|
|
333
|
+
const pts = [];
|
|
334
|
+
for (let i = 0; i <= 4; i += 1) {
|
|
335
|
+
const t = i / 4;
|
|
336
|
+
pts.push([rect.left + rect.width * t, y + Math.sin(t * Math.PI + phase) * amp - t * t * 2.2]);
|
|
337
|
+
}
|
|
338
|
+
return pts;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* An ellipse's points (open, `turns` of a full turn from `start` radians): a
|
|
343
|
+
* drum's top, a clock face. A true ellipse with a slow wander of the radius
|
|
344
|
+
* (`jitter` px, two or three waves round, never per point), 16 points a turn.
|
|
345
|
+
*/
|
|
346
|
+
export function ellipsePoints(cx, cy, rx, ry, { start = -Math.PI / 2, turns = 1.04, count, seed = 'e', jitter = 0.6 } = {}) {
|
|
347
|
+
const wander = lowWander(seed, jitter);
|
|
348
|
+
const n = Math.max(6, Math.round(Number(count) || 16 * Math.abs(turns)));
|
|
349
|
+
const pts = [];
|
|
350
|
+
for (let i = 0; i <= n; i += 1) {
|
|
351
|
+
const f = i / n;
|
|
352
|
+
const a = start + f * Math.PI * 2 * turns;
|
|
353
|
+
const w = i === 0 ? 0 : wander(f * Math.abs(turns));
|
|
354
|
+
pts.push([cx + Math.cos(a) * (rx + w), cy + Math.sin(a) * (ry + w)]);
|
|
355
|
+
}
|
|
356
|
+
return pts;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/** A spring step toward `goal` (semi-implicit Euler, sub-stepped): returns the new { x, v }. */
|
|
360
|
+
export function springStep(x, v, goal, omega, zeta, dt) {
|
|
361
|
+
let pos = x;
|
|
362
|
+
let vel = v;
|
|
363
|
+
let left = Math.max(0, Math.min(0.064, dt));
|
|
364
|
+
while (left > 1e-6) {
|
|
365
|
+
const h = Math.min(1 / 240, left);
|
|
366
|
+
left -= h;
|
|
367
|
+
vel += (omega * omega * (goal - pos) - 2 * zeta * omega * vel) * h;
|
|
368
|
+
pos += vel * h;
|
|
369
|
+
}
|
|
370
|
+
return { x: pos, v: vel };
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/** --asst-ease-standard, cubic-bezier(.2, 0, .38, .9), for values the tour eases in script. */
|
|
374
|
+
export function easeStandard(p) {
|
|
375
|
+
const x = Math.max(0, Math.min(1, p));
|
|
376
|
+
// Newton on the x(t) cubic, then y(t).
|
|
377
|
+
const ax = 1 - 3 * 0.38 + 3 * 0.2;
|
|
378
|
+
const bx = 3 * 0.38 - 6 * 0.2;
|
|
379
|
+
const cx = 3 * 0.2;
|
|
380
|
+
const ay = 1 - 3 * 0.9;
|
|
381
|
+
const by = 3 * 0.9;
|
|
382
|
+
let t = x;
|
|
383
|
+
for (let i = 0; i < 8; i += 1) {
|
|
384
|
+
const fx = ((ax * t + bx) * t + cx) * t - x;
|
|
385
|
+
const d = (3 * ax * t + 2 * bx) * t + cx;
|
|
386
|
+
if (Math.abs(fx) < 1e-6 || Math.abs(d) < 1e-6) break;
|
|
387
|
+
t = Math.max(0, Math.min(1, t - fx / d));
|
|
388
|
+
}
|
|
389
|
+
return ((ay * t + by) * t) * t;
|
|
390
|
+
}
|