@gajae-code/coding-agent 0.10.2 → 0.11.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 +50 -2
- package/dist/types/append-only-mode.d.ts +1 -1
- package/dist/types/cli/args.d.ts +4 -5
- package/dist/types/cli/daemon-cli.d.ts +12 -1
- package/dist/types/cli/notify-cli.d.ts +21 -1
- package/dist/types/cli.d.ts +3 -0
- package/dist/types/commands/daemon.d.ts +39 -0
- package/dist/types/commands/launch.d.ts +3 -0
- package/dist/types/commands/notify.d.ts +28 -1
- package/dist/types/commands/sdk.d.ts +33 -0
- package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
- package/dist/types/config/model-profile-activation.d.ts +35 -15
- package/dist/types/config/model-profiles.d.ts +11 -5
- package/dist/types/config/model-registry.d.ts +3 -3
- package/dist/types/config/model-resolver.d.ts +39 -6
- package/dist/types/config/model-selector-value.d.ts +17 -0
- package/dist/types/config/models-config-schema.d.ts +10 -6
- package/dist/types/config/settings-schema.d.ts +133 -6
- package/dist/types/config/settings.d.ts +63 -35
- package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
- package/dist/types/coordinator-mcp/server.d.ts +6 -49
- package/dist/types/daemon/builtin.d.ts +6 -5
- package/dist/types/daemon/control-types.d.ts +1 -1
- package/dist/types/discovery/mcp-json.d.ts +12 -1
- package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
- package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
- package/dist/types/extensibility/extensions/loader.d.ts +10 -1
- package/dist/types/extensibility/extensions/runner.d.ts +3 -3
- package/dist/types/extensibility/extensions/types.d.ts +141 -16
- package/dist/types/extensibility/hooks/types.d.ts +1 -1
- package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
- package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
- package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
- package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
- package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
- package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
- package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
- package/dist/types/harness-control-plane/operate.d.ts +5 -5
- package/dist/types/harness-control-plane/owner.d.ts +18 -4
- package/dist/types/harness-control-plane/receipts.d.ts +0 -1
- package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
- package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
- package/dist/types/harness-control-plane/types.d.ts +3 -4
- package/dist/types/lsp/index.d.ts +1 -1
- package/dist/types/main.d.ts +32 -38
- package/dist/types/modes/acp/acp-agent.d.ts +224 -53
- package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
- package/dist/types/modes/acp/acp-mode.d.ts +6 -15
- package/dist/types/modes/acp/permission-mode.d.ts +4 -0
- package/dist/types/modes/acp/startup-options.d.ts +6 -0
- package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
- package/dist/types/modes/components/model-selector.d.ts +1 -0
- package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
- package/dist/types/modes/components/settings-selector.d.ts +6 -4
- package/dist/types/modes/components/welcome.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
- package/dist/types/modes/index.d.ts +0 -4
- package/dist/types/modes/interactive-mode.d.ts +3 -0
- package/dist/types/modes/runtime-init.d.ts +2 -2
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
- package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
- package/dist/types/modes/types.d.ts +5 -0
- package/dist/types/runtime-mcp/client.d.ts +2 -0
- package/dist/types/runtime-mcp/config.d.ts +5 -1
- package/dist/types/runtime-mcp/manager.d.ts +8 -1
- package/dist/types/runtime-mcp/types.d.ts +4 -0
- package/dist/types/sdk/acp/adapter.d.ts +67 -0
- package/dist/types/sdk/acp/index.d.ts +2 -0
- package/dist/types/sdk/broker/broker.d.ts +53 -0
- package/dist/types/sdk/broker/discovery.d.ts +30 -0
- package/dist/types/sdk/broker/ensure.d.ts +33 -0
- package/dist/types/sdk/broker/identity.d.ts +3 -0
- package/dist/types/sdk/broker/index.d.ts +8 -0
- package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
- package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
- package/dist/types/sdk/broker/runtime.d.ts +33 -0
- package/dist/types/sdk/broker/session-index.d.ts +57 -0
- package/dist/types/sdk/broker/state-version.d.ts +8 -0
- package/dist/types/sdk/broker/transport.d.ts +9 -0
- package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
- package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
- package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
- package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
- package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
- package/dist/types/sdk/bus/config.d.ts +274 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
- package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
- package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
- package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
- package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
- package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
- package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
- package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
- package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
- package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
- package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
- package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
- package/dist/types/sdk/bus/session-control.d.ts +83 -0
- package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
- package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
- package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
- package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
- package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
- package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
- package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
- package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
- package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
- package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
- package/dist/types/sdk/cli/index.d.ts +1 -0
- package/dist/types/sdk/cli/session-cli.d.ts +19 -0
- package/dist/types/sdk/client/client.d.ts +1 -0
- package/dist/types/sdk/client/discovery.d.ts +27 -0
- package/dist/types/sdk/client/index.d.ts +2 -0
- package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
- package/dist/types/sdk/host/control/index.d.ts +2 -0
- package/dist/types/sdk/host/control/operations.d.ts +65 -0
- package/dist/types/sdk/host/events.d.ts +35 -0
- package/dist/types/sdk/host/host.d.ts +35 -0
- package/dist/types/sdk/host/index.d.ts +4 -0
- package/dist/types/sdk/host/query/cursor.d.ts +62 -0
- package/dist/types/sdk/host/query/handlers.d.ts +70 -0
- package/dist/types/sdk/host/query/index.d.ts +3 -0
- package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
- package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
- package/dist/types/sdk/host/types.d.ts +32 -0
- package/dist/types/sdk/index.d.ts +6 -0
- package/dist/types/sdk/lifecycle-session.d.ts +14 -0
- package/dist/types/sdk/mcp/index.d.ts +1 -0
- package/dist/types/sdk/mcp/server.d.ts +37 -0
- package/dist/types/sdk/models.d.ts +44 -0
- package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
- package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
- package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
- package/dist/types/sdk/startup-capability.d.ts +50 -0
- package/dist/types/session/agent-session.d.ts +114 -21
- package/dist/types/session/default-model-selection.d.ts +25 -0
- package/dist/types/session/fallback-chain-controller.d.ts +52 -0
- package/dist/types/session/session-manager.d.ts +58 -1
- package/dist/types/setup/credential-auto-import.d.ts +36 -6
- package/dist/types/tools/ask-answer-registry.d.ts +1 -1
- package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
- package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
- package/dist/types/tools/browser/launch.d.ts +22 -0
- package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
- package/dist/types/tools/browser/profile-posture.d.ts +37 -0
- package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
- package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
- package/dist/types/tools/browser/registry.d.ts +19 -0
- package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
- package/dist/types/tools/index.d.ts +8 -8
- package/package.json +34 -13
- package/scripts/build-sdk-package-smoke.ts +94 -0
- package/scripts/capture-notifications-settings-showcase.ts +435 -0
- package/scripts/compile-args.ts +4 -2
- package/scripts/g005-daemon-smoke.ts +4 -5
- package/scripts/g011-daemon-path-smoke.ts +5 -5
- package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
- package/scripts/generate-sdk-operation-inventory.ts +867 -0
- package/scripts/generate-telegram-baseline-manifest.ts +128 -0
- package/scripts/manifest-schema.ts +124 -0
- package/scripts/run-test-manifest.ts +153 -0
- package/scripts/run-threat-model-check.ts +157 -0
- package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
- package/scripts/verify-gjc-sdk-rename.ts +90 -0
- package/src/append-only-mode.ts +1 -1
- package/src/cli/args.ts +43 -12
- package/src/cli/auth-gateway-cli.ts +2 -2
- package/src/cli/config-cli.ts +2 -1
- package/src/cli/daemon-cli.ts +63 -14
- package/src/cli/list-models.ts +1 -1
- package/src/cli/notify-cli.ts +288 -286
- package/src/cli.ts +21 -2
- package/src/commands/daemon.ts +50 -6
- package/src/commands/harness.ts +93 -36
- package/src/commands/launch.ts +5 -2
- package/src/commands/mcp-serve.ts +19 -12
- package/src/commands/notify.ts +36 -3
- package/src/commands/sdk.ts +426 -0
- package/src/commit/agentic/agent.ts +1 -0
- package/src/config/atomic-yaml-patch.ts +423 -0
- package/src/config/model-profile-activation.ts +240 -89
- package/src/config/model-profiles.ts +18 -15
- package/src/config/model-registry.ts +51 -26
- package/src/config/model-resolver.ts +138 -51
- package/src/config/model-selector-value.ts +50 -0
- package/src/config/models-config-schema.ts +14 -21
- package/src/config/settings-schema.ts +128 -10
- package/src/config/settings.ts +1120 -158
- package/src/coordinator-mcp/model-preset.ts +74 -20
- package/src/coordinator-mcp/server.ts +1597 -3052
- package/src/daemon/builtin.ts +8 -5
- package/src/daemon/control-types.ts +1 -1
- package/src/defaults/gjc/skills/team/SKILL.md +4 -4
- package/src/discovery/mcp-json.ts +327 -20
- package/src/extensibility/custom-tools/types.ts +1 -1
- package/src/extensibility/extensions/compact-handler.ts +3 -3
- package/src/extensibility/extensions/get-commands-handler.ts +2 -2
- package/src/extensibility/extensions/loader.ts +69 -5
- package/src/extensibility/extensions/runner.ts +112 -4
- package/src/extensibility/extensions/types.ts +176 -17
- package/src/extensibility/hooks/types.ts +1 -1
- package/src/gjc-runtime/launch-tmux.ts +170 -86
- package/src/gjc-runtime/psmux-detect.ts +82 -4
- package/src/gjc-runtime/session-state-sidecar.ts +41 -31
- package/src/gjc-runtime/team-runtime.ts +54 -35
- package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
- package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
- package/src/gjc-runtime/tmux-sessions.ts +19 -13
- package/src/gjc-runtime/ultragoal-guard.ts +53 -6
- package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
- package/src/gjc-runtime/windows-powershell-command.ts +58 -0
- package/src/harness-control-plane/operate.ts +9 -9
- package/src/harness-control-plane/owner.ts +283 -39
- package/src/harness-control-plane/receipts.ts +0 -1
- package/src/harness-control-plane/sdk-transport.ts +395 -0
- package/src/harness-control-plane/session-transport.ts +94 -0
- package/src/harness-control-plane/types.ts +1 -1
- package/src/internal-urls/docs-index.generated.ts +34 -35
- package/src/lsp/client.ts +42 -6
- package/src/lsp/index.ts +2 -2
- package/src/main.ts +299 -204
- package/src/modes/DESIGN.md +258 -0
- package/src/modes/acp/acp-agent.ts +1228 -2612
- package/src/modes/acp/acp-client-bridge.ts +2 -20
- package/src/modes/acp/acp-event-mapper.ts +18 -2
- package/src/modes/acp/acp-mode.ts +8 -36
- package/src/modes/acp/permission-mode.ts +25 -0
- package/src/modes/acp/startup-options.ts +6 -0
- package/src/modes/components/agent-dashboard.ts +37 -17
- package/src/modes/components/model-selector.ts +93 -35
- package/src/modes/components/notifications-settings-editor.ts +1379 -0
- package/src/modes/components/settings-selector.ts +60 -11
- package/src/modes/components/welcome.ts +4 -4
- package/src/modes/controllers/command-controller.ts +1 -2
- package/src/modes/controllers/event-controller.ts +11 -16
- package/src/modes/controllers/extension-ui-controller.ts +348 -4
- package/src/modes/controllers/selector-controller.ts +674 -36
- package/src/modes/index.ts +0 -22
- package/src/modes/interactive-mode.ts +59 -20
- package/src/modes/runtime-init.ts +298 -6
- package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
- package/src/modes/shared/agent-wire/event-contract.ts +7 -8
- package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
- package/src/modes/shared/agent-wire/event-observation.ts +16 -7
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
- package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
- package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
- package/src/modes/types.ts +5 -0
- package/src/runtime-mcp/client.ts +94 -19
- package/src/runtime-mcp/config.ts +27 -15
- package/src/runtime-mcp/manager.ts +343 -105
- package/src/runtime-mcp/oauth-flow.ts +42 -12
- package/src/runtime-mcp/transports/http.ts +49 -19
- package/src/runtime-mcp/transports/stdio.ts +47 -28
- package/src/runtime-mcp/types.ts +10 -0
- package/src/sdk/acp/adapter.ts +418 -0
- package/src/sdk/acp/index.ts +2 -0
- package/src/sdk/broker/broker.ts +642 -0
- package/src/sdk/broker/discovery.ts +94 -0
- package/src/sdk/broker/ensure.ts +249 -0
- package/src/sdk/broker/identity.ts +42 -0
- package/src/sdk/broker/index.ts +8 -0
- package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
- package/src/sdk/broker/internal-source.bunfig.toml +1 -0
- package/src/sdk/broker/lifecycle-ledger.ts +286 -0
- package/src/sdk/broker/lifecycle.ts +2157 -0
- package/src/sdk/broker/process-incarnation.ts +159 -0
- package/src/sdk/broker/runtime.ts +164 -0
- package/src/sdk/broker/session-index.ts +318 -0
- package/src/sdk/broker/state-version.ts +23 -0
- package/src/sdk/broker/transport.ts +125 -0
- package/src/sdk/bus/chat-command-policy.ts +107 -0
- package/src/sdk/bus/chat-daemon-cli.ts +214 -0
- package/src/sdk/bus/chat-daemon-control.ts +713 -0
- package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
- package/src/sdk/bus/chat-effect-journal.ts +353 -0
- package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
- package/src/sdk/bus/config.ts +433 -0
- package/src/sdk/bus/conversation-store.ts +391 -0
- package/src/sdk/bus/discord-conversation.ts +85 -0
- package/src/sdk/bus/discord-daemon.ts +2275 -0
- package/src/sdk/bus/discord-live-provider.ts +521 -0
- package/src/sdk/bus/discord-provider.ts +56 -0
- package/src/{notifications → sdk/bus}/html-format.ts +2 -2
- package/src/sdk/bus/index.ts +3943 -0
- package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
- package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
- package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
- package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
- package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
- package/src/sdk/bus/natives-augment.d.ts +38 -0
- package/src/sdk/bus/notification-orchestration.ts +535 -0
- package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
- package/src/sdk/bus/session-control.ts +333 -0
- package/src/sdk/bus/slack-conversation.ts +74 -0
- package/src/sdk/bus/slack-daemon.ts +2144 -0
- package/src/sdk/bus/slack-live-provider.ts +380 -0
- package/src/sdk/bus/slack-provider.ts +76 -0
- package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
- package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
- package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
- package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
- package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
- package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
- package/src/sdk/bus/telegram-setup.ts +663 -0
- package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
- package/src/sdk/cli/index.ts +1 -0
- package/src/sdk/cli/session-cli.ts +275 -0
- package/src/sdk/client/client.ts +1 -0
- package/src/sdk/client/discovery.ts +108 -0
- package/src/sdk/client/index.ts +2 -0
- package/src/sdk/host/control/dispatch.ts +367 -0
- package/src/sdk/host/control/index.ts +10 -0
- package/src/sdk/host/control/operations.ts +63 -0
- package/src/sdk/host/events.ts +91 -0
- package/src/sdk/host/host.ts +296 -0
- package/src/sdk/host/index.ts +4 -0
- package/src/sdk/host/query/cursor.ts +189 -0
- package/src/sdk/host/query/handlers.ts +533 -0
- package/src/sdk/host/query/index.ts +3 -0
- package/src/sdk/host/query/revision-store.ts +1126 -0
- package/src/sdk/host/reverse-leases.ts +325 -0
- package/src/sdk/host/types.ts +29 -0
- package/src/sdk/index.ts +13 -0
- package/src/sdk/lifecycle-session.ts +39 -0
- package/src/sdk/mcp/index.ts +1 -0
- package/src/sdk/mcp/server.ts +332 -0
- package/src/sdk/models.ts +168 -0
- package/src/sdk/protocol/adapter-validation.ts +48 -0
- package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
- package/src/sdk/protocol/operation-registry.ts +312 -0
- package/src/{sdk.ts → sdk/session.ts} +339 -212
- package/src/sdk/startup-capability.ts +189 -0
- package/src/session/agent-session.ts +2453 -894
- package/src/session/default-model-selection.ts +93 -0
- package/src/session/fallback-chain-controller.ts +136 -0
- package/src/session/session-manager.ts +438 -11
- package/src/session/session-storage.ts +8 -1
- package/src/setup/credential-auto-import.ts +290 -35
- package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
- package/src/slash-commands/builtin-registry.ts +2 -1
- package/src/task/executor.ts +62 -13
- package/src/tools/ask-answer-registry.ts +1 -1
- package/src/tools/ask.ts +13 -8
- package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
- package/src/tools/browser/benchmark/detector-report.ts +157 -0
- package/src/tools/browser/benchmark/run-suite.ts +39 -0
- package/src/tools/browser/launch.ts +124 -19
- package/src/tools/browser/profile-discovery.ts +63 -0
- package/src/tools/browser/profile-posture.ts +59 -0
- package/src/tools/browser/profile-reuse.ts +102 -0
- package/src/tools/browser/profile-warmup.ts +109 -0
- package/src/tools/browser/registry.ts +87 -11
- package/src/tools/browser/tab-protocol.ts +1 -0
- package/src/tools/browser/tab-supervisor.ts +1 -0
- package/src/tools/browser/tab-worker.ts +1 -1
- package/src/tools/browser.ts +6 -0
- package/src/tools/index.ts +8 -8
- package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
- package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
- package/src/tools/telegram-send.ts +2 -2
- package/vendor/insane-search/MANIFEST.json +2 -1
- package/vendor/insane-search/engine/bias_check.py +4 -1
- package/vendor/insane-search/engine/phase0.py +26 -1
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
- package/dist/types/modes/bridge/auth.d.ts +0 -12
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
- package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
- package/dist/types/modes/bridge/event-stream.d.ts +0 -8
- package/dist/types/modes/rpc/host-tools.d.ts +0 -1
- package/dist/types/modes/rpc/host-uris.d.ts +0 -1
- package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
- package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
- package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
- package/dist/types/notifications/config.d.ts +0 -132
- package/src/harness-control-plane/rpc-adapter.ts +0 -290
- package/src/modes/bridge/auth.ts +0 -41
- package/src/modes/bridge/bridge-client-bridge.ts +0 -47
- package/src/modes/bridge/bridge-mode.ts +0 -675
- package/src/modes/bridge/bridge-ui-context.ts +0 -200
- package/src/modes/bridge/event-stream.ts +0 -70
- package/src/modes/rpc/host-tools.ts +0 -1
- package/src/modes/rpc/host-uris.ts +0 -1
- package/src/modes/rpc/rpc-client.ts +0 -1166
- package/src/modes/rpc/rpc-mode.ts +0 -1029
- package/src/modes/rpc/rpc-socket-security.ts +0 -115
- package/src/modes/rpc/rpc-types.ts +0 -637
- package/src/modes/shared/agent-wire/command-contract.ts +0 -18
- package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
- package/src/modes/shared/agent-wire/command-validation.ts +0 -181
- package/src/modes/shared/agent-wire/handshake.ts +0 -157
- package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
- package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
- package/src/modes/shared/agent-wire/protocol.ts +0 -46
- package/src/modes/shared/agent-wire/responses.ts +0 -17
- package/src/modes/shared/agent-wire/scopes.ts +0 -94
- package/src/modes/shared/agent-wire/session-registry.ts +0 -109
- package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
- package/src/modes/shared/agent-wire/ui-result.ts +0 -48
- package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
- package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
- package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
- package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
- package/src/notifications/config.ts +0 -219
- package/src/notifications/index.ts +0 -1835
- package/src/notifications/telegram-daemon-cli.ts +0 -243
- package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
- /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
- /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
- /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
- /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
- /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
- /package/src/{notifications → sdk/bus}/engine.ts +0 -0
- /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
- /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
- /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
- /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
- /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
- /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
- /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
type Api,
|
|
5
5
|
type AssistantMessageEventStream,
|
|
6
6
|
type AuthCredentialSelector,
|
|
7
|
+
applyFinalCodexGpt56ContextCap,
|
|
7
8
|
type CacheRetention,
|
|
8
9
|
type Context,
|
|
9
10
|
createModelManager,
|
|
@@ -52,6 +53,7 @@ import {
|
|
|
52
53
|
type ModelProfileDefinition,
|
|
53
54
|
mergeModelProfiles,
|
|
54
55
|
} from "./model-profiles";
|
|
56
|
+
import { type ModelSelectorValue, normalizeModelSelectorValue } from "./model-selector-value";
|
|
55
57
|
import {
|
|
56
58
|
type ModelOverride,
|
|
57
59
|
type ModelProfileConfig,
|
|
@@ -1019,10 +1021,10 @@ export class ModelRegistry {
|
|
|
1019
1021
|
#modelBindingsTargetSettings: Settings | undefined;
|
|
1020
1022
|
#appliedModelBindingRoles = new Set<string>();
|
|
1021
1023
|
#appliedAgentModelBindingOverrides = new Set<string>();
|
|
1022
|
-
#modelBindingRoleBaselines = new Map<string,
|
|
1023
|
-
#agentModelBindingBaselines = new Map<string,
|
|
1024
|
-
#lastAppliedModelBindingRoles = new Map<string,
|
|
1025
|
-
#lastAppliedAgentModelBindingOverrides = new Map<string,
|
|
1024
|
+
#modelBindingRoleBaselines = new Map<string, ModelSelectorValue | undefined>();
|
|
1025
|
+
#agentModelBindingBaselines = new Map<string, ModelSelectorValue | undefined>();
|
|
1026
|
+
#lastAppliedModelBindingRoles = new Map<string, ModelSelectorValue>();
|
|
1027
|
+
#lastAppliedAgentModelBindingOverrides = new Map<string, ModelSelectorValue>();
|
|
1026
1028
|
#configError: ConfigError | undefined = undefined;
|
|
1027
1029
|
#modelsConfigFile: ConfigFile<ModelsConfig>;
|
|
1028
1030
|
#lastStaticLoadMtime: number | null = null;
|
|
@@ -1181,7 +1183,7 @@ export class ModelRegistry {
|
|
|
1181
1183
|
// Merge runtime extension models so they survive refresh() cycles
|
|
1182
1184
|
const combined = this.#mergeCustomModels(withConfigModels, this.#runtimeModelOverlays);
|
|
1183
1185
|
const withModelOverrides = this.#applyModelOverrides(combined, this.#modelOverrides);
|
|
1184
|
-
this.#models = this.#applyRuntimeProviderOverrides(withModelOverrides);
|
|
1186
|
+
this.#models = applyFinalCodexGpt56ContextCap(this.#applyRuntimeProviderOverrides(withModelOverrides));
|
|
1185
1187
|
this.#rebuildCanonicalIndex();
|
|
1186
1188
|
this.#lastStaticLoadMtime = this.#modelsConfigFile.getMtimeMs();
|
|
1187
1189
|
}
|
|
@@ -1698,6 +1700,19 @@ export class ModelRegistry {
|
|
|
1698
1700
|
this.#applyConfiguredModelBindingsToTarget();
|
|
1699
1701
|
}
|
|
1700
1702
|
|
|
1703
|
+
#cloneModelSelectorValue(value: ModelSelectorValue | undefined): ModelSelectorValue | undefined {
|
|
1704
|
+
return Array.isArray(value) ? [...value] : value;
|
|
1705
|
+
}
|
|
1706
|
+
|
|
1707
|
+
#modelSelectorValuesEqual(left: ModelSelectorValue | undefined, right: ModelSelectorValue | undefined): boolean {
|
|
1708
|
+
const leftSelectors = normalizeModelSelectorValue(left);
|
|
1709
|
+
const rightSelectors = normalizeModelSelectorValue(right);
|
|
1710
|
+
return (
|
|
1711
|
+
leftSelectors.length === rightSelectors.length &&
|
|
1712
|
+
leftSelectors.every((selector, index) => selector === rightSelectors[index])
|
|
1713
|
+
);
|
|
1714
|
+
}
|
|
1715
|
+
|
|
1701
1716
|
#applyConfiguredModelBindingsToTarget(): void {
|
|
1702
1717
|
const targetSettings = this.#modelBindingsTargetSettings;
|
|
1703
1718
|
if (!targetSettings) return;
|
|
@@ -1708,26 +1723,25 @@ export class ModelRegistry {
|
|
|
1708
1723
|
for (const role of this.#appliedModelBindingRoles) {
|
|
1709
1724
|
if (configuredModelRoleKeys.has(role)) continue;
|
|
1710
1725
|
const lastApplied = this.#lastAppliedModelBindingRoles.get(role);
|
|
1711
|
-
if (lastApplied !== undefined && nextModelRoles[role]
|
|
1726
|
+
if (lastApplied !== undefined && this.#modelSelectorValuesEqual(nextModelRoles[role], lastApplied)) {
|
|
1712
1727
|
const baseline = this.#modelBindingRoleBaselines.get(role);
|
|
1713
1728
|
if (baseline === undefined) {
|
|
1714
1729
|
delete nextModelRoles[role];
|
|
1715
1730
|
} else {
|
|
1716
|
-
nextModelRoles[role] = baseline
|
|
1731
|
+
nextModelRoles[role] = this.#cloneModelSelectorValue(baseline)!;
|
|
1717
1732
|
}
|
|
1718
1733
|
}
|
|
1719
1734
|
this.#modelBindingRoleBaselines.delete(role);
|
|
1720
1735
|
this.#lastAppliedModelBindingRoles.delete(role);
|
|
1721
1736
|
}
|
|
1722
|
-
for (const [role,
|
|
1723
|
-
if (!modelId) continue;
|
|
1737
|
+
for (const [role, selector] of Object.entries(configuredModelRoles)) {
|
|
1724
1738
|
const previousApplied = this.#lastAppliedModelBindingRoles.get(role);
|
|
1725
1739
|
if (!this.#modelBindingRoleBaselines.has(role)) {
|
|
1726
|
-
this.#modelBindingRoleBaselines.set(role, nextModelRoles[role]);
|
|
1740
|
+
this.#modelBindingRoleBaselines.set(role, this.#cloneModelSelectorValue(nextModelRoles[role]));
|
|
1727
1741
|
}
|
|
1728
|
-
if (previousApplied === undefined || nextModelRoles[role]
|
|
1729
|
-
nextModelRoles[role] =
|
|
1730
|
-
this.#lastAppliedModelBindingRoles.set(role,
|
|
1742
|
+
if (previousApplied === undefined || this.#modelSelectorValuesEqual(nextModelRoles[role], previousApplied)) {
|
|
1743
|
+
nextModelRoles[role] = this.#cloneModelSelectorValue(selector)!;
|
|
1744
|
+
this.#lastAppliedModelBindingRoles.set(role, this.#cloneModelSelectorValue(selector)!);
|
|
1731
1745
|
}
|
|
1732
1746
|
}
|
|
1733
1747
|
targetSettings.override("modelRoles", nextModelRoles);
|
|
@@ -1739,26 +1753,34 @@ export class ModelRegistry {
|
|
|
1739
1753
|
for (const agentName of this.#appliedAgentModelBindingOverrides) {
|
|
1740
1754
|
if (configuredAgentModelOverrideKeys.has(agentName)) continue;
|
|
1741
1755
|
const lastApplied = this.#lastAppliedAgentModelBindingOverrides.get(agentName);
|
|
1742
|
-
if (
|
|
1756
|
+
if (
|
|
1757
|
+
lastApplied !== undefined &&
|
|
1758
|
+
this.#modelSelectorValuesEqual(nextAgentModelOverrides[agentName], lastApplied)
|
|
1759
|
+
) {
|
|
1743
1760
|
const baseline = this.#agentModelBindingBaselines.get(agentName);
|
|
1744
1761
|
if (baseline === undefined) {
|
|
1745
1762
|
delete nextAgentModelOverrides[agentName];
|
|
1746
1763
|
} else {
|
|
1747
|
-
nextAgentModelOverrides[agentName] = baseline
|
|
1764
|
+
nextAgentModelOverrides[agentName] = this.#cloneModelSelectorValue(baseline)!;
|
|
1748
1765
|
}
|
|
1749
1766
|
}
|
|
1750
1767
|
this.#agentModelBindingBaselines.delete(agentName);
|
|
1751
1768
|
this.#lastAppliedAgentModelBindingOverrides.delete(agentName);
|
|
1752
1769
|
}
|
|
1753
|
-
for (const [agentName,
|
|
1754
|
-
if (!modelId) continue;
|
|
1770
|
+
for (const [agentName, selector] of Object.entries(configuredAgentModelOverrides)) {
|
|
1755
1771
|
const previousApplied = this.#lastAppliedAgentModelBindingOverrides.get(agentName);
|
|
1756
1772
|
if (!this.#agentModelBindingBaselines.has(agentName)) {
|
|
1757
|
-
this.#agentModelBindingBaselines.set(
|
|
1773
|
+
this.#agentModelBindingBaselines.set(
|
|
1774
|
+
agentName,
|
|
1775
|
+
this.#cloneModelSelectorValue(nextAgentModelOverrides[agentName]),
|
|
1776
|
+
);
|
|
1758
1777
|
}
|
|
1759
|
-
if (
|
|
1760
|
-
|
|
1761
|
-
this.#
|
|
1778
|
+
if (
|
|
1779
|
+
previousApplied === undefined ||
|
|
1780
|
+
this.#modelSelectorValuesEqual(nextAgentModelOverrides[agentName], previousApplied)
|
|
1781
|
+
) {
|
|
1782
|
+
nextAgentModelOverrides[agentName] = this.#cloneModelSelectorValue(selector)!;
|
|
1783
|
+
this.#lastAppliedAgentModelBindingOverrides.set(agentName, this.#cloneModelSelectorValue(selector)!);
|
|
1762
1784
|
}
|
|
1763
1785
|
}
|
|
1764
1786
|
targetSettings.override("task.agentModelOverrides", nextAgentModelOverrides);
|
|
@@ -1803,7 +1825,7 @@ export class ModelRegistry {
|
|
|
1803
1825
|
// Merge runtime extension models so they survive online discovery completion
|
|
1804
1826
|
const combined = this.#mergeCustomModels(withConfigModels, this.#runtimeModelOverlays);
|
|
1805
1827
|
const withModelOverrides = this.#applyModelOverrides(combined, this.#modelOverrides);
|
|
1806
|
-
this.#models = this.#applyRuntimeProviderOverrides(withModelOverrides);
|
|
1828
|
+
this.#models = applyFinalCodexGpt56ContextCap(this.#applyRuntimeProviderOverrides(withModelOverrides));
|
|
1807
1829
|
this.#rebuildCanonicalIndex();
|
|
1808
1830
|
}
|
|
1809
1831
|
|
|
@@ -1812,6 +1834,7 @@ export class ModelRegistry {
|
|
|
1812
1834
|
strategy: ModelRefreshStrategy,
|
|
1813
1835
|
): Promise<Model<Api>[]> {
|
|
1814
1836
|
const cached = readModelCache<Api>(providerConfig.provider, 24 * 60 * 60 * 1000, Date.now, this.#cacheDbPath);
|
|
1837
|
+
const cachedModels = applyFinalCodexGpt56ContextCap(cached?.models ?? []);
|
|
1815
1838
|
const requiresAuth = !this.#keylessProviders.has(providerConfig.provider);
|
|
1816
1839
|
if (requiresAuth) {
|
|
1817
1840
|
const apiKey = await this.#peekApiKeyForProvider(providerConfig.provider);
|
|
@@ -1822,10 +1845,10 @@ export class ModelRegistry {
|
|
|
1822
1845
|
optional: providerConfig.optional ?? false,
|
|
1823
1846
|
stale: cached !== null,
|
|
1824
1847
|
fetchedAt: cached?.updatedAt,
|
|
1825
|
-
models:
|
|
1848
|
+
models: cachedModels.map(model => model.id),
|
|
1826
1849
|
});
|
|
1827
1850
|
this.#lastDiscoveryWarnings.delete(providerConfig.provider);
|
|
1828
|
-
return
|
|
1851
|
+
return cachedModels;
|
|
1829
1852
|
}
|
|
1830
1853
|
}
|
|
1831
1854
|
|
|
@@ -2878,13 +2901,15 @@ export class ModelRegistry {
|
|
|
2878
2901
|
if (config.oauth?.modifyModels) {
|
|
2879
2902
|
const credential = this.authStorage.getOAuthCredential(providerName);
|
|
2880
2903
|
if (credential) {
|
|
2881
|
-
this.#models =
|
|
2904
|
+
this.#models = applyFinalCodexGpt56ContextCap(
|
|
2905
|
+
config.oauth.modifyModels(withRuntimeTransportOverride, credential),
|
|
2906
|
+
);
|
|
2882
2907
|
this.#rebuildCanonicalIndex();
|
|
2883
2908
|
return;
|
|
2884
2909
|
}
|
|
2885
2910
|
}
|
|
2886
2911
|
|
|
2887
|
-
this.#models = withRuntimeTransportOverride;
|
|
2912
|
+
this.#models = applyFinalCodexGpt56ContextCap(withRuntimeTransportOverride);
|
|
2888
2913
|
this.#rebuildCanonicalIndex();
|
|
2889
2914
|
return;
|
|
2890
2915
|
}
|
|
@@ -9,11 +9,22 @@ import { logger } from "@gajae-code/utils";
|
|
|
9
9
|
import chalk from "chalk";
|
|
10
10
|
import { parseThinkingLevel, resolveThinkingLevelForModel } from "../thinking";
|
|
11
11
|
import { isAuthenticated, kNoAuth, MODEL_ROLE_IDS, type ModelRegistry, type ModelRole } from "./model-registry";
|
|
12
|
+
import { type ModelSelectorValue, normalizeModelSelectorValue } from "./model-selector-value";
|
|
12
13
|
import type { Settings } from "./settings";
|
|
13
14
|
|
|
14
15
|
/** Default model IDs for each known provider */
|
|
15
16
|
export const defaultModelPerProvider: Record<KnownProvider, string> = DEFAULT_MODEL_PER_PROVIDER;
|
|
16
17
|
|
|
18
|
+
/**
|
|
19
|
+
* Cursor's current RPC transport executes its exec protocol while streaming and
|
|
20
|
+
* has no client-side tool-call mode. Managed fallback attempts must not enable
|
|
21
|
+
* that irreversible path.
|
|
22
|
+
*/
|
|
23
|
+
export function managedCursorFallbackUnavailableReason(model: Model<Api>, selector: string): string | undefined {
|
|
24
|
+
if (model.api !== "cursor-agent") return undefined;
|
|
25
|
+
return `Cursor model ${selector} requires provider-side tool execution and cannot be used in a retryable fallback chain`;
|
|
26
|
+
}
|
|
27
|
+
|
|
17
28
|
export interface ScopedModelSelection {
|
|
18
29
|
model: Model<Api>;
|
|
19
30
|
thinkingLevel?: ThinkingLevel;
|
|
@@ -524,10 +535,8 @@ function getModelRoleAlias(value: string): ModelRole | undefined {
|
|
|
524
535
|
return undefined;
|
|
525
536
|
}
|
|
526
537
|
|
|
527
|
-
function normalizeModelPatternList(value:
|
|
528
|
-
|
|
529
|
-
const patterns = Array.isArray(value) ? value : value.split(",");
|
|
530
|
-
return patterns.map(pattern => pattern.trim()).filter(Boolean);
|
|
538
|
+
function normalizeModelPatternList(value: ModelSelectorValue | undefined): string[] {
|
|
539
|
+
return normalizeModelSelectorValue(value);
|
|
531
540
|
}
|
|
532
541
|
|
|
533
542
|
function isSessionInheritedAgentPattern(value: string): boolean {
|
|
@@ -545,7 +554,7 @@ function resolveConfiguredRolePattern(value: string, settings?: Settings): strin
|
|
|
545
554
|
const role = getModelRoleAlias(aliasCandidate);
|
|
546
555
|
if (!role) return [normalized];
|
|
547
556
|
|
|
548
|
-
const configured = settings?.getModelRole(role)
|
|
557
|
+
const configured = settings?.getModelRole(role);
|
|
549
558
|
const resolved = configured ? normalizeModelPatternList(configured) : undefined;
|
|
550
559
|
if (!resolved || resolved.length === 0) {
|
|
551
560
|
return undefined;
|
|
@@ -560,14 +569,14 @@ function resolveConfiguredRolePattern(value: string, settings?: Settings): strin
|
|
|
560
569
|
export function expandRoleAlias(value: string, settings?: Settings): string {
|
|
561
570
|
const normalized = value.trim();
|
|
562
571
|
if (normalized === DEFAULT_MODEL_ROLE) {
|
|
563
|
-
return settings?.getModelRole("default") ?? value;
|
|
572
|
+
return normalizeModelPatternList(settings?.getModelRole("default"))[0] ?? value;
|
|
564
573
|
}
|
|
565
574
|
|
|
566
575
|
const resolved = resolveConfiguredRolePattern(value, settings)?.[0];
|
|
567
576
|
return resolved ?? value;
|
|
568
577
|
}
|
|
569
578
|
|
|
570
|
-
export function resolveConfiguredModelPatterns(value:
|
|
579
|
+
export function resolveConfiguredModelPatterns(value: ModelSelectorValue | undefined, settings?: Settings): string[] {
|
|
571
580
|
const patterns = normalizeModelPatternList(value);
|
|
572
581
|
return patterns.flatMap(pattern => {
|
|
573
582
|
const resolved = resolveConfiguredRolePattern(pattern, settings);
|
|
@@ -575,8 +584,8 @@ export function resolveConfiguredModelPatterns(value: string | string[] | undefi
|
|
|
575
584
|
});
|
|
576
585
|
}
|
|
577
586
|
export interface AgentModelPatternResolutionOptions {
|
|
578
|
-
settingsOverride?:
|
|
579
|
-
agentModel?:
|
|
587
|
+
settingsOverride?: ModelSelectorValue;
|
|
588
|
+
agentModel?: ModelSelectorValue;
|
|
580
589
|
settings?: Settings;
|
|
581
590
|
activeModelPattern?: string;
|
|
582
591
|
fallbackModelPattern?: string;
|
|
@@ -597,7 +606,10 @@ export function resolveAgentModelPatterns(options: AgentModelPatternResolutionOp
|
|
|
597
606
|
}
|
|
598
607
|
|
|
599
608
|
const fallback =
|
|
600
|
-
activeModelPattern?.trim() ||
|
|
609
|
+
activeModelPattern?.trim() ||
|
|
610
|
+
fallbackModelPattern?.trim() ||
|
|
611
|
+
normalizeModelPatternList(settings?.getModelRole("default"))[0] ||
|
|
612
|
+
"";
|
|
601
613
|
return resolveConfiguredModelPatterns(fallback, settings);
|
|
602
614
|
}
|
|
603
615
|
|
|
@@ -612,21 +624,14 @@ export interface ResolvedModelRoleValue {
|
|
|
612
624
|
}
|
|
613
625
|
|
|
614
626
|
export function resolveModelRoleValue(
|
|
615
|
-
roleValue:
|
|
627
|
+
roleValue: ModelSelectorValue | undefined,
|
|
616
628
|
availableModels: Model<Api>[],
|
|
617
629
|
options?: { settings?: Settings; matchPreferences?: ModelMatchPreferences; modelRegistry?: CanonicalModelRegistry },
|
|
618
630
|
): ResolvedModelRoleValue {
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
const normalized = roleValue.trim();
|
|
624
|
-
if (!normalized || normalized === DEFAULT_MODEL_ROLE) {
|
|
625
|
-
return { model: undefined, thinkingLevel: undefined, explicitThinkingLevel: false, warning: undefined };
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
const effectivePatterns = resolveConfiguredRolePattern(normalized, options?.settings);
|
|
629
|
-
if (!effectivePatterns || effectivePatterns.length === 0) {
|
|
631
|
+
const effectivePatterns = normalizeModelPatternList(roleValue).flatMap(
|
|
632
|
+
pattern => resolveConfiguredRolePattern(pattern, options?.settings) ?? [],
|
|
633
|
+
);
|
|
634
|
+
if (effectivePatterns.length === 0) {
|
|
630
635
|
return { model: undefined, thinkingLevel: undefined, explicitThinkingLevel: false, warning: undefined };
|
|
631
636
|
}
|
|
632
637
|
|
|
@@ -654,11 +659,10 @@ export function resolveModelRoleValue(
|
|
|
654
659
|
}
|
|
655
660
|
|
|
656
661
|
export function extractExplicitThinkingSelector(
|
|
657
|
-
value:
|
|
662
|
+
value: ModelSelectorValue | undefined,
|
|
658
663
|
settings?: Settings,
|
|
659
664
|
): ThinkingLevel | undefined {
|
|
660
|
-
|
|
661
|
-
const normalized = value.trim();
|
|
665
|
+
const normalized = normalizeModelPatternList(value)[0];
|
|
662
666
|
if (!normalized || normalized === DEFAULT_MODEL_ROLE) return undefined;
|
|
663
667
|
|
|
664
668
|
const visited = new Set<string>();
|
|
@@ -712,12 +716,13 @@ export function resolveModelFromSettings(options: {
|
|
|
712
716
|
let sawConfiguredProviderQualifiedRole = false;
|
|
713
717
|
for (const role of roles) {
|
|
714
718
|
const configured = settings.getModelRole(role);
|
|
715
|
-
|
|
716
|
-
|
|
719
|
+
const expanded = normalizeModelPatternList(configured)[0];
|
|
720
|
+
if (!expanded) continue;
|
|
721
|
+
const resolvedValue = expandRoleAlias(expanded, settings).trim();
|
|
717
722
|
if (expanded.includes("/")) {
|
|
718
723
|
sawConfiguredProviderQualifiedRole = true;
|
|
719
724
|
}
|
|
720
|
-
const resolved = resolveModelFromString(
|
|
725
|
+
const resolved = resolveModelFromString(resolvedValue, availableModels, matchPreferences, modelRegistry);
|
|
721
726
|
if (resolved) return resolved;
|
|
722
727
|
}
|
|
723
728
|
return sawConfiguredProviderQualifiedRole ? undefined : availableModels[0];
|
|
@@ -747,6 +752,56 @@ export function resolveModelOverride(
|
|
|
747
752
|
return { explicitThinkingLevel: false };
|
|
748
753
|
}
|
|
749
754
|
|
|
755
|
+
/**
|
|
756
|
+
* Resolve a configured fallback chain to its first callable entry without
|
|
757
|
+
* charging requests. For retryable chains, consumers MUST pass
|
|
758
|
+
* `{ managedFallback: true }` so unsuitable entries (including Cursor's
|
|
759
|
+
* provider-side tool mode) fail closed during resolution before any request
|
|
760
|
+
* is attempted. Single-entry chains remain non-managed selections.
|
|
761
|
+
*/
|
|
762
|
+
export interface ModelChainResolutionOptions {
|
|
763
|
+
managedFallback?: boolean;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
export async function resolveModelChainWithAuth(
|
|
767
|
+
modelPatterns: readonly string[],
|
|
768
|
+
modelRegistry: ModelLookupRegistry & Pick<ModelRegistry, "getApiKey">,
|
|
769
|
+
settings?: Settings,
|
|
770
|
+
sessionId?: string,
|
|
771
|
+
options?: ModelChainResolutionOptions,
|
|
772
|
+
): Promise<{
|
|
773
|
+
model?: Model<Api>;
|
|
774
|
+
thinkingLevel?: ThinkingLevel;
|
|
775
|
+
explicitThinkingLevel: boolean;
|
|
776
|
+
activeIndex: number;
|
|
777
|
+
skips: Array<{ selector: string; reason: string }>;
|
|
778
|
+
}> {
|
|
779
|
+
const availableModels = modelRegistry.getAvailable();
|
|
780
|
+
const matchPreferences = { usageOrder: settings?.getStorage()?.getModelUsageOrder() };
|
|
781
|
+
const skips: Array<{ selector: string; reason: string }> = [];
|
|
782
|
+
for (let activeIndex = 0; activeIndex < modelPatterns.length; activeIndex += 1) {
|
|
783
|
+
const selector = modelPatterns[activeIndex];
|
|
784
|
+
const candidate = resolveModelRoleValue(selector, availableModels, { settings, matchPreferences, modelRegistry });
|
|
785
|
+
if (!candidate.model) {
|
|
786
|
+
skips.push({ selector, reason: "unknown_model" });
|
|
787
|
+
continue;
|
|
788
|
+
}
|
|
789
|
+
if (options?.managedFallback && modelPatterns.length > 1) {
|
|
790
|
+
const cursorReason = managedCursorFallbackUnavailableReason(candidate.model, selector);
|
|
791
|
+
if (cursorReason) {
|
|
792
|
+
skips.push({ selector, reason: cursorReason });
|
|
793
|
+
continue;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
const key = await modelRegistry.getApiKey(candidate.model, sessionId);
|
|
797
|
+
if (key === kNoAuth || isAuthenticated(key)) {
|
|
798
|
+
return { ...candidate, activeIndex, skips };
|
|
799
|
+
}
|
|
800
|
+
skips.push({ selector, reason: "unauthenticated" });
|
|
801
|
+
}
|
|
802
|
+
return { explicitThinkingLevel: false, activeIndex: modelPatterns.length, skips };
|
|
803
|
+
}
|
|
804
|
+
|
|
750
805
|
/**
|
|
751
806
|
* Resolve a list of override patterns to the first matching model, with an
|
|
752
807
|
* auth-aware fallback to the parent session's active model.
|
|
@@ -774,6 +829,7 @@ export async function resolveModelOverrideWithAuthFallback(
|
|
|
774
829
|
modelRegistry: ModelLookupRegistry & Pick<ModelRegistry, "getApiKey">,
|
|
775
830
|
settings?: Settings,
|
|
776
831
|
sessionId?: string,
|
|
832
|
+
options?: ModelChainResolutionOptions,
|
|
777
833
|
): Promise<{
|
|
778
834
|
model?: Model<Api>;
|
|
779
835
|
thinkingLevel?: ThinkingLevel;
|
|
@@ -781,31 +837,62 @@ export async function resolveModelOverrideWithAuthFallback(
|
|
|
781
837
|
authFallbackUsed: boolean;
|
|
782
838
|
requestedModel?: Model<Api>;
|
|
783
839
|
fallbackReason?: "auth_unavailable";
|
|
840
|
+
activeIndex?: number;
|
|
841
|
+
parentFallbackSelector?: string;
|
|
842
|
+
skips: Array<{ selector: string; reason: string }>;
|
|
784
843
|
}> {
|
|
785
|
-
const
|
|
786
|
-
const
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
}
|
|
790
|
-
|
|
791
|
-
const
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
844
|
+
const availableModels = modelRegistry.getAvailable();
|
|
845
|
+
const matchPreferences = { usageOrder: settings?.getStorage()?.getModelUsageOrder() };
|
|
846
|
+
let requestedModel: Model<Api> | undefined;
|
|
847
|
+
let requestedResolution: ResolvedModelRoleValue | undefined;
|
|
848
|
+
const skips: Array<{ selector: string; reason: string }> = [];
|
|
849
|
+
let activeIndex = 0;
|
|
850
|
+
for (const pattern of modelPatterns) {
|
|
851
|
+
const candidate = resolveModelRoleValue(pattern, availableModels, { settings, matchPreferences, modelRegistry });
|
|
852
|
+
if (!requestedModel && candidate.model) {
|
|
853
|
+
requestedModel = candidate.model;
|
|
854
|
+
requestedResolution = candidate;
|
|
855
|
+
}
|
|
856
|
+
if (!candidate.model) {
|
|
857
|
+
skips.push({ selector: pattern, reason: "unknown_model" });
|
|
858
|
+
activeIndex += 1;
|
|
859
|
+
continue;
|
|
860
|
+
}
|
|
861
|
+
if (options?.managedFallback && modelPatterns.length > 1) {
|
|
862
|
+
const cursorReason = managedCursorFallbackUnavailableReason(candidate.model, pattern);
|
|
863
|
+
if (cursorReason) {
|
|
864
|
+
skips.push({ selector: pattern, reason: cursorReason });
|
|
865
|
+
activeIndex += 1;
|
|
866
|
+
continue;
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
const key = await modelRegistry.getApiKey(candidate.model, sessionId);
|
|
870
|
+
if (key === kNoAuth || isAuthenticated(key)) {
|
|
871
|
+
return { ...candidate, requestedModel: candidate.model, authFallbackUsed: false, activeIndex, skips };
|
|
872
|
+
}
|
|
873
|
+
skips.push({ selector: pattern, reason: "unauthenticated" });
|
|
874
|
+
activeIndex += 1;
|
|
875
|
+
}
|
|
876
|
+
const fallback = parentActiveModelPattern
|
|
877
|
+
? resolveModelOverride([parentActiveModelPattern], modelRegistry, settings)
|
|
878
|
+
: { explicitThinkingLevel: false };
|
|
879
|
+
if (fallback.model) {
|
|
880
|
+
const fallbackKey = await modelRegistry.getApiKey(fallback.model, sessionId);
|
|
881
|
+
if (fallbackKey === kNoAuth || isAuthenticated(fallbackKey)) {
|
|
882
|
+
const isParentSubstitution = requestedModel === undefined || !modelsAreEqual(fallback.model, requestedModel);
|
|
883
|
+
return {
|
|
884
|
+
...fallback,
|
|
885
|
+
requestedModel,
|
|
886
|
+
authFallbackUsed: requestedModel !== undefined && isParentSubstitution,
|
|
887
|
+
fallbackReason: requestedModel && isParentSubstitution ? "auth_unavailable" : undefined,
|
|
888
|
+
parentFallbackSelector: isParentSubstitution ? formatModelString(fallback.model) : undefined,
|
|
889
|
+
skips,
|
|
890
|
+
};
|
|
891
|
+
}
|
|
806
892
|
}
|
|
807
|
-
|
|
808
|
-
|
|
893
|
+
return requestedResolution
|
|
894
|
+
? { ...requestedResolution, requestedModel, authFallbackUsed: false, activeIndex, skips }
|
|
895
|
+
: { explicitThinkingLevel: false, requestedModel, authFallbackUsed: false, activeIndex, skips };
|
|
809
896
|
}
|
|
810
897
|
|
|
811
898
|
/**
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as z from "zod/v4";
|
|
2
|
+
|
|
3
|
+
/** A model selector or an ordered fallback chain of selectors. */
|
|
4
|
+
export type ModelSelectorValue = string | readonly string[];
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Accept one validated selector or a non-empty ordered chain of validated selectors.
|
|
8
|
+
* Element schemas own each configuration surface's selector grammar.
|
|
9
|
+
*/
|
|
10
|
+
export function stringOrNonEmptyArray<T extends z.ZodType<string>>(elementSchema: T) {
|
|
11
|
+
return z.union([elementSchema, z.array(elementSchema).min(1)]);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** Return whether a value is a non-blank selector or a non-empty selector chain. */
|
|
15
|
+
export function isModelSelectorValue(value: unknown): value is ModelSelectorValue {
|
|
16
|
+
return (
|
|
17
|
+
(typeof value === "string" && value.trim().length > 0) ||
|
|
18
|
+
(Array.isArray(value) &&
|
|
19
|
+
value.length > 0 &&
|
|
20
|
+
value.every(item => typeof item === "string" && item.trim().length > 0))
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Preserve compatibility with comma-delimited selector strings while flattening
|
|
26
|
+
* configured chains in their declared order.
|
|
27
|
+
*/
|
|
28
|
+
export function normalizeModelSelectorValue(value: ModelSelectorValue | undefined): string[] {
|
|
29
|
+
if (value === undefined) return [];
|
|
30
|
+
if (typeof value === "string") {
|
|
31
|
+
return value
|
|
32
|
+
.split(",")
|
|
33
|
+
.map(part => part.trim())
|
|
34
|
+
.filter(Boolean);
|
|
35
|
+
}
|
|
36
|
+
if (!Array.isArray(value)) return [];
|
|
37
|
+
return value
|
|
38
|
+
.filter((selector): selector is string => typeof selector === "string")
|
|
39
|
+
.flatMap(selector =>
|
|
40
|
+
selector
|
|
41
|
+
.split(",")
|
|
42
|
+
.map(part => part.trim())
|
|
43
|
+
.filter(Boolean),
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Return the first configured selector for consumers that need one selector. */
|
|
48
|
+
export function selectorHead(value: ModelSelectorValue | undefined): string | undefined {
|
|
49
|
+
return normalizeModelSelectorValue(value)[0];
|
|
50
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as z from "zod/v4";
|
|
2
|
+
import { stringOrNonEmptyArray } from "./model-selector-value";
|
|
2
3
|
|
|
3
4
|
const OpenRouterRoutingSchema = z.object({
|
|
4
5
|
only: z.array(z.string()).optional(),
|
|
@@ -77,34 +78,26 @@ const RequestTransformSchema = z
|
|
|
77
78
|
})
|
|
78
79
|
.strict();
|
|
79
80
|
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
const PermissiveModelSelectorSchema = z.string().trim().min(1);
|
|
82
|
+
|
|
83
|
+
export const ModelBindingsSchema = z.object({
|
|
84
|
+
modelRoles: z.record(z.string(), stringOrNonEmptyArray(PermissiveModelSelectorSchema)).optional(),
|
|
85
|
+
agentModelOverrides: z.record(z.string(), stringOrNonEmptyArray(PermissiveModelSelectorSchema)).optional(),
|
|
83
86
|
});
|
|
87
|
+
|
|
84
88
|
export const ProfileRoleSchema = z.enum(["default", "executor", "architect", "planner", "critic"]);
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
if (value.includes(",")) return false;
|
|
88
|
-
const slashIdx = value.indexOf("/");
|
|
89
|
-
if (slashIdx <= 0 || slashIdx === value.length - 1) return false;
|
|
90
|
-
const provider = value.slice(0, slashIdx);
|
|
91
|
-
const modelId = value.slice(slashIdx + 1);
|
|
92
|
-
if (!provider || !modelId) return false;
|
|
93
|
-
const parts = modelId.split(":");
|
|
94
|
-
if (parts.length > 2) return false;
|
|
95
|
-
const [base, suffix] = parts;
|
|
96
|
-
if (!base) return false;
|
|
97
|
-
return suffix === undefined || ["minimal", "low", "medium", "high", "xhigh", "max"].includes(suffix);
|
|
98
|
-
}
|
|
90
|
+
const ProfileModelSelectorPattern = "^[^,/]+/[^,:]+(?::(?:minimal|low|medium|high|xhigh|max))?$";
|
|
99
91
|
|
|
100
92
|
export const ProfileModelSelectorSchema = z
|
|
101
93
|
.string()
|
|
94
|
+
.trim()
|
|
102
95
|
.min(1)
|
|
103
|
-
.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
96
|
+
.regex(new RegExp(ProfileModelSelectorPattern), "Expected provider/modelId with optional :effort suffix");
|
|
97
|
+
export const ProfileModelMappingSchema = z.partialRecord(
|
|
98
|
+
ProfileRoleSchema,
|
|
99
|
+
stringOrNonEmptyArray(ProfileModelSelectorSchema),
|
|
100
|
+
);
|
|
108
101
|
|
|
109
102
|
export const ProfileDefinitionSchema = z
|
|
110
103
|
.object({
|