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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { cxpText, cxpSessionLabel } from './cdx-copy.js';
|
|
1
2
|
import { mountCodexSettings } from './cdx-settings.js';
|
|
2
3
|
import { t } from '../i18n.js';
|
|
3
4
|
import { getCliState, isCliInstalling } from '../cli-status.js';
|
|
@@ -15,6 +16,7 @@ import '../account-i18n.js';
|
|
|
15
16
|
import { restoreMcpAppCards, teardownMcpApps, retireMcpAppNode, stripMcpAppRuntime } from './cdx-mcp-app-host.js';
|
|
16
17
|
import { renderTurnDiff, completeTurnOutputs } from './cdx-render.js';
|
|
17
18
|
import { hydrateOutputControls } from './cdx-output.js';
|
|
19
|
+
import { sanitizeStoredHtml } from '../assistant/asst-sanitize.js';
|
|
18
20
|
import {
|
|
19
21
|
beginPlanTurn, capturePlanItem, finishPlanTurn, getPlanMarkdown, syncPlanMirrors, recordPlanTurn,
|
|
20
22
|
migrateLegacyPlan, recoverPlanFromHistory, planBelongsToTab, useMessageAsPlan,
|
|
@@ -30,6 +32,7 @@ import {
|
|
|
30
32
|
} from '../agent-runtime-options.js';
|
|
31
33
|
import { CodexModelCatalog, codexModelAccountKey, codexContextAvailability } from './cdx-model-catalog.js';
|
|
32
34
|
import { nativeLoopWindowId } from '../ui-native-window-id.js';
|
|
35
|
+
import { skillHintEntries, skillsForPrompt, skillsListRequest } from './cdx-skill-hints.js';
|
|
33
36
|
import { syncSidepanelLayout, focusSidepanel, isHostedSessionFocused } from '../ui-sidepanel-windows.js';
|
|
34
37
|
import { notify, NOTIF_TYPE } from '../ui-notifications.js';
|
|
35
38
|
import { createStickyScrollController } from '../ui-scroll-follow.js';
|
|
@@ -297,7 +300,6 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
297
300
|
userVerification: true,
|
|
298
301
|
windowId: windowId,
|
|
299
302
|
accountId: _accountId || 'default',
|
|
300
|
-
mcpProfile: tab.mcpProfile || null,
|
|
301
303
|
...codexRuntimeSelection(tab),
|
|
302
304
|
});
|
|
303
305
|
} else {
|
|
@@ -309,7 +311,6 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
309
311
|
threadId: _threadId || null,
|
|
310
312
|
cwd: _project || null,
|
|
311
313
|
accountId: _accountId || 'default',
|
|
312
|
-
mcpProfile: tab.mcpProfile || null,
|
|
313
314
|
...codexRuntimeSelection(tab),
|
|
314
315
|
});
|
|
315
316
|
}
|
|
@@ -368,7 +369,6 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
368
369
|
_accountId = msg.accountId;
|
|
369
370
|
if (_boundTab) _boundTab.accountId = _accountId;
|
|
370
371
|
}
|
|
371
|
-
if (msg.mcpProfile && _boundTab) _boundTab.mcpProfile = msg.mcpProfile;
|
|
372
372
|
// A reattached app-server can still have a different process-active
|
|
373
373
|
// thread. Preserve the tab's displayed thread instead of adopting it.
|
|
374
374
|
_threadId = _threadId || msg.threadId || null;
|
|
@@ -378,6 +378,9 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
378
378
|
if (_boundTab) _boundTab.running = true;
|
|
379
379
|
setStatus('Resuming…', 'working');
|
|
380
380
|
resetStallTimer();
|
|
381
|
+
// The turn it found is still at work: so is the tab's pill (the panel may be hidden, the tab in the background).
|
|
382
|
+
updateTrayPillRunning();
|
|
383
|
+
renderPills();
|
|
381
384
|
} else if (msg.running === false && (!msg.threadId || String(msg.threadId) === String(_threadId || ''))) {
|
|
382
385
|
// A plan can finish while disconnected. The server's idle reply
|
|
383
386
|
// releases the stale running/query state before history recovery.
|
|
@@ -391,7 +394,6 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
391
394
|
threadId: _threadId || null,
|
|
392
395
|
cwd: _project || null,
|
|
393
396
|
accountId: _accountId || 'default',
|
|
394
|
-
mcpProfile: tab.mcpProfile || null,
|
|
395
397
|
...codexRuntimeSelection(tab),
|
|
396
398
|
});
|
|
397
399
|
} else {
|
|
@@ -404,7 +406,6 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
404
406
|
threadId: _threadId || null,
|
|
405
407
|
cwd: _project || null,
|
|
406
408
|
accountId: _accountId || 'default',
|
|
407
|
-
mcpProfile: tab.mcpProfile || null,
|
|
408
409
|
...codexRuntimeSelection(tab),
|
|
409
410
|
});
|
|
410
411
|
}
|
|
@@ -422,10 +423,6 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
422
423
|
restoreMcpAppCards(_messagesEl, { tab: _boundTab, items: _items, request: requestSocketPayloadForTab, draft: setMcpAppDraft });
|
|
423
424
|
if (_boundTab) _boundTab.bootstrapped = true;
|
|
424
425
|
ensureCodexTerminalAuth(tab);
|
|
425
|
-
if (msg.mcpProfile && _boundTab) {
|
|
426
|
-
_boundTab.mcpProfile = msg.mcpProfile;
|
|
427
|
-
if (activeTab() === _boundTab) _onActiveTabChanged?.(_boundTab);
|
|
428
|
-
}
|
|
429
426
|
if (Object.prototype.hasOwnProperty.call(msg, 'threadId')) {
|
|
430
427
|
_threadId = msg.threadId || null;
|
|
431
428
|
if (_boundTab) _boundTab.threadId = _threadId;
|
|
@@ -589,20 +586,17 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
589
586
|
},
|
|
590
587
|
|
|
591
588
|
onInterruptAck(msg) {
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
_boundTab.running = false;
|
|
596
|
-
_boundTab.activeTurnId = null;
|
|
597
|
-
if (_boundTab._abortRetry) {
|
|
598
|
-
clearTimeout(_boundTab._abortRetry);
|
|
599
|
-
_boundTab._abortRetry = null;
|
|
600
|
-
}
|
|
589
|
+
if (_boundTab?._abortRetry) {
|
|
590
|
+
clearTimeout(_boundTab._abortRetry);
|
|
591
|
+
_boundTab._abortRetry = null;
|
|
601
592
|
}
|
|
602
593
|
clearInterruptTimer();
|
|
603
|
-
|
|
594
|
+
// A prompt sent after the Stop has a turn of its own: the ack is not about it.
|
|
595
|
+
if (!interruptAckEndsTurn(_boundTab)) return;
|
|
596
|
+
// The stopped turn is over: the tab, its pill and the saved tabs say so (setRunning), even
|
|
597
|
+
// when something marked it working again before the ack came back.
|
|
598
|
+
setRunning(false);
|
|
604
599
|
setStatus('Interrupted', 'muted');
|
|
605
|
-
syncInputEnabled();
|
|
606
600
|
syncSessionControls();
|
|
607
601
|
releaseInactiveIdleTab(_boundTab);
|
|
608
602
|
},
|
|
@@ -693,11 +687,6 @@ function buildWsCallbacks(tab, options = {}) {
|
|
|
693
687
|
}
|
|
694
688
|
renderStatusChrome();
|
|
695
689
|
}
|
|
696
|
-
if (msg.type === 'mcp_profile_changed' && msg.profile) {
|
|
697
|
-
if (_boundTab) _boundTab.mcpProfile = msg.profile;
|
|
698
|
-
if (activeTab() === _boundTab) _onActiveTabChanged?.(_boundTab);
|
|
699
|
-
saveTabs();
|
|
700
|
-
}
|
|
701
690
|
if (msg.type === 'mcp_approval_updated' && msg.name) {
|
|
702
691
|
const server = _mcpServers.get(msg.name);
|
|
703
692
|
if (server) {
|
|
@@ -847,6 +836,9 @@ let _interruptRetried = false;
|
|
|
847
836
|
let _prevInputTokens = 0;
|
|
848
837
|
let _skillsCache = null;
|
|
849
838
|
let _skillsPromise = null;
|
|
839
|
+
// A skills:changed arrived since the list was last read: the next skills_list asks the app-server to reload its skills
|
|
840
|
+
// (cdx-skill-hints.js skillsListRequest).
|
|
841
|
+
let _skillsChanged = false;
|
|
850
842
|
let _blockingServerRequests = new Map();
|
|
851
843
|
let _bufferedSocketMessages = [];
|
|
852
844
|
|
|
@@ -959,6 +951,7 @@ function rememberBlockingServerRequest(requestId, method, params = {}) {
|
|
|
959
951
|
if (_boundTab) _boundTab.blockingServerRequests = _blockingServerRequests;
|
|
960
952
|
syncWorkStatus();
|
|
961
953
|
syncInputEnabled();
|
|
954
|
+
updateTrayPillRunning(); // the pill needs you
|
|
962
955
|
saveTabs();
|
|
963
956
|
}
|
|
964
957
|
|
|
@@ -968,6 +961,7 @@ function clearBlockingServerRequest(requestId, { flushBuffered = true } = {}) {
|
|
|
968
961
|
if (_boundTab) _boundTab.blockingServerRequests = _blockingServerRequests;
|
|
969
962
|
syncWorkStatus();
|
|
970
963
|
syncInputEnabled();
|
|
964
|
+
updateTrayPillRunning();
|
|
971
965
|
saveTabs();
|
|
972
966
|
if (flushBuffered && !hasBlockingServerRequests()) flushBufferedSocketMessages();
|
|
973
967
|
releaseInactiveIdleTab(_boundTab);
|
|
@@ -985,6 +979,7 @@ function clearAllBlockingServerRequests() {
|
|
|
985
979
|
}
|
|
986
980
|
syncWorkStatus();
|
|
987
981
|
syncInputEnabled();
|
|
982
|
+
updateTrayPillRunning();
|
|
988
983
|
}
|
|
989
984
|
|
|
990
985
|
function shouldBufferSocketMessage(kind, payload) {
|
|
@@ -1064,6 +1059,11 @@ function applySocketError(msg) {
|
|
|
1064
1059
|
|
|
1065
1060
|
function applySocketClosed() {
|
|
1066
1061
|
appendSystem('Codex session closed', 'muted');
|
|
1062
|
+
// The app-server ran the turn: it exited, the turn went with it (the server forgot it too).
|
|
1063
|
+
if (_running) {
|
|
1064
|
+
setRunning(false);
|
|
1065
|
+
setStatus('Codex session closed', 'muted');
|
|
1066
|
+
}
|
|
1067
1067
|
}
|
|
1068
1068
|
|
|
1069
1069
|
function applyBufferedSocketMessage(entry) {
|
|
@@ -1459,7 +1459,7 @@ let _hljs = null;
|
|
|
1459
1459
|
|
|
1460
1460
|
(async () => {
|
|
1461
1461
|
try {
|
|
1462
|
-
const mod = await import('
|
|
1462
|
+
const mod = await import('/vendor/marked/marked-14.1.4.esm.js').catch(() => null);
|
|
1463
1463
|
if (mod) {
|
|
1464
1464
|
_marked = mod.marked || mod.default;
|
|
1465
1465
|
if (_marked?.setOptions) _marked.setOptions({ breaks: true, gfm: true });
|
|
@@ -1471,10 +1471,10 @@ let _hljs = null;
|
|
|
1471
1471
|
try {
|
|
1472
1472
|
const link = document.createElement('link');
|
|
1473
1473
|
link.rel = 'stylesheet';
|
|
1474
|
-
link.href = '
|
|
1474
|
+
link.href = '/vendor/highlight/github-dark-dimmed-11.12.0.min.css';
|
|
1475
1475
|
document.head.appendChild(link);
|
|
1476
1476
|
const script = document.createElement('script');
|
|
1477
|
-
script.src = '
|
|
1477
|
+
script.src = '/vendor/highlight/highlight-11.12.0.min.js';
|
|
1478
1478
|
script.onload = () => { _hljs = window.hljs || null; };
|
|
1479
1479
|
document.head.appendChild(script);
|
|
1480
1480
|
} catch {}
|
|
@@ -1852,14 +1852,19 @@ async function restoreCanonicalPlan(tab, thread) {
|
|
|
1852
1852
|
}
|
|
1853
1853
|
|
|
1854
1854
|
// ── Formatting & helpers (lines 1148-1421) ──
|
|
1855
|
+
function codexStatusText(status) {
|
|
1856
|
+
const known = {"pending": "pending", "completed": "completed", "complete": "complete", "inProgress": "in progress", "failed": "failed", "declined": "declined"};
|
|
1857
|
+
return Object.hasOwn(known, status) ? cxpText(`status_${status}`, known[status]) : status;
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1855
1860
|
export function formatStatus(status) {
|
|
1856
|
-
if (!status) return 'pending';
|
|
1857
|
-
if (typeof status === 'string') return status;
|
|
1861
|
+
if (!status) return codexStatusText('pending');
|
|
1862
|
+
if (typeof status === 'string') return codexStatusText(status);
|
|
1858
1863
|
if (typeof status === 'object') {
|
|
1859
1864
|
const [key, val] = Object.entries(status)[0] || [];
|
|
1860
|
-
if (!key) return 'pending';
|
|
1861
|
-
if (val && typeof val === 'object' && val.message) return `${key}: ${val.message}`;
|
|
1862
|
-
return key;
|
|
1865
|
+
if (!key) return codexStatusText('pending');
|
|
1866
|
+
if (val && typeof val === 'object' && val.message) return `${codexStatusText(key)}: ${val.message}`;
|
|
1867
|
+
return codexStatusText(key);
|
|
1863
1868
|
}
|
|
1864
1869
|
return String(status);
|
|
1865
1870
|
}
|
|
@@ -2417,14 +2422,26 @@ export function restoreActiveBinding(fallbackState) {
|
|
|
2417
2422
|
else restoreBoundState(fallbackState);
|
|
2418
2423
|
}
|
|
2419
2424
|
|
|
2425
|
+
// How many withTab calls are under way. The outermost one hands the binding back to the active tab; a
|
|
2426
|
+
// nested one hands it back to the tab the call around it bound, with what that call had done so far
|
|
2427
|
+
// written to it first. (The history of a tab in the background renders while another tab is shown, and
|
|
2428
|
+
// a nested withTab in it used to leave the rest of that history to the shown tab: its held approvals
|
|
2429
|
+
// were looked up there and never came back.)
|
|
2430
|
+
let _withTabDepth = 0;
|
|
2431
|
+
|
|
2420
2432
|
export function withTab(tab, fn) {
|
|
2421
2433
|
const prev = snapshotBoundState();
|
|
2434
|
+
const outer = _withTabDepth > 0 ? _boundTab : null;
|
|
2435
|
+
if (outer) commitBoundState();
|
|
2436
|
+
_withTabDepth += 1;
|
|
2422
2437
|
bindTabState(tab);
|
|
2423
2438
|
try {
|
|
2424
2439
|
return fn();
|
|
2425
2440
|
} finally {
|
|
2426
2441
|
commitBoundState();
|
|
2427
|
-
|
|
2442
|
+
_withTabDepth -= 1;
|
|
2443
|
+
if (outer) bindTabState(outer);
|
|
2444
|
+
else restoreActiveBinding(prev);
|
|
2428
2445
|
}
|
|
2429
2446
|
}
|
|
2430
2447
|
|
|
@@ -2436,10 +2453,10 @@ export function setSessionLabel(label, { persist = true } = {}) {
|
|
|
2436
2453
|
}
|
|
2437
2454
|
if (isActiveTab(_boundTab)) {
|
|
2438
2455
|
const labelEl = panelEl('#cxp-session-label');
|
|
2439
|
-
if (labelEl) labelEl.replaceChildren(document.createTextNode(_sessionLabel));
|
|
2456
|
+
if (labelEl) labelEl.replaceChildren(document.createTextNode(cxpSessionLabel(_sessionLabel)));
|
|
2440
2457
|
// The whole name, for when the header shows only part of it.
|
|
2441
2458
|
const sessionBtn = panelEl('#cxp-session-btn');
|
|
2442
|
-
if (sessionBtn) sessionBtn.title = _sessionLabel;
|
|
2459
|
+
if (sessionBtn) sessionBtn.title = cxpSessionLabel(_sessionLabel);
|
|
2443
2460
|
syncLegacyState();
|
|
2444
2461
|
}
|
|
2445
2462
|
updateTrayPillLabel();
|
|
@@ -2487,6 +2504,11 @@ function scheduleCodexTitleReassert(tab) {
|
|
|
2487
2504
|
|
|
2488
2505
|
function applyCodexProviderTitle(title) {
|
|
2489
2506
|
const tab = _boundTab;
|
|
2507
|
+
// Dispatch metadata owns the panel label; reading history must never rename the provider thread.
|
|
2508
|
+
if (tab?.automationRunId) {
|
|
2509
|
+
setSessionLabel(tab.automationTitle || tab.sessionLabel);
|
|
2510
|
+
return;
|
|
2511
|
+
}
|
|
2490
2512
|
const incoming = normalizeSessionLabel(title || '');
|
|
2491
2513
|
const desiredTitle = normalizeSessionLabel(tab?.pendingSessionLabel || tab?.sessionLabel || '');
|
|
2492
2514
|
const authoritative = tab
|
|
@@ -2676,12 +2698,16 @@ function createTrayPill(tab) {
|
|
|
2676
2698
|
export function renderPills() {
|
|
2677
2699
|
const active = activeTab();
|
|
2678
2700
|
for (const tab of _tabs) {
|
|
2679
|
-
if (!tab.pillEl?.isConnected)
|
|
2701
|
+
if (!tab.pillEl?.isConnected) {
|
|
2702
|
+
tab.pillEl = createTrayPill(tab);
|
|
2703
|
+
// The bound tab's own reference too, or its running state would go on reaching the old node.
|
|
2704
|
+
if (tab === _boundTab) _trayPill = tab.pillEl;
|
|
2705
|
+
}
|
|
2680
2706
|
if (!tab.pillEl) continue;
|
|
2681
2707
|
// Read directly from tab to avoid nested withTab clobbering uncommitted state
|
|
2682
2708
|
const label = tab.pillEl.querySelector('.term-minimized-pill-label');
|
|
2683
2709
|
if (label) label.textContent = tab.sessionLabel || 'New session';
|
|
2684
|
-
tab.pillEl
|
|
2710
|
+
paintTrayPill(tab.pillEl, tab);
|
|
2685
2711
|
const shouldShow = hasMeaningfulTrayState(tab) && (!_getVisible() || tab !== active);
|
|
2686
2712
|
tab.pillEl.style.display = shouldShow ? '' : 'none';
|
|
2687
2713
|
}
|
|
@@ -2763,7 +2789,6 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
|
|
|
2763
2789
|
const inheritedAccountId = saved.accountId ?? activeTab()?.accountId ?? 'default';
|
|
2764
2790
|
const inheritedEffort = saved.effort ?? activeTab()?.effort ?? (storage.getItem(STOR.effort) || 'off');
|
|
2765
2791
|
const inheritedAutoAccept = codexNewTabAutoAccept(saved, activeTab(), storedAutoAccept());
|
|
2766
|
-
const inheritedMcpProfile = saved.mcpProfile ?? null;
|
|
2767
2792
|
const automationRunId = saved.automationRunId || null;
|
|
2768
2793
|
const inheritedPlanMode = automationRunId ? false : (saved.planMode ?? activeTab()?.planMode ?? false);
|
|
2769
2794
|
const hasExplicitTitle = !!title && !['new session', 'saved session', 'untitled session', 'codex'].includes(title.toLowerCase());
|
|
@@ -2791,7 +2816,6 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
|
|
|
2791
2816
|
extendedContextVerificationArmed: false,
|
|
2792
2817
|
effort: inheritedEffort,
|
|
2793
2818
|
autoAccept: inheritedAutoAccept,
|
|
2794
|
-
mcpProfile: inheritedMcpProfile,
|
|
2795
2819
|
planMode: inheritedPlanMode,
|
|
2796
2820
|
sessionListRequest: null,
|
|
2797
2821
|
threadStartRequest: null,
|
|
@@ -2873,7 +2897,9 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
|
|
|
2873
2897
|
isolationRejections: {},
|
|
2874
2898
|
ownedThreadIds: new Set(),
|
|
2875
2899
|
automationRunId,
|
|
2900
|
+
automationTitle: automationRunId ? (saved.automationTitle || title || '') : '',
|
|
2876
2901
|
automationActive: !!saved.automationActive,
|
|
2902
|
+
automationAwaits: false, // the run's turn ended asking the user (runAwaitsAnswer, set by its attach): the pill needs you
|
|
2877
2903
|
automationOwnerId: saved.automationOwnerId || null,
|
|
2878
2904
|
releasedRunId: automationRunId ? null : (saved.releasedRunId || null),
|
|
2879
2905
|
};
|
|
@@ -3013,7 +3039,6 @@ export function saveTabs() {
|
|
|
3013
3039
|
contextMode: normalizeCodexContextMode(tab.contextMode),
|
|
3014
3040
|
effort: tab.effort || 'off',
|
|
3015
3041
|
autoAccept: !!tab.autoAccept,
|
|
3016
|
-
mcpProfile: tab.mcpProfile || null,
|
|
3017
3042
|
planMode: !!tab.planMode,
|
|
3018
3043
|
planFilePath: tab.planFilePath || '',
|
|
3019
3044
|
planContent: tab.planContent || '',
|
|
@@ -3036,9 +3061,17 @@ export function saveTabs() {
|
|
|
3036
3061
|
postCompactionPending: tab.postCompactionPromptSource === 'manual' && !!tab.postCompactionPending,
|
|
3037
3062
|
postCompactionPromptSource: tab.postCompactionPromptSource === 'manual' ? 'manual' : '',
|
|
3038
3063
|
automationRunId: tab.automationRunId || null,
|
|
3064
|
+
automationTitle: tab.automationTitle || '',
|
|
3039
3065
|
automationActive: !!tab.automationActive,
|
|
3040
3066
|
automationOwnerId: tab.automationOwnerId || null,
|
|
3041
3067
|
releasedRunId: tab.releasedRunId || null,
|
|
3068
|
+
// Whether it was working when this was written: after a reload its placeholder pill says so and
|
|
3069
|
+
// the panel boots to ask (ui-sidepanel-tray.js), and the tab reattaches at once (restoreTabs).
|
|
3070
|
+
// Never restored as running: only the reattach's answer says that. `needsYou`: an approval or a
|
|
3071
|
+
// question card waited on the user; the reattach replays the request the bridge still holds.
|
|
3072
|
+
running: !!tab.running,
|
|
3073
|
+
startingThread: !!tab.startingThread,
|
|
3074
|
+
needsYou: tab.blockingServerRequests?.size > 0 || !!tab.automationAwaits,
|
|
3042
3075
|
};
|
|
3043
3076
|
});
|
|
3044
3077
|
const localRunIds = new Set(localTabs.map((tab) => tab.automationRunId).filter(Boolean));
|
|
@@ -3125,9 +3158,11 @@ export function restoreTabs() {
|
|
|
3125
3158
|
if (raw) {
|
|
3126
3159
|
const data = JSON.parse(raw);
|
|
3127
3160
|
if (Array.isArray(data?.tabs) && data.tabs.length) {
|
|
3161
|
+
const wereWorking = [];
|
|
3128
3162
|
for (const saved of data.tabs) {
|
|
3129
3163
|
if (saved.automationActive && saved.automationOwnerId !== nativeLoopWindowId) continue;
|
|
3130
|
-
createTab(saved, { autoSwitch: false });
|
|
3164
|
+
const tab = createTab(saved, { autoSwitch: false });
|
|
3165
|
+
if (tab && !tab.automationRunId && (saved.running || saved.startingThread || saved.needsYou)) wereWorking.push(tab);
|
|
3131
3166
|
}
|
|
3132
3167
|
if (!_tabs.length) throw new Error('No restorable Codex tabs');
|
|
3133
3168
|
_activeTabIdx = Math.min(Math.max(Number(data.activeIdx) || 0, 0), _tabs.length - 1);
|
|
@@ -3135,6 +3170,11 @@ export function restoreTabs() {
|
|
|
3135
3170
|
if (!_tabs.length) throw new Error('No restorable Codex tabs');
|
|
3136
3171
|
updateActiveTabView();
|
|
3137
3172
|
saveTabs();
|
|
3173
|
+
// A tab that was working when the page went away asks after its turn now, hidden or in the
|
|
3174
|
+
// background (a restored tab reattaches first: its turn outlives the page on the server), so
|
|
3175
|
+
// its pill says what the thread does. An idle one is let go again once it is ready
|
|
3176
|
+
// (releaseInactiveIdleTab); idle tabs stay unconnected until they are shown.
|
|
3177
|
+
for (const tab of wereWorking) if (_tabs.includes(tab) && !tab.ws) connectTab(tab);
|
|
3138
3178
|
return;
|
|
3139
3179
|
}
|
|
3140
3180
|
}
|
|
@@ -3158,8 +3198,47 @@ export function updateTrayPillLabel() {
|
|
|
3158
3198
|
if (label) label.textContent = _sessionLabel;
|
|
3159
3199
|
}
|
|
3160
3200
|
|
|
3201
|
+
/**
|
|
3202
|
+
* What a tab's tray pill says: it needs you while an approval or a question card waits on your answer
|
|
3203
|
+
* (its blocking server requests), or, for a dispatched worker, while its turn ended asking you something
|
|
3204
|
+
* (the run's outcome: automationAwaits), else it works while a turn runs or a thread is being made.
|
|
3205
|
+
* sidepanel-session-status.js reads the same classes for a detached window's pill.
|
|
3206
|
+
*/
|
|
3207
|
+
function paintTrayPill(pill, { running, startingThread, blockingServerRequests, automationAwaits }) {
|
|
3208
|
+
if (!pill) return;
|
|
3209
|
+
const needsYou = blockingServerRequests?.size > 0 || !!automationAwaits;
|
|
3210
|
+
pill.classList.toggle('cxp-pill-attention', needsYou);
|
|
3211
|
+
pill.classList.toggle('cxp-pill-running', !needsYou && !!(running || startingThread));
|
|
3212
|
+
}
|
|
3213
|
+
|
|
3161
3214
|
export function updateTrayPillRunning() {
|
|
3162
|
-
_trayPill
|
|
3215
|
+
paintTrayPill(_trayPill, {
|
|
3216
|
+
running: _running, startingThread: _startingThread, blockingServerRequests: _blockingServerRequests, automationAwaits: _boundTab?.automationAwaits,
|
|
3217
|
+
});
|
|
3218
|
+
}
|
|
3219
|
+
|
|
3220
|
+
/**
|
|
3221
|
+
* The bound tab's work ended (or began) outside setRunning: the tab, its pill and the saved tabs say
|
|
3222
|
+
* so now. The tab is written first: renderPills and saveTabs read it, never the bound copy, and a
|
|
3223
|
+
* nested withTab binds the tab again from it (withTab itself writes it back only when it returns).
|
|
3224
|
+
*/
|
|
3225
|
+
function publishWorkState() {
|
|
3226
|
+
if (_boundTab) {
|
|
3227
|
+
_boundTab.running = _running;
|
|
3228
|
+
_boundTab.startingThread = _startingThread;
|
|
3229
|
+
}
|
|
3230
|
+
updateTrayPillRunning();
|
|
3231
|
+
renderPills();
|
|
3232
|
+
saveTabs();
|
|
3233
|
+
}
|
|
3234
|
+
|
|
3235
|
+
/**
|
|
3236
|
+
* Whether a Stop's ack ends the tab's running state: not once a prompt was sent after that Stop
|
|
3237
|
+
* (dispatchPrompt counts them, interruptTab notes the count it stopped at), whose turn is its own.
|
|
3238
|
+
*/
|
|
3239
|
+
function interruptAckEndsTurn(tab) {
|
|
3240
|
+
if (!tab || tab.interruptedAtPrompt == null) return true;
|
|
3241
|
+
return (tab.promptCount || 0) === tab.interruptedAtPrompt;
|
|
3163
3242
|
}
|
|
3164
3243
|
|
|
3165
3244
|
|
|
@@ -3258,6 +3337,7 @@ export function clearTranscript(emptyText = freshThreadText()) {
|
|
|
3258
3337
|
showEmpty(emptyText);
|
|
3259
3338
|
setCompactingUI(false);
|
|
3260
3339
|
renderStatusChrome();
|
|
3340
|
+
updateTrayPillRunning(); // (its request cards went with the transcript)
|
|
3261
3341
|
}
|
|
3262
3342
|
|
|
3263
3343
|
export function renderStoredTranscript(snapshot, emptyText = freshThreadText()) {
|
|
@@ -3267,7 +3347,10 @@ export function renderStoredTranscript(snapshot, emptyText = freshThreadText())
|
|
|
3267
3347
|
|
|
3268
3348
|
clearTranscript(emptyText);
|
|
3269
3349
|
_messagesEl.querySelectorAll(':scope > .cxp-empty').forEach(node => node.remove());
|
|
3270
|
-
|
|
3350
|
+
// A snapshot is the transcript's own markup, saved and read back from storage, and a build before the panel
|
|
3351
|
+
// sanitised its Markdown saved model HTML in it as it was: it is rebuilt from the stored-transcript allowlist
|
|
3352
|
+
// (asst-sanitize.js, the sanitiser live output goes through) before it reaches the page.
|
|
3353
|
+
_messagesEl.append(sanitizeStoredHtml(normalized.html));
|
|
3271
3354
|
const acceptedItemIds = new Set(normalized.acceptedItemIds);
|
|
3272
3355
|
const acceptedTurnIds = new Set(normalized.acceptedTurnIds);
|
|
3273
3356
|
const restoredNodes = [..._messagesEl.children].filter((node) => (
|
|
@@ -3365,6 +3448,11 @@ export function resetThreadState({ tone = 'ready', preserveStatus = false } = {}
|
|
|
3365
3448
|
_running = false;
|
|
3366
3449
|
_startingThread = false;
|
|
3367
3450
|
if (_boundTab) {
|
|
3451
|
+
// On the tab at once: clearPlanHandoffState below binds the tab again (updatePostPlanTranscriptMeta's
|
|
3452
|
+
// withTab), which read its old running state back over these and saved the reset tab as working.
|
|
3453
|
+
_boundTab.running = false;
|
|
3454
|
+
_boundTab.startingThread = false;
|
|
3455
|
+
_boundTab.activeTurnId = null;
|
|
3368
3456
|
_boundTab.ownedThreadIds = new Set();
|
|
3369
3457
|
_boundTab.expectedThreadId = null;
|
|
3370
3458
|
_boundTab.expectedThreadRequestId = null;
|
|
@@ -3385,8 +3473,7 @@ export function resetThreadState({ tone = 'ready', preserveStatus = false } = {}
|
|
|
3385
3473
|
clearTranscript();
|
|
3386
3474
|
syncInputEnabled();
|
|
3387
3475
|
syncSessionControls();
|
|
3388
|
-
|
|
3389
|
-
saveTabs();
|
|
3476
|
+
publishWorkState();
|
|
3390
3477
|
}
|
|
3391
3478
|
|
|
3392
3479
|
export function setActiveProject(projectPath, { reset = true, preserveStatus = false, tone = 'ready' } = {}) {
|
|
@@ -3433,7 +3520,7 @@ export function setThread(thread) {
|
|
|
3433
3520
|
_freshThread = false;
|
|
3434
3521
|
// History and a new thread carry the provider's name or, without one, the
|
|
3435
3522
|
// first prompt. A name the user gave stays, and is sent to the provider again.
|
|
3436
|
-
if (_boundTab?.titleByUser && hasCustomSessionLabel(_boundTab)) {
|
|
3523
|
+
if (_boundTab?.automationRunId || (_boundTab?.titleByUser && hasCustomSessionLabel(_boundTab))) {
|
|
3437
3524
|
applyCodexProviderTitle(getThreadLabel(thread, _sessionLabel || 'New session'));
|
|
3438
3525
|
} else {
|
|
3439
3526
|
setSessionLabel(getThreadLabel(thread, 'New session'));
|
|
@@ -3577,12 +3664,12 @@ async function startNewThread(tab = activeTab()) {
|
|
|
3577
3664
|
} finally {
|
|
3578
3665
|
if (!tab.closed) withTab(tab, () => {
|
|
3579
3666
|
_startingThread = false;
|
|
3667
|
+
// The tab first, then what reads it (the pill, the saved tabs, the toolbar): renderPills
|
|
3668
|
+
// used to find it still starting and put the running class back on the pill.
|
|
3669
|
+
publishWorkState();
|
|
3580
3670
|
syncInputEnabled();
|
|
3581
3671
|
syncToolbarState();
|
|
3582
3672
|
syncSessionControls();
|
|
3583
|
-
updateTrayPillRunning();
|
|
3584
|
-
renderPills();
|
|
3585
|
-
saveTabs();
|
|
3586
3673
|
releaseInactiveIdleTab(tab);
|
|
3587
3674
|
});
|
|
3588
3675
|
}
|
|
@@ -4438,7 +4525,7 @@ export function promptNameNewSession() {
|
|
|
4438
4525
|
<div class="cxp-name-modal-row">
|
|
4439
4526
|
<label class="cxp-name-modal-label">Project</label>
|
|
4440
4527
|
<select class="cxp-name-modal-select" data-role="project">
|
|
4441
|
-
${projectOptions.map(p => `<option value="${
|
|
4528
|
+
${projectOptions.map(p => `<option value="${esc(p.value)}">${esc(p.label)}</option>`).join('')}
|
|
4442
4529
|
</select>
|
|
4443
4530
|
</div>
|
|
4444
4531
|
<div class="cxp-name-modal-row">
|
|
@@ -4476,7 +4563,8 @@ export function promptNameNewSession() {
|
|
|
4476
4563
|
branchSel.innerHTML = '<option value="">(none)</option>';
|
|
4477
4564
|
branchSel.disabled = true;
|
|
4478
4565
|
} else {
|
|
4479
|
-
|
|
4566
|
+
// A branch name is the repository's (an agent can make one): text, never markup.
|
|
4567
|
+
branchSel.innerHTML = branches.map(b => `<option value="${esc(b)}">${esc(b)}</option>`).join('');
|
|
4480
4568
|
if (branchOriginal) branchSel.value = branchOriginal;
|
|
4481
4569
|
branchSel.disabled = false;
|
|
4482
4570
|
}
|
|
@@ -5052,6 +5140,10 @@ export function dispatchPrompt(prompt, { tab = activeTab(), images = null, paths
|
|
|
5052
5140
|
};
|
|
5053
5141
|
if (tab?.model) msg.model = tab.model;
|
|
5054
5142
|
if (tab?.effort && tab.effort !== 'off') msg.effort = tab.effort;
|
|
5143
|
+
// A native skill picked from the hints (SK-050): sent as Codex's own skill input, once.
|
|
5144
|
+
const nativeSkills = skillsForPrompt(inputText, tab?.pendingSkill);
|
|
5145
|
+
if (nativeSkills.length) msg.skills = nativeSkills;
|
|
5146
|
+
if (tab) tab.pendingSkill = null;
|
|
5055
5147
|
// A person's own turn: the greeting engine keeps when they were last here. The greeting this
|
|
5056
5148
|
// tab opened with goes back once, with the first prompt of its new thread.
|
|
5057
5149
|
msg.human = true;
|
|
@@ -5078,6 +5170,8 @@ export function dispatchPrompt(prompt, { tab = activeTab(), images = null, paths
|
|
|
5078
5170
|
}
|
|
5079
5171
|
if (tab) {
|
|
5080
5172
|
tab.extendedContextVerificationArmed = normalizeCodexContextMode(tab.contextMode) === 'extended';
|
|
5173
|
+
// A Stop's late ack must not end this prompt's turn (interruptAckEndsTurn).
|
|
5174
|
+
tab.promptCount = (tab.promptCount || 0) + 1;
|
|
5081
5175
|
}
|
|
5082
5176
|
requestCodexSessionTitle(tab, inputText, {
|
|
5083
5177
|
paths: [...pathList, ...mentionList.map((mention) => mention.path).filter(Boolean)],
|
|
@@ -5417,7 +5511,8 @@ export function handleNotify(method, params) {
|
|
|
5417
5511
|
flushPostCompactionPrompt(_boundTab);
|
|
5418
5512
|
}
|
|
5419
5513
|
if (_boundTab?.providerTitleDirty) scheduleCodexTitleReassert(_boundTab);
|
|
5420
|
-
|
|
5514
|
+
// The queue of the tab whose turn this was, never the one on screen.
|
|
5515
|
+
if (!shouldHoldForPlanApproval(tab)) advanceQueue(tab);
|
|
5421
5516
|
releaseInactiveIdleTab(tab);
|
|
5422
5517
|
}
|
|
5423
5518
|
break;
|
|
@@ -5877,7 +5972,7 @@ export function syncToolbarState() {
|
|
|
5877
5972
|
effortBtn.title = `Reasoning effort: ${selected?.label || effort}`;
|
|
5878
5973
|
effortBtn.classList.toggle('active', effort !== 'off');
|
|
5879
5974
|
const label = effortBtn.querySelector('.cxp-btn-label');
|
|
5880
|
-
if (label) label.textContent = effort === 'off' ? 'Effort' : (selected?.label || effort);
|
|
5975
|
+
if (label) label.textContent = effort === 'off' ? cxpText('effortLabel', 'Effort') : cxpText(`effort_${effort}`, selected?.label || effort);
|
|
5881
5976
|
const dots = effortBtn.querySelectorAll('.cxp-effort-dots i');
|
|
5882
5977
|
const litCount = Math.max(0, options.findIndex((option) => option.id === effort));
|
|
5883
5978
|
dots.forEach((d, i) => d.classList.toggle('lit', i < litCount));
|
|
@@ -5908,7 +6003,7 @@ export function syncToolbarState() {
|
|
|
5908
6003
|
contextBtn.disabled = !!(tab?.running || tab?.startingThread || tab?.compacting)
|
|
5909
6004
|
|| (mode !== 'extended' && !supportsExtended);
|
|
5910
6005
|
const label = contextBtn.querySelector('.cxp-btn-label');
|
|
5911
|
-
if (label) label.textContent = mode === 'extended' ? 'Extended' : 'Default';
|
|
6006
|
+
if (label) label.textContent = mode === 'extended' ? cxpText('extended', 'Extended') : cxpText('default', 'Default');
|
|
5912
6007
|
if (availability.reason) {
|
|
5913
6008
|
contextBtn.title = availability.reason;
|
|
5914
6009
|
} else if (mode !== 'extended') {
|
|
@@ -6130,6 +6225,7 @@ export function interruptTab(tab = activeTab()) {
|
|
|
6130
6225
|
clearTimeout(tab._abortRetry);
|
|
6131
6226
|
tab._abortRetry = null;
|
|
6132
6227
|
}
|
|
6228
|
+
tab.interruptedAtPrompt = tab.promptCount || 0;
|
|
6133
6229
|
sendSocket({ type: 'interrupt', sessionId: tab.id, threadId });
|
|
6134
6230
|
tab._abortRetry = setTimeout(() => {
|
|
6135
6231
|
tab._abortRetry = null;
|
|
@@ -6160,6 +6256,7 @@ export function interruptAllTabs() {
|
|
|
6160
6256
|
const ws = tab.ws;
|
|
6161
6257
|
const threadId = tab.threadId || null;
|
|
6162
6258
|
if (ws && ws.readyState === 1) {
|
|
6259
|
+
tab.interruptedAtPrompt = tab.promptCount || 0;
|
|
6163
6260
|
try {
|
|
6164
6261
|
ws.send(JSON.stringify({
|
|
6165
6262
|
type: 'interrupt',
|
|
@@ -6935,6 +7032,14 @@ export function steerActiveTurn() {
|
|
|
6935
7032
|
return true;
|
|
6936
7033
|
}
|
|
6937
7034
|
|
|
7035
|
+
/**
|
|
7036
|
+
* Whether `tab` has a turn running. The bound tab's is the module's own state (the freshest: withTab
|
|
7037
|
+
* writes it back to the tab only when it returns); any other tab's is its own.
|
|
7038
|
+
*/
|
|
7039
|
+
function tabTurnRunning(tab) {
|
|
7040
|
+
return tab === _boundTab ? _running : !!tab?.running;
|
|
7041
|
+
}
|
|
7042
|
+
|
|
6938
7043
|
export function syncQueueTray() {
|
|
6939
7044
|
const tab = activeTab();
|
|
6940
7045
|
if (!tab) return;
|
|
@@ -6952,7 +7057,8 @@ export function syncQueueTray() {
|
|
|
6952
7057
|
if (hint) {
|
|
6953
7058
|
hint.textContent = count > 0
|
|
6954
7059
|
? `${count} message${count > 1 ? 's' : ''} queued${tab.queuePaused ? ' (paused)' : ''}. Enter steers. Tab queues the next turn.`
|
|
6955
|
-
|
|
7060
|
+
// The tab on screen's turn, not the bound tab's (a tab working in the background is bound while its events run).
|
|
7061
|
+
: tabTurnRunning(tab)
|
|
6956
7062
|
? 'Enter steers the active turn. Tab queues the next turn. Shift+Enter inserts a newline.'
|
|
6957
7063
|
: 'Enter sends. Shift+Enter inserts a newline.';
|
|
6958
7064
|
}
|
|
@@ -7012,7 +7118,7 @@ export function toggleQueuePause() {
|
|
|
7012
7118
|
if (!tab) return;
|
|
7013
7119
|
tab.queuePaused = !tab.queuePaused;
|
|
7014
7120
|
syncQueueTray();
|
|
7015
|
-
if (!tab.queuePaused) advanceQueue();
|
|
7121
|
+
if (!tab.queuePaused) advanceQueue(tab);
|
|
7016
7122
|
saveTabs();
|
|
7017
7123
|
}
|
|
7018
7124
|
|
|
@@ -7024,11 +7130,17 @@ export function clearQueue() {
|
|
|
7024
7130
|
saveTabs();
|
|
7025
7131
|
}
|
|
7026
7132
|
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7133
|
+
/**
|
|
7134
|
+
* Send the next prompt queued in `tab`, the tab it was typed in, on that tab's own connection and
|
|
7135
|
+
* thread: a background tab whose turn ends advances its own queue, never the one on screen (the
|
|
7136
|
+
* module state is the bound tab's, so the tab is bound first).
|
|
7137
|
+
*/
|
|
7138
|
+
export function advanceQueue(tab = activeTab()) {
|
|
7139
|
+
if (!tab || tab.closed) return false;
|
|
7140
|
+
if (_boundTab !== tab) return withTab(tab, () => advanceQueue(tab));
|
|
7141
|
+
if (_running || tab.queuePaused || !tab.queue?.length || hasBlockingServerRequests() || shouldHoldForPlanApproval(tab)) return false;
|
|
7030
7142
|
const next = tab.queue.shift();
|
|
7031
|
-
if (!next) return;
|
|
7143
|
+
if (!next) return false;
|
|
7032
7144
|
if (tab.planMode) {
|
|
7033
7145
|
preparePlanModeTurn(tab);
|
|
7034
7146
|
}
|
|
@@ -7040,13 +7152,19 @@ export function advanceQueue() {
|
|
|
7040
7152
|
mentions: next.mentions || [],
|
|
7041
7153
|
forcePlanModePrefix: tab.planMode,
|
|
7042
7154
|
});
|
|
7043
|
-
if (!sent)
|
|
7155
|
+
if (!sent) {
|
|
7156
|
+
// Not sent: it stays first in its tab's queue.
|
|
7157
|
+
tab.queue.unshift(next);
|
|
7158
|
+
syncQueueTray();
|
|
7159
|
+
return false;
|
|
7160
|
+
}
|
|
7044
7161
|
// Render queued user message immediately with images
|
|
7045
7162
|
if (queueImages?.length) {
|
|
7046
7163
|
appendLocalUserMessage(next.text || '', queueImages);
|
|
7047
7164
|
tab._pendingSendImages = queueImages;
|
|
7048
7165
|
}
|
|
7049
7166
|
syncQueueTray();
|
|
7167
|
+
return true;
|
|
7050
7168
|
}
|
|
7051
7169
|
|
|
7052
7170
|
// ── Phase 2: Image attachments ──
|
|
@@ -7101,6 +7219,15 @@ export function renderImageStrip() {
|
|
|
7101
7219
|
// ── Whiteboard "Send to Panel" — receive image via event bus ──
|
|
7102
7220
|
// Any window or surface changed a Codex account (signed in or out, a key, its mode, renamed, added,
|
|
7103
7221
|
// removed): the menu re-reads the list, and the tabs on that account re-check sign-in.
|
|
7222
|
+
// A skill was installed, removed or changed (Skills Studio, Settings, an agent): the app-server is asked to reload its
|
|
7223
|
+
// skills at once (it does not watch the folders itself), so the hints and the thread's skills are current before the
|
|
7224
|
+
// next "/" is typed.
|
|
7225
|
+
appOn('sync:skills:changed', () => {
|
|
7226
|
+
_skillsCache = null; _skillsPromise = null; _skillsChanged = true;
|
|
7227
|
+
if (!activeTab()) return;
|
|
7228
|
+
_skillsPromise = loadSlashCommands().catch(() => {}).finally(() => { _skillsPromise = null; });
|
|
7229
|
+
});
|
|
7230
|
+
|
|
7104
7231
|
appOn('sync:codex:accounts-changed', (msg = {}) => {
|
|
7105
7232
|
refreshCodexAccounts().catch(() => {});
|
|
7106
7233
|
for (const tab of _tabs) if (!msg.accountId || serverAccountId(tab.accountId) === msg.accountId) void tab.terminalAuthView?.refresh();
|
|
@@ -7377,16 +7504,12 @@ export async function loadSlashCommands() {
|
|
|
7377
7504
|
if (!tab) return commands;
|
|
7378
7505
|
const capabilities = await getCodexCapabilities(tab);
|
|
7379
7506
|
commands = codexCommandHints(capabilities);
|
|
7380
|
-
const
|
|
7507
|
+
const reload = _skillsChanged;
|
|
7508
|
+
const data = await requestSocketPayloadForTab(tab, 'skills_list', skillsListRequest(tab, reload));
|
|
7509
|
+
if (reload) _skillsChanged = false;
|
|
7381
7510
|
const seen = new Set(BUILTIN_SLASH_COMMANDS.map((entry) => entry.cmd));
|
|
7382
|
-
|
|
7383
|
-
|
|
7384
|
-
.map((skill) => ({
|
|
7385
|
-
cmd: '/' + String(skill.name || skill.dirName || '').trim(),
|
|
7386
|
-
desc: String(skill.description || '').trim(),
|
|
7387
|
-
}))
|
|
7388
|
-
.filter((skill) => skill.cmd !== '/' && !seen.has(skill.cmd))
|
|
7389
|
-
.sort((a, b) => a.cmd.localeCompare(b.cmd));
|
|
7511
|
+
// Each native skill keeps its SKILL.md path: picking it sends Codex's own skill input (cdx-skill-hints.js).
|
|
7512
|
+
const skillCommands = skillHintEntries(flattenNativeCatalog(data, 'skills'), seen);
|
|
7390
7513
|
_skillsCache = [...commands, ...skillCommands];
|
|
7391
7514
|
} catch {
|
|
7392
7515
|
_skillsCache = commands;
|
|
@@ -7449,15 +7572,19 @@ export function showSlashHints(text) {
|
|
|
7449
7572
|
descSpan.className = 'cxp-slash-hint-desc';
|
|
7450
7573
|
descSpan.textContent = c.desc;
|
|
7451
7574
|
item.append(cmdSpan, descSpan);
|
|
7452
|
-
item.
|
|
7575
|
+
item._hint = c;
|
|
7576
|
+
item.addEventListener('click', () => selectSlashHint(c.cmd, c));
|
|
7453
7577
|
hintsEl.appendChild(item);
|
|
7454
7578
|
});
|
|
7455
7579
|
}
|
|
7456
7580
|
|
|
7457
|
-
export function selectSlashHint(cmd) {
|
|
7581
|
+
export function selectSlashHint(cmd, hint = null) {
|
|
7458
7582
|
const input = panelEl('#cxp-input');
|
|
7459
7583
|
hideComposerHints();
|
|
7460
7584
|
if (!input) return;
|
|
7585
|
+
// A native skill picked here goes as Codex's own skill input with the prompt, while the prompt starts with it.
|
|
7586
|
+
const pickTab = activeTab();
|
|
7587
|
+
if (pickTab) pickTab.pendingSkill = hint?.skill ? { cmd: hint.cmd, name: hint.skill.name, path: hint.skill.path } : null;
|
|
7461
7588
|
const command = CODEX_COMMAND_BY_NAME.get(String(cmd).replace(/^\//, ''));
|
|
7462
7589
|
if (command?.name === 'model') {
|
|
7463
7590
|
panelEl('#cxp-model')?.classList.toggle('open');
|
|
@@ -7495,7 +7622,7 @@ export function confirmSlashHint() {
|
|
|
7495
7622
|
return true;
|
|
7496
7623
|
}
|
|
7497
7624
|
const cmdEl = items[_slashActiveIdx]?.querySelector('.cxp-slash-hint-cmd');
|
|
7498
|
-
if (cmdEl) selectSlashHint(cmdEl.textContent);
|
|
7625
|
+
if (cmdEl) selectSlashHint(cmdEl.textContent, items[_slashActiveIdx]._hint || null);
|
|
7499
7626
|
return true;
|
|
7500
7627
|
}
|
|
7501
7628
|
|