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
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
// ═══════════════════════════════════════════
|
|
4
4
|
//
|
|
5
5
|
// A session with a budget (assistant-budget.js) divides what is left across
|
|
6
|
-
//
|
|
6
|
+
// the buckets of the providers it can meter: claude-code, codex, opencode. A
|
|
7
|
+
// provider that reports no price (antigravity: tokens only) has a bucket that
|
|
8
|
+
// never takes a share: under a budget its runs are refused, under No limit
|
|
9
|
+
// they run and only their spend (none) is shown. A provider's
|
|
7
10
|
// runs draw from its share; the Assistant's own turns (brain turns, direct and
|
|
8
11
|
// continuation routes) draw from the share of the brain's provider, which
|
|
9
12
|
// keeps a reserve for them that the workers on that provider cannot spend.
|
|
@@ -22,8 +25,16 @@
|
|
|
22
25
|
import { listedCount, priceText, providerAllHidden, providerEmpty, rowIsHidden, findModel, defaultModelRow } from './assistant-catalog.js';
|
|
23
26
|
import { BUDGET_WARN_RATIO, floorCents, roundUsd } from './assistant-budget.js';
|
|
24
27
|
|
|
25
|
-
export const BUDGET_PROVIDERS = Object.freeze(['claude-code', 'codex', 'opencode']);
|
|
26
|
-
export const PROVIDER_LABELS = Object.freeze({ 'claude-code': 'Claude Code', codex: 'Codex', opencode: 'OpenCode' });
|
|
28
|
+
export const BUDGET_PROVIDERS = Object.freeze(['claude-code', 'codex', 'opencode', 'antigravity']);
|
|
29
|
+
export const PROVIDER_LABELS = Object.freeze({ 'claude-code': 'Claude Code', codex: 'Codex', opencode: 'OpenCode', antigravity: 'Antigravity' });
|
|
30
|
+
/**
|
|
31
|
+
* Providers whose spend no budget can hold: they report tokens, never prices (Antigravity is billed by its Google
|
|
32
|
+
* sign-in). Under a budget they take no share, never cover work and their runs are refused (BUDGET_UNPRICED).
|
|
33
|
+
*/
|
|
34
|
+
export const UNPRICED_PROVIDERS = Object.freeze(['antigravity']);
|
|
35
|
+
export const isUnpricedProvider = (provider) => UNPRICED_PROVIDERS.includes(provider);
|
|
36
|
+
/** Why a budget cannot hold an unpriced provider's runs, in one phrase. */
|
|
37
|
+
export const UNPRICED_PROVIDER_REASON = 'Antigravity reports tokens, not prices';
|
|
27
38
|
|
|
28
39
|
// The brain's reserve inside its provider's share: 10 % of what is left, at least $0.50 (never more than is left).
|
|
29
40
|
export const BRAIN_FLOOR_RATIO = 0.1;
|
|
@@ -48,6 +59,8 @@ const arr = (value) => (Array.isArray(value) ? value : []);
|
|
|
48
59
|
const num = (value, fallback = 0) => (Number.isFinite(Number(value)) ? Number(value) : fallback);
|
|
49
60
|
const r8 = (value) => Number((Number(value) || 0).toFixed(8));
|
|
50
61
|
const isProvider = (value) => BUDGET_PROVIDERS.includes(value);
|
|
62
|
+
/** Can the provider take a share? Not when it is ineligible, nor ever when it reports no prices (whatever `eligible` says). */
|
|
63
|
+
const canTake = (eligible, provider) => !isUnpricedProvider(provider) && eligible?.[provider]?.eligible !== false;
|
|
51
64
|
|
|
52
65
|
// ── buckets ───────────────────────────────────────────────────────────────
|
|
53
66
|
|
|
@@ -56,14 +69,15 @@ const isProvider = (value) => BUDGET_PROVIDERS.includes(value);
|
|
|
56
69
|
* no_models the user disabled every model, or the provider answered with none connected
|
|
57
70
|
* signed_out every account of the provider is signed out
|
|
58
71
|
* limited every signed-in account is out of subscription usage
|
|
72
|
+
* unpriced the provider reports no prices (UNPRICED_PROVIDERS): a budget cannot hold its spend
|
|
59
73
|
* A provider whose model list is merely unavailable stays eligible (routing is lenient there too). The
|
|
60
74
|
* brain's provider is always eligible (its turns are paid from it); `reason` then says what else is wrong.
|
|
61
75
|
*/
|
|
62
76
|
export function bucketEligibility({ catalog = null, accounts = null, brainProvider = null } = {}) {
|
|
63
77
|
const out = {};
|
|
64
78
|
for (const provider of BUDGET_PROVIDERS) {
|
|
65
|
-
let reason = null;
|
|
66
|
-
if (catalog) {
|
|
79
|
+
let reason = isUnpricedProvider(provider) ? 'unpriced' : null;
|
|
80
|
+
if (!reason && catalog) {
|
|
67
81
|
if (providerEmpty(catalog, provider) || providerAllHidden(catalog, provider)) reason = 'no_models';
|
|
68
82
|
else if (listedCount(catalog, provider) > 0 || arr(catalog.models?.[provider]).length) {
|
|
69
83
|
const usable = arr(catalog.models?.[provider]).filter((row) => !rowIsHidden(catalog, { ...row, provider: row.provider || provider }) && row.status !== 'unavailable');
|
|
@@ -115,11 +129,13 @@ export function priceLabel(row, price) {
|
|
|
115
129
|
}
|
|
116
130
|
/**
|
|
117
131
|
* How the work is paid for: 'free' (a free model), 'api' (an API key, or OpenCode's own providers), 'plan'
|
|
118
|
-
* (a Claude / ChatGPT subscription
|
|
132
|
+
* (a Claude / ChatGPT subscription, or Antigravity's Google sign-in, which reports no price at all).
|
|
133
|
+
* `account`: the account row the work would run under, when known.
|
|
119
134
|
*/
|
|
120
135
|
export function billingOf(provider, price, account = null) {
|
|
121
136
|
if (isFreePrice(price)) return 'free';
|
|
122
137
|
if (provider === 'opencode') return 'api';
|
|
138
|
+
if (provider === 'antigravity') return 'plan';
|
|
123
139
|
if (account?.mode === 'apiKey') return 'api';
|
|
124
140
|
return 'plan';
|
|
125
141
|
}
|
|
@@ -149,7 +165,7 @@ export function fallbackWeights({
|
|
|
149
165
|
const weights = Object.fromEntries(BUDGET_PROVIDERS.map((p) => [p, 0]));
|
|
150
166
|
const brainProvider = isProvider(brain?.provider) ? brain.provider : null;
|
|
151
167
|
const price = (provider, model) => priceIndex(listPriceOf(rowOf(catalog, provider, model), { pricing, provider, model }));
|
|
152
|
-
const add = (provider, model, weight) => { if (isProvider(provider) && eligible
|
|
168
|
+
const add = (provider, model, weight) => { if (isProvider(provider) && canTake(eligible, provider)) weights[provider] += weight * price(provider, model); };
|
|
153
169
|
const prefs = routing?.preferences && typeof routing.preferences === 'object' ? routing.preferences : {};
|
|
154
170
|
for (const taskClass of classes) {
|
|
155
171
|
// Chat always runs here, on the brain, whatever its saved route says (assistant-router.js evaluateRoute).
|
|
@@ -161,8 +177,8 @@ export function fallbackWeights({
|
|
|
161
177
|
if (task?.provider) add(task.provider, task.model || null, 3 * classWeight(task.taskClass));
|
|
162
178
|
if (brainProvider) add(brainProvider, brain?.model || null, 2);
|
|
163
179
|
for (const run of arr(liveRuns)) add(run?.provider, run?.model || null, classWeight(run?.taskClass));
|
|
164
|
-
for (const provider of arr(needs)) if (isProvider(provider) && eligible
|
|
165
|
-
const pool = BUDGET_PROVIDERS.filter((p) => eligible
|
|
180
|
+
for (const provider of arr(needs)) if (isProvider(provider) && canTake(eligible, provider) && weights[provider] <= 0) weights[provider] = Math.max(weights[provider], price(provider, null) > 0 ? 1 : 0);
|
|
181
|
+
const pool = BUDGET_PROVIDERS.filter((p) => canTake(eligible, p));
|
|
166
182
|
if (pool.length && pool.every((p) => !(weights[p] > 0))) for (const p of pool) weights[p] = 1;
|
|
167
183
|
return weights;
|
|
168
184
|
}
|
|
@@ -201,7 +217,7 @@ export function jevWeights(judgment, eligible = {}) {
|
|
|
201
217
|
if (!scores || typeof scores !== 'object') return null;
|
|
202
218
|
const out = Object.fromEntries(BUDGET_PROVIDERS.map((p) => [p, 0]));
|
|
203
219
|
for (const provider of BUDGET_PROVIDERS) {
|
|
204
|
-
if (eligible
|
|
220
|
+
if (!canTake(eligible, provider)) continue;
|
|
205
221
|
const share = shareFromScore(scores[provider]);
|
|
206
222
|
if (share === null) return null;
|
|
207
223
|
out[provider] = Math.max(0, share);
|
|
@@ -239,7 +255,7 @@ export function apportion(total, parts) {
|
|
|
239
255
|
*/
|
|
240
256
|
export function divideLeft({ leftUsd = 0, weights = {}, eligible = {}, brainProvider = null } = {}) {
|
|
241
257
|
const leftCents = floorCents(leftUsd);
|
|
242
|
-
const pool = BUDGET_PROVIDERS.filter((p) => eligible
|
|
258
|
+
const pool = BUDGET_PROVIDERS.filter((p) => canTake(eligible, p));
|
|
243
259
|
const zero = Object.fromEntries(BUDGET_PROVIDERS.map((p) => [p, 0]));
|
|
244
260
|
if (!leftCents || !pool.length) return { allocCents: zero, leftCents, brainFloorCents: 0, floorsCents: { ...zero } };
|
|
245
261
|
const parts = Object.fromEntries(pool.map((p) => [p, Math.max(0, num(weights[p]))]));
|
|
@@ -298,6 +314,11 @@ export function coverageOf({ amountUsd = 0, split = null, spend = null, brainPro
|
|
|
298
314
|
const providers = {};
|
|
299
315
|
for (const provider of BUDGET_PROVIDERS) {
|
|
300
316
|
const used = providerSpendOf(spend, provider);
|
|
317
|
+
// An unpriced provider can spend nothing a budget could hold, split or not.
|
|
318
|
+
if (isUnpricedProvider(provider)) {
|
|
319
|
+
providers[provider] = { ...used, shareUsd: split ? 0 : null, leftUsd: 0, workerLeftUsd: 0, eligible: false };
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
301
322
|
const eligible = split ? split.eligible?.[provider]?.eligible !== false : true;
|
|
302
323
|
if (!split) {
|
|
303
324
|
providers[provider] = { ...used, shareUsd: null, leftUsd, workerLeftUsd: leftUsd, eligible };
|
|
@@ -327,16 +348,22 @@ export function coverageOf({ amountUsd = 0, split = null, spend = null, brainPro
|
|
|
327
348
|
export function coversWork(coverage, { provider, forBrain = false, free = false, minUsd = MIN_SPEND_USD } = {}) {
|
|
328
349
|
if (!coverage) return true;
|
|
329
350
|
if (coverage.leftUsd < minUsd) return false;
|
|
351
|
+
// A budget cannot hold what is never priced.
|
|
352
|
+
if (isUnpricedProvider(provider)) return false;
|
|
330
353
|
if (free) return true;
|
|
331
354
|
const row = coverage.providers?.[provider];
|
|
332
355
|
if (!row) return false;
|
|
333
356
|
return (forBrain ? row.leftUsd : row.workerLeftUsd) >= minUsd;
|
|
334
357
|
}
|
|
335
358
|
|
|
336
|
-
/**
|
|
359
|
+
/**
|
|
360
|
+
* The providers whose share is used up for workers (or ineligible), in BUDGET_PROVIDERS order. An unpriced
|
|
361
|
+
* provider is never among them: it has no share to run out of (its runs are refused under a budget for that).
|
|
362
|
+
*/
|
|
337
363
|
export function dryProviders(coverage, { minUsd = MIN_SPEND_USD } = {}) {
|
|
338
|
-
|
|
339
|
-
|
|
364
|
+
const metered = BUDGET_PROVIDERS.filter((p) => !isUnpricedProvider(p));
|
|
365
|
+
if (!coverage?.hasSplit) return coverage && coverage.leftUsd < minUsd ? metered : [];
|
|
366
|
+
return metered.filter((p) => !coverage.providers[p] || coverage.providers[p].workerLeftUsd < minUsd);
|
|
340
367
|
}
|
|
341
368
|
|
|
342
369
|
// ── the view (API, live packet, agent_usage) ──────────────────────────────
|
|
@@ -380,7 +407,7 @@ export function budgetView({ sessionId = null, setting = null, coverage = null,
|
|
|
380
407
|
const judged = split?.jev?.scores?.[provider] || null;
|
|
381
408
|
return {
|
|
382
409
|
provider, label: PROVIDER_LABELS[provider],
|
|
383
|
-
eligible: row.eligible, reason: split?.eligible?.[provider]?.reason || null,
|
|
410
|
+
eligible: row.eligible, reason: split?.eligible?.[provider]?.reason || (isUnpricedProvider(provider) ? 'unpriced' : null),
|
|
384
411
|
isBrain: provider === (cov.brainProvider || split?.brainProvider || null),
|
|
385
412
|
shareUsd: row.shareUsd === null ? null : roundUsd(row.shareUsd),
|
|
386
413
|
spentUsd: roundUsd(row.spentUsd), brainSpentUsd: roundUsd(row.brainUsd), runsSpentUsd: roundUsd(row.runsUsd),
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
import { EXTERNAL_SERVER_LIMITATIONS } from './mcp-external-servers.js';
|
|
2
|
+
import { toolCatalogView } from '../../mcp-server/dist/services/tool-catalog.js';
|
|
1
3
|
// ═══════════════════════════════════════════
|
|
2
4
|
// SynaBun — Assistant model catalog (providers · models · tier · price · vision)
|
|
3
5
|
// ═══════════════════════════════════════════
|
|
4
6
|
//
|
|
5
7
|
// One normalized view of every model the assistant can route to: Claude Code
|
|
6
|
-
// (CLI model list), Codex (app-server model/list)
|
|
7
|
-
// serve's /provider, connected providers only)
|
|
8
|
+
// (CLI model list), Codex (app-server model/list), OpenCode (the shared
|
|
9
|
+
// serve's /provider, connected providers only) and Antigravity (what an ACP
|
|
10
|
+
// session of its own CLI offers; a brain and a worker, unpriced). Claude and Codex rows are
|
|
8
11
|
// priced from the one list-price table (assistant-pricing.js), the same one
|
|
9
12
|
// the usage ledger prices tokens with; OpenCode rows carry the price the serve
|
|
10
13
|
// reports. A Codex row keeps `price: null` (plan billing: routing treats it as
|
|
@@ -18,7 +21,7 @@
|
|
|
18
21
|
//
|
|
19
22
|
// Which models exist is never decided here. Each provider's rows are the list
|
|
20
23
|
// its own model selector reads (/api/claude/models, /api/codex/models,
|
|
21
|
-
// /api/opencode/providers/full); the static tables (prices, tier hints, the 1M
|
|
24
|
+
// /api/opencode/providers/full, /api/antigravity/models); the static tables (prices, tier hints, the 1M
|
|
22
25
|
// rule) only describe a row. A model the provider lists and no table knows is
|
|
23
26
|
// offered with what is unknown left unknown; a model only a table knows is
|
|
24
27
|
// never offered. `sources` says how each provider's list was obtained.
|
|
@@ -26,8 +29,12 @@
|
|
|
26
29
|
import { sortEfforts, variantNames } from './effort-levels.js';
|
|
27
30
|
import { listPrice } from './assistant-pricing.js';
|
|
28
31
|
|
|
29
|
-
export const CATALOG_PROVIDERS = ['claude-code', 'codex', 'opencode'];
|
|
32
|
+
export const CATALOG_PROVIDERS = ['claude-code', 'codex', 'opencode', 'antigravity'];
|
|
33
|
+
/** The providers an Assistant brain can run on (every provider of the catalog: each is a worker too). */
|
|
34
|
+
export const BRAIN_PROVIDERS = Object.freeze(['claude-code', 'codex', 'opencode', 'antigravity']);
|
|
30
35
|
export const TIERS = ['small', 'medium', 'large'];
|
|
36
|
+
/** The thinking levels Antigravity accepts, for a model whose row names none of its own. */
|
|
37
|
+
export const ANTIGRAVITY_EFFORTS = Object.freeze(['low', 'medium', 'high', 'xhigh', 'max']);
|
|
31
38
|
|
|
32
39
|
const SMALL_HINTS = /(haiku|mini|nano|flash|lite|luna|small|tiny|\bair\b|[:\-_ ](1|2|3|4|7|8|9|12|14|20|24|27|30|32)b\b)/i;
|
|
33
40
|
const LARGE_HINTS = /(opus|fable|astra|ultra|\bpro\b|-pro\b|large|[:\-_ ](1\d\d|[2-9]\d\d)b\b|-sol\b)/i;
|
|
@@ -149,7 +156,8 @@ export function withClaudeContextVariants(rows) {
|
|
|
149
156
|
|
|
150
157
|
/** Tier guess: name hints first, then output-price bands. */
|
|
151
158
|
export function guessTier(row = {}) {
|
|
152
|
-
|
|
159
|
+
// "Gemini" holds the small hint "mini": the family's name says nothing of its size (gemini-2.5-pro is not small).
|
|
160
|
+
const name = `${row.id || ''} ${row.label || ''} ${row.upstream || ''}`.replace(/gemini/gi, ' ');
|
|
153
161
|
if (SMALL_HINTS.test(name)) return 'small';
|
|
154
162
|
if (LARGE_HINTS.test(name)) return 'large';
|
|
155
163
|
if (MEDIUM_HINTS.test(name)) return 'medium';
|
|
@@ -322,6 +330,43 @@ export function normalizeCodexRows(rows, { priceOf = null } = {}) {
|
|
|
322
330
|
});
|
|
323
331
|
}
|
|
324
332
|
|
|
333
|
+
/**
|
|
334
|
+
* Antigravity's own model list (GET /api/antigravity/models: { id, label, description?, default?, efforts? }) →
|
|
335
|
+
* rows. Antigravity is billed by its Google sign-in and reports tokens, not prices: `price` stays null and its
|
|
336
|
+
* runs are unpriced. A row without levels of its own takes the five Antigravity accepts. The tier is guessed from
|
|
337
|
+
* the name like every provider's (guessTier). `via: 'acp'` (the list an ACP session offered, lib/antigravity/
|
|
338
|
+
* catalog.js): SynaBun hands such a model images as ACP image blocks, which agy passes on (measured on agy 1.4.12
|
|
339
|
+
* with Gemini 3.8 Flash and 4 Argon), so it can see; a list `agy models` gave says nothing about that. Outputs and the
|
|
340
|
+
* context window stay unknown.
|
|
341
|
+
*/
|
|
342
|
+
export function normalizeAntigravityRows(rows, { via = null } = {}) {
|
|
343
|
+
const sees = via === 'acp';
|
|
344
|
+
const seen = new Set();
|
|
345
|
+
const out = [];
|
|
346
|
+
for (const raw of arr(rows)) {
|
|
347
|
+
const m = typeof raw === 'string' ? { id: raw } : raw;
|
|
348
|
+
const id = typeof m?.id === 'string' ? m.id.trim() : '';
|
|
349
|
+
if (!id || seen.has(id)) continue;
|
|
350
|
+
seen.add(id);
|
|
351
|
+
const own = sortEfforts(arr(m.efforts));
|
|
352
|
+
const row = {
|
|
353
|
+
provider: 'antigravity', id, upstream: id, label: String(m.label || m.name || id), family: null,
|
|
354
|
+
tier: null, vision: sees ? true : null, visionSource: sees ? 'acp' : 'unknown',
|
|
355
|
+
outputs: { image: null, video: null }, outputsSource: 'unknown',
|
|
356
|
+
reasoning: null, toolcall: null, contextWindow: null,
|
|
357
|
+
price: null,
|
|
358
|
+
efforts: own.length ? own : [...ANTIGRAVITY_EFFORTS], defaultEffort: null,
|
|
359
|
+
isDefault: m.default === true || m.isDefault === true,
|
|
360
|
+
status: 'active',
|
|
361
|
+
description: m.description ? String(m.description) : null,
|
|
362
|
+
};
|
|
363
|
+
row.tier = guessTier(row);
|
|
364
|
+
row.tierSource = 'guess';
|
|
365
|
+
out.push(row);
|
|
366
|
+
}
|
|
367
|
+
return out;
|
|
368
|
+
}
|
|
369
|
+
|
|
325
370
|
/** The ids the user hid for `provider` (catalog.hidden, else the older opencodeHidden). */
|
|
326
371
|
function hiddenList(catalog, provider) {
|
|
327
372
|
const map = catalog?.hidden;
|
|
@@ -490,9 +535,10 @@ function ctxText(ctx) {
|
|
|
490
535
|
|
|
491
536
|
/** One routing-sheet line: `id · tier · $in/$out · vision · image-out · video-out · ctx · efforts`. */
|
|
492
537
|
export function formatModelLine(row) {
|
|
493
|
-
// Only Codex bills a plan; any other row without a price is a
|
|
538
|
+
// Only Codex bills a plan; Antigravity reports tokens, never prices; any other row without a price is a
|
|
539
|
+
// model no table prices yet.
|
|
494
540
|
const planBilled = row.provider === 'codex' || !!row.listPrice;
|
|
495
|
-
const parts = [row.id, row.tier || '?', row.price || planBilled ? priceText(row.price, row.listPrice) : 'price unknown'];
|
|
541
|
+
const parts = [row.id, row.tier || '?', row.price || planBilled ? priceText(row.price, row.listPrice) : row.provider === 'antigravity' ? 'unpriced' : 'price unknown'];
|
|
496
542
|
if (row.vision) parts.push('vision');
|
|
497
543
|
if (rowMakes(row, 'image')) parts.push('image-out');
|
|
498
544
|
if (rowMakes(row, 'video')) parts.push('video-out');
|
|
@@ -556,7 +602,8 @@ export function selectSheetModels(catalog, { brain = {}, preferences = {}, max =
|
|
|
556
602
|
else if (current.id === 'default' && row.upstream === current.upstream) families.set(family, row);
|
|
557
603
|
}
|
|
558
604
|
for (const row of families.values()) add(row);
|
|
559
|
-
} else if (provider === 'codex') {
|
|
605
|
+
} else if (provider === 'codex' || provider === 'antigravity') {
|
|
606
|
+
// Short lists, and Antigravity's rows carry no tier or price to sample by.
|
|
560
607
|
for (const row of rows) add(row);
|
|
561
608
|
} else {
|
|
562
609
|
const upstream = brain?.provider === 'opencode' && brain?.model ? String(brain.model).split('/')[0] : null;
|
|
@@ -610,6 +657,7 @@ export function compactRow(row) {
|
|
|
610
657
|
*/
|
|
611
658
|
export function createAssistantCatalog({
|
|
612
659
|
fetchJson,
|
|
660
|
+
getExternalServers = () => [],
|
|
613
661
|
claudePricing = null,
|
|
614
662
|
codexPrice = (model) => listPrice('codex', model),
|
|
615
663
|
listAccounts = () => ({}),
|
|
@@ -656,17 +704,30 @@ export function createAssistantCatalog({
|
|
|
656
704
|
return JSON.stringify(arr(rows).map((row) => [row.id, row.label, row.upstream || '', row.status || '', row.contextWindow || 0, arr(row.efforts).join(',')]));
|
|
657
705
|
}
|
|
658
706
|
|
|
707
|
+
/**
|
|
708
|
+
* Antigravity's answer: its endpoint says itself how the list was obtained ('live', 'stale': its own last
|
|
709
|
+
* list while the CLI does not answer, 'unavailable'). No answer, a refusal or an unavailable list: no rows.
|
|
710
|
+
*/
|
|
711
|
+
function antigravityList(payload) {
|
|
712
|
+
if (!payload || typeof payload !== 'object' || payload.ok === false) return { list: [], state: 'unavailable' };
|
|
713
|
+
const said = String(payload.source || '').toLowerCase();
|
|
714
|
+
// Whether Antigravity is signed in, and on which plan, as its last listing said (null: not known).
|
|
715
|
+
const signIn = { signedIn: payload.signedIn === true ? true : payload.signedIn === false || payload.authRequired === true ? false : null, tier: typeof payload.tier === 'string' ? payload.tier : null };
|
|
716
|
+
if (said === 'unavailable') return { list: [], state: 'unavailable', via: null, ...signIn };
|
|
717
|
+
const list = pickArray(payload, ['models']);
|
|
718
|
+
return { list, state: said === 'stale' ? 'stale' : list.length || said === 'live' ? 'live' : 'unavailable', via: typeof payload.via === 'string' ? payload.via : null, ...signIn };
|
|
719
|
+
}
|
|
720
|
+
|
|
659
721
|
async function build({ deep = false } = {}) {
|
|
660
722
|
// `deep` also drops the providers' own discovery caches (a CLI or app-server round trip).
|
|
661
723
|
const fresh = deep ? '?refresh=1' : '';
|
|
662
|
-
const [claudeModels, codexModels, opencodeProviders,
|
|
724
|
+
const [claudeModels, codexModels, opencodeProviders, antigravityModels, projects] = await Promise.all([
|
|
663
725
|
fetchJson(`/api/claude/models${fresh}`), fetchJson(`/api/codex/models${fresh}`), fetchJson('/api/opencode/providers/full'),
|
|
664
|
-
|
|
726
|
+
// A provider that does not answer is unavailable for this build, never a failed build.
|
|
727
|
+
Promise.resolve().then(() => fetchJson(`/api/antigravity/models${fresh}`)).catch(() => null),
|
|
728
|
+
fetchJson('/api/projects'),
|
|
665
729
|
]);
|
|
666
730
|
const filter = (() => { try { return readFilter() || {}; } catch { return {}; } })();
|
|
667
|
-
const presets = mcpProfile?.presets && typeof mcpProfile.presets === 'object'
|
|
668
|
-
? Object.entries(mcpProfile.presets).map(([name, preset]) => ({ name, label: preset?.label || name, groups: preset?.groups || [], tools: preset?.tools || null }))
|
|
669
|
-
: [];
|
|
670
731
|
let accounts = {};
|
|
671
732
|
try { accounts = listAccounts() || {}; } catch (error) { log('catalog:accounts-error', error?.message || String(error)); }
|
|
672
733
|
// Models the user hid (Assistant → Models, Settings → OpenCode) never reach
|
|
@@ -680,17 +741,20 @@ export function createAssistantCatalog({
|
|
|
680
741
|
})();
|
|
681
742
|
const claude = settle('claude-code', claudeModels);
|
|
682
743
|
const codex = settle('codex', codexModels);
|
|
744
|
+
const antigravity = antigravityList(antigravityModels);
|
|
683
745
|
// OpenCode is read from its serve on every build; while it is down its models are unknown, not remembered.
|
|
684
746
|
const sources = {
|
|
685
747
|
'claude-code': claude.state,
|
|
686
748
|
codex: codex.state,
|
|
687
749
|
opencode: opencodeProviders && opencodeProviders.ok !== false ? 'live' : 'unavailable',
|
|
750
|
+
antigravity: antigravity.state,
|
|
688
751
|
};
|
|
689
752
|
for (const p of ['claude-code', 'codex']) if (sources[p] !== 'live') log('catalog:source', `${p}: ${sources[p]}`);
|
|
690
753
|
const all = {
|
|
691
754
|
'claude-code': withClaudeContextVariants(normalizeClaudeRows(claude.list, { pricing: claudePricing })),
|
|
692
755
|
codex: normalizeCodexRows(codex.list, { priceOf: codexPrice }),
|
|
693
756
|
opencode: parseOpenCodeProviders(opencodeProviders, { filter: filter.opencode || null }),
|
|
757
|
+
antigravity: normalizeAntigravityRows(antigravity.list, { via: antigravity.via }),
|
|
694
758
|
};
|
|
695
759
|
// A hidden alias hides the model it named when it was hidden. With the rows at hand the
|
|
696
760
|
// store settles that: an alias that moved on is shown again and its old model stays hidden.
|
|
@@ -737,14 +801,16 @@ export function createAssistantCatalog({
|
|
|
737
801
|
opencodeListed: listedCounts.opencode,
|
|
738
802
|
opencodeHidden: hidden.opencode,
|
|
739
803
|
projects: pickArray(projects, ['projects']),
|
|
740
|
-
|
|
741
|
-
mcpProfiles: { presets, default: mcpProfile?.defaultProfile || mcpProfile?.profile || 'full' },
|
|
804
|
+
tools: { ...toolCatalogView(), servers: getExternalServers(pickArray(projects, ['projects'])), externalServerLimitations: EXTERNAL_SERVER_LIMITATIONS },
|
|
742
805
|
accounts,
|
|
743
806
|
// Efforts are per model (row.efforts); a provider's list is the union of its rows'.
|
|
744
807
|
providers: [
|
|
745
808
|
{ id: 'claude-code', brain: true, efforts: providerEfforts(models['claude-code']), permissionPolicies: ['auto', 'ask'] },
|
|
746
809
|
{ id: 'codex', brain: true, efforts: providerEfforts(models.codex), permissionPolicies: ['auto', 'restricted'] },
|
|
747
810
|
{ id: 'opencode', brain: true, efforts: providerEfforts(models.opencode), permissionPolicies: ['auto', 'ask'] },
|
|
811
|
+
// A brain and a worker. No accounts (Antigravity signs in with Google in its own CLI: `signedIn` and `tier`
|
|
812
|
+
// say what its last model listing found) and unpriced (tokens, not prices).
|
|
813
|
+
{ id: 'antigravity', brain: true, efforts: providerEfforts(models.antigravity), permissionPolicies: ['auto', 'ask'], accounts: false, priced: false, signedIn: antigravity.signedIn, tier: antigravity.tier },
|
|
748
814
|
],
|
|
749
815
|
};
|
|
750
816
|
}
|
|
@@ -17,7 +17,9 @@ import { normalizeUserContext, USER_CONTEXT_DEFAULTS } from './assistant-user-co
|
|
|
17
17
|
|
|
18
18
|
export const ROUTE_MODES = ['always-ask', 'ask-unsure', 'never'];
|
|
19
19
|
export const PREFERENCE_KINDS = ['direct', 'dispatch'];
|
|
20
|
-
export const ROUTE_PROVIDERS = ['claude-code', 'codex', 'opencode'];
|
|
20
|
+
export const ROUTE_PROVIDERS = ['claude-code', 'codex', 'opencode', 'antigravity'];
|
|
21
|
+
/** The route providers whose targets name an account (OpenCode has none of its own; Antigravity signs in with Google in its CLI). */
|
|
22
|
+
export const ROUTE_ACCOUNT_PROVIDERS = ['claude-code', 'codex'];
|
|
21
23
|
|
|
22
24
|
export const DEFAULT_ROUTING = Object.freeze({
|
|
23
25
|
defaultMode: 'ask-unsure',
|
|
@@ -51,13 +53,14 @@ function routingError(field, message) {
|
|
|
51
53
|
function cleanTarget(field, target) {
|
|
52
54
|
if (target === null) return null;
|
|
53
55
|
if (!target || typeof target !== 'object') throw routingError(field, `routing.${field} must be an object or null`);
|
|
54
|
-
const kind = PREFERENCE_KINDS.includes(target.kind) ? target.kind : 'dispatch';
|
|
55
56
|
const provider = String(target.provider || '').trim();
|
|
56
57
|
if (!ROUTE_PROVIDERS.includes(provider)) throw routingError(`${field}.provider`, `routing.${field}.provider must be one of ${ROUTE_PROVIDERS.join(', ')}`);
|
|
58
|
+
// Every provider can be the brain now (Antigravity included), so a route keeps the kind it was saved with.
|
|
59
|
+
const kind = PREFERENCE_KINDS.includes(target.kind) ? target.kind : 'dispatch';
|
|
57
60
|
const out = { kind, provider, model: target.model ? String(target.model).slice(0, 200) : null, effort: target.effort ? String(target.effort).slice(0, 40) : null };
|
|
58
61
|
if (target.accountId != null && target.accountId !== '') {
|
|
59
62
|
if (typeof target.accountId !== 'string' || !/^[a-z0-9-]{1,64}$/.test(target.accountId)) throw routingError(`${field}.accountId`, 'Invalid route account id');
|
|
60
|
-
if (provider
|
|
63
|
+
if (ROUTE_ACCOUNT_PROVIDERS.includes(provider)) out.accountId = target.accountId;
|
|
61
64
|
}
|
|
62
65
|
if (target.label) out.label = String(target.label).slice(0, 120);
|
|
63
66
|
if (target.at) out.at = String(target.at).slice(0, 40);
|