@gajae-code/coding-agent 0.10.2 → 0.11.1
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 +58 -2
- package/dist/types/append-only-mode.d.ts +1 -1
- package/dist/types/async/job-manager.d.ts +46 -7
- 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/ultragoal-receipt-freshness.d.ts +11 -0
- 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/command-controller.d.ts +2 -2
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
- 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 +5 -2
- 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 +170 -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 +7 -2
- 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 +42 -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 +50 -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 +78 -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/dist/types/tools/subagent-render.d.ts +1 -0
- package/dist/types/tools/subagent.d.ts +6 -1
- package/package.json +34 -13
- package/scripts/build-sdk-package-smoke.ts +99 -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/async/job-manager.ts +406 -63
- 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 +108 -14
- package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
- package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
- 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 +10 -17
- package/src/modes/controllers/event-controller.ts +11 -16
- package/src/modes/controllers/extension-ui-controller.ts +396 -28
- package/src/modes/controllers/selector-controller.ts +674 -36
- package/src/modes/index.ts +0 -22
- package/src/modes/interactive-mode.ts +87 -36
- 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 +1258 -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 +7 -2
- 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 +113 -0
- package/src/sdk/broker/ensure.ts +307 -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 +355 -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 +2292 -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 +3979 -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 +603 -63
- 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 +2650 -944
- 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/task/index.ts +26 -16
- 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/subagent-render.ts +19 -8
- package/src/tools/subagent.ts +84 -32
- 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
|
@@ -21,27 +21,9 @@ import type {
|
|
|
21
21
|
ClientBridgePermissionToolCall,
|
|
22
22
|
ClientBridgeTerminalHandle,
|
|
23
23
|
} from "../../session/client-bridge";
|
|
24
|
+
import { resolveAcpPermissionMode } from "./permission-mode";
|
|
24
25
|
|
|
25
|
-
type AcpPermissionMode
|
|
26
|
-
|
|
27
|
-
const ACP_PERMISSION_MODE_ENV = "GJC_ACP_PERMISSION_MODE";
|
|
28
|
-
|
|
29
|
-
function parseAcpPermissionMode(value: unknown): AcpPermissionMode {
|
|
30
|
-
if (value === "auto" || value === "prompt" || value === "always-allow") return value;
|
|
31
|
-
return "prompt";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** Client metadata is authoritative; the process environment is only a fallback when that field is absent. */
|
|
35
|
-
function resolveAcpPermissionMode(clientCapabilities: ClientCapabilities | undefined): AcpPermissionMode {
|
|
36
|
-
const meta = clientCapabilities?._meta;
|
|
37
|
-
if (typeof meta === "object" && meta !== null) {
|
|
38
|
-
const gjc = (meta as { gjc?: unknown }).gjc;
|
|
39
|
-
if (typeof gjc === "object" && gjc !== null && "permissionHandling" in gjc) {
|
|
40
|
-
return parseAcpPermissionMode((gjc as { permissionHandling?: unknown }).permissionHandling);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return parseAcpPermissionMode(process.env[ACP_PERMISSION_MODE_ENV]);
|
|
44
|
-
}
|
|
26
|
+
export { type AcpPermissionMode, resolveAcpPermissionMode } from "./permission-mode";
|
|
45
27
|
|
|
46
28
|
export function createAcpClientBridge(
|
|
47
29
|
connection: AgentSideConnection,
|
|
@@ -232,6 +232,24 @@ export function mapAgentSessionEventToAcpSessionUpdates(
|
|
|
232
232
|
}
|
|
233
233
|
case "todo_auto_clear":
|
|
234
234
|
return [toSessionNotification(sessionId, { sessionUpdate: "plan", entries: [] })];
|
|
235
|
+
case "model_fallback_switched":
|
|
236
|
+
return [
|
|
237
|
+
toSessionNotification(sessionId, {
|
|
238
|
+
sessionUpdate: "session_info_update",
|
|
239
|
+
_meta: {
|
|
240
|
+
gjcModelFallbackSwitched: true,
|
|
241
|
+
gjcModelFallbackEventId: event.eventId,
|
|
242
|
+
gjcModelFallbackFrom: event.from,
|
|
243
|
+
gjcModelFallbackTo: event.to,
|
|
244
|
+
gjcModelFallbackReason: event.reason,
|
|
245
|
+
gjcModelFallbackRole: event.role,
|
|
246
|
+
gjcModelFallbackScope: event.scope,
|
|
247
|
+
gjcModelFallbackActiveIndex: event.activeIndex,
|
|
248
|
+
gjcModelFallbackChainLength: event.chainLength,
|
|
249
|
+
gjcModelFallbackAttemptsUsed: event.attemptsUsed,
|
|
250
|
+
},
|
|
251
|
+
}),
|
|
252
|
+
];
|
|
235
253
|
// These event types are intentionally not represented as ACP session updates.
|
|
236
254
|
case "agent_start":
|
|
237
255
|
case "agent_end":
|
|
@@ -278,8 +296,6 @@ export function mapAgentSessionEventToAcpSessionUpdates(
|
|
|
278
296
|
}
|
|
279
297
|
case "auto_retry_start":
|
|
280
298
|
case "auto_retry_end":
|
|
281
|
-
case "retry_fallback_applied":
|
|
282
|
-
case "retry_fallback_succeeded":
|
|
283
299
|
case "ttsr_triggered":
|
|
284
300
|
case "irc_message":
|
|
285
301
|
case "subagent_steer_message":
|
|
@@ -1,50 +1,22 @@
|
|
|
1
1
|
import * as stream from "node:stream";
|
|
2
2
|
import { AgentSideConnection, ndJsonStream, type Stream } from "@agentclientprotocol/sdk";
|
|
3
|
-
import type { AgentSession } from "../../session/agent-session";
|
|
4
3
|
import { AcpAgent } from "./acp-agent";
|
|
4
|
+
import type { AcpStartupOptions } from "./startup-options";
|
|
5
5
|
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
connection: AgentSideConnection;
|
|
10
|
-
agent: AcpAgent;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function createAcpConnection(
|
|
14
|
-
transport: Stream,
|
|
15
|
-
createSession: AcpSessionFactory,
|
|
16
|
-
initialSession?: AgentSession,
|
|
17
|
-
): AgentSideConnection {
|
|
18
|
-
return createAcpConnectionWithAgent(transport, createSession, initialSession).connection;
|
|
6
|
+
export interface AcpModeOptions {
|
|
7
|
+
agentDir?: string;
|
|
8
|
+
startupOptions?: AcpStartupOptions;
|
|
19
9
|
}
|
|
20
10
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
* underlying {@link AcpAgent}. Callers that need to await agent shutdown (terminal
|
|
24
|
-
* delete/dispose work) after transport closure should use this instead of
|
|
25
|
-
* {@link createAcpConnection}.
|
|
26
|
-
*/
|
|
27
|
-
export function createAcpConnectionWithAgent(
|
|
28
|
-
transport: Stream,
|
|
29
|
-
createSession: AcpSessionFactory,
|
|
30
|
-
initialSession?: AgentSession,
|
|
31
|
-
): AcpConnectionHandle {
|
|
32
|
-
let agent: AcpAgent | undefined;
|
|
33
|
-
const connection = new AgentSideConnection(conn => {
|
|
34
|
-
agent = new AcpAgent(conn, createSession, initialSession);
|
|
35
|
-
return agent;
|
|
36
|
-
}, transport);
|
|
37
|
-
return { connection, agent: agent! };
|
|
11
|
+
export function createAcpConnection(transport: Stream, options: AcpModeOptions = {}): AgentSideConnection {
|
|
12
|
+
return new AgentSideConnection(conn => new AcpAgent(conn, options), transport);
|
|
38
13
|
}
|
|
39
14
|
|
|
40
|
-
export async function runAcpMode(
|
|
15
|
+
export async function runAcpMode(options: AcpModeOptions = {}): Promise<never> {
|
|
41
16
|
const input = stream.Writable.toWeb(process.stdout);
|
|
42
17
|
const output = stream.Readable.toWeb(process.stdin);
|
|
43
18
|
const transport = ndJsonStream(input, output);
|
|
44
|
-
const
|
|
19
|
+
const connection = createAcpConnection(transport, options);
|
|
45
20
|
await connection.closed;
|
|
46
|
-
// Await connection-local terminal work (active deletes, disposal) so
|
|
47
|
-
// `process.exit` never kills in-flight deletion/cleanup.
|
|
48
|
-
await agent.shutdownPromise;
|
|
49
21
|
process.exit(0);
|
|
50
22
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ClientCapabilities } from "@agentclientprotocol/sdk";
|
|
2
|
+
|
|
3
|
+
export type AcpPermissionMode = "auto" | "prompt" | "always-allow";
|
|
4
|
+
|
|
5
|
+
const ACP_PERMISSION_MODE_ENV = "GJC_ACP_PERMISSION_MODE";
|
|
6
|
+
|
|
7
|
+
function parseAcpPermissionMode(value: unknown): AcpPermissionMode {
|
|
8
|
+
if (value === "auto" || value === "prompt" || value === "always-allow") return value;
|
|
9
|
+
return "prompt";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Client metadata is authoritative; the process environment is only a fallback when that field is absent. */
|
|
13
|
+
export function resolveAcpPermissionMode(
|
|
14
|
+
clientCapabilities: ClientCapabilities | undefined,
|
|
15
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
16
|
+
): AcpPermissionMode {
|
|
17
|
+
const meta = clientCapabilities?._meta;
|
|
18
|
+
if (typeof meta === "object" && meta !== null) {
|
|
19
|
+
const gjc = (meta as { gjc?: unknown }).gjc;
|
|
20
|
+
if (typeof gjc === "object" && gjc !== null && "permissionHandling" in gjc) {
|
|
21
|
+
return parseAcpPermissionMode((gjc as { permissionHandling?: unknown }).permissionHandling);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return parseAcpPermissionMode(env[ACP_PERMISSION_MODE_ENV]);
|
|
25
|
+
}
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
resolveConfiguredModelPatterns,
|
|
41
41
|
resolveModelOverride,
|
|
42
42
|
} from "../../config/model-resolver";
|
|
43
|
+
import { type ModelSelectorValue, selectorHead } from "../../config/model-selector-value";
|
|
43
44
|
import { Settings } from "../../config/settings";
|
|
44
45
|
import agentCreationArchitectPrompt from "../../prompts/system/agent-creation-architect.md" with { type: "text" };
|
|
45
46
|
import agentCreationUserPrompt from "../../prompts/system/agent-creation-user.md" with { type: "text" };
|
|
@@ -84,6 +85,35 @@ interface AgentDashboardModelContext {
|
|
|
84
85
|
defaultModelPattern?: string;
|
|
85
86
|
}
|
|
86
87
|
|
|
88
|
+
export function resolveAgentCreationModel(
|
|
89
|
+
modelPatterns: string[],
|
|
90
|
+
modelRegistry: ModelRegistry,
|
|
91
|
+
settings: Settings | undefined,
|
|
92
|
+
) {
|
|
93
|
+
const { model } = resolveModelOverride(modelPatterns, modelRegistry, settings);
|
|
94
|
+
if (model) return model;
|
|
95
|
+
if (modelPatterns.length > 0) {
|
|
96
|
+
throw new Error(`Configured model selector(s) did not resolve: ${modelPatterns.join(", ")}.`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const fallbackModel = modelRegistry.getAvailable()[0];
|
|
100
|
+
if (!fallbackModel) {
|
|
101
|
+
throw new Error("No available model to generate agent specification.");
|
|
102
|
+
}
|
|
103
|
+
return fallbackModel;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function updateAgentModelOverride(
|
|
107
|
+
overrides: Record<string, ModelSelectorValue>,
|
|
108
|
+
agentName: string,
|
|
109
|
+
rawValue: string,
|
|
110
|
+
): Record<string, ModelSelectorValue> {
|
|
111
|
+
const value = rawValue.trim();
|
|
112
|
+
if (value) return { ...overrides, [agentName]: value };
|
|
113
|
+
const { [agentName]: _, ...remainingOverrides } = overrides;
|
|
114
|
+
return remainingOverrides;
|
|
115
|
+
}
|
|
116
|
+
|
|
87
117
|
const SOURCE_ORDER: Record<AgentSource, number> = {
|
|
88
118
|
project: 0,
|
|
89
119
|
user: 1,
|
|
@@ -370,7 +400,7 @@ export class AgentDashboard extends Container {
|
|
|
370
400
|
.map(agent => ({
|
|
371
401
|
...agent,
|
|
372
402
|
disabled: disabled.has(agent.name),
|
|
373
|
-
overrideModel: overrides[agent.name]?.trim() || undefined,
|
|
403
|
+
overrideModel: selectorHead(overrides[agent.name])?.trim() || undefined,
|
|
374
404
|
}));
|
|
375
405
|
|
|
376
406
|
this.#tabs = this.#buildTabs(this.#allAgents);
|
|
@@ -465,16 +495,10 @@ export class AgentDashboard extends Container {
|
|
|
465
495
|
this.#settingsManager.set("task.disabledAgents", disabled);
|
|
466
496
|
}
|
|
467
497
|
|
|
468
|
-
#
|
|
498
|
+
#persistModelOverride(agentName: string, rawValue: string): void {
|
|
469
499
|
if (!this.#settingsManager) return;
|
|
470
|
-
const overrides
|
|
471
|
-
|
|
472
|
-
const value = agent.overrideModel?.trim();
|
|
473
|
-
if (value) {
|
|
474
|
-
overrides[agent.name] = value;
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
this.#settingsManager.set("task.agentModelOverrides", overrides);
|
|
500
|
+
const overrides = this.#settingsManager.get("task.agentModelOverrides");
|
|
501
|
+
this.#settingsManager.set("task.agentModelOverrides", updateAgentModelOverride(overrides, agentName, rawValue));
|
|
478
502
|
}
|
|
479
503
|
|
|
480
504
|
#toggleSelectedAgent(): void {
|
|
@@ -506,7 +530,7 @@ export class AgentDashboard extends Container {
|
|
|
506
530
|
if (!selected) return;
|
|
507
531
|
const value = rawValue.trim();
|
|
508
532
|
selected.overrideModel = value || undefined;
|
|
509
|
-
this.#
|
|
533
|
+
this.#persistModelOverride(selected.name, value);
|
|
510
534
|
this.#editingAgentName = null;
|
|
511
535
|
this.#editInput = null;
|
|
512
536
|
this.#applyFilters();
|
|
@@ -587,12 +611,7 @@ export class AgentDashboard extends Container {
|
|
|
587
611
|
settings?.getModelRole("default"),
|
|
588
612
|
settings,
|
|
589
613
|
);
|
|
590
|
-
const
|
|
591
|
-
const fallbackModel = modelRegistry.getAvailable()[0];
|
|
592
|
-
const selectedModel = model ?? fallbackModel;
|
|
593
|
-
if (!selectedModel) {
|
|
594
|
-
throw new Error("No available model to generate agent specification.");
|
|
595
|
-
}
|
|
614
|
+
const selectedModel = resolveAgentCreationModel(modelPatterns, modelRegistry, settings);
|
|
596
615
|
|
|
597
616
|
const systemPrompt = prompt.render(agentCreationArchitectPrompt, { TASK_TOOL_NAME: "task" });
|
|
598
617
|
const userPrompt = prompt.render(agentCreationUserPrompt, { request: description });
|
|
@@ -605,6 +624,7 @@ export class AgentDashboard extends Container {
|
|
|
605
624
|
model: selectedModel,
|
|
606
625
|
systemPrompt: [systemPrompt],
|
|
607
626
|
hasUI: false,
|
|
627
|
+
notificationHostModeSupported: false,
|
|
608
628
|
enableLsp: false,
|
|
609
629
|
enableMCP: false,
|
|
610
630
|
disableExtensionDiscovery: true,
|
|
@@ -25,9 +25,11 @@ import {
|
|
|
25
25
|
} from "../../config/model-registry";
|
|
26
26
|
import {
|
|
27
27
|
formatModelSelectorValue,
|
|
28
|
+
resolveConfiguredModelPatterns,
|
|
28
29
|
resolveModelRoleValue,
|
|
29
30
|
type ScopedModelSelection,
|
|
30
31
|
} from "../../config/model-resolver";
|
|
32
|
+
import { type ModelSelectorValue, normalizeModelSelectorValue, selectorHead } from "../../config/model-selector-value";
|
|
31
33
|
import type { ModelProfileConfig } from "../../config/models-config-schema";
|
|
32
34
|
import type { Settings } from "../../config/settings";
|
|
33
35
|
import { type ThemeColor, theme } from "../../modes/theme/theme";
|
|
@@ -227,9 +229,8 @@ function profileRequiredProviders(profile: ModelProfileDefinition): string[] {
|
|
|
227
229
|
return [...new Set(profile.requiredProviders)].sort((a, b) => a.localeCompare(b));
|
|
228
230
|
}
|
|
229
231
|
|
|
230
|
-
function isInheritedRoleSelector(value: string
|
|
231
|
-
|
|
232
|
-
return !normalized || normalized === "default" || normalized === "pi/default";
|
|
232
|
+
function isInheritedRoleSelector(value: string): boolean {
|
|
233
|
+
return value === "default" || value === "pi/default";
|
|
233
234
|
}
|
|
234
235
|
|
|
235
236
|
function getDefaultAliasThinkingLevel(value: string | undefined): ThinkingLevel | undefined {
|
|
@@ -245,28 +246,35 @@ function getSelectorProvider(selector: string): string | undefined {
|
|
|
245
246
|
|
|
246
247
|
function deriveRequiredProviders(modelMapping: ModelProfileConfig["model_mapping"]): string[] {
|
|
247
248
|
const providers = new Set<string>();
|
|
248
|
-
for (const
|
|
249
|
-
const
|
|
250
|
-
|
|
249
|
+
for (const selectorValue of Object.values(modelMapping)) {
|
|
250
|
+
for (const selector of normalizeModelSelectorValue(selectorValue)) {
|
|
251
|
+
const provider = getSelectorProvider(selector);
|
|
252
|
+
if (provider) providers.add(provider);
|
|
253
|
+
}
|
|
251
254
|
}
|
|
252
255
|
return [...providers].sort((a, b) => a.localeCompare(b));
|
|
253
256
|
}
|
|
254
257
|
|
|
255
|
-
function
|
|
256
|
-
left: Readonly<Record<string,
|
|
257
|
-
right: Readonly<Record<string,
|
|
258
|
+
function sameModelSelectorRecord(
|
|
259
|
+
left: Readonly<Record<string, ModelSelectorValue | undefined>>,
|
|
260
|
+
right: Readonly<Record<string, ModelSelectorValue | undefined>>,
|
|
258
261
|
): boolean {
|
|
259
262
|
const leftEntries = Object.entries(left)
|
|
260
|
-
.filter((entry): entry is [string,
|
|
263
|
+
.filter((entry): entry is [string, ModelSelectorValue] => entry[1] !== undefined)
|
|
261
264
|
.sort(([a], [b]) => a.localeCompare(b));
|
|
262
265
|
const rightEntries = Object.entries(right)
|
|
263
|
-
.filter((entry): entry is [string,
|
|
266
|
+
.filter((entry): entry is [string, ModelSelectorValue] => entry[1] !== undefined)
|
|
264
267
|
.sort(([a], [b]) => a.localeCompare(b));
|
|
265
268
|
if (leftEntries.length !== rightEntries.length) return false;
|
|
266
269
|
for (let i = 0; i < leftEntries.length; i++) {
|
|
267
270
|
const leftEntry = leftEntries[i];
|
|
268
271
|
const rightEntry = rightEntries[i];
|
|
269
|
-
if (
|
|
272
|
+
if (
|
|
273
|
+
!leftEntry ||
|
|
274
|
+
!rightEntry ||
|
|
275
|
+
leftEntry[0] !== rightEntry[0] ||
|
|
276
|
+
!sameStringArray(normalizeModelSelectorValue(leftEntry[1]), normalizeModelSelectorValue(rightEntry[1]))
|
|
277
|
+
) {
|
|
270
278
|
return false;
|
|
271
279
|
}
|
|
272
280
|
}
|
|
@@ -318,6 +326,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
318
326
|
#currentModel?: Model;
|
|
319
327
|
#currentThinkingLevel?: ThinkingLevel;
|
|
320
328
|
#activeModelProfile?: string;
|
|
329
|
+
#configuredDefaultChain?: readonly string[];
|
|
321
330
|
#isFastForProvider: (provider?: string) => boolean = () => false;
|
|
322
331
|
#isFastForSubagentProvider: (provider?: string) => boolean = () => false;
|
|
323
332
|
#isCurrentModelFastModeActive: () => boolean = () => false;
|
|
@@ -359,6 +368,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
359
368
|
isCurrentModelFastModeActive?: () => boolean;
|
|
360
369
|
currentThinkingLevel?: ThinkingLevel;
|
|
361
370
|
activeModelProfile?: string;
|
|
371
|
+
configuredDefaultChain?: readonly string[];
|
|
362
372
|
},
|
|
363
373
|
) {
|
|
364
374
|
super();
|
|
@@ -374,6 +384,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
374
384
|
this.#currentModel = _currentModel;
|
|
375
385
|
this.#currentThinkingLevel = options?.currentThinkingLevel;
|
|
376
386
|
this.#activeModelProfile = options?.activeModelProfile;
|
|
387
|
+
this.#configuredDefaultChain = options?.configuredDefaultChain;
|
|
377
388
|
this.#isFastForProvider = options?.isFastForProvider ?? (() => false);
|
|
378
389
|
this.#isFastForSubagentProvider = options?.isFastForSubagentProvider ?? (() => false);
|
|
379
390
|
// Current-model EFFECTIVE fast state. Defaults to intent for the current
|
|
@@ -451,6 +462,24 @@ export class ModelSelectorComponent extends Container {
|
|
|
451
462
|
});
|
|
452
463
|
}
|
|
453
464
|
|
|
465
|
+
#isActiveDefaultFallback(): boolean {
|
|
466
|
+
if (!this.#currentModel) return false;
|
|
467
|
+
const configuredChain =
|
|
468
|
+
this.#configuredDefaultChain ?? normalizeModelSelectorValue(this.#settings.getModelRole("default"));
|
|
469
|
+
if (configuredChain.length < 2) return false;
|
|
470
|
+
|
|
471
|
+
const allModels = this.#modelRegistry.getAll();
|
|
472
|
+
const matchPreferences = { usageOrder: this.#settings.getStorage()?.getModelUsageOrder() };
|
|
473
|
+
return configuredChain.slice(1).some(selector => {
|
|
474
|
+
const resolved = resolveModelRoleValue(selector, allModels, {
|
|
475
|
+
settings: this.#settings,
|
|
476
|
+
matchPreferences,
|
|
477
|
+
modelRegistry: this.#modelRegistry,
|
|
478
|
+
});
|
|
479
|
+
return resolved.model !== undefined && modelsAreEqual(resolved.model, this.#currentModel);
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
|
|
454
483
|
#loadRoleModels(): void {
|
|
455
484
|
const allModels = this.#modelRegistry.getAll();
|
|
456
485
|
const matchPreferences = { usageOrder: this.#settings.getStorage()?.getModelUsageOrder() };
|
|
@@ -476,7 +505,12 @@ export class ModelSelectorComponent extends Container {
|
|
|
476
505
|
};
|
|
477
506
|
}
|
|
478
507
|
}
|
|
479
|
-
if (
|
|
508
|
+
if (
|
|
509
|
+
((this.#configuredDefaultChain?.length ?? 0) > 0 ||
|
|
510
|
+
this.#activeModelProfile ||
|
|
511
|
+
this.#isActiveDefaultFallback()) &&
|
|
512
|
+
this.#currentModel
|
|
513
|
+
) {
|
|
480
514
|
this.#roles.default = {
|
|
481
515
|
model: this.#currentModel,
|
|
482
516
|
thinkingLevel: this.#currentThinkingLevel ?? ThinkingLevel.Inherit,
|
|
@@ -835,33 +869,57 @@ export class ModelSelectorComponent extends Container {
|
|
|
835
869
|
return formatModelSelectorValue(`${this.#currentModel.provider}/${this.#currentModel.id}`, thinkingLevel);
|
|
836
870
|
}
|
|
837
871
|
|
|
838
|
-
#resolveProfileModelSelector(value:
|
|
839
|
-
const
|
|
840
|
-
|
|
872
|
+
#resolveProfileModelSelector(value: ModelSelectorValue | undefined): string | string[] | undefined {
|
|
873
|
+
const resolvedSelectors: string[] = [];
|
|
874
|
+
for (const configuredSelector of normalizeModelSelectorValue(value)) {
|
|
875
|
+
if (isInheritedRoleSelector(configuredSelector)) continue;
|
|
876
|
+
const selectors = resolveConfiguredModelPatterns(configuredSelector, this.#settings);
|
|
877
|
+
for (const selector of selectors.length > 0 ? selectors : [configuredSelector]) {
|
|
878
|
+
const resolved = resolveModelRoleValue(selector, this.#modelRegistry.getAll(), {
|
|
879
|
+
settings: this.#settings,
|
|
880
|
+
matchPreferences: { usageOrder: this.#settings.getStorage()?.getModelUsageOrder() },
|
|
881
|
+
modelRegistry: this.#modelRegistry,
|
|
882
|
+
});
|
|
883
|
+
if (resolved.model) {
|
|
884
|
+
resolvedSelectors.push(
|
|
885
|
+
formatModelSelectorValue(`${resolved.model.provider}/${resolved.model.id}`, resolved.thinkingLevel),
|
|
886
|
+
);
|
|
887
|
+
continue;
|
|
888
|
+
}
|
|
841
889
|
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
return formatModelSelectorValue(`${resolved.model.provider}/${resolved.model.id}`, resolved.thinkingLevel);
|
|
849
|
-
}
|
|
890
|
+
const inheritedDefaultThinkingLevel = getDefaultAliasThinkingLevel(selector);
|
|
891
|
+
if (inheritedDefaultThinkingLevel) {
|
|
892
|
+
const currentSelector = this.#formatCurrentModelSelector(inheritedDefaultThinkingLevel);
|
|
893
|
+
if (currentSelector) resolvedSelectors.push(currentSelector);
|
|
894
|
+
continue;
|
|
895
|
+
}
|
|
850
896
|
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
897
|
+
// Preserve unresolved chain members verbatim instead of silently
|
|
898
|
+
// truncating configured fallback tails.
|
|
899
|
+
resolvedSelectors.push(selector);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
if (resolvedSelectors.length === 0) return undefined;
|
|
903
|
+
return resolvedSelectors.length === 1 ? resolvedSelectors[0] : resolvedSelectors;
|
|
854
904
|
}
|
|
855
905
|
|
|
856
906
|
#buildCustomModelProfileSnapshot(): ModelProfileConfig {
|
|
857
907
|
const modelMapping: ModelProfileConfig["model_mapping"] = {};
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
908
|
+
// Prefer the session's configured default chain so fallback tails are
|
|
909
|
+
// never dropped from the snapshot; the live model only replaces the head.
|
|
910
|
+
if (this.#configuredDefaultChain && this.#configuredDefaultChain.length > 0) {
|
|
911
|
+
const head = this.#formatCurrentModelSelector() ?? this.#configuredDefaultChain[0]!;
|
|
912
|
+
const tail = this.#configuredDefaultChain.slice(1);
|
|
913
|
+
modelMapping.default = tail.length > 0 ? [head, ...tail] : head;
|
|
861
914
|
} else {
|
|
862
|
-
const
|
|
863
|
-
|
|
864
|
-
|
|
915
|
+
const currentModelSelector = this.#formatCurrentModelSelector();
|
|
916
|
+
if (currentModelSelector) {
|
|
917
|
+
modelMapping.default = currentModelSelector;
|
|
918
|
+
} else {
|
|
919
|
+
const defaultRole = this.#settings.getModelRole("default");
|
|
920
|
+
const defaultSelector = this.#resolveProfileModelSelector(defaultRole);
|
|
921
|
+
if (defaultSelector) modelMapping.default = defaultSelector;
|
|
922
|
+
}
|
|
865
923
|
}
|
|
866
924
|
|
|
867
925
|
const agentOverrides = this.#settings.get("task.agentModelOverrides");
|
|
@@ -880,7 +938,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
880
938
|
#findDuplicateGeneratedProfile(snapshot: ModelProfileConfig): ModelProfileDefinition | undefined {
|
|
881
939
|
for (const profile of this.#modelRegistry.getModelProfiles?.().values() ?? []) {
|
|
882
940
|
if (
|
|
883
|
-
|
|
941
|
+
sameModelSelectorRecord(profile.modelMapping, snapshot.model_mapping) &&
|
|
884
942
|
sameStringArray(profile.requiredProviders, snapshot.required_providers)
|
|
885
943
|
) {
|
|
886
944
|
return profile;
|
|
@@ -1148,7 +1206,7 @@ export class ModelSelectorComponent extends Container {
|
|
|
1148
1206
|
});
|
|
1149
1207
|
const label = GJC_MODEL_ASSIGNMENT_TARGETS[role].tag ?? role.toUpperCase();
|
|
1150
1208
|
this.#listContainer.addChild(
|
|
1151
|
-
new Text(` ${label}: ${formatClampedModelSelector(selector, resolved.model)}`, 0, 0),
|
|
1209
|
+
new Text(` ${label}: ${formatClampedModelSelector(selectorHead(selector) ?? "", resolved.model)}`, 0, 0),
|
|
1152
1210
|
);
|
|
1153
1211
|
}
|
|
1154
1212
|
this.#listContainer.addChild(new Spacer(1));
|