synabun 2.0.9 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +115 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +68 -4
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +2 -2
- package/hooks/claude-code/pre-websearch.mjs +12 -1
- package/hooks/claude-code/shared.mjs +5 -0
- package/hooks/claude-code/stop.mjs +1 -1
- package/launcher.mjs +9 -3
- package/lib/claude-hooks.js +172 -18
- package/lib/client-config-repair.js +17 -8
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +1 -1
- package/lib/first-launch-protection.js +57 -12
- package/lib/mcp-dist.js +176 -0
- package/lib/release-npm-ci.mjs +138 -0
- package/lib/release-publish.mjs +91 -0
- package/lib/release-scan.mjs +50 -0
- package/lib/server-crash-record.js +123 -0
- package/lib/server-exit.js +318 -0
- package/lib/server-supervisor.js +508 -0
- package/lib/start-launcher.js +43 -5
- package/lib/tools-cli.js +45 -0
- package/lib/update-snapshot.js +228 -0
- package/lib/virustotal.mjs +192 -0
- package/lib/windows-crash-event.js +269 -0
- package/mcp-server/dist/http.d.ts +20 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +59 -12
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts +33 -27
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +128 -143
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/preload.js +1 -1
- package/mcp-server/dist/preload.js.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +81 -28
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +16 -10
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +67 -11
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/server-instructions.d.ts +7 -2
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
- package/mcp-server/dist/services/server-instructions.js +20 -62
- package/mcp-server/dist/services/server-instructions.js.map +1 -1
- package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
- package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-catalog.js +339 -0
- package/mcp-server/dist/services/tool-catalog.js.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
- package/mcp-server/dist/services/tool-list.d.ts +108 -0
- package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list.js +334 -0
- package/mcp-server/dist/services/tool-list.js.map +1 -0
- package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
- package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-runtime.js +400 -0
- package/mcp-server/dist/services/tool-runtime.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
- package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +10 -10
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +22 -13
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
- package/mcp-server/dist/tools/image-tools.d.ts +1 -1
- package/mcp-server/dist/tools/image-tools.js +1 -1
- package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
- package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill-tools.js +639 -0
- package/mcp-server/dist/tools/skill-tools.js.map +1 -0
- package/mcp-server/dist/tools/skill.d.ts +7 -0
- package/mcp-server/dist/tools/skill.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill.js +11 -0
- package/mcp-server/dist/tools/skill.js.map +1 -0
- package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
- package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/tool-groups.js +147 -0
- package/mcp-server/dist/tools/tool-groups.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-format.js +7 -4
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -1
- package/mcp-server/src/http.ts +75 -12
- package/mcp-server/src/index.ts +147 -154
- package/mcp-server/src/preload.ts +12 -12
- package/mcp-server/src/services/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/neural-interface.ts +79 -20
- package/mcp-server/src/services/server-instructions.ts +27 -63
- package/mcp-server/src/services/tool-catalog.ts +403 -0
- package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
- package/mcp-server/src/services/tool-list.ts +410 -0
- package/mcp-server/src/services/tool-runtime.ts +457 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +22 -14
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/skill-tools.ts +589 -0
- package/mcp-server/src/tools/skill.ts +13 -0
- package/mcp-server/src/tools/tool-groups.ts +164 -0
- package/mcp-server/src/tools/whiteboard-format.ts +9 -3
- package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
- package/neural-interface/i18n/en.json +3680 -206
- package/neural-interface/i18n/pt-BR.json +3628 -157
- package/neural-interface/lib/account-usage.js +5 -3
- package/neural-interface/lib/app-controls-api.js +161 -0
- package/neural-interface/lib/assistant-api.js +148 -35
- package/neural-interface/lib/assistant-brains/claude.js +4 -3
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
- package/neural-interface/lib/assistant-brains/codex.js +9 -5
- package/neural-interface/lib/assistant-brains/opencode.js +122 -44
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +59 -0
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +97 -0
- package/neural-interface/lib/assistant-catalog.js +23 -9
- package/neural-interface/lib/assistant-dispatch.js +874 -156
- package/neural-interface/lib/assistant-envelope.js +22 -2
- package/neural-interface/lib/assistant-persona.js +80 -11
- package/neural-interface/lib/assistant-plan-permissions.js +10 -9
- package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
- package/neural-interface/lib/assistant-route-gate.js +6 -4
- package/neural-interface/lib/assistant-router.js +13 -8
- package/neural-interface/lib/assistant-runtime.js +183 -26
- package/neural-interface/lib/assistant-task-prompt.js +78 -14
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/backup-service.js +620 -3
- package/neural-interface/lib/backup-zip-reader.js +10 -5
- package/neural-interface/lib/backup-zip-writer.js +257 -0
- package/neural-interface/lib/browser-execution.js +10 -2
- package/neural-interface/lib/browser-guard-cdp.js +83 -0
- package/neural-interface/lib/browser-network-guard.js +284 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +186 -31
- package/neural-interface/lib/claude-agent-bridge.js +4 -2
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-model-catalog.js +64 -14
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install.js +18 -138
- package/neural-interface/lib/cli-resolver.js +4 -1
- package/neural-interface/lib/cli-update-planner.js +32 -31
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-settings-schema.js +109 -47
- package/neural-interface/lib/codex-worker-app-server.js +172 -0
- package/neural-interface/lib/confined-fs.js +30 -3
- package/neural-interface/lib/crash-notice-api.js +98 -0
- package/neural-interface/lib/editor-completion-opencode.js +164 -67
- package/neural-interface/lib/exec-loop-command.js +4 -1
- package/neural-interface/lib/http-guards.js +8 -2
- package/neural-interface/lib/install-details.js +4 -1
- package/neural-interface/lib/launch-cache.js +293 -0
- package/neural-interface/lib/login-start.js +524 -0
- package/neural-interface/lib/mcp-agent-servers.js +67 -0
- package/neural-interface/lib/mcp-client-config.js +0 -29
- package/neural-interface/lib/mcp-external-servers.js +323 -0
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/morelogin.js +30 -0
- package/neural-interface/lib/native-loop-providers.js +565 -50
- package/neural-interface/lib/native-loop-runtime.js +287 -41
- package/neural-interface/lib/opencode-config.js +557 -0
- package/neural-interface/lib/opencode-db-schema.js +58 -0
- package/neural-interface/lib/opencode-history.js +49 -204
- package/neural-interface/lib/opencode-mcp-ready.js +108 -0
- package/neural-interface/lib/opencode-native-boundary.js +44 -0
- package/neural-interface/lib/opencode-protocol.js +310 -0
- package/neural-interface/lib/opencode-provider-view.js +81 -0
- package/neural-interface/lib/opencode-runtime-config.js +32 -15
- package/neural-interface/lib/opencode-serve-records.js +624 -0
- package/neural-interface/lib/opencode-v2-client.js +53 -131
- package/neural-interface/lib/opencode-v2-ws-requests.js +35 -195
- package/neural-interface/lib/opencode-worker-activity.js +229 -0
- package/neural-interface/lib/opencode-worker-data.js +27 -0
- package/neural-interface/lib/opencode2-client.js +796 -0
- package/neural-interface/lib/opencode2-proxy.js +76 -0
- package/neural-interface/lib/opencode2-translate.js +1057 -0
- package/neural-interface/lib/owner-authority.js +249 -0
- package/neural-interface/lib/page-session.js +275 -0
- package/neural-interface/lib/peer-identity.js +763 -0
- package/neural-interface/lib/process-identity.js +361 -0
- package/neural-interface/lib/request-gate.js +17 -2
- package/neural-interface/lib/rulesets/api.js +1 -1
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +92 -27
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +18 -10
- package/neural-interface/lib/session-title-generator.js +58 -18
- package/neural-interface/lib/skills/api-v2.js +495 -0
- package/neural-interface/lib/skills/bundle.js +418 -0
- package/neural-interface/lib/skills/catalog.js +294 -0
- package/neural-interface/lib/skills/creation-api.js +191 -0
- package/neural-interface/lib/skills/creation-brief.js +247 -0
- package/neural-interface/lib/skills/creation-sources.js +267 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +564 -0
- package/neural-interface/lib/skills/digest.js +119 -0
- package/neural-interface/lib/skills/discover.js +111 -0
- package/neural-interface/lib/skills/draft-confinement.js +214 -0
- package/neural-interface/lib/skills/eval-confinement.js +397 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +119 -0
- package/neural-interface/lib/skills/evals-api.js +212 -0
- package/neural-interface/lib/skills/evals.js +1573 -0
- package/neural-interface/lib/skills/export.js +200 -0
- package/neural-interface/lib/skills/frontmatter.js +64 -0
- package/neural-interface/lib/skills/health.js +75 -0
- package/neural-interface/lib/skills/json-edit.js +165 -0
- package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
- package/neural-interface/lib/skills/known-bridges.js +96 -0
- package/neural-interface/lib/skills/library.js +823 -0
- package/neural-interface/lib/skills/local-store.js +21 -0
- package/neural-interface/lib/skills/migration.js +433 -0
- package/neural-interface/lib/skills/operations.js +45 -0
- package/neural-interface/lib/skills/ownership.js +427 -0
- package/neural-interface/lib/skills/packages.js +88 -0
- package/neural-interface/lib/skills/reviews.js +212 -0
- package/neural-interface/lib/skills/revision.js +80 -0
- package/neural-interface/lib/skills/roots.js +262 -0
- package/neural-interface/lib/skills/runtime-checks.js +355 -0
- package/neural-interface/lib/skills/scan-assets.js +252 -0
- package/neural-interface/lib/skills/scan-context.js +26 -0
- package/neural-interface/lib/skills/scan-shell.js +324 -0
- package/neural-interface/lib/skills/scan.js +364 -0
- package/neural-interface/lib/skills/scanners.js +54 -0
- package/neural-interface/lib/skills/service.js +522 -0
- package/neural-interface/lib/skills/telemetry.js +113 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/style-guide/api.js +4 -3
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/untrusted-file-headers.js +27 -0
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/worker-confinement.js +1192 -0
- package/neural-interface/lib/worker-guard-setting.js +56 -0
- package/neural-interface/lib/worker-mcp-channel.js +175 -0
- package/neural-interface/lib/worker-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +229 -0
- package/neural-interface/lib/worker-sandbox.js +299 -0
- package/neural-interface/package-lock.json +1354 -50
- package/neural-interface/package.json +6 -2
- package/neural-interface/public/index.html +5 -3
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +2 -2
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +76 -16
- package/neural-interface/public/shared/api.js +1527 -1336
- package/neural-interface/public/shared/app-frame.js +192 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +205 -19
- package/neural-interface/public/shared/assistant/asst-api.js +11 -3
- package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
- package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
- package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +241 -112
- package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
- package/neural-interface/public/shared/assistant/asst-control.js +157 -26
- package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
- package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
- package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
- package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
- package/neural-interface/public/shared/assistant/asst-menu.js +84 -12
- package/neural-interface/public/shared/assistant/asst-panel.js +303 -44
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +93 -58
- package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
- package/neural-interface/public/shared/assistant/asst-render.js +770 -100
- package/neural-interface/public/shared/assistant/asst-route.js +83 -12
- package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
- package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
- package/neural-interface/public/shared/assistant/asst-scenes.js +530 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
- package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
- package/neural-interface/public/shared/assistant/asst-state.js +25 -15
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +102 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +165 -13
- package/neural-interface/public/shared/automation-context.js +5 -2
- package/neural-interface/public/shared/cc-dropdown.js +550 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
- package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
- package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
- package/neural-interface/public/shared/cdx/cdx-panel.js +58 -150
- package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
- package/neural-interface/public/shared/cdx/cdx-render.js +62 -32
- package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +201 -74
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-view.js +4 -8
- package/neural-interface/public/shared/cli-status.js +2 -2
- package/neural-interface/public/shared/constants.js +2 -2
- package/neural-interface/public/shared/context-menu-areas.js +34 -0
- package/neural-interface/public/shared/context-menu-logic.js +243 -0
- package/neural-interface/public/shared/context-menu-model.js +366 -0
- package/neural-interface/public/shared/context-menu.js +372 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
- package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/data-cache.js +223 -0
- package/neural-interface/public/shared/desktop-bridge.js +11 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
- package/neural-interface/public/shared/desktop-titlebar.js +214 -28
- package/neural-interface/public/shared/desktop-update-view.js +35 -5
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/file-links.js +73 -8
- package/neural-interface/public/shared/html-shell.js +78 -86
- package/neural-interface/public/shared/i18n.js +2 -0
- package/neural-interface/public/shared/launch-prefetch.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +9 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
- package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +140 -254
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +97 -203
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -22
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +20 -13
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +53 -82
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -40
- package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +205 -62
- package/neural-interface/public/shared/opencode-providers.js +39 -0
- package/neural-interface/public/shared/page-session.js +96 -0
- package/neural-interface/public/shared/registry.js +5 -3
- package/neural-interface/public/shared/retired-2d.js +3 -0
- package/neural-interface/public/shared/schedules-view.js +452 -0
- package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
- package/neural-interface/public/shared/settings/settings-app.js +243 -0
- package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
- package/neural-interface/public/shared/settings/settings-data.js +90 -0
- package/neural-interface/public/shared/settings/settings-ia.js +23 -6
- package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
- package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
- package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
- package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
- package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
- package/neural-interface/public/shared/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +219 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
- package/neural-interface/public/shared/skills/ss-doc.js +173 -0
- package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
- package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
- package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
- package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
- package/neural-interface/public/shared/skills/ss-evals.js +417 -0
- package/neural-interface/public/shared/skills/ss-form.js +159 -0
- package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
- package/neural-interface/public/shared/skills/ss-ids.js +32 -0
- package/neural-interface/public/shared/skills/ss-lint.js +141 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
- package/neural-interface/public/shared/skills/ss-resources.js +165 -0
- package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
- package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
- package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
- package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
- package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
- package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
- package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
- package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
- package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
- package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
- package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
- package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
- package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
- package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
- package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
- package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
- package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
- package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
- package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
- package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
- package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
- package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
- package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
- package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
- package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
- package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
- package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
- package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
- package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
- package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
- package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +2065 -2150
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- package/neural-interface/public/shared/tool-list-picker.js +55 -0
- package/neural-interface/public/shared/tool-list-storage.js +24 -0
- package/neural-interface/public/shared/tool-list-view.js +112 -0
- package/neural-interface/public/shared/tour/tour-actor.js +268 -0
- package/neural-interface/public/shared/tour/tour-beats.js +336 -0
- package/neural-interface/public/shared/tour/tour-engine.js +884 -0
- package/neural-interface/public/shared/tour/tour-ink.js +390 -0
- package/neural-interface/public/shared/tour/tour-stage.js +440 -0
- package/neural-interface/public/shared/tour/tour-state.js +40 -0
- package/neural-interface/public/shared/tour/tour-tips.js +99 -0
- package/neural-interface/public/shared/tour/tour.css +144 -0
- package/neural-interface/public/shared/ui-assistant.js +27 -5
- package/neural-interface/public/shared/ui-automation-studio.js +155 -152
- package/neural-interface/public/shared/ui-bookmarks.js +2 -1
- package/neural-interface/public/shared/ui-claude-panel.js +153 -13
- package/neural-interface/public/shared/ui-codex-panel.js +1 -0
- package/neural-interface/public/shared/ui-command-runner.js +6 -3
- package/neural-interface/public/shared/ui-context-menu.js +295 -0
- package/neural-interface/public/shared/ui-cost-widget.js +57 -59
- package/neural-interface/public/shared/ui-crash-notice.js +187 -0
- package/neural-interface/public/shared/ui-detail.js +21 -9
- package/neural-interface/public/shared/ui-file-links.js +1 -0
- package/neural-interface/public/shared/ui-image-gallery.js +56 -52
- package/neural-interface/public/shared/ui-invite.js +18 -2
- package/neural-interface/public/shared/ui-keybinds.js +26 -1
- package/neural-interface/public/shared/ui-link.js +9 -9
- package/neural-interface/public/shared/ui-menubar.js +229 -40
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +9 -1
- package/neural-interface/public/shared/ui-navbar.js +4 -24
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-schedules-studio.js +2267 -953
- package/neural-interface/public/shared/ui-sessions.js +20 -7
- package/neural-interface/public/shared/ui-settings.js +679 -496
- package/neural-interface/public/shared/ui-sidebar.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +56 -5
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
- package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
- package/neural-interface/public/shared/ui-skills.js +42 -2781
- package/neural-interface/public/shared/ui-styleguide.js +5 -2
- package/neural-interface/public/shared/ui-sync.js +22 -5
- package/neural-interface/public/shared/ui-terminal.js +159 -199
- package/neural-interface/public/shared/ui-tool-updates.js +3 -1
- package/neural-interface/public/shared/ui-tooltip.js +10 -5
- package/neural-interface/public/shared/ui-trash.js +14 -5
- package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
- package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +3 -61
- package/neural-interface/public/shared/ui-tutorial.css +47 -100
- package/neural-interface/public/shared/ui-tutorial.js +285 -499
- package/neural-interface/public/shared/ui-update.js +121 -16
- package/neural-interface/public/shared/ui-whiteboard.js +313 -59
- package/neural-interface/public/shared/ui-worker-end.js +4 -0
- package/neural-interface/public/shared/ui-workspaces.js +3 -2
- package/neural-interface/public/shared/view-variant.js +66 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
- package/neural-interface/public/shared/whiteboard-list.js +172 -0
- package/neural-interface/public/shared/worker-end.js +10 -3
- package/neural-interface/public/shared/worker-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +1 -1
- package/neural-interface/public/variant/2d/background.js +2 -1
- package/neural-interface/public/variant/2d/context-menu.js +8 -2
- package/neural-interface/public/variant/2d/graph.js +42 -20
- package/neural-interface/public/variant/2d/hulls.js +14 -9
- package/neural-interface/public/variant/2d/lasso.js +11 -7
- package/neural-interface/public/variant/2d/main.js +36 -2
- package/neural-interface/public/variant/2d/minimap.js +11 -13
- package/neural-interface/public/variant/3d/main.js +72 -6
- package/neural-interface/public/variant/3d/map-controls.js +24 -9
- package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat.css +17 -0
- package/neural-interface/public/vendor/caveat/manifest.json +12 -0
- package/neural-interface/public/vendor/highlight/LICENSE +29 -0
- package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
- package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
- package/neural-interface/public/vendor/highlight/manifest.json +5 -0
- package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
- package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
- package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
- package/neural-interface/public/vendor/marked/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
- package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
- package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
- package/neural-interface/public/vendor/yaml/LICENSE +13 -0
- package/neural-interface/public/vendor/yaml/manifest.json +4 -0
- package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
- package/neural-interface/scripts/build-vendor.mjs +116 -3
- package/neural-interface/server.js +4834 -2541
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +18 -12
- package/package.json +16 -3
- package/postinstall.js +9 -4
- package/preuninstall.js +1 -1
- package/setup.js +97 -322
- package/skills/skill-forge/SKILL.md +177 -0
- package/skills/skill-forge/evals/evals.json +54 -0
- package/skills/skill-forge/references/package.md +105 -0
- package/skills/skill-forge/references/review-and-recovery.md +63 -0
- package/skills/skill-forge/references/runtime-profiles.md +20 -0
- package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
- package/skills/synabun/SKILL.md +10 -7
- package/skills/synabun/modules/audit.md +1 -5
- package/skills/synabun/modules/changelog.md +1 -5
- package/skills/synabun/modules/idea.md +1 -1
- package/skills/synabun/modules/memorize.md +6 -9
- package/skills/synabun/modules/schedule.md +5 -5
- package/mcp-server/dist/services/profiles.d.ts +0 -120
- package/mcp-server/dist/services/profiles.d.ts.map +0 -1
- package/mcp-server/dist/services/profiles.js +0 -387
- package/mcp-server/dist/services/profiles.js.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
- package/mcp-server/dist/tools/leonardo.d.ts +0 -13
- package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo.js +0 -21
- package/mcp-server/dist/tools/leonardo.js.map +0 -1
- package/mcp-server/dist/tools/profile.d.ts +0 -17
- package/mcp-server/dist/tools/profile.d.ts.map +0 -1
- package/mcp-server/dist/tools/profile.js +0 -114
- package/mcp-server/dist/tools/profile.js.map +0 -1
- package/mcp-server/src/services/profiles.ts +0 -428
- package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
- package/mcp-server/src/tools/leonardo.ts +0 -30
- package/mcp-server/src/tools/profile.ts +0 -122
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
- package/neural-interface/lib/mcp-profile-servers.js +0 -120
- package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
- package/skills/leonardo/SKILL.md +0 -168
- package/skills/leonardo/icon.svg +0 -1
- package/skills/leonardo/modules/browser-guide.md +0 -378
- package/skills/leonardo/modules/image-prompter.md +0 -283
- package/skills/leonardo/modules/model-advisor.md +0 -100
- package/skills/leonardo/modules/prompt-library.md +0 -110
- package/skills/leonardo/modules/style-guide.md +0 -186
- package/skills/leonardo/modules/video-prompter.md +0 -317
|
@@ -30,6 +30,7 @@ import { brainLabel, readStoredBrain, restoredSessionName } from './asst-state.j
|
|
|
30
30
|
import { closeMenu, isMenuOpen, openMenu } from './asst-menu.js';
|
|
31
31
|
import { injectAssistantSidepanelStyles } from './asst-sidepanel-styles.js';
|
|
32
32
|
import { createMascot, mascotCameoSvg } from '../synabun-mascot.js';
|
|
33
|
+
import { createTutorialPreview } from '../ui-tutorial-preview.js';
|
|
33
34
|
|
|
34
35
|
const PANEL_OWNER = 'assistant-sidepanel';
|
|
35
36
|
const HOST_ID = 'sidepanel';
|
|
@@ -55,6 +56,7 @@ let _toastTimer = null;
|
|
|
55
56
|
let _renaming = false;
|
|
56
57
|
const _tabs = []; // { sessionId, viewport, toolbar, ctl, pill, label, userRenamed, status, brain }
|
|
57
58
|
let _activeIdx = -1;
|
|
59
|
+
let _tourPresenting = false;
|
|
58
60
|
|
|
59
61
|
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
60
62
|
|
|
@@ -408,13 +410,13 @@ function focusSession(sessionId, { prompt = '' } = {}) {
|
|
|
408
410
|
if (prompt) _tabs[idx].ctl?.send(prompt);
|
|
409
411
|
}
|
|
410
412
|
|
|
411
|
-
async function startSession() {
|
|
413
|
+
async function startSession(prompt = '') {
|
|
412
414
|
if (_starting || _tabs.length) return;
|
|
413
415
|
_starting = true;
|
|
414
416
|
_startError = '';
|
|
415
417
|
renderPlaceholder('starting');
|
|
416
418
|
try {
|
|
417
|
-
const res = await openAssistant({ host: HOST_ID });
|
|
419
|
+
const res = await openAssistant(prompt ? { host: HOST_ID, prompt } : { host: HOST_ID });
|
|
418
420
|
if (!_tabs.length) renderPlaceholder(res ? null : 'failed');
|
|
419
421
|
} finally {
|
|
420
422
|
_starting = false;
|
|
@@ -563,8 +565,8 @@ function applyVisibility(nextVisible) {
|
|
|
563
565
|
const tab = activeTab();
|
|
564
566
|
if (_visible) {
|
|
565
567
|
state.lastActivePanel = 'assistant';
|
|
566
|
-
if (!_tabs.length) startSession();
|
|
567
|
-
else if (tab) {
|
|
568
|
+
if (!_tabs.length && !_tourPresenting) startSession();
|
|
569
|
+
else if (tab && !_tourPresenting) {
|
|
568
570
|
if (tab.status === 'done') tab.status = 'idle';
|
|
569
571
|
try { tab.ctl?.onShown(); } catch { /* ignore */ }
|
|
570
572
|
noteAssistantFocus(tab.sessionId, HOST_ID);
|
|
@@ -617,6 +619,67 @@ export function assistantPanelPeekable() {
|
|
|
617
619
|
return !assistantBlocked() && _tabs.length > 0;
|
|
618
620
|
}
|
|
619
621
|
|
|
622
|
+
/**
|
|
623
|
+
* Present the panel for the Workspace tour (ui-tutorial.js), reversibly: it never
|
|
624
|
+
* creates a session. The tour plays on the active tab when its empty state shows
|
|
625
|
+
* its character (the tab's own controls, composer and director: tourHost());
|
|
626
|
+
* otherwise (no tab, or a conversation on screen) on a session-free preview laid
|
|
627
|
+
* over the tab. Returns { host, live, restore({ reason }) } or null when the
|
|
628
|
+
* Assistant is blocked. restore() puts back the panel's visibility, the docked
|
|
629
|
+
* peers and the last-active panels, unless the tour ended on its hand-off to a
|
|
630
|
+
* live tab ('done'): then the panel stays and the tab's composer takes the focus.
|
|
631
|
+
*/
|
|
632
|
+
export function beginAssistantTour({ onPreviewSend = () => {} } = {}) {
|
|
633
|
+
if (assistantBlocked()) return null;
|
|
634
|
+
ensurePanel();
|
|
635
|
+
const wasVisible = _visible;
|
|
636
|
+
const previousPanel = state.lastActivePanel;
|
|
637
|
+
const previousSidepanel = state.lastActiveSidepanel;
|
|
638
|
+
const peers = ['#topright-claude-panel-btn', '#topright-codex-panel-btn', '#topright-opencode-panel-btn']
|
|
639
|
+
.map(s => document.querySelector(s)).filter(b => b?.classList.contains('active'));
|
|
640
|
+
_tourPresenting = true;
|
|
641
|
+
const tab = activeTab();
|
|
642
|
+
let liveHost = null;
|
|
643
|
+
try { liveHost = tab?.ctl?.tourHost?.() || null; } catch { liveHost = null; }
|
|
644
|
+
const preview = liveHost ? null : createTutorialPreview(_panel, { onSend: (text) => onPreviewSend(text) });
|
|
645
|
+
if (preview) _panel.classList.add('tour-covering');
|
|
646
|
+
setVisible(true);
|
|
647
|
+
let restored = false;
|
|
648
|
+
const host = liveHost || preview.host;
|
|
649
|
+
return {
|
|
650
|
+
host,
|
|
651
|
+
live: !!liveHost,
|
|
652
|
+
/**
|
|
653
|
+
* The user sent `text` from the preview's composer (after restore({ reason: 'sent' })):
|
|
654
|
+
* with no session, it starts one with that message (the user's own send); with a
|
|
655
|
+
* conversation on screen, it becomes that conversation's draft, never sent for them.
|
|
656
|
+
*/
|
|
657
|
+
deliver(text) {
|
|
658
|
+
const message = String(text || '').trim();
|
|
659
|
+
if (!message) return;
|
|
660
|
+
const current = activeTab();
|
|
661
|
+
if (current?.ctl) { focusSession(current.sessionId); current.ctl.insertText?.(message); current.ctl.focus?.(); return; }
|
|
662
|
+
startSession(message);
|
|
663
|
+
},
|
|
664
|
+
restore({ reason = 'skip' } = {}) {
|
|
665
|
+
if (restored) return;
|
|
666
|
+
restored = true;
|
|
667
|
+
closeMenu();
|
|
668
|
+
preview?.destroy();
|
|
669
|
+
_panel.classList.remove('tour-covering');
|
|
670
|
+
_tourPresenting = false;
|
|
671
|
+
const keep = (reason === 'done' && !!liveHost) || reason === 'sent';
|
|
672
|
+
if (keep) {
|
|
673
|
+
if (tab && findTab(tab.sessionId)) { try { tab.ctl?.onShown(); } catch { /* ignore */ } }
|
|
674
|
+
return;
|
|
675
|
+
}
|
|
676
|
+
if (!wasVisible) setVisible(false);
|
|
677
|
+
for (const button of peers) if (!button.classList.contains('active')) button.click();
|
|
678
|
+
state.lastActivePanel = previousPanel; state.lastActiveSidepanel = previousSidepanel;
|
|
679
|
+
},
|
|
680
|
+
};
|
|
681
|
+
}
|
|
682
|
+
|
|
620
683
|
/** The top-right SynaBun button. */
|
|
621
684
|
export async function toggleAssistantPanel() {
|
|
622
685
|
if (assistantBlocked()) {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import { normalizeComputerMode, normalizeProvider, normalizeRouteMode } from './asst-state.js';
|
|
8
8
|
|
|
9
9
|
export const SLASH_COMMANDS = [
|
|
10
|
-
{ name: 'dispatch', usage: '/dispatch <provider> [--model m] [--effort e] [--agent a] [--project p] [--
|
|
10
|
+
{ name: 'dispatch', usage: '/dispatch <provider> [--model m] [--effort e] [--agent a] [--project p] [--tools a,b] [--account id] [--ask] [--title "t"] <task>', descKey: 'assistant.slash.dispatch', desc: 'Dispatch a task to a sidepanel agent' },
|
|
11
11
|
{ name: 'agents', usage: '/agents [all]', descKey: 'assistant.slash.agents', desc: 'List dispatched runs' },
|
|
12
12
|
{ name: 'recall', usage: '/recall <query>', descKey: 'assistant.slash.recall', desc: 'Search memories' },
|
|
13
13
|
{ name: 'remember', usage: '/remember <text>', descKey: 'assistant.slash.remember', desc: 'Store a memory' },
|
|
@@ -17,7 +17,7 @@ export const SLASH_COMMANDS = [
|
|
|
17
17
|
{ name: 'models', usage: '/models [list | archived | hide <id…> | show <id…>]', descKey: 'assistant.slash.models', desc: 'Switch models off or on for the Assistant (or open the Models list)' },
|
|
18
18
|
{ name: 'budget', usage: '/budget', descKey: 'assistant.slash.budget', desc: 'Set the session budget and view provider shares' },
|
|
19
19
|
{ name: 'computer', usage: '/computer [on|off]', descKey: 'assistant.slash.computer', desc: 'Let the assistant use your Mac' },
|
|
20
|
-
{ name: 'stop', usage: '/stop [runId|all]', descKey: 'assistant.slash.stop', desc: 'Stop a run, everything, or the current turn' },
|
|
20
|
+
{ name: 'stop', usage: '/stop [runId|title|all]', descKey: 'assistant.slash.stop', desc: 'Stop a run, everything, or the current turn' },
|
|
21
21
|
{ name: 'new', usage: '/new [provider]', descKey: 'assistant.slash.new', desc: 'Start a fresh session' },
|
|
22
22
|
{ name: 'resume', usage: '/resume [sessionId]', descKey: 'assistant.slash.resume', desc: 'Resume a previous session' },
|
|
23
23
|
{ name: 'compact', usage: '/compact', descKey: 'assistant.slash.compact', desc: 'Compact the context' },
|
|
@@ -33,7 +33,7 @@ export const DISPATCH_FLAGS = {
|
|
|
33
33
|
effort: 'effort', e: 'effort',
|
|
34
34
|
agent: 'agent',
|
|
35
35
|
project: 'project', p: 'project', cwd: 'project',
|
|
36
|
-
|
|
36
|
+
tools: 'tools',
|
|
37
37
|
account: 'account', a: 'account',
|
|
38
38
|
title: 'title', t: 'title',
|
|
39
39
|
budget: 'budget',
|
|
@@ -219,10 +219,10 @@ export function matchSlashCommands(query) {
|
|
|
219
219
|
|
|
220
220
|
/**
|
|
221
221
|
* Build the POST /api/assistant/dispatch body from a parsed /dispatch command.
|
|
222
|
-
* Only explicit flags set model/effort — the brain's project
|
|
222
|
+
* Only explicit flags set model/effort — the brain's project and
|
|
223
223
|
* (same-provider) account are inherited, models are left to the server default.
|
|
224
224
|
*/
|
|
225
|
-
export function buildDispatchSpec(parsed, brain = {}, { assistantSessionId = null } = {}) {
|
|
225
|
+
export function buildDispatchSpec(parsed, brain = {}, { assistantSessionId = null, toolCatalog = null } = {}) {
|
|
226
226
|
if (!parsed || parsed.name !== 'dispatch' || parsed.error) return null;
|
|
227
227
|
const o = parsed.options || {};
|
|
228
228
|
const spec = {
|
|
@@ -236,8 +236,7 @@ export function buildDispatchSpec(parsed, brain = {}, { assistantSessionId = nul
|
|
|
236
236
|
if (o.model) spec.model = o.model;
|
|
237
237
|
if (o.effort) spec.effort = o.effort;
|
|
238
238
|
if (o.agent) spec.agent = o.agent;
|
|
239
|
-
|
|
240
|
-
if (mcp) spec.mcpProfile = mcp;
|
|
239
|
+
if (o.tools !== undefined) spec.tools = String(o.tools).split(',').map(id => id.trim()).filter(Boolean);
|
|
241
240
|
const account = o.account || (brain.provider === parsed.provider ? brain.accountId : null);
|
|
242
241
|
if (account) {
|
|
243
242
|
if (parsed.provider === 'codex') spec.codexAccountId = account;
|
|
@@ -247,6 +246,9 @@ export function buildDispatchSpec(parsed, brain = {}, { assistantSessionId = nul
|
|
|
247
246
|
if (o.budget !== undefined && Number.isFinite(Number(o.budget))) spec.budgetUsd = Number(o.budget);
|
|
248
247
|
if (o.minutes !== undefined && Number.isFinite(Number(o.minutes))) spec.maxMinutes = Number(o.minutes);
|
|
249
248
|
if (o.browser) spec.usesBrowser = true;
|
|
249
|
+
// A browser-reading slash launch uses the workspace guard, just like a routed browser task.
|
|
250
|
+
// Group metadata comes from the catalog, never from a second list of browser ids.
|
|
251
|
+
if (o.browser || (spec.tools || []).some(id => id === 'all' || toolCatalog?.groups?.some(group => group.id === id && group.browser))) spec.capability = 'workspace';
|
|
250
252
|
if (assistantSessionId) spec.assistantSessionId = assistantSessionId;
|
|
251
253
|
return spec;
|
|
252
254
|
}
|
|
@@ -64,7 +64,7 @@ export const DEFAULT_BRAIN = Object.freeze({
|
|
|
64
64
|
effort: null,
|
|
65
65
|
agent: null,
|
|
66
66
|
project: null,
|
|
67
|
-
|
|
67
|
+
tools: Object.freeze(['all']),
|
|
68
68
|
accountId: null,
|
|
69
69
|
permissionMode: 'default',
|
|
70
70
|
planMode: false,
|
|
@@ -105,7 +105,7 @@ export function normalizeBrain(raw, fallback = DEFAULT_BRAIN) {
|
|
|
105
105
|
effort: str(src.effort) || null,
|
|
106
106
|
agent: provider === 'opencode' ? (str(src.agent) || null) : null,
|
|
107
107
|
project: str(src.project ?? src.cwd) || null,
|
|
108
|
-
|
|
108
|
+
tools: provider === 'opencode' ? (Array.isArray(src.tools) ? [...src.tools] : null) : ['all'],
|
|
109
109
|
accountId: ACCOUNT_PROVIDERS.has(provider) ? (str(src.accountId) || null) : null,
|
|
110
110
|
permissionMode: modes.some(m => m.id === mode) ? mode : 'default',
|
|
111
111
|
planMode: PLAN_MODE_PROVIDERS.has(provider) && (src.planMode === true || legacyPlan),
|
|
@@ -145,7 +145,7 @@ function pickDefault(list) {
|
|
|
145
145
|
* efforts: { [provider]: [{ id, tier? }] },
|
|
146
146
|
* accounts: { [provider]: [{ id, label }] },
|
|
147
147
|
* agents: [{ name, mode? }], // OpenCode
|
|
148
|
-
*
|
|
148
|
+
* toolCatalog: { default, groups },
|
|
149
149
|
* projects: [{ path, label }],
|
|
150
150
|
* }
|
|
151
151
|
*/
|
|
@@ -188,14 +188,8 @@ export function resolveBrainDefaults(brain, catalog = {}) {
|
|
|
188
188
|
b.accountId = null;
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const ids = Object.keys(profiles);
|
|
194
|
-
if (ids.length && !ids.includes(b.mcpProfile)) {
|
|
195
|
-
b.mcpProfile = ids.includes(catalog.defaultMcpProfile) ? catalog.defaultMcpProfile : (ids.includes('full') ? 'full' : ids[0]);
|
|
196
|
-
}
|
|
197
|
-
} else if (!b.mcpProfile && catalog.defaultMcpProfile) {
|
|
198
|
-
b.mcpProfile = catalog.defaultMcpProfile;
|
|
191
|
+
if (b.provider === 'opencode' && b.tools == null && catalog.toolCatalog) {
|
|
192
|
+
b.tools = [...new Set([...(catalog.toolCatalog.default || []).filter(id => id !== 'git'), 'browser'])];
|
|
199
193
|
}
|
|
200
194
|
|
|
201
195
|
if (!b.project && Array.isArray(catalog.projects) && catalog.projects.length === 1) {
|
|
@@ -285,7 +279,7 @@ export function emptyProjectView(project, projects = [], tr = (_key, fallback, p
|
|
|
285
279
|
export function brainRequiresSwitch(a, b) {
|
|
286
280
|
const x = normalizeBrain(a);
|
|
287
281
|
const y = normalizeBrain(b);
|
|
288
|
-
return x.provider !== y.provider || x.accountId !== y.accountId || x.
|
|
282
|
+
return x.provider !== y.provider || x.accountId !== y.accountId || JSON.stringify(x.tools) !== JSON.stringify(y.tools);
|
|
289
283
|
}
|
|
290
284
|
|
|
291
285
|
// ── Runs ────────────────────────────────────────────────────────────────────
|
|
@@ -295,9 +289,11 @@ export function isTerminalRunStatus(status) {
|
|
|
295
289
|
}
|
|
296
290
|
|
|
297
291
|
// Dispatcher views carry `state` (queued, awaiting_route, starting, running,
|
|
298
|
-
// idle, awaiting_permission, completed, failed, stopped,
|
|
299
|
-
// descriptors (sidepanel:run-*) carry `status`. The tray
|
|
300
|
-
|
|
292
|
+
// idle, awaiting_permission, suspended, resuming, completed, failed, stopped,
|
|
293
|
+
// interrupted); runtime descriptors (sidepanel:run-*) carry `status`. The tray
|
|
294
|
+
// reads `status`. A run a server restart suspended is still running; one being
|
|
295
|
+
// resumed is starting.
|
|
296
|
+
const STATE_STATUS = { queued: 'queued', awaiting_route: 'queued', starting: 'starting', running: 'running', idle: 'running', awaiting_permission: 'running', suspended: 'running', resuming: 'starting' };
|
|
301
297
|
|
|
302
298
|
export function runStatusFromState(state) {
|
|
303
299
|
const value = str(state);
|
|
@@ -429,6 +425,20 @@ export function runTone(run) {
|
|
|
429
425
|
return 'running';
|
|
430
426
|
}
|
|
431
427
|
|
|
428
|
+
/**
|
|
429
|
+
* What a session's status is (the tray pill, the sidepanel header, the terminal tab's badge):
|
|
430
|
+
* 'action' while anything waits on you (a card of its own, or a worker's permission, question or
|
|
431
|
+
* model choice), 'working' while its own turn runs or any worker it dispatched works (queued for a
|
|
432
|
+
* free slot, starting, in a turn), else what its own last turn left ('done' when it ended out of
|
|
433
|
+
* sight, else 'idle'). A worker outlives the turn that dispatched it, and so does the gold.
|
|
434
|
+
* `own` is the brain's own status; `workers` the agents tray's counts (asst-agents-dock.js counts()).
|
|
435
|
+
*/
|
|
436
|
+
export function sessionStatus(own, workers = {}) {
|
|
437
|
+
if (own === 'action' || Number(workers?.waiting) > 0) return 'action';
|
|
438
|
+
if (own === 'working' || Number(workers?.working) > 0) return 'working';
|
|
439
|
+
return own === 'done' ? 'done' : 'idle';
|
|
440
|
+
}
|
|
441
|
+
|
|
432
442
|
function toMs(value) {
|
|
433
443
|
if (value == null || value === '') return 0;
|
|
434
444
|
if (typeof value === 'number') return Number.isFinite(value) ? value : 0;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Assistant — what a stop names
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
// Pure module (no DOM, no i18n import) so node:test can exercise it.
|
|
5
|
+
//
|
|
6
|
+
// A stop ends the work the user named and nothing else:
|
|
7
|
+
// resolveStopTarget `/stop <target>`: the one run of this session the target names (its id, the
|
|
8
|
+
// start of its id, its title or the words of its title), or why it names none.
|
|
9
|
+
// Two candidates stop nothing: the user picks one.
|
|
10
|
+
// createConfirmGate the agents tray's "Stop all": the first press arms it, a second press inside
|
|
11
|
+
// the window stops every run of the session at once. A single stray click, a
|
|
12
|
+
// double click or a held key never does (2026-10-24: one "Stop all" press
|
|
13
|
+
// ended both runs of a session while the user meant one of them).
|
|
14
|
+
// Words the user types to stop everything ("stop", "cancel") go to the brain, which stops runs
|
|
15
|
+
// with agent_stop (assistant-persona.js): nothing here reads a message.
|
|
16
|
+
|
|
17
|
+
import { isTerminalRunStatus } from './asst-state.js';
|
|
18
|
+
|
|
19
|
+
/** How long an armed "Stop all" waits for its second press, and the least time between the two. */
|
|
20
|
+
export const STOP_ALL_CONFIRM_MS = 4000;
|
|
21
|
+
export const STOP_ALL_MIN_GAP_MS = 300;
|
|
22
|
+
|
|
23
|
+
// Words that say "a run" without saying which one: "/stop the OpenCode settings run" names it by the rest.
|
|
24
|
+
const FILLER = new Set(['the', 'a', 'an', 'that', 'this', 'my', 'our', 'one', 'run', 'runs', 'agent', 'agents', 'worker', 'workers', 'task', 'job', 'please', 'o', 'os', 'as', 'do', 'da', 'de']);
|
|
25
|
+
const FULL_RUN_ID = /^[0-9a-f]{32}$/i;
|
|
26
|
+
const ID_PREFIX = /^[0-9a-f][0-9a-f-]{3,}$/i;
|
|
27
|
+
|
|
28
|
+
function words(text) {
|
|
29
|
+
return String(text ?? '').toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function unquote(text) {
|
|
33
|
+
const s = String(text ?? '').trim();
|
|
34
|
+
const m = s.match(/^(["'“‘])([\s\S]*)(["'”’])$/);
|
|
35
|
+
return m ? m[2].trim() : s;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The run `/stop <target>` names among `runs` (the tray's runs of this session).
|
|
40
|
+
* → { run, by: 'id' | 'prefix' | 'title' | 'words' }
|
|
41
|
+
* | { error: 'empty' | 'none' | 'finished' | 'ambiguous', matches?: run[], run? }
|
|
42
|
+
* An exact id names that run whatever its state (the server says when it already ended). Every
|
|
43
|
+
* other way names a run that still works; one that ended is `finished`. A full id the tray does not
|
|
44
|
+
* know is handed on as `{ error: 'none', passthrough: id }`: the server knows more runs than a tray.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveStopTarget(target, runs = []) {
|
|
47
|
+
const raw = unquote(target);
|
|
48
|
+
if (!raw) return { error: 'empty' };
|
|
49
|
+
const list = (Array.isArray(runs) ? runs : []).filter((run) => run && run.runId && run.removed !== true);
|
|
50
|
+
const live = list.filter((run) => !isTerminalRunStatus(run.status));
|
|
51
|
+
const one = (matches, by) => {
|
|
52
|
+
if (matches.length === 1) return isTerminalRunStatus(matches[0].status) ? { error: 'finished', run: matches[0] } : { run: matches[0], by };
|
|
53
|
+
if (matches.length > 1) return { error: 'ambiguous', matches };
|
|
54
|
+
return null;
|
|
55
|
+
};
|
|
56
|
+
const lower = raw.toLowerCase();
|
|
57
|
+
|
|
58
|
+
const exact = list.find((run) => String(run.runId).toLowerCase() === lower);
|
|
59
|
+
if (exact) return { run: exact, by: 'id' };
|
|
60
|
+
if (ID_PREFIX.test(raw)) {
|
|
61
|
+
const byPrefix = one(list.filter((run) => String(run.runId).toLowerCase().startsWith(lower)), 'prefix');
|
|
62
|
+
if (byPrefix) return byPrefix;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const title = (run) => words(run.title || run.task || '').join(' ');
|
|
66
|
+
const wanted = words(raw).join(' ');
|
|
67
|
+
if (wanted) {
|
|
68
|
+
const byTitle = one(live.filter((run) => title(run) === wanted), 'title');
|
|
69
|
+
if (byTitle) return byTitle;
|
|
70
|
+
}
|
|
71
|
+
// The words that say which run: each one is a word of its title, or the start of one.
|
|
72
|
+
const keys = words(raw).filter((word) => !FILLER.has(word));
|
|
73
|
+
if (keys.length) {
|
|
74
|
+
const fits = (run) => { const have = words(run.title || run.task || ''); return keys.every((key) => have.some((word) => word === key || (key.length >= 3 && word.startsWith(key)))); };
|
|
75
|
+
const byWords = one(live.filter(fits), 'words');
|
|
76
|
+
if (byWords) return byWords;
|
|
77
|
+
const ended = list.filter((run) => isTerminalRunStatus(run.status) && (title(run) === wanted || fits(run)));
|
|
78
|
+
if (ended.length === 1) return { error: 'finished', run: ended[0] };
|
|
79
|
+
}
|
|
80
|
+
return FULL_RUN_ID.test(raw) ? { error: 'none', passthrough: raw } : { error: 'none' };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* A press that only counts as the second of two. `press()` → 'armed' (the first: `onChange(true)`),
|
|
85
|
+
* 'confirmed' (the second, inside `windowMs` and at least `minGapMs` after the first:
|
|
86
|
+
* `onChange(false)`, the caller stops everything) or 'ignored' (too soon after the first: a double
|
|
87
|
+
* click, a held key). The arm lapses after `windowMs` by itself (`onChange(false)`).
|
|
88
|
+
*/
|
|
89
|
+
export function createConfirmGate({
|
|
90
|
+
windowMs = STOP_ALL_CONFIRM_MS,
|
|
91
|
+
minGapMs = STOP_ALL_MIN_GAP_MS,
|
|
92
|
+
now = Date.now,
|
|
93
|
+
setTimer = (fn, ms) => setTimeout(fn, ms),
|
|
94
|
+
clearTimer = (id) => clearTimeout(id),
|
|
95
|
+
onChange = () => {},
|
|
96
|
+
} = {}) {
|
|
97
|
+
let armedAt = null;
|
|
98
|
+
let timer = null;
|
|
99
|
+
const notify = (armed) => { try { onChange(armed); } catch { /* the button is gone */ } };
|
|
100
|
+
function reset() {
|
|
101
|
+
if (timer !== null) { clearTimer(timer); timer = null; }
|
|
102
|
+
if (armedAt === null) return false;
|
|
103
|
+
armedAt = null;
|
|
104
|
+
notify(false);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
function press() {
|
|
108
|
+
const at = now();
|
|
109
|
+
// An arm whose timer never ran (a throttled background tab) has lapsed all the same.
|
|
110
|
+
if (armedAt !== null && at - armedAt > windowMs) reset();
|
|
111
|
+
if (armedAt === null) {
|
|
112
|
+
armedAt = at;
|
|
113
|
+
timer = setTimer(() => { timer = null; reset(); }, windowMs);
|
|
114
|
+
notify(true);
|
|
115
|
+
return 'armed';
|
|
116
|
+
}
|
|
117
|
+
if (at - armedAt < minGapMs) return 'ignored';
|
|
118
|
+
reset();
|
|
119
|
+
return 'confirmed';
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
press,
|
|
123
|
+
reset,
|
|
124
|
+
isArmed: () => armedAt !== null,
|
|
125
|
+
destroy() { if (timer !== null) { clearTimer(timer); timer = null; } armedAt = null; },
|
|
126
|
+
};
|
|
127
|
+
}
|
|
@@ -345,32 +345,62 @@ export function injectAssistantStyles() {
|
|
|
345
345
|
.asst-transcript > .asst-status + .asst-status,
|
|
346
346
|
.asst-transcript > .asst-route-line + .asst-route-line { margin-top: 4px; }
|
|
347
347
|
.asst-transcript > .asst-working { margin-top: 8px; }
|
|
348
|
+
/* The open card waits at the bottom (asst-ask-tail.js): under every row that arrives after it,
|
|
349
|
+
above the "Working…" row, until it is answered and goes back under its message. */
|
|
350
|
+
.asst-ask-tail { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
|
|
351
|
+
.asst-ask-tail > * { margin-top: 0; }
|
|
352
|
+
/* The card sheet is injected after this one: restate its own gap margin at its specificity. */
|
|
353
|
+
.asst-ask-tail > .asst-followups.asst-ask,
|
|
354
|
+
.asst-ask-tail > .asst-control.asst-ask { margin-top: 0; }
|
|
348
355
|
|
|
349
|
-
/* ── Empty state
|
|
356
|
+
/* ── Empty state ────────────────────────────────────────────────────
|
|
357
|
+
One column, one hierarchy: the character and the heading, then the
|
|
358
|
+
starters as ghost rows (a prop glyph and a label, no capsule and no
|
|
359
|
+
seam: a faint fill with the md corners only while hovered or
|
|
360
|
+
focused), then the context line (Project · Budget) as quiet sm text
|
|
361
|
+
controls that open the toolbar's own menus (an open menu alone
|
|
362
|
+
wears the gold on-state). The rows and the line come in staggered
|
|
363
|
+
(--i, 40 ms apart), recede while the composer holds a draft, and
|
|
364
|
+
the picked starter keeps the gold on-state until the draft is
|
|
365
|
+
cleared. All of it static under reduced motion (the blanket at the
|
|
366
|
+
end). */
|
|
350
367
|
.asst-empty {
|
|
351
368
|
display: flex;
|
|
352
369
|
flex-direction: column;
|
|
353
370
|
align-items: center;
|
|
354
371
|
justify-content: center;
|
|
355
|
-
gap:
|
|
372
|
+
gap: 6px;
|
|
356
373
|
min-height: 100%;
|
|
357
374
|
padding: 16px 4px;
|
|
358
375
|
text-align: center;
|
|
359
376
|
}
|
|
360
|
-
|
|
361
|
-
.asst-empty-
|
|
362
|
-
/* The greeting (public/shared/greeting/)
|
|
377
|
+
@keyframes asst-empty-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
|
|
378
|
+
.asst-empty-title { margin-bottom: 8px; color: var(--asst-text); font-family: var(--ff-heading, inherit); font-size: 20px; font-weight: 600; letter-spacing: -.01em; animation: asst-empty-in var(--asst-dur-moderate) var(--asst-ease-enter) backwards; }
|
|
379
|
+
/* The greeting (public/shared/greeting/) sits between the heading and the starters. */
|
|
363
380
|
.asst-empty-greet { display: contents; }
|
|
364
|
-
.asst-
|
|
365
|
-
.asst-
|
|
366
|
-
.asst-chip.asst-suggestion
|
|
381
|
+
.asst-suggestions { display: flex; flex-direction: column; align-items: stretch; gap: 2px; width: min(100%, 380px); margin-top: 2px; }
|
|
382
|
+
.asst-chip.asst-suggestion { --cap-h: var(--asst-pill-h-md); --cap-r: var(--asst-pill-r-md); --cap-px: var(--asst-pill-px-md); --cap-fs: 12.5px; --cap-gap: 10px; justify-content: flex-start; max-width: none; height: auto; min-height: var(--cap-h); padding: 5px var(--cap-px); background: transparent; box-shadow: none; color: var(--asst-text-2); text-align: left; white-space: normal; line-height: 1.3; animation: asst-empty-in var(--asst-dur-moderate) var(--asst-ease-enter) backwards; animation-delay: calc(var(--i, 0) * 40ms); }
|
|
383
|
+
.asst-chip.asst-suggestion .asst-chip-text { white-space: normal; overflow: visible; text-overflow: clip; }
|
|
367
384
|
.asst-chip.asst-suggestion > .asst-icon svg { width: 20px; height: 14px; }
|
|
368
|
-
.asst-chip.asst-suggestion > .asst-icon { color: var(--asst-text-3); }
|
|
369
|
-
.asst-chip.asst-suggestion:is(:hover, :focus-visible)
|
|
370
|
-
|
|
371
|
-
.asst-
|
|
372
|
-
.asst-
|
|
373
|
-
.asst-empty-
|
|
385
|
+
.asst-suggestions .asst-chip.asst-suggestion > .asst-icon:not([hidden]) { margin: 0; padding: 0; box-shadow: none; color: var(--asst-text-3); }
|
|
386
|
+
.asst-suggestions .asst-chip.asst-suggestion:is(:hover, :focus-visible) { background: var(--asst-fill-1); box-shadow: none; color: var(--asst-text); }
|
|
387
|
+
.asst-suggestions .asst-chip.asst-suggestion:is(:hover, :focus-visible) > .asst-icon { box-shadow: none; color: var(--asst-text); }
|
|
388
|
+
.asst-suggestions .asst-chip.asst-suggestion.is-picked { background: var(--asst-pill-on-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring); color: var(--asst-text); }
|
|
389
|
+
.asst-suggestions .asst-chip.asst-suggestion.is-picked > .asst-icon { color: var(--asst-brand); }
|
|
390
|
+
.asst-empty.is-drafting .asst-chip.asst-suggestion:not(.is-picked):not(:hover):not(:focus-visible) { opacity: .55; }
|
|
391
|
+
/* A starter's quiet aside (the Workspace tour's "· 2 min"): the row's own font, the faint tone. */
|
|
392
|
+
.asst-suggestions .asst-chip.asst-suggestion .asst-chip-meta { flex-shrink: 0; margin-left: 2px; color: var(--asst-text-4); font: inherit; font-size: 11.5px; white-space: nowrap; }
|
|
393
|
+
.asst-suggestions .asst-chip.asst-suggestion .asst-chip-meta::before { content: '· '; }
|
|
394
|
+
/* The context line: the toolbar's Project field drawn once more, and Budget, as quiet sm text controls. */
|
|
395
|
+
.asst-empty-project { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 2px 8px; max-width: 100%; margin-top: 10px; animation: asst-empty-in var(--asst-dur-moderate) var(--asst-ease-enter) backwards; animation-delay: calc(var(--i, 0) * 40ms); }
|
|
396
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn { --cap-h: var(--asst-pill-h-sm); --cap-r: var(--asst-pill-r-sm); --cap-px: var(--asst-pill-px-xs); --cap-gap: 4px; --cap-icon: 12px; --cap-fs: 11.5px; isolation: isolate; max-width: min(100%, 320px); color: var(--asst-text-2); }
|
|
397
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn::after { content: ''; position: absolute; inset: -2px; z-index: -1; border-radius: inherit; }
|
|
398
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn:not([aria-expanded="true"]) { background: transparent; box-shadow: none; }
|
|
399
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn:hover:not([aria-expanded="true"]) { background: var(--asst-fill-1); color: var(--asst-text); }
|
|
400
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn[aria-expanded="true"] { color: var(--asst-text); }
|
|
401
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn > .asst-icon:not([hidden]) { margin: 0; padding: 0; box-shadow: none; color: var(--asst-text-3); }
|
|
402
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn:is(:hover, [aria-expanded="true"]) > .asst-icon:not([hidden]) { box-shadow: none; }
|
|
403
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn .asst-dd-label { max-width: 24ch; }
|
|
374
404
|
.asst-empty-project-key { flex-shrink: 0; color: var(--asst-text-3); font-weight: 400; }
|
|
375
405
|
|
|
376
406
|
/* ── Messages ───────────────────────────────────────────────────── */
|
|
@@ -998,6 +1028,12 @@ export function injectAssistantStyles() {
|
|
|
998
1028
|
.asst-usage-run-tokens { color: var(--asst-text-3); font-family: var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
999
1029
|
|
|
1000
1030
|
/* The provider's usage limit: one line under the gauge, replaced in place (never a transcript row). */
|
|
1031
|
+
.asst-route-fields { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
|
|
1032
|
+
.asst-route-fields .asst-dd { min-width: 0; max-width: 100%; }
|
|
1033
|
+
.asst-route-fields .asst-dd-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
1034
|
+
.asst-limit-dock { position: sticky; bottom: 0; flex: none; z-index: 2; background: var(--asst-bg); }
|
|
1035
|
+
.asst-limit-dock[hidden] { display: none; }
|
|
1036
|
+
.asst-limit-dock .asst-limit-wait { margin: 8px 12px; }
|
|
1001
1037
|
.asst-limit {
|
|
1002
1038
|
flex: 0 0 auto;
|
|
1003
1039
|
display: flex;
|
|
@@ -1327,6 +1363,8 @@ export function injectAssistantStyles() {
|
|
|
1327
1363
|
.asst-control-plan-body { min-width: 0; }
|
|
1328
1364
|
.asst-control-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
|
|
1329
1365
|
|
|
1366
|
+
/* Follow-ups and the question cards are drawn by the mascot: their sheet is asst-ask-styles.js. */
|
|
1367
|
+
|
|
1330
1368
|
/* Route card */
|
|
1331
1369
|
.asst-route-summary { color: var(--asst-text); }
|
|
1332
1370
|
.asst-route-reasons { margin-top: -4px; color: var(--asst-text-3); font-size: 11.5px; }
|
|
@@ -1399,6 +1437,8 @@ export function injectAssistantStyles() {
|
|
|
1399
1437
|
/* Deny / Decline: a neutral ghost with ✕ (red only ever means failed). */
|
|
1400
1438
|
.asst-btn-danger { background: transparent; box-shadow: inset 0 0 0 1px var(--asst-line-2); color: var(--asst-text-2); }
|
|
1401
1439
|
.asst-btn-danger:hover:not(:disabled) { background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-text-3); color: var(--asst-text); }
|
|
1440
|
+
/* "Stop all" armed: it waits for a second press (asst-agents-dock.js), in the attention tone. */
|
|
1441
|
+
.asst-dock-stopall[data-armed="true"], .asst-dock-stopall[data-armed="true"]:hover:not(:disabled) { background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-pill-warn-ring); color: var(--asst-warn); }
|
|
1402
1442
|
.asst-btn-icon { display: inline-flex; margin-left: -2px; }
|
|
1403
1443
|
.asst-btn-icon svg { width: 12px; height: 12px; }
|
|
1404
1444
|
|
|
@@ -1412,7 +1452,7 @@ export function injectAssistantStyles() {
|
|
|
1412
1452
|
.assistant-panel :is(.asp-header, .asp-body) :is(button, [role="button"], [tabindex]):focus-visible,
|
|
1413
1453
|
.asp-session-pill:focus-visible,
|
|
1414
1454
|
.asp-session-pill .term-minimized-pill-close:focus-visible,
|
|
1415
|
-
:is(.asst-control-cmd, .asst-control-deny-msg, .asst-control-custom):focus-visible {
|
|
1455
|
+
:is(.asst-control-cmd, .asst-control-deny-msg, .asst-control-custom, .asst-ask-input):focus-visible {
|
|
1416
1456
|
outline: 2px solid var(--asst-focus);
|
|
1417
1457
|
outline-offset: 1px;
|
|
1418
1458
|
}
|
|
@@ -1513,6 +1553,28 @@ export function injectAssistantStyles() {
|
|
|
1513
1553
|
.asst-dd-btnrow { display: flex; flex-wrap: wrap; align-items: center; gap: 2px; }
|
|
1514
1554
|
.asst-dd-btnrow-label { flex: 1 1 auto; min-width: 0; padding: 5px 10px; color: var(--asst-text-2); overflow-wrap: anywhere; }
|
|
1515
1555
|
.asst-dd-btnrow .asst-dd-item { flex: 0 1 auto; width: auto; }
|
|
1556
|
+
/* A row with its own action (asst-menu.js item.action: the Sessions menu's Remove): a sm icon button at
|
|
1557
|
+
the row's end, over the room the row keeps free for it; shown on hover and keyboard focus, neutral at
|
|
1558
|
+
rest, red on hover (a destructive action). Touch screens have no hover: it always shows there. */
|
|
1559
|
+
.asst-dd-itemrow { position: relative; }
|
|
1560
|
+
.asst-dd-itemrow > .asst-dd-item { padding-right: calc(var(--asst-pill-h-sm) + 12px); }
|
|
1561
|
+
.asst-dd-item-action.asst-iconbtn {
|
|
1562
|
+
--cap-h: var(--asst-pill-h-sm);
|
|
1563
|
+
--cap-r: var(--asst-pill-r-sm);
|
|
1564
|
+
--cap-icon: 13px;
|
|
1565
|
+
position: absolute;
|
|
1566
|
+
top: calc(50% - var(--cap-h) / 2);
|
|
1567
|
+
right: 6px;
|
|
1568
|
+
opacity: 0;
|
|
1569
|
+
pointer-events: none;
|
|
1570
|
+
}
|
|
1571
|
+
.asst-dd-itemrow:is(:hover, :focus-within) > .asst-dd-item-action,
|
|
1572
|
+
.asst-dd-itemrow > .asst-dd-item.focused + .asst-dd-item-action { opacity: 1; pointer-events: auto; }
|
|
1573
|
+
.asst-dd-item-action.asst-iconbtn:is(:hover, :focus-visible):not(:disabled) { color: var(--asst-live); }
|
|
1574
|
+
@media (hover: none) { .asst-dd-item-action.asst-iconbtn { opacity: 1; pointer-events: auto; } }
|
|
1575
|
+
/* The Sessions menu's "Remove …?" row: the question, then Remove and Cancel, set off from the list. */
|
|
1576
|
+
.asst-dd-btnrow.asst-dd-confirm { justify-content: flex-end; margin: 2px 0; padding: 2px; border-radius: calc(var(--asst-r-card) - 4px); background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-line); }
|
|
1577
|
+
.asst-dd-btnrow.asst-dd-confirm .asst-dd-btnrow-label { flex-basis: 100%; color: var(--asst-text); }
|
|
1516
1578
|
|
|
1517
1579
|
/* ── Account menu (asst-account-menu.js) ────────────────────────
|
|
1518
1580
|
Every account once: initial · name ✓ · plan or credential badge, then who it is and its
|
|
@@ -1828,6 +1890,27 @@ export function injectAssistantStyles() {
|
|
|
1828
1890
|
.asst-lightbox-caption { max-width: 92vw; color: var(--asst-text-2); font-size: 12.5px; text-align: center; }
|
|
1829
1891
|
.asst-lightbox-close { position: absolute; top: 14px; right: 14px; background: var(--asst-popover); box-shadow: 0 0 0 1px var(--asst-popover-ring); color: var(--asst-text); }
|
|
1830
1892
|
|
|
1893
|
+
/* ── Tray pill (#term-minimized-tray, outside the component) ─────────
|
|
1894
|
+
What a session minimises to, in either host: the sidepanel's tab
|
|
1895
|
+
(asst-sidepanel.js) and the terminal's floating tab (ui-terminal.js)
|
|
1896
|
+
both draw the shared .term-minimized-pill of styles.css, exactly like
|
|
1897
|
+
the Claude, Codex and OpenCode pills: 32px, 8px corners, a 1px
|
|
1898
|
+
hairline, icon · name · ✕, no geometry of its own. Only the identity is
|
|
1899
|
+
SynaBun's: the two-pill mark, and the cameo in its place while the
|
|
1900
|
+
session works (gold, with a gold hairline: its own turn or a worker it
|
|
1901
|
+
dispatched, asst-state.js sessionStatus); a session that needs you
|
|
1902
|
+
tints the mark and the hairline. The sidepanel's is a button
|
|
1903
|
+
(Enter/Space) with the panel's focus ring; its ✕ keeps the tray's 24px
|
|
1904
|
+
target. Paused while the UI is dragged and still under reduced motion
|
|
1905
|
+
(Motion, below): the state stays, only the glance stops. */
|
|
1906
|
+
.asp-session-pill .term-minimized-pill-icon .syna-cameo { display: none; }
|
|
1907
|
+
.asp-session-pill.asp-pill-running { border-color: var(--asst-pill-on-ring); }
|
|
1908
|
+
.asp-session-pill.asp-pill-running .term-minimized-pill-icon { color: var(--asst-brand); }
|
|
1909
|
+
.asp-session-pill.asp-pill-running .term-minimized-pill-icon > svg:not(.syna-cameo) { display: none; }
|
|
1910
|
+
.asp-session-pill.asp-pill-running .term-minimized-pill-icon .syna-cameo { display: inline-flex; }
|
|
1911
|
+
.asp-session-pill.asp-pill-attention { border-color: var(--asst-pill-warn-ring); }
|
|
1912
|
+
.asp-session-pill.asp-pill-attention .term-minimized-pill-icon { color: var(--asst-warn); }
|
|
1913
|
+
|
|
1831
1914
|
/* ── Float header brain chip (lives in ui-terminal's float window) ─ */
|
|
1832
1915
|
.term-float-brain-chip {
|
|
1833
1916
|
display: inline-flex;
|
|
@@ -1916,11 +1999,9 @@ export function injectAssistantStyles() {
|
|
|
1916
1999
|
@container asst (max-width: 400px) {
|
|
1917
2000
|
.asst-root > * { --asst-inline: 6px; }
|
|
1918
2001
|
:is(.asst-cost, .asst-bar-group[data-group="context"]) { display: none !important; }
|
|
1919
|
-
.asst-
|
|
1920
|
-
.asst-
|
|
1921
|
-
.asst-empty-project { width: 100%; }
|
|
1922
|
-
.asst-dd.asst-empty-control-btn { flex: 1 1 auto; justify-content: flex-start; max-width: none; }
|
|
1923
|
-
.asst-empty-control-btn .asst-dd-label { flex: 1 1 auto; max-width: none; text-align: start; }
|
|
2002
|
+
.asst-empty { padding-inline: 0; }
|
|
2003
|
+
.asst-suggestions { width: 100%; }
|
|
2004
|
+
.asst-empty-project .asst-dd.asst-empty-control-btn { max-width: 100%; }
|
|
1924
2005
|
.asst-msg.msg-user .asst-msg-content { max-width: 92%; }
|
|
1925
2006
|
.asst-route-opt-sub { display: none; }
|
|
1926
2007
|
.asst-run-main { flex-wrap: wrap; row-gap: 2px; }
|
|
@@ -1935,7 +2016,7 @@ export function injectAssistantStyles() {
|
|
|
1935
2016
|
}
|
|
1936
2017
|
@container asst (max-height: 260px) {
|
|
1937
2018
|
/* the toolbar stays: it carries the controls */
|
|
1938
|
-
:is(.asst-empty-
|
|
2019
|
+
:is(.asst-empty-mascot, .asst-empty-project, .asst-suggestions, .asst-empty-greet) { display: none !important; }
|
|
1939
2020
|
.asst-empty { gap: 4px; padding: 4px; }
|
|
1940
2021
|
.asst-empty-title { font-size: 14px; }
|
|
1941
2022
|
.asst-bottom { margin-top: 6px; }
|