@sayknow-cli/coding-agent 0.4.7 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -0
- package/dist/types/capability/index.d.ts +10 -20
- package/dist/types/capability/types.d.ts +3 -0
- package/dist/types/cli/args.d.ts +0 -2
- package/dist/types/cli/read-cli.d.ts +1 -0
- package/dist/types/cli.d.ts +9 -1
- package/dist/types/commands/daemon.d.ts +2 -2
- package/dist/types/commands/deep-interview.d.ts +9 -0
- package/dist/types/commands/harness.d.ts +22 -0
- package/dist/types/commands/read.d.ts +6 -0
- package/dist/types/commands/sdk.d.ts +20 -2
- package/dist/types/config/keybindings.d.ts +34 -4
- package/dist/types/config/model-profile-contract.d.ts +40 -0
- package/dist/types/config/model-profiles.d.ts +2 -3
- package/dist/types/config/model-registry.d.ts +5 -0
- package/dist/types/config/provider-auth-health.d.ts +14 -0
- package/dist/types/config/provider-ranking.d.ts +59 -0
- package/dist/types/config/settings-schema.d.ts +156 -10
- package/dist/types/config/settings.d.ts +3 -0
- package/dist/types/edit/modes/patch.d.ts +13 -0
- package/dist/types/edit/path-mutation-lock.d.ts +15 -0
- package/dist/types/eval/py/executor.d.ts +1 -1
- package/dist/types/eval/py/runner-artifact.d.ts +8 -0
- package/dist/types/eval/py/tool-bridge.d.ts +1 -2
- package/dist/types/extensibility/extensions/types.d.ts +43 -2
- package/dist/types/extensibility/shared-events.d.ts +6 -0
- package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
- package/dist/types/main.d.ts +33 -2
- package/dist/types/memories/index.d.ts +2 -0
- package/dist/types/modes/acp/acp-agent.d.ts +22 -9
- package/dist/types/modes/components/assistant-message.d.ts +3 -1
- package/dist/types/modes/components/btw-panel.d.ts +1 -0
- package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
- package/dist/types/modes/components/queue-pane.d.ts +8 -0
- package/dist/types/modes/components/queued-message-selector.d.ts +6 -0
- package/dist/types/modes/components/read-tool-group.d.ts +4 -4
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +2 -1
- package/dist/types/modes/components/session-observer-overlay.d.ts +4 -0
- package/dist/types/modes/components/settings-selector.d.ts +2 -0
- package/dist/types/modes/components/tool-execution.d.ts +8 -0
- package/dist/types/modes/components/tool-status-header.d.ts +4 -2
- package/dist/types/modes/components/welcome.d.ts +5 -0
- package/dist/types/modes/controllers/btw-controller.d.ts +5 -0
- package/dist/types/modes/controllers/command-controller.d.ts +2 -0
- package/dist/types/modes/controllers/event-controller.d.ts +3 -0
- package/dist/types/modes/interactive-mode.d.ts +13 -2
- package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
- package/dist/types/modes/prompt-action-autocomplete.d.ts +6 -1
- package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -0
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +2 -2
- package/dist/types/modes/types.d.ts +6 -0
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +2 -1
- package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
- package/dist/types/runtime/memory-domain.d.ts +9 -0
- package/dist/types/runtime/memory-guard-contract.d.ts +71 -0
- package/dist/types/runtime/memory-guard.d.ts +39 -0
- package/dist/types/runtime/memory-limit.d.ts +11 -0
- package/dist/types/runtime-mcp/content-limits.d.ts +7 -0
- package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +1 -1
- package/dist/types/runtime-mcp/manager.d.ts +9 -1
- package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -5
- package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +14 -0
- package/dist/types/runtime-mcp/redaction.d.ts +2 -0
- package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
- package/dist/types/sdk/acp/final-text.d.ts +19 -0
- package/dist/types/sdk/acp/mcp.d.ts +23 -0
- package/dist/types/sdk/broker/broker.d.ts +2 -0
- package/dist/types/sdk/broker/lifecycle.d.ts +13 -0
- package/dist/types/sdk/bus/chat-daemon-control.d.ts +9 -1
- package/dist/types/sdk/bus/config-commands.d.ts +2 -2
- package/dist/types/sdk/bus/config.d.ts +2 -0
- package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
- package/dist/types/sdk/bus/conversation-store.d.ts +1 -0
- package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
- package/dist/types/sdk/bus/index.d.ts +52 -4
- package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +37 -0
- package/dist/types/sdk/bus/lifecycle-commands.d.ts +5 -4
- package/dist/types/sdk/bus/notification-orchestration.d.ts +1 -0
- package/dist/types/sdk/bus/notification-service.d.ts +34 -0
- package/dist/types/sdk/bus/operator-runtime.d.ts +1 -0
- package/dist/types/sdk/bus/prompt-reconciliation.d.ts +106 -0
- package/dist/types/sdk/bus/rate-limit-pool.d.ts +2 -0
- package/dist/types/sdk/bus/reconciliation-store.d.ts +65 -0
- package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +33 -9
- package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -1
- package/dist/types/sdk/bus/telegram-daemon.d.ts +286 -12
- package/dist/types/sdk/bus/telegram-reference.d.ts +2 -0
- package/dist/types/sdk/bus/topic-registry.d.ts +88 -2
- package/dist/types/sdk/client/discovery.d.ts +2 -0
- package/dist/types/sdk/client/liveness.d.ts +7 -0
- package/dist/types/sdk/host/control/operations.d.ts +3 -2
- package/dist/types/sdk/host/host.d.ts +3 -1
- package/dist/types/sdk/host/query/handlers.d.ts +14 -0
- package/dist/types/sdk/index.d.ts +2 -0
- package/dist/types/sdk/lifecycle-session.d.ts +10 -1
- package/dist/types/sdk/prompt-status.d.ts +88 -0
- package/dist/types/sdk/session-directory.d.ts +1 -1
- package/dist/types/sdk/session.d.ts +7 -0
- package/dist/types/sdk/startup-capability.d.ts +9 -0
- package/dist/types/sdk/transport/auth-preface.d.ts +9 -0
- package/dist/types/sdk/transport/index.d.ts +12 -0
- package/dist/types/sdk/transport/relay.d.ts +43 -0
- package/dist/types/sdk/transport/serve-cli.d.ts +4 -0
- package/dist/types/sdk/transport/socket.d.ts +7 -0
- package/dist/types/sdk/transport/stdio.d.ts +3 -0
- package/dist/types/session/agent-session.d.ts +83 -24
- package/dist/types/session/btw-contract.d.ts +16 -0
- package/dist/types/session/fallback-chain-controller.d.ts +18 -2
- package/dist/types/session/internal/managed-session-scope.d.ts +70 -10
- package/dist/types/session/internal/managed-session-storage.d.ts +34 -12
- package/dist/types/session/internal/native-publish-outcome.d.ts +48 -0
- package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
- package/dist/types/session/session-manager.d.ts +89 -18
- package/dist/types/session/session-storage.d.ts +31 -0
- package/dist/types/session/streaming-output.d.ts +60 -5
- package/dist/types/setup/credential-import.d.ts +5 -1
- package/dist/types/setup/provider-onboarding.d.ts +2 -0
- package/dist/types/skc-runtime/deep-interview-runtime.d.ts +1 -1
- package/dist/types/skc-runtime/deep-interview-stage.d.ts +37 -0
- package/dist/types/skc-runtime/gc-runtime.d.ts +1 -1
- package/dist/types/skc-runtime/linux-proc.d.ts +22 -14
- package/dist/types/skc-runtime/memory-guard-owner-claims.d.ts +47 -0
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +112 -1
- package/dist/types/skc-runtime/repository-binding.d.ts +63 -0
- package/dist/types/skc-runtime/state-runtime.d.ts +3 -1
- package/dist/types/skc-runtime/state-writer.d.ts +5 -1
- package/dist/types/skc-runtime/team-launch.d.ts +1 -1
- package/dist/types/skc-runtime/team-runtime.d.ts +9 -2
- package/dist/types/skc-runtime/team-store.d.ts +12 -0
- package/dist/types/skc-runtime/team-worker-memory-guard.d.ts +92 -0
- package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +7 -0
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +6 -5
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +28 -0
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +43 -5
- package/dist/types/skill-state/workflow-hud.d.ts +3 -0
- package/dist/types/ssh/utils.d.ts +1 -0
- package/dist/types/task/discovery.d.ts +3 -1
- package/dist/types/task/executor.d.ts +6 -0
- package/dist/types/task/index.d.ts +3 -1
- package/dist/types/task/provider-retry-status.d.ts +13 -0
- package/dist/types/task/receipt.d.ts +2 -0
- package/dist/types/task/types.d.ts +133 -0
- package/dist/types/task/ultragoal-redteam-activation.d.ts +33 -0
- package/dist/types/tools/browser/launch.d.ts +7 -0
- package/dist/types/tools/fetch.d.ts +22 -9
- package/dist/types/tools/image-gen.d.ts +63 -1
- package/dist/types/tools/index.d.ts +7 -1
- package/dist/types/tools/output-meta.d.ts +21 -1
- package/dist/types/tools/read-internals.d.ts +12 -0
- package/dist/types/tools/read.d.ts +45 -1
- package/dist/types/tools/resource-gc.d.ts +23 -0
- package/dist/types/tools/skill-discovery.d.ts +7 -0
- package/dist/types/tools/sqlite-reader.d.ts +7 -0
- package/dist/types/tools/tool-result.d.ts +7 -1
- package/dist/types/utils/prompt-suggestion.d.ts +33 -0
- package/dist/types/utils/shell-snapshot.d.ts +12 -0
- package/dist/types/web/insane/bridge.d.ts +1 -0
- package/dist/types/web/insane/url-guard.d.ts +17 -0
- package/package.json +8 -12
- package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
- package/scripts/capture-platform-shortcut-labels-showcase.ts +342 -0
- package/scripts/capture-sticky-viewport-showcase.ts +292 -0
- package/scripts/compile-args.ts +0 -1
- package/scripts/dogfood-repository-binding.ts +209 -0
- package/scripts/generate-docs-index.ts +4 -1
- package/scripts/generate-sdk-operation-inventory.ts +9 -0
- package/scripts/run-test-manifest.ts +6 -4
- package/scripts/verify-skc-sdk-canonicalization.ts +122 -18
- package/scripts/verify-sticky-viewport-showcase.ts +611 -0
- package/src/capability/index.ts +58 -42
- package/src/capability/types.ts +3 -0
- package/src/cli/args.ts +16 -100
- package/src/cli/fast-help.ts +1 -1
- package/src/cli/mcp-cli.ts +4 -21
- package/src/cli/notify-cli.ts +6 -38
- package/src/cli/read-cli.ts +2 -1
- package/src/cli/setup-cli.ts +10 -4
- package/src/cli.ts +133 -11
- package/src/commands/daemon.ts +22 -5
- package/src/commands/deep-interview.ts +26 -1
- package/src/commands/harness.ts +35 -12
- package/src/commands/read.ts +11 -2
- package/src/commands/sdk.ts +134 -17
- package/src/commands/team.ts +1 -1
- package/src/commit/agentic/index.ts +3 -3
- package/src/commit/map-reduce/index.ts +2 -2
- package/src/config/keybindings.ts +158 -25
- package/src/config/model-profile-contract.ts +174 -0
- package/src/config/model-profiles.ts +51 -10
- package/src/config/model-registry.ts +24 -4
- package/src/config/model-resolver.ts +2 -2
- package/src/config/provider-auth-health.ts +42 -0
- package/src/config/provider-ranking.ts +119 -0
- package/src/config/settings-schema.ts +157 -10
- package/src/config/settings.ts +254 -108
- package/src/coordinator-mcp/model-preset.ts +21 -74
- package/src/defaults/skc/skills/deep-interview/SKILL.md +147 -24
- package/src/defaults/skc/skills/ralplan/SKILL.md +91 -34
- package/src/defaults/skc/skills/team/SKILL.md +1 -1
- package/src/defaults/skc/skills/ultragoal/SKILL.md +68 -17
- package/src/discovery/ssh.ts +12 -1
- package/src/edit/index.ts +3 -6
- package/src/edit/modes/patch.ts +38 -1
- package/src/edit/modes/replace.ts +42 -0
- package/src/edit/path-mutation-lock.ts +112 -0
- package/src/eval/js/tool-bridge.ts +1 -1
- package/src/eval/py/executor.ts +37 -13
- package/src/eval/py/kernel.ts +1 -21
- package/src/eval/py/prelude.py +2 -2
- package/src/eval/py/runner-artifact.ts +84 -0
- package/src/eval/py/tool-bridge.ts +34 -18
- package/src/extensibility/extensions/runner.ts +4 -0
- package/src/extensibility/extensions/types.ts +42 -4
- package/src/extensibility/plugins/marketplace/fetcher.ts +191 -7
- package/src/extensibility/shared-events.ts +5 -0
- package/src/extensibility/skc-plugins/runtime-adapters.ts +2 -1
- package/src/hooks/native-skill-hook.ts +17 -4
- package/src/internal-urls/docs-index.generated.ts +17 -16
- package/src/internal-urls/local-protocol.ts +87 -25
- package/src/internal-urls/local-root-gc.ts +127 -0
- package/src/internal-urls/mcp-protocol.ts +73 -11
- package/src/main.ts +120 -42
- package/src/memories/index.ts +10 -0
- package/src/modes/DESIGN.md +52 -0
- package/src/modes/acp/acp-agent.ts +647 -83
- package/src/modes/acp/acp-event-mapper.ts +106 -12
- package/src/modes/acp/acp-mode.ts +39 -3
- package/src/modes/action-registry.ts +1 -1
- package/src/modes/components/assistant-message.ts +123 -22
- package/src/modes/components/btw-panel.ts +82 -16
- package/src/modes/components/irc-sidebar.ts +176 -62
- package/src/modes/components/model-selector.ts +61 -4
- package/src/modes/components/notifications-settings-editor.ts +1 -1
- package/src/modes/components/oauth-selector.ts +42 -12
- package/src/modes/components/plan-preview-overlay.ts +1 -1
- package/src/modes/components/queue-pane.ts +55 -9
- package/src/modes/components/queued-message-selector.ts +53 -10
- package/src/modes/components/read-tool-group.ts +82 -14
- package/src/modes/components/runtime-mcp-add-wizard.ts +5 -0
- package/src/modes/components/sayknow-pet-widget.ts +20 -8
- package/src/modes/components/session-observer-overlay.ts +187 -32
- package/src/modes/components/settings-selector.ts +60 -18
- package/src/modes/components/tool-execution.ts +138 -27
- package/src/modes/components/tool-status-header.ts +26 -8
- package/src/modes/components/welcome.ts +50 -23
- package/src/modes/controllers/btw-controller.ts +119 -36
- package/src/modes/controllers/command-controller.ts +101 -54
- package/src/modes/controllers/event-controller.ts +119 -27
- package/src/modes/controllers/extension-ui-controller.ts +23 -12
- package/src/modes/controllers/input-controller.ts +100 -8
- package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -6
- package/src/modes/controllers/selector-controller.ts +4 -1
- package/src/modes/interactive-mode.ts +201 -60
- package/src/modes/irc-observation-ledger.ts +71 -15
- package/src/modes/prompt-action-autocomplete.ts +32 -13
- package/src/modes/prompt-suggestion-controller.ts +96 -0
- package/src/modes/runtime-init.ts +20 -2
- package/src/modes/shared/agent-wire/command-dispatch.ts +3 -3
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +2 -2
- package/src/modes/types.ts +6 -0
- package/src/modes/utils/hotkeys-markdown.ts +64 -36
- package/src/modes/utils/ui-helpers.ts +99 -4
- package/src/prompts/agent-fragments/restricted-bash.md +1 -1
- package/src/prompts/agents/architect.md +17 -3
- package/src/prompts/agents/critic.md +17 -2
- package/src/prompts/agents/executor.md +1 -1
- package/src/prompts/agents/planner.md +8 -1
- package/src/prompts/system/btw-user.md +3 -8
- package/src/prompts/system/prompt-suggestion-system.md +32 -0
- package/src/prompts/system/system-prompt.md +6 -3
- package/src/prompts/tools/cron.md +3 -1
- package/src/prompts/tools/read.md +4 -2
- package/src/prompts/tools/skill-discovery.md +1 -0
- package/src/runtime/memory-domain.ts +66 -0
- package/src/runtime/memory-guard-contract.ts +73 -0
- package/src/runtime/memory-guard.ts +292 -0
- package/src/runtime/memory-limit.ts +50 -0
- package/src/runtime-mcp/client.ts +41 -55
- package/src/runtime-mcp/content-limits.ts +71 -0
- package/src/runtime-mcp/discoverable-tool-metadata.ts +1 -1
- package/src/runtime-mcp/json-rpc.ts +28 -11
- package/src/runtime-mcp/manager.ts +77 -59
- package/src/runtime-mcp/oauth-flow.ts +0 -72
- package/src/runtime-mcp/plugin-network-boundary.ts +101 -0
- package/src/runtime-mcp/redaction.ts +30 -0
- package/src/runtime-mcp/smithery-auth.ts +17 -2
- package/src/runtime-mcp/smithery-connect.ts +11 -1
- package/src/runtime-mcp/transports/http.ts +63 -22
- package/src/sdk/acp/adapter.ts +8 -1
- package/src/sdk/acp/final-text.ts +40 -0
- package/src/sdk/acp/mcp.ts +26 -0
- package/src/sdk/broker/broker.ts +34 -20
- package/src/sdk/broker/identity.ts +22 -12
- package/src/sdk/broker/lifecycle.ts +293 -43
- package/src/sdk/broker/session-index.ts +11 -1
- package/src/sdk/bus/chat-daemon-cli.ts +2 -2
- package/src/sdk/bus/chat-daemon-control.ts +22 -5
- package/src/sdk/bus/config-commands.ts +2 -2
- package/src/sdk/bus/config.ts +10 -2
- package/src/sdk/bus/control-drain-lease.ts +104 -0
- package/src/sdk/bus/conversation-store.ts +40 -6
- package/src/sdk/bus/daemon-paths.ts +2 -0
- package/src/sdk/bus/index.ts +793 -121
- package/src/sdk/bus/kind-aware-reconciliation.ts +242 -0
- package/src/sdk/bus/lifecycle-commands.ts +63 -10
- package/src/sdk/bus/lifecycle-control-runtime.ts +11 -2
- package/src/sdk/bus/lifecycle-orchestrator.ts +32 -1
- package/src/sdk/bus/notification-orchestration.ts +12 -0
- package/src/sdk/bus/notification-service.ts +87 -25
- package/src/sdk/bus/operator-runtime.ts +31 -5
- package/src/sdk/bus/prompt-reconciliation.ts +240 -0
- package/src/sdk/bus/rate-limit-pool.ts +8 -0
- package/src/sdk/bus/recent-activity.ts +90 -26
- package/src/sdk/bus/reconciliation-store.ts +224 -0
- package/src/sdk/bus/telegram-cli.ts +6 -13
- package/src/sdk/bus/telegram-daemon-cli.ts +8 -3
- package/src/sdk/bus/telegram-daemon-contract.ts +34 -9
- package/src/sdk/bus/telegram-daemon-control.ts +161 -40
- package/src/sdk/bus/telegram-daemon.ts +3649 -593
- package/src/sdk/bus/telegram-reference.ts +20 -2
- package/src/sdk/bus/topic-registry.ts +451 -12
- package/src/sdk/cli/session-cli.ts +15 -2
- package/src/sdk/client/discovery.ts +19 -3
- package/src/sdk/client/liveness.ts +49 -0
- package/src/sdk/host/control/dispatch.ts +8 -2
- package/src/sdk/host/control/operations.ts +3 -2
- package/src/sdk/host/host.ts +27 -9
- package/src/sdk/host/query/handlers.ts +125 -5
- package/src/sdk/index.ts +12 -0
- package/src/sdk/lifecycle-session.ts +19 -3
- package/src/sdk/mcp/server.ts +46 -18
- package/src/sdk/prompt-status.ts +97 -0
- package/src/sdk/protocol/operation-inventory.generated.json +145 -0
- package/src/sdk/protocol/operation-registry.ts +24 -4
- package/src/sdk/session-directory.ts +5 -1
- package/src/sdk/session.ts +69 -8
- package/src/sdk/startup-capability.ts +15 -1
- package/src/sdk/transport/auth-preface.ts +82 -0
- package/src/sdk/transport/index.ts +18 -0
- package/src/sdk/transport/relay.ts +252 -0
- package/src/sdk/transport/serve-cli.ts +105 -0
- package/src/sdk/transport/socket.ts +197 -0
- package/src/sdk/transport/stdio.ts +17 -0
- package/src/session/agent-session.ts +1112 -314
- package/src/session/blob-store.ts +25 -7
- package/src/session/btw-contract.ts +59 -0
- package/src/session/fallback-chain-controller.ts +47 -8
- package/src/session/internal/managed-session-scope.ts +1426 -259
- package/src/session/internal/managed-session-storage.ts +414 -238
- package/src/session/internal/native-publish-outcome.ts +271 -0
- package/src/session/memory-guard-checkpoint-participant.ts +131 -0
- package/src/session/session-manager.ts +2079 -469
- package/src/session/session-storage.ts +151 -11
- package/src/session/streaming-output.ts +262 -43
- package/src/setup/credential-import.ts +28 -3
- package/src/setup/provider-onboarding.ts +49 -5
- package/src/setup/provider-presets.json +2 -1
- package/src/skc-runtime/deep-interview-runtime.ts +303 -36
- package/src/skc-runtime/deep-interview-stage.ts +1016 -0
- package/src/skc-runtime/deep-interview-state.ts +8 -5
- package/src/skc-runtime/gc-render.ts +1 -0
- package/src/skc-runtime/gc-runtime.ts +11 -1
- package/src/skc-runtime/linux-proc.ts +70 -36
- package/src/skc-runtime/managed-owner-supervisor.ts +83 -4
- package/src/skc-runtime/memory-guard-owner-claims.ts +389 -0
- package/src/skc-runtime/ralplan-runtime.ts +1057 -75
- package/src/skc-runtime/repository-binding.ts +267 -0
- package/src/skc-runtime/session-state-sidecar.ts +25 -9
- package/src/skc-runtime/state-runtime.ts +50 -12
- package/src/skc-runtime/state-writer.ts +68 -56
- package/src/skc-runtime/team-launch.ts +34 -5
- package/src/skc-runtime/team-runtime.ts +41 -1
- package/src/skc-runtime/team-store.ts +32 -0
- package/src/skc-runtime/team-worker-memory-guard.ts +363 -0
- package/src/skc-runtime/team-workers.ts +1 -0
- package/src/skc-runtime/tmux-common.ts +13 -2
- package/src/skc-runtime/tmux-owner-isolation.ts +20 -1
- package/src/skc-runtime/tmux-sessions.ts +45 -6
- package/src/skc-runtime/ultragoal-guard.ts +93 -15
- package/src/skc-runtime/ultragoal-receipt-freshness.ts +123 -0
- package/src/skc-runtime/ultragoal-runtime.ts +469 -38
- package/src/skc-runtime/workflow-manifest.generated.json +195 -5
- package/src/skc-runtime/workflow-manifest.ts +67 -3
- package/src/skill-state/workflow-hud.ts +25 -2
- package/src/skill-state/workflow-mutation-guard.ts +104 -12
- package/src/slash-commands/builtin-registry.ts +1 -1
- package/src/ssh/utils.ts +14 -0
- package/src/task/discovery.ts +8 -2
- package/src/task/executor.ts +165 -47
- package/src/task/index.ts +123 -15
- package/src/task/provider-retry-status.ts +88 -0
- package/src/task/receipt.ts +3 -0
- package/src/task/render.ts +45 -26
- package/src/task/skc-command.ts +2 -2
- package/src/task/types.ts +55 -10
- package/src/task/ultragoal-redteam-activation.ts +75 -0
- package/src/tools/ask.ts +1 -1
- package/src/tools/ast-edit.ts +2 -2
- package/src/tools/bash-allowed-prefixes.ts +45 -1
- package/src/tools/bash-pty-selection.ts +2 -2
- package/src/tools/browser/launch.ts +41 -6
- package/src/tools/browser/screenshot-format.ts +6 -1
- package/src/tools/cron.ts +1 -1
- package/src/tools/fetch.ts +127 -154
- package/src/tools/image-gen.ts +476 -23
- package/src/tools/index.ts +7 -1
- package/src/tools/output-meta.ts +176 -9
- package/src/tools/path-utils.ts +5 -1
- package/src/tools/read-internals.ts +44 -0
- package/src/tools/read.ts +1544 -310
- package/src/tools/resource-gc.ts +665 -125
- package/src/tools/skill-discovery.ts +39 -3
- package/src/tools/sqlite-reader.ts +63 -5
- package/src/tools/subagent-render.ts +74 -16
- package/src/tools/subagent.ts +2 -0
- package/src/tools/tool-result.ts +14 -1
- package/src/utils/edit-mode.ts +2 -2
- package/src/utils/pasted-image-path.ts +15 -6
- package/src/utils/prompt-suggestion.ts +265 -0
- package/src/utils/shell-snapshot.ts +173 -63
- package/src/utils/sixel.ts +3 -3
- package/src/web/insane/bridge.ts +5 -1
- package/src/web/insane/url-guard.ts +140 -27
- package/src/web/scrapers/docs-rs.ts +30 -5
- package/src/web/scrapers/types.ts +19 -49
- package/src/web/scrapers/utils.ts +12 -26
- package/src/web/search/providers/codex.ts +1 -1
- package/src/workflow/workflow-intent-diff.ts +4 -1
package/src/task/discovery.ts
CHANGED
|
@@ -14,6 +14,7 @@ import * as path from "node:path";
|
|
|
14
14
|
import { logger } from "@sayknow-cli/utils";
|
|
15
15
|
import { isProviderEnabled } from "../capability";
|
|
16
16
|
import { findAllNearestProjectConfigDirs, getConfigDirs } from "../config";
|
|
17
|
+
import type { Settings } from "../config/settings";
|
|
17
18
|
import { listClaudePluginRoots } from "../discovery/helpers";
|
|
18
19
|
import { rootContainsSkcManifest } from "../extensibility/skc-plugins/paths";
|
|
19
20
|
import { loadBundledAgents, parseAgent } from "./agents";
|
|
@@ -57,8 +58,13 @@ async function loadAgentsFromDir(dir: string, source: AgentSource): Promise<Agen
|
|
|
57
58
|
* Precedence (highest wins): .skc project, .skc user, SKC plugins, then bundled
|
|
58
59
|
*
|
|
59
60
|
* @param cwd - Current working directory for project agent discovery
|
|
61
|
+
* @param activeSettings - Settings used to resolve enabled providers.
|
|
60
62
|
*/
|
|
61
|
-
export async function discoverAgents(
|
|
63
|
+
export async function discoverAgents(
|
|
64
|
+
cwd: string,
|
|
65
|
+
home: string = os.homedir(),
|
|
66
|
+
activeSettings?: Settings,
|
|
67
|
+
): Promise<DiscoveryResult> {
|
|
62
68
|
const resolvedCwd = path.resolve(cwd);
|
|
63
69
|
const agentSources = Array.from(new Set(getConfigDirs("", { project: false }).map(entry => entry.source)));
|
|
64
70
|
|
|
@@ -91,7 +97,7 @@ export async function discoverAgents(cwd: string, home: string = os.homedir()):
|
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
// Load agents from SKC marketplace plugins.
|
|
94
|
-
const { roots: pluginRoots } = isProviderEnabled("claude-plugins")
|
|
100
|
+
const { roots: pluginRoots } = isProviderEnabled("claude-plugins", activeSettings)
|
|
95
101
|
? await listClaudePluginRoots(home, resolvedCwd)
|
|
96
102
|
: { roots: [] };
|
|
97
103
|
const nonSkcPluginRoots = [];
|
package/src/task/executor.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type {
|
|
|
15
15
|
} from "@sayknow-cli/agent-core";
|
|
16
16
|
import { recordHandoff, resolveTelemetry } from "@sayknow-cli/agent-core";
|
|
17
17
|
import { estimateMessageTokensHeuristic } from "@sayknow-cli/agent-core/compaction";
|
|
18
|
-
import type { Message, Model, ServiceTier } from "@sayknow-cli/ai";
|
|
18
|
+
import type { AssistantMessage, Message, Model, ServiceTier } from "@sayknow-cli/ai";
|
|
19
19
|
import { type JsonSchemaValidationIssue, validateJsonSchemaValue } from "@sayknow-cli/ai/utils/schema";
|
|
20
20
|
import { logger, prompt, untilAborted } from "@sayknow-cli/utils";
|
|
21
21
|
import { AsyncJobManager } from "../async";
|
|
@@ -50,6 +50,7 @@ import type { EventBus } from "../utils/event-bus";
|
|
|
50
50
|
import { buildNamedToolChoiceResult } from "../utils/tool-choice";
|
|
51
51
|
import type { WorkspaceTree } from "../workspace-tree";
|
|
52
52
|
import { validateAllocatedTaskId } from "./id";
|
|
53
|
+
import { classifyProviderRetry, providerNameFromModel } from "./provider-retry-status";
|
|
53
54
|
import { subprocessToolRegistry } from "./subprocess-tool-registry";
|
|
54
55
|
import { persistTaskTokenLog, taskTokenLogFromUsage } from "./token-log";
|
|
55
56
|
import {
|
|
@@ -66,6 +67,7 @@ import {
|
|
|
66
67
|
TASK_SUBAGENT_PROGRESS_CHANNEL,
|
|
67
68
|
type TaskToolDetails,
|
|
68
69
|
} from "./types";
|
|
70
|
+
import { type ExecutorExecutionMode, resolveUltragoalRedTeamActivation } from "./ultragoal-redteam-activation";
|
|
69
71
|
|
|
70
72
|
/** Agent event types to forward for progress tracking. */
|
|
71
73
|
const agentEventTypes = new Set<AgentEvent["type"]>([
|
|
@@ -81,6 +83,21 @@ const agentEventTypes = new Set<AgentEvent["type"]>([
|
|
|
81
83
|
"tool_execution_end",
|
|
82
84
|
]);
|
|
83
85
|
|
|
86
|
+
const providerStreamingUpdateTypes = new Set<string>([
|
|
87
|
+
"text_start",
|
|
88
|
+
"text_delta",
|
|
89
|
+
"text_end",
|
|
90
|
+
"thinking_start",
|
|
91
|
+
"thinking_delta",
|
|
92
|
+
"thinking_end",
|
|
93
|
+
"reasoning_summary_start",
|
|
94
|
+
"reasoning_summary_delta",
|
|
95
|
+
"reasoning_summary_end",
|
|
96
|
+
"toolcall_start",
|
|
97
|
+
"toolcall_delta",
|
|
98
|
+
"toolcall_end",
|
|
99
|
+
]);
|
|
100
|
+
|
|
84
101
|
const isAgentEvent = (event: AgentSessionEvent): event is AgentEvent =>
|
|
85
102
|
agentEventTypes.has(event.type as AgentEvent["type"]);
|
|
86
103
|
|
|
@@ -174,6 +191,11 @@ export interface ExecutorOptions {
|
|
|
174
191
|
agent: AgentDefinition;
|
|
175
192
|
task: string;
|
|
176
193
|
assignment?: string;
|
|
194
|
+
/**
|
|
195
|
+
* Typed executor execution mode. When set, overrides assignment-text heuristics
|
|
196
|
+
* for ultragoal red-team prompt injection (#2698 / #2456).
|
|
197
|
+
*/
|
|
198
|
+
executionMode?: ExecutorExecutionMode;
|
|
177
199
|
context?: string;
|
|
178
200
|
description?: string;
|
|
179
201
|
index: number;
|
|
@@ -486,11 +508,12 @@ function buildSchemaViolationOutcome(
|
|
|
486
508
|
missing.length > 0
|
|
487
509
|
? `schema_violation: missing required fields: ${missing.join(", ")}`
|
|
488
510
|
: `schema_violation: ${failure.message}`;
|
|
511
|
+
const dataPreview = previewOffendingData(data);
|
|
489
512
|
const payload = {
|
|
490
513
|
error: "schema_violation",
|
|
491
514
|
message: failure.message,
|
|
492
515
|
missingRequired: missing,
|
|
493
|
-
data
|
|
516
|
+
data,
|
|
494
517
|
};
|
|
495
518
|
let rawOutput: string;
|
|
496
519
|
try {
|
|
@@ -498,7 +521,7 @@ function buildSchemaViolationOutcome(
|
|
|
498
521
|
} catch {
|
|
499
522
|
rawOutput = `{"error":"schema_violation","message":${JSON.stringify(headline)}}`;
|
|
500
523
|
}
|
|
501
|
-
return { rawOutput, stderr: headline
|
|
524
|
+
return { rawOutput, stderr: `${headline}. Offending data preview: ${dataPreview}`, exitCode: 1 };
|
|
502
525
|
}
|
|
503
526
|
|
|
504
527
|
function buildPlaceholderYieldOutcome(
|
|
@@ -541,9 +564,16 @@ export function finalizeSubprocessOutput(args: FinalizeSubprocessOutputArgs): Fi
|
|
|
541
564
|
const completeData = normalizeCompleteData(submitData, reportFindings);
|
|
542
565
|
const { validator, error: schemaError } = buildOutputValidator(outputSchema);
|
|
543
566
|
if (schemaError) {
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
567
|
+
const outcome = buildSchemaViolationOutcome(
|
|
568
|
+
{
|
|
569
|
+
message: `invalid output schema: ${schemaError}`,
|
|
570
|
+
missingRequired: [],
|
|
571
|
+
},
|
|
572
|
+
completeData,
|
|
573
|
+
);
|
|
574
|
+
rawOutput = outcome.rawOutput;
|
|
575
|
+
stderr = outcome.stderr;
|
|
576
|
+
exitCode = outcome.exitCode;
|
|
547
577
|
} else {
|
|
548
578
|
const placeholderPath = findPlaceholderYieldPath(completeData);
|
|
549
579
|
if (placeholderPath) {
|
|
@@ -837,7 +867,13 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
837
867
|
let modelSubstitutionWarning: ModelSubstitutionWarning | undefined;
|
|
838
868
|
let resolvedModelString: string | undefined;
|
|
839
869
|
let lastAssistantModelString: string | undefined;
|
|
870
|
+
let activeProviderModelString: string | undefined;
|
|
840
871
|
let effectiveThinkingLevelForWarning: ThinkingLevel | undefined;
|
|
872
|
+
let lastProviderProgressAtMs: number | undefined;
|
|
873
|
+
let sessionEventOrdinal = 0;
|
|
874
|
+
let retryStartOrdinal = 0;
|
|
875
|
+
const seenAssistantMessages = new WeakSet<AgentMessage>();
|
|
876
|
+
const seenAssistantMessageIdentities = new Set<string>();
|
|
841
877
|
|
|
842
878
|
// Accumulate usage incrementally from message_end events (no memory for streaming events)
|
|
843
879
|
const accumulatedUsage = {
|
|
@@ -919,7 +955,8 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
919
955
|
|
|
920
956
|
const emitProgressNow = () => {
|
|
921
957
|
progress.durationMs = Date.now() - startTime;
|
|
922
|
-
|
|
958
|
+
const progressSnapshot = structuredClone(progress);
|
|
959
|
+
onProgress?.(progressSnapshot);
|
|
923
960
|
if (options.eventBus) {
|
|
924
961
|
options.eventBus.emit(TASK_SUBAGENT_PROGRESS_CHANNEL, {
|
|
925
962
|
index,
|
|
@@ -927,7 +964,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
927
964
|
agentSource: agent.source,
|
|
928
965
|
task,
|
|
929
966
|
assignment,
|
|
930
|
-
progress:
|
|
967
|
+
progress: progressSnapshot,
|
|
931
968
|
sessionFile: null,
|
|
932
969
|
});
|
|
933
970
|
}
|
|
@@ -982,6 +1019,79 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
982
1019
|
: undefined;
|
|
983
1020
|
};
|
|
984
1021
|
|
|
1022
|
+
const getAssistantMessageIdentity = (message: AgentMessage): string | undefined => {
|
|
1023
|
+
if (message.role !== "assistant") return undefined;
|
|
1024
|
+
const model = getMessageModelString(message);
|
|
1025
|
+
const timestamp = "timestamp" in message ? message.timestamp : undefined;
|
|
1026
|
+
if (!model || typeof timestamp !== "number") return undefined;
|
|
1027
|
+
const responseId = "responseId" in message && typeof message.responseId === "string" ? message.responseId : "";
|
|
1028
|
+
return JSON.stringify([model, timestamp, responseId]);
|
|
1029
|
+
};
|
|
1030
|
+
|
|
1031
|
+
const rememberAssistantMessage = (message: AgentMessage): void => {
|
|
1032
|
+
seenAssistantMessages.add(message);
|
|
1033
|
+
const identity = getAssistantMessageIdentity(message);
|
|
1034
|
+
if (identity) seenAssistantMessageIdentities.add(identity);
|
|
1035
|
+
};
|
|
1036
|
+
|
|
1037
|
+
const isProviderAssistantMessage = (message: AgentMessage): message is AssistantMessage =>
|
|
1038
|
+
message.role === "assistant" &&
|
|
1039
|
+
"stopReason" in message &&
|
|
1040
|
+
Array.isArray(message.content) &&
|
|
1041
|
+
getMessageModelString(message) !== undefined;
|
|
1042
|
+
|
|
1043
|
+
const isSuccessfulProviderAssistantMessage = (message: AgentMessage): message is AssistantMessage =>
|
|
1044
|
+
isProviderAssistantMessage(message) &&
|
|
1045
|
+
message.stopReason !== "error" &&
|
|
1046
|
+
message.stopReason !== "aborted" &&
|
|
1047
|
+
message.errorMessage === undefined &&
|
|
1048
|
+
message.errorKind === undefined &&
|
|
1049
|
+
message.transportFailure === undefined;
|
|
1050
|
+
|
|
1051
|
+
const hasMatchingActiveProviderModel = (message: AgentMessage): message is AssistantMessage =>
|
|
1052
|
+
isProviderAssistantMessage(message) &&
|
|
1053
|
+
activeProviderModelString !== undefined &&
|
|
1054
|
+
getMessageModelString(message) === activeProviderModelString;
|
|
1055
|
+
|
|
1056
|
+
const isProviderStreamingUpdate = (event: Extract<AgentEvent, { type: "message_update" }>): boolean => {
|
|
1057
|
+
const update = event.assistantMessageEvent;
|
|
1058
|
+
if (!update || typeof update !== "object" || !providerStreamingUpdateTypes.has(update.type)) return false;
|
|
1059
|
+
if (!("partial" in update) || getMessageModelString(update.partial) !== activeProviderModelString) return false;
|
|
1060
|
+
switch (update.type) {
|
|
1061
|
+
case "text_delta":
|
|
1062
|
+
case "thinking_delta":
|
|
1063
|
+
case "reasoning_summary_delta":
|
|
1064
|
+
case "toolcall_delta":
|
|
1065
|
+
return typeof update.delta === "string";
|
|
1066
|
+
default:
|
|
1067
|
+
return typeof update.contentIndex === "number";
|
|
1068
|
+
}
|
|
1069
|
+
};
|
|
1070
|
+
|
|
1071
|
+
const getProviderTextDelta = (event: Extract<AgentEvent, { type: "message_update" }>): string | undefined => {
|
|
1072
|
+
const update = (event as { assistantMessageEvent?: unknown }).assistantMessageEvent;
|
|
1073
|
+
if (!update || typeof update !== "object") return undefined;
|
|
1074
|
+
const record = update as { type?: unknown; delta?: unknown };
|
|
1075
|
+
return record.type === "text_delta" && typeof record.delta === "string" ? record.delta : undefined;
|
|
1076
|
+
};
|
|
1077
|
+
|
|
1078
|
+
const isProviderBackedRecoveryEvent = (
|
|
1079
|
+
event: Extract<AgentEvent, { type: "message_start" | "message_update" }>,
|
|
1080
|
+
eventOrdinal: number,
|
|
1081
|
+
): boolean => {
|
|
1082
|
+
const messageIdentity = getAssistantMessageIdentity(event.message);
|
|
1083
|
+
if (
|
|
1084
|
+
!progress.retryState ||
|
|
1085
|
+
eventOrdinal <= retryStartOrdinal ||
|
|
1086
|
+
seenAssistantMessages.has(event.message) ||
|
|
1087
|
+
(messageIdentity !== undefined && seenAssistantMessageIdentities.has(messageIdentity))
|
|
1088
|
+
)
|
|
1089
|
+
return false;
|
|
1090
|
+
if (!hasMatchingActiveProviderModel(event.message)) return false;
|
|
1091
|
+
if (event.type === "message_start") return isSuccessfulProviderAssistantMessage(event.message);
|
|
1092
|
+
return isProviderStreamingUpdate(event);
|
|
1093
|
+
};
|
|
1094
|
+
|
|
985
1095
|
const updateRecentOutputLines = () => {
|
|
986
1096
|
const lines = recentOutputTail.split("\n").filter(line => line.trim());
|
|
987
1097
|
progress.recentOutput = lines.slice(-8).reverse();
|
|
@@ -996,21 +1106,6 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
996
1106
|
updateRecentOutputLines();
|
|
997
1107
|
};
|
|
998
1108
|
|
|
999
|
-
const replaceRecentOutputFromContent = (content: unknown[]) => {
|
|
1000
|
-
recentOutputTail = "";
|
|
1001
|
-
for (const block of content) {
|
|
1002
|
-
if (!block || typeof block !== "object") continue;
|
|
1003
|
-
const record = block as { type?: unknown; text?: unknown };
|
|
1004
|
-
if (record.type !== "text" || typeof record.text !== "string") continue;
|
|
1005
|
-
if (!record.text) continue;
|
|
1006
|
-
recentOutputTail += record.text;
|
|
1007
|
-
if (recentOutputTail.length > RECENT_OUTPUT_TAIL_BYTES) {
|
|
1008
|
-
recentOutputTail = recentOutputTail.slice(-RECENT_OUTPUT_TAIL_BYTES);
|
|
1009
|
-
}
|
|
1010
|
-
}
|
|
1011
|
-
updateRecentOutputLines();
|
|
1012
|
-
};
|
|
1013
|
-
|
|
1014
1109
|
const resetRecentOutput = () => {
|
|
1015
1110
|
recentOutputTail = "";
|
|
1016
1111
|
progress.recentOutput = [];
|
|
@@ -1030,20 +1125,32 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1030
1125
|
});
|
|
1031
1126
|
};
|
|
1032
1127
|
|
|
1033
|
-
const processEvent = (event: AgentEvent) => {
|
|
1128
|
+
const processEvent = (event: AgentEvent, eventOrdinal: number) => {
|
|
1034
1129
|
if (resolved) return;
|
|
1035
1130
|
|
|
1036
1131
|
forwardSubagentEvent(event);
|
|
1037
1132
|
|
|
1038
1133
|
const now = Date.now();
|
|
1039
1134
|
let flushProgress = false;
|
|
1135
|
+
// A retry is recovered at the first assistant provider event, before the
|
|
1136
|
+
// session emits auto_retry_end after message completion.
|
|
1040
1137
|
|
|
1041
1138
|
switch (event.type) {
|
|
1042
|
-
case "message_start":
|
|
1043
|
-
if (event.message
|
|
1139
|
+
case "message_start": {
|
|
1140
|
+
if (event.message.role !== "assistant") break;
|
|
1141
|
+
const retryWasActive = Boolean(progress.retryState);
|
|
1142
|
+
const recoversRetry = isProviderBackedRecoveryEvent(event, eventOrdinal);
|
|
1143
|
+
rememberAssistantMessage(event.message);
|
|
1144
|
+
if (recoversRetry || !retryWasActive) {
|
|
1145
|
+
lastProviderProgressAtMs = now;
|
|
1044
1146
|
resetRecentOutput();
|
|
1045
1147
|
}
|
|
1148
|
+
if (recoversRetry) {
|
|
1149
|
+
progress.retryState = undefined;
|
|
1150
|
+
flushProgress = true;
|
|
1151
|
+
}
|
|
1046
1152
|
break;
|
|
1153
|
+
}
|
|
1047
1154
|
|
|
1048
1155
|
case "tool_execution_start": {
|
|
1049
1156
|
progress.toolCount++;
|
|
@@ -1155,24 +1262,17 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1155
1262
|
}
|
|
1156
1263
|
|
|
1157
1264
|
case "message_update": {
|
|
1158
|
-
if (event.message
|
|
1159
|
-
const
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
)
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
break;
|
|
1167
|
-
}
|
|
1168
|
-
if (assistantEvent && assistantEvent.type !== "text_delta") {
|
|
1169
|
-
break;
|
|
1170
|
-
}
|
|
1171
|
-
const updateContent =
|
|
1172
|
-
getMessageContent(event.message) || (event as AgentEvent & { content?: unknown }).content;
|
|
1173
|
-
if (updateContent && Array.isArray(updateContent)) {
|
|
1174
|
-
replaceRecentOutputFromContent(updateContent);
|
|
1265
|
+
if (event.message.role !== "assistant") break;
|
|
1266
|
+
const retryWasActive = Boolean(progress.retryState);
|
|
1267
|
+
const recoversRetry = isProviderBackedRecoveryEvent(event, eventOrdinal);
|
|
1268
|
+
if (!retryWasActive) rememberAssistantMessage(event.message);
|
|
1269
|
+
if (recoversRetry || !retryWasActive) lastProviderProgressAtMs = now;
|
|
1270
|
+
if (recoversRetry) {
|
|
1271
|
+
progress.retryState = undefined;
|
|
1272
|
+
flushProgress = true;
|
|
1175
1273
|
}
|
|
1274
|
+
const textDelta = getProviderTextDelta(event);
|
|
1275
|
+
if (textDelta !== undefined) appendRecentOutputTail(textDelta);
|
|
1176
1276
|
break;
|
|
1177
1277
|
}
|
|
1178
1278
|
|
|
@@ -1180,6 +1280,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1180
1280
|
// Extract text from assistant and toolResult messages (not user prompts)
|
|
1181
1281
|
const role = event.message?.role;
|
|
1182
1282
|
if (role === "assistant") {
|
|
1283
|
+
if (isSuccessfulProviderAssistantMessage(event.message)) lastProviderProgressAtMs = now;
|
|
1183
1284
|
const messageContent =
|
|
1184
1285
|
getMessageContent(event.message) || (event as AgentEvent & { content?: unknown }).content;
|
|
1185
1286
|
if (messageContent && Array.isArray(messageContent)) {
|
|
@@ -1192,6 +1293,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1192
1293
|
const assistantModel = getMessageModelString(event.message);
|
|
1193
1294
|
if (assistantModel) {
|
|
1194
1295
|
lastAssistantModelString = assistantModel;
|
|
1296
|
+
activeProviderModelString = assistantModel;
|
|
1195
1297
|
if (resolvedModelString && assistantModel !== resolvedModelString && !modelSubstitutionWarning) {
|
|
1196
1298
|
modelSubstitutionWarning = {
|
|
1197
1299
|
requested: resolvedModelString,
|
|
@@ -1359,6 +1461,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1359
1461
|
);
|
|
1360
1462
|
if (model) {
|
|
1361
1463
|
resolvedModelString = formatModelString(model);
|
|
1464
|
+
activeProviderModelString = resolvedModelString;
|
|
1362
1465
|
}
|
|
1363
1466
|
if (authFallbackUsed && model && requestedModel) {
|
|
1364
1467
|
modelSubstitutionWarning = {
|
|
@@ -1496,6 +1599,7 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1496
1599
|
? { requestedModel, reason: modelSubstitutionWarning.reason }
|
|
1497
1600
|
: undefined,
|
|
1498
1601
|
toolNames,
|
|
1602
|
+
alwaysActiveToolNames: ircEnabled ? ["irc"] : undefined,
|
|
1499
1603
|
outputSchema,
|
|
1500
1604
|
requireYieldTool: true,
|
|
1501
1605
|
contextFiles: options.contextFiles,
|
|
@@ -1505,9 +1609,11 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1505
1609
|
systemPrompt: defaultPrompt => {
|
|
1506
1610
|
const subagentPrompt = prompt.render(subagentSystemPromptTemplate, {
|
|
1507
1611
|
agent: prompt.render(agent.systemPrompt, {
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1612
|
+
// Typed executionMode wins; assignment text is compatibility-only (#2698 / #2456).
|
|
1613
|
+
ultragoalRedTeam: resolveUltragoalRedTeamActivation({
|
|
1614
|
+
executionMode: options.executionMode,
|
|
1615
|
+
assignment: options.assignment ?? task,
|
|
1616
|
+
}),
|
|
1511
1617
|
}),
|
|
1512
1618
|
context: options.context?.trim() ?? "",
|
|
1513
1619
|
worktree: worktree ?? "",
|
|
@@ -1729,11 +1835,22 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1729
1835
|
|
|
1730
1836
|
const MAX_YIELD_RETRIES = 3;
|
|
1731
1837
|
unsubscribe = session.subscribe(event => {
|
|
1838
|
+
sessionEventOrdinal += 1;
|
|
1839
|
+
const eventOrdinal = sessionEventOrdinal;
|
|
1732
1840
|
if (event.type === "auto_retry_start") {
|
|
1841
|
+
retryStartOrdinal = eventOrdinal;
|
|
1842
|
+
for (const message of session.messages) {
|
|
1843
|
+
if (message.role === "assistant") rememberAssistantMessage(message);
|
|
1844
|
+
}
|
|
1733
1845
|
progress.retryState = {
|
|
1734
1846
|
attempt: event.attempt,
|
|
1735
1847
|
maxAttempts: event.maxAttempts,
|
|
1736
1848
|
unbounded: event.unbounded,
|
|
1849
|
+
kind: classifyProviderRetry(event.errorMessage),
|
|
1850
|
+
provider: providerNameFromModel(
|
|
1851
|
+
activeProviderModelString ?? lastAssistantModelString ?? resolvedModelString,
|
|
1852
|
+
),
|
|
1853
|
+
lastProviderProgressAtMs,
|
|
1737
1854
|
delayMs: event.delayMs,
|
|
1738
1855
|
errorMessage: event.errorMessage,
|
|
1739
1856
|
startedAtMs: Date.now(),
|
|
@@ -1755,12 +1872,13 @@ export async function runSubprocess(options: ExecutorOptions): Promise<SingleRes
|
|
|
1755
1872
|
return;
|
|
1756
1873
|
}
|
|
1757
1874
|
if (event.type === "model_fallback_switched") {
|
|
1875
|
+
activeProviderModelString = event.to;
|
|
1758
1876
|
forwardSubagentEvent(event);
|
|
1759
1877
|
return;
|
|
1760
1878
|
}
|
|
1761
1879
|
if (isAgentEvent(event)) {
|
|
1762
1880
|
try {
|
|
1763
|
-
processEvent(event);
|
|
1881
|
+
processEvent(event, eventOrdinal);
|
|
1764
1882
|
} catch (err) {
|
|
1765
1883
|
logger.error("Subagent event processing failed", {
|
|
1766
1884
|
error: err instanceof Error ? err.message : String(err),
|