synabun 2.0.10 → 2.2.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 +207 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +22 -0
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +13 -13
- 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 +30 -17
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +7 -6
- 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 +302 -0
- package/lib/virustotal.mjs +203 -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/budget-judgments.d.ts +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
- package/mcp-server/dist/services/budget-judgments.js +5 -3
- package/mcp-server/dist/services/budget-judgments.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/identity.d.ts +2 -2
- package/mcp-server/dist/services/identity.js +2 -2
- 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/memory-sessions.d.ts +1 -1
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-sessions.js +28 -2
- package/mcp-server/dist/services/memory-sessions.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +18 -11
- 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 +22 -63
- 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/typesafe-config.js +1 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- 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 +14 -14
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +29 -19
- 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/choice.d.ts +6 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -1
- package/mcp-server/dist/tools/choice.js +18 -13
- package/mcp-server/dist/tools/choice.js.map +1 -1
- package/mcp-server/dist/tools/git-tools.js +2 -2
- package/mcp-server/dist/tools/git-tools.js.map +1 -1
- 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/morelogin.d.ts.map +1 -1
- package/mcp-server/dist/tools/morelogin.js +9 -6
- package/mcp-server/dist/tools/morelogin.js.map +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 +642 -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/budget-judgments.ts +5 -3
- package/mcp-server/src/services/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/identity.ts +2 -2
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/memory-sessions.ts +24 -3
- package/mcp-server/src/services/neural-interface.ts +81 -21
- package/mcp-server/src/services/server-instructions.ts +29 -64
- 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/typesafe-config.ts +1 -1
- package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +29 -20
- package/mcp-server/src/tools/choice.ts +17 -12
- package/mcp-server/src/tools/git-tools.ts +2 -2
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/morelogin.ts +6 -4
- package/mcp-server/src/tools/skill-tools.ts +592 -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 +3953 -228
- package/neural-interface/i18n/pt-BR.json +3901 -179
- package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
- package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
- package/neural-interface/lib/antigravity/acp-connection.js +299 -0
- package/neural-interface/lib/antigravity/bypass.js +100 -0
- package/neural-interface/lib/antigravity/catalog.js +273 -0
- package/neural-interface/lib/antigravity/home.js +260 -0
- package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
- package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
- package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
- package/neural-interface/lib/antigravity/policy.js +74 -0
- package/neural-interface/lib/antigravity/tool-call.js +178 -0
- package/neural-interface/lib/antigravity/transcripts.js +252 -0
- package/neural-interface/lib/antigravity/usage.js +43 -0
- package/neural-interface/lib/assistant-api.js +128 -28
- package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
- 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-budget-planner.js +7 -3
- package/neural-interface/lib/assistant-budget-split.js +42 -15
- package/neural-interface/lib/assistant-catalog.js +81 -15
- package/neural-interface/lib/assistant-config.js +6 -3
- package/neural-interface/lib/assistant-dispatch.js +1073 -200
- package/neural-interface/lib/assistant-envelope.js +156 -2
- package/neural-interface/lib/assistant-evidence.js +80 -0
- package/neural-interface/lib/assistant-hidden-models.js +7 -5
- package/neural-interface/lib/assistant-persona.js +93 -19
- package/neural-interface/lib/assistant-plan-permissions.js +25 -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 +245 -38
- package/neural-interface/lib/assistant-runtime.js +214 -30
- package/neural-interface/lib/assistant-task-prompt.js +87 -21
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/assistant-usage.js +29 -0
- package/neural-interface/lib/backup-service.js +626 -4
- 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 +84 -0
- package/neural-interface/lib/browser-network-guard.js +476 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +198 -38
- package/neural-interface/lib/claude-agent-bridge.js +11 -2
- package/neural-interface/lib/claude-history-cache.js +210 -0
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-model-catalog.js +5 -1
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install-api.js +1 -1
- package/neural-interface/lib/cli-install.js +163 -154
- package/neural-interface/lib/cli-resolver.js +13 -3
- package/neural-interface/lib/cli-update-planner.js +52 -41
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-rollout-reader.js +52 -0
- package/neural-interface/lib/codex-worker-app-server.js +191 -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/editor-git-api.js +3 -20
- package/neural-interface/lib/exec-loop-command.js +13 -10
- package/neural-interface/lib/file-explorer-api.js +74 -40
- package/neural-interface/lib/file-explorer-watch.js +9 -3
- package/neural-interface/lib/git-bash/install.js +52 -6
- package/neural-interface/lib/git-bash/manager.js +59 -17
- package/neural-interface/lib/git-bash/pins.js +12 -0
- package/neural-interface/lib/git-read.js +2 -2
- package/neural-interface/lib/git-status-runner.js +390 -0
- package/neural-interface/lib/git-status-watchdog.js +40 -0
- package/neural-interface/lib/greeting/budgets.js +1 -0
- package/neural-interface/lib/greeting/engine.js +2 -2
- package/neural-interface/lib/greeting/sources.js +10 -12
- package/neural-interface/lib/greeting/writer.js +1 -1
- 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 +35 -33
- package/neural-interface/lib/mcp-external-servers.js +332 -0
- package/neural-interface/lib/mcp-installer.js +2 -1
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/memory-session-capture.js +17 -3
- package/neural-interface/lib/morelogin.js +177 -25
- package/neural-interface/lib/native-loop-providers.js +965 -66
- package/neural-interface/lib/native-loop-runtime.js +290 -42
- 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 +53 -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/path-confine.js +12 -9
- package/neural-interface/lib/peer-identity.js +793 -0
- package/neural-interface/lib/pty-host/core.js +28 -1
- package/neural-interface/lib/pty-host/lifetime.js +12 -0
- package/neural-interface/lib/pty-host/manager.js +12 -1
- package/neural-interface/lib/remote-policy.js +1 -1
- package/neural-interface/lib/request-gate.js +20 -2
- package/neural-interface/lib/rulesets/api.js +7 -6
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +180 -36
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/rulesets/render.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +81 -31
- 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 +298 -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 +285 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +569 -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 +216 -0
- package/neural-interface/lib/skills/eval-confinement.js +399 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +135 -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 +203 -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 +441 -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 +269 -0
- package/neural-interface/lib/skills/runtime-checks.js +358 -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 +530 -0
- package/neural-interface/lib/skills/telemetry.js +119 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/synabun-version.js +1 -1
- package/neural-interface/lib/system-activity.js +1 -1
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/whatsapp/brain.js +7 -3
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/whatsapp/cards.js +22 -9
- package/neural-interface/lib/whatsapp/config.js +1 -1
- package/neural-interface/lib/worker-confinement.js +1268 -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-question.js +74 -0
- package/neural-interface/lib/worker-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +238 -0
- package/neural-interface/lib/worker-sandbox.js +329 -0
- package/neural-interface/package-lock.json +34 -12
- package/neural-interface/package.json +3 -2
- package/neural-interface/public/index.html +3 -1
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +3 -3
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +125 -31
- package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
- package/neural-interface/public/shared/agy/agy-client.js +266 -0
- package/neural-interface/public/shared/agy/agy-commands.js +120 -0
- package/neural-interface/public/shared/agy/agy-copy.js +326 -0
- package/neural-interface/public/shared/agy/agy-diff.js +161 -0
- package/neural-interface/public/shared/agy/agy-events.js +469 -0
- package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
- package/neural-interface/public/shared/agy/agy-options.js +232 -0
- package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
- package/neural-interface/public/shared/agy/agy-render.js +392 -0
- package/neural-interface/public/shared/agy/agy-setup.js +149 -0
- package/neural-interface/public/shared/agy/agy-styles.js +604 -0
- package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
- 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 +36 -6
- package/neural-interface/public/shared/assistant/asst-api.js +1 -1
- 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 +105 -44
- package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
- package/neural-interface/public/shared/assistant/asst-control.js +205 -26
- package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
- package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
- package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -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 +151 -19
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
- package/neural-interface/public/shared/assistant/asst-render.js +445 -82
- package/neural-interface/public/shared/assistant/asst-route.js +304 -53
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
- package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
- package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
- package/neural-interface/public/shared/assistant/asst-state.js +87 -24
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
- package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
- 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 +34 -10
- package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
- package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
- package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
- package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-controller.js +218 -0
- package/neural-interface/public/shared/cli-install-view.js +11 -12
- package/neural-interface/public/shared/cli-status.js +11 -10
- package/neural-interface/public/shared/constants.js +5 -4
- 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 +367 -0
- package/neural-interface/public/shared/context-menu.js +372 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
- package/neural-interface/public/shared/cp/cp-restore.js +162 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/desktop-bridge.js +17 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
- package/neural-interface/public/shared/desktop-titlebar.js +13 -4
- package/neural-interface/public/shared/desktop-update-view.js +21 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/explorer/fx-api.js +4 -4
- package/neural-interface/public/shared/explorer/fx-links.js +3 -3
- package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
- package/neural-interface/public/shared/explorer/fx-main.js +48 -16
- package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
- package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
- package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
- package/neural-interface/public/shared/html-shell.js +30 -15
- 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 +74 -259
- 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-rehydrate.js +13 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
- 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 +17 -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 +60 -50
- package/neural-interface/public/shared/page-session.js +96 -0
- package/neural-interface/public/shared/provider-icons.js +4 -2
- 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-rules.js +2 -2
- 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/showcase-privacy.js +6 -1
- package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
- package/neural-interface/public/shared/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +222 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +133 -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 +149 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +513 -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 +237 -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 +230 -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-fixes-view.js +359 -0
- package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -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 +282 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +690 -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 +249 -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 +426 -0
- package/neural-interface/public/shared/state.js +1 -1
- package/neural-interface/public/shared/streaming-markdown.js +58 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +1822 -1756
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- package/neural-interface/public/shared/text-cache.js +29 -0
- 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/topright-overflow-logic.js +54 -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-antigravity-panel.js +19 -0
- package/neural-interface/public/shared/ui-assistant.js +2 -0
- package/neural-interface/public/shared/ui-automation-studio.js +111 -140
- package/neural-interface/public/shared/ui-claude-panel.js +376 -82
- package/neural-interface/public/shared/ui-cli-banner.js +23 -167
- 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-file-explorer.js +48 -6
- package/neural-interface/public/shared/ui-file-links.js +2 -2
- package/neural-interface/public/shared/ui-games.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +50 -47
- package/neural-interface/public/shared/ui-judgments.js +1 -1
- package/neural-interface/public/shared/ui-keybinds.js +33 -2
- package/neural-interface/public/shared/ui-link.js +3 -3
- package/neural-interface/public/shared/ui-menubar.js +10 -20
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
- package/neural-interface/public/shared/ui-navbar.js +49 -24
- package/neural-interface/public/shared/ui-notifications.js +1 -0
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-resume.js +9 -7
- package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
- package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
- package/neural-interface/public/shared/ui-sessions.js +27 -15
- package/neural-interface/public/shared/ui-settings.js +683 -526
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
- package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
- 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 +270 -190
- package/neural-interface/public/shared/ui-tool-updates.js +6 -4
- package/neural-interface/public/shared/ui-tooltip.js +81 -51
- package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
- 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 +312 -59
- package/neural-interface/public/shared/ui-worker-end.js +5 -1
- 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 +3 -3
- 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-questions.js +34 -0
- package/neural-interface/public/shared/worker-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +2 -2
- 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 +4553 -2855
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +34 -12
- package/package.json +17 -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 +6 -6
- 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
- /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// SynaBun Neural Interface — the CLI banner of the side panels: what it says
|
|
3
3
|
// ═══════════════════════════════════════════
|
|
4
4
|
//
|
|
5
|
-
// What the Claude Code, Codex and OpenCode panels show above their transcript
|
|
5
|
+
// What the Claude Code, Codex and OpenCode panels show above their transcript (and the Antigravity panel's setup
|
|
6
|
+
// card words its install steps with)
|
|
6
7
|
// for one CLI: nothing while it is installed, "not installed" with a one-click
|
|
7
8
|
// Install (the vendor's own installer, run by the server: POST
|
|
8
9
|
// /api/cli/install/:tool) and the command to run by hand, the progress of an
|
|
@@ -34,8 +35,8 @@ export const CLI_INSTALL_COPY = Object.freeze({
|
|
|
34
35
|
stepPath: 'Adding the CLI folder to your PATH…',
|
|
35
36
|
stepPathAdded: 'Added {dir} to your PATH',
|
|
36
37
|
bodyMissing: 'Install it with one click from {vendor}\'s official installer, or run:',
|
|
37
|
-
bodyMissingArchive: 'Install it with one click from {vendor}\'s official release, or run:',
|
|
38
38
|
bodyMissingManual: 'Install it with this command, then re-check:',
|
|
39
|
+
bodyMissingGuide: 'Follow its install guide, then re-check.',
|
|
39
40
|
bodyBroken: '{label} was found at {path}, but it could not be started:',
|
|
40
41
|
bodyBrokenVersion: '{label} {version} was found at {path}, but it could not be started:',
|
|
41
42
|
bodyBrokenLatched: '{label} is installed, but it could not be started:',
|
|
@@ -50,8 +51,6 @@ export const CLI_INSTALL_COPY = Object.freeze({
|
|
|
50
51
|
stepDownloadReceived: 'Downloading: {received} MB',
|
|
51
52
|
stepVerify: 'Checking the download…',
|
|
52
53
|
stepRun: 'Running the official installer…',
|
|
53
|
-
stepExtract: 'Unpacking…',
|
|
54
|
-
stepPlace: 'Putting it in place…',
|
|
55
54
|
stepCheck: 'Checking that it starts…',
|
|
56
55
|
errorOffline: 'The download server could not be reached. Check the connection and try again.',
|
|
57
56
|
errorHttp: 'The download server answered with an error. Try again in a moment.',
|
|
@@ -60,7 +59,6 @@ export const CLI_INSTALL_COPY = Object.freeze({
|
|
|
60
59
|
errorTimeout: 'The installer took too long and was stopped.',
|
|
61
60
|
errorInstallerFailed: 'The official installer stopped with an error.',
|
|
62
61
|
errorNotFound: 'The installer finished, but SynaBun does not find {label} afterwards.',
|
|
63
|
-
errorUnpack: 'The download could not be unpacked, so it was removed.',
|
|
64
62
|
errorDisk: 'The files could not be written. Check free space and permissions, then try again.',
|
|
65
63
|
errorCancelled: 'The installation was stopped.',
|
|
66
64
|
errorUnsupported: 'There is no one-click install for this system. Use the command below or the install guide.',
|
|
@@ -84,24 +82,24 @@ export const CLI_VENDORS = Object.freeze({
|
|
|
84
82
|
'claude-code': 'Anthropic',
|
|
85
83
|
codex: 'OpenAI',
|
|
86
84
|
opencode: 'OpenCode',
|
|
87
|
-
|
|
85
|
+
antigravity: 'Google',
|
|
88
86
|
});
|
|
89
87
|
|
|
90
88
|
/** The CLIs a server can install with one click (POST /api/cli/install/:tool). */
|
|
91
|
-
export const INSTALLABLE_CLIS = Object.freeze(['claude-code', 'codex', 'opencode']);
|
|
89
|
+
export const INSTALLABLE_CLIS = Object.freeze(['claude-code', 'codex', 'opencode', 'antigravity']);
|
|
92
90
|
|
|
93
91
|
/** The steps an install reports (`{ type: 'step' }`), in the order they can come. */
|
|
94
|
-
export const INSTALL_STEPS = Object.freeze(['start', 'download', 'verify', 'run', '
|
|
92
|
+
export const INSTALL_STEPS = Object.freeze(['start', 'download', 'verify', 'run', 'check', 'path']);
|
|
95
93
|
|
|
96
94
|
const STEP_COPY = Object.freeze({
|
|
97
95
|
start: 'stepStart', download: 'stepDownload', verify: 'stepVerify', run: 'stepRun',
|
|
98
|
-
|
|
96
|
+
check: 'stepCheck', path: 'stepPath',
|
|
99
97
|
});
|
|
100
98
|
|
|
101
99
|
const ERROR_COPY = Object.freeze({
|
|
102
100
|
offline: 'errorOffline', http: 'errorHttp', checksum: 'errorChecksum', interrupted: 'errorInterrupted',
|
|
103
101
|
timeout: 'errorTimeout', 'installer-failed': 'errorInstallerFailed', 'not-found-after-install': 'errorNotFound',
|
|
104
|
-
|
|
102
|
+
disk: 'errorDisk', cancelled: 'errorCancelled', unsupported: 'errorUnsupported',
|
|
105
103
|
refused: 'errorRefused', connection: 'errorConnection',
|
|
106
104
|
});
|
|
107
105
|
|
|
@@ -375,9 +373,10 @@ export function cliBannerView({ toolKey, label = '', info = null, forced = null,
|
|
|
375
373
|
recheck: true,
|
|
376
374
|
});
|
|
377
375
|
}
|
|
376
|
+
// No command at all (none from the server, and none on the page either): the guide only.
|
|
378
377
|
const text = offer
|
|
379
|
-
? t(
|
|
380
|
-
: t('bodyMissingManual');
|
|
378
|
+
? t('bodyMissing', { vendor: CLI_VENDORS[toolKey] || name, label: name })
|
|
379
|
+
: t(command ? 'bodyMissingManual' : 'bodyMissingGuide');
|
|
381
380
|
return Object.assign(view, {
|
|
382
381
|
show: true, blocked: true, kind: 'missing', tone: 'warn', icon: '!',
|
|
383
382
|
title: t('titleMissing', { label: name }),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// ═══════════════════════════════════════════
|
|
2
2
|
// SynaBun — CLI Status (shared)
|
|
3
|
-
// Detects whether Claude / Codex / OpenCode CLIs are installed by
|
|
3
|
+
// Detects whether Claude / Codex / OpenCode / Antigravity CLIs are installed by
|
|
4
4
|
// querying /api/system/tool-versions. Caches the response, fans out
|
|
5
5
|
// updates to subscribers, and auto-polls (every 30s) while at least
|
|
6
6
|
// one subscribed tool is not installed (missing, or found but broken).
|
|
@@ -17,33 +17,34 @@ import { cliStateOf, cliInstallOffer, INSTALLABLE_CLIS } from './cli-install-vie
|
|
|
17
17
|
|
|
18
18
|
export { cliStateOf, cliInstallOffer };
|
|
19
19
|
|
|
20
|
-
const TOOL_KEYS = ['claude-code', 'codex', 'opencode', '
|
|
20
|
+
const TOOL_KEYS = ['claude-code', 'codex', 'opencode', 'antigravity'];
|
|
21
21
|
|
|
22
22
|
// The vendors' install pages. The server's `guideUrl` wins when it sends one.
|
|
23
23
|
const CLI_DOC_URLS = {
|
|
24
24
|
'claude-code': 'https://code.claude.com/docs/en/setup',
|
|
25
25
|
'codex': 'https://learn.chatgpt.com/docs/codex/cli',
|
|
26
|
-
'opencode': 'https://opencode.ai/docs
|
|
27
|
-
'
|
|
26
|
+
'opencode': 'https://opencode.ai/v2/docs',
|
|
27
|
+
'antigravity': 'https://antigravity.google/docs/getting-started',
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
// Fallback only. The server computes the command that fits the machine (the
|
|
31
31
|
// vendor's recommended installer for its system, or the package manager the
|
|
32
|
-
// other CLIs came from: buildInstallCommand in lib/cli-update-planner.js
|
|
33
|
-
//
|
|
34
|
-
//
|
|
32
|
+
// other CLIs came from: buildInstallCommand in lib/cli-update-planner.js; for
|
|
33
|
+
// the Antigravity CLI, the command of the install its button runs there, which
|
|
34
|
+
// is Homebrew's cask on a Mac that has Homebrew) and returns it as
|
|
35
|
+
// `installCommand`. These apply only before the first tool-versions response.
|
|
35
36
|
const CLI_INSTALL_CMDS = {
|
|
36
37
|
'claude-code': { posix: 'curl -fsSL https://claude.ai/install.sh | bash', windows: 'irm https://claude.ai/install.ps1 | iex' },
|
|
37
38
|
'codex': { posix: 'curl -fsSL https://chatgpt.com/codex/install.sh | sh', windows: 'powershell -ExecutionPolicy ByPass -c "irm https://chatgpt.com/codex/install.ps1 | iex"' },
|
|
38
|
-
'opencode': { posix: 'curl -fsSL https://opencode.ai/install | bash', windows: '
|
|
39
|
-
'
|
|
39
|
+
'opencode': { posix: 'curl -fsSL https://opencode.ai/v2/install | bash', windows: 'winget install --id Anomaly.OpenCode --exact' },
|
|
40
|
+
'antigravity': { posix: 'curl -fsSL https://antigravity.google/cli/install.sh | bash', windows: 'irm https://antigravity.google/cli/install.ps1 | iex' },
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
const CLI_LABELS = {
|
|
43
44
|
'claude-code': 'Claude Code',
|
|
44
45
|
'codex': 'Codex',
|
|
45
46
|
'opencode': 'OpenCode',
|
|
46
|
-
'
|
|
47
|
+
'antigravity': 'Antigravity CLI',
|
|
47
48
|
};
|
|
48
49
|
|
|
49
50
|
const POLL_INTERVAL_MS = 30000;
|
|
@@ -29,6 +29,7 @@ export const KEYS = {
|
|
|
29
29
|
PANEL_PREFIX: 'neural-panel-',
|
|
30
30
|
NODE_POS_3D: 'synabun-node-positions',
|
|
31
31
|
NODE_POS_2D: 'synabun-node-positions-2d',
|
|
32
|
+
VIEW_VARIANT: 'neural-view-variant', // canonical memory map variant; legacy 2D preferences migrate at boot
|
|
32
33
|
MAP_VIEW: 'neural-map-view', // 3D memory map options {neighbors, recency, grid}
|
|
33
34
|
INTERFACE_CONFIG: 'neural-interface-config',
|
|
34
35
|
EXPLORER_CAT_ORDER: 'neural-explorer-cat-order',
|
|
@@ -65,6 +66,7 @@ export const KEYS = {
|
|
|
65
66
|
ACTIVE_WORKSPACE: 'neural-active-workspace', // sessionStorage
|
|
66
67
|
GRID_SNAP: 'neural-grid-snap',
|
|
67
68
|
TOPRIGHT_TOOLS_HIDDEN: 'neural-topright-tools-hidden', // the workspace tools toggle is off ('true')
|
|
69
|
+
WHITEBOARD_TOOLBAR_HIDDEN: 'neural-whiteboard-toolbar-hidden', // the whiteboard rail (#wb-toolbar) is hidden behind the logo button ('true')
|
|
68
70
|
CATEGORIES_VISIBLE: 'neural-categories-visible',
|
|
69
71
|
WHITEBOARD: 'neural-whiteboard',
|
|
70
72
|
WHITEBOARD_RULESET_ALERT_DISMISSED: 'neural-whiteboard-ruleset-alert-dismissed',
|
|
@@ -72,6 +74,7 @@ export const KEYS = {
|
|
|
72
74
|
TUTORIAL_SKIPPED: 'neural-tutorial-skipped',
|
|
73
75
|
TUTORIAL_STEP: 'neural-tutorial-step',
|
|
74
76
|
TUTORIAL_STARTED: 'neural-tutorial-started',
|
|
77
|
+
TOUR_TIPS: 'neural-tour-tips',
|
|
75
78
|
ONBOARDING_EXPLORE: 'neural-onboarding-explore',
|
|
76
79
|
ONBOARDING_CLI: 'neural-onboarding-cli',
|
|
77
80
|
ONBOARDING_MODEL: 'neural-onboarding-model',
|
|
@@ -120,13 +123,12 @@ export const DEFAULT_KEYBINDS = {
|
|
|
120
123
|
'toggle-help': '?',
|
|
121
124
|
'toggle-explorer': 'f',
|
|
122
125
|
'toggle-focus-mode': 'v',
|
|
123
|
-
'toggle-minimap': 'm',
|
|
124
126
|
'open-keybinds': 'n',
|
|
125
127
|
'launch-assistant': 'a',
|
|
126
128
|
'toggle-assistant': 'Ctrl+a',
|
|
127
129
|
'launch-claude': '1',
|
|
128
130
|
'launch-codex': '2',
|
|
129
|
-
'launch-
|
|
131
|
+
'launch-antigravity': '3',
|
|
130
132
|
'launch-opencode': '4',
|
|
131
133
|
'launch-browser': 'b',
|
|
132
134
|
'launch-youtube': 'y',
|
|
@@ -146,7 +148,6 @@ export const KEYBIND_META = {
|
|
|
146
148
|
'toggle-help': { label: 'Toggle Help', group: 'Navigation' },
|
|
147
149
|
'toggle-explorer': { label: 'Toggle Explorer', group: 'Navigation' },
|
|
148
150
|
'toggle-focus-mode': { label: 'Toggle Focus Mode', group: 'Navigation' },
|
|
149
|
-
'toggle-minimap': { label: 'Toggle Minimap', group: 'View' },
|
|
150
151
|
'open-settings': { label: 'Open Settings', group: 'Settings' },
|
|
151
152
|
'open-keybinds': { label: 'Open Keybinds', group: 'Settings' },
|
|
152
153
|
'launch-assistant': { label: 'Assistant', group: 'Launch App', icon: 'assistant' },
|
|
@@ -154,7 +155,7 @@ export const KEYBIND_META = {
|
|
|
154
155
|
'toggle-assistant-panel': { label: 'Toggle Assistant Sidepanel', group: 'Launch App', icon: 'assistant' },
|
|
155
156
|
'launch-claude': { label: 'Claude Code', group: 'Launch App', icon: 'claude' },
|
|
156
157
|
'launch-codex': { label: 'Codex CLI', group: 'Launch App', icon: 'codex' },
|
|
157
|
-
'launch-
|
|
158
|
+
'launch-antigravity': { label: 'Antigravity CLI', group: 'Launch App', icon: 'antigravity' },
|
|
158
159
|
'launch-opencode': { label: 'OpenCode', group: 'Launch App', icon: 'opencode' },
|
|
159
160
|
'launch-browser': { label: 'Browser', group: 'Launch App', icon: 'browser' },
|
|
160
161
|
'launch-youtube': { label: 'YouTube', group: 'Launch App', icon: 'youtube' },
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — The app's context menu: the areas registry
|
|
3
|
+
// What a part of the app adds to the app's right-click menu for an element
|
|
4
|
+
// in it (a memory, the memory map, the focus-mode whiteboard). No imports,
|
|
5
|
+
// so a module as low as the whiteboard can register its area without
|
|
6
|
+
// pulling in the menu's actions; ui-context-menu.js reads it at every open.
|
|
7
|
+
// ═══════════════════════════════════════════
|
|
8
|
+
|
|
9
|
+
const _areas = [];
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Add what a part of the app contributes to the menu. `match(element)` returns the area the element is in
|
|
13
|
+
* (`{ kind: 'memory' | 'map' | 'focus', …, act? }`, see context-menu-model.js) or null. The first area that
|
|
14
|
+
* matches wins, in the order they were registered. Returns a function that removes it again.
|
|
15
|
+
* @param {{ id?: string, match: (el: Element) => object | null }} area
|
|
16
|
+
*/
|
|
17
|
+
export function registerContextMenuArea(area) {
|
|
18
|
+
_areas.push(area);
|
|
19
|
+
return () => { const i = _areas.indexOf(area); if (i >= 0) _areas.splice(i, 1); };
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** The area an element is in, or null. An area whose `match` throws is skipped (and named in the console). */
|
|
23
|
+
export function areaAt(el) {
|
|
24
|
+
if (!el) return null;
|
|
25
|
+
for (const area of _areas) {
|
|
26
|
+
try {
|
|
27
|
+
const found = area.match(el);
|
|
28
|
+
if (found) return found;
|
|
29
|
+
} catch (err) {
|
|
30
|
+
console.warn(`[context-menu] area ${area.id || '?'} failed:`, err);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — Context menu: what decides
|
|
3
|
+
// No DOM and no imports: the component (context-menu.js) and the app's
|
|
4
|
+
// global registration (ui-context-menu.js) draw what these functions say,
|
|
5
|
+
// and node --test checks them (tests/context-menu-logic.test.mjs).
|
|
6
|
+
// ═══════════════════════════════════════════
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {object} MenuItem
|
|
10
|
+
* @property {string} [id]
|
|
11
|
+
* @property {string} [label]
|
|
12
|
+
* @property {string} [icon] trusted SVG markup (the app's own icons, never page text)
|
|
13
|
+
* @property {string} [shortcut] the key as menus show it ('' when the action has none)
|
|
14
|
+
* @property {boolean} [disabled]
|
|
15
|
+
* @property {boolean} [checked] a toggle: drawn with a check, role menuitemcheckbox
|
|
16
|
+
* @property {boolean} [hidden] left out of the menu
|
|
17
|
+
* @property {MenuItem[]} [submenu]
|
|
18
|
+
* @property {() => unknown} [run]
|
|
19
|
+
* @property {boolean} [separator]
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export const VIEWPORT_MARGIN = 8;
|
|
23
|
+
export const SUBMENU_GAP = 2;
|
|
24
|
+
// What a submenu's first row sits under: the menu's padding plus the row's margin.
|
|
25
|
+
export const SUBMENU_LEAD = 6;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Items as the menu draws them: hidden ones and ones without a label left out, a submenu with nothing in it left
|
|
29
|
+
* out, no separator at either end or next to another.
|
|
30
|
+
* @param {(MenuItem | null | undefined)[]} items
|
|
31
|
+
* @returns {MenuItem[]}
|
|
32
|
+
*/
|
|
33
|
+
export function normalizeItems(items) {
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const item of items || []) {
|
|
36
|
+
if (!item || item.hidden) continue;
|
|
37
|
+
if (item.separator) {
|
|
38
|
+
if (out.length && !out[out.length - 1].separator) out.push({ separator: true });
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (!item.label) continue;
|
|
42
|
+
if (item.submenu) {
|
|
43
|
+
const submenu = normalizeItems(item.submenu);
|
|
44
|
+
if (!submenu.length) continue;
|
|
45
|
+
out.push({ ...item, submenu });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
out.push(item);
|
|
49
|
+
}
|
|
50
|
+
while (out.length && out[out.length - 1].separator) out.pop();
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Sections in order, one separator between two that have something in them.
|
|
56
|
+
* @param {(MenuItem[] | null | undefined)[]} sections
|
|
57
|
+
* @returns {MenuItem[]}
|
|
58
|
+
*/
|
|
59
|
+
export function joinSections(sections) {
|
|
60
|
+
const out = [];
|
|
61
|
+
for (const section of sections || []) {
|
|
62
|
+
const items = normalizeItems(section);
|
|
63
|
+
if (!items.length) continue;
|
|
64
|
+
if (out.length) out.push({ separator: true });
|
|
65
|
+
out.push(...items);
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** How many rows a menu has at its top level (separators do not count). */
|
|
71
|
+
export function countRows(items) {
|
|
72
|
+
return (items || []).filter((item) => item && !item.separator).length;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Where a menu of `width` × `height` goes for a press at (x, y): down and to the right of it, flipped up or left
|
|
77
|
+
* when that side has no room, and kept inside the window either way. `bounds` ({ left, top, right, bottom }) is the
|
|
78
|
+
* area it is kept in instead of the window: the app frame (app-frame.js) for a press inside it.
|
|
79
|
+
* @returns {{ left: number, top: number }}
|
|
80
|
+
*/
|
|
81
|
+
export function placeMenu({ x, y, width, height, viewportWidth, viewportHeight, margin = VIEWPORT_MARGIN, bounds = null }) {
|
|
82
|
+
const b = bounds || { left: 0, top: 0, right: viewportWidth, bottom: viewportHeight };
|
|
83
|
+
const fit = (at, size, lo, hi) => {
|
|
84
|
+
const first = lo + margin; // the first place it may start
|
|
85
|
+
const furthest = hi - margin - size; // the last place it may start and still end inside the margin
|
|
86
|
+
if (furthest < first) return first; // larger than the area: from the margin (it scrolls)
|
|
87
|
+
if (at + size <= hi - margin) return Math.max(first, at);
|
|
88
|
+
if (at - size >= first) return Math.min(at - size, furthest);
|
|
89
|
+
return furthest;
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
left: Math.round(fit(x, width, b.left, b.right)),
|
|
93
|
+
top: Math.round(fit(y, height, b.top, b.bottom)),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Where a submenu goes: beside the menu it opens from, its first row level with the row that opened it; on the left
|
|
99
|
+
* when the window (or `bounds`, as for placeMenu) has no room on the right, and kept inside it.
|
|
100
|
+
* @param {{ left: number, right: number }} o.menuRect the menu it opens from
|
|
101
|
+
* @param {{ top: number }} o.rowRect the row that opens it
|
|
102
|
+
* @returns {{ left: number, top: number, side: 'right' | 'left' }}
|
|
103
|
+
*/
|
|
104
|
+
export function placeSubmenu({ menuRect, rowRect, width, height, viewportWidth, viewportHeight,
|
|
105
|
+
margin = VIEWPORT_MARGIN, gap = SUBMENU_GAP, lead = SUBMENU_LEAD, bounds = null }) {
|
|
106
|
+
const b = bounds || { left: 0, top: 0, right: viewportWidth, bottom: viewportHeight };
|
|
107
|
+
let side = 'right';
|
|
108
|
+
let left = menuRect.right + gap;
|
|
109
|
+
if (left + width > b.right - margin) {
|
|
110
|
+
const leftSide = menuRect.left - gap - width;
|
|
111
|
+
if (leftSide >= b.left + margin) { left = leftSide; side = 'left'; }
|
|
112
|
+
else left = Math.max(b.left + margin, b.right - margin - width);
|
|
113
|
+
}
|
|
114
|
+
const top = Math.max(b.top + margin, Math.min(rowRect.top - lead, b.bottom - margin - height));
|
|
115
|
+
return { left: Math.round(left), top: Math.round(top), side };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Where a menu opened from the keyboard points: inside the focused element near its top-left corner, or at its
|
|
120
|
+
* middle when it fills most of the window (the memory map).
|
|
121
|
+
*/
|
|
122
|
+
export function anchorPoint(rect, viewportWidth, viewportHeight) {
|
|
123
|
+
if (!rect) return { x: Math.round(viewportWidth / 2), y: Math.round(viewportHeight / 3) };
|
|
124
|
+
if (rect.width > viewportWidth * 0.6 && rect.height > viewportHeight * 0.6) {
|
|
125
|
+
return { x: Math.round(rect.left + rect.width / 2), y: Math.round(rect.top + rect.height / 2) };
|
|
126
|
+
}
|
|
127
|
+
return { x: Math.round(rect.left + Math.min(rect.width / 2, 16)), y: Math.round(rect.top + Math.min(rect.height / 2, 16)) };
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const selectable = (item) => !!item && !item.separator && !item.disabled;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* The next row the keyboard can land on from `from` in direction `dir` (1 down, -1 up), wrapping; -1 when none can.
|
|
134
|
+
* From -1, down is the first row and up the last.
|
|
135
|
+
*/
|
|
136
|
+
export function stepIndex(items, from, dir) {
|
|
137
|
+
const n = items?.length || 0;
|
|
138
|
+
if (!n) return -1;
|
|
139
|
+
let i = from;
|
|
140
|
+
for (let k = 0; k < n; k++) {
|
|
141
|
+
i = i < 0 ? (dir > 0 ? 0 : n - 1) : (i + dir + n) % n;
|
|
142
|
+
if (selectable(items[i])) return i;
|
|
143
|
+
}
|
|
144
|
+
return -1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/** The first and the last row the keyboard can land on. */
|
|
148
|
+
export const firstIndex = (items) => stepIndex(items, -1, 1);
|
|
149
|
+
export const lastIndex = (items) => stepIndex(items, -1, -1);
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The row typed letters go to: the next one whose label starts with them, from the row after `from` (a first
|
|
153
|
+
* letter) or from `from` itself (more letters of the same word). -1 when none does.
|
|
154
|
+
*/
|
|
155
|
+
export function typeaheadIndex(items, from, typed) {
|
|
156
|
+
const n = items?.length || 0;
|
|
157
|
+
const want = String(typed || '').toLowerCase();
|
|
158
|
+
if (!n || !want) return -1;
|
|
159
|
+
const start = want.length > 1 ? Math.max(0, from) : from + 1;
|
|
160
|
+
for (let k = 0; k < n; k++) {
|
|
161
|
+
const i = (((start + k) % n) + n) % n;
|
|
162
|
+
if (selectable(items[i]) && String(items[i].label || '').toLowerCase().startsWith(want)) return i;
|
|
163
|
+
}
|
|
164
|
+
return -1;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const TEXT_INPUT_TYPES = new Set(['', 'text', 'search', 'url', 'tel', 'email', 'password', 'number',
|
|
168
|
+
'date', 'datetime-local', 'month', 'time', 'week']);
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Whether an element is a field the browser's own menu belongs to (spelling, paste): a text input, a textarea, a
|
|
172
|
+
* native select or anything editable. Checkboxes, buttons and the like are not.
|
|
173
|
+
* @param {{ tagName?: string, type?: string, isContentEditable?: boolean, closest?: Function } | null} el
|
|
174
|
+
*/
|
|
175
|
+
export function isEditableTarget(el) {
|
|
176
|
+
if (!el) return false;
|
|
177
|
+
if (el.isContentEditable) return true;
|
|
178
|
+
const tag = String(el.tagName || '').toUpperCase();
|
|
179
|
+
if (tag === 'TEXTAREA' || tag === 'SELECT') return true;
|
|
180
|
+
if (tag === 'INPUT') return TEXT_INPUT_TYPES.has(String(el.type || '').toLowerCase());
|
|
181
|
+
return !!el.closest?.('[contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"]');
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Why the app's menu stays out of a right-click, or null when it opens. In order: another handler took the event
|
|
186
|
+
* (it called preventDefault: an area with a menu of its own), the press is on the app's menu itself, Shift is held
|
|
187
|
+
* (the escape hatch to the browser's menu), the target is a field, or it is in an area that opted out.
|
|
188
|
+
* @param {{ defaultPrevented?: boolean, shiftKey?: boolean }} event
|
|
189
|
+
* @param {{ inOwnMenu?: boolean, editable?: boolean, optedOut?: boolean }} target
|
|
190
|
+
* @returns {null | 'handled' | 'own-menu' | 'shift' | 'editable' | 'opt-out'}
|
|
191
|
+
*/
|
|
192
|
+
export function nativeMenuReason(event, target = {}) {
|
|
193
|
+
if (event?.defaultPrevented) return 'handled';
|
|
194
|
+
if (target.inOwnMenu) return 'own-menu';
|
|
195
|
+
if (event?.shiftKey) return 'shift';
|
|
196
|
+
if (target.editable) return 'editable';
|
|
197
|
+
if (target.optedOut) return 'opt-out';
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/** Whether a key press asks for a context menu: the ContextMenu key, or Shift+F10, with no other modifier. */
|
|
202
|
+
export function isMenuKey(event) {
|
|
203
|
+
if (!event || event.ctrlKey || event.metaKey || event.altKey) return false;
|
|
204
|
+
return event.key === 'ContextMenu' || (event.key === 'F10' && !!event.shiftKey);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* A link the menu can offer: http(s) only, and not one that only points into the page (`#`, `#…`) or runs script.
|
|
209
|
+
* @param {string | null} raw the href as written
|
|
210
|
+
* @param {string | null} resolved the href the browser resolved
|
|
211
|
+
* @returns {string | null} the address to open or copy
|
|
212
|
+
*/
|
|
213
|
+
export function usableLink(raw, resolved) {
|
|
214
|
+
const written = String(raw ?? '').trim();
|
|
215
|
+
if (!written || written.startsWith('#')) return null;
|
|
216
|
+
if (/^\s*javascript:/i.test(written)) return null;
|
|
217
|
+
return /^https?:\/\//i.test(String(resolved || '')) ? String(resolved) : null;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* An image the menu can offer. A data: or blob: picture can be copied by address; only an http(s) one opens in a
|
|
222
|
+
* new tab (browsers refuse to open a data: address there).
|
|
223
|
+
* @returns {{ src: string, canOpen: boolean } | null}
|
|
224
|
+
*/
|
|
225
|
+
export function usableImage(src) {
|
|
226
|
+
const value = String(src || '');
|
|
227
|
+
if (/^https?:\/\//i.test(value)) return { src: value, canOpen: true };
|
|
228
|
+
if (/^(data|blob):/i.test(value)) return { src: value, canOpen: false };
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** A selection as a menu label shows it: one line, at most `max` characters, an ellipsis when cut. */
|
|
233
|
+
export function quoteSelection(text, max = 24) {
|
|
234
|
+
const flat = String(text || '').replace(/\s+/g, ' ').trim();
|
|
235
|
+
return flat.length > max ? `${flat.slice(0, max - 1).trimEnd()}…` : flat;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/** The selected text an action takes: trimmed, and capped so a whole page selected is not sent anywhere at once. */
|
|
239
|
+
export const SELECTION_MAX = 4000;
|
|
240
|
+
export function selectionPayload(text, max = SELECTION_MAX) {
|
|
241
|
+
const value = String(text || '').trim();
|
|
242
|
+
return value.length > max ? value.slice(0, max) : value;
|
|
243
|
+
}
|