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,400 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from 'fs';
|
|
2
|
+
import { basename, dirname, join } from 'path';
|
|
3
|
+
import { config } from '../config.js';
|
|
4
|
+
import { isHttpMode, sanitizeDesktopGrant, sanitizeRole } from './identity.js';
|
|
5
|
+
import { ALWAYS_ON_TOOLS, SELECTABLE_GROUP_IDS, TOOL_LIST_LIMITS, TOOL_GROUPS, isGatedGroup, isSelectableGroup, sortGroups } from './tool-catalog.js';
|
|
6
|
+
import { parseToolList, resolveToolList } from './tool-list.js';
|
|
7
|
+
/** The list of this runtime (comma-joined group ids) and the file its tool_groups changes go to. */
|
|
8
|
+
export const TOOLS_ENV = 'SYNABUN_TOOLS';
|
|
9
|
+
export const TOOLS_PATH_ENV = 'SYNABUN_TOOLS_PATH';
|
|
10
|
+
/** deferred / focus: a focus host; profiled / strict: a strict one. */
|
|
11
|
+
export const TOOL_CATALOG_MODE_ENV = 'SYNABUN_TOOL_CATALOG_MODE';
|
|
12
|
+
/** Read as aliases through the legacy conversion (an older Neural Interface, a user's own config.toml or Gemini settings); never written. */
|
|
13
|
+
export const LEGACY_PROFILE_ENV = 'SYNABUN_PROFILE';
|
|
14
|
+
export const LEGACY_RUNTIME_PROFILE_PATH_ENV = 'SYNABUN_RUNTIME_PROFILE_PATH';
|
|
15
|
+
/** The owner's Default tools: Settings and `synabun tools set` write it; a runtime reads it when it starts, never later. */
|
|
16
|
+
export const DEFAULT_TOOLS_PATH = join(config.dataHome, 'data', 'default-tools.json');
|
|
17
|
+
const LEGACY_DEFAULT_PROFILE_PATHS = [join(config.dataDir, 'active-profile.json'), join(config.dataHome, 'data', 'active-profile.json')];
|
|
18
|
+
const REGISTRY_PATH = join(config.dataHome, 'data', 'mcp-registry.json');
|
|
19
|
+
/** Groups only a caller with this role sees: the role decides, so no list can reveal or hide them. */
|
|
20
|
+
export const ROLE_GATED_GROUPS = Object.freeze(Object.fromEntries(TOOL_GROUPS.filter((group) => group.gate === 'role:assistant').map((group) => [group.id, 'assistant'])));
|
|
21
|
+
/** Groups a capability the caller proves unlocks: `computer` needs a desktop grant (and macOS). */
|
|
22
|
+
export const CAPABILITY_GATED_GROUPS = Object.freeze(Object.fromEntries(TOOL_GROUPS.filter((group) => group.gate === 'grant:computer').map((group) => [group.id, 'computer'])));
|
|
23
|
+
export function isRoleGatedGroup(group) {
|
|
24
|
+
return Object.prototype.hasOwnProperty.call(ROLE_GATED_GROUPS, group);
|
|
25
|
+
}
|
|
26
|
+
export function isCapabilityGatedGroup(group) {
|
|
27
|
+
return Object.prototype.hasOwnProperty.call(CAPABILITY_GATED_GROUPS, group);
|
|
28
|
+
}
|
|
29
|
+
const SOURCE_NAMES = {
|
|
30
|
+
'tools-file': 'SYNABUN_TOOLS_PATH',
|
|
31
|
+
'tools-env': 'SYNABUN_TOOLS',
|
|
32
|
+
'legacy-runtime-file': 'SYNABUN_RUNTIME_PROFILE_PATH',
|
|
33
|
+
'legacy-profile-env': 'SYNABUN_PROFILE',
|
|
34
|
+
'default-tools': 'default-tools.json',
|
|
35
|
+
'legacy-default': 'active-profile.json',
|
|
36
|
+
header: 'X-Synabun-Tools',
|
|
37
|
+
channel: 'the worker channel',
|
|
38
|
+
};
|
|
39
|
+
/** The selection of a host's own list, with its host mode. */
|
|
40
|
+
export function selectionOf(groups, mode, source, added = []) {
|
|
41
|
+
return { groups: sortGroups(groups).filter(isSelectableGroup), mode, listError: null, source, added };
|
|
42
|
+
}
|
|
43
|
+
/** What a list that could not be read leaves: memory tools only (and the gated ones), strict until tool_groups succeeds. */
|
|
44
|
+
export function unreadableSelection(source, reason, hostMode) {
|
|
45
|
+
const name = SOURCE_NAMES[source];
|
|
46
|
+
return { groups: [], mode: 'strict', hostMode, listError: name ? `${name}: ${reason}` : reason, source, added: [] };
|
|
47
|
+
}
|
|
48
|
+
export function isClaudeCode(env = process.env) {
|
|
49
|
+
return env.CLAUDECODE === '1';
|
|
50
|
+
}
|
|
51
|
+
/** focus for Codex (SYNABUN_TOOL_CATALOG_MODE=deferred, or a managed Codex sidepanel), strict otherwise. */
|
|
52
|
+
export function readHostMode(env = process.env) {
|
|
53
|
+
const configured = String(env[TOOL_CATALOG_MODE_ENV] || '').trim().toLowerCase();
|
|
54
|
+
if (configured === 'deferred' || configured === 'focus')
|
|
55
|
+
return 'focus';
|
|
56
|
+
if (configured === 'profiled' || configured === 'strict')
|
|
57
|
+
return 'strict';
|
|
58
|
+
// Managed Codex sidepanels have always used this runtime prefix: one spawned before its launch environment
|
|
59
|
+
// named the catalog mode is a focus host all the same.
|
|
60
|
+
if (/^codex-sp-/.test(String(env.SYNABUN_TERMINAL_SESSION || '')))
|
|
61
|
+
return 'focus';
|
|
62
|
+
return 'strict';
|
|
63
|
+
}
|
|
64
|
+
const loggedProblems = new Set();
|
|
65
|
+
function logOnce(message) {
|
|
66
|
+
if (loggedProblems.has(message))
|
|
67
|
+
return;
|
|
68
|
+
loggedProblems.add(message);
|
|
69
|
+
console.error(`[SynaBun] ${message}`);
|
|
70
|
+
}
|
|
71
|
+
/** The registry's presets, read only to convert a stored profile name. */
|
|
72
|
+
export function readCustomPresets() {
|
|
73
|
+
try {
|
|
74
|
+
if (!existsSync(REGISTRY_PATH))
|
|
75
|
+
return null;
|
|
76
|
+
const registry = JSON.parse(readFileSync(REGISTRY_PATH, 'utf-8'));
|
|
77
|
+
const profiles = registry?.profiles;
|
|
78
|
+
return profiles && typeof profiles === 'object' && !Array.isArray(profiles) ? profiles : null;
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
logOnce(`Could not read the MCP registry for stored profile names: ${err instanceof Error ? err.message : String(err)}`);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function fromList(value, source, hostMode, legacy) {
|
|
86
|
+
const parsed = parseToolList(value, legacy ? { legacy: true, customPresets: readCustomPresets() } : {});
|
|
87
|
+
if (!parsed.ok)
|
|
88
|
+
return unreadableSelection(source, parsed.message, hostMode);
|
|
89
|
+
const resolved = resolveToolList(parsed.items, { source: 'runtime' });
|
|
90
|
+
if (!resolved.ok)
|
|
91
|
+
return unreadableSelection(source, resolved.message, hostMode);
|
|
92
|
+
return selectionOf(resolved.groups, hostMode, source, resolved.added);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The selection of a list given in code or by a request (a header, the worker channel), resolved like a runtime's
|
|
96
|
+
* own: `all` expanded, a browser group's `browser` added. One that cannot be read is memory tools only, strict.
|
|
97
|
+
*/
|
|
98
|
+
export function selectionFromList(value, mode, source, { legacy = false } = {}) {
|
|
99
|
+
return fromList(value, source, mode, legacy);
|
|
100
|
+
}
|
|
101
|
+
/** A runtime file holds `{ "tools": [...] }`; one an older Neural Interface wrote holds `{ "profile": "..." }`. */
|
|
102
|
+
function fromFile(path, source, hostMode) {
|
|
103
|
+
const file = String(path || '').trim();
|
|
104
|
+
if (!file)
|
|
105
|
+
return null;
|
|
106
|
+
let text;
|
|
107
|
+
try {
|
|
108
|
+
if (!existsSync(file))
|
|
109
|
+
return null;
|
|
110
|
+
text = readFileSync(file, 'utf-8');
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
return unreadableSelection(source, `${basename(file)} could not be read (${err instanceof Error ? err.message : String(err)})`, hostMode);
|
|
114
|
+
}
|
|
115
|
+
let data;
|
|
116
|
+
try {
|
|
117
|
+
data = JSON.parse(text);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return unreadableSelection(source, `${basename(file)} is not JSON`, hostMode);
|
|
121
|
+
}
|
|
122
|
+
const record = data && typeof data === 'object' && !Array.isArray(data) ? data : null;
|
|
123
|
+
if (record && Array.isArray(record.tools))
|
|
124
|
+
return fromList(record.tools, source, hostMode, false);
|
|
125
|
+
if (record && typeof record.profile === 'string')
|
|
126
|
+
return fromList(record.profile, source, hostMode, true);
|
|
127
|
+
return unreadableSelection(source, `${basename(file)} names no tools`, hostMode);
|
|
128
|
+
}
|
|
129
|
+
function fromEnv(value, source, hostMode, legacy) {
|
|
130
|
+
if (value === undefined || !value.trim())
|
|
131
|
+
return null;
|
|
132
|
+
return fromList(value, source, hostMode, legacy);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* The selection a runtime starts with, the first of: its runtime file (SYNABUN_TOOLS_PATH), its list
|
|
136
|
+
* (SYNABUN_TOOLS), the runtime file of an older Neural Interface (SYNABUN_RUNTIME_PROFILE_PATH), Claude Code
|
|
137
|
+
* (CLAUDECODE=1: focus on every group), the old SYNABUN_PROFILE, the owner's Default tools, the old
|
|
138
|
+
* active-profile.json, every group. The runtime's own pins come before CLAUDECODE, so a strict runtime that
|
|
139
|
+
* inherited it from a parent shell keeps its list. A list that cannot be read is not skipped: the runtime starts
|
|
140
|
+
* with memory tools only and says why (fail closed, never every group).
|
|
141
|
+
*/
|
|
142
|
+
export function readInitialTools(env = process.env) {
|
|
143
|
+
const hostMode = readHostMode(env);
|
|
144
|
+
const steps = [
|
|
145
|
+
() => fromFile(env[TOOLS_PATH_ENV], 'tools-file', hostMode),
|
|
146
|
+
() => fromEnv(env[TOOLS_ENV], 'tools-env', hostMode, false),
|
|
147
|
+
() => fromFile(env[LEGACY_RUNTIME_PROFILE_PATH_ENV], 'legacy-runtime-file', hostMode),
|
|
148
|
+
() => (isClaudeCode(env) ? selectionOf(SELECTABLE_GROUP_IDS, 'focus', 'claude-code') : null),
|
|
149
|
+
() => fromEnv(env[LEGACY_PROFILE_ENV], 'legacy-profile-env', hostMode, true),
|
|
150
|
+
() => fromFile(DEFAULT_TOOLS_PATH, 'default-tools', hostMode),
|
|
151
|
+
() => {
|
|
152
|
+
for (const path of LEGACY_DEFAULT_PROFILE_PATHS) {
|
|
153
|
+
const selection = fromFile(path, 'legacy-default', hostMode);
|
|
154
|
+
if (selection)
|
|
155
|
+
return selection;
|
|
156
|
+
}
|
|
157
|
+
return null;
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
for (const step of steps) {
|
|
161
|
+
const selection = step();
|
|
162
|
+
if (!selection)
|
|
163
|
+
continue;
|
|
164
|
+
if (selection.listError)
|
|
165
|
+
logOnce(`Could not read this runtime's tool list (${selection.listError}); only memory tools are loaded.`);
|
|
166
|
+
return selection;
|
|
167
|
+
}
|
|
168
|
+
return selectionOf(SELECTABLE_GROUP_IDS, hostMode, 'all');
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The value an older Neural Interface's /api/mcp/runtime-profile and runtime file understand for these groups: a
|
|
172
|
+
* comma list (every selectable id is one of its group names), or its always-on pseudo-group `memory` for none.
|
|
173
|
+
*/
|
|
174
|
+
export function legacyProfileValue(groups) {
|
|
175
|
+
const ids = sortGroups(groups).filter(isSelectableGroup);
|
|
176
|
+
return ids.length ? ids.join(',') : 'memory';
|
|
177
|
+
}
|
|
178
|
+
function writeJsonFile(path, value) {
|
|
179
|
+
const temp = `${path}.synabun-${process.pid}-${Date.now()}.tmp`;
|
|
180
|
+
try {
|
|
181
|
+
const dir = dirname(path);
|
|
182
|
+
if (!existsSync(dir))
|
|
183
|
+
mkdirSync(dir, { recursive: true });
|
|
184
|
+
writeFileSync(temp, JSON.stringify(value, null, 2) + '\n', 'utf-8');
|
|
185
|
+
renameSync(temp, path);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
try {
|
|
190
|
+
unlinkSync(temp);
|
|
191
|
+
}
|
|
192
|
+
catch { /* never written */ }
|
|
193
|
+
console.error(`[SynaBun] Failed to save this runtime's tools at ${path}:`, err);
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Save this runtime's groups where a restarted child of the same runtime reads them, never the shared default.
|
|
199
|
+
* Over HTTP there is no such file: process.env is the Neural Interface's own, not a caller's.
|
|
200
|
+
*/
|
|
201
|
+
export function runtimeToolsWithExternalRefs(groups) {
|
|
202
|
+
const tools = sortGroups(groups).filter(isSelectableGroup);
|
|
203
|
+
if (isHttpMode())
|
|
204
|
+
return tools; // HTTP identity belongs to the request; NI preserves the outer run's refs.
|
|
205
|
+
const path = String(process.env[TOOLS_PATH_ENV] || process.env[LEGACY_RUNTIME_PROFILE_PATH_ENV] || '').trim();
|
|
206
|
+
let previous = process.env[TOOLS_ENV] || '';
|
|
207
|
+
try {
|
|
208
|
+
if (path && existsSync(path))
|
|
209
|
+
previous = JSON.parse(readFileSync(path, 'utf8')).tools ?? previous;
|
|
210
|
+
}
|
|
211
|
+
catch { /* launch env remains the fallback */ }
|
|
212
|
+
const parsed = parseToolList(previous);
|
|
213
|
+
const refs = parsed.ok ? parsed.items.filter(item => item.startsWith('mcp:')) : [];
|
|
214
|
+
const compact = tools.length + refs.length > TOOL_LIST_LIMITS.maxItems && SELECTABLE_GROUP_IDS.every(id => tools.includes(id));
|
|
215
|
+
return [...(compact ? ['all'] : tools), ...refs];
|
|
216
|
+
}
|
|
217
|
+
export function persistRuntimeTools(groups) {
|
|
218
|
+
if (isHttpMode())
|
|
219
|
+
return null;
|
|
220
|
+
const tools = runtimeToolsWithExternalRefs(groups);
|
|
221
|
+
const toolsPath = String(process.env[TOOLS_PATH_ENV] || '').trim();
|
|
222
|
+
if (toolsPath)
|
|
223
|
+
return writeJsonFile(toolsPath, { tools, updatedAt: new Date().toISOString() }) ? 'tools-file' : null;
|
|
224
|
+
const legacyPath = String(process.env[LEGACY_RUNTIME_PROFILE_PATH_ENV] || '').trim();
|
|
225
|
+
if (legacyPath)
|
|
226
|
+
return writeJsonFile(legacyPath, { profile: legacyProfileValue(groups), tools }) ? 'legacy-runtime-file' : null;
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
export function logCodexConfigNoticeOnce() {
|
|
230
|
+
logOnce('Changing this runtime\'s tools never rewrites ~/.codex/config.toml: the canonical Codex registration loads every '
|
|
231
|
+
+ 'SynaBun tool (SYNABUN_TOOLS=all, deferred catalog) and a tool list only sets a Codex runtime\'s focus.');
|
|
232
|
+
}
|
|
233
|
+
function sameList(a, b) {
|
|
234
|
+
return a.length === b.length && a.every((item, index) => item === b[index]);
|
|
235
|
+
}
|
|
236
|
+
export class ToolRuntime {
|
|
237
|
+
groups;
|
|
238
|
+
mode;
|
|
239
|
+
hostMode;
|
|
240
|
+
listError;
|
|
241
|
+
source;
|
|
242
|
+
added;
|
|
243
|
+
role;
|
|
244
|
+
capabilities;
|
|
245
|
+
platform;
|
|
246
|
+
activeGroups;
|
|
247
|
+
toolGroups = new Map();
|
|
248
|
+
ungroupedTools = ALWAYS_ON_TOOLS.length;
|
|
249
|
+
onToolsChanged = null;
|
|
250
|
+
notificationTimer = null;
|
|
251
|
+
constructor(selection = readInitialTools(), options = {}) {
|
|
252
|
+
// stdio children of the Codex/OpenCode assistant brains receive the role through their launch env; HTTP
|
|
253
|
+
// sessions bind it later (setRole). The desktop grant the same way (setCapabilities).
|
|
254
|
+
this.role = options.role !== undefined ? options.role : sanitizeRole(process.env.SYNABUN_ROLE);
|
|
255
|
+
this.capabilities = new Set(options.capabilities ?? (sanitizeDesktopGrant(process.env.SYNABUN_DESKTOP_GRANT) ? ['computer'] : []));
|
|
256
|
+
this.platform = options.platform || process.platform;
|
|
257
|
+
this.groups = sortGroups(selection.groups).filter(isSelectableGroup);
|
|
258
|
+
this.mode = selection.mode;
|
|
259
|
+
this.hostMode = selection.hostMode ?? selection.mode;
|
|
260
|
+
this.listError = selection.listError ?? null;
|
|
261
|
+
this.source = selection.source;
|
|
262
|
+
this.added = [...(selection.added || [])];
|
|
263
|
+
this.activeGroups = this.resolveActive(this.groups);
|
|
264
|
+
}
|
|
265
|
+
getGroups() { return [...this.groups]; }
|
|
266
|
+
/** The groups the instructions name: the selection plus the gated groups the role and grant unlock. */
|
|
267
|
+
getActiveGroups() { return this.activeGroups; }
|
|
268
|
+
getMode() { return this.mode; }
|
|
269
|
+
/** The mode the host has once its list reads: focus for Codex and Claude Code, strict otherwise. */
|
|
270
|
+
getHostMode() { return this.hostMode; }
|
|
271
|
+
getListError() { return this.listError; }
|
|
272
|
+
getSource() { return this.source; }
|
|
273
|
+
getAdded() { return [...this.added]; }
|
|
274
|
+
getRole() { return this.role; }
|
|
275
|
+
getCapabilities() { return [...this.capabilities]; }
|
|
276
|
+
getSelection() {
|
|
277
|
+
return { groups: this.getGroups(), mode: this.mode, hostMode: this.hostMode, listError: this.listError, source: this.source, added: this.getAdded() };
|
|
278
|
+
}
|
|
279
|
+
/** Plain setter: callers apply() afterwards so the gated groups follow (index.ts setServerRole does both). */
|
|
280
|
+
setRole(role) { this.role = role; }
|
|
281
|
+
/** Plain setter, like setRole. */
|
|
282
|
+
setCapabilities(capabilities) { this.capabilities = new Set(capabilities); }
|
|
283
|
+
setToolGroup(name, tools) {
|
|
284
|
+
this.toolGroups.set(name, tools);
|
|
285
|
+
}
|
|
286
|
+
/** How many registered tools sit outside every group (the always-on tools, and any compatibility name). */
|
|
287
|
+
setUngroupedToolCount(count) {
|
|
288
|
+
this.ungroupedTools = count;
|
|
289
|
+
}
|
|
290
|
+
setOnToolsChanged(fn) {
|
|
291
|
+
this.onToolsChanged = fn;
|
|
292
|
+
}
|
|
293
|
+
// HTTP clients can refresh over their open notification stream without destroying an in-flight call.
|
|
294
|
+
inBandRefresh = null;
|
|
295
|
+
setInBandRefresh(fn) { this.inBandRefresh = fn; }
|
|
296
|
+
hasInBandRefresh() { return !!this.inBandRefresh; }
|
|
297
|
+
refreshBeforeReply() { return this.inBandRefresh?.() ?? Promise.resolve(false); }
|
|
298
|
+
dispose() {
|
|
299
|
+
if (this.notificationTimer)
|
|
300
|
+
clearTimeout(this.notificationTimer);
|
|
301
|
+
this.notificationTimer = null;
|
|
302
|
+
this.onToolsChanged = null;
|
|
303
|
+
this.inBandRefresh = null;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Coalesce one delayed tools/list_changed. The delay matters: OpenCode used to get the notification while the
|
|
307
|
+
* tool call that caused it was still in flight, and could abort or cache the old tool round trip.
|
|
308
|
+
*/
|
|
309
|
+
scheduleToolsChangedNotification(delayMs = 10) {
|
|
310
|
+
if (!this.onToolsChanged)
|
|
311
|
+
return false;
|
|
312
|
+
if (this.notificationTimer)
|
|
313
|
+
clearTimeout(this.notificationTimer);
|
|
314
|
+
this.notificationTimer = setTimeout(() => {
|
|
315
|
+
this.notificationTimer = null;
|
|
316
|
+
try {
|
|
317
|
+
void Promise.resolve(this.onToolsChanged?.()).catch((err) => {
|
|
318
|
+
console.error('[SynaBun] tools/list_changed notifier failed:', err);
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
console.error('[SynaBun] tools/list_changed notifier failed:', err);
|
|
323
|
+
}
|
|
324
|
+
}, Math.max(0, delayMs));
|
|
325
|
+
this.notificationTimer.unref?.();
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
/** The selection with the gates applied: a gated group is active iff this runtime's role or grant unlocks it. */
|
|
329
|
+
resolveActive(groups) {
|
|
330
|
+
const active = new Set(groups.filter(isSelectableGroup));
|
|
331
|
+
for (const [group, role] of Object.entries(ROLE_GATED_GROUPS))
|
|
332
|
+
if (this.role === role)
|
|
333
|
+
active.add(group);
|
|
334
|
+
for (const [group, capability] of Object.entries(CAPABILITY_GATED_GROUPS)) {
|
|
335
|
+
if (this.capabilities.has(capability) && (capability !== 'computer' || this.platform === 'darwin'))
|
|
336
|
+
active.add(group);
|
|
337
|
+
}
|
|
338
|
+
return active;
|
|
339
|
+
}
|
|
340
|
+
/** Tools this server advertises: the ones outside every group and each group's enabled tools. */
|
|
341
|
+
getAdvertisedToolCount() {
|
|
342
|
+
let total = this.ungroupedTools;
|
|
343
|
+
for (const tools of this.toolGroups.values())
|
|
344
|
+
total += tools.filter((tool) => tool.enabled).length;
|
|
345
|
+
return total;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Apply a new selection (or re-apply the current one after a role or grant change). Tools are flipped directly:
|
|
349
|
+
* RegisteredTool.enable()/disable() would each send a notification, and the caller sends one after its answer.
|
|
350
|
+
*/
|
|
351
|
+
apply(next = {}) {
|
|
352
|
+
const groups = next.groups ? sortGroups(next.groups).filter(isSelectableGroup) : this.groups;
|
|
353
|
+
const mode = next.mode ?? this.mode;
|
|
354
|
+
const listError = next.listError !== undefined ? next.listError : this.listError;
|
|
355
|
+
const previous = { groups: this.groups, mode: this.mode, listError: this.listError, active: this.activeGroups };
|
|
356
|
+
const active = this.resolveActive(groups);
|
|
357
|
+
let advertisedChanged = false;
|
|
358
|
+
for (const [group, tools] of this.toolGroups) {
|
|
359
|
+
// A gated group ignores the mode: a focus host gets every other group up front, never one its role or grant does not unlock.
|
|
360
|
+
const advertise = isGatedGroup(group) ? active.has(group) : mode === 'focus' || active.has(group);
|
|
361
|
+
for (const tool of tools) {
|
|
362
|
+
if (tool.enabled === advertise)
|
|
363
|
+
continue;
|
|
364
|
+
tool.enabled = advertise;
|
|
365
|
+
advertisedChanged = true;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
const enabled = sortGroups([...active].filter((group) => !previous.active.has(group)));
|
|
369
|
+
const disabled = sortGroups([...previous.active].filter((group) => !active.has(group)));
|
|
370
|
+
this.groups = groups;
|
|
371
|
+
this.mode = mode;
|
|
372
|
+
this.listError = listError;
|
|
373
|
+
this.activeGroups = active;
|
|
374
|
+
if (next.hostMode)
|
|
375
|
+
this.hostMode = next.hostMode;
|
|
376
|
+
if (next.source)
|
|
377
|
+
this.source = next.source;
|
|
378
|
+
if (next.added)
|
|
379
|
+
this.added = [...next.added];
|
|
380
|
+
const totalTools = this.getAdvertisedToolCount();
|
|
381
|
+
const changed = enabled.length > 0 || disabled.length > 0 || previous.mode !== mode
|
|
382
|
+
|| previous.listError !== listError || !sameList(previous.groups, groups);
|
|
383
|
+
if (changed) {
|
|
384
|
+
console.error(`[SynaBun] Tools (${mode}): ${groups.join(',') || 'memory only'} (${totalTools} tools, +${enabled.join(',') || 'none'}, -${disabled.join(',') || 'none'})`);
|
|
385
|
+
}
|
|
386
|
+
return {
|
|
387
|
+
groups: [...groups],
|
|
388
|
+
activeGroups: sortGroups(active),
|
|
389
|
+
enabled,
|
|
390
|
+
disabled,
|
|
391
|
+
added: [...this.added],
|
|
392
|
+
totalTools,
|
|
393
|
+
changed,
|
|
394
|
+
advertisedChanged,
|
|
395
|
+
mode,
|
|
396
|
+
listError,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=tool-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-runtime.js","sourceRoot":"","sources":["../../src/services/tool-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ export interface WbElement {
|
|
|
39
39
|
height?: number;
|
|
40
40
|
content?: string;
|
|
41
41
|
items?: string[];
|
|
42
|
+
levels?: number[];
|
|
42
43
|
ordered?: boolean;
|
|
43
44
|
fontSize?: number;
|
|
44
45
|
color?: string;
|
|
@@ -148,6 +149,28 @@ export type WbSectionTypeName = typeof SECTION_TYPE_NAMES[number];
|
|
|
148
149
|
export declare const ELEMENT_TYPES: readonly ["text", "list", "shape", "arrow", "pen", "image", "section"];
|
|
149
150
|
/** Section defaults keyed by section type — same 12 entries and values as the client. */
|
|
150
151
|
export declare const SECTION_DEFAULTS: Record<string, WbSectionDefault>;
|
|
152
|
+
/** Deepest list level (the client's WB_LIST_MAX_LEVEL). */
|
|
153
|
+
export declare const LIST_MAX_LEVEL = 4;
|
|
154
|
+
/** One list item as a caller may send it: a plain string (level 0) or { text, level }. */
|
|
155
|
+
export type WbListItemInput = string | {
|
|
156
|
+
text: string;
|
|
157
|
+
level?: number;
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* A list's items in either form -> `{ items, levels }` that keep the nesting rules (levels as long as items).
|
|
161
|
+
* A plain string takes `levels[i]` (0 without one); a { text, level } object's own level wins.
|
|
162
|
+
*/
|
|
163
|
+
export declare function normalizeListItems(items: unknown, levels?: unknown): {
|
|
164
|
+
items: string[];
|
|
165
|
+
levels: number[];
|
|
166
|
+
};
|
|
167
|
+
/** True when some item of the list is nested (only then is `levels` stored). */
|
|
168
|
+
export declare function hasNestedLevels(levels: readonly number[] | undefined): boolean;
|
|
169
|
+
/**
|
|
170
|
+
* The marker before each list item: a bullet per level (disc, circle, square, cycling) or the item's number in
|
|
171
|
+
* its level's style (1, a, i, cycling) with ".". Numbering restarts under every item above, as in the browser.
|
|
172
|
+
*/
|
|
173
|
+
export declare function listMarkers(levels: readonly number[], ordered: boolean): string[];
|
|
151
174
|
/**
|
|
152
175
|
* The drawable area as a rect: `{ x: xOffset||0, y: yOffset||0, width, height }`.
|
|
153
176
|
* Missing/invalid dimensions fall back to `DEFAULT_VIEWPORT`.
|
|
@@ -165,9 +188,10 @@ export declare function estimateTextSize(content: string | undefined, fontSize?:
|
|
|
165
188
|
};
|
|
166
189
|
/**
|
|
167
190
|
* Estimate the rendered size of a list element before the browser measures it.
|
|
168
|
-
* Same font metrics as text, plus the 1.4em bullet indent
|
|
191
|
+
* Same font metrics as text, plus the 1.4em bullet indent and 1.4em more per
|
|
192
|
+
* nesting level (`levels[i]`, 0 when missing); line-height 1.5.
|
|
169
193
|
*/
|
|
170
|
-
export declare function estimateListSize(items: string[] | undefined, fontSize?: number): {
|
|
194
|
+
export declare function estimateListSize(items: string[] | undefined, fontSize?: number, levels?: readonly number[]): {
|
|
171
195
|
width: number;
|
|
172
196
|
height: number;
|
|
173
197
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whiteboard-geometry.d.ts","sourceRoot":"","sources":["../../src/services/whiteboard-geometry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,0CAA0C;AAC1C,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvC,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE;AAEjG,kDAAkD;AAClD,MAAM,WAAW,MAAM;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAE/E,+EAA+E;AAC/E,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAClF,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"whiteboard-geometry.d.ts","sourceRoot":"","sources":["../../src/services/whiteboard-geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,8 +77,89 @@ function contentString(v) {
|
|
|
77
77
|
return v;
|
|
78
78
|
return v == null ? undefined : String(v);
|
|
79
79
|
}
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
// ── List nesting ──
|
|
81
|
+
// A list stores `items: string[]` and, only while some item is nested, `levels: number[]` beside them (levels[i]
|
|
82
|
+
// is the depth of items[i], 0 = top level; no `levels` = all 0, so older boards read unchanged). Callers may send
|
|
83
|
+
// items as { text, level } objects. Rules: the first item is level 0, an item is at most one level deeper than
|
|
84
|
+
// the item above it, no item is deeper than LIST_MAX_LEVEL. The browser and server.js read the same format
|
|
85
|
+
// through neural-interface/public/shared/whiteboard-list.js; keep the two on the same rules.
|
|
86
|
+
/** Deepest list level (the client's WB_LIST_MAX_LEVEL). */
|
|
87
|
+
export const LIST_MAX_LEVEL = 4;
|
|
88
|
+
function listItemText(item) {
|
|
89
|
+
if (typeof item === 'string')
|
|
90
|
+
return item;
|
|
91
|
+
if (item && typeof item === 'object') {
|
|
92
|
+
const t = item.text;
|
|
93
|
+
return t == null ? '' : String(t);
|
|
94
|
+
}
|
|
95
|
+
return item == null ? '' : String(item);
|
|
96
|
+
}
|
|
97
|
+
function listLevelOf(value) {
|
|
98
|
+
const n = Math.floor(Number(value));
|
|
99
|
+
return Number.isFinite(n) && n > 0 ? Math.min(n, LIST_MAX_LEVEL) : 0;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A list's items in either form -> `{ items, levels }` that keep the nesting rules (levels as long as items).
|
|
103
|
+
* A plain string takes `levels[i]` (0 without one); a { text, level } object's own level wins.
|
|
104
|
+
*/
|
|
105
|
+
export function normalizeListItems(items, levels) {
|
|
106
|
+
const list = Array.isArray(items) ? items : [];
|
|
107
|
+
const given = Array.isArray(levels) ? levels : [];
|
|
108
|
+
const out = [];
|
|
109
|
+
let above = -1;
|
|
110
|
+
list.forEach((item, i) => {
|
|
111
|
+
const own = item && typeof item === 'object' ? item.level : undefined;
|
|
112
|
+
const level = Math.min(listLevelOf(own !== undefined ? own : given[i]), above + 1);
|
|
113
|
+
out.push(level);
|
|
114
|
+
above = level;
|
|
115
|
+
});
|
|
116
|
+
return { items: list.map(listItemText), levels: out };
|
|
117
|
+
}
|
|
118
|
+
/** True when some item of the list is nested (only then is `levels` stored). */
|
|
119
|
+
export function hasNestedLevels(levels) {
|
|
120
|
+
return Array.isArray(levels) && levels.some(level => level > 0);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The marker before each list item: a bullet per level (disc, circle, square, cycling) or the item's number in
|
|
124
|
+
* its level's style (1, a, i, cycling) with ".". Numbering restarts under every item above, as in the browser.
|
|
125
|
+
*/
|
|
126
|
+
export function listMarkers(levels, ordered) {
|
|
127
|
+
const bullets = ['•', '◦', '▪'];
|
|
128
|
+
const counters = [];
|
|
129
|
+
return levels.map((raw) => {
|
|
130
|
+
const level = listLevelOf(raw);
|
|
131
|
+
if (!ordered)
|
|
132
|
+
return bullets[level % 3];
|
|
133
|
+
counters.length = level + 1;
|
|
134
|
+
counters[level] = (counters[level] || 0) + 1;
|
|
135
|
+
const n = counters[level];
|
|
136
|
+
const style = level % 3;
|
|
137
|
+
return `${style === 1 ? alphaCounter(n) : style === 2 ? romanCounter(n) : String(n)}.`;
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
function alphaCounter(n) {
|
|
141
|
+
let out = '';
|
|
142
|
+
while (n > 0) {
|
|
143
|
+
n -= 1;
|
|
144
|
+
out = String.fromCharCode(97 + (n % 26)) + out;
|
|
145
|
+
n = Math.floor(n / 26);
|
|
146
|
+
}
|
|
147
|
+
return out;
|
|
148
|
+
}
|
|
149
|
+
function romanCounter(n) {
|
|
150
|
+
const table = [[1000, 'm'], [900, 'cm'], [500, 'd'], [400, 'cd'], [100, 'c'], [90, 'xc'], [50, 'l'], [40, 'xl'], [10, 'x'], [9, 'ix'], [5, 'v'], [4, 'iv'], [1, 'i']];
|
|
151
|
+
let out = '';
|
|
152
|
+
for (const [value, digits] of table)
|
|
153
|
+
while (n >= value) {
|
|
154
|
+
out += digits;
|
|
155
|
+
n -= value;
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
/** Size estimate of a list element from its stored items and levels. */
|
|
160
|
+
function estimateListElement(el) {
|
|
161
|
+
const list = normalizeListItems(el.items, el.levels);
|
|
162
|
+
return estimateListSize(Array.isArray(el.items) ? list.items : undefined, positiveDim(el.fontSize) ?? 18, list.levels);
|
|
82
163
|
}
|
|
83
164
|
/** Stored size, or the type's fallback when a dimension is missing (see `elementBox`). */
|
|
84
165
|
function storedOrDefaultSize(el) {
|
|
@@ -92,7 +173,7 @@ function storedOrDefaultSize(el) {
|
|
|
92
173
|
return { width: w ?? est.width, height: h ?? est.height };
|
|
93
174
|
}
|
|
94
175
|
case 'list': {
|
|
95
|
-
const est =
|
|
176
|
+
const est = estimateListElement(el);
|
|
96
177
|
return { width: w ?? est.width, height: h ?? est.height };
|
|
97
178
|
}
|
|
98
179
|
case 'shape':
|
|
@@ -168,14 +249,16 @@ export function estimateTextSize(content, fontSize = 22) {
|
|
|
168
249
|
}
|
|
169
250
|
/**
|
|
170
251
|
* Estimate the rendered size of a list element before the browser measures it.
|
|
171
|
-
* Same font metrics as text, plus the 1.4em bullet indent
|
|
252
|
+
* Same font metrics as text, plus the 1.4em bullet indent and 1.4em more per
|
|
253
|
+
* nesting level (`levels[i]`, 0 when missing); line-height 1.5.
|
|
172
254
|
*/
|
|
173
|
-
export function estimateListSize(items, fontSize = 18) {
|
|
255
|
+
export function estimateListSize(items, fontSize = 18, levels) {
|
|
174
256
|
const list = items ?? [];
|
|
175
257
|
const rows = Math.max(1, list.length);
|
|
176
|
-
const
|
|
258
|
+
const indents = list.map((item, i) => codePointLength(item) * 0.6 + (1 + listLevelOf(levels?.[i])) * 1.4);
|
|
259
|
+
const widest = list.length ? Math.max(...indents) : 1.4;
|
|
177
260
|
return {
|
|
178
|
-
width: Math.max(120, Math.round(
|
|
261
|
+
width: Math.max(120, Math.round(widest * fontSize + 30)),
|
|
179
262
|
height: Math.max(30, Math.round(rows * fontSize * 1.5 + 22)),
|
|
180
263
|
};
|
|
181
264
|
}
|
|
@@ -204,7 +287,7 @@ export function ensureElementGeometry(el, opts = {}) {
|
|
|
204
287
|
if (force || el.measured !== true || missing) {
|
|
205
288
|
const size = el.type === 'text'
|
|
206
289
|
? estimateTextSize(contentString(el.content), positiveDim(el.fontSize) ?? 22)
|
|
207
|
-
:
|
|
290
|
+
: estimateListElement(el);
|
|
208
291
|
el.width = size.width;
|
|
209
292
|
el.height = size.height;
|
|
210
293
|
el.estimated = true;
|