@sayknow-cli/coding-agent 0.4.7 → 0.5.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.
Files changed (428) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/types/capability/index.d.ts +10 -20
  3. package/dist/types/capability/types.d.ts +3 -0
  4. package/dist/types/cli/args.d.ts +0 -2
  5. package/dist/types/cli/read-cli.d.ts +1 -0
  6. package/dist/types/cli.d.ts +9 -1
  7. package/dist/types/commands/daemon.d.ts +2 -2
  8. package/dist/types/commands/deep-interview.d.ts +9 -0
  9. package/dist/types/commands/harness.d.ts +22 -0
  10. package/dist/types/commands/read.d.ts +6 -0
  11. package/dist/types/commands/sdk.d.ts +20 -2
  12. package/dist/types/config/keybindings.d.ts +34 -4
  13. package/dist/types/config/model-profile-contract.d.ts +40 -0
  14. package/dist/types/config/model-profiles.d.ts +2 -3
  15. package/dist/types/config/model-registry.d.ts +5 -0
  16. package/dist/types/config/provider-auth-health.d.ts +14 -0
  17. package/dist/types/config/provider-ranking.d.ts +59 -0
  18. package/dist/types/config/settings-schema.d.ts +156 -10
  19. package/dist/types/config/settings.d.ts +3 -0
  20. package/dist/types/edit/modes/patch.d.ts +13 -0
  21. package/dist/types/edit/path-mutation-lock.d.ts +15 -0
  22. package/dist/types/eval/py/executor.d.ts +1 -1
  23. package/dist/types/eval/py/runner-artifact.d.ts +8 -0
  24. package/dist/types/eval/py/tool-bridge.d.ts +1 -2
  25. package/dist/types/extensibility/extensions/types.d.ts +43 -2
  26. package/dist/types/extensibility/shared-events.d.ts +6 -0
  27. package/dist/types/internal-urls/local-root-gc.d.ts +2 -0
  28. package/dist/types/main.d.ts +33 -2
  29. package/dist/types/memories/index.d.ts +2 -0
  30. package/dist/types/modes/acp/acp-agent.d.ts +22 -9
  31. package/dist/types/modes/components/assistant-message.d.ts +3 -1
  32. package/dist/types/modes/components/btw-panel.d.ts +1 -0
  33. package/dist/types/modes/components/irc-sidebar.d.ts +41 -0
  34. package/dist/types/modes/components/queue-pane.d.ts +8 -0
  35. package/dist/types/modes/components/queued-message-selector.d.ts +6 -0
  36. package/dist/types/modes/components/read-tool-group.d.ts +4 -4
  37. package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +2 -1
  38. package/dist/types/modes/components/session-observer-overlay.d.ts +4 -0
  39. package/dist/types/modes/components/settings-selector.d.ts +2 -0
  40. package/dist/types/modes/components/tool-execution.d.ts +8 -0
  41. package/dist/types/modes/components/tool-status-header.d.ts +4 -2
  42. package/dist/types/modes/components/welcome.d.ts +5 -0
  43. package/dist/types/modes/controllers/btw-controller.d.ts +5 -0
  44. package/dist/types/modes/controllers/command-controller.d.ts +2 -0
  45. package/dist/types/modes/controllers/event-controller.d.ts +3 -0
  46. package/dist/types/modes/interactive-mode.d.ts +13 -2
  47. package/dist/types/modes/irc-observation-ledger.d.ts +17 -1
  48. package/dist/types/modes/prompt-action-autocomplete.d.ts +6 -1
  49. package/dist/types/modes/prompt-suggestion-controller.d.ts +35 -0
  50. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +2 -2
  51. package/dist/types/modes/types.d.ts +6 -0
  52. package/dist/types/modes/utils/hotkeys-markdown.d.ts +2 -1
  53. package/dist/types/modes/utils/ui-helpers.d.ts +16 -0
  54. package/dist/types/runtime/memory-domain.d.ts +9 -0
  55. package/dist/types/runtime/memory-guard-contract.d.ts +71 -0
  56. package/dist/types/runtime/memory-guard.d.ts +39 -0
  57. package/dist/types/runtime/memory-limit.d.ts +11 -0
  58. package/dist/types/runtime-mcp/content-limits.d.ts +7 -0
  59. package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +1 -1
  60. package/dist/types/runtime-mcp/manager.d.ts +9 -1
  61. package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -5
  62. package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +14 -0
  63. package/dist/types/runtime-mcp/redaction.d.ts +2 -0
  64. package/dist/types/runtime-mcp/smithery-auth.d.ts +5 -0
  65. package/dist/types/sdk/acp/final-text.d.ts +19 -0
  66. package/dist/types/sdk/acp/mcp.d.ts +23 -0
  67. package/dist/types/sdk/broker/broker.d.ts +2 -0
  68. package/dist/types/sdk/broker/lifecycle.d.ts +13 -0
  69. package/dist/types/sdk/bus/chat-daemon-control.d.ts +9 -1
  70. package/dist/types/sdk/bus/config-commands.d.ts +2 -2
  71. package/dist/types/sdk/bus/config.d.ts +2 -0
  72. package/dist/types/sdk/bus/control-drain-lease.d.ts +52 -0
  73. package/dist/types/sdk/bus/conversation-store.d.ts +1 -0
  74. package/dist/types/sdk/bus/daemon-paths.d.ts +1 -0
  75. package/dist/types/sdk/bus/index.d.ts +52 -4
  76. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +37 -0
  77. package/dist/types/sdk/bus/lifecycle-commands.d.ts +5 -4
  78. package/dist/types/sdk/bus/notification-orchestration.d.ts +1 -0
  79. package/dist/types/sdk/bus/notification-service.d.ts +34 -0
  80. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -0
  81. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +106 -0
  82. package/dist/types/sdk/bus/rate-limit-pool.d.ts +2 -0
  83. package/dist/types/sdk/bus/reconciliation-store.d.ts +65 -0
  84. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +33 -9
  85. package/dist/types/sdk/bus/telegram-daemon-control.d.ts +5 -1
  86. package/dist/types/sdk/bus/telegram-daemon.d.ts +286 -12
  87. package/dist/types/sdk/bus/telegram-reference.d.ts +2 -0
  88. package/dist/types/sdk/bus/topic-registry.d.ts +88 -2
  89. package/dist/types/sdk/client/discovery.d.ts +2 -0
  90. package/dist/types/sdk/client/liveness.d.ts +7 -0
  91. package/dist/types/sdk/host/control/operations.d.ts +3 -2
  92. package/dist/types/sdk/host/host.d.ts +3 -1
  93. package/dist/types/sdk/host/query/handlers.d.ts +14 -0
  94. package/dist/types/sdk/index.d.ts +2 -0
  95. package/dist/types/sdk/lifecycle-session.d.ts +10 -1
  96. package/dist/types/sdk/prompt-status.d.ts +88 -0
  97. package/dist/types/sdk/session-directory.d.ts +1 -1
  98. package/dist/types/sdk/session.d.ts +7 -0
  99. package/dist/types/sdk/startup-capability.d.ts +9 -0
  100. package/dist/types/sdk/transport/auth-preface.d.ts +9 -0
  101. package/dist/types/sdk/transport/index.d.ts +12 -0
  102. package/dist/types/sdk/transport/relay.d.ts +43 -0
  103. package/dist/types/sdk/transport/serve-cli.d.ts +4 -0
  104. package/dist/types/sdk/transport/socket.d.ts +7 -0
  105. package/dist/types/sdk/transport/stdio.d.ts +3 -0
  106. package/dist/types/session/agent-session.d.ts +83 -24
  107. package/dist/types/session/btw-contract.d.ts +16 -0
  108. package/dist/types/session/fallback-chain-controller.d.ts +18 -2
  109. package/dist/types/session/internal/managed-session-scope.d.ts +70 -10
  110. package/dist/types/session/internal/managed-session-storage.d.ts +34 -12
  111. package/dist/types/session/internal/native-publish-outcome.d.ts +48 -0
  112. package/dist/types/session/memory-guard-checkpoint-participant.d.ts +69 -0
  113. package/dist/types/session/session-manager.d.ts +89 -18
  114. package/dist/types/session/session-storage.d.ts +31 -0
  115. package/dist/types/session/streaming-output.d.ts +60 -5
  116. package/dist/types/setup/credential-import.d.ts +5 -1
  117. package/dist/types/setup/provider-onboarding.d.ts +2 -0
  118. package/dist/types/skc-runtime/deep-interview-runtime.d.ts +1 -1
  119. package/dist/types/skc-runtime/deep-interview-stage.d.ts +37 -0
  120. package/dist/types/skc-runtime/gc-runtime.d.ts +1 -1
  121. package/dist/types/skc-runtime/linux-proc.d.ts +22 -14
  122. package/dist/types/skc-runtime/memory-guard-owner-claims.d.ts +47 -0
  123. package/dist/types/skc-runtime/ralplan-runtime.d.ts +112 -1
  124. package/dist/types/skc-runtime/repository-binding.d.ts +63 -0
  125. package/dist/types/skc-runtime/state-runtime.d.ts +3 -1
  126. package/dist/types/skc-runtime/state-writer.d.ts +5 -1
  127. package/dist/types/skc-runtime/team-launch.d.ts +1 -1
  128. package/dist/types/skc-runtime/team-runtime.d.ts +9 -2
  129. package/dist/types/skc-runtime/team-store.d.ts +12 -0
  130. package/dist/types/skc-runtime/team-worker-memory-guard.d.ts +92 -0
  131. package/dist/types/skc-runtime/tmux-owner-isolation.d.ts +7 -0
  132. package/dist/types/skc-runtime/ultragoal-guard.d.ts +6 -5
  133. package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +28 -0
  134. package/dist/types/skc-runtime/ultragoal-runtime.d.ts +43 -5
  135. package/dist/types/skill-state/workflow-hud.d.ts +3 -0
  136. package/dist/types/ssh/utils.d.ts +1 -0
  137. package/dist/types/task/discovery.d.ts +3 -1
  138. package/dist/types/task/executor.d.ts +6 -0
  139. package/dist/types/task/index.d.ts +3 -1
  140. package/dist/types/task/provider-retry-status.d.ts +13 -0
  141. package/dist/types/task/receipt.d.ts +2 -0
  142. package/dist/types/task/types.d.ts +133 -0
  143. package/dist/types/task/ultragoal-redteam-activation.d.ts +33 -0
  144. package/dist/types/tools/browser/launch.d.ts +7 -0
  145. package/dist/types/tools/fetch.d.ts +22 -9
  146. package/dist/types/tools/image-gen.d.ts +63 -1
  147. package/dist/types/tools/index.d.ts +7 -1
  148. package/dist/types/tools/output-meta.d.ts +21 -1
  149. package/dist/types/tools/read-internals.d.ts +12 -0
  150. package/dist/types/tools/read.d.ts +45 -1
  151. package/dist/types/tools/resource-gc.d.ts +23 -0
  152. package/dist/types/tools/skill-discovery.d.ts +7 -0
  153. package/dist/types/tools/sqlite-reader.d.ts +7 -0
  154. package/dist/types/tools/tool-result.d.ts +7 -1
  155. package/dist/types/utils/prompt-suggestion.d.ts +33 -0
  156. package/dist/types/utils/shell-snapshot.d.ts +12 -0
  157. package/dist/types/web/insane/bridge.d.ts +1 -0
  158. package/dist/types/web/insane/url-guard.d.ts +17 -0
  159. package/package.json +8 -12
  160. package/scripts/benchmark-sticky-viewport-pr1.ts +239 -0
  161. package/scripts/capture-platform-shortcut-labels-showcase.ts +342 -0
  162. package/scripts/capture-sticky-viewport-showcase.ts +292 -0
  163. package/scripts/compile-args.ts +0 -1
  164. package/scripts/dogfood-repository-binding.ts +209 -0
  165. package/scripts/generate-docs-index.ts +4 -1
  166. package/scripts/generate-sdk-operation-inventory.ts +9 -0
  167. package/scripts/run-test-manifest.ts +6 -4
  168. package/scripts/verify-skc-sdk-canonicalization.ts +122 -18
  169. package/scripts/verify-sticky-viewport-showcase.ts +611 -0
  170. package/src/capability/index.ts +58 -42
  171. package/src/capability/types.ts +3 -0
  172. package/src/cli/args.ts +16 -100
  173. package/src/cli/fast-help.ts +1 -1
  174. package/src/cli/mcp-cli.ts +4 -21
  175. package/src/cli/notify-cli.ts +6 -38
  176. package/src/cli/read-cli.ts +2 -1
  177. package/src/cli/setup-cli.ts +10 -4
  178. package/src/cli.ts +133 -11
  179. package/src/commands/daemon.ts +22 -5
  180. package/src/commands/deep-interview.ts +26 -1
  181. package/src/commands/harness.ts +35 -12
  182. package/src/commands/read.ts +11 -2
  183. package/src/commands/sdk.ts +134 -17
  184. package/src/commands/team.ts +1 -1
  185. package/src/commit/agentic/index.ts +3 -3
  186. package/src/commit/map-reduce/index.ts +2 -2
  187. package/src/config/keybindings.ts +158 -25
  188. package/src/config/model-profile-contract.ts +174 -0
  189. package/src/config/model-profiles.ts +51 -10
  190. package/src/config/model-registry.ts +24 -4
  191. package/src/config/model-resolver.ts +2 -2
  192. package/src/config/provider-auth-health.ts +42 -0
  193. package/src/config/provider-ranking.ts +119 -0
  194. package/src/config/settings-schema.ts +157 -10
  195. package/src/config/settings.ts +254 -108
  196. package/src/coordinator-mcp/model-preset.ts +21 -74
  197. package/src/defaults/skc/skills/deep-interview/SKILL.md +147 -24
  198. package/src/defaults/skc/skills/ralplan/SKILL.md +91 -34
  199. package/src/defaults/skc/skills/team/SKILL.md +1 -1
  200. package/src/defaults/skc/skills/ultragoal/SKILL.md +68 -17
  201. package/src/discovery/ssh.ts +12 -1
  202. package/src/edit/index.ts +3 -6
  203. package/src/edit/modes/patch.ts +38 -1
  204. package/src/edit/modes/replace.ts +42 -0
  205. package/src/edit/path-mutation-lock.ts +112 -0
  206. package/src/eval/js/tool-bridge.ts +1 -1
  207. package/src/eval/py/executor.ts +37 -13
  208. package/src/eval/py/kernel.ts +1 -21
  209. package/src/eval/py/prelude.py +2 -2
  210. package/src/eval/py/runner-artifact.ts +84 -0
  211. package/src/eval/py/tool-bridge.ts +34 -18
  212. package/src/extensibility/extensions/runner.ts +4 -0
  213. package/src/extensibility/extensions/types.ts +42 -4
  214. package/src/extensibility/plugins/marketplace/fetcher.ts +191 -7
  215. package/src/extensibility/shared-events.ts +5 -0
  216. package/src/extensibility/skc-plugins/runtime-adapters.ts +2 -1
  217. package/src/hooks/native-skill-hook.ts +17 -4
  218. package/src/internal-urls/docs-index.generated.ts +17 -16
  219. package/src/internal-urls/local-protocol.ts +87 -25
  220. package/src/internal-urls/local-root-gc.ts +127 -0
  221. package/src/internal-urls/mcp-protocol.ts +73 -11
  222. package/src/main.ts +120 -42
  223. package/src/memories/index.ts +10 -0
  224. package/src/modes/DESIGN.md +52 -0
  225. package/src/modes/acp/acp-agent.ts +647 -83
  226. package/src/modes/acp/acp-event-mapper.ts +106 -12
  227. package/src/modes/acp/acp-mode.ts +39 -3
  228. package/src/modes/action-registry.ts +1 -1
  229. package/src/modes/components/assistant-message.ts +123 -22
  230. package/src/modes/components/btw-panel.ts +82 -16
  231. package/src/modes/components/irc-sidebar.ts +176 -62
  232. package/src/modes/components/model-selector.ts +61 -4
  233. package/src/modes/components/notifications-settings-editor.ts +1 -1
  234. package/src/modes/components/oauth-selector.ts +42 -12
  235. package/src/modes/components/plan-preview-overlay.ts +1 -1
  236. package/src/modes/components/queue-pane.ts +55 -9
  237. package/src/modes/components/queued-message-selector.ts +53 -10
  238. package/src/modes/components/read-tool-group.ts +82 -14
  239. package/src/modes/components/runtime-mcp-add-wizard.ts +5 -0
  240. package/src/modes/components/sayknow-pet-widget.ts +20 -8
  241. package/src/modes/components/session-observer-overlay.ts +187 -32
  242. package/src/modes/components/settings-selector.ts +60 -18
  243. package/src/modes/components/tool-execution.ts +138 -27
  244. package/src/modes/components/tool-status-header.ts +26 -8
  245. package/src/modes/components/welcome.ts +50 -23
  246. package/src/modes/controllers/btw-controller.ts +119 -36
  247. package/src/modes/controllers/command-controller.ts +101 -54
  248. package/src/modes/controllers/event-controller.ts +119 -27
  249. package/src/modes/controllers/extension-ui-controller.ts +23 -12
  250. package/src/modes/controllers/input-controller.ts +100 -8
  251. package/src/modes/controllers/runtime-mcp-command-controller.ts +29 -6
  252. package/src/modes/controllers/selector-controller.ts +4 -1
  253. package/src/modes/interactive-mode.ts +201 -60
  254. package/src/modes/irc-observation-ledger.ts +71 -15
  255. package/src/modes/prompt-action-autocomplete.ts +32 -13
  256. package/src/modes/prompt-suggestion-controller.ts +96 -0
  257. package/src/modes/runtime-init.ts +20 -2
  258. package/src/modes/shared/agent-wire/command-dispatch.ts +3 -3
  259. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +2 -2
  260. package/src/modes/types.ts +6 -0
  261. package/src/modes/utils/hotkeys-markdown.ts +64 -36
  262. package/src/modes/utils/ui-helpers.ts +99 -4
  263. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  264. package/src/prompts/agents/architect.md +17 -3
  265. package/src/prompts/agents/critic.md +17 -2
  266. package/src/prompts/agents/executor.md +1 -1
  267. package/src/prompts/agents/planner.md +8 -1
  268. package/src/prompts/system/btw-user.md +3 -8
  269. package/src/prompts/system/prompt-suggestion-system.md +32 -0
  270. package/src/prompts/system/system-prompt.md +6 -3
  271. package/src/prompts/tools/cron.md +3 -1
  272. package/src/prompts/tools/read.md +4 -2
  273. package/src/prompts/tools/skill-discovery.md +1 -0
  274. package/src/runtime/memory-domain.ts +66 -0
  275. package/src/runtime/memory-guard-contract.ts +73 -0
  276. package/src/runtime/memory-guard.ts +292 -0
  277. package/src/runtime/memory-limit.ts +50 -0
  278. package/src/runtime-mcp/client.ts +41 -55
  279. package/src/runtime-mcp/content-limits.ts +71 -0
  280. package/src/runtime-mcp/discoverable-tool-metadata.ts +1 -1
  281. package/src/runtime-mcp/json-rpc.ts +28 -11
  282. package/src/runtime-mcp/manager.ts +77 -59
  283. package/src/runtime-mcp/oauth-flow.ts +0 -72
  284. package/src/runtime-mcp/plugin-network-boundary.ts +101 -0
  285. package/src/runtime-mcp/redaction.ts +30 -0
  286. package/src/runtime-mcp/smithery-auth.ts +17 -2
  287. package/src/runtime-mcp/smithery-connect.ts +11 -1
  288. package/src/runtime-mcp/transports/http.ts +63 -22
  289. package/src/sdk/acp/adapter.ts +8 -1
  290. package/src/sdk/acp/final-text.ts +40 -0
  291. package/src/sdk/acp/mcp.ts +26 -0
  292. package/src/sdk/broker/broker.ts +34 -20
  293. package/src/sdk/broker/identity.ts +22 -12
  294. package/src/sdk/broker/lifecycle.ts +293 -43
  295. package/src/sdk/broker/session-index.ts +11 -1
  296. package/src/sdk/bus/chat-daemon-cli.ts +2 -2
  297. package/src/sdk/bus/chat-daemon-control.ts +22 -5
  298. package/src/sdk/bus/config-commands.ts +2 -2
  299. package/src/sdk/bus/config.ts +10 -2
  300. package/src/sdk/bus/control-drain-lease.ts +104 -0
  301. package/src/sdk/bus/conversation-store.ts +40 -6
  302. package/src/sdk/bus/daemon-paths.ts +2 -0
  303. package/src/sdk/bus/index.ts +793 -121
  304. package/src/sdk/bus/kind-aware-reconciliation.ts +242 -0
  305. package/src/sdk/bus/lifecycle-commands.ts +63 -10
  306. package/src/sdk/bus/lifecycle-control-runtime.ts +11 -2
  307. package/src/sdk/bus/lifecycle-orchestrator.ts +32 -1
  308. package/src/sdk/bus/notification-orchestration.ts +12 -0
  309. package/src/sdk/bus/notification-service.ts +87 -25
  310. package/src/sdk/bus/operator-runtime.ts +31 -5
  311. package/src/sdk/bus/prompt-reconciliation.ts +240 -0
  312. package/src/sdk/bus/rate-limit-pool.ts +8 -0
  313. package/src/sdk/bus/recent-activity.ts +90 -26
  314. package/src/sdk/bus/reconciliation-store.ts +224 -0
  315. package/src/sdk/bus/telegram-cli.ts +6 -13
  316. package/src/sdk/bus/telegram-daemon-cli.ts +8 -3
  317. package/src/sdk/bus/telegram-daemon-contract.ts +34 -9
  318. package/src/sdk/bus/telegram-daemon-control.ts +161 -40
  319. package/src/sdk/bus/telegram-daemon.ts +3649 -593
  320. package/src/sdk/bus/telegram-reference.ts +20 -2
  321. package/src/sdk/bus/topic-registry.ts +451 -12
  322. package/src/sdk/cli/session-cli.ts +15 -2
  323. package/src/sdk/client/discovery.ts +19 -3
  324. package/src/sdk/client/liveness.ts +49 -0
  325. package/src/sdk/host/control/dispatch.ts +8 -2
  326. package/src/sdk/host/control/operations.ts +3 -2
  327. package/src/sdk/host/host.ts +27 -9
  328. package/src/sdk/host/query/handlers.ts +125 -5
  329. package/src/sdk/index.ts +12 -0
  330. package/src/sdk/lifecycle-session.ts +19 -3
  331. package/src/sdk/mcp/server.ts +46 -18
  332. package/src/sdk/prompt-status.ts +97 -0
  333. package/src/sdk/protocol/operation-inventory.generated.json +145 -0
  334. package/src/sdk/protocol/operation-registry.ts +24 -4
  335. package/src/sdk/session-directory.ts +5 -1
  336. package/src/sdk/session.ts +69 -8
  337. package/src/sdk/startup-capability.ts +15 -1
  338. package/src/sdk/transport/auth-preface.ts +82 -0
  339. package/src/sdk/transport/index.ts +18 -0
  340. package/src/sdk/transport/relay.ts +252 -0
  341. package/src/sdk/transport/serve-cli.ts +105 -0
  342. package/src/sdk/transport/socket.ts +197 -0
  343. package/src/sdk/transport/stdio.ts +17 -0
  344. package/src/session/agent-session.ts +1112 -314
  345. package/src/session/blob-store.ts +25 -7
  346. package/src/session/btw-contract.ts +59 -0
  347. package/src/session/fallback-chain-controller.ts +47 -8
  348. package/src/session/internal/managed-session-scope.ts +1426 -259
  349. package/src/session/internal/managed-session-storage.ts +414 -238
  350. package/src/session/internal/native-publish-outcome.ts +271 -0
  351. package/src/session/memory-guard-checkpoint-participant.ts +131 -0
  352. package/src/session/session-manager.ts +2079 -469
  353. package/src/session/session-storage.ts +151 -11
  354. package/src/session/streaming-output.ts +262 -43
  355. package/src/setup/credential-import.ts +28 -3
  356. package/src/setup/provider-onboarding.ts +49 -5
  357. package/src/setup/provider-presets.json +2 -1
  358. package/src/skc-runtime/deep-interview-runtime.ts +303 -36
  359. package/src/skc-runtime/deep-interview-stage.ts +1016 -0
  360. package/src/skc-runtime/deep-interview-state.ts +8 -5
  361. package/src/skc-runtime/gc-render.ts +1 -0
  362. package/src/skc-runtime/gc-runtime.ts +11 -1
  363. package/src/skc-runtime/linux-proc.ts +70 -36
  364. package/src/skc-runtime/managed-owner-supervisor.ts +83 -4
  365. package/src/skc-runtime/memory-guard-owner-claims.ts +389 -0
  366. package/src/skc-runtime/ralplan-runtime.ts +1057 -75
  367. package/src/skc-runtime/repository-binding.ts +267 -0
  368. package/src/skc-runtime/session-state-sidecar.ts +25 -9
  369. package/src/skc-runtime/state-runtime.ts +50 -12
  370. package/src/skc-runtime/state-writer.ts +68 -56
  371. package/src/skc-runtime/team-launch.ts +34 -5
  372. package/src/skc-runtime/team-runtime.ts +41 -1
  373. package/src/skc-runtime/team-store.ts +32 -0
  374. package/src/skc-runtime/team-worker-memory-guard.ts +363 -0
  375. package/src/skc-runtime/team-workers.ts +1 -0
  376. package/src/skc-runtime/tmux-common.ts +13 -2
  377. package/src/skc-runtime/tmux-owner-isolation.ts +20 -1
  378. package/src/skc-runtime/tmux-sessions.ts +45 -6
  379. package/src/skc-runtime/ultragoal-guard.ts +93 -15
  380. package/src/skc-runtime/ultragoal-receipt-freshness.ts +123 -0
  381. package/src/skc-runtime/ultragoal-runtime.ts +469 -38
  382. package/src/skc-runtime/workflow-manifest.generated.json +195 -5
  383. package/src/skc-runtime/workflow-manifest.ts +67 -3
  384. package/src/skill-state/workflow-hud.ts +25 -2
  385. package/src/skill-state/workflow-mutation-guard.ts +104 -12
  386. package/src/slash-commands/builtin-registry.ts +1 -1
  387. package/src/ssh/utils.ts +14 -0
  388. package/src/task/discovery.ts +8 -2
  389. package/src/task/executor.ts +165 -47
  390. package/src/task/index.ts +123 -15
  391. package/src/task/provider-retry-status.ts +88 -0
  392. package/src/task/receipt.ts +3 -0
  393. package/src/task/render.ts +45 -26
  394. package/src/task/skc-command.ts +2 -2
  395. package/src/task/types.ts +55 -10
  396. package/src/task/ultragoal-redteam-activation.ts +75 -0
  397. package/src/tools/ask.ts +1 -1
  398. package/src/tools/ast-edit.ts +2 -2
  399. package/src/tools/bash-allowed-prefixes.ts +45 -1
  400. package/src/tools/bash-pty-selection.ts +2 -2
  401. package/src/tools/browser/launch.ts +41 -6
  402. package/src/tools/browser/screenshot-format.ts +6 -1
  403. package/src/tools/cron.ts +1 -1
  404. package/src/tools/fetch.ts +127 -154
  405. package/src/tools/image-gen.ts +476 -23
  406. package/src/tools/index.ts +7 -1
  407. package/src/tools/output-meta.ts +176 -9
  408. package/src/tools/path-utils.ts +5 -1
  409. package/src/tools/read-internals.ts +44 -0
  410. package/src/tools/read.ts +1544 -310
  411. package/src/tools/resource-gc.ts +665 -125
  412. package/src/tools/skill-discovery.ts +39 -3
  413. package/src/tools/sqlite-reader.ts +63 -5
  414. package/src/tools/subagent-render.ts +74 -16
  415. package/src/tools/subagent.ts +2 -0
  416. package/src/tools/tool-result.ts +14 -1
  417. package/src/utils/edit-mode.ts +2 -2
  418. package/src/utils/pasted-image-path.ts +15 -6
  419. package/src/utils/prompt-suggestion.ts +265 -0
  420. package/src/utils/shell-snapshot.ts +173 -63
  421. package/src/utils/sixel.ts +3 -3
  422. package/src/web/insane/bridge.ts +5 -1
  423. package/src/web/insane/url-guard.ts +140 -27
  424. package/src/web/scrapers/docs-rs.ts +30 -5
  425. package/src/web/scrapers/types.ts +19 -49
  426. package/src/web/scrapers/utils.ts +12 -26
  427. package/src/web/search/providers/codex.ts +1 -1
  428. package/src/workflow/workflow-intent-diff.ts +4 -1
@@ -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(cwd: string, home: string = os.homedir()): Promise<DiscoveryResult> {
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 = [];
@@ -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: previewOffendingData(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, exitCode: 1 };
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
- rawOutput = `{"error":"schema_violation","message":"invalid output schema: ${schemaError.replace(/"/g, '\\"')}"}`;
545
- stderr = `schema_violation: invalid output schema: ${schemaError}`;
546
- exitCode = 1;
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
- onProgress?.({ ...progress });
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: { ...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?.role === "assistant") {
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?.role !== "assistant") break;
1159
- const assistantEvent = (
1160
- event as AgentEvent & {
1161
- assistantMessageEvent?: { type?: string; delta?: string };
1162
- }
1163
- ).assistantMessageEvent;
1164
- if (assistantEvent?.type === "text_delta" && typeof assistantEvent.delta === "string") {
1165
- appendRecentOutputTail(assistantEvent.delta);
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
- ultragoalRedTeam: /ultragoal\s+completion\s+(?:qa|red-team)|executorQa/i.test(
1509
- options.assignment ?? task,
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),