@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
package/src/modes/index.ts
CHANGED
|
@@ -5,30 +5,8 @@ import { postmortem } from "@gajae-code/utils";
|
|
|
5
5
|
* Run modes for the coding agent.
|
|
6
6
|
*/
|
|
7
7
|
export { runAcpMode } from "./acp";
|
|
8
|
-
export { runBridgeMode } from "./bridge/bridge-mode";
|
|
9
8
|
export { InteractiveMode, type InteractiveModeOptions } from "./interactive-mode";
|
|
10
9
|
export { type PrintModeOptions, runPrintMode } from "./print-mode";
|
|
11
|
-
export {
|
|
12
|
-
defineRpcClientTool,
|
|
13
|
-
type ModelInfo,
|
|
14
|
-
RpcClient,
|
|
15
|
-
type RpcClientCustomTool,
|
|
16
|
-
type RpcClientOptions,
|
|
17
|
-
type RpcClientToolContext,
|
|
18
|
-
type RpcClientToolResult,
|
|
19
|
-
type RpcEventListener,
|
|
20
|
-
} from "./rpc/rpc-client";
|
|
21
|
-
export { runRpcMode } from "./rpc/rpc-mode";
|
|
22
|
-
export type {
|
|
23
|
-
RpcCommand,
|
|
24
|
-
RpcHostToolCallRequest,
|
|
25
|
-
RpcHostToolCancelRequest,
|
|
26
|
-
RpcHostToolDefinition,
|
|
27
|
-
RpcHostToolResult,
|
|
28
|
-
RpcHostToolUpdate,
|
|
29
|
-
RpcResponse,
|
|
30
|
-
RpcSessionState,
|
|
31
|
-
} from "./rpc/rpc-types";
|
|
32
10
|
|
|
33
11
|
postmortem.register("terminal-restore", () => {
|
|
34
12
|
emergencyTerminalRestore();
|
|
@@ -62,7 +62,8 @@ import {
|
|
|
62
62
|
scheduleLaunchStarReminderAfterFirstRender,
|
|
63
63
|
starReminderLaunchGate,
|
|
64
64
|
} from "../reminders/star-reminder";
|
|
65
|
-
import type {
|
|
65
|
+
import type { NotificationSessionReconcileResult, NotificationSessionStatus } from "../sdk/bus/session-control";
|
|
66
|
+
import type { AgentSession, AgentSessionEvent, TemporaryProviderSessionScope } from "../session/agent-session";
|
|
66
67
|
import { HistoryStorage } from "../session/history-storage";
|
|
67
68
|
import type { SessionContext, SessionManager } from "../session/session-manager";
|
|
68
69
|
import { getRecentSessions } from "../session/session-manager";
|
|
@@ -407,6 +408,7 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
407
408
|
#goalSuppressNextContinuation = false;
|
|
408
409
|
#planModePreviousModelState: { model: Model; thinkingLevel?: ThinkingLevel } | undefined;
|
|
409
410
|
#pendingModelSwitch: { model: Model; thinkingLevel?: ThinkingLevel } | undefined;
|
|
411
|
+
#planModeProviderSessionScope: TemporaryProviderSessionScope | undefined;
|
|
410
412
|
#planModeHasEntered = false;
|
|
411
413
|
#planReviewContainer: Container | undefined;
|
|
412
414
|
readonly lspServers: LspStartupServerInfo[] | undefined = undefined;
|
|
@@ -543,6 +545,19 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
543
545
|
this.#observerRegistry = new SessionObserverRegistry();
|
|
544
546
|
}
|
|
545
547
|
|
|
548
|
+
getCurrentSessionNotificationStatus(): NotificationSessionStatus | undefined {
|
|
549
|
+
return this.session.notificationSessionController?.query({ sessionManager: this.sessionManager });
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
async setCurrentSessionNotificationsEnabled(
|
|
553
|
+
enabled: boolean,
|
|
554
|
+
): Promise<NotificationSessionReconcileResult | undefined> {
|
|
555
|
+
return await this.session.notificationSessionController?.setLocalEnabled(
|
|
556
|
+
{ sessionManager: this.sessionManager },
|
|
557
|
+
enabled,
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
|
|
546
561
|
async init(): Promise<void> {
|
|
547
562
|
if (this.isInitialized) return;
|
|
548
563
|
|
|
@@ -1353,8 +1368,18 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1353
1368
|
return;
|
|
1354
1369
|
}
|
|
1355
1370
|
try {
|
|
1356
|
-
|
|
1371
|
+
this.#planModeProviderSessionScope = this.session.beginTemporaryProviderSessionScope("plan-mode");
|
|
1372
|
+
await this.session.setModelTemporary(resolved.model, planThinkingLevel, {
|
|
1373
|
+
cause: "temporary-operation",
|
|
1374
|
+
reason: "plan-mode",
|
|
1375
|
+
providerSessionScope: this.#planModeProviderSessionScope,
|
|
1376
|
+
});
|
|
1357
1377
|
} catch (error) {
|
|
1378
|
+
const scope = this.#planModeProviderSessionScope;
|
|
1379
|
+
if (scope) {
|
|
1380
|
+
this.session.restoreTemporaryProviderSessionScope(scope);
|
|
1381
|
+
this.#planModeProviderSessionScope = undefined;
|
|
1382
|
+
}
|
|
1358
1383
|
this.showWarning(
|
|
1359
1384
|
`Failed to switch to plan model for plan mode: ${error instanceof Error ? error.message : String(error)}`,
|
|
1360
1385
|
);
|
|
@@ -1370,8 +1395,18 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1370
1395
|
if (!pending) return;
|
|
1371
1396
|
this.#pendingModelSwitch = undefined;
|
|
1372
1397
|
try {
|
|
1373
|
-
|
|
1398
|
+
this.#planModeProviderSessionScope ??= this.session.beginTemporaryProviderSessionScope("plan-mode");
|
|
1399
|
+
await this.session.setModelTemporary(pending.model, pending.thinkingLevel, {
|
|
1400
|
+
cause: "temporary-operation",
|
|
1401
|
+
reason: "plan-mode",
|
|
1402
|
+
providerSessionScope: this.#planModeProviderSessionScope,
|
|
1403
|
+
});
|
|
1374
1404
|
} catch (error) {
|
|
1405
|
+
const scope = this.#planModeProviderSessionScope;
|
|
1406
|
+
if (scope) {
|
|
1407
|
+
this.session.restoreTemporaryProviderSessionScope(scope);
|
|
1408
|
+
this.#planModeProviderSessionScope = undefined;
|
|
1409
|
+
}
|
|
1375
1410
|
this.showWarning(
|
|
1376
1411
|
`Failed to switch model after streaming: ${error instanceof Error ? error.message : String(error)}`,
|
|
1377
1412
|
);
|
|
@@ -1528,30 +1563,34 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1528
1563
|
if (previousTools && previousTools.length > 0) {
|
|
1529
1564
|
await this.session.setActiveToolsByName(previousTools);
|
|
1530
1565
|
}
|
|
1531
|
-
|
|
1566
|
+
const scope = this.#planModeProviderSessionScope;
|
|
1567
|
+
if (scope && !this.session.isStreaming) {
|
|
1568
|
+
const restored = this.session.restoreTemporaryProviderSessionScope(scope);
|
|
1569
|
+
if (restored) this.#planModeProviderSessionScope = undefined;
|
|
1570
|
+
} else if (this.#planModePreviousModelState) {
|
|
1532
1571
|
const prev = this.#planModePreviousModelState;
|
|
1533
1572
|
if (modelsAreEqual(this.session.model, prev.model)) {
|
|
1534
|
-
// Same model — only thinking level may differ. Avoid setModelTemporary()
|
|
1535
|
-
// which would reset provider-side sessions (openai-responses/OpenAI code backend) and
|
|
1536
|
-
// break conversation continuity.
|
|
1537
1573
|
this.session.setThinkingLevel(prev.thinkingLevel);
|
|
1538
1574
|
} else if (this.session.isStreaming) {
|
|
1539
1575
|
this.#pendingModelSwitch = { model: prev.model, thinkingLevel: prev.thinkingLevel };
|
|
1540
1576
|
} else {
|
|
1541
|
-
await this.session.setModelTemporary(prev.model, prev.thinkingLevel
|
|
1577
|
+
await this.session.setModelTemporary(prev.model, prev.thinkingLevel, {
|
|
1578
|
+
cause: "restore",
|
|
1579
|
+
reason: "plan-mode",
|
|
1580
|
+
});
|
|
1542
1581
|
}
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1582
|
+
}
|
|
1583
|
+
// If #applyPlanModeModel queued a deferred switch to the plan-role model
|
|
1584
|
+
// (because the session was streaming on entry), drop it now: we are
|
|
1585
|
+
// leaving plan mode, so flushing it on the next agent_end would land the
|
|
1586
|
+
// session on the plan-role model after the user has exited plan mode
|
|
1587
|
+
// (issue #816). Only clear when the pending target matches the plan-role
|
|
1588
|
+
// model — leave any unrelated user-queued switch intact.
|
|
1589
|
+
const pending = this.#pendingModelSwitch;
|
|
1590
|
+
if (pending) {
|
|
1591
|
+
const planResolution = this.session.resolveRoleModelWithThinking("plan");
|
|
1592
|
+
if (planResolution.model && modelsAreEqual(pending.model, planResolution.model)) {
|
|
1593
|
+
this.#pendingModelSwitch = undefined;
|
|
1555
1594
|
}
|
|
1556
1595
|
}
|
|
1557
1596
|
this.session.setStandingResolveHandler?.(null);
|
|
@@ -1781,19 +1820,22 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1781
1820
|
if (options.compactBeforeExecute) {
|
|
1782
1821
|
this.session.markPlanCompactAbortPending();
|
|
1783
1822
|
}
|
|
1823
|
+
let sessionSwitchCompleted = true;
|
|
1784
1824
|
let compactOutcome: CompactionOutcome | undefined;
|
|
1785
1825
|
try {
|
|
1786
1826
|
await this.#exitPlanMode({ silent: true, paused: false });
|
|
1787
1827
|
|
|
1788
1828
|
if (!options.preserveContext) {
|
|
1789
|
-
await this.handleClearCommand();
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1829
|
+
sessionSwitchCompleted = await this.handleClearCommand();
|
|
1830
|
+
if (sessionSwitchCompleted) {
|
|
1831
|
+
// The new session has a fresh local:// root — persist the approved plan there
|
|
1832
|
+
// so `local://<title>.md` resolves correctly in the execution session.
|
|
1833
|
+
const newLocalPath = resolveLocalUrlToPath(options.finalPlanFilePath, {
|
|
1834
|
+
getArtifactsDir: () => this.sessionManager.getArtifactsDir(),
|
|
1835
|
+
getSessionId: () => this.sessionManager.getSessionId(),
|
|
1836
|
+
});
|
|
1837
|
+
await Bun.write(newLocalPath, planContent);
|
|
1838
|
+
}
|
|
1797
1839
|
} else if (options.compactBeforeExecute) {
|
|
1798
1840
|
// Distill the plan-mode transcript before the execution turn is queued so
|
|
1799
1841
|
// the plan-approved synthetic prompt lands as a fresh cache anchor.
|
|
@@ -1827,6 +1869,10 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
1827
1869
|
if (previousTools.length > 0) {
|
|
1828
1870
|
await this.session.setActiveToolsByName(previousTools);
|
|
1829
1871
|
}
|
|
1872
|
+
if (!sessionSwitchCompleted) {
|
|
1873
|
+
this.showWarning("Plan approved, but the new session could not be created — execution was not dispatched.");
|
|
1874
|
+
return;
|
|
1875
|
+
}
|
|
1830
1876
|
this.session.setPlanReferencePath(options.finalPlanFilePath);
|
|
1831
1877
|
|
|
1832
1878
|
if (compactOutcome === "cancelled") {
|
|
@@ -2538,15 +2584,18 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2538
2584
|
this.#commandController.handleContextCommand();
|
|
2539
2585
|
}
|
|
2540
2586
|
|
|
2541
|
-
#prepareSessionSwitch(): void {
|
|
2587
|
+
#prepareSessionSwitch(cleanupPreviousSessionUi?: () => void): void {
|
|
2542
2588
|
this.#btwController.dispose();
|
|
2543
|
-
|
|
2589
|
+
if (cleanupPreviousSessionUi) cleanupPreviousSessionUi();
|
|
2590
|
+
else this.#extensionUiController.clearExtensionTerminalInputListeners();
|
|
2544
2591
|
this.#planReviewContainer = undefined;
|
|
2545
2592
|
}
|
|
2546
2593
|
|
|
2547
|
-
handleClearCommand(): Promise<
|
|
2548
|
-
this.#
|
|
2549
|
-
|
|
2594
|
+
async handleClearCommand(): Promise<boolean> {
|
|
2595
|
+
const cleanupPreviousSessionUi = this.#extensionUiController.captureSessionUiCleanup();
|
|
2596
|
+
const switched = await this.#commandController.handleClearCommand();
|
|
2597
|
+
if (switched) this.#prepareSessionSwitch(cleanupPreviousSessionUi);
|
|
2598
|
+
return switched;
|
|
2550
2599
|
}
|
|
2551
2600
|
|
|
2552
2601
|
handleContextClearCommand(): Promise<void> {
|
|
@@ -2554,9 +2603,11 @@ export class InteractiveMode implements InteractiveModeContext {
|
|
|
2554
2603
|
return this.#commandController.handleContextClearCommand();
|
|
2555
2604
|
}
|
|
2556
2605
|
|
|
2557
|
-
handleDropCommand(): Promise<
|
|
2558
|
-
this.#
|
|
2559
|
-
|
|
2606
|
+
async handleDropCommand(): Promise<boolean> {
|
|
2607
|
+
const cleanupPreviousSessionUi = this.#extensionUiController.captureSessionUiCleanup();
|
|
2608
|
+
const switched = await this.#commandController.handleDropCommand();
|
|
2609
|
+
if (switched) this.#prepareSessionSwitch(cleanupPreviousSessionUi);
|
|
2610
|
+
return switched;
|
|
2560
2611
|
}
|
|
2561
2612
|
|
|
2562
2613
|
handleForkCommand(): Promise<void> {
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared extension runtime wiring for
|
|
2
|
+
* Shared extension runtime wiring for non-interactive session callers.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* These callers initialize the extension runner with the same action handlers
|
|
5
5
|
* that delegate to the {@link AgentSession}. Only error reporting, shutdown
|
|
6
6
|
* behavior, and UI context differ between callers — those stay as
|
|
7
7
|
* caller-supplied hooks.
|
|
8
8
|
*/
|
|
9
|
+
import * as path from "node:path";
|
|
10
|
+
import { ThinkingLevel } from "@gajae-code/agent-core";
|
|
9
11
|
import { runExtensionCompact, runExtensionSetModel } from "../extensibility/extensions/compact-handler";
|
|
10
12
|
import { getSessionSlashCommands } from "../extensibility/extensions/get-commands-handler";
|
|
11
13
|
import type { ExtensionError, ExtensionUIContext } from "../extensibility/extensions/types";
|
|
12
14
|
import type { AgentSession } from "../session/agent-session";
|
|
13
15
|
|
|
16
|
+
import { parseThinkingLevel } from "../thinking";
|
|
17
|
+
import type { TodoPhase } from "../tools/todo-write";
|
|
18
|
+
|
|
14
19
|
/** Action name for an extension-originated send failure. */
|
|
15
20
|
export type ExtensionSendAction = "extension_send" | "extension_send_user";
|
|
16
21
|
|
|
@@ -19,9 +24,9 @@ export interface InitializeExtensionsOptions {
|
|
|
19
24
|
reportSendError: (action: ExtensionSendAction, error: Error) => void;
|
|
20
25
|
/** Reports a runtime error surfaced through {@link ExtensionRunner.onError}. */
|
|
21
26
|
reportRuntimeError: (error: ExtensionError) => void;
|
|
22
|
-
/** Optional shutdown hook
|
|
27
|
+
/** Optional shutdown hook for caller-specific lifecycle signaling. */
|
|
23
28
|
onShutdown?: () => void;
|
|
24
|
-
/** Optional UI context
|
|
29
|
+
/** Optional interactive UI context; omitted for headless callers. */
|
|
25
30
|
uiContext?: ExtensionUIContext;
|
|
26
31
|
}
|
|
27
32
|
|
|
@@ -47,9 +52,11 @@ export async function initializeExtensions(session: AgentSession, options: Initi
|
|
|
47
52
|
});
|
|
48
53
|
},
|
|
49
54
|
sendUserMessage: (content, sendOptions) => {
|
|
50
|
-
session.sendUserMessage(content, sendOptions)
|
|
55
|
+
const send = session.sendUserMessage(content, sendOptions);
|
|
56
|
+
void send.catch(e => {
|
|
51
57
|
reportSendError("extension_send_user", e instanceof Error ? e : new Error(String(e)));
|
|
52
58
|
});
|
|
59
|
+
return send;
|
|
53
60
|
},
|
|
54
61
|
appendEntry: (customType, data) => {
|
|
55
62
|
session.sessionManager.appendCustomEntry(customType, data);
|
|
@@ -63,7 +70,17 @@ export async function initializeExtensions(session: AgentSession, options: Initi
|
|
|
63
70
|
getCommands: () => getSessionSlashCommands(session),
|
|
64
71
|
setModel: model => runExtensionSetModel(session, model),
|
|
65
72
|
getThinkingLevel: () => session.thinkingLevel,
|
|
66
|
-
setThinkingLevel: level => session.setThinkingLevel(level),
|
|
73
|
+
setThinkingLevel: (level, persist) => session.setThinkingLevel(level, persist),
|
|
74
|
+
getThinkingVisibility: () => session.getThinkingVisibility(),
|
|
75
|
+
setThinkingVisibility: (visibility, persist) => session.setThinkingVisibility(visibility, persist),
|
|
76
|
+
cycleThinkingLevel: () => session.cycleThinkingLevel(),
|
|
77
|
+
setThinkingLevelForControl: (level, persist) => session.setThinkingLevelForControl(level, persist),
|
|
78
|
+
setThinkingVisibilityForControl: (visibility, persist) =>
|
|
79
|
+
session.setThinkingVisibilityForControl(visibility, persist),
|
|
80
|
+
setModelTemporaryForControl: (model, expectedSessionId) =>
|
|
81
|
+
session.setModelTemporaryForControl(model, expectedSessionId),
|
|
82
|
+
fetchUsageReportsForControl: () => session.fetchUsageReportsForControl(),
|
|
83
|
+
getThinkingScopeForControl: () => session.getThinkingScopeForControl(),
|
|
67
84
|
getSessionName: () => session.sessionManager.getSessionName(),
|
|
68
85
|
setSessionName: async name => {
|
|
69
86
|
await session.sessionManager.setSessionName(name, "user");
|
|
@@ -75,11 +92,286 @@ export async function initializeExtensions(session: AgentSession, options: Initi
|
|
|
75
92
|
isIdle: () => !session.isStreaming,
|
|
76
93
|
abort: () => session.abort(),
|
|
77
94
|
hasPendingMessages: () => session.queuedMessageCount > 0,
|
|
95
|
+
getPendingMessageCounts: () => session.pendingMessageCounts,
|
|
96
|
+
getTranscript: () => session.getTranscript(),
|
|
97
|
+
getTranscriptBody: entryId => session.getTranscriptBody(entryId),
|
|
98
|
+
getGoalState: () => session.getGoalModeState(),
|
|
99
|
+
getTodoState: () => session.getTodoPhases(),
|
|
100
|
+
getQueuedMessages: () => session.getQueuedMessageEntries(),
|
|
101
|
+
getActiveTools: () => session.getActiveToolNames(),
|
|
102
|
+
getAllTools: () => session.getAllToolNames(),
|
|
78
103
|
shutdown,
|
|
79
104
|
getContextUsage: () => session.getContextUsage(),
|
|
80
105
|
getSystemPrompt: () => session.systemPrompt,
|
|
81
106
|
getWorkflowGate: () => session.getWorkflowGateEmitter(),
|
|
82
107
|
compact: instructionsOrOptions => runExtensionCompact(session, instructionsOrOptions),
|
|
108
|
+
clearContext: () => session.clearContext(),
|
|
109
|
+
cycleModel: () => session.cycleModel(),
|
|
110
|
+
cycleThinkingLevel: () => session.cycleThinkingLevel(),
|
|
111
|
+
setQueueMode: (kind, mode) => {
|
|
112
|
+
if (kind === "steering" && (mode === "all" || mode === "one-at-a-time")) {
|
|
113
|
+
session.setSteeringMode(mode);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
if (kind === "follow_up" && (mode === "all" || mode === "one-at-a-time")) {
|
|
117
|
+
session.setFollowUpMode(mode);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
if (kind === "interrupt" && (mode === "immediate" || mode === "wait")) {
|
|
121
|
+
session.setInterruptMode(mode);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
},
|
|
126
|
+
invokeSkill: (name, args) => session.invokeSkill(name, args),
|
|
127
|
+
setPlanMode: on => session.setSdkPlanMode(on),
|
|
128
|
+
operateGoal: (op, objective) => session.operateGoal(op, objective),
|
|
129
|
+
getSkillState: () => session.skills.map(skill => ({ name: skill.name, description: skill.description })),
|
|
130
|
+
getConfigItems: () => session.getSdkConfigItems(),
|
|
131
|
+
getBranchCandidates: () => session.sessionManager.getTree(),
|
|
132
|
+
getExtensions: () => session.extensionRunner?.getExtensionPaths() ?? [],
|
|
133
|
+
getArtifact: async id => {
|
|
134
|
+
const artifactsDir = session.sessionManager.getArtifactsDir();
|
|
135
|
+
if (!artifactsDir || !id) return undefined;
|
|
136
|
+
const candidate = path.resolve(artifactsDir, id);
|
|
137
|
+
const root = `${path.resolve(artifactsDir)}${path.sep}`;
|
|
138
|
+
if (!candidate.startsWith(root))
|
|
139
|
+
throw Object.assign(new Error("Artifact path escapes the session artifact directory."), {
|
|
140
|
+
code: "invalid_input",
|
|
141
|
+
});
|
|
142
|
+
const file = Bun.file(candidate);
|
|
143
|
+
return (await file.exists()) ? new Uint8Array(await file.arrayBuffer()) : undefined;
|
|
144
|
+
},
|
|
145
|
+
getArtifactRange: async (id, offset, length) => {
|
|
146
|
+
const artifactsDir = session.sessionManager.getArtifactsDir();
|
|
147
|
+
if (!artifactsDir || !id) return undefined;
|
|
148
|
+
const candidate = path.resolve(artifactsDir, id);
|
|
149
|
+
const root = `${path.resolve(artifactsDir)}${path.sep}`;
|
|
150
|
+
if (!candidate.startsWith(root))
|
|
151
|
+
throw Object.assign(new Error("Artifact path escapes the session artifact directory."), {
|
|
152
|
+
code: "invalid_input",
|
|
153
|
+
});
|
|
154
|
+
const file = Bun.file(candidate);
|
|
155
|
+
if (!(await file.exists())) return undefined;
|
|
156
|
+
const start = Math.min(Math.max(0, offset), file.size);
|
|
157
|
+
const end = Math.min(file.size, start + Math.max(0, length));
|
|
158
|
+
return { bytes: new Uint8Array(await file.slice(start, end).arrayBuffer()), totalBytes: file.size };
|
|
159
|
+
},
|
|
160
|
+
getJobs: () => session.getAsyncJobSnapshot(),
|
|
161
|
+
setSdkPermissionProvider: provider => session.setSdkPermissionProvider(provider),
|
|
162
|
+
sdkControl: async (operation, input) => {
|
|
163
|
+
switch (operation) {
|
|
164
|
+
case "model.set": {
|
|
165
|
+
const selector = typeof input.id === "string" ? input.id : "";
|
|
166
|
+
const slashIndex = selector.indexOf("/");
|
|
167
|
+
const model =
|
|
168
|
+
slashIndex > 0
|
|
169
|
+
? session.modelRegistry.find(selector.slice(0, slashIndex), selector.slice(slashIndex + 1))
|
|
170
|
+
: undefined;
|
|
171
|
+
const thinkingLevel =
|
|
172
|
+
typeof input.thinkingLevel === "string" ? parseThinkingLevel(input.thinkingLevel) : undefined;
|
|
173
|
+
if (!model || !thinkingLevel || thinkingLevel === ThinkingLevel.Inherit)
|
|
174
|
+
throw Object.assign(new Error("model.set requires a valid model id and concrete thinkingLevel."), {
|
|
175
|
+
code: "invalid_input",
|
|
176
|
+
});
|
|
177
|
+
return await session.setDefaultModelSelection(model, thinkingLevel);
|
|
178
|
+
}
|
|
179
|
+
case "todo.replace": {
|
|
180
|
+
const phases = input.items;
|
|
181
|
+
if (
|
|
182
|
+
!Array.isArray(phases) ||
|
|
183
|
+
!phases.every((phase: unknown) => {
|
|
184
|
+
if (!phase || typeof phase !== "object") return false;
|
|
185
|
+
const candidate = phase as { name?: unknown; tasks?: unknown };
|
|
186
|
+
return (
|
|
187
|
+
typeof candidate.name === "string" &&
|
|
188
|
+
Array.isArray(candidate.tasks) &&
|
|
189
|
+
candidate.tasks.every((task: unknown) => {
|
|
190
|
+
if (!task || typeof task !== "object") return false;
|
|
191
|
+
const item = task as { content?: unknown; status?: unknown };
|
|
192
|
+
return (
|
|
193
|
+
typeof item.content === "string" &&
|
|
194
|
+
["pending", "in_progress", "completed", "abandoned"].includes(String(item.status))
|
|
195
|
+
);
|
|
196
|
+
})
|
|
197
|
+
);
|
|
198
|
+
})
|
|
199
|
+
) {
|
|
200
|
+
throw Object.assign(new Error("todo.replace requires TodoPhase items."), {
|
|
201
|
+
code: "invalid_input",
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
session.setTodoPhases(phases as TodoPhase[]);
|
|
205
|
+
return { replaced: session.getTodoPhases() };
|
|
206
|
+
}
|
|
207
|
+
case "permission_mode.set": {
|
|
208
|
+
const requested = input.mode;
|
|
209
|
+
const mode =
|
|
210
|
+
requested === "allow" || requested === "always-allow"
|
|
211
|
+
? "allow"
|
|
212
|
+
: requested === "deny" || requested === "always-deny"
|
|
213
|
+
? "deny"
|
|
214
|
+
: requested === "prompt"
|
|
215
|
+
? "prompt"
|
|
216
|
+
: undefined;
|
|
217
|
+
if (!mode)
|
|
218
|
+
throw Object.assign(new Error("permission_mode.set requires prompt, allow, or deny."), {
|
|
219
|
+
code: "invalid_input",
|
|
220
|
+
});
|
|
221
|
+
session.setSdkPermissionMode(mode);
|
|
222
|
+
return { changed: true, mode: session.sdkPermissionMode };
|
|
223
|
+
}
|
|
224
|
+
case "bash.execute": {
|
|
225
|
+
if (typeof input.cmd !== "string" || input.cmd.trim() === "")
|
|
226
|
+
throw Object.assign(new Error("bash.execute requires a command."), { code: "invalid_input" });
|
|
227
|
+
const result = await session.executeBash(input.cmd, undefined, { excludeFromContext: true });
|
|
228
|
+
return {
|
|
229
|
+
exitCode: result.exitCode,
|
|
230
|
+
cancelled: result.cancelled,
|
|
231
|
+
output: result.output,
|
|
232
|
+
truncated: result.truncated,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
case "bash.abort": {
|
|
236
|
+
if (!session.isBashRunning) return { aborted: false };
|
|
237
|
+
session.abortBash();
|
|
238
|
+
return { aborted: true };
|
|
239
|
+
}
|
|
240
|
+
case "retry.last": {
|
|
241
|
+
if (!(await session.retry()))
|
|
242
|
+
throw Object.assign(new Error("There is no failed or interrupted turn to retry."), {
|
|
243
|
+
code: "nothing_to_retry",
|
|
244
|
+
});
|
|
245
|
+
return { retried: true };
|
|
246
|
+
}
|
|
247
|
+
case "retry.now": {
|
|
248
|
+
if (!session.isRetrying)
|
|
249
|
+
throw Object.assign(new Error("No retry backoff is pending."), { code: "retry_not_pending" });
|
|
250
|
+
session.retryNow();
|
|
251
|
+
return { retried: true, immediate: true };
|
|
252
|
+
}
|
|
253
|
+
case "bash.background": {
|
|
254
|
+
if (!session.requestForegroundBashBackground())
|
|
255
|
+
throw Object.assign(
|
|
256
|
+
new Error("The active bash command cannot be moved to a managed background job."),
|
|
257
|
+
{ code: "not_foldable" },
|
|
258
|
+
);
|
|
259
|
+
return { backgrounded: true };
|
|
260
|
+
}
|
|
261
|
+
case "compaction.auto.set":
|
|
262
|
+
session.setAutoCompactionEnabled(input.on === true);
|
|
263
|
+
return { changed: true };
|
|
264
|
+
case "retry.auto.set":
|
|
265
|
+
session.setAutoRetryEnabled(input.on === true);
|
|
266
|
+
return { changed: true };
|
|
267
|
+
case "retry.abort":
|
|
268
|
+
session.abortRetry();
|
|
269
|
+
return { aborted: true };
|
|
270
|
+
case "session.new":
|
|
271
|
+
return { created: await session.newSession() };
|
|
272
|
+
case "session.fork":
|
|
273
|
+
return { session: await session.fork() };
|
|
274
|
+
case "session.resume":
|
|
275
|
+
return { resumed: await session.switchSession(String(input.id)) };
|
|
276
|
+
case "session.close":
|
|
277
|
+
await session.sessionManager.flush();
|
|
278
|
+
return { closed: true };
|
|
279
|
+
case "session.switch":
|
|
280
|
+
return { switched: await session.switchSession(String(input.id)) };
|
|
281
|
+
case "session.branch":
|
|
282
|
+
try {
|
|
283
|
+
return await session.branch(String(input.entryId));
|
|
284
|
+
} catch (error) {
|
|
285
|
+
throw Object.assign(
|
|
286
|
+
new Error(error instanceof Error ? error.message : "Branch entry was not found."),
|
|
287
|
+
{ code: "resource_gone" },
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
case "session.rename":
|
|
291
|
+
return { renamed: await session.setSessionName(String(input.name), "user") };
|
|
292
|
+
case "session.handoff":
|
|
293
|
+
try {
|
|
294
|
+
return {
|
|
295
|
+
handoff: await session.handoff(
|
|
296
|
+
typeof input.instructions === "string" ? input.instructions : undefined,
|
|
297
|
+
),
|
|
298
|
+
};
|
|
299
|
+
} catch (error) {
|
|
300
|
+
throw Object.assign(
|
|
301
|
+
new Error(
|
|
302
|
+
error instanceof Error ? error.message : "Handoff is unavailable for the current state.",
|
|
303
|
+
),
|
|
304
|
+
{ code: "invalid_request" },
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
case "session.export_html":
|
|
308
|
+
try {
|
|
309
|
+
return {
|
|
310
|
+
path: await session.exportToHtml(typeof input.path === "string" ? input.path : undefined),
|
|
311
|
+
};
|
|
312
|
+
} catch (error) {
|
|
313
|
+
throw Object.assign(
|
|
314
|
+
new Error(
|
|
315
|
+
error instanceof Error
|
|
316
|
+
? error.message
|
|
317
|
+
: "Session export is unavailable for the current state.",
|
|
318
|
+
),
|
|
319
|
+
{ code: "invalid_request" },
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
case "runtime.reload":
|
|
323
|
+
await session.reload();
|
|
324
|
+
return { reloaded: true };
|
|
325
|
+
case "service_tier.set":
|
|
326
|
+
session.setServiceTier(input.tier as never);
|
|
327
|
+
return { changed: true };
|
|
328
|
+
case "queue.message.remove": {
|
|
329
|
+
const removed = session.removeQueuedMessageForEditing(String(input.id));
|
|
330
|
+
if (removed === undefined)
|
|
331
|
+
throw Object.assign(new Error("Queued message was not found."), { code: "resource_gone" });
|
|
332
|
+
return { removed };
|
|
333
|
+
}
|
|
334
|
+
case "queue.message.move": {
|
|
335
|
+
const id = String(input.id);
|
|
336
|
+
const moved =
|
|
337
|
+
input.before !== undefined
|
|
338
|
+
? session.moveQueuedMessageForEditing(id, "up")
|
|
339
|
+
: session.moveQueuedMessageForEditing(id, "down");
|
|
340
|
+
if (!moved)
|
|
341
|
+
throw Object.assign(new Error("Queue position is invalid."), { code: "invalid_position" });
|
|
342
|
+
return { moved };
|
|
343
|
+
}
|
|
344
|
+
case "queue.message.update": {
|
|
345
|
+
const id = String(input.id);
|
|
346
|
+
const old = session.removeQueuedMessageForEditing(id);
|
|
347
|
+
const patch = input.patch as { text?: unknown };
|
|
348
|
+
if (old === undefined || typeof patch?.text !== "string")
|
|
349
|
+
throw Object.assign(new Error("Queued message update is invalid."), { code: "invalid_message" });
|
|
350
|
+
await session.sendUserMessage(patch.text, {
|
|
351
|
+
deliverAs: id.startsWith("steer:") ? "steer" : "followUp",
|
|
352
|
+
});
|
|
353
|
+
return { updated: true };
|
|
354
|
+
}
|
|
355
|
+
case "extension.set_enabled": {
|
|
356
|
+
const id = String(input.id);
|
|
357
|
+
const disabled = [...(session.settings.get("disabledExtensions") ?? [])];
|
|
358
|
+
const on = input.on === true;
|
|
359
|
+
const next = on ? disabled.filter(value => value !== id) : [...new Set([...disabled, id])];
|
|
360
|
+
session.settings.set("disabledExtensions", next);
|
|
361
|
+
return { changed: true, enabled: on };
|
|
362
|
+
}
|
|
363
|
+
case "session.delete":
|
|
364
|
+
await session.sessionManager.dropSession(String(input.id));
|
|
365
|
+
return { deleted: true };
|
|
366
|
+
case "session.cwd.move":
|
|
367
|
+
await session.sessionManager.moveTo(String(input.path));
|
|
368
|
+
return { moved: true, cwd: session.sessionManager.getCwd() };
|
|
369
|
+
default:
|
|
370
|
+
throw Object.assign(new Error(`${operation} has no AgentSession implementation.`), {
|
|
371
|
+
code: "unavailable",
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
},
|
|
83
375
|
},
|
|
84
376
|
// ExtensionCommandContextActions — commands invokable via prompt("/command")
|
|
85
377
|
{
|
|
@@ -7,16 +7,14 @@
|
|
|
7
7
|
* - ultragoal execution sign-off -> `workflow_gate` { kind: "execution" } whose
|
|
8
8
|
* answer is approve / decline (+ optional reason).
|
|
9
9
|
*
|
|
10
|
-
* Gates remain mandatory; the
|
|
11
|
-
*
|
|
12
|
-
* silently treated as approval.
|
|
10
|
+
* Gates remain mandatory; the remote SDK client answers at the gate boundary.
|
|
11
|
+
* Declining / requesting changes is honored and is NEVER silently treated as approval.
|
|
13
12
|
*
|
|
14
|
-
* This is the pure mapping primitive
|
|
15
|
-
* an unattended controller + gate broker are attached is wired with the transport
|
|
16
|
-
* in #321 and exercised end-to-end by #323.
|
|
13
|
+
* This is the pure mapping primitive used by SDK-native workflow gate emitters.
|
|
17
14
|
*/
|
|
18
|
-
|
|
15
|
+
|
|
19
16
|
import type { OpenGateInput } from "./workflow-gate-broker";
|
|
17
|
+
import type { JsonSchema, WorkflowGateContext } from "./workflow-gate-types";
|
|
20
18
|
|
|
21
19
|
export type ApprovalDecision = "approve" | "request-changes" | "reject";
|
|
22
20
|
export type ExecutionDecision = "approve" | "decline";
|
|
@@ -57,8 +55,8 @@ const APPROVAL_DECISIONS: ApprovalDecision[] = ["approve", "request-changes", "r
|
|
|
57
55
|
const EXECUTION_DECISIONS: ExecutionDecision[] = ["approve", "decline"];
|
|
58
56
|
|
|
59
57
|
/** Build the ralplan `pending approval` -> `workflow_gate { kind: "approval" }` open-input. */
|
|
60
|
-
export function approvalGate(context:
|
|
61
|
-
const schema:
|
|
58
|
+
export function approvalGate(context: WorkflowGateContext = {}): OpenGateInput {
|
|
59
|
+
const schema: JsonSchema = {
|
|
62
60
|
type: "object",
|
|
63
61
|
properties: {
|
|
64
62
|
decision: { type: "string", enum: APPROVAL_DECISIONS },
|
|
@@ -77,8 +75,8 @@ export function approvalGate(context: RpcWorkflowGateContext = {}): OpenGateInpu
|
|
|
77
75
|
}
|
|
78
76
|
|
|
79
77
|
/** Build the ultragoal execution sign-off -> `workflow_gate { kind: "execution" }` open-input. */
|
|
80
|
-
export function executionGate(context:
|
|
81
|
-
const schema:
|
|
78
|
+
export function executionGate(context: WorkflowGateContext = {}): OpenGateInput {
|
|
79
|
+
const schema: JsonSchema = {
|
|
82
80
|
type: "object",
|
|
83
81
|
properties: {
|
|
84
82
|
decision: { type: "string", enum: EXECUTION_DECISIONS },
|