@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
|
@@ -1,498 +0,0 @@
|
|
|
1
|
-
import type { AgentTool, ResolvedThinkingLevel } from "@gajae-code/agent-core";
|
|
2
|
-
import { ThinkingLevel } from "@gajae-code/agent-core";
|
|
3
|
-
import { getOAuthProviders } from "@gajae-code/ai/utils/oauth";
|
|
4
|
-
import { Snowflake } from "@gajae-code/utils";
|
|
5
|
-
import type { ExtensionUIContext } from "../../../extensibility/extensions";
|
|
6
|
-
import type { AgentSession } from "../../../session/agent-session";
|
|
7
|
-
import type {
|
|
8
|
-
RpcCommand,
|
|
9
|
-
RpcExtensionUIRequest,
|
|
10
|
-
RpcHostToolDefinition,
|
|
11
|
-
RpcHostUriSchemeDefinition,
|
|
12
|
-
RpcResponse,
|
|
13
|
-
RpcSessionState,
|
|
14
|
-
RpcUnattendedAccepted,
|
|
15
|
-
RpcUnattendedDeclaration,
|
|
16
|
-
RpcWorkflowGateResolution,
|
|
17
|
-
RpcWorkflowGateResponse,
|
|
18
|
-
} from "../../rpc/rpc-types";
|
|
19
|
-
import { rpcError, rpcSuccess } from "./responses";
|
|
20
|
-
import {
|
|
21
|
-
ActionDeniedError,
|
|
22
|
-
ScopeDeniedError,
|
|
23
|
-
UnattendedBudgetExceededError,
|
|
24
|
-
UnattendedNegotiationError,
|
|
25
|
-
} from "./unattended-run-controller";
|
|
26
|
-
import { WorkflowGateBrokerError } from "./workflow-gate-broker";
|
|
27
|
-
|
|
28
|
-
export type RpcCommandDispatchOutput = (obj: RpcResponse | RpcExtensionUIRequest | object) => void;
|
|
29
|
-
|
|
30
|
-
export interface RpcHostToolRegistry {
|
|
31
|
-
setTools(tools: RpcHostToolDefinition[]): AgentTool[];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface RpcHostUriRegistry {
|
|
35
|
-
setSchemes(schemes: RpcHostUriSchemeDefinition[]): string[];
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Optional unattended control plane wired into RPC dispatch (#318/#319/#323).
|
|
40
|
-
* When present, `negotiate_unattended` and `workflow_gate_response` route here
|
|
41
|
-
* instead of falling through to the unknown-command path.
|
|
42
|
-
*/
|
|
43
|
-
export interface RpcUnattendedControlPlane {
|
|
44
|
-
/** Enter unattended mode (fail-closed); throws an Error on refusal. */
|
|
45
|
-
negotiate(declaration: RpcUnattendedDeclaration): RpcUnattendedAccepted;
|
|
46
|
-
/** Resolve a pending workflow gate with the agent's answer. */
|
|
47
|
-
resolveGate(response: RpcWorkflowGateResponse): Promise<RpcWorkflowGateResolution>;
|
|
48
|
-
/** List unresolved durable workflow gates for reconnect replay. */
|
|
49
|
-
listPendingGates?(): import("../../rpc/rpc-types").RpcWorkflowGate[];
|
|
50
|
-
isUnattended?(): boolean;
|
|
51
|
-
preflightCommand?(command: RpcCommand): void;
|
|
52
|
-
reconcileUsage?(phase?: string): void;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface RpcCommandDispatchContext {
|
|
56
|
-
session: AgentSession;
|
|
57
|
-
output: RpcCommandDispatchOutput;
|
|
58
|
-
hostToolRegistry: RpcHostToolRegistry;
|
|
59
|
-
hostUriRegistry: RpcHostUriRegistry;
|
|
60
|
-
createUiContext: () => Pick<ExtensionUIContext, "notify">;
|
|
61
|
-
unattendedControlPlane?: RpcUnattendedControlPlane;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function normalizeHostToolDefinitions(tools: RpcHostToolDefinition[]): RpcHostToolDefinition[] {
|
|
65
|
-
return tools.map((tool, index) => {
|
|
66
|
-
const name = typeof tool.name === "string" ? tool.name.trim() : "";
|
|
67
|
-
if (!name) {
|
|
68
|
-
throw new Error(`Host tool at index ${index} must provide a non-empty name`);
|
|
69
|
-
}
|
|
70
|
-
const description = typeof tool.description === "string" ? tool.description.trim() : "";
|
|
71
|
-
if (!description) {
|
|
72
|
-
throw new Error(`Host tool "${name}" must provide a non-empty description`);
|
|
73
|
-
}
|
|
74
|
-
if (!tool.parameters || typeof tool.parameters !== "object" || Array.isArray(tool.parameters)) {
|
|
75
|
-
throw new Error(`Host tool "${name}" must provide a JSON Schema object`);
|
|
76
|
-
}
|
|
77
|
-
const label = typeof tool.label === "string" && tool.label.trim() ? tool.label.trim() : name;
|
|
78
|
-
return {
|
|
79
|
-
name,
|
|
80
|
-
label,
|
|
81
|
-
description,
|
|
82
|
-
parameters: tool.parameters,
|
|
83
|
-
hidden: tool.hidden === true,
|
|
84
|
-
};
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function serializeRpcDispatchError(err: unknown): string | object {
|
|
89
|
-
if (
|
|
90
|
-
err instanceof ScopeDeniedError ||
|
|
91
|
-
err instanceof ActionDeniedError ||
|
|
92
|
-
err instanceof UnattendedBudgetExceededError
|
|
93
|
-
) {
|
|
94
|
-
return err.payload;
|
|
95
|
-
}
|
|
96
|
-
if (err instanceof UnattendedNegotiationError) {
|
|
97
|
-
return { code: err.code, message: err.message };
|
|
98
|
-
}
|
|
99
|
-
if (err instanceof WorkflowGateBrokerError) {
|
|
100
|
-
return { code: err.code, message: err.message };
|
|
101
|
-
}
|
|
102
|
-
return err instanceof Error ? err.message : String(err);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function isConcreteThinkingLevel(value: unknown): value is ResolvedThinkingLevel {
|
|
106
|
-
return (
|
|
107
|
-
typeof value === "string" &&
|
|
108
|
-
value !== ThinkingLevel.Inherit &&
|
|
109
|
-
(Object.values(ThinkingLevel) as string[]).includes(value)
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export async function dispatchRpcCommand(
|
|
114
|
-
command: RpcCommand,
|
|
115
|
-
context: RpcCommandDispatchContext,
|
|
116
|
-
): Promise<RpcResponse> {
|
|
117
|
-
const { session, output, hostToolRegistry, hostUriRegistry, createUiContext, unattendedControlPlane } = context;
|
|
118
|
-
const id = command.id;
|
|
119
|
-
const typedError = (cmd: string, err: unknown): RpcResponse => rpcError(id, cmd, serializeRpcDispatchError(err));
|
|
120
|
-
const preflight = (): RpcResponse | undefined => {
|
|
121
|
-
if (!unattendedControlPlane?.isUnattended?.() || command.type === "negotiate_unattended") return undefined;
|
|
122
|
-
try {
|
|
123
|
-
unattendedControlPlane.preflightCommand?.(command);
|
|
124
|
-
return undefined;
|
|
125
|
-
} catch (err) {
|
|
126
|
-
return typedError(command.type, err);
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
const reconcile = (phase = `${command.type} post-dispatch`): RpcResponse | undefined => {
|
|
130
|
-
if (!unattendedControlPlane?.isUnattended?.()) return undefined;
|
|
131
|
-
try {
|
|
132
|
-
unattendedControlPlane.reconcileUsage?.(phase);
|
|
133
|
-
return undefined;
|
|
134
|
-
} catch (err) {
|
|
135
|
-
return typedError(command.type, err);
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
const denied = preflight();
|
|
139
|
-
if (denied) return denied;
|
|
140
|
-
|
|
141
|
-
try {
|
|
142
|
-
switch (command.type) {
|
|
143
|
-
case "prompt": {
|
|
144
|
-
session
|
|
145
|
-
.prompt(command.message, {
|
|
146
|
-
images: command.images,
|
|
147
|
-
streamingBehavior: command.streamingBehavior,
|
|
148
|
-
})
|
|
149
|
-
.catch(e => output(rpcError(id, "prompt", serializeRpcDispatchError(e))));
|
|
150
|
-
return reconcile() ?? rpcSuccess(id, "prompt");
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
case "steer": {
|
|
154
|
-
await session.steer(command.message, command.images);
|
|
155
|
-
return rpcSuccess(id, "steer");
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
case "follow_up": {
|
|
159
|
-
await session.followUp(command.message, command.images);
|
|
160
|
-
return rpcSuccess(id, "follow_up");
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
case "abort": {
|
|
164
|
-
await session.abort();
|
|
165
|
-
return rpcSuccess(id, "abort");
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
case "abort_and_prompt": {
|
|
169
|
-
await session.abort();
|
|
170
|
-
session
|
|
171
|
-
.prompt(command.message, { images: command.images })
|
|
172
|
-
.catch(e => output(rpcError(id, "abort_and_prompt", e.message)));
|
|
173
|
-
return rpcSuccess(id, "abort_and_prompt");
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
case "new_session": {
|
|
177
|
-
const options = command.parentSession ? { parentSession: command.parentSession } : undefined;
|
|
178
|
-
const cancelled = !(await session.newSession(options));
|
|
179
|
-
return rpcSuccess(id, "new_session", { cancelled });
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
case "get_state": {
|
|
183
|
-
const state: RpcSessionState = {
|
|
184
|
-
model: session.model,
|
|
185
|
-
thinkingLevel: session.thinkingLevel,
|
|
186
|
-
isStreaming: session.isStreaming,
|
|
187
|
-
isCompacting: session.isCompacting,
|
|
188
|
-
steeringMode: session.steeringMode,
|
|
189
|
-
followUpMode: session.followUpMode,
|
|
190
|
-
interruptMode: session.interruptMode,
|
|
191
|
-
sessionFile: session.sessionFile,
|
|
192
|
-
sessionId: session.sessionId,
|
|
193
|
-
sessionName: session.sessionName,
|
|
194
|
-
autoCompactionEnabled: session.autoCompactionEnabled,
|
|
195
|
-
messageCount: session.messages.length,
|
|
196
|
-
queuedMessageCount: session.queuedMessageCount,
|
|
197
|
-
todoPhases: session.getTodoPhases(),
|
|
198
|
-
contextUsage: session.getContextUsage(),
|
|
199
|
-
};
|
|
200
|
-
const include = new Set(command.include ?? []);
|
|
201
|
-
if (include.has("systemPrompt")) {
|
|
202
|
-
state.systemPrompt = session.systemPrompt;
|
|
203
|
-
}
|
|
204
|
-
if (include.has("tools") || include.has("dumpTools")) {
|
|
205
|
-
state.dumpTools = session.agent.state.tools.map(tool => ({
|
|
206
|
-
name: tool.name,
|
|
207
|
-
description: tool.description,
|
|
208
|
-
parameters: tool.parameters,
|
|
209
|
-
}));
|
|
210
|
-
}
|
|
211
|
-
return rpcSuccess(id, "get_state", state);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
case "set_todos": {
|
|
215
|
-
session.setTodoPhases(command.phases);
|
|
216
|
-
return rpcSuccess(id, "set_todos", { todoPhases: session.getTodoPhases() });
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
case "set_host_tools": {
|
|
220
|
-
const tools = normalizeHostToolDefinitions(command.tools);
|
|
221
|
-
const rpcTools = hostToolRegistry.setTools(tools);
|
|
222
|
-
await session.refreshRpcHostTools(rpcTools);
|
|
223
|
-
return rpcSuccess(id, "set_host_tools", { toolNames: tools.map(tool => tool.name) });
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
case "get_pending_workflow_gates": {
|
|
227
|
-
const gates = unattendedControlPlane?.listPendingGates?.() ?? [];
|
|
228
|
-
return rpcSuccess(id, "get_pending_workflow_gates", { gates });
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
case "set_host_uri_schemes": {
|
|
232
|
-
try {
|
|
233
|
-
const schemes = hostUriRegistry.setSchemes(command.schemes);
|
|
234
|
-
return rpcSuccess(id, "set_host_uri_schemes", { schemes });
|
|
235
|
-
} catch (err) {
|
|
236
|
-
return rpcError(id, "set_host_uri_schemes", err instanceof Error ? err.message : String(err));
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
case "set_model": {
|
|
241
|
-
const models = session.getAvailableModels();
|
|
242
|
-
const model = models.find(m => m.provider === command.provider && m.id === command.modelId);
|
|
243
|
-
if (!model) {
|
|
244
|
-
return rpcError(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
|
|
245
|
-
}
|
|
246
|
-
await session.setModel(model);
|
|
247
|
-
return rpcSuccess(id, "set_model", model);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
case "set_default_model_selection": {
|
|
251
|
-
if (typeof command.provider !== "string" || !command.provider.trim()) {
|
|
252
|
-
return typedError("set_default_model_selection", "provider must be a non-empty string");
|
|
253
|
-
}
|
|
254
|
-
if (typeof command.modelId !== "string" || !command.modelId.trim()) {
|
|
255
|
-
return typedError("set_default_model_selection", "modelId must be a non-empty string");
|
|
256
|
-
}
|
|
257
|
-
const requestedLevel: unknown = command.thinkingLevel;
|
|
258
|
-
if (requestedLevel !== undefined && !isConcreteThinkingLevel(requestedLevel)) {
|
|
259
|
-
return typedError("set_default_model_selection", "thinkingLevel must be a concrete level");
|
|
260
|
-
}
|
|
261
|
-
const model = session
|
|
262
|
-
.getAvailableModels()
|
|
263
|
-
.find(candidate => candidate.provider === command.provider && candidate.id === command.modelId);
|
|
264
|
-
if (!model) {
|
|
265
|
-
return typedError(
|
|
266
|
-
"set_default_model_selection",
|
|
267
|
-
`Model not found: ${command.provider}/${command.modelId}`,
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
const selection = await session.setDefaultModelSelection(model, requestedLevel);
|
|
271
|
-
return rpcSuccess(id, "set_default_model_selection", selection);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
case "cycle_model": {
|
|
275
|
-
const result = await session.cycleModel();
|
|
276
|
-
if (!result) {
|
|
277
|
-
return rpcSuccess(id, "cycle_model", null);
|
|
278
|
-
}
|
|
279
|
-
return rpcSuccess(id, "cycle_model", result);
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
case "get_available_models": {
|
|
283
|
-
const models = session.getAvailableModels();
|
|
284
|
-
return rpcSuccess(id, "get_available_models", { models });
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
case "set_thinking_level": {
|
|
288
|
-
if (!(Object.values(ThinkingLevel) as string[]).includes(command.level as string)) {
|
|
289
|
-
return rpcError(id, "set_thinking_level", `Invalid thinking level: ${String(command.level)}`);
|
|
290
|
-
}
|
|
291
|
-
session.setThinkingLevel(command.level);
|
|
292
|
-
return rpcSuccess(id, "set_thinking_level");
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
case "cycle_thinking_level": {
|
|
296
|
-
const level = session.cycleThinkingLevel();
|
|
297
|
-
if (!level) {
|
|
298
|
-
return rpcSuccess(id, "cycle_thinking_level", null);
|
|
299
|
-
}
|
|
300
|
-
return rpcSuccess(id, "cycle_thinking_level", { level });
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
case "set_steering_mode": {
|
|
304
|
-
if ((command.mode as string) !== "all" && (command.mode as string) !== "one-at-a-time") {
|
|
305
|
-
return rpcError(id, "set_steering_mode", `Invalid steering mode: ${String(command.mode)}`);
|
|
306
|
-
}
|
|
307
|
-
session.setSteeringMode(command.mode);
|
|
308
|
-
return rpcSuccess(id, "set_steering_mode");
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
case "set_follow_up_mode": {
|
|
312
|
-
if ((command.mode as string) !== "all" && (command.mode as string) !== "one-at-a-time") {
|
|
313
|
-
return rpcError(id, "set_follow_up_mode", `Invalid follow-up mode: ${String(command.mode)}`);
|
|
314
|
-
}
|
|
315
|
-
session.setFollowUpMode(command.mode);
|
|
316
|
-
return rpcSuccess(id, "set_follow_up_mode");
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
case "set_interrupt_mode": {
|
|
320
|
-
if ((command.mode as string) !== "immediate" && (command.mode as string) !== "wait") {
|
|
321
|
-
return rpcError(id, "set_interrupt_mode", `Invalid interrupt mode: ${String(command.mode)}`);
|
|
322
|
-
}
|
|
323
|
-
session.setInterruptMode(command.mode);
|
|
324
|
-
return rpcSuccess(id, "set_interrupt_mode");
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
case "compact": {
|
|
328
|
-
const result = await session.compact(command.customInstructions);
|
|
329
|
-
return rpcSuccess(id, "compact", result);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
case "set_auto_compaction": {
|
|
333
|
-
session.setAutoCompactionEnabled(command.enabled);
|
|
334
|
-
return rpcSuccess(id, "set_auto_compaction");
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
case "set_auto_retry": {
|
|
338
|
-
session.setAutoRetryEnabled(command.enabled);
|
|
339
|
-
return rpcSuccess(id, "set_auto_retry");
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
case "abort_retry": {
|
|
343
|
-
session.abortRetry();
|
|
344
|
-
return rpcSuccess(id, "abort_retry");
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
case "bash": {
|
|
348
|
-
const result = await session.executeBash(command.command);
|
|
349
|
-
return reconcile() ?? rpcSuccess(id, "bash", result);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
case "abort_bash": {
|
|
353
|
-
session.abortBash();
|
|
354
|
-
return rpcSuccess(id, "abort_bash");
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
case "get_session_stats": {
|
|
358
|
-
const stats = session.getSessionStats();
|
|
359
|
-
return rpcSuccess(id, "get_session_stats", stats);
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
case "export_html": {
|
|
363
|
-
const path = await session.exportToHtml(command.outputPath);
|
|
364
|
-
return rpcSuccess(id, "export_html", { path });
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
case "switch_session": {
|
|
368
|
-
const cancelled = !(await session.switchSession(command.sessionPath));
|
|
369
|
-
return rpcSuccess(id, "switch_session", { cancelled });
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
case "branch": {
|
|
373
|
-
const result = await session.branch(command.entryId);
|
|
374
|
-
return rpcSuccess(id, "branch", { text: result.selectedText, cancelled: result.cancelled });
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
case "get_branch_messages": {
|
|
378
|
-
const messages = session.getUserMessagesForBranching();
|
|
379
|
-
return rpcSuccess(id, "get_branch_messages", { messages });
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
case "get_last_assistant_text": {
|
|
383
|
-
const text = session.getLastAssistantText();
|
|
384
|
-
return rpcSuccess(id, "get_last_assistant_text", { text });
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
case "set_session_name": {
|
|
388
|
-
const name = command.name.trim();
|
|
389
|
-
if (!name) {
|
|
390
|
-
return rpcError(id, "set_session_name", "Session name cannot be empty");
|
|
391
|
-
}
|
|
392
|
-
const applied = await session.setSessionName(name, "user");
|
|
393
|
-
if (!applied) {
|
|
394
|
-
return rpcError(id, "set_session_name", "Session name cannot be empty");
|
|
395
|
-
}
|
|
396
|
-
return rpcSuccess(id, "set_session_name");
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
case "handoff": {
|
|
400
|
-
const result = await session.handoff(command.customInstructions);
|
|
401
|
-
return rpcSuccess(id, "handoff", result ? { savedPath: result.savedPath } : null);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
case "get_messages": {
|
|
405
|
-
// Fast-lane read: snapshot the live array so a concurrent ordered
|
|
406
|
-
// turn/compaction mutating session.messages in place cannot make this
|
|
407
|
-
// response serialize a half-rewritten array (#606, issue 13).
|
|
408
|
-
return rpcSuccess(id, "get_messages", { messages: [...session.messages] });
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
case "get_login_providers": {
|
|
412
|
-
const providers = getOAuthProviders().map(provider => ({
|
|
413
|
-
id: provider.id,
|
|
414
|
-
name: provider.name,
|
|
415
|
-
available: provider.available,
|
|
416
|
-
authenticated: session.modelRegistry.authStorage.hasAuth(provider.id),
|
|
417
|
-
}));
|
|
418
|
-
return rpcSuccess(id, "get_login_providers", { providers });
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
case "login": {
|
|
422
|
-
const knownProvider = getOAuthProviders().find(p => p.id === command.providerId);
|
|
423
|
-
if (!knownProvider) {
|
|
424
|
-
return rpcError(id, "login", `Unknown OAuth provider: ${command.providerId}`);
|
|
425
|
-
}
|
|
426
|
-
const uiCtx = createUiContext();
|
|
427
|
-
let authEmitted = false;
|
|
428
|
-
try {
|
|
429
|
-
await session.modelRegistry.authStorage.login(command.providerId, {
|
|
430
|
-
onAuth: info => {
|
|
431
|
-
authEmitted = true;
|
|
432
|
-
output({
|
|
433
|
-
type: "extension_ui_request",
|
|
434
|
-
id: Snowflake.next() as string,
|
|
435
|
-
method: "open_url",
|
|
436
|
-
url: info.url,
|
|
437
|
-
instructions: info.instructions,
|
|
438
|
-
} as RpcExtensionUIRequest);
|
|
439
|
-
},
|
|
440
|
-
onProgress: message => {
|
|
441
|
-
uiCtx.notify(message, "info");
|
|
442
|
-
},
|
|
443
|
-
onPrompt: () => {
|
|
444
|
-
if (!authEmitted) {
|
|
445
|
-
return Promise.reject(
|
|
446
|
-
new Error(
|
|
447
|
-
`Provider '${command.providerId}' requires interactive prompts ` +
|
|
448
|
-
"which are not supported in RPC mode. Use the terminal UI to log in.",
|
|
449
|
-
),
|
|
450
|
-
);
|
|
451
|
-
}
|
|
452
|
-
return new Promise<string>(() => {});
|
|
453
|
-
},
|
|
454
|
-
});
|
|
455
|
-
await session.modelRegistry.refresh();
|
|
456
|
-
return rpcSuccess(id, "login", { providerId: command.providerId });
|
|
457
|
-
} catch (err: unknown) {
|
|
458
|
-
return rpcError(id, "login", err instanceof Error ? err.message : String(err));
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
case "negotiate_unattended": {
|
|
463
|
-
if (!unattendedControlPlane) {
|
|
464
|
-
return rpcError(id, "negotiate_unattended", "unattended mode is not available on this session");
|
|
465
|
-
}
|
|
466
|
-
try {
|
|
467
|
-
const accepted = unattendedControlPlane.negotiate(command.declaration);
|
|
468
|
-
return rpcSuccess(id, "negotiate_unattended", accepted);
|
|
469
|
-
} catch (err) {
|
|
470
|
-
return typedError("negotiate_unattended", err);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
case "workflow_gate_response": {
|
|
475
|
-
if (!unattendedControlPlane) {
|
|
476
|
-
return rpcError(id, "workflow_gate_response", "workflow gates are not available on this session");
|
|
477
|
-
}
|
|
478
|
-
try {
|
|
479
|
-
const resolution = await unattendedControlPlane.resolveGate({
|
|
480
|
-
gate_id: command.gate_id,
|
|
481
|
-
answer: command.answer,
|
|
482
|
-
idempotency_key: command.idempotency_key,
|
|
483
|
-
});
|
|
484
|
-
return rpcSuccess(id, "workflow_gate_response", resolution);
|
|
485
|
-
} catch (err) {
|
|
486
|
-
return typedError("workflow_gate_response", err);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
default: {
|
|
491
|
-
const unknownCommand = command as { type: string };
|
|
492
|
-
return rpcError(id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
} catch (err) {
|
|
496
|
-
return rpcError(id, command.type, serializeRpcDispatchError(err));
|
|
497
|
-
}
|
|
498
|
-
}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import type { RpcCommand } from "../../rpc/rpc-types";
|
|
2
|
-
import { isRpcCommandType } from "./scopes";
|
|
3
|
-
|
|
4
|
-
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
5
|
-
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
function optionalString(value: unknown): boolean {
|
|
9
|
-
return value === undefined || typeof value === "string";
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function optionalArray(value: unknown): boolean {
|
|
13
|
-
return value === undefined || Array.isArray(value);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function stringField(value: Record<string, unknown>, key: string): boolean {
|
|
17
|
-
return typeof value[key] === "string";
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const THINKING_LEVELS = new Set(["inherit", "off", "minimal", "low", "medium", "high", "xhigh", "max"]);
|
|
21
|
-
const RESOLVED_THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
|
|
22
|
-
const TODO_STATUSES = new Set(["pending", "in_progress", "completed", "abandoned"]);
|
|
23
|
-
|
|
24
|
-
function optionalBoolean(value: unknown): boolean {
|
|
25
|
-
return value === undefined || typeof value === "boolean";
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function stringArray(value: unknown): value is string[] {
|
|
29
|
-
return Array.isArray(value) && value.every(item => typeof item === "string");
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const GET_STATE_INCLUDES = new Set(["tools", "dumpTools", "systemPrompt"]);
|
|
33
|
-
|
|
34
|
-
function optionalGetStateInclude(value: unknown): boolean {
|
|
35
|
-
return (
|
|
36
|
-
value === undefined ||
|
|
37
|
-
(Array.isArray(value) && value.every(item => typeof item === "string" && GET_STATE_INCLUDES.has(item)))
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function todoPhase(value: unknown): boolean {
|
|
42
|
-
if (!isRecord(value) || typeof value.name !== "string" || !Array.isArray(value.tasks)) return false;
|
|
43
|
-
return value.tasks.every(
|
|
44
|
-
task =>
|
|
45
|
-
isRecord(task) &&
|
|
46
|
-
typeof task.content === "string" &&
|
|
47
|
-
typeof task.status === "string" &&
|
|
48
|
-
TODO_STATUSES.has(task.status) &&
|
|
49
|
-
(task.notes === undefined || stringArray(task.notes)),
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function hostToolDefinition(value: unknown): boolean {
|
|
54
|
-
return (
|
|
55
|
-
isRecord(value) &&
|
|
56
|
-
typeof value.name === "string" &&
|
|
57
|
-
typeof value.description === "string" &&
|
|
58
|
-
isRecord(value.parameters) &&
|
|
59
|
-
optionalString(value.label) &&
|
|
60
|
-
optionalBoolean(value.hidden)
|
|
61
|
-
);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function hostUriScheme(value: unknown): boolean {
|
|
65
|
-
return (
|
|
66
|
-
isRecord(value) &&
|
|
67
|
-
typeof value.scheme === "string" &&
|
|
68
|
-
optionalString(value.description) &&
|
|
69
|
-
optionalBoolean(value.writable) &&
|
|
70
|
-
optionalBoolean(value.immutable)
|
|
71
|
-
);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function unattendedBudget(value: unknown): boolean {
|
|
75
|
-
return (
|
|
76
|
-
isRecord(value) &&
|
|
77
|
-
typeof value.max_tokens === "number" &&
|
|
78
|
-
typeof value.max_tool_calls === "number" &&
|
|
79
|
-
typeof value.max_wall_time_ms === "number" &&
|
|
80
|
-
typeof value.max_cost_usd === "number"
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function unattendedDeclaration(value: unknown): boolean {
|
|
85
|
-
return (
|
|
86
|
-
isRecord(value) &&
|
|
87
|
-
typeof value.actor === "string" &&
|
|
88
|
-
unattendedBudget(value.budget) &&
|
|
89
|
-
stringArray(value.scopes) &&
|
|
90
|
-
stringArray(value.action_allowlist)
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export function isRpcCommand(value: unknown): value is RpcCommand {
|
|
95
|
-
if (!isRecord(value) || !optionalString(value.id) || !isRpcCommandType(value.type)) return false;
|
|
96
|
-
switch (value.type) {
|
|
97
|
-
case "prompt":
|
|
98
|
-
return (
|
|
99
|
-
stringField(value, "message") &&
|
|
100
|
-
optionalArray(value.images) &&
|
|
101
|
-
(value.streamingBehavior === undefined ||
|
|
102
|
-
value.streamingBehavior === "steer" ||
|
|
103
|
-
value.streamingBehavior === "followUp")
|
|
104
|
-
);
|
|
105
|
-
case "steer":
|
|
106
|
-
case "follow_up":
|
|
107
|
-
return stringField(value, "message") && optionalArray(value.images);
|
|
108
|
-
case "abort":
|
|
109
|
-
return true;
|
|
110
|
-
case "get_state":
|
|
111
|
-
return optionalGetStateInclude(value.include);
|
|
112
|
-
case "cycle_model":
|
|
113
|
-
case "get_available_models":
|
|
114
|
-
case "cycle_thinking_level":
|
|
115
|
-
case "abort_retry":
|
|
116
|
-
case "abort_bash":
|
|
117
|
-
case "get_session_stats":
|
|
118
|
-
case "get_branch_messages":
|
|
119
|
-
case "get_last_assistant_text":
|
|
120
|
-
case "get_messages":
|
|
121
|
-
case "get_login_providers":
|
|
122
|
-
case "get_pending_workflow_gates":
|
|
123
|
-
return true;
|
|
124
|
-
case "abort_and_prompt":
|
|
125
|
-
return stringField(value, "message") && optionalArray(value.images);
|
|
126
|
-
case "new_session":
|
|
127
|
-
return optionalString(value.parentSession);
|
|
128
|
-
case "set_todos":
|
|
129
|
-
return Array.isArray(value.phases) && value.phases.every(todoPhase);
|
|
130
|
-
case "set_host_tools":
|
|
131
|
-
return Array.isArray(value.tools) && value.tools.every(hostToolDefinition);
|
|
132
|
-
case "set_host_uri_schemes":
|
|
133
|
-
return Array.isArray(value.schemes) && value.schemes.every(hostUriScheme);
|
|
134
|
-
case "set_capabilities":
|
|
135
|
-
return (
|
|
136
|
-
Array.isArray(value.capabilities) && value.capabilities.every(capability => typeof capability === "string")
|
|
137
|
-
);
|
|
138
|
-
case "set_model":
|
|
139
|
-
return stringField(value, "provider") && stringField(value, "modelId");
|
|
140
|
-
case "set_default_model_selection":
|
|
141
|
-
return (
|
|
142
|
-
typeof value.provider === "string" &&
|
|
143
|
-
value.provider.trim().length > 0 &&
|
|
144
|
-
typeof value.modelId === "string" &&
|
|
145
|
-
value.modelId.trim().length > 0 &&
|
|
146
|
-
(value.thinkingLevel === undefined ||
|
|
147
|
-
(typeof value.thinkingLevel === "string" && RESOLVED_THINKING_LEVELS.has(value.thinkingLevel)))
|
|
148
|
-
);
|
|
149
|
-
case "set_thinking_level":
|
|
150
|
-
return typeof value.level === "string" && THINKING_LEVELS.has(value.level);
|
|
151
|
-
case "set_steering_mode":
|
|
152
|
-
return value.mode === "all" || value.mode === "one-at-a-time";
|
|
153
|
-
case "set_follow_up_mode":
|
|
154
|
-
return value.mode === "all" || value.mode === "one-at-a-time";
|
|
155
|
-
case "set_interrupt_mode":
|
|
156
|
-
return value.mode === "immediate" || value.mode === "wait";
|
|
157
|
-
case "compact":
|
|
158
|
-
return optionalString(value.customInstructions);
|
|
159
|
-
case "set_auto_compaction":
|
|
160
|
-
case "set_auto_retry":
|
|
161
|
-
return typeof value.enabled === "boolean";
|
|
162
|
-
case "bash":
|
|
163
|
-
return stringField(value, "command");
|
|
164
|
-
case "export_html":
|
|
165
|
-
return optionalString(value.outputPath);
|
|
166
|
-
case "switch_session":
|
|
167
|
-
return stringField(value, "sessionPath");
|
|
168
|
-
case "branch":
|
|
169
|
-
return stringField(value, "entryId");
|
|
170
|
-
case "set_session_name":
|
|
171
|
-
return stringField(value, "name");
|
|
172
|
-
case "handoff":
|
|
173
|
-
return optionalString(value.customInstructions);
|
|
174
|
-
case "login":
|
|
175
|
-
return stringField(value, "providerId");
|
|
176
|
-
case "negotiate_unattended":
|
|
177
|
-
return unattendedDeclaration(value.declaration);
|
|
178
|
-
case "workflow_gate_response":
|
|
179
|
-
return stringField(value, "gate_id") && "answer" in value && optionalString(value.idempotency_key);
|
|
180
|
-
}
|
|
181
|
-
}
|