synabun 2.0.9 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +115 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +68 -4
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +2 -2
- package/hooks/claude-code/pre-websearch.mjs +12 -1
- package/hooks/claude-code/shared.mjs +5 -0
- package/hooks/claude-code/stop.mjs +1 -1
- package/launcher.mjs +9 -3
- package/lib/claude-hooks.js +172 -18
- package/lib/client-config-repair.js +17 -8
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +1 -1
- package/lib/first-launch-protection.js +57 -12
- package/lib/mcp-dist.js +176 -0
- package/lib/release-npm-ci.mjs +138 -0
- package/lib/release-publish.mjs +91 -0
- package/lib/release-scan.mjs +50 -0
- package/lib/server-crash-record.js +123 -0
- package/lib/server-exit.js +318 -0
- package/lib/server-supervisor.js +508 -0
- package/lib/start-launcher.js +43 -5
- package/lib/tools-cli.js +45 -0
- package/lib/update-snapshot.js +228 -0
- package/lib/virustotal.mjs +192 -0
- package/lib/windows-crash-event.js +269 -0
- package/mcp-server/dist/http.d.ts +20 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +59 -12
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts +33 -27
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +128 -143
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/preload.js +1 -1
- package/mcp-server/dist/preload.js.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +81 -28
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +16 -10
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +67 -11
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/server-instructions.d.ts +7 -2
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
- package/mcp-server/dist/services/server-instructions.js +20 -62
- package/mcp-server/dist/services/server-instructions.js.map +1 -1
- package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
- package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-catalog.js +339 -0
- package/mcp-server/dist/services/tool-catalog.js.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
- package/mcp-server/dist/services/tool-list.d.ts +108 -0
- package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list.js +334 -0
- package/mcp-server/dist/services/tool-list.js.map +1 -0
- package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
- package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-runtime.js +400 -0
- package/mcp-server/dist/services/tool-runtime.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
- package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +10 -10
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +22 -13
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
- package/mcp-server/dist/tools/image-tools.d.ts +1 -1
- package/mcp-server/dist/tools/image-tools.js +1 -1
- package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
- package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill-tools.js +639 -0
- package/mcp-server/dist/tools/skill-tools.js.map +1 -0
- package/mcp-server/dist/tools/skill.d.ts +7 -0
- package/mcp-server/dist/tools/skill.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill.js +11 -0
- package/mcp-server/dist/tools/skill.js.map +1 -0
- package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
- package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/tool-groups.js +147 -0
- package/mcp-server/dist/tools/tool-groups.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-format.js +7 -4
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -1
- package/mcp-server/src/http.ts +75 -12
- package/mcp-server/src/index.ts +147 -154
- package/mcp-server/src/preload.ts +12 -12
- package/mcp-server/src/services/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/neural-interface.ts +79 -20
- package/mcp-server/src/services/server-instructions.ts +27 -63
- package/mcp-server/src/services/tool-catalog.ts +403 -0
- package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
- package/mcp-server/src/services/tool-list.ts +410 -0
- package/mcp-server/src/services/tool-runtime.ts +457 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +22 -14
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/skill-tools.ts +589 -0
- package/mcp-server/src/tools/skill.ts +13 -0
- package/mcp-server/src/tools/tool-groups.ts +164 -0
- package/mcp-server/src/tools/whiteboard-format.ts +9 -3
- package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
- package/neural-interface/i18n/en.json +3680 -206
- package/neural-interface/i18n/pt-BR.json +3628 -157
- package/neural-interface/lib/account-usage.js +5 -3
- package/neural-interface/lib/app-controls-api.js +161 -0
- package/neural-interface/lib/assistant-api.js +148 -35
- package/neural-interface/lib/assistant-brains/claude.js +4 -3
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
- package/neural-interface/lib/assistant-brains/codex.js +9 -5
- package/neural-interface/lib/assistant-brains/opencode.js +122 -44
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +59 -0
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +97 -0
- package/neural-interface/lib/assistant-catalog.js +23 -9
- package/neural-interface/lib/assistant-dispatch.js +874 -156
- package/neural-interface/lib/assistant-envelope.js +22 -2
- package/neural-interface/lib/assistant-persona.js +80 -11
- package/neural-interface/lib/assistant-plan-permissions.js +10 -9
- package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
- package/neural-interface/lib/assistant-route-gate.js +6 -4
- package/neural-interface/lib/assistant-router.js +13 -8
- package/neural-interface/lib/assistant-runtime.js +183 -26
- package/neural-interface/lib/assistant-task-prompt.js +78 -14
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/backup-service.js +620 -3
- package/neural-interface/lib/backup-zip-reader.js +10 -5
- package/neural-interface/lib/backup-zip-writer.js +257 -0
- package/neural-interface/lib/browser-execution.js +10 -2
- package/neural-interface/lib/browser-guard-cdp.js +83 -0
- package/neural-interface/lib/browser-network-guard.js +284 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +186 -31
- package/neural-interface/lib/claude-agent-bridge.js +4 -2
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-model-catalog.js +64 -14
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install.js +18 -138
- package/neural-interface/lib/cli-resolver.js +4 -1
- package/neural-interface/lib/cli-update-planner.js +32 -31
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-settings-schema.js +109 -47
- package/neural-interface/lib/codex-worker-app-server.js +172 -0
- package/neural-interface/lib/confined-fs.js +30 -3
- package/neural-interface/lib/crash-notice-api.js +98 -0
- package/neural-interface/lib/editor-completion-opencode.js +164 -67
- package/neural-interface/lib/exec-loop-command.js +4 -1
- package/neural-interface/lib/http-guards.js +8 -2
- package/neural-interface/lib/install-details.js +4 -1
- package/neural-interface/lib/launch-cache.js +293 -0
- package/neural-interface/lib/login-start.js +524 -0
- package/neural-interface/lib/mcp-agent-servers.js +67 -0
- package/neural-interface/lib/mcp-client-config.js +0 -29
- package/neural-interface/lib/mcp-external-servers.js +323 -0
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/morelogin.js +30 -0
- package/neural-interface/lib/native-loop-providers.js +565 -50
- package/neural-interface/lib/native-loop-runtime.js +287 -41
- package/neural-interface/lib/opencode-config.js +557 -0
- package/neural-interface/lib/opencode-db-schema.js +58 -0
- package/neural-interface/lib/opencode-history.js +49 -204
- package/neural-interface/lib/opencode-mcp-ready.js +108 -0
- package/neural-interface/lib/opencode-native-boundary.js +44 -0
- package/neural-interface/lib/opencode-protocol.js +310 -0
- package/neural-interface/lib/opencode-provider-view.js +81 -0
- package/neural-interface/lib/opencode-runtime-config.js +32 -15
- package/neural-interface/lib/opencode-serve-records.js +624 -0
- package/neural-interface/lib/opencode-v2-client.js +53 -131
- package/neural-interface/lib/opencode-v2-ws-requests.js +35 -195
- package/neural-interface/lib/opencode-worker-activity.js +229 -0
- package/neural-interface/lib/opencode-worker-data.js +27 -0
- package/neural-interface/lib/opencode2-client.js +796 -0
- package/neural-interface/lib/opencode2-proxy.js +76 -0
- package/neural-interface/lib/opencode2-translate.js +1057 -0
- package/neural-interface/lib/owner-authority.js +249 -0
- package/neural-interface/lib/page-session.js +275 -0
- package/neural-interface/lib/peer-identity.js +763 -0
- package/neural-interface/lib/process-identity.js +361 -0
- package/neural-interface/lib/request-gate.js +17 -2
- package/neural-interface/lib/rulesets/api.js +1 -1
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +92 -27
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +18 -10
- package/neural-interface/lib/session-title-generator.js +58 -18
- package/neural-interface/lib/skills/api-v2.js +495 -0
- package/neural-interface/lib/skills/bundle.js +418 -0
- package/neural-interface/lib/skills/catalog.js +294 -0
- package/neural-interface/lib/skills/creation-api.js +191 -0
- package/neural-interface/lib/skills/creation-brief.js +247 -0
- package/neural-interface/lib/skills/creation-sources.js +267 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +564 -0
- package/neural-interface/lib/skills/digest.js +119 -0
- package/neural-interface/lib/skills/discover.js +111 -0
- package/neural-interface/lib/skills/draft-confinement.js +214 -0
- package/neural-interface/lib/skills/eval-confinement.js +397 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +119 -0
- package/neural-interface/lib/skills/evals-api.js +212 -0
- package/neural-interface/lib/skills/evals.js +1573 -0
- package/neural-interface/lib/skills/export.js +200 -0
- package/neural-interface/lib/skills/frontmatter.js +64 -0
- package/neural-interface/lib/skills/health.js +75 -0
- package/neural-interface/lib/skills/json-edit.js +165 -0
- package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
- package/neural-interface/lib/skills/known-bridges.js +96 -0
- package/neural-interface/lib/skills/library.js +823 -0
- package/neural-interface/lib/skills/local-store.js +21 -0
- package/neural-interface/lib/skills/migration.js +433 -0
- package/neural-interface/lib/skills/operations.js +45 -0
- package/neural-interface/lib/skills/ownership.js +427 -0
- package/neural-interface/lib/skills/packages.js +88 -0
- package/neural-interface/lib/skills/reviews.js +212 -0
- package/neural-interface/lib/skills/revision.js +80 -0
- package/neural-interface/lib/skills/roots.js +262 -0
- package/neural-interface/lib/skills/runtime-checks.js +355 -0
- package/neural-interface/lib/skills/scan-assets.js +252 -0
- package/neural-interface/lib/skills/scan-context.js +26 -0
- package/neural-interface/lib/skills/scan-shell.js +324 -0
- package/neural-interface/lib/skills/scan.js +364 -0
- package/neural-interface/lib/skills/scanners.js +54 -0
- package/neural-interface/lib/skills/service.js +522 -0
- package/neural-interface/lib/skills/telemetry.js +113 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/style-guide/api.js +4 -3
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/untrusted-file-headers.js +27 -0
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/worker-confinement.js +1192 -0
- package/neural-interface/lib/worker-guard-setting.js +56 -0
- package/neural-interface/lib/worker-mcp-channel.js +175 -0
- package/neural-interface/lib/worker-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +229 -0
- package/neural-interface/lib/worker-sandbox.js +299 -0
- package/neural-interface/package-lock.json +1354 -50
- package/neural-interface/package.json +6 -2
- package/neural-interface/public/index.html +5 -3
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +2 -2
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +76 -16
- package/neural-interface/public/shared/api.js +1527 -1336
- package/neural-interface/public/shared/app-frame.js +192 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +205 -19
- package/neural-interface/public/shared/assistant/asst-api.js +11 -3
- package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
- package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
- package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +241 -112
- package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
- package/neural-interface/public/shared/assistant/asst-control.js +157 -26
- package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
- package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
- package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
- package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
- package/neural-interface/public/shared/assistant/asst-menu.js +84 -12
- package/neural-interface/public/shared/assistant/asst-panel.js +303 -44
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +93 -58
- package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
- package/neural-interface/public/shared/assistant/asst-render.js +770 -100
- package/neural-interface/public/shared/assistant/asst-route.js +83 -12
- package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
- package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
- package/neural-interface/public/shared/assistant/asst-scenes.js +530 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
- package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
- package/neural-interface/public/shared/assistant/asst-state.js +25 -15
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +102 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +165 -13
- package/neural-interface/public/shared/automation-context.js +5 -2
- package/neural-interface/public/shared/cc-dropdown.js +550 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
- package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
- package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
- package/neural-interface/public/shared/cdx/cdx-panel.js +58 -150
- package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
- package/neural-interface/public/shared/cdx/cdx-render.js +62 -32
- package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +201 -74
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-view.js +4 -8
- package/neural-interface/public/shared/cli-status.js +2 -2
- package/neural-interface/public/shared/constants.js +2 -2
- package/neural-interface/public/shared/context-menu-areas.js +34 -0
- package/neural-interface/public/shared/context-menu-logic.js +243 -0
- package/neural-interface/public/shared/context-menu-model.js +366 -0
- package/neural-interface/public/shared/context-menu.js +372 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
- package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/data-cache.js +223 -0
- package/neural-interface/public/shared/desktop-bridge.js +11 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
- package/neural-interface/public/shared/desktop-titlebar.js +214 -28
- package/neural-interface/public/shared/desktop-update-view.js +35 -5
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/file-links.js +73 -8
- package/neural-interface/public/shared/html-shell.js +78 -86
- package/neural-interface/public/shared/i18n.js +2 -0
- package/neural-interface/public/shared/launch-prefetch.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +9 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
- package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +140 -254
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +97 -203
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -22
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +20 -13
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +53 -82
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -40
- package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +205 -62
- package/neural-interface/public/shared/opencode-providers.js +39 -0
- package/neural-interface/public/shared/page-session.js +96 -0
- package/neural-interface/public/shared/registry.js +5 -3
- package/neural-interface/public/shared/retired-2d.js +3 -0
- package/neural-interface/public/shared/schedules-view.js +452 -0
- package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
- package/neural-interface/public/shared/settings/settings-app.js +243 -0
- package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
- package/neural-interface/public/shared/settings/settings-data.js +90 -0
- package/neural-interface/public/shared/settings/settings-ia.js +23 -6
- package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
- package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
- package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
- package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
- package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
- package/neural-interface/public/shared/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +219 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
- package/neural-interface/public/shared/skills/ss-doc.js +173 -0
- package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
- package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
- package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
- package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
- package/neural-interface/public/shared/skills/ss-evals.js +417 -0
- package/neural-interface/public/shared/skills/ss-form.js +159 -0
- package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
- package/neural-interface/public/shared/skills/ss-ids.js +32 -0
- package/neural-interface/public/shared/skills/ss-lint.js +141 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
- package/neural-interface/public/shared/skills/ss-resources.js +165 -0
- package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
- package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
- package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
- package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
- package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
- package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
- package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
- package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
- package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
- package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
- package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
- package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
- package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
- package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
- package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
- package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
- package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
- package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
- package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
- package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
- package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
- package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
- package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
- package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
- package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
- package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
- package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
- package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
- package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
- package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
- package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +2065 -2150
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- package/neural-interface/public/shared/tool-list-picker.js +55 -0
- package/neural-interface/public/shared/tool-list-storage.js +24 -0
- package/neural-interface/public/shared/tool-list-view.js +112 -0
- package/neural-interface/public/shared/tour/tour-actor.js +268 -0
- package/neural-interface/public/shared/tour/tour-beats.js +336 -0
- package/neural-interface/public/shared/tour/tour-engine.js +884 -0
- package/neural-interface/public/shared/tour/tour-ink.js +390 -0
- package/neural-interface/public/shared/tour/tour-stage.js +440 -0
- package/neural-interface/public/shared/tour/tour-state.js +40 -0
- package/neural-interface/public/shared/tour/tour-tips.js +99 -0
- package/neural-interface/public/shared/tour/tour.css +144 -0
- package/neural-interface/public/shared/ui-assistant.js +27 -5
- package/neural-interface/public/shared/ui-automation-studio.js +155 -152
- package/neural-interface/public/shared/ui-bookmarks.js +2 -1
- package/neural-interface/public/shared/ui-claude-panel.js +153 -13
- package/neural-interface/public/shared/ui-codex-panel.js +1 -0
- package/neural-interface/public/shared/ui-command-runner.js +6 -3
- package/neural-interface/public/shared/ui-context-menu.js +295 -0
- package/neural-interface/public/shared/ui-cost-widget.js +57 -59
- package/neural-interface/public/shared/ui-crash-notice.js +187 -0
- package/neural-interface/public/shared/ui-detail.js +21 -9
- package/neural-interface/public/shared/ui-file-links.js +1 -0
- package/neural-interface/public/shared/ui-image-gallery.js +56 -52
- package/neural-interface/public/shared/ui-invite.js +18 -2
- package/neural-interface/public/shared/ui-keybinds.js +26 -1
- package/neural-interface/public/shared/ui-link.js +9 -9
- package/neural-interface/public/shared/ui-menubar.js +229 -40
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +9 -1
- package/neural-interface/public/shared/ui-navbar.js +4 -24
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-schedules-studio.js +2267 -953
- package/neural-interface/public/shared/ui-sessions.js +20 -7
- package/neural-interface/public/shared/ui-settings.js +679 -496
- package/neural-interface/public/shared/ui-sidebar.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +56 -5
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
- package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
- package/neural-interface/public/shared/ui-skills.js +42 -2781
- package/neural-interface/public/shared/ui-styleguide.js +5 -2
- package/neural-interface/public/shared/ui-sync.js +22 -5
- package/neural-interface/public/shared/ui-terminal.js +159 -199
- package/neural-interface/public/shared/ui-tool-updates.js +3 -1
- package/neural-interface/public/shared/ui-tooltip.js +10 -5
- package/neural-interface/public/shared/ui-trash.js +14 -5
- package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
- package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +3 -61
- package/neural-interface/public/shared/ui-tutorial.css +47 -100
- package/neural-interface/public/shared/ui-tutorial.js +285 -499
- package/neural-interface/public/shared/ui-update.js +121 -16
- package/neural-interface/public/shared/ui-whiteboard.js +313 -59
- package/neural-interface/public/shared/ui-worker-end.js +4 -0
- package/neural-interface/public/shared/ui-workspaces.js +3 -2
- package/neural-interface/public/shared/view-variant.js +66 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
- package/neural-interface/public/shared/whiteboard-list.js +172 -0
- package/neural-interface/public/shared/worker-end.js +10 -3
- package/neural-interface/public/shared/worker-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +1 -1
- package/neural-interface/public/variant/2d/background.js +2 -1
- package/neural-interface/public/variant/2d/context-menu.js +8 -2
- package/neural-interface/public/variant/2d/graph.js +42 -20
- package/neural-interface/public/variant/2d/hulls.js +14 -9
- package/neural-interface/public/variant/2d/lasso.js +11 -7
- package/neural-interface/public/variant/2d/main.js +36 -2
- package/neural-interface/public/variant/2d/minimap.js +11 -13
- package/neural-interface/public/variant/3d/main.js +72 -6
- package/neural-interface/public/variant/3d/map-controls.js +24 -9
- package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat.css +17 -0
- package/neural-interface/public/vendor/caveat/manifest.json +12 -0
- package/neural-interface/public/vendor/highlight/LICENSE +29 -0
- package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
- package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
- package/neural-interface/public/vendor/highlight/manifest.json +5 -0
- package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
- package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
- package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
- package/neural-interface/public/vendor/marked/manifest.json +4 -0
- package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
- package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
- package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
- package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
- package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
- package/neural-interface/public/vendor/yaml/LICENSE +13 -0
- package/neural-interface/public/vendor/yaml/manifest.json +4 -0
- package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
- package/neural-interface/scripts/build-vendor.mjs +116 -3
- package/neural-interface/server.js +4834 -2541
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +18 -12
- package/package.json +16 -3
- package/postinstall.js +9 -4
- package/preuninstall.js +1 -1
- package/setup.js +97 -322
- package/skills/skill-forge/SKILL.md +177 -0
- package/skills/skill-forge/evals/evals.json +54 -0
- package/skills/skill-forge/references/package.md +105 -0
- package/skills/skill-forge/references/review-and-recovery.md +63 -0
- package/skills/skill-forge/references/runtime-profiles.md +20 -0
- package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
- package/skills/synabun/SKILL.md +10 -7
- package/skills/synabun/modules/audit.md +1 -5
- package/skills/synabun/modules/changelog.md +1 -5
- package/skills/synabun/modules/idea.md +1 -1
- package/skills/synabun/modules/memorize.md +6 -9
- package/skills/synabun/modules/schedule.md +5 -5
- package/mcp-server/dist/services/profiles.d.ts +0 -120
- package/mcp-server/dist/services/profiles.d.ts.map +0 -1
- package/mcp-server/dist/services/profiles.js +0 -387
- package/mcp-server/dist/services/profiles.js.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
- package/mcp-server/dist/tools/leonardo.d.ts +0 -13
- package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo.js +0 -21
- package/mcp-server/dist/tools/leonardo.js.map +0 -1
- package/mcp-server/dist/tools/profile.d.ts +0 -17
- package/mcp-server/dist/tools/profile.d.ts.map +0 -1
- package/mcp-server/dist/tools/profile.js +0 -114
- package/mcp-server/dist/tools/profile.js.map +0 -1
- package/mcp-server/src/services/profiles.ts +0 -428
- package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
- package/mcp-server/src/tools/leonardo.ts +0 -30
- package/mcp-server/src/tools/profile.ts +0 -122
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
- package/neural-interface/lib/mcp-profile-servers.js +0 -120
- package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
- package/skills/leonardo/SKILL.md +0 -168
- package/skills/leonardo/icon.svg +0 -1
- package/skills/leonardo/modules/browser-guide.md +0 -378
- package/skills/leonardo/modules/image-prompter.md +0 -283
- package/skills/leonardo/modules/model-advisor.md +0 -100
- package/skills/leonardo/modules/prompt-library.md +0 -110
- package/skills/leonardo/modules/style-guide.md +0 -186
- package/skills/leonardo/modules/video-prompter.md +0 -317
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — App frame
|
|
3
|
+
// The inset rounded card the workspace sits in (styles.css "APP FRAME"). Outside it is the chrome: the title bar,
|
|
4
|
+
// the two explorers and a gutter of their tone. Inside it is everything else: the 3D and 2D graphs, every floating
|
|
5
|
+
// window and panel, the terminal, menus, tooltips and popovers. Modals and full-window backdrops still cover the
|
|
6
|
+
// whole window.
|
|
7
|
+
//
|
|
8
|
+
// One source of geometry: the CSS variables of :root (--navbar-height, --explorer-width, --file-explorer-width and
|
|
9
|
+
// --frame-gap, which is 0 on a page without the frame). frameRect() is the rect every clamp uses instead of 0,
|
|
10
|
+
// innerWidth, innerHeight or --navbar-height. The top half of this file is DOM-free (unit-tested).
|
|
11
|
+
// ═══════════════════════════════════════════
|
|
12
|
+
|
|
13
|
+
/** The class on <html> of a page that draws the frame (html-shell.js). */
|
|
14
|
+
export const FRAMED_CLASS = 'app-framed';
|
|
15
|
+
|
|
16
|
+
const num = (value) => {
|
|
17
|
+
const n = Number.parseFloat(value);
|
|
18
|
+
return Number.isFinite(n) ? n : 0;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The frame's rect in viewport pixels from the window's size and the chrome around it: the navbar's height, the
|
|
23
|
+
* open explorers' width and the gutter. A frame the window is too small for collapses to a zero-size rect at its
|
|
24
|
+
* top-left corner instead of turning inside out.
|
|
25
|
+
*/
|
|
26
|
+
export function computeFrameRect({ viewportWidth = 0, viewportHeight = 0, navbarHeight = 0, sidebarWidth = 0, gap = 0 } = {}) {
|
|
27
|
+
const g = Math.max(0, num(gap));
|
|
28
|
+
const left = Math.max(0, num(sidebarWidth)) + g;
|
|
29
|
+
const top = Math.max(0, num(navbarHeight)) + g;
|
|
30
|
+
const right = Math.max(left, num(viewportWidth) - g);
|
|
31
|
+
const bottom = Math.max(top, num(viewportHeight) - g);
|
|
32
|
+
return { left, top, right, bottom, width: right - left, height: bottom - top, gap: g };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** The area a menu, tooltip or popover for a point is kept in: `frame` when the point is inside it, else null (the
|
|
36
|
+
* window: the bar and the explorers are outside the frame, and what opens from them stays by them). */
|
|
37
|
+
export function boundsForPoint(frame, x, y) {
|
|
38
|
+
if (!frame || !Number.isFinite(x) || !Number.isFinite(y)) return null;
|
|
39
|
+
return x >= frame.left && x <= frame.right && y >= frame.top && y <= frame.bottom ? frame : null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** A rect `margin` pixels inside another (never inverted). */
|
|
43
|
+
export function insetRect(rect, margin = 0) {
|
|
44
|
+
const m = Math.max(0, num(margin));
|
|
45
|
+
const left = rect.left + m, top = rect.top + m;
|
|
46
|
+
const right = Math.max(left, rect.right - m), bottom = Math.max(top, rect.bottom - m);
|
|
47
|
+
return { ...rect, left, top, right, bottom, width: right - left, height: bottom - top };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Where a box of `width` × `height` at (x, y) goes to stay inside `bounds`. A box larger than the bounds keeps its
|
|
52
|
+
* top-left corner inside them (its header stays reachable), the same rule the old window clamps followed.
|
|
53
|
+
*/
|
|
54
|
+
export function clampBox(x, y, width, height, bounds) {
|
|
55
|
+
return {
|
|
56
|
+
x: Math.max(bounds.left, Math.min(num(x), bounds.right - Math.max(0, num(width)))),
|
|
57
|
+
y: Math.max(bounds.top, Math.min(num(y), bounds.bottom - Math.max(0, num(height)))),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Where a box goes that must keep only `keep` pixels on screen (the floating terminals): its left edge may run
|
|
63
|
+
* past the frame's left side and its right side past the frame's right, but its top never above the frame's top
|
|
64
|
+
* (the header stays reachable).
|
|
65
|
+
*/
|
|
66
|
+
export function clampBoxLoose(x, y, width, height, bounds, keep = 80) {
|
|
67
|
+
const k = Math.max(0, num(keep));
|
|
68
|
+
return {
|
|
69
|
+
x: Math.max(bounds.left + k - Math.max(0, num(width)), Math.min(num(x), bounds.right - k)),
|
|
70
|
+
y: Math.max(bounds.top, Math.min(num(y), bounds.bottom - k)),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ── Page side ──
|
|
75
|
+
|
|
76
|
+
let _cacheKey = '';
|
|
77
|
+
let _cacheRect = null;
|
|
78
|
+
|
|
79
|
+
const isFramed = (el) => !!el?.classList?.contains?.(FRAMED_CLASS);
|
|
80
|
+
|
|
81
|
+
function inlineKey(el, win) {
|
|
82
|
+
const s = el.style;
|
|
83
|
+
return [
|
|
84
|
+
isFramed(el) ? 1 : 0,
|
|
85
|
+
s.getPropertyValue('--navbar-height'),
|
|
86
|
+
s.getPropertyValue('--explorer-width'),
|
|
87
|
+
s.getPropertyValue('--file-explorer-width'),
|
|
88
|
+
s.getPropertyValue('--frame-gap'),
|
|
89
|
+
win.innerWidth,
|
|
90
|
+
win.innerHeight,
|
|
91
|
+
].join('|');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The frame's rect now, in viewport pixels. Cheap to call per pointer event: the computed style is read only when
|
|
96
|
+
* the window's size or one of the inline variables it depends on changed since the last call. A page without the
|
|
97
|
+
* frame (a detached session window, onboarding) has no bar or explorers around its content: the whole window.
|
|
98
|
+
*/
|
|
99
|
+
export function frameRect(win = typeof window !== 'undefined' ? window : null) {
|
|
100
|
+
const whole = () => computeFrameRect({ viewportWidth: win?.innerWidth || 0, viewportHeight: win?.innerHeight || 0 });
|
|
101
|
+
const el = win?.document?.documentElement;
|
|
102
|
+
if (!el || !isFramed(el) || typeof win.getComputedStyle !== 'function') return whole();
|
|
103
|
+
try {
|
|
104
|
+
const key = inlineKey(el, win);
|
|
105
|
+
if (key === _cacheKey && _cacheRect) return _cacheRect;
|
|
106
|
+
const cs = win.getComputedStyle(el);
|
|
107
|
+
const navbar = cs.getPropertyValue('--navbar-height');
|
|
108
|
+
_cacheRect = computeFrameRect({
|
|
109
|
+
viewportWidth: win.innerWidth,
|
|
110
|
+
viewportHeight: win.innerHeight,
|
|
111
|
+
navbarHeight: navbar.trim() ? num(navbar) : 48,
|
|
112
|
+
sidebarWidth: num(cs.getPropertyValue('--explorer-width')) + num(cs.getPropertyValue('--file-explorer-width')),
|
|
113
|
+
gap: num(cs.getPropertyValue('--frame-gap')),
|
|
114
|
+
});
|
|
115
|
+
_cacheKey = key;
|
|
116
|
+
return _cacheRect;
|
|
117
|
+
} catch {
|
|
118
|
+
return whole();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Keep a box inside the frame (inset by `margin`): `{ x, y }` for its top-left corner. */
|
|
123
|
+
export function clampToFrame(x, y, width, height, margin = 0) {
|
|
124
|
+
return clampBox(x, y, width, height, insetRect(frameRect(), margin));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The area a window of `width` × `height` is kept in: the frame when it fits there, else the whole window less
|
|
128
|
+
* 8px (a modal taller than the frame still shows whole, as it did before the frame). */
|
|
129
|
+
export function windowArea(width, height, rect = frameRect()) {
|
|
130
|
+
if (width <= rect.width && height <= rect.height) return rect;
|
|
131
|
+
const vw = typeof window !== 'undefined' ? window.innerWidth : rect.right;
|
|
132
|
+
const vh = typeof window !== 'undefined' ? window.innerHeight : rect.bottom;
|
|
133
|
+
return insetRect(computeFrameRect({ viewportWidth: vw, viewportHeight: vh }), 8);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Where a window of `width` × `height` opens by default: centred in the frame, inside it (windowArea). */
|
|
137
|
+
export function centeredInFrame(width, height, rect = frameRect()) {
|
|
138
|
+
const area = windowArea(width, height, rect);
|
|
139
|
+
const at = clampBox(area.left + (area.width - width) / 2, area.top + (area.height - height) / 2, width, height, area);
|
|
140
|
+
return { left: Math.round(at.x), top: Math.round(at.y) };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** The area kept for something opened at a point: the frame when the point is in it, else the whole window. */
|
|
144
|
+
export function placementArea(x, y) {
|
|
145
|
+
const f = frameRect();
|
|
146
|
+
return boundsForPoint(f, x, y) || computeFrameRect({ viewportWidth: window.innerWidth, viewportHeight: window.innerHeight });
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const _listeners = new Set();
|
|
150
|
+
let _watching = false;
|
|
151
|
+
let _lastNotified = '';
|
|
152
|
+
let _notifyRaf = 0;
|
|
153
|
+
|
|
154
|
+
function notify() {
|
|
155
|
+
_notifyRaf = 0;
|
|
156
|
+
const rect = frameRect();
|
|
157
|
+
const key = `${rect.left}|${rect.top}|${rect.right}|${rect.bottom}`;
|
|
158
|
+
if (key === _lastNotified) return;
|
|
159
|
+
_lastNotified = key;
|
|
160
|
+
for (const fn of [..._listeners]) {
|
|
161
|
+
try { fn(rect); } catch (err) { console.error('[app-frame] listener failed', err); }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
function schedule() {
|
|
166
|
+
if (_notifyRaf) return;
|
|
167
|
+
_notifyRaf = typeof requestAnimationFrame === 'function' ? requestAnimationFrame(notify) : setTimeout(notify, 16);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function watch() {
|
|
171
|
+
if (_watching || typeof window === 'undefined' || !window.document?.documentElement) return;
|
|
172
|
+
_watching = true;
|
|
173
|
+
const r = frameRect();
|
|
174
|
+
_lastNotified = `${r.left}|${r.top}|${r.right}|${r.bottom}`;
|
|
175
|
+
window.addEventListener?.('resize', schedule);
|
|
176
|
+
// An explorer opening or closing, the navbar's measured height and the frame's own class all land on <html>'s
|
|
177
|
+
// inline style or class list. Writes the frame does not depend on (--terminal-height, --right-panel-width…) are
|
|
178
|
+
// filtered out by the rect comparison in notify().
|
|
179
|
+
if (typeof MutationObserver === 'function') {
|
|
180
|
+
new MutationObserver(schedule).observe(window.document.documentElement, { attributes: true, attributeFilter: ['style', 'class'] });
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Call `fn(rect)` once per frame in which the frame's rect changed (window resize, an explorer opening or closing,
|
|
186
|
+
* the navbar's height). Returns the unsubscribe function.
|
|
187
|
+
*/
|
|
188
|
+
export function onFrameChange(fn) {
|
|
189
|
+
_listeners.add(fn);
|
|
190
|
+
watch();
|
|
191
|
+
return () => _listeners.delete(fn);
|
|
192
|
+
}
|
|
@@ -11,16 +11,33 @@
|
|
|
11
11
|
// mount, then sync:sidepanel:run-* and sync:assistant:* bus events. A run
|
|
12
12
|
// removed here (or in another window: sync:assistant:run-removed) never comes
|
|
13
13
|
// back from a late event.
|
|
14
|
+
// The head is always on screen while there are runs: beside the summary, one
|
|
15
|
+
// mini scene per working agent (asst-scenes.js; up to three, then "+N"), all
|
|
16
|
+
// moving at once. Open, each working agent's row has a lane: its mini scene
|
|
17
|
+
// and current step. A mini scene or a lane brings that run's card into view
|
|
18
|
+
// in the transcript (hooks.onReveal). hooks.onRunChange hears every change
|
|
19
|
+
// to a run, whatever its source, so the transcript's card follows the tray.
|
|
20
|
+
// "Stop all" asks twice (asst-stop.js createConfirmGate): the first press
|
|
21
|
+
// turns it into "Stop N agents?", a second press within a few seconds stops
|
|
22
|
+
// every run of the session at once. It sits right under the transcript's
|
|
23
|
+
// last card, so one stray click or key there must not end the session's work.
|
|
14
24
|
|
|
15
25
|
import { on } from '../state.js';
|
|
16
26
|
import { getProviderMeta } from '../provider-icons.js';
|
|
17
27
|
import { listAssistantRuns } from './asst-api.js';
|
|
18
28
|
import { buildRunCard, tickRunCard, updateRunCard } from './asst-render.js';
|
|
29
|
+
import { awaitsAnswer, compactActivity, isLivePhase, phaseLine, sceneFor, sceneSvg, stageLabel, stagePhase, stepLine } from './asst-scenes.js';
|
|
30
|
+
import { injectSceneStyles } from './asst-scene-styles.js';
|
|
31
|
+
import { plural } from './asst-tool-kinds.js';
|
|
19
32
|
import { isRemovableRun, isRunIdle, isTerminalRunStatus, mergeRunDescriptor, runFromPayload, runNeedsAttention, sortRuns } from './asst-state.js';
|
|
33
|
+
import { createConfirmGate } from './asst-stop.js';
|
|
20
34
|
|
|
21
35
|
const TICK_MS = 5000;
|
|
22
36
|
const SHOW_ALL_LIMIT = 40;
|
|
23
37
|
const RECENT_WINDOW_MS = 6 * 60 * 60 * 1000;
|
|
38
|
+
const MINI_LIMIT = 3; // mini scenes in the head, then "+N"
|
|
39
|
+
const SCENE_DWELL_MS = 2500; // a scene the activity picked stays at least this long
|
|
40
|
+
const WORKING_PHASES = new Set(['queued', 'starting', 'working']); // live and not waiting on you (asst-scenes.js stagePhase)
|
|
24
41
|
|
|
25
42
|
function el(tag, className, text) {
|
|
26
43
|
const node = document.createElement(tag);
|
|
@@ -35,12 +52,14 @@ function esc(value) {
|
|
|
35
52
|
|
|
36
53
|
/**
|
|
37
54
|
* createAgentsDock(hostEl, hooks)
|
|
38
|
-
* hooks: { t, sessionId, onFocus(runId), onStop(runId), onRead(runId), onEscalate(runId, target),
|
|
39
|
-
*
|
|
55
|
+
* hooks: { t, sessionId, onFocus(runId), onStop(runId), onRead(runId), onEscalate(runId, target),
|
|
56
|
+
* onStopAll() (the second press of "Stop all"; stopAllConfirmMs / stopAllMinGapMs time it),
|
|
57
|
+
* onRemove(runId), onClearFinished(runIds), onReveal(runId), onRunChange(run),
|
|
40
58
|
* open, showAll, onToggle(open), onShowAllChange(showAll),
|
|
41
|
-
* onCountChange({ total, active, attention, visible }) }
|
|
59
|
+
* onCountChange({ total, active, attention, answer, idle, working, waiting, visible }) }
|
|
42
60
|
*/
|
|
43
61
|
export function createAgentsDock(hostEl, hooks = {}) {
|
|
62
|
+
injectSceneStyles();
|
|
44
63
|
const t = (key, fallback, params) => {
|
|
45
64
|
const v = typeof hooks.t === 'function' ? hooks.t(key, params) : undefined;
|
|
46
65
|
if (v && v !== key && typeof v === 'string') return v;
|
|
@@ -53,6 +72,7 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
53
72
|
root.innerHTML = `
|
|
54
73
|
<div class="asst-dock-head">
|
|
55
74
|
<button type="button" class="asst-dock-toggle" aria-expanded="false" aria-controls="${bodyId}"><span class="asst-dock-chev" aria-hidden="true">›</span><span class="asst-dock-title">${esc(t('assistant.dock.title', 'Agents'))}</span><span class="asst-dock-summary"></span></button>
|
|
75
|
+
<div class="asst-dock-minis" role="group" aria-label="${esc(t('assistant.dock.working', 'Agents at work'))}"></div>
|
|
56
76
|
<span class="asst-dock-spacer"></span>
|
|
57
77
|
<button type="button" class="asst-tb-btn asst-dock-showall" aria-pressed="false" hidden>${esc(t('assistant.dock.showAll', 'Show all'))}</button>
|
|
58
78
|
<button type="button" class="asst-tb-btn asst-dock-clear" hidden>${esc(t('assistant.dock.clearFinished', 'Clear finished'))}</button>
|
|
@@ -64,14 +84,32 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
64
84
|
|
|
65
85
|
const toggle = root.querySelector('.asst-dock-toggle');
|
|
66
86
|
const summaryEl = root.querySelector('.asst-dock-summary');
|
|
87
|
+
const minisEl = root.querySelector('.asst-dock-minis');
|
|
67
88
|
const showAllBtn = root.querySelector('.asst-dock-showall');
|
|
68
89
|
const stopAllBtn = root.querySelector('.asst-dock-stopall');
|
|
69
90
|
const clearBtn = root.querySelector('.asst-dock-clear');
|
|
70
91
|
const body = root.querySelector('.asst-dock-body');
|
|
92
|
+
// Armed, "Stop all" says what it would stop and waits for the second press (then lapses by itself).
|
|
93
|
+
const stopAllGate = createConfirmGate({ windowMs: hooks.stopAllConfirmMs, minGapMs: hooks.stopAllMinGapMs, onChange: () => paintStopAll() });
|
|
94
|
+
function paintStopAll(active = counts().active) {
|
|
95
|
+
const armed = stopAllGate.isArmed();
|
|
96
|
+
const label = armed
|
|
97
|
+
? plural(t, 'assistant.dock.stopAllConfirm', active, 'Stop {count} agent?', 'Stop {count} agents?')
|
|
98
|
+
: t('assistant.dock.stopAll', 'Stop all');
|
|
99
|
+
const tip = armed
|
|
100
|
+
? t('assistant.dock.stopAllConfirmTip', 'Press again to stop every agent of this session')
|
|
101
|
+
: t('assistant.dock.stopAllTip', 'Stop every agent of this session (asks once more)');
|
|
102
|
+
if (stopAllBtn.textContent !== label) stopAllBtn.textContent = label;
|
|
103
|
+
stopAllBtn.dataset.armed = armed ? 'true' : 'false';
|
|
104
|
+
stopAllBtn.setAttribute('data-tooltip', tip);
|
|
105
|
+
}
|
|
71
106
|
|
|
72
107
|
const runs = new Map(); // runId → descriptor
|
|
73
108
|
const cards = new Map(); // runId → element
|
|
74
109
|
const removed = new Set(); // runIds the user removed: late events never revive them
|
|
110
|
+
const activities = new Map(); // runId → what its worker does now, compact ({ kind, name, step, at }), while the run lasts
|
|
111
|
+
const minis = new Map(); // runId → its mini scene in the head
|
|
112
|
+
let moreBtn = null;
|
|
75
113
|
let open = hooks.open === true;
|
|
76
114
|
let showAll = hooks.showAll === true;
|
|
77
115
|
let ticker = null;
|
|
@@ -96,20 +134,31 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
96
134
|
return {
|
|
97
135
|
total: list.length,
|
|
98
136
|
active: list.filter(r => !isTerminalRunStatus(r.status)).length,
|
|
99
|
-
|
|
100
|
-
|
|
137
|
+
// Waiting on you, whatever for (a permission, a route card, your answer); `answer` is the part that
|
|
138
|
+
// needs your answer, as its lane says (asst-scenes.js awaitsAnswer: a turn that ended asking, a question
|
|
139
|
+
// mid-turn), and a warm worker that asked is never counted idle.
|
|
140
|
+
attention: list.filter(r => runNeedsAttention(r) || awaitsAnswer(r)).length,
|
|
141
|
+
answer: list.filter(awaitsAnswer).length,
|
|
142
|
+
idle: list.filter(r => isRunIdle(r) && !awaitsAnswer(r)).length,
|
|
101
143
|
finished: list.length - list.filter(r => !isTerminalRunStatus(r.status)).length,
|
|
144
|
+
// The session's status reads these (asst-state.js sessionStatus): agents at work (queued for a free slot,
|
|
145
|
+
// starting, in a turn) keep it working after its own turn ended; agents waiting on you make it need you.
|
|
146
|
+
working: list.filter(r => WORKING_PHASES.has(stagePhase(r))).length,
|
|
147
|
+
waiting: list.filter(r => stagePhase(r) === 'waiting').length,
|
|
102
148
|
visible: list.length > 0,
|
|
103
149
|
};
|
|
104
150
|
}
|
|
105
151
|
|
|
152
|
+
/** "2 running · 1 idle · 1 needs approval": each count in its own plural form (`key.one` / `key.other`, asst-tool-kinds.js plural). */
|
|
106
153
|
function summaryText(c) {
|
|
107
154
|
const bits = [];
|
|
108
155
|
const running = c.active - c.attention - c.idle;
|
|
109
|
-
if (running > 0) bits.push(t
|
|
110
|
-
if (c.idle > 0) bits.push(t
|
|
111
|
-
|
|
112
|
-
if (
|
|
156
|
+
if (running > 0) bits.push(plural(t, 'assistant.dock.running', running, '{count} running', '{count} running'));
|
|
157
|
+
if (c.idle > 0) bits.push(plural(t, 'assistant.dock.idle', c.idle, '{count} idle', '{count} idle'));
|
|
158
|
+
const approval = c.attention - (c.answer || 0);
|
|
159
|
+
if (approval > 0) bits.push(plural(t, 'assistant.dock.needsApproval', approval, '{count} needs approval', '{count} need approval'));
|
|
160
|
+
if (c.answer > 0) bits.push(plural(t, 'assistant.dock.needsAnswer', c.answer, '{count} waiting for your answer', '{count} waiting for your answer'));
|
|
161
|
+
if (!bits.length && c.total) bits.push(plural(t, 'assistant.dock.done', c.total, '{count} finished', '{count} finished'));
|
|
113
162
|
return bits.join(' · ');
|
|
114
163
|
}
|
|
115
164
|
|
|
@@ -131,24 +180,29 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
131
180
|
if (destroyed) return;
|
|
132
181
|
const list = visibleRuns();
|
|
133
182
|
const seen = new Set();
|
|
134
|
-
|
|
183
|
+
// Reconciled in place: a row that keeps its place keeps its node (and its mini scene keeps moving).
|
|
184
|
+
let at = 0;
|
|
135
185
|
for (const run of list) {
|
|
136
186
|
seen.add(run.runId);
|
|
137
187
|
let card = cards.get(run.runId);
|
|
138
188
|
if (!card) { card = buildRunCard(run, cardOpts()); cards.set(run.runId, card); }
|
|
139
189
|
else updateRunCard(card, run, cardOpts());
|
|
140
190
|
card.setAttribute('role', 'listitem');
|
|
141
|
-
|
|
191
|
+
syncLane(card, run);
|
|
192
|
+
if (body.children[at] !== card) body.insertBefore(card, body.children[at] || null);
|
|
193
|
+
at += 1;
|
|
142
194
|
}
|
|
143
195
|
for (const [runId, card] of cards) { if (!seen.has(runId)) { card.remove(); cards.delete(runId); } }
|
|
144
|
-
body.
|
|
145
|
-
|
|
196
|
+
while (body.children.length > at) body.lastElementChild.remove();
|
|
197
|
+
renderMinis();
|
|
146
198
|
|
|
147
199
|
const c = counts();
|
|
148
200
|
root.hidden = c.total === 0;
|
|
149
201
|
summaryEl.textContent = summaryText(c);
|
|
150
202
|
root.classList.toggle('attention', c.attention > 0);
|
|
151
203
|
stopAllBtn.hidden = c.active === 0;
|
|
204
|
+
if (stopAllBtn.hidden) stopAllGate.reset();
|
|
205
|
+
paintStopAll(c.active);
|
|
152
206
|
clearBtn.hidden = !open || typeof hooks.onClearFinished !== 'function' || ![...runs.values()].some(isRemovableRun);
|
|
153
207
|
showAllBtn.hidden = !open;
|
|
154
208
|
showAllBtn.setAttribute('aria-pressed', showAll ? 'true' : 'false');
|
|
@@ -159,18 +213,126 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
159
213
|
syncTicker();
|
|
160
214
|
}
|
|
161
215
|
|
|
216
|
+
// ── Working agents at a glance: mini scenes in the head, a lane per open row ──
|
|
217
|
+
const workingRuns = () => sortRuns([...runs.values()]).filter(r => isLivePhase(stagePhase(r)));
|
|
218
|
+
|
|
219
|
+
/** "Coding · Settings: App controls section · 3 min" (the stage's own name). */
|
|
220
|
+
function labelOf(run, scene, phase) {
|
|
221
|
+
const from = new Date(run.startedAt || run.createdAt || 0).getTime();
|
|
222
|
+
return stageLabel({ scene, phase, title: run.title || run.task || run.runId, ms: from ? Date.now() - from : 0, run }, t);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Draw `scene` into `host` (an SVG of its own), unless the one there was picked under the dwell. */
|
|
226
|
+
function paintScene(node, host, run, phase) {
|
|
227
|
+
const now = Date.now();
|
|
228
|
+
const scene = sceneFor(run, activities.get(run.runId), now);
|
|
229
|
+
if (node.dataset.scene !== scene && (!node.dataset.scene || node.dataset.scene === 'generic' || now - (node._sceneAt || 0) >= SCENE_DWELL_MS)) {
|
|
230
|
+
host.innerHTML = sceneSvg(scene, { mini: true });
|
|
231
|
+
node.dataset.scene = scene;
|
|
232
|
+
node._sceneAt = now;
|
|
233
|
+
}
|
|
234
|
+
node.dataset.phase = phase;
|
|
235
|
+
host.firstElementChild?.toggleAttribute('data-live', phase !== 'waiting');
|
|
236
|
+
return node.dataset.scene;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function reveal(runId) {
|
|
240
|
+
if (runId) hooks.onReveal?.(runId);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function renderMinis() {
|
|
244
|
+
const live = workingRuns();
|
|
245
|
+
const shown = live.slice(0, MINI_LIMIT);
|
|
246
|
+
const keep = new Set(shown.map(r => r.runId));
|
|
247
|
+
for (const [runId, node] of minis) if (!keep.has(runId)) { node.remove(); minis.delete(runId); }
|
|
248
|
+
shown.forEach((run, i) => {
|
|
249
|
+
let node = minis.get(run.runId);
|
|
250
|
+
if (!node) {
|
|
251
|
+
node = el('button', 'asst-dock-mini');
|
|
252
|
+
node.type = 'button';
|
|
253
|
+
node.dataset.runId = run.runId;
|
|
254
|
+
node.addEventListener('click', (e) => { e.stopPropagation(); reveal(node.dataset.runId); });
|
|
255
|
+
minis.set(run.runId, node);
|
|
256
|
+
}
|
|
257
|
+
const phase = stagePhase(run);
|
|
258
|
+
const scene = paintScene(node, node, run, phase);
|
|
259
|
+
const label = labelOf(run, scene, phase);
|
|
260
|
+
node.setAttribute('aria-label', t('assistant.dock.reveal', '{label}. Show it in the conversation', { label }));
|
|
261
|
+
node.setAttribute('data-tooltip', label);
|
|
262
|
+
if (minisEl.children[i] !== node) minisEl.insertBefore(node, minisEl.children[i] || null);
|
|
263
|
+
});
|
|
264
|
+
const extra = live.length - shown.length;
|
|
265
|
+
if (extra > 0) {
|
|
266
|
+
if (!moreBtn) {
|
|
267
|
+
moreBtn = el('button', 'asst-dock-more');
|
|
268
|
+
moreBtn.type = 'button';
|
|
269
|
+
moreBtn.addEventListener('click', (e) => { e.stopPropagation(); setOpen(true); });
|
|
270
|
+
}
|
|
271
|
+
moreBtn.textContent = `+${extra}`;
|
|
272
|
+
const more = extra === 1 ? t('assistant.dock.more.one', '{count} more agent at work: show the list', { count: extra }) : t('assistant.dock.more.other', '{count} more agents at work: show the list', { count: extra });
|
|
273
|
+
moreBtn.setAttribute('aria-label', more);
|
|
274
|
+
moreBtn.setAttribute('data-tooltip', more);
|
|
275
|
+
if (minisEl.lastElementChild !== moreBtn) minisEl.appendChild(moreBtn);
|
|
276
|
+
} else moreBtn?.remove();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** An open row's lane while its agent works: its mini scene and current step; a click shows its card. */
|
|
280
|
+
function syncLane(card, run) {
|
|
281
|
+
let lane = card.querySelector(':scope > .asst-run-lane');
|
|
282
|
+
const phase = stagePhase(run);
|
|
283
|
+
if (!isLivePhase(phase)) { lane?.remove(); return; }
|
|
284
|
+
if (!lane) {
|
|
285
|
+
lane = el('button', 'asst-run-lane');
|
|
286
|
+
lane.type = 'button';
|
|
287
|
+
lane.innerHTML = '<span class="asst-run-lane-scene" aria-hidden="true"></span><span class="asst-run-lane-step"></span>';
|
|
288
|
+
lane.addEventListener('click', (e) => { e.stopPropagation(); reveal(card.dataset.runId); });
|
|
289
|
+
const meta = card.querySelector(':scope > .asst-run-meta');
|
|
290
|
+
if (meta) meta.after(lane); else card.appendChild(lane);
|
|
291
|
+
}
|
|
292
|
+
const scene = paintScene(lane, lane.querySelector('.asst-run-lane-scene'), run, phase);
|
|
293
|
+
const step = phase === 'working' ? (stepLine(activities.get(run.runId), t) || phaseLine(phase, run, scene, t)) : phaseLine(phase, run, scene, t);
|
|
294
|
+
const stepEl = lane.querySelector('.asst-run-lane-step');
|
|
295
|
+
if (stepEl.textContent !== step) stepEl.textContent = step;
|
|
296
|
+
lane.setAttribute('aria-label', t('assistant.dock.reveal', '{label}. Show it in the conversation', { label: labelOf(run, scene, phase) }));
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/** The worker's provider events say what it does now: its mini scene and lane follow. Kept compact, and only while the run lasts. */
|
|
300
|
+
function setRunActivity(runId, activity) {
|
|
301
|
+
if (!runId || !runs.has(runId)) return;
|
|
302
|
+
const run = runs.get(runId);
|
|
303
|
+
const next = isTerminalRunStatus(run.status) ? null : compactActivity(activity, t);
|
|
304
|
+
if (next) activities.set(runId, next); else activities.delete(runId);
|
|
305
|
+
const card = cards.get(runId);
|
|
306
|
+
if (card) syncLane(card, run);
|
|
307
|
+
if (minis.has(runId)) renderMinis();
|
|
308
|
+
}
|
|
309
|
+
|
|
162
310
|
function syncTicker() {
|
|
163
|
-
|
|
164
|
-
|
|
311
|
+
// Open: the rows' clocks; collapsed with agents at work: their mini scenes' names (whole minutes) and steps.
|
|
312
|
+
const needs = !root.hidden && (open || minis.size > 0) && [...runs.values()].some(r => !isTerminalRunStatus(r.status));
|
|
313
|
+
if (needs && !ticker) {
|
|
314
|
+
ticker = setInterval(() => {
|
|
315
|
+
if (open) for (const [runId, card] of cards) { const run = runs.get(runId); tickRunCard(card, run); if (run) syncLane(card, run); }
|
|
316
|
+
renderMinis();
|
|
317
|
+
}, TICK_MS);
|
|
318
|
+
}
|
|
165
319
|
if (!needs && ticker) { clearInterval(ticker); ticker = null; }
|
|
166
320
|
}
|
|
167
321
|
|
|
322
|
+
/** Every change to a run, whatever its source, reaches the panel (its transcript card follows). */
|
|
323
|
+
function changed(run) {
|
|
324
|
+
if (!run) return;
|
|
325
|
+
try { hooks.onRunChange?.(run); } catch { /* the panel is gone */ }
|
|
326
|
+
}
|
|
327
|
+
|
|
168
328
|
function upsertRun(run) {
|
|
169
329
|
const descriptor = runFromPayload(run) || run;
|
|
170
330
|
if (!belongs(descriptor)) return null;
|
|
171
331
|
const merged = mergeRunDescriptor(runs.get(descriptor.runId), descriptor);
|
|
172
332
|
runs.set(descriptor.runId, merged);
|
|
333
|
+
if (isTerminalRunStatus(merged.status)) activities.delete(merged.runId); // the run is over: so is what it was doing
|
|
173
334
|
render();
|
|
335
|
+
changed(merged);
|
|
174
336
|
return merged;
|
|
175
337
|
}
|
|
176
338
|
|
|
@@ -180,6 +342,7 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
180
342
|
for (const runId of Array.isArray(runIds) ? runIds : [runIds]) {
|
|
181
343
|
if (!runId) continue;
|
|
182
344
|
removed.add(runId);
|
|
345
|
+
activities.delete(runId);
|
|
183
346
|
if (runs.delete(runId)) changed = true;
|
|
184
347
|
}
|
|
185
348
|
if (changed) render();
|
|
@@ -192,6 +355,7 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
192
355
|
const next = { ...current, ...patch, updatedAt: new Date().toISOString() };
|
|
193
356
|
runs.set(runId, next);
|
|
194
357
|
render();
|
|
358
|
+
changed(next);
|
|
195
359
|
return next;
|
|
196
360
|
}
|
|
197
361
|
|
|
@@ -220,14 +384,23 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
220
384
|
listed.add(id);
|
|
221
385
|
return true;
|
|
222
386
|
});
|
|
223
|
-
|
|
387
|
+
const merged = [];
|
|
388
|
+
for (const run of list) {
|
|
389
|
+
const d = runFromPayload(run) || run;
|
|
390
|
+
if (!belongs(d)) continue;
|
|
391
|
+
const next = mergeRunDescriptor(runs.get(d.runId), d);
|
|
392
|
+
runs.set(d.runId, next);
|
|
393
|
+
if (isTerminalRunStatus(next.status)) activities.delete(d.runId);
|
|
394
|
+
merged.push(next);
|
|
395
|
+
}
|
|
224
396
|
// When the terminal page was complete, previously known terminal runs
|
|
225
397
|
// absent from it were removed elsewhere. A run arriving during refresh
|
|
226
398
|
// must never be pruned by this older snapshot.
|
|
227
399
|
if (terminal.length < 100) {
|
|
228
|
-
for (const runId of knownTerminal) if (!listed.has(runId)) { runs.delete(runId); removed.add(runId); }
|
|
400
|
+
for (const runId of knownTerminal) if (!listed.has(runId)) { runs.delete(runId); removed.add(runId); activities.delete(runId); }
|
|
229
401
|
}
|
|
230
402
|
render();
|
|
403
|
+
for (const run of merged) changed(run);
|
|
231
404
|
} catch { /* offline or not built yet */ }
|
|
232
405
|
}
|
|
233
406
|
|
|
@@ -239,7 +412,15 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
239
412
|
|
|
240
413
|
toggle.addEventListener('click', () => setOpen(!open));
|
|
241
414
|
showAllBtn.addEventListener('click', () => { showAll = !showAll; hooks.onShowAllChange?.(showAll); refresh().finally(render); });
|
|
242
|
-
stopAllBtn.addEventListener('click', () =>
|
|
415
|
+
stopAllBtn.addEventListener('click', () => {
|
|
416
|
+
if (stopAllBtn.hidden || destroyed) return;
|
|
417
|
+
if (stopAllGate.press() === 'confirmed') hooks.onStopAll?.();
|
|
418
|
+
});
|
|
419
|
+
stopAllBtn.addEventListener('keydown', (e) => {
|
|
420
|
+
// A held Enter repeats its click: only the first press of a key counts.
|
|
421
|
+
if (e.repeat && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); return; }
|
|
422
|
+
if (e.key === 'Escape' && stopAllGate.reset()) { e.preventDefault(); e.stopPropagation(); }
|
|
423
|
+
});
|
|
243
424
|
clearBtn.addEventListener('click', () => {
|
|
244
425
|
const ids = [...runs.values()].filter(isRemovableRun).map(r => r.runId);
|
|
245
426
|
if (ids.length) hooks.onClearFinished?.(ids);
|
|
@@ -269,13 +450,16 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
269
450
|
}));
|
|
270
451
|
|
|
271
452
|
render();
|
|
272
|
-
|
|
453
|
+
// The first fetch: what a reload knows about this session's runs (the panel restores their cards from it).
|
|
454
|
+
const ready = Promise.resolve(refresh());
|
|
273
455
|
|
|
274
456
|
return {
|
|
275
457
|
el: root,
|
|
458
|
+
ready,
|
|
276
459
|
upsertRun,
|
|
277
460
|
patchRun,
|
|
278
461
|
patchUsageRun,
|
|
462
|
+
setRunActivity,
|
|
279
463
|
dropRuns,
|
|
280
464
|
getRun: (runId) => runs.get(runId) || null,
|
|
281
465
|
getRuns: () => sortRuns([...runs.values()]),
|
|
@@ -289,6 +473,8 @@ export function createAgentsDock(hostEl, hooks = {}) {
|
|
|
289
473
|
destroy() {
|
|
290
474
|
destroyed = true;
|
|
291
475
|
if (ticker) clearInterval(ticker);
|
|
476
|
+
stopAllGate.destroy();
|
|
477
|
+
activities.clear();
|
|
292
478
|
unsubs.forEach(off => { try { off(); } catch { /* ignore */ } });
|
|
293
479
|
root.remove();
|
|
294
480
|
},
|
|
@@ -123,9 +123,12 @@ export async function fetchProjects() {
|
|
|
123
123
|
|
|
124
124
|
// ── Sessions ─────────────────────────────────
|
|
125
125
|
|
|
126
|
-
/**
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
/**
|
|
127
|
+
* `fallback`: a model disabled in Assistant → Models starts on its enabled stand-in (session.fallback says which) instead of a 400.
|
|
128
|
+
* `draft`: the server keeps it in memory, out of every list, until its first prompt stores it; closed or left unused, it is gone.
|
|
129
|
+
*/
|
|
130
|
+
export function createAssistantSession({ brain, label, fallback = false, draft = false } = {}) {
|
|
131
|
+
return jsonFetch('/api/assistant/sessions', jsonBody({ brain, label, fallback: fallback === true || undefined, draft: draft === true || undefined }));
|
|
129
132
|
}
|
|
130
133
|
|
|
131
134
|
export async function listAssistantSessions() {
|
|
@@ -149,6 +152,11 @@ export function closeAssistantSession(id) {
|
|
|
149
152
|
return jsonFetch(`/api/assistant/sessions/${enc(id)}/close`, jsonBody({}));
|
|
150
153
|
}
|
|
151
154
|
|
|
155
|
+
/** Remove for good (Sessions menu): its running turn and workers stop, then the record and transcript go → { removed, stoppedRuns }. */
|
|
156
|
+
export function removeAssistantSession(id) {
|
|
157
|
+
return jsonFetch(`/api/assistant/sessions/${enc(id)}`, { method: 'DELETE' });
|
|
158
|
+
}
|
|
159
|
+
|
|
152
160
|
// ── Attachments ──────────────────────────────
|
|
153
161
|
|
|
154
162
|
/**
|