synabun 2.0.10 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +207 -0
- package/README.md +25 -2
- package/THIRD-PARTY-LICENSES.md +22 -0
- package/bin/synabun.js +71 -24
- package/docs/whatsapp.md +13 -13
- package/hooks/claude-code/pre-websearch.mjs +12 -1
- package/hooks/claude-code/shared.mjs +5 -0
- package/hooks/claude-code/stop.mjs +1 -1
- package/lib/claude-hooks.js +172 -18
- package/lib/client-config-repair.js +30 -17
- package/lib/desktop-app.js +7 -1
- package/lib/external-tools.js +7 -6
- package/lib/first-launch-protection.js +57 -12
- package/lib/mcp-dist.js +176 -0
- package/lib/release-npm-ci.mjs +138 -0
- package/lib/release-publish.mjs +91 -0
- package/lib/release-scan.mjs +50 -0
- package/lib/server-crash-record.js +123 -0
- package/lib/server-exit.js +318 -0
- package/lib/server-supervisor.js +508 -0
- package/lib/start-launcher.js +37 -4
- package/lib/tools-cli.js +45 -0
- package/lib/update-snapshot.js +302 -0
- package/lib/virustotal.mjs +203 -0
- package/lib/windows-crash-event.js +269 -0
- package/mcp-server/dist/http.d.ts +20 -1
- package/mcp-server/dist/http.d.ts.map +1 -1
- package/mcp-server/dist/http.js +59 -12
- package/mcp-server/dist/http.js.map +1 -1
- package/mcp-server/dist/index.d.ts +33 -27
- package/mcp-server/dist/index.d.ts.map +1 -1
- package/mcp-server/dist/index.js +128 -143
- package/mcp-server/dist/index.js.map +1 -1
- package/mcp-server/dist/preload.js +1 -1
- package/mcp-server/dist/preload.js.map +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts +1 -1
- package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
- package/mcp-server/dist/services/budget-judgments.js +5 -3
- package/mcp-server/dist/services/budget-judgments.js.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
- package/mcp-server/dist/services/codex-config-heal.js +81 -28
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
- package/mcp-server/dist/services/identity.d.ts +2 -2
- package/mcp-server/dist/services/identity.js +2 -2
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
- package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
- package/mcp-server/dist/services/memory-sessions.js +28 -2
- package/mcp-server/dist/services/memory-sessions.js.map +1 -1
- package/mcp-server/dist/services/neural-interface.d.ts +18 -11
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
- package/mcp-server/dist/services/neural-interface.js +67 -11
- package/mcp-server/dist/services/neural-interface.js.map +1 -1
- package/mcp-server/dist/services/server-instructions.d.ts +7 -2
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
- package/mcp-server/dist/services/server-instructions.js +22 -63
- package/mcp-server/dist/services/server-instructions.js.map +1 -1
- package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
- package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-catalog.js +339 -0
- package/mcp-server/dist/services/tool-catalog.js.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
- package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
- package/mcp-server/dist/services/tool-list.d.ts +108 -0
- package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-list.js +334 -0
- package/mcp-server/dist/services/tool-list.js.map +1 -0
- package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
- package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
- package/mcp-server/dist/services/tool-runtime.js +400 -0
- package/mcp-server/dist/services/tool-runtime.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +1 -1
- package/mcp-server/dist/services/typesafe-config.js.map +1 -1
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
- package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
- package/mcp-server/dist/tools/agents.d.ts +14 -14
- package/mcp-server/dist/tools/agents.d.ts.map +1 -1
- package/mcp-server/dist/tools/agents.js +29 -19
- package/mcp-server/dist/tools/agents.js.map +1 -1
- package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
- package/mcp-server/dist/tools/choice.d.ts +6 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -1
- package/mcp-server/dist/tools/choice.js +18 -13
- package/mcp-server/dist/tools/choice.js.map +1 -1
- package/mcp-server/dist/tools/git-tools.js +2 -2
- package/mcp-server/dist/tools/git-tools.js.map +1 -1
- package/mcp-server/dist/tools/image-tools.d.ts +1 -1
- package/mcp-server/dist/tools/image-tools.js +1 -1
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
- package/mcp-server/dist/tools/morelogin.js +9 -6
- package/mcp-server/dist/tools/morelogin.js.map +1 -1
- package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
- package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill-tools.js +642 -0
- package/mcp-server/dist/tools/skill-tools.js.map +1 -0
- package/mcp-server/dist/tools/skill.d.ts +7 -0
- package/mcp-server/dist/tools/skill.d.ts.map +1 -0
- package/mcp-server/dist/tools/skill.js +11 -0
- package/mcp-server/dist/tools/skill.js.map +1 -0
- package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
- package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/tool-groups.js +147 -0
- package/mcp-server/dist/tools/tool-groups.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-format.js +7 -4
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
- package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
- package/mcp-server/package-lock.json +2 -2
- package/mcp-server/package.json +1 -1
- package/mcp-server/src/http.ts +75 -12
- package/mcp-server/src/index.ts +147 -154
- package/mcp-server/src/preload.ts +12 -12
- package/mcp-server/src/services/budget-judgments.ts +5 -3
- package/mcp-server/src/services/codex-config-heal.ts +80 -29
- package/mcp-server/src/services/identity.ts +2 -2
- package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
- package/mcp-server/src/services/memory-sessions.ts +24 -3
- package/mcp-server/src/services/neural-interface.ts +81 -21
- package/mcp-server/src/services/server-instructions.ts +29 -64
- package/mcp-server/src/services/tool-catalog.ts +403 -0
- package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
- package/mcp-server/src/services/tool-list.ts +410 -0
- package/mcp-server/src/services/tool-runtime.ts +457 -0
- package/mcp-server/src/services/typesafe-config.ts +1 -1
- package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
- package/mcp-server/src/tools/agents.ts +29 -20
- package/mcp-server/src/tools/choice.ts +17 -12
- package/mcp-server/src/tools/git-tools.ts +2 -2
- package/mcp-server/src/tools/image-tools.ts +1 -1
- package/mcp-server/src/tools/morelogin.ts +6 -4
- package/mcp-server/src/tools/skill-tools.ts +592 -0
- package/mcp-server/src/tools/skill.ts +13 -0
- package/mcp-server/src/tools/tool-groups.ts +164 -0
- package/mcp-server/src/tools/whiteboard-format.ts +9 -3
- package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
- package/neural-interface/i18n/en.json +3953 -228
- package/neural-interface/i18n/pt-BR.json +3901 -179
- package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
- package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
- package/neural-interface/lib/antigravity/acp-connection.js +299 -0
- package/neural-interface/lib/antigravity/bypass.js +100 -0
- package/neural-interface/lib/antigravity/catalog.js +273 -0
- package/neural-interface/lib/antigravity/home.js +260 -0
- package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
- package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
- package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
- package/neural-interface/lib/antigravity/policy.js +74 -0
- package/neural-interface/lib/antigravity/tool-call.js +178 -0
- package/neural-interface/lib/antigravity/transcripts.js +252 -0
- package/neural-interface/lib/antigravity/usage.js +43 -0
- package/neural-interface/lib/assistant-api.js +128 -28
- package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
- package/neural-interface/lib/assistant-brains/claude.js +4 -3
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
- package/neural-interface/lib/assistant-brains/codex.js +9 -5
- package/neural-interface/lib/assistant-brains/opencode.js +120 -54
- package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
- package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
- package/neural-interface/lib/assistant-budget-planner.js +7 -3
- package/neural-interface/lib/assistant-budget-split.js +42 -15
- package/neural-interface/lib/assistant-catalog.js +81 -15
- package/neural-interface/lib/assistant-config.js +6 -3
- package/neural-interface/lib/assistant-dispatch.js +1073 -200
- package/neural-interface/lib/assistant-envelope.js +156 -2
- package/neural-interface/lib/assistant-evidence.js +80 -0
- package/neural-interface/lib/assistant-hidden-models.js +7 -5
- package/neural-interface/lib/assistant-persona.js +93 -19
- package/neural-interface/lib/assistant-plan-permissions.js +25 -9
- package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
- package/neural-interface/lib/assistant-route-gate.js +6 -4
- package/neural-interface/lib/assistant-router.js +245 -38
- package/neural-interface/lib/assistant-runtime.js +214 -30
- package/neural-interface/lib/assistant-task-prompt.js +87 -21
- package/neural-interface/lib/assistant-tools.js +51 -0
- package/neural-interface/lib/assistant-usage.js +29 -0
- package/neural-interface/lib/backup-service.js +626 -4
- package/neural-interface/lib/backup-zip-reader.js +10 -5
- package/neural-interface/lib/backup-zip-writer.js +257 -0
- package/neural-interface/lib/browser-execution.js +10 -2
- package/neural-interface/lib/browser-guard-cdp.js +84 -0
- package/neural-interface/lib/browser-network-guard.js +476 -0
- package/neural-interface/lib/browser-policy-roots.js +64 -0
- package/neural-interface/lib/browser-tool-policy.js +198 -38
- package/neural-interface/lib/claude-agent-bridge.js +11 -2
- package/neural-interface/lib/claude-history-cache.js +210 -0
- package/neural-interface/lib/claude-hooks-status.js +103 -0
- package/neural-interface/lib/claude-model-catalog.js +5 -1
- package/neural-interface/lib/claude-temporary.js +5 -11
- package/neural-interface/lib/cli-install-api.js +1 -1
- package/neural-interface/lib/cli-install.js +163 -154
- package/neural-interface/lib/cli-resolver.js +13 -3
- package/neural-interface/lib/cli-update-planner.js +52 -41
- package/neural-interface/lib/cloudflared/tunnel.js +42 -2
- package/neural-interface/lib/codex-mcp-approvals.js +11 -0
- package/neural-interface/lib/codex-rollout-reader.js +52 -0
- package/neural-interface/lib/codex-worker-app-server.js +191 -0
- package/neural-interface/lib/confined-fs.js +30 -3
- package/neural-interface/lib/crash-notice-api.js +98 -0
- package/neural-interface/lib/editor-completion-opencode.js +68 -68
- package/neural-interface/lib/editor-git-api.js +3 -20
- package/neural-interface/lib/exec-loop-command.js +13 -10
- package/neural-interface/lib/file-explorer-api.js +74 -40
- package/neural-interface/lib/file-explorer-watch.js +9 -3
- package/neural-interface/lib/git-bash/install.js +52 -6
- package/neural-interface/lib/git-bash/manager.js +59 -17
- package/neural-interface/lib/git-bash/pins.js +12 -0
- package/neural-interface/lib/git-read.js +2 -2
- package/neural-interface/lib/git-status-runner.js +390 -0
- package/neural-interface/lib/git-status-watchdog.js +40 -0
- package/neural-interface/lib/greeting/budgets.js +1 -0
- package/neural-interface/lib/greeting/engine.js +2 -2
- package/neural-interface/lib/greeting/sources.js +10 -12
- package/neural-interface/lib/greeting/writer.js +1 -1
- package/neural-interface/lib/http-guards.js +8 -2
- package/neural-interface/lib/install-details.js +4 -1
- package/neural-interface/lib/mcp-agent-servers.js +67 -0
- package/neural-interface/lib/mcp-client-config.js +35 -33
- package/neural-interface/lib/mcp-external-servers.js +332 -0
- package/neural-interface/lib/mcp-installer.js +2 -1
- package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
- package/neural-interface/lib/memory-session-capture.js +17 -3
- package/neural-interface/lib/morelogin.js +177 -25
- package/neural-interface/lib/native-loop-providers.js +965 -66
- package/neural-interface/lib/native-loop-runtime.js +290 -42
- package/neural-interface/lib/opencode-config.js +557 -0
- package/neural-interface/lib/opencode-db-schema.js +17 -34
- package/neural-interface/lib/opencode-history.js +48 -218
- package/neural-interface/lib/opencode-mcp-ready.js +108 -0
- package/neural-interface/lib/opencode-native-boundary.js +53 -0
- package/neural-interface/lib/opencode-protocol.js +249 -112
- package/neural-interface/lib/opencode-runtime-config.js +32 -22
- package/neural-interface/lib/opencode-serve-records.js +39 -21
- package/neural-interface/lib/opencode-v2-client.js +48 -153
- package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
- package/neural-interface/lib/opencode-worker-data.js +27 -0
- package/neural-interface/lib/opencode2-client.js +73 -37
- package/neural-interface/lib/opencode2-proxy.js +23 -63
- package/neural-interface/lib/opencode2-translate.js +51 -2
- package/neural-interface/lib/owner-authority.js +249 -0
- package/neural-interface/lib/page-session.js +275 -0
- package/neural-interface/lib/path-confine.js +12 -9
- package/neural-interface/lib/peer-identity.js +793 -0
- package/neural-interface/lib/pty-host/core.js +28 -1
- package/neural-interface/lib/pty-host/lifetime.js +12 -0
- package/neural-interface/lib/pty-host/manager.js +12 -1
- package/neural-interface/lib/remote-policy.js +1 -1
- package/neural-interface/lib/request-gate.js +20 -2
- package/neural-interface/lib/rulesets/api.js +7 -6
- package/neural-interface/lib/rulesets/fs-safe.js +1 -1
- package/neural-interface/lib/rulesets/installer.js +180 -36
- package/neural-interface/lib/rulesets/json-edit.js +1 -1
- package/neural-interface/lib/rulesets/render.js +1 -1
- package/neural-interface/lib/session-cache-builder.js +81 -31
- package/neural-interface/lib/session-title-generator.js +58 -36
- package/neural-interface/lib/skills/api-v2.js +495 -0
- package/neural-interface/lib/skills/bundle.js +418 -0
- package/neural-interface/lib/skills/catalog.js +298 -0
- package/neural-interface/lib/skills/creation-api.js +191 -0
- package/neural-interface/lib/skills/creation-brief.js +247 -0
- package/neural-interface/lib/skills/creation-sources.js +285 -0
- package/neural-interface/lib/skills/creation.js +843 -0
- package/neural-interface/lib/skills/deploy.js +569 -0
- package/neural-interface/lib/skills/digest.js +119 -0
- package/neural-interface/lib/skills/discover.js +111 -0
- package/neural-interface/lib/skills/draft-confinement.js +216 -0
- package/neural-interface/lib/skills/eval-confinement.js +399 -0
- package/neural-interface/lib/skills/eval-sandbox.js +280 -0
- package/neural-interface/lib/skills/eval-trace.js +135 -0
- package/neural-interface/lib/skills/evals-api.js +212 -0
- package/neural-interface/lib/skills/evals.js +1573 -0
- package/neural-interface/lib/skills/export.js +203 -0
- package/neural-interface/lib/skills/frontmatter.js +64 -0
- package/neural-interface/lib/skills/health.js +75 -0
- package/neural-interface/lib/skills/json-edit.js +165 -0
- package/neural-interface/lib/skills/known-bridge-digests.json +441 -0
- package/neural-interface/lib/skills/known-bridges.js +96 -0
- package/neural-interface/lib/skills/library.js +823 -0
- package/neural-interface/lib/skills/local-store.js +21 -0
- package/neural-interface/lib/skills/migration.js +433 -0
- package/neural-interface/lib/skills/operations.js +45 -0
- package/neural-interface/lib/skills/ownership.js +427 -0
- package/neural-interface/lib/skills/packages.js +88 -0
- package/neural-interface/lib/skills/reviews.js +212 -0
- package/neural-interface/lib/skills/revision.js +80 -0
- package/neural-interface/lib/skills/roots.js +269 -0
- package/neural-interface/lib/skills/runtime-checks.js +358 -0
- package/neural-interface/lib/skills/scan-assets.js +252 -0
- package/neural-interface/lib/skills/scan-context.js +26 -0
- package/neural-interface/lib/skills/scan-shell.js +324 -0
- package/neural-interface/lib/skills/scan.js +364 -0
- package/neural-interface/lib/skills/scanners.js +54 -0
- package/neural-interface/lib/skills/service.js +530 -0
- package/neural-interface/lib/skills/telemetry.js +119 -0
- package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
- package/neural-interface/lib/synabun-version.js +1 -1
- package/neural-interface/lib/system-activity.js +1 -1
- package/neural-interface/lib/tool-lists.js +124 -0
- package/neural-interface/lib/whatsapp/brain.js +7 -3
- package/neural-interface/lib/whatsapp/bridge.js +6 -3
- package/neural-interface/lib/whatsapp/cards.js +22 -9
- package/neural-interface/lib/whatsapp/config.js +1 -1
- package/neural-interface/lib/worker-confinement.js +1268 -0
- package/neural-interface/lib/worker-guard-setting.js +56 -0
- package/neural-interface/lib/worker-mcp-channel.js +175 -0
- package/neural-interface/lib/worker-question.js +74 -0
- package/neural-interface/lib/worker-relay-ports.js +227 -0
- package/neural-interface/lib/worker-resume.js +238 -0
- package/neural-interface/lib/worker-sandbox.js +329 -0
- package/neural-interface/package-lock.json +34 -12
- package/neural-interface/package.json +3 -2
- package/neural-interface/public/index.html +3 -1
- package/neural-interface/public/index2d.html +19 -11
- package/neural-interface/public/onboarding.html +3 -3
- package/neural-interface/public/shared/account-menu.js +8 -5
- package/neural-interface/public/shared/agent-runtime-options.js +125 -31
- package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
- package/neural-interface/public/shared/agy/agy-client.js +266 -0
- package/neural-interface/public/shared/agy/agy-commands.js +120 -0
- package/neural-interface/public/shared/agy/agy-copy.js +326 -0
- package/neural-interface/public/shared/agy/agy-diff.js +161 -0
- package/neural-interface/public/shared/agy/agy-events.js +469 -0
- package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
- package/neural-interface/public/shared/agy/agy-options.js +232 -0
- package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
- package/neural-interface/public/shared/agy/agy-render.js +392 -0
- package/neural-interface/public/shared/agy/agy-setup.js +149 -0
- package/neural-interface/public/shared/agy/agy-styles.js +604 -0
- package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
- package/neural-interface/public/shared/api.js +1527 -1336
- package/neural-interface/public/shared/app-frame.js +192 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +36 -6
- package/neural-interface/public/shared/assistant/asst-api.js +1 -1
- package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
- package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
- package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +105 -44
- package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
- package/neural-interface/public/shared/assistant/asst-control.js +205 -26
- package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
- package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
- package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
- package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -0
- package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
- package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
- package/neural-interface/public/shared/assistant/asst-panel.js +151 -19
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
- package/neural-interface/public/shared/assistant/asst-render.js +445 -82
- package/neural-interface/public/shared/assistant/asst-route.js +304 -53
- package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
- package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
- package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
- package/neural-interface/public/shared/assistant/asst-state.js +87 -24
- package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
- package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
- package/neural-interface/public/shared/automation-context.js +5 -2
- package/neural-interface/public/shared/cc-dropdown.js +89 -19
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
- package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
- package/neural-interface/public/shared/cdx/cdx-output.js +34 -10
- package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
- package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
- package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
- package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
- package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
- package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
- package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
- package/neural-interface/public/shared/cli-install-controller.js +218 -0
- package/neural-interface/public/shared/cli-install-view.js +11 -12
- package/neural-interface/public/shared/cli-status.js +11 -10
- package/neural-interface/public/shared/constants.js +5 -4
- package/neural-interface/public/shared/context-menu-areas.js +34 -0
- package/neural-interface/public/shared/context-menu-logic.js +243 -0
- package/neural-interface/public/shared/context-menu-model.js +367 -0
- package/neural-interface/public/shared/context-menu.js +372 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
- package/neural-interface/public/shared/cp/cp-restore.js +162 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
- package/neural-interface/public/shared/crash-notice-view.js +168 -0
- package/neural-interface/public/shared/desktop-bridge.js +17 -0
- package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
- package/neural-interface/public/shared/desktop-titlebar.js +13 -4
- package/neural-interface/public/shared/desktop-update-view.js +21 -0
- package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
- package/neural-interface/public/shared/explorer/fx-api.js +4 -4
- package/neural-interface/public/shared/explorer/fx-links.js +3 -3
- package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
- package/neural-interface/public/shared/explorer/fx-main.js +48 -16
- package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
- package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
- package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
- package/neural-interface/public/shared/html-shell.js +30 -15
- package/neural-interface/public/shared/i18n.js +2 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
- package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +74 -259
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -21
- package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +60 -50
- package/neural-interface/public/shared/page-session.js +96 -0
- package/neural-interface/public/shared/provider-icons.js +4 -2
- package/neural-interface/public/shared/registry.js +5 -3
- package/neural-interface/public/shared/retired-2d.js +3 -0
- package/neural-interface/public/shared/schedules-view.js +195 -61
- package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
- package/neural-interface/public/shared/settings/settings-data.js +3 -1
- package/neural-interface/public/shared/settings/settings-ia.js +6 -6
- package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
- package/neural-interface/public/shared/settings/settings-rules.js +2 -2
- package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
- package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
- package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
- package/neural-interface/public/shared/showcase-privacy.js +6 -1
- package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
- package/neural-interface/public/shared/skills/ss-args.js +96 -0
- package/neural-interface/public/shared/skills/ss-creation.js +222 -0
- package/neural-interface/public/shared/skills/ss-dialog.js +133 -0
- package/neural-interface/public/shared/skills/ss-doc.js +173 -0
- package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
- package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
- package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
- package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
- package/neural-interface/public/shared/skills/ss-evals.js +417 -0
- package/neural-interface/public/shared/skills/ss-form.js +159 -0
- package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
- package/neural-interface/public/shared/skills/ss-ids.js +32 -0
- package/neural-interface/public/shared/skills/ss-lint.js +149 -0
- package/neural-interface/public/shared/skills/ss-presets.js +117 -0
- package/neural-interface/public/shared/skills/ss-profiles.js +513 -0
- package/neural-interface/public/shared/skills/ss-resources.js +165 -0
- package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
- package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
- package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
- package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
- package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
- package/neural-interface/public/shared/skills/studio/sx-create-ai.js +237 -0
- package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
- package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
- package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
- package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
- package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
- package/neural-interface/public/shared/skills/studio/sx-dom.js +230 -0
- package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
- package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
- package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
- package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
- package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
- package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
- package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
- package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
- package/neural-interface/public/shared/skills/studio/sx-install-flow.js +282 -0
- package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
- package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
- package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
- package/neural-interface/public/shared/skills/studio/sx-main.js +690 -0
- package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
- package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
- package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
- package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
- package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
- package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
- package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
- package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
- package/neural-interface/public/shared/skills/studio/sx-subject.js +249 -0
- package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
- package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
- package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
- package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +426 -0
- package/neural-interface/public/shared/state.js +1 -1
- package/neural-interface/public/shared/streaming-markdown.js +58 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
- package/neural-interface/public/shared/styles.css +1822 -1756
- package/neural-interface/public/shared/synabun-mascot.js +1115 -9
- package/neural-interface/public/shared/text-cache.js +29 -0
- package/neural-interface/public/shared/tool-list-picker.js +55 -0
- package/neural-interface/public/shared/tool-list-storage.js +24 -0
- package/neural-interface/public/shared/tool-list-view.js +112 -0
- package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
- package/neural-interface/public/shared/tour/tour-actor.js +268 -0
- package/neural-interface/public/shared/tour/tour-beats.js +336 -0
- package/neural-interface/public/shared/tour/tour-engine.js +884 -0
- package/neural-interface/public/shared/tour/tour-ink.js +390 -0
- package/neural-interface/public/shared/tour/tour-stage.js +440 -0
- package/neural-interface/public/shared/tour/tour-state.js +40 -0
- package/neural-interface/public/shared/tour/tour-tips.js +99 -0
- package/neural-interface/public/shared/tour/tour.css +144 -0
- package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
- package/neural-interface/public/shared/ui-assistant.js +2 -0
- package/neural-interface/public/shared/ui-automation-studio.js +111 -140
- package/neural-interface/public/shared/ui-claude-panel.js +376 -82
- package/neural-interface/public/shared/ui-cli-banner.js +23 -167
- package/neural-interface/public/shared/ui-command-runner.js +6 -3
- package/neural-interface/public/shared/ui-context-menu.js +295 -0
- package/neural-interface/public/shared/ui-cost-widget.js +57 -59
- package/neural-interface/public/shared/ui-crash-notice.js +187 -0
- package/neural-interface/public/shared/ui-detail.js +15 -3
- package/neural-interface/public/shared/ui-file-explorer.js +48 -6
- package/neural-interface/public/shared/ui-file-links.js +2 -2
- package/neural-interface/public/shared/ui-games.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +50 -47
- package/neural-interface/public/shared/ui-judgments.js +1 -1
- package/neural-interface/public/shared/ui-keybinds.js +33 -2
- package/neural-interface/public/shared/ui-link.js +3 -3
- package/neural-interface/public/shared/ui-menubar.js +10 -20
- package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
- package/neural-interface/public/shared/ui-navbar.js +49 -24
- package/neural-interface/public/shared/ui-notifications.js +1 -0
- package/neural-interface/public/shared/ui-panels.js +96 -65
- package/neural-interface/public/shared/ui-resume.js +9 -7
- package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
- package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
- package/neural-interface/public/shared/ui-sessions.js +27 -15
- package/neural-interface/public/shared/ui-settings.js +683 -526
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
- package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
- package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
- package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
- package/neural-interface/public/shared/ui-skills.js +33 -2830
- package/neural-interface/public/shared/ui-styleguide.js +5 -2
- package/neural-interface/public/shared/ui-sync.js +15 -5
- package/neural-interface/public/shared/ui-terminal.js +270 -190
- package/neural-interface/public/shared/ui-tool-updates.js +6 -4
- package/neural-interface/public/shared/ui-tooltip.js +81 -51
- package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
- package/neural-interface/public/shared/ui-trash.js +6 -4
- package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
- package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
- package/neural-interface/public/shared/ui-tutorial.css +47 -100
- package/neural-interface/public/shared/ui-tutorial.js +285 -509
- package/neural-interface/public/shared/ui-update.js +38 -2
- package/neural-interface/public/shared/ui-whiteboard.js +312 -59
- package/neural-interface/public/shared/ui-worker-end.js +5 -1
- package/neural-interface/public/shared/ui-workspaces.js +3 -2
- package/neural-interface/public/shared/view-variant.js +66 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +3 -3
- package/neural-interface/public/shared/whiteboard-list.js +172 -0
- package/neural-interface/public/shared/worker-end.js +10 -3
- package/neural-interface/public/shared/worker-questions.js +34 -0
- package/neural-interface/public/shared/worker-restart.js +12 -0
- package/neural-interface/public/sidepanel-session.html +2 -2
- package/neural-interface/public/variant/2d/background.js +2 -1
- package/neural-interface/public/variant/2d/context-menu.js +8 -2
- package/neural-interface/public/variant/2d/graph.js +42 -20
- package/neural-interface/public/variant/2d/hulls.js +14 -9
- package/neural-interface/public/variant/2d/lasso.js +11 -7
- package/neural-interface/public/variant/2d/main.js +32 -1
- package/neural-interface/public/variant/2d/minimap.js +11 -13
- package/neural-interface/public/variant/3d/main.js +69 -6
- package/neural-interface/public/variant/3d/map-controls.js +24 -9
- package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
- package/neural-interface/public/vendor/caveat/caveat.css +17 -0
- package/neural-interface/public/vendor/caveat/manifest.json +12 -0
- package/neural-interface/public/vendor/yaml/LICENSE +13 -0
- package/neural-interface/public/vendor/yaml/manifest.json +4 -0
- package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
- package/neural-interface/scripts/build-vendor.mjs +32 -0
- package/neural-interface/server.js +4553 -2855
- package/neural-interface/templates/rulesets/README.md +1 -1
- package/neural-interface/templates/rulesets/core.md +1 -1
- package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
- package/neural-interface/templates/rulesets/manifest.json +8 -8
- package/npm-shrinkwrap.json +34 -12
- package/package.json +17 -3
- package/postinstall.js +9 -4
- package/preuninstall.js +1 -1
- package/setup.js +97 -322
- package/skills/skill-forge/SKILL.md +177 -0
- package/skills/skill-forge/evals/evals.json +54 -0
- package/skills/skill-forge/references/package.md +105 -0
- package/skills/skill-forge/references/review-and-recovery.md +63 -0
- package/skills/skill-forge/references/runtime-profiles.md +20 -0
- package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
- package/skills/synabun/SKILL.md +10 -7
- package/skills/synabun/modules/audit.md +1 -5
- package/skills/synabun/modules/changelog.md +1 -5
- package/skills/synabun/modules/idea.md +1 -1
- package/skills/synabun/modules/memorize.md +6 -9
- package/skills/synabun/modules/schedule.md +6 -6
- package/mcp-server/dist/services/profiles.d.ts +0 -120
- package/mcp-server/dist/services/profiles.d.ts.map +0 -1
- package/mcp-server/dist/services/profiles.js +0 -387
- package/mcp-server/dist/services/profiles.js.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
- package/mcp-server/dist/tools/leonardo.d.ts +0 -13
- package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
- package/mcp-server/dist/tools/leonardo.js +0 -21
- package/mcp-server/dist/tools/leonardo.js.map +0 -1
- package/mcp-server/dist/tools/profile.d.ts +0 -17
- package/mcp-server/dist/tools/profile.d.ts.map +0 -1
- package/mcp-server/dist/tools/profile.js +0 -114
- package/mcp-server/dist/tools/profile.js.map +0 -1
- package/mcp-server/src/services/profiles.ts +0 -428
- package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
- package/mcp-server/src/tools/leonardo.ts +0 -30
- package/mcp-server/src/tools/profile.ts +0 -122
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
- package/neural-interface/lib/mcp-profile-servers.js +0 -120
- package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
- package/skills/leonardo/SKILL.md +0 -168
- package/skills/leonardo/icon.svg +0 -1
- package/skills/leonardo/modules/browser-guide.md +0 -378
- package/skills/leonardo/modules/image-prompter.md +0 -283
- package/skills/leonardo/modules/model-advisor.md +0 -100
- package/skills/leonardo/modules/prompt-library.md +0 -110
- package/skills/leonardo/modules/style-guide.md +0 -186
- package/skills/leonardo/modules/video-prompter.md +0 -317
- /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
|
@@ -208,6 +208,7 @@ export function normalizeSynaBunChoiceElicitation(params = {}) {
|
|
|
208
208
|
if (options.length < 2) return null;
|
|
209
209
|
return {
|
|
210
210
|
id,
|
|
211
|
+
multiSelect: question.multiSelect === true,
|
|
211
212
|
header: String(question?.header || id),
|
|
212
213
|
question: String(question?.question || ''),
|
|
213
214
|
options,
|
|
@@ -226,16 +227,16 @@ export function buildSynaBunChoiceContent(questions = [], answers = {}) {
|
|
|
226
227
|
const content = {};
|
|
227
228
|
for (const question of questions) {
|
|
228
229
|
const id = question?.id;
|
|
229
|
-
const
|
|
230
|
-
if (!id || !
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
content[
|
|
230
|
+
const selected = id ? answers[id]?.answers || [] : [];
|
|
231
|
+
if (!id || !selected.length) continue;
|
|
232
|
+
const values = selected.map((answer) => {
|
|
233
|
+
const option = (question.options || []).find((candidate) => candidate.label === answer);
|
|
234
|
+
if (option) return option.value || option.label;
|
|
235
|
+
const meta = question._synabunMcp || {};
|
|
236
|
+
content[meta.otherField || `${id}__other`] = answer;
|
|
237
|
+
return meta.otherValue || SYNABUN_OTHER_VALUE;
|
|
238
|
+
});
|
|
239
|
+
content[id] = question.multiSelect ? values : values[0];
|
|
239
240
|
}
|
|
240
241
|
return content;
|
|
241
242
|
}
|
|
@@ -252,7 +253,34 @@ export function codexMcpElicitationMeta(params = {}) {
|
|
|
252
253
|
}
|
|
253
254
|
|
|
254
255
|
export function isCodexMcpToolApproval(params = {}) {
|
|
255
|
-
return
|
|
256
|
+
return params?.mode !== 'openai/userVerification'
|
|
257
|
+
&& params?.mode !== 'url'
|
|
258
|
+
&& codexMcpElicitationMeta(params).codex_approval_kind === 'mcp_tool_call';
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** Native Codex approvals need not include tool_name (codex-rs/core/src/mcp_tool_call.rs). */
|
|
262
|
+
export function codexMcpToolApproval(params = {}) {
|
|
263
|
+
if (!isCodexMcpToolApproval(params)) return null;
|
|
264
|
+
const meta = codexMcpElicitationMeta(params);
|
|
265
|
+
const serverName = typeof params.serverName === 'string' ? params.serverName : '';
|
|
266
|
+
let toolName = [meta.tool_name, meta.toolName].find(value => typeof value === 'string' && value.trim())?.trim() || '';
|
|
267
|
+
if (!toolName && serverName && typeof params.message === 'string') {
|
|
268
|
+
// Only Codex's exact fallback template is an identity source. Human tool
|
|
269
|
+
// titles and custom prompt prose are not names suitable for a policy check.
|
|
270
|
+
const prefix = `Allow the ${serverName} MCP server to run tool "`;
|
|
271
|
+
if (params.message.startsWith(prefix) && params.message.endsWith('"?')) {
|
|
272
|
+
const name = params.message.slice(prefix.length, -2);
|
|
273
|
+
if (name && !/["\r\n]/.test(name)) toolName = name;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const qualified = /^mcp__(.+?)__(.+)$/.exec(toolName);
|
|
277
|
+
if (qualified) toolName = qualified[1] === serverName ? qualified[2] : '';
|
|
278
|
+
return {
|
|
279
|
+
serverName,
|
|
280
|
+
toolName,
|
|
281
|
+
fullName: serverName && toolName ? `mcp__${serverName}__${toolName}` : '',
|
|
282
|
+
input: meta.tool_params ?? meta.arguments ?? {},
|
|
283
|
+
};
|
|
256
284
|
}
|
|
257
285
|
|
|
258
286
|
export function normalizeCodexMcpApprovalPersistence(params = {}) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { cxpText } from './cdx-copy.js';
|
|
1
2
|
// ═══════════════════════════════════════════
|
|
2
3
|
// SynaBun — Codex Panel: Render Module
|
|
3
4
|
// Text utilities, card rendering, delta appending, and history rendering.
|
|
@@ -18,6 +19,7 @@ import { OUTPUT_LIMITS, boundedText, jsonAnswer, prettyJsonFences, readableStruc
|
|
|
18
19
|
import { renderReadableOutput, renderReadableBlock, cleanOutputBlocks, hydrateOutputControls, observeOutputBlocks, renderDiffView, restoreDiffViews } from './cdx-output.js';
|
|
19
20
|
import { fileLinkTitle, fillFileLinkCopy, isInsideRoots, parseFileLinkTarget, readFileLink } from '../file-links.js';
|
|
20
21
|
import { sanitizeHtmlString } from '../assistant/asst-sanitize.js';
|
|
22
|
+
import { createTextCache } from '../text-cache.js';
|
|
21
23
|
export { setCardExpanded } from './cdx-cards.js';
|
|
22
24
|
|
|
23
25
|
// ── Shared context (set by cdx-tabs via setRenderContext) ──
|
|
@@ -104,8 +106,9 @@ export function esc(s) {
|
|
|
104
106
|
// `<img onerror>` in a reply would run in SynaBun's origin with no click. Every
|
|
105
107
|
// Markdown sink of the panel takes md()'s output, so it goes through the
|
|
106
108
|
// allowlist sanitiser the Assistant, Claude and OpenCode panels use, here, once.
|
|
107
|
-
const _mdCache =
|
|
108
|
-
const
|
|
109
|
+
const _mdCache = createTextCache();
|
|
110
|
+
export const markdownCacheStats = () => _mdCache.stats();
|
|
111
|
+
export const clearMarkdownCache = () => _mdCache.clear();
|
|
109
112
|
let _mdRenderer = null;
|
|
110
113
|
let _mdParser;
|
|
111
114
|
function markdownFallback(text) {
|
|
@@ -129,7 +132,7 @@ export function md(text) {
|
|
|
129
132
|
_mdRenderer = renderer;
|
|
130
133
|
_mdParser = parser;
|
|
131
134
|
}
|
|
132
|
-
const key = text || '';
|
|
135
|
+
const key = String(text || '');
|
|
133
136
|
if (key.length > OUTPUT_LIMITS.input) return `<pre class="cxp-card-pre cxp-output-raw"><code>${esc(boundedText(key))}</code></pre>`;
|
|
134
137
|
const cached = _mdCache.get(key);
|
|
135
138
|
if (cached !== undefined) return cached;
|
|
@@ -143,10 +146,6 @@ export function md(text) {
|
|
|
143
146
|
// A page with no DOM to sanitise in, or a sanitiser that fails, gets escaped text: never raw HTML.
|
|
144
147
|
try { html = sanitizeHtmlString(html); }
|
|
145
148
|
catch { html = markdownFallback(key); }
|
|
146
|
-
if (_mdCache.size >= _MD_CACHE_LIMIT) {
|
|
147
|
-
const firstKey = _mdCache.keys().next().value;
|
|
148
|
-
if (firstKey !== undefined) _mdCache.delete(firstKey);
|
|
149
|
-
}
|
|
150
149
|
_mdCache.set(key, html);
|
|
151
150
|
return html;
|
|
152
151
|
}
|
|
@@ -174,7 +173,7 @@ function extractCompactAssistantSummary(text) {
|
|
|
174
173
|
.replace(/^[#>\-\*\d\.\s]+/gm, '')
|
|
175
174
|
.replace(/\s+/g, ' ')
|
|
176
175
|
.trim();
|
|
177
|
-
if (!value) return 'Working through the next step';
|
|
176
|
+
if (!value) return cxpText('working', 'Working through the next step');
|
|
178
177
|
return value;
|
|
179
178
|
}
|
|
180
179
|
|
|
@@ -620,7 +619,7 @@ function resolveFileChangeSummary(item) {
|
|
|
620
619
|
const changes = Array.isArray(item?.changes) ? item.changes.slice(0, OUTPUT_LIMITS.files) : [];
|
|
621
620
|
const lines = changes.map((change) => describeFileChange(change)).filter(Boolean);
|
|
622
621
|
if (lines.length) return lines.join('\n');
|
|
623
|
-
return 'Pending file changes';
|
|
622
|
+
return cxpText('pendingFiles', 'Pending file changes');
|
|
624
623
|
}
|
|
625
624
|
|
|
626
625
|
function collectStructuredText(value, seen = new Set()) {
|
|
@@ -808,14 +807,27 @@ export function sanitizeStoredTranscriptDom(container) {
|
|
|
808
807
|
});
|
|
809
808
|
if (!_ctx.running) container.querySelectorAll('.cxp-reasoning').forEach(card => {
|
|
810
809
|
const body = card.querySelector('.cxp-reasoning-body');
|
|
811
|
-
|
|
810
|
+
const text = body?.textContent.trim() || '';
|
|
811
|
+
if (!text || ['Waiting for reasoning summary...', 'No reasoning summary was provided.', cxpText('waitingReasoning', 'Waiting for reasoning summary...'), cxpText('noReasoning', 'No reasoning summary was provided.')].includes(text)) { card.remove(); return; }
|
|
812
|
+
const title = card.querySelector('.cxp-card-title');
|
|
813
|
+
if (title) title.textContent = cxpText('reasoning', 'Reasoning Summary');
|
|
812
814
|
const pill = card.querySelector('.cxp-status-pill');
|
|
813
|
-
if (pill
|
|
815
|
+
if (pill) pill.textContent = cxpText('status_complete', 'complete');
|
|
814
816
|
});
|
|
815
817
|
syncStatusPillTones(container);
|
|
816
818
|
cleanOutputBlocks(container);
|
|
817
819
|
// Old snapshots retain their classes; replace just their verbose diff body.
|
|
818
820
|
container.querySelectorAll('[data-item-type="fileChange"]').forEach(card => {
|
|
821
|
+
const title = card.querySelector('.cxp-card-title');
|
|
822
|
+
if (title) title.textContent = cxpText('fileChange', 'File change');
|
|
823
|
+
const pill = card.querySelector('.cxp-status-pill');
|
|
824
|
+
const completed = ['completed', cxpText('status_completed', 'completed')].includes(pill?.textContent);
|
|
825
|
+
const subtitle = card.querySelector('.cxp-card-subtitle');
|
|
826
|
+
if (subtitle) subtitle.textContent = fileChangeSubtitle({ status: completed ? 'completed' : '' });
|
|
827
|
+
if (completed && pill) pill.textContent = cxpText('status_completed', 'completed');
|
|
828
|
+
const meta = card.querySelector('.cxp-card-meta');
|
|
829
|
+
const count = meta?.textContent.match(/^(\d+) file changes?$/)?.[1];
|
|
830
|
+
if (count) meta.textContent = cxpText(Number(count) === 1 ? 'oneFileChange' : 'fileChanges', Number(count) === 1 ? '1 file change' : '{count} file changes', { count });
|
|
819
831
|
const fold = card.querySelector('.cxp-fold-diff');
|
|
820
832
|
const raw = fold?.querySelector('.cxp-card-pre-diff')?.textContent;
|
|
821
833
|
if (!raw) return;
|
|
@@ -2033,14 +2045,17 @@ function getReasoningPreviewText(state) {
|
|
|
2033
2045
|
const contentText = Array.isArray(state?.contentLines)
|
|
2034
2046
|
? state.contentLines.map((line) => String(line || '').trim()).filter(Boolean).join(' ')
|
|
2035
2047
|
: '';
|
|
2036
|
-
return _ctx.cleanPreview(summaryText || contentText || 'Working through the next step');
|
|
2048
|
+
return _ctx.cleanPreview(summaryText || contentText || cxpText('working', 'Working through the next step'));
|
|
2037
2049
|
}
|
|
2038
2050
|
|
|
2039
2051
|
function updateReasoningChrome(state, { complete = false } = {}) {
|
|
2040
2052
|
if (!state) return;
|
|
2041
|
-
if (state.summaryEl) state.summaryEl.textContent = complete && !state.summaryLines?.some(line => String(line).trim()) && !state.contentLines?.some(line => String(line).trim()) ? 'No reasoning summary was provided.' : getReasoningPreviewText(state);
|
|
2042
|
-
if (state.pillEl) state.pillEl.textContent = complete ? 'complete' : 'live';
|
|
2043
|
-
if (state.el)
|
|
2053
|
+
if (state.summaryEl) state.summaryEl.textContent = complete && !state.summaryLines?.some(line => String(line).trim()) && !state.contentLines?.some(line => String(line).trim()) ? cxpText('noReasoning', 'No reasoning summary was provided.') : getReasoningPreviewText(state);
|
|
2054
|
+
if (state.pillEl) state.pillEl.textContent = complete ? cxpText('status_complete', 'complete') : cxpText('live', 'live');
|
|
2055
|
+
if (state.el) {
|
|
2056
|
+
state.el.hidden = !state.summaryLines?.some(line => String(line).trim()) && !state.contentLines?.some(line => String(line).trim());
|
|
2057
|
+
state.el.classList.toggle('cxp-reasoning-done', !!complete);
|
|
2058
|
+
}
|
|
2044
2059
|
}
|
|
2045
2060
|
|
|
2046
2061
|
function cacheCollapsedCardState(state, item, itemType) {
|
|
@@ -2100,15 +2115,9 @@ function cacheCollapsedCardState(state, item, itemType) {
|
|
|
2100
2115
|
case 'fileChange': {
|
|
2101
2116
|
const changes = Array.isArray(item.changes) ? item.changes : [];
|
|
2102
2117
|
if (hasOwnField(item, 'changes')) {
|
|
2103
|
-
state.fileMetaText = changes.length ?
|
|
2118
|
+
state.fileMetaText = changes.length ? cxpText(changes.length === 1 ? 'oneFileChange' : 'fileChanges', changes.length === 1 ? '1 file change' : '{count} file changes', { count: changes.length }) : cxpText('pendingFiles', 'Pending file changes');
|
|
2104
2119
|
state.filesText = resolveFileChangeSummary(item);
|
|
2105
|
-
|
|
2106
|
-
.map((change) => extractStructuredText(change?.diff || change?.patch || change?.content || change?.output || ''))
|
|
2107
|
-
.filter(Boolean)
|
|
2108
|
-
.join('\n\n');
|
|
2109
|
-
if (item.aggregatedOutput != null || diffText) {
|
|
2110
|
-
state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || diffText;
|
|
2111
|
-
}
|
|
2120
|
+
if (item.aggregatedOutput != null) state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || '';
|
|
2112
2121
|
} else if (item.aggregatedOutput != null) {
|
|
2113
2122
|
state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || '';
|
|
2114
2123
|
}
|
|
@@ -2162,8 +2171,8 @@ export function flushCardBody(state) {
|
|
|
2162
2171
|
setOptionalSection(state.resultSectionEl, state.resultEl, state.resultText || '');
|
|
2163
2172
|
break;
|
|
2164
2173
|
case 'fileChange':
|
|
2165
|
-
if (state.metaEl) state.metaEl.textContent = state.fileMetaText || 'Pending file changes';
|
|
2166
|
-
if (state.filesEl) state.filesEl.textContent = state.filesText || 'Pending file changes';
|
|
2174
|
+
if (state.metaEl) state.metaEl.textContent = state.fileMetaText || cxpText('pendingFiles', 'Pending file changes');
|
|
2175
|
+
if (state.filesEl) state.filesEl.textContent = state.filesText || cxpText('pendingFiles', 'Pending file changes');
|
|
2167
2176
|
refreshFileChangeView(state);
|
|
2168
2177
|
break;
|
|
2169
2178
|
case 'collabAgentToolCall':
|
|
@@ -2388,6 +2397,7 @@ export function ensureReasoningState(item) {
|
|
|
2388
2397
|
|
|
2389
2398
|
const details = document.createElement('details');
|
|
2390
2399
|
details.className = 'cxp-card cxp-reasoning';
|
|
2400
|
+
details.hidden = true;
|
|
2391
2401
|
details.dataset.itemId = item.id || '';
|
|
2392
2402
|
details.dataset.expanded = '1';
|
|
2393
2403
|
|
|
@@ -2395,8 +2405,8 @@ export function ensureReasoningState(item) {
|
|
|
2395
2405
|
summary.innerHTML = `
|
|
2396
2406
|
<span class="cxp-card-icon">${ICON_SPARK}</span>
|
|
2397
2407
|
<span class="cxp-card-titles">
|
|
2398
|
-
<span class="cxp-card-title"
|
|
2399
|
-
<span class="cxp-card-subtitle"
|
|
2408
|
+
<span class="cxp-card-title">${cxpText('reasoning', 'Reasoning Summary')}</span>
|
|
2409
|
+
<span class="cxp-card-subtitle">${cxpText('working', 'Working through the next step')}</span>
|
|
2400
2410
|
</span>
|
|
2401
2411
|
<span class="cxp-think-dots"><span></span><span></span><span></span></span>
|
|
2402
2412
|
<span class="cxp-status-pill">live</span>
|
|
@@ -2643,10 +2653,14 @@ export function completeTurnOutputs(turnId) {
|
|
|
2643
2653
|
}
|
|
2644
2654
|
}
|
|
2645
2655
|
|
|
2656
|
+
function fileChangeSubtitle(item) {
|
|
2657
|
+
return item.status === 'completed' ? cxpText('filesUpdated', 'File updates applied') : cxpText('fileUpdates', 'File updates');
|
|
2658
|
+
}
|
|
2659
|
+
|
|
2646
2660
|
export function ensureFileChangeState(item) {
|
|
2647
2661
|
let state = _ctx.items.get(item.id);
|
|
2648
2662
|
if (state) return state;
|
|
2649
|
-
const card = createCard(item, ICON_FILES, '
|
|
2663
|
+
const card = createCard(item, ICON_FILES, cxpText('fileChange', 'File change'), fileChangeSubtitle(item));
|
|
2650
2664
|
setCardExpanded(card.el, true);
|
|
2651
2665
|
|
|
2652
2666
|
const summary = document.createElement('div');
|
|
@@ -2657,7 +2671,7 @@ export function ensureFileChangeState(item) {
|
|
|
2657
2671
|
filesSection.className = 'cxp-card-section';
|
|
2658
2672
|
const filesLabel = document.createElement('div');
|
|
2659
2673
|
filesLabel.className = 'cxp-card-section-label';
|
|
2660
|
-
filesLabel.textContent = 'Files changed';
|
|
2674
|
+
filesLabel.textContent = cxpText('filesChanged', 'Files changed');
|
|
2661
2675
|
const filesBody = document.createElement('div');
|
|
2662
2676
|
filesBody.className = 'cxp-card-meta';
|
|
2663
2677
|
filesSection.append(filesLabel, filesBody);
|
|
@@ -2672,6 +2686,7 @@ export function ensureFileChangeState(item) {
|
|
|
2672
2686
|
type: 'fileChange',
|
|
2673
2687
|
el: card.el,
|
|
2674
2688
|
pillEl: card.pill,
|
|
2689
|
+
subtitleEl: card.subtitleEl,
|
|
2675
2690
|
metaEl: summary,
|
|
2676
2691
|
filesEl: filesBody,
|
|
2677
2692
|
outputSectionEl: outputEl,
|
|
@@ -2889,8 +2904,9 @@ export function updateItemFromData(item) {
|
|
|
2889
2904
|
state.titleEl.textContent = head?.title || h.detail || item.type || 'Item';
|
|
2890
2905
|
if (head && state.subtitleEl) state.subtitleEl.textContent = head.subtitle;
|
|
2891
2906
|
}
|
|
2907
|
+
if (itemType === 'fileChange' && state.subtitleEl) state.subtitleEl.textContent = fileChangeSubtitle(state._lastItem);
|
|
2892
2908
|
if (state.pillEl && item.status != null) state.pillEl.textContent = _ctx.formatStatus(item.status);
|
|
2893
|
-
if (isCardBodyHidden(state)) { state._bodyDirty = true; _ctx.scheduleThreadSnapshotSave(_ctx.boundTab); return; }
|
|
2909
|
+
if (itemType !== 'reasoning' && isCardBodyHidden(state)) { state._bodyDirty = true; _ctx.scheduleThreadSnapshotSave(_ctx.boundTab); return; }
|
|
2894
2910
|
}
|
|
2895
2911
|
|
|
2896
2912
|
switch (itemType) {
|
|
@@ -2978,8 +2994,8 @@ export function updateItemFromData(item) {
|
|
|
2978
2994
|
}
|
|
2979
2995
|
case 'fileChange': {
|
|
2980
2996
|
state.pillEl.textContent = _ctx.formatStatus(item.status);
|
|
2981
|
-
state.metaEl.textContent = state.fileMetaText || 'Pending file changes';
|
|
2982
|
-
if (state.filesEl) state.filesEl.textContent = state.filesText || 'Pending file changes';
|
|
2997
|
+
state.metaEl.textContent = state.fileMetaText || cxpText('pendingFiles', 'Pending file changes');
|
|
2998
|
+
if (state.filesEl) state.filesEl.textContent = state.filesText || cxpText('pendingFiles', 'Pending file changes');
|
|
2983
2999
|
if (item.aggregatedOutput != null) {
|
|
2984
3000
|
state.outputBuf = extractStructuredText(item.aggregatedOutput) || item.aggregatedOutput || '';
|
|
2985
3001
|
}
|
|
@@ -3104,26 +3120,26 @@ export function appendAgentDelta(itemId, delta) {
|
|
|
3104
3120
|
|
|
3105
3121
|
export function appendPlanDelta(itemId, delta) {
|
|
3106
3122
|
const state = ensurePlanState({ id: itemId });
|
|
3107
|
-
if (state.pillEl) state.pillEl.textContent = 'live';
|
|
3123
|
+
if (state.pillEl) state.pillEl.textContent = cxpText('live', 'live');
|
|
3108
3124
|
state.buffer += delta || '';
|
|
3109
3125
|
if (isCardBodyHidden(state)) { state._bodyDirty = true; return; }
|
|
3110
3126
|
setMarkdownBuffer(state, state.buffer, false);
|
|
3111
3127
|
}
|
|
3112
3128
|
|
|
3113
3129
|
export function getReasoningBodyText(state, { complete = false } = {}) {
|
|
3114
|
-
if (!state) return complete ? 'No reasoning summary was provided.' : 'Waiting for reasoning summary...';
|
|
3130
|
+
if (!state) return complete ? cxpText('noReasoning', 'No reasoning summary was provided.') : cxpText('waitingReasoning', 'Waiting for reasoning summary...');
|
|
3115
3131
|
const contentText = Array.isArray(state.contentLines) ? state.contentLines.join('').trim() : '';
|
|
3116
3132
|
if (contentText) return contentText;
|
|
3117
3133
|
const summaryText = Array.isArray(state.summaryLines)
|
|
3118
3134
|
? state.summaryLines.map((line) => String(line || '').trim()).filter(Boolean).join('\n')
|
|
3119
3135
|
: '';
|
|
3120
|
-
return summaryText || (complete ? 'No reasoning summary was provided.' : 'Waiting for reasoning summary...');
|
|
3136
|
+
return summaryText || (complete ? cxpText('noReasoning', 'No reasoning summary was provided.') : cxpText('waitingReasoning', 'Waiting for reasoning summary...'));
|
|
3121
3137
|
}
|
|
3122
3138
|
|
|
3123
3139
|
export function appendReasoningDelta(itemId, delta, isSummary = false, summaryIndex = null) {
|
|
3124
3140
|
const state = ensureReasoningState({ id: itemId });
|
|
3125
3141
|
state.el?.classList.remove('cxp-reasoning-done');
|
|
3126
|
-
if (state.pillEl) state.pillEl.textContent = 'live';
|
|
3142
|
+
if (state.pillEl) state.pillEl.textContent = cxpText('live', 'live');
|
|
3127
3143
|
if (!state.userToggled && state.el && !state.el.open) {
|
|
3128
3144
|
state.suppressToggleTracking = true;
|
|
3129
3145
|
state.el.open = true;
|
|
@@ -3246,7 +3262,10 @@ export function resolveHistoryRenderSource(thread, fallbackItems = null, storedS
|
|
|
3246
3262
|
// `authoritative`: the thread's turns are its whole history (a revert reply),
|
|
3247
3263
|
// so the saved rendering is never used in their place, even when none remain.
|
|
3248
3264
|
export function renderHistory(thread, fallbackItems = null, { authoritative = false } = {}) {
|
|
3249
|
-
|
|
3265
|
+
// A save still pending for what is on screen is written before the transcript is rebuilt; with nothing
|
|
3266
|
+
// pending there is nothing to keep (no forced serialisation of the whole transcript on every open).
|
|
3267
|
+
const pendingTab = _ctx.boundTab;
|
|
3268
|
+
if (pendingTab?.snapshotTimer || pendingTab?.snapshotIdleHandle) _ctx.flushThreadSnapshotSave(pendingTab);
|
|
3250
3269
|
const preservedTokenUsage = thread?.id && _ctx.threadId && thread.id === _ctx.threadId
|
|
3251
3270
|
? _ctx.threadTokenUsage
|
|
3252
3271
|
: null;
|
|
@@ -3323,7 +3342,7 @@ export function renderHistory(thread, fallbackItems = null, { authoritative = fa
|
|
|
3323
3342
|
});
|
|
3324
3343
|
_ctx.hideEmpty();
|
|
3325
3344
|
_ctx.scrollEnd(true);
|
|
3326
|
-
_ctx.
|
|
3345
|
+
_ctx.scheduleThreadSnapshotSave(_ctx.boundTab);
|
|
3327
3346
|
renderPostPlanActions(_ctx.boundTab);
|
|
3328
3347
|
renderPostCompactionActions(_ctx.boundTab);
|
|
3329
3348
|
}
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
buildSynaBunChoiceContent,
|
|
13
13
|
codexApprovalDecisionActions,
|
|
14
14
|
codexHeldServerRequests,
|
|
15
|
-
|
|
15
|
+
codexMcpToolApproval,
|
|
16
16
|
codexMcpToolApprovalActions,
|
|
17
17
|
codexPermissionApprovalActions,
|
|
18
18
|
codexRequestIdentityKey,
|
|
@@ -417,7 +417,7 @@ export function renderUserInputRequest(requestId, params, protocol = {}) {
|
|
|
417
417
|
<span class="cxp-ask-option-desc">${esc(optionDesc)}</span>
|
|
418
418
|
`;
|
|
419
419
|
const retainedValue = answers[answerKey]?.answers?.[0];
|
|
420
|
-
if (!isOtherOption &&
|
|
420
|
+
if (!isOtherOption && (answers[answerKey]?.answers || []).includes(optionLabel)) btn.classList.add('selected');
|
|
421
421
|
btn.addEventListener('click', async () => {
|
|
422
422
|
if (isChangelogAsk && /edit first/i.test(optionLabel)) {
|
|
423
423
|
const allButtons = Array.from(optionsEl.querySelectorAll('.cxp-ask-option'));
|
|
@@ -434,6 +434,16 @@ export function renderUserInputRequest(requestId, params, protocol = {}) {
|
|
|
434
434
|
if (!opened) _ctx.restoreChangelogButtons(allButtons);
|
|
435
435
|
return;
|
|
436
436
|
}
|
|
437
|
+
if (question.multiSelect && !isOtherOption) {
|
|
438
|
+
otherWrap.hidden = true;
|
|
439
|
+
const selected = new Set(answers[answerKey]?.answers || []);
|
|
440
|
+
if (selected.has(optionLabel)) selected.delete(optionLabel); else selected.add(optionLabel);
|
|
441
|
+
const labels = new Set(explicitOptions.map((o) => typeof o === 'string' ? o : o.label));
|
|
442
|
+
const values = [...selected].filter((label) => labels.has(label));
|
|
443
|
+
if (values.length) answers[answerKey] = { answers: values }; else delete answers[answerKey];
|
|
444
|
+
optionsEl.querySelectorAll('.cxp-ask-option').forEach((node) => node.classList.toggle('selected', values.includes(node.querySelector('.cxp-ask-option-label')?.textContent)));
|
|
445
|
+
persistEditingDraft(); syncSubmit(); return;
|
|
446
|
+
}
|
|
437
447
|
optionsEl.querySelectorAll('.cxp-ask-option').forEach((node) => node.classList.remove('selected'));
|
|
438
448
|
btn.classList.add('selected');
|
|
439
449
|
if (isOtherOption) {
|
|
@@ -546,9 +556,9 @@ export function isElicitationValueSatisfied(value, schema) {
|
|
|
546
556
|
|
|
547
557
|
export function renderMcpToolApprovalRequest(requestId, params) {
|
|
548
558
|
if (_ctx.requestCards.has(String(requestId))) return;
|
|
549
|
-
const
|
|
559
|
+
const approval = codexMcpToolApproval(params);
|
|
550
560
|
const serverName = String(params?.serverName || 'MCP');
|
|
551
|
-
const toolName =
|
|
561
|
+
const toolName = approval?.toolName || 'unknown tool';
|
|
552
562
|
const entry = createInteractiveRequestCard(requestId, {
|
|
553
563
|
title: `${serverName} Tool Approval`,
|
|
554
564
|
subtitle: 'mcp tool approval',
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════
|
|
2
|
+
// SynaBun Neural Interface — Codex panel: native skills in the slash hints
|
|
3
|
+
// ═══════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Codex lists its skills itself (app-server skills/list): each with its name, its SKILL.md path and its scope.
|
|
6
|
+
// A hint keeps that path, so picking one sends Codex's own `skill` input (name + path: the exact skill, even when
|
|
7
|
+
// two share a name) with the prompt, instead of only the text "/name" (SK-050). Same-named skills are told apart
|
|
8
|
+
// by their scope in the hint. No DOM: cdx-tabs.js draws the hints, the tests read this.
|
|
9
|
+
|
|
10
|
+
const SCOPE_LABEL = { user: 'personal', repo: 'repository', system: 'Codex', admin: 'admin' };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Hint rows of native skills: `{ cmd, desc, skill: { name, path }, scope }`, enabled ones only, sorted.
|
|
14
|
+
* @param {object[]} skills skills/list entries (name, description, path, scope, enabled)
|
|
15
|
+
* @param {Set<string>} [taken] commands already shown (built-ins win their name)
|
|
16
|
+
*/
|
|
17
|
+
export function skillHintEntries(skills, taken = new Set()) {
|
|
18
|
+
const rows = (Array.isArray(skills) ? skills : [])
|
|
19
|
+
.filter((s) => s && s.enabled !== false)
|
|
20
|
+
.map((s) => {
|
|
21
|
+
const name = String(s.name || s.dirName || '').trim();
|
|
22
|
+
return { cmd: name ? `/${name}` : '', desc: String(s.description || '').trim(), skill: typeof s.path === 'string' && s.path ? { name, path: s.path } : null, scope: s.scope || null };
|
|
23
|
+
})
|
|
24
|
+
.filter((row) => row.cmd !== '/' && row.cmd && !taken.has(row.cmd));
|
|
25
|
+
const counts = rows.reduce((m, r) => m.set(r.cmd, (m.get(r.cmd) || 0) + 1), new Map());
|
|
26
|
+
for (const row of rows) {
|
|
27
|
+
if (counts.get(row.cmd) > 1) row.desc = `(${SCOPE_LABEL[row.scope] || row.scope || 'other'}) ${row.desc}`.trim();
|
|
28
|
+
}
|
|
29
|
+
return rows.sort((a, b) => a.cmd.localeCompare(b.cmd) || String(a.scope).localeCompare(String(b.scope)));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The native skill inputs a prompt carries: the picked skill, while the prompt still starts with its /name.
|
|
34
|
+
* @param {string} prompt the text being sent
|
|
35
|
+
* @param {{ cmd: string, name: string, path: string }|null} pending what was picked from the hints
|
|
36
|
+
* @returns {{ name: string, path: string }[]}
|
|
37
|
+
*/
|
|
38
|
+
export function skillsForPrompt(prompt, pending) {
|
|
39
|
+
if (!pending || typeof pending.cmd !== 'string' || typeof pending.path !== 'string') return [];
|
|
40
|
+
const text = String(prompt || '').trimStart();
|
|
41
|
+
if (text !== pending.cmd && !text.startsWith(`${pending.cmd} `) && !text.startsWith(`${pending.cmd}\n`)) return [];
|
|
42
|
+
return [{ name: pending.name, path: pending.path }];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The skills_list request the panel sends for a tab: Codex's app-server (0.164.0, checked 2026-10-23) keeps its skill
|
|
47
|
+
* list until asked with forceReload, and sends no notification of its own when a skill folder appears or changes, so
|
|
48
|
+
* after SynaBun installed, removed or changed a skill (skills:changed) the next request forces the reload; otherwise
|
|
49
|
+
* the cached list is enough. The forced reload also refreshes the skills the app-server offers its threads.
|
|
50
|
+
* @param {{ project?: string|null }} tab @param {boolean} changed whether a skills:changed arrived since the last list
|
|
51
|
+
*/
|
|
52
|
+
export function skillsListRequest(tab, changed) {
|
|
53
|
+
return { cwds: tab?.project ? [tab.project] : [], forceReload: changed === true };
|
|
54
|
+
}
|
|
@@ -125,6 +125,10 @@ export function injectStyles() {
|
|
|
125
125
|
opacity: 1;
|
|
126
126
|
overflow: visible;
|
|
127
127
|
}
|
|
128
|
+
/* Windows: the shell is 92% opaque, so the blur behind it barely shows, yet Chromium recomputes it on every
|
|
129
|
+
repaint inside the panel (a transcript rendering, a stream). There it goes; the colour stays. */
|
|
130
|
+
html.platform-win32 .codex-panel,
|
|
131
|
+
html.desktop-titlebar--win32 .codex-panel { backdrop-filter: none; -webkit-backdrop-filter: none; }
|
|
128
132
|
/* A floating terminal is promoted above the panel when focused. Raise the
|
|
129
133
|
whole stacking context while a footer menu is open so it stays visible. */
|
|
130
134
|
.codex-panel:has(.cxp-dropdown.open) {
|
|
@@ -352,6 +356,12 @@ export function injectStyles() {
|
|
|
352
356
|
display: inline-flex; align-items: center; gap: 3px;
|
|
353
357
|
position: relative;
|
|
354
358
|
}
|
|
359
|
+
/* SVGs with only a viewBox have platform-dependent intrinsic sizes. */
|
|
360
|
+
.cxp-toolbar-toggle > svg {
|
|
361
|
+
width: var(--cxp-space-3);
|
|
362
|
+
height: var(--cxp-space-3);
|
|
363
|
+
flex-shrink: 0;
|
|
364
|
+
}
|
|
355
365
|
.cxp-toolbar-toggle::after {
|
|
356
366
|
content: '';
|
|
357
367
|
position: absolute; bottom: 0; left: 25%; right: 25%;
|
|
@@ -774,6 +784,7 @@ export function injectStyles() {
|
|
|
774
784
|
/* ── Project bar and dropdowns ── */
|
|
775
785
|
.cxp-projectbar {
|
|
776
786
|
display: flex;
|
|
787
|
+
flex-wrap: wrap;
|
|
777
788
|
align-items: center;
|
|
778
789
|
gap: 4px;
|
|
779
790
|
padding: 4px 10px 0;
|
|
@@ -796,7 +807,6 @@ export function injectStyles() {
|
|
|
796
807
|
transition: background var(--cxp-dur-fast);
|
|
797
808
|
}
|
|
798
809
|
.cxp-dropdown-sm { max-width: 72px; }
|
|
799
|
-
#cxp-profile { max-width: 80px; }
|
|
800
810
|
.cxp-dropdown:hover {
|
|
801
811
|
background: var(--cxp-surface-1);
|
|
802
812
|
}
|
|
@@ -1691,6 +1701,7 @@ export function injectStyles() {
|
|
|
1691
1701
|
.cxp-thinking .cxp-msg-think-dots span:nth-child(2) { animation-delay: 0.2s; }
|
|
1692
1702
|
.cxp-think-dots span:nth-child(3),
|
|
1693
1703
|
.cxp-thinking .cxp-msg-think-dots span:nth-child(3) { animation-delay: 0.4s; }
|
|
1704
|
+
.cxp-reasoning[hidden] { display: none; }
|
|
1694
1705
|
.cxp-reasoning.cxp-reasoning-done .cxp-think-dots { display: none; }
|
|
1695
1706
|
.cxp-thinking {
|
|
1696
1707
|
display: flex;
|
|
@@ -2521,7 +2532,7 @@ export function injectStyles() {
|
|
|
2521
2532
|
}
|
|
2522
2533
|
/* The wrap draws the input's edge: 1px of padding over a border-coloured fill. */
|
|
2523
2534
|
.cxp-input-wrap {
|
|
2524
|
-
flex:
|
|
2535
|
+
flex: 0 0 auto; position: relative;
|
|
2525
2536
|
margin: 8px 8px 2px;
|
|
2526
2537
|
border-radius: var(--cxp-radius-lg);
|
|
2527
2538
|
padding: 1px;
|
|
@@ -2687,6 +2698,7 @@ export function injectStyles() {
|
|
|
2687
2698
|
background: var(--cxp-surface-2);
|
|
2688
2699
|
}
|
|
2689
2700
|
.cxp-projectbar-actions {
|
|
2701
|
+
flex-shrink: 0;
|
|
2690
2702
|
display: flex;
|
|
2691
2703
|
align-items: center;
|
|
2692
2704
|
gap: 2px;
|
|
@@ -3087,7 +3099,7 @@ export function injectStyles() {
|
|
|
3087
3099
|
color: var(--cxp-text-2);
|
|
3088
3100
|
background: var(--cxp-surface-1);
|
|
3089
3101
|
margin-bottom: 2px;
|
|
3090
|
-
cursor:
|
|
3102
|
+
cursor: move;
|
|
3091
3103
|
}
|
|
3092
3104
|
.cxp-queue-item.dragging { opacity: 0.4; }
|
|
3093
3105
|
.cxp-queue-item.drag-over { box-shadow: inset 0 2px 0 var(--cxp-text-2); }
|