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
|
@@ -1,23 +1,26 @@
|
|
|
1
|
+
import { wireDropdowns, closeDropdowns, setDropdownDisabled, dropdownOf } from '../cc-dropdown.js';
|
|
2
|
+
import { configureToolPickerTranslation, toolPickerHTML, updateToolPicker, readToolPicker, toolWord } from '../tool-list-picker.js';
|
|
3
|
+
import { toolListView } from '../tool-list-view.js';
|
|
1
4
|
// ═══════════════════════════════════════════
|
|
2
5
|
// SynaBun Assistant — brain picker (toolbar fields)
|
|
3
6
|
// ═══════════════════════════════════════════
|
|
4
7
|
// Dropdown fields for the brain: model (provider icon + model; switching
|
|
5
8
|
// provider happens inside the model menu, grouped by provider), effort (or the
|
|
6
9
|
// OpenCode agent), permission mode and account (Claude/Codex, inline only when
|
|
7
|
-
// there is more than one to pick) in the composer row; project and
|
|
10
|
+
// there is more than one to pick) in the composer row; project and SynaBun tools
|
|
8
11
|
// in the toolbar. Every field opens an asst-menu popover (it flips when there
|
|
9
|
-
// is no room). A provider/account/
|
|
12
|
+
// is no room). A provider/account/tools change reports
|
|
10
13
|
// { requiresSwitch: true } so the panel sends `switch_brain`.
|
|
11
14
|
|
|
12
15
|
import {
|
|
13
16
|
ensureModelsForProfile,
|
|
14
17
|
fetchClaudeAccounts,
|
|
15
18
|
fetchCodexAccounts,
|
|
16
|
-
|
|
19
|
+
fetchToolCatalog,
|
|
17
20
|
fetchOpencodeAgents,
|
|
18
21
|
getCachedClaudeAccounts,
|
|
19
22
|
getCachedCodexAccounts,
|
|
20
|
-
|
|
23
|
+
getCachedToolCatalog,
|
|
21
24
|
getCachedOpencodeAgents,
|
|
22
25
|
getClaudeWorkerAccountId,
|
|
23
26
|
getCodexWorkerAccountId,
|
|
@@ -39,6 +42,7 @@ import { createMascotControl } from './asst-mascot.js';
|
|
|
39
42
|
import { modelChipForms, modelChipName, modelChipTag } from './asst-model-chip.js';
|
|
40
43
|
import {
|
|
41
44
|
ACCOUNT_PROVIDERS,
|
|
45
|
+
BRAIN_PROVIDERS,
|
|
42
46
|
brainRequiresSwitch,
|
|
43
47
|
emptyProjectView,
|
|
44
48
|
modelShortName,
|
|
@@ -47,6 +51,7 @@ import {
|
|
|
47
51
|
PLAN_MODE_PROVIDERS,
|
|
48
52
|
permissionModeLabel,
|
|
49
53
|
PROVIDERS,
|
|
54
|
+
providerMeta,
|
|
50
55
|
projectLabel,
|
|
51
56
|
resolveBrainDefaults,
|
|
52
57
|
TEST_DENSITIES,
|
|
@@ -110,6 +115,7 @@ const PLAN_DESC = {
|
|
|
110
115
|
'claude-code': 'Plan first; approving the plan continues in the approval mode below',
|
|
111
116
|
codex: 'Native Codex plan mode (read-only sandbox)',
|
|
112
117
|
opencode: 'OpenCode plan agent (no file edits)',
|
|
118
|
+
antigravity: 'Antigravity explores and proposes a plan; code changes wait for your approval',
|
|
113
119
|
};
|
|
114
120
|
|
|
115
121
|
function agentName(agent) {
|
|
@@ -191,7 +197,7 @@ function hiddenOpencodeIds(remote) {
|
|
|
191
197
|
}
|
|
192
198
|
|
|
193
199
|
// The models the user hid (Assistant → Models), per provider, as the last catalog load saw them.
|
|
194
|
-
let _hidden = { 'claude-code': new Set(), codex: new Set(), opencode: new Set() };
|
|
200
|
+
let _hidden = { 'claude-code': new Set(), codex: new Set(), opencode: new Set(), antigravity: new Set() };
|
|
195
201
|
|
|
196
202
|
function hiddenSets(remote) {
|
|
197
203
|
const out = {};
|
|
@@ -292,7 +298,7 @@ function catalogSaysNone(remote, provider, local) {
|
|
|
292
298
|
}
|
|
293
299
|
|
|
294
300
|
/**
|
|
295
|
-
* { 'claude-code': [...], codex: [...], opencode: [...] }: the models of every
|
|
301
|
+
* { 'claude-code': [...], codex: [...], opencode: [...], antigravity: [...] }: the models of every
|
|
296
302
|
* Assistant model menu and of the Routes editor, from GET /api/assistant/catalog
|
|
297
303
|
* (see mergeProviderModels). Models the user hid (Assistant → Models, and
|
|
298
304
|
* Settings → OpenCode for OpenCode) never appear. `force` asks the server for a
|
|
@@ -313,6 +319,7 @@ export async function loadModelCatalog({ force = false } = {}) {
|
|
|
313
319
|
// No catalog (request failed): the last known disabled lists still apply.
|
|
314
320
|
const sets = remote ? hiddenSets(remote) : { ..._hidden, opencode: new Set([...(_hidden.opencode || []), ...hiddenOpencodeIds(null)]) };
|
|
315
321
|
_hidden = sets;
|
|
322
|
+
if (remote?.providers) _providerInfo = remote.providers;
|
|
316
323
|
for (const provider of PROVIDERS) {
|
|
317
324
|
const local = getModelsForProfile(provider) || [];
|
|
318
325
|
// An empty list the catalog vouches for is its answer: the window's own rows do not stand in for it.
|
|
@@ -363,6 +370,33 @@ function keepCatalog(catalog, sets) {
|
|
|
363
370
|
/** The last loadModelCatalog() result, synchronously (null before the first load). */
|
|
364
371
|
export function cachedModelCatalog() { return _catalog; }
|
|
365
372
|
|
|
373
|
+
// The catalog's provider entries ([{ id, brain, accounts, priced, signedIn?, tier? }]) as the last load saw them:
|
|
374
|
+
// Antigravity's sign-in state is read from there (it signs in inside its own CLI; SynaBun keeps no account of it).
|
|
375
|
+
let _providerInfo = null;
|
|
376
|
+
|
|
377
|
+
/** One provider's catalog entry ({ id, brain, signedIn?, tier?, … }), from an array or a map; null when unknown. */
|
|
378
|
+
export function catalogProviderInfo(provider, providers = _providerInfo) {
|
|
379
|
+
if (!provider || !providers) return null;
|
|
380
|
+
if (Array.isArray(providers)) return providers.find(p => p && p.id === provider) || null;
|
|
381
|
+
const entry = providers[provider];
|
|
382
|
+
return entry && typeof entry === 'object' ? entry : null;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* What the model menu and the model chip say about Antigravity's sign-in (`info`: its catalog entry):
|
|
387
|
+
* { state: 'signedIn' | 'signedOut' | 'unknown', text }. Antigravity signs in with Google inside its own panel;
|
|
388
|
+
* the tier is the plan its session reported ("Google AI Pro").
|
|
389
|
+
*/
|
|
390
|
+
export function antigravitySignInView(info, t = null) {
|
|
391
|
+
const tr = tf(t);
|
|
392
|
+
const tier = typeof info?.tier === 'string' && info.tier.trim() ? info.tier.trim() : (typeof info?.tier?.name === 'string' ? info.tier.name.trim() : '');
|
|
393
|
+
if (info?.signedIn === true) {
|
|
394
|
+
return { state: 'signedIn', text: tier ? tr('assistant.brain.antigravitySignedInTier', 'Signed in with Google ({tier})', { tier }) : tr('assistant.brain.antigravitySignedIn', 'Signed in with Google') };
|
|
395
|
+
}
|
|
396
|
+
if (info?.signedIn === false) return { state: 'signedOut', text: tr('assistant.brain.antigravitySignedOut', 'Not signed in: open the Antigravity panel to sign in') };
|
|
397
|
+
return { state: 'unknown', text: tr('assistant.brain.antigravitySignInUnknown', 'Sign-in not checked yet: Antigravity signs in inside its own panel') };
|
|
398
|
+
}
|
|
399
|
+
|
|
366
400
|
/** UI metadata from the same catalog load; no second list or extra endpoint. */
|
|
367
401
|
export function modelCatalogStatus() {
|
|
368
402
|
return { partial: _catalogPartial, hiddenCounts: Object.fromEntries(PROVIDERS.map(provider => [provider, _hidden[provider]?.size || 0])) };
|
|
@@ -445,7 +479,7 @@ on('sync:assistant:catalog-changed', modelListsChanged);
|
|
|
445
479
|
// Launch: the menus' lists are read once the page has painted, so the first model menu opens from them.
|
|
446
480
|
if (typeof document !== 'undefined') {
|
|
447
481
|
registerLaunchPrefetch('assistant-model-catalog', () => loadModelCatalog(), { order: 10, owner: true });
|
|
448
|
-
registerLaunchPrefetch('assistant-accounts', () => Promise.allSettled([fetchClaudeAccounts(), fetchCodexAccounts(),
|
|
482
|
+
registerLaunchPrefetch('assistant-accounts', () => Promise.allSettled([fetchClaudeAccounts(), fetchCodexAccounts(), fetchToolCatalog(), fetchOpencodeAgents()]), { order: 14, owner: true });
|
|
449
483
|
}
|
|
450
484
|
|
|
451
485
|
function sameModel(selected, m) {
|
|
@@ -471,7 +505,8 @@ function tierTag(m, tr) {
|
|
|
471
505
|
/**
|
|
472
506
|
* Model menu grouped by provider, filterable, with "Custom model id…".
|
|
473
507
|
* opts: { brain, onSelect(target), includeHere, hereLabel, title, t, placement,
|
|
474
|
-
* current:{provider, model}|null, warnSwitch, providers
|
|
508
|
+
* current:{provider, model}|null, warnSwitch, providers (default: the brain
|
|
509
|
+
* providers, so a worker-only one is listed only when named), onToast(text),
|
|
475
510
|
* accept(provider, model) → bool (only those models), emptyLabel (when none
|
|
476
511
|
* passes), allowCustom (default true), zIndex (see asst-menu.js),
|
|
477
512
|
* accountItems (menu items listed first, under accountTitle) }
|
|
@@ -507,6 +542,7 @@ export async function openModelMenu(anchor, opts = {}) {
|
|
|
507
542
|
try { catalog = await loadModelCatalog({ force: opts.forceReload === true }); } catch { failed = true; } finally { anchor.removeAttribute('aria-busy'); }
|
|
508
543
|
if (!anchor.isConnected || (loading && currentMenu() !== loading.el)) return null;
|
|
509
544
|
}
|
|
545
|
+
if (opts.shouldOpen && !opts.shouldOpen()) return null;
|
|
510
546
|
const items = buildModelMenuItems(catalog);
|
|
511
547
|
const menu = openMenu(anchor, {
|
|
512
548
|
title: title || tr('assistant.brain.model', 'Model'),
|
|
@@ -542,13 +578,15 @@ export async function openModelMenu(anchor, opts = {}) {
|
|
|
542
578
|
if (includeHere) {
|
|
543
579
|
items.push({ kind: 'radio', id: '__here', label: hereLabel || tr('assistant.routes.brainDecides', 'Let the brain decide'), selected: !current, onSelect: () => onSelect?.({ here: true }) });
|
|
544
580
|
}
|
|
545
|
-
|
|
581
|
+
// Without `providers` the menu is a brain's (the toolbar's model field, the WhatsApp brain): every provider the
|
|
582
|
+
// Assistant can run on (BRAIN_PROVIDERS, Antigravity included); a route or a dispatch names its own providers.
|
|
583
|
+
const list = Array.isArray(providers) && providers.length ? PROVIDERS.filter(p => providers.includes(p)) : BRAIN_PROVIDERS;
|
|
546
584
|
let listed = 0;
|
|
547
585
|
for (const provider of list) {
|
|
548
586
|
const models = (catalog[provider] || []).filter(m => typeof accept !== 'function' || accept(provider, m));
|
|
549
587
|
if (!models.length && !opts.routingEditor) continue;
|
|
550
588
|
listed += models.length;
|
|
551
|
-
const meta =
|
|
589
|
+
const meta = providerMeta(provider);
|
|
552
590
|
const hiddenCount = metadata.hiddenCounts[provider] || 0;
|
|
553
591
|
const note = opts.routingEditor ? tr('assistant.routes.menu.hiddenCount', '{count} hidden in Models', { count: hiddenCount }) : warnSwitch && provider !== b.provider ? tr('assistant.brain.newConversation', 'starts a new conversation') : '';
|
|
554
592
|
items.push({ kind: 'header', label: meta.label, icon: meta.icon, color: meta.color, note });
|
|
@@ -635,7 +673,7 @@ function menuItemsSignature(items) {
|
|
|
635
673
|
// Creation order is DOM order within a slot: model · effort · variant · mode · tests · account in the composer.
|
|
636
674
|
// `effort` is the OpenCode agent for OpenCode; `variant` is OpenCode's effort (the model's variants).
|
|
637
675
|
// `tests` is the session's Test density, not a brain field: it shows only while the host supplies a level.
|
|
638
|
-
const FIELDS = ['model', 'effort', 'variant', 'mode', 'tests', 'account', 'project'
|
|
676
|
+
const FIELDS = ['model', 'effort', 'variant', 'mode', 'tests', 'account', 'project'];
|
|
639
677
|
// Slot of each field: the composer row (the brain and how it acts) · the toolbar (where it works).
|
|
640
678
|
const FIELD_GROUP = { model: 'brain', effort: 'brain', variant: 'brain', mode: 'brain', tests: 'brain', account: 'brain', project: 'context', mcp: 'context' };
|
|
641
679
|
|
|
@@ -650,6 +688,7 @@ const FIELD_GROUP = { model: 'brain', effort: 'brain', variant: 'brain', mode: '
|
|
|
650
688
|
* onProjects(projects) — the registered projects were (re)loaded }
|
|
651
689
|
*/
|
|
652
690
|
export function createBrainPicker(host, hooks = {}) {
|
|
691
|
+
configureToolPickerTranslation(hooks.t);
|
|
653
692
|
const t = tf(hooks.t);
|
|
654
693
|
const placement = hooks.menuPlacement || 'below';
|
|
655
694
|
|
|
@@ -674,6 +713,31 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
674
713
|
buttons[field] = btn;
|
|
675
714
|
}
|
|
676
715
|
|
|
716
|
+
const toolsSlot = el('div', 'asst-tools-picker');
|
|
717
|
+
(single ? root : host.context || root).appendChild(toolsSlot);
|
|
718
|
+
const toolsLife = new AbortController();
|
|
719
|
+
wireDropdowns(toolsSlot, { signal: toolsLife.signal });
|
|
720
|
+
let toolsSessionId = null;
|
|
721
|
+
toolsSlot.addEventListener('cc-dropdown-open', () => { toolsSessionId = hooks.getSessionId?.() ?? null; }, { signal: toolsLife.signal });
|
|
722
|
+
toolsSlot.addEventListener('change', (event) => {
|
|
723
|
+
if (currentBrain().provider !== 'opencode' || toolsSessionId !== (hooks.getSessionId?.() ?? null)) return;
|
|
724
|
+
commit({ tools: readToolPicker(event.target, { inherit: false }) }, 'tools');
|
|
725
|
+
}, { signal: toolsLife.signal });
|
|
726
|
+
function renderTools(brain) {
|
|
727
|
+
if (toolsSessionId !== (hooks.getSessionId?.() ?? null)) closeDropdowns(toolsSlot, { cancel: true });
|
|
728
|
+
const catalog = getCachedToolCatalog();
|
|
729
|
+
toolsSlot.hidden = brain.provider !== 'opencode' || !catalog;
|
|
730
|
+
if (toolsSlot.hidden) { closeDropdowns(toolsSlot, { cancel: true }); toolsSlot.innerHTML = ''; return; }
|
|
731
|
+
let input = toolsSlot.querySelector('input');
|
|
732
|
+
const options = { catalog, includeServers: false, label: t('assistant.brain.mcp') };
|
|
733
|
+
const tools = brain.tools ?? [...new Set([...(catalog.default || []).filter(id => id !== 'git'), 'browser'])];
|
|
734
|
+
if (!input) {
|
|
735
|
+
toolsSlot.innerHTML = toolPickerHTML(`asst-tools-${globalThis.crypto.randomUUID()}`, tools, options);
|
|
736
|
+
input = toolsSlot.querySelector('input');
|
|
737
|
+
} else if (!dropdownOf(input)?.classList.contains('open')) updateToolPicker(input, tools, options);
|
|
738
|
+
setDropdownDisabled(input, hooks.getRunning?.() === true);
|
|
739
|
+
}
|
|
740
|
+
|
|
677
741
|
let destroyed = false;
|
|
678
742
|
let loading = null;
|
|
679
743
|
// The empty state's "Choose a project" (mountEmptyProject): the project field's second button.
|
|
@@ -694,8 +758,7 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
694
758
|
codex: getCachedCodexAccounts(),
|
|
695
759
|
},
|
|
696
760
|
agents: getCachedOpencodeAgents(),
|
|
697
|
-
|
|
698
|
-
defaultMcpProfile: 'full',
|
|
761
|
+
toolCatalog: getCachedToolCatalog(),
|
|
699
762
|
projects: _projectsCache || [],
|
|
700
763
|
};
|
|
701
764
|
}
|
|
@@ -751,6 +814,8 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
751
814
|
// The composer chip's account cue: the account menu's initial avatar when the provider has more than one
|
|
752
815
|
// account (or the account is signed out), "Auto" for Auto; null otherwise. Its full words are the tooltip's.
|
|
753
816
|
function accountCue(brain) {
|
|
817
|
+
// Antigravity signed out: a warning cue on the chip (its words are the tooltip's and the Model menu's).
|
|
818
|
+
if (brain.provider === 'antigravity') return catalogProviderInfo('antigravity')?.signedIn === false ? { text: '!', tone: 'warn' } : null;
|
|
754
819
|
if (!ACCOUNT_PROVIDERS.has(brain.provider)) return null;
|
|
755
820
|
if (brain.accountId === 'auto') return { text: t('assistant.brain.accountAutoShort', 'Auto'), tone: 'muted' };
|
|
756
821
|
const accounts = brain.provider === 'codex' ? getCachedCodexAccounts() : getCachedClaudeAccounts();
|
|
@@ -768,19 +833,20 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
768
833
|
const efforts = effortsFor(brain);
|
|
769
834
|
const level = efforts.find(e => e.id === brain.effort);
|
|
770
835
|
const hasEfforts = efforts.some(e => e.id !== 'off');
|
|
771
|
-
const
|
|
836
|
+
const toolCatalog = getCachedToolCatalog();
|
|
772
837
|
return {
|
|
773
838
|
meta,
|
|
774
839
|
model: modelLabel(brain),
|
|
775
840
|
effortSupported: brain.provider === 'opencode' || hasEfforts,
|
|
776
841
|
effort: brain.provider === 'opencode'
|
|
777
842
|
? (brain.agent || t('assistant.brain.agentDefault', 'default'))
|
|
778
|
-
|
|
843
|
+
// Antigravity has no "off" level: no level is the model's own default ("Default").
|
|
844
|
+
: (level ? level.label : (brain.effort || (brain.provider === 'antigravity' ? (efforts.find(e => e.id === 'off')?.label || t('assistant.brain.effortOff', 'off')) : t('assistant.brain.effortOff', 'off')))),
|
|
779
845
|
variantSupported: brain.provider === 'opencode' && hasEfforts,
|
|
780
846
|
variant: level ? level.label : (brain.effort || t('assistant.brain.variantDefault', 'default variant')),
|
|
781
847
|
project: brain.project ? projectLabel(brain.project, _projectsCache || []) : t('assistant.brain.projectHome', 'Home'),
|
|
782
848
|
mode: permissionModeLabel(brain, (id, fallback) => t(`assistant.brain.modes.${id}`, fallback)),
|
|
783
|
-
mcp:
|
|
849
|
+
mcp: toolListView(toolCatalog, brain.tools, { translate: hooks.t }).summary,
|
|
784
850
|
account: ACCOUNT_PROVIDERS.has(brain.provider) ? accountLabel(brain) : '',
|
|
785
851
|
};
|
|
786
852
|
}
|
|
@@ -859,6 +925,7 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
859
925
|
const tip = [
|
|
860
926
|
v.meta.label, model, who ? t('assistant.brain.asAccount', 'as {account}', { account: who }) : '',
|
|
861
927
|
acc ? accountIdentity(acc) : '', acc ? accountBadge(acc, p).text : '',
|
|
928
|
+
brain.provider === 'antigravity' ? antigravitySignInView(catalogProviderInfo('antigravity'), hooks.t).text : '',
|
|
862
929
|
].filter(Boolean).join(' · ');
|
|
863
930
|
setBtn('model', { label: '', icon: v.meta.icon, color: v.meta.color, tooltip: tip, aria: `${t('assistant.brain.model', 'Model')}: ${tip}` });
|
|
864
931
|
|
|
@@ -955,7 +1022,7 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
955
1022
|
const testsLabel = tests ? testDensityLabel(tests, hooks.t) : '';
|
|
956
1023
|
setBtn('tests', { label: testsLabel, icon: testsIcon(testDensityBars(tests)), hidden: !tests, tooltip: `${t('assistant.tests.title', 'Test density')}: ${testsLabel}` });
|
|
957
1024
|
if (tests) buttons.tests.dataset.level = tests; else delete buttons.tests.dataset.level;
|
|
958
|
-
|
|
1025
|
+
renderTools(brain);
|
|
959
1026
|
renderEmptyProject(brain);
|
|
960
1027
|
}
|
|
961
1028
|
|
|
@@ -1022,7 +1089,6 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1022
1089
|
{ field: 'project', label: t('assistant.brain.project', 'Working project'), value: brain.project || v.project, icon: ICON_FOLDER, hidden: false },
|
|
1023
1090
|
{ field: 'mode', label: t('assistant.brain.mode', 'Permission mode'), value: v.mode, icon: ICON_SHIELD, hidden: false },
|
|
1024
1091
|
{ field: 'tests', label: t('assistant.tests.title', 'Test density'), value: testDensity() ? testDensityLabel(testDensity(), hooks.t) : '', icon: testsIcon(testDensityBars(testDensity())), hidden: !testDensity() },
|
|
1025
|
-
{ field: 'mcp', label: t('assistant.brain.mcp', 'MCP tool profile'), value: v.mcp, icon: ICON_PLUG, hidden: false },
|
|
1026
1092
|
{ field: 'account', label: t('assistant.brain.accountShort', 'Account'), value: accountValue(brain), icon: ICON_ACCOUNT, hidden: !ACCOUNT_PROVIDERS.has(brain.provider) },
|
|
1027
1093
|
];
|
|
1028
1094
|
}
|
|
@@ -1038,7 +1104,7 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1038
1104
|
|
|
1039
1105
|
async function ensureLoaded(provider, { force = false } = {}) {
|
|
1040
1106
|
// The catalog too: defaults resolve against the menu's list (context variants, disabled models out).
|
|
1041
|
-
const jobs = [ensureModelsForProfile(provider, force),
|
|
1107
|
+
const jobs = [ensureModelsForProfile(provider, force), fetchToolCatalog(force), loadModelCatalog()];
|
|
1042
1108
|
if (provider === 'codex') jobs.push(fetchCodexAccounts(force));
|
|
1043
1109
|
if (provider === 'claude-code') jobs.push(fetchClaudeAccounts(force));
|
|
1044
1110
|
if (provider === 'opencode') jobs.push(fetchOpencodeAgents(force));
|
|
@@ -1077,23 +1143,27 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1077
1143
|
* Open a field menu; `anchorOverride` (e.g. the toolbar "⋯") when the inline
|
|
1078
1144
|
* button is hidden. `restoreFocus`: a pick sends focus back to the anchor.
|
|
1079
1145
|
*/
|
|
1080
|
-
async function openField(field, anchorOverride = null, { restoreFocus = false } = {}) {
|
|
1146
|
+
async function openField(field, anchorOverride = null, { restoreFocus = false, shouldOpen = () => true } = {}) {
|
|
1147
|
+
if (!shouldOpen()) return;
|
|
1081
1148
|
const anchor = anchorFor(field, anchorOverride);
|
|
1082
1149
|
const brain = currentBrain();
|
|
1083
1150
|
if (field === 'model') {
|
|
1084
1151
|
// The account rows come from the kept lists; they are read again in the background once loaded.
|
|
1085
|
-
|
|
1152
|
+
// Antigravity has no SynaBun account: its sign-in state comes with the catalog.
|
|
1153
|
+
if (ACCOUNT_PROVIDERS.has(brain.provider) || brain.provider === 'antigravity') {
|
|
1086
1154
|
if (_warmProviders.has(brain.provider)) ensureLoaded(brain.provider).catch(() => {});
|
|
1087
1155
|
else await ensureLoaded(brain.provider);
|
|
1088
1156
|
}
|
|
1157
|
+
const antigravity = brain.provider === 'antigravity';
|
|
1089
1158
|
await openModelMenu(anchor, {
|
|
1090
1159
|
brain,
|
|
1160
|
+
shouldOpen,
|
|
1091
1161
|
t: hooks.t,
|
|
1092
1162
|
placement,
|
|
1093
1163
|
current: { provider: brain.provider, model: brain.model },
|
|
1094
1164
|
warnSwitch: true,
|
|
1095
|
-
accountItems: ACCOUNT_PROVIDERS.has(brain.provider) ? accountItems(brain) : [],
|
|
1096
|
-
accountTitle: accountText('menuTitle', {}, accountProvider(brain)),
|
|
1165
|
+
accountItems: ACCOUNT_PROVIDERS.has(brain.provider) ? accountItems(brain) : antigravity ? antigravitySignInItems() : [],
|
|
1166
|
+
accountTitle: antigravity ? t('assistant.brain.antigravitySignIn', 'Antigravity sign-in') : accountText('menuTitle', {}, accountProvider(brain)),
|
|
1097
1167
|
onToast: hooks.onToast,
|
|
1098
1168
|
onManageModels: hooks.onManageModels,
|
|
1099
1169
|
onSelect: (target) => {
|
|
@@ -1126,7 +1196,7 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1126
1196
|
if (!_warmProviders.has(brain.provider)) {
|
|
1127
1197
|
anchor.setAttribute('aria-busy', 'true');
|
|
1128
1198
|
try { await ensureLoaded(brain.provider); } finally { anchor.removeAttribute('aria-busy'); }
|
|
1129
|
-
if (destroyed || !anchor.isConnected) return;
|
|
1199
|
+
if (destroyed || !anchor.isConnected || !shouldOpen()) return;
|
|
1130
1200
|
} else {
|
|
1131
1201
|
ensureLoaded(brain.provider).catch(() => {});
|
|
1132
1202
|
}
|
|
@@ -1141,7 +1211,7 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1141
1211
|
if (!warm) {
|
|
1142
1212
|
anchor.setAttribute('aria-busy', 'true');
|
|
1143
1213
|
try { await ensureLoaded(brain.provider); } finally { anchor.removeAttribute('aria-busy'); }
|
|
1144
|
-
if (destroyed || !anchor.isConnected) return;
|
|
1214
|
+
if (destroyed || !anchor.isConnected || !shouldOpen()) return;
|
|
1145
1215
|
}
|
|
1146
1216
|
let shown = null;
|
|
1147
1217
|
drawField(field, brain, (title, items, extra = {}) => {
|
|
@@ -1208,21 +1278,6 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1208
1278
|
return;
|
|
1209
1279
|
}
|
|
1210
1280
|
|
|
1211
|
-
if (field === 'mcp') {
|
|
1212
|
-
const presets = getCachedMcpProfilePresets();
|
|
1213
|
-
const items = Object.entries(presets).map(([id, preset]) => ({
|
|
1214
|
-
kind: 'radio',
|
|
1215
|
-
id,
|
|
1216
|
-
label: preset?.label || id,
|
|
1217
|
-
desc: preset?.description || '',
|
|
1218
|
-
tag: preset?.tools != null ? `${preset.tools} ${t('assistant.brain.tools', 'tools')}` : '',
|
|
1219
|
-
selected: id === brain.mcpProfile,
|
|
1220
|
-
onSelect: () => commit({ mcpProfile: id }, 'mcp'),
|
|
1221
|
-
}));
|
|
1222
|
-
menu(t('assistant.brain.mcp', 'MCP tool profile'), items);
|
|
1223
|
-
return;
|
|
1224
|
-
}
|
|
1225
|
-
|
|
1226
1281
|
if (field === 'mode') {
|
|
1227
1282
|
const modes = PERMISSION_MODES[brain.provider] || PERMISSION_MODES['claude-code'];
|
|
1228
1283
|
// Plan mode is its own switch: it combines with every approval mode below.
|
|
@@ -1283,6 +1338,12 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1283
1338
|
};
|
|
1284
1339
|
}
|
|
1285
1340
|
|
|
1341
|
+
// Antigravity's place for accounts in the Model menu: its sign-in state, one line (antigravitySignInView).
|
|
1342
|
+
function antigravitySignInItems() {
|
|
1343
|
+
const view = antigravitySignInView(catalogProviderInfo('antigravity'), hooks.t);
|
|
1344
|
+
return [{ kind: 'info', id: '__antigravity_signin', label: view.text, className: `asst-agy-signin asst-agy-signin-${view.state}` }];
|
|
1345
|
+
}
|
|
1346
|
+
|
|
1286
1347
|
// The composer's Model menu lists the brain's accounts too (Claude or Codex), as the cog's account menu
|
|
1287
1348
|
// does (asst-account-menu.js): Auto, every account once (a signed-out one opens its sign-in), the Uses
|
|
1288
1349
|
// switch of an account holding both credentials, Add account… and Manage….
|
|
@@ -1319,15 +1380,14 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1319
1380
|
if (provider === before.provider) return;
|
|
1320
1381
|
await ensureLoaded(provider);
|
|
1321
1382
|
if (destroyed) return;
|
|
1322
|
-
const draft = { ...before, provider, model: model || '', effort: null, agent: null, accountId: null };
|
|
1383
|
+
const draft = { ...before, provider, model: model || '', effort: null, agent: null, accountId: null, tools: null };
|
|
1323
1384
|
// resolveBrainDefaults reads the new provider's catalog.
|
|
1324
1385
|
const next = resolveBrainDefaults(draft, {
|
|
1325
1386
|
models: { [provider]: resolvableModels(provider, draft.model) },
|
|
1326
1387
|
efforts: { [provider]: effortsFor(normalizeBrain(draft)) },
|
|
1327
1388
|
accounts: { 'claude-code': getCachedClaudeAccounts(), codex: getCachedCodexAccounts() },
|
|
1328
1389
|
agents: getCachedOpencodeAgents(),
|
|
1329
|
-
|
|
1330
|
-
defaultMcpProfile: 'full',
|
|
1390
|
+
toolCatalog: getCachedToolCatalog(),
|
|
1331
1391
|
projects: _projectsCache || [],
|
|
1332
1392
|
});
|
|
1333
1393
|
if (model && !next.model) next.model = model;
|
|
@@ -1355,11 +1415,12 @@ export function createBrainPicker(host, hooks = {}) {
|
|
|
1355
1415
|
refresh,
|
|
1356
1416
|
snapshot,
|
|
1357
1417
|
openField,
|
|
1418
|
+
switchProvider,
|
|
1358
1419
|
fieldSummary,
|
|
1359
1420
|
modelLabel: () => modelLabel(),
|
|
1360
1421
|
mountEmptyProject,
|
|
1361
1422
|
setBrain() { render(); },
|
|
1362
1423
|
close: closeMenu,
|
|
1363
|
-
destroy() { destroyed = true; fitObserver?.disconnect(); if (fitFrame && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(fitFrame); for (const off of offAccounts) { try { off?.(); } catch {} } closeMenu(); heroProjectMascot?.destroy(); Object.values(buttons).forEach((b) => b.remove()); heroProject?.remove(); heroProject = null; root.remove(); },
|
|
1424
|
+
destroy() { toolsLife.abort(); toolsSlot.remove(); destroyed = true; fitObserver?.disconnect(); if (fitFrame && typeof cancelAnimationFrame === 'function') cancelAnimationFrame(fitFrame); for (const off of offAccounts) { try { off?.(); } catch {} } closeMenu(); heroProjectMascot?.destroy(); Object.values(buttons).forEach((b) => b.remove()); heroProject?.remove(); heroProject = null; root.remove(); },
|
|
1364
1425
|
};
|
|
1365
1426
|
}
|
|
@@ -228,10 +228,11 @@ export function renderBudgetSession(view, { t } = {}) {
|
|
|
228
228
|
? tr('assistant.budget.providerSpend', '{spent} spent', { spent: money(row.spentUsd) })
|
|
229
229
|
: tr('assistant.budget.providerAmounts', 'Share {share} · spent {spent} · left for tasks {left}', { share: row.shareUsd == null ? '—' : money(row.shareUsd), spent: money(row.spentUsd), left: row.workerLeftUsd == null ? '—' : money(row.workerLeftUsd) })));
|
|
230
230
|
if (!view.unlimited && row.isBrain && view.split) item.append(el('div', 'asst-modal-note', tr('assistant.budget.reserve', '{reserve} reserved for the brain within this share.', { reserve: money(view.split.brainReserveLeftUsd) })));
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
231
|
+
const reason = !row.eligible && row.reason ? String(row.reason).replace(/^brain:/, '') : '';
|
|
232
|
+
// A provider that reports no prices (Antigravity) gets no share under a budget: nothing of it was "used up".
|
|
233
|
+
if (!view.unlimited && (view.dry || []).includes(row.provider) && reason !== 'unpriced') item.append(el('div', 'asst-budget-dry', tr('assistant.budget.dry', 'Share used up')));
|
|
234
|
+
if (reason) {
|
|
235
|
+
item.append(el('div', 'asst-modal-note', tr(`assistant.budget.ineligible.${reason}`, { no_models: 'No available models', signed_out: 'Signed out', limited: 'Provider usage limit reached', unpriced: 'Reports tokens, not prices' }[reason] || reason)));
|
|
235
236
|
}
|
|
236
237
|
providers.append(item);
|
|
237
238
|
}
|