@orion-agents/orion-code 0.1.2 → 0.1.4-2

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 (552) hide show
  1. package/README.md +98 -4
  2. package/README.zh-CN.md +116 -5
  3. package/dist/agents/coder.d.ts.map +1 -1
  4. package/dist/agents/coder.js.map +1 -1
  5. package/dist/agents/fork.d.ts +12 -4
  6. package/dist/agents/fork.d.ts.map +1 -1
  7. package/dist/agents/fork.js +28 -32
  8. package/dist/agents/fork.js.map +1 -1
  9. package/dist/agents/leader.d.ts.map +1 -1
  10. package/dist/agents/leader.js.map +1 -1
  11. package/dist/agents/worker-pool.d.ts.map +1 -1
  12. package/dist/agents/worker-pool.js +38 -29
  13. package/dist/agents/worker-pool.js.map +1 -1
  14. package/dist/cli.d.ts +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +0 -1
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/context-commands.d.ts +4 -0
  19. package/dist/commands/context-commands.d.ts.map +1 -0
  20. package/dist/commands/context-commands.js +52 -0
  21. package/dist/commands/context-commands.js.map +1 -0
  22. package/dist/commands/context-tool-command-handlers.d.ts +13 -0
  23. package/dist/commands/context-tool-command-handlers.d.ts.map +1 -0
  24. package/dist/commands/context-tool-command-handlers.js +573 -0
  25. package/dist/commands/context-tool-command-handlers.js.map +1 -0
  26. package/dist/commands/core-command-handlers.d.ts +12 -0
  27. package/dist/commands/core-command-handlers.d.ts.map +1 -0
  28. package/dist/commands/core-command-handlers.js +798 -0
  29. package/dist/commands/core-command-handlers.js.map +1 -0
  30. package/dist/commands/diagnostic-command-handlers.d.ts +14 -0
  31. package/dist/commands/diagnostic-command-handlers.d.ts.map +1 -0
  32. package/dist/commands/diagnostic-command-handlers.js +1043 -0
  33. package/dist/commands/diagnostic-command-handlers.js.map +1 -0
  34. package/dist/commands/diagnostic-commands.d.ts +4 -0
  35. package/dist/commands/diagnostic-commands.d.ts.map +1 -0
  36. package/dist/commands/diagnostic-commands.js +132 -0
  37. package/dist/commands/diagnostic-commands.js.map +1 -0
  38. package/dist/commands/index.d.ts +7 -8
  39. package/dist/commands/index.d.ts.map +1 -1
  40. package/dist/commands/index.js +34 -3448
  41. package/dist/commands/index.js.map +1 -1
  42. package/dist/commands/legacy-commands.d.ts +4 -0
  43. package/dist/commands/legacy-commands.d.ts.map +1 -0
  44. package/dist/commands/legacy-commands.js +44 -0
  45. package/dist/commands/legacy-commands.js.map +1 -0
  46. package/dist/commands/model-command-handlers.d.ts +13 -0
  47. package/dist/commands/model-command-handlers.d.ts.map +1 -0
  48. package/dist/commands/model-command-handlers.js +314 -0
  49. package/dist/commands/model-command-handlers.js.map +1 -0
  50. package/dist/commands/model-commands.d.ts +4 -0
  51. package/dist/commands/model-commands.d.ts.map +1 -0
  52. package/dist/commands/model-commands.js +52 -0
  53. package/dist/commands/model-commands.js.map +1 -0
  54. package/dist/commands/session-command-handlers.d.ts +9 -0
  55. package/dist/commands/session-command-handlers.d.ts.map +1 -0
  56. package/dist/commands/session-command-handlers.js +566 -0
  57. package/dist/commands/session-command-handlers.js.map +1 -0
  58. package/dist/commands/session-commands.d.ts +4 -0
  59. package/dist/commands/session-commands.d.ts.map +1 -0
  60. package/dist/commands/session-commands.js +78 -0
  61. package/dist/commands/session-commands.js.map +1 -0
  62. package/dist/commands/system-commands.d.ts +4 -0
  63. package/dist/commands/system-commands.d.ts.map +1 -0
  64. package/dist/commands/system-commands.js +92 -0
  65. package/dist/commands/system-commands.js.map +1 -0
  66. package/dist/commands/target-command.d.ts.map +1 -1
  67. package/dist/commands/target-command.js +29 -2
  68. package/dist/commands/target-command.js.map +1 -1
  69. package/dist/commands/tool-commands.d.ts +4 -0
  70. package/dist/commands/tool-commands.d.ts.map +1 -0
  71. package/dist/commands/tool-commands.js +49 -0
  72. package/dist/commands/tool-commands.js.map +1 -0
  73. package/dist/commands/types.d.ts +7 -5
  74. package/dist/commands/types.d.ts.map +1 -1
  75. package/dist/commands/types.js.map +1 -1
  76. package/dist/commands/workflow-command-handlers.d.ts +7 -0
  77. package/dist/commands/workflow-command-handlers.d.ts.map +1 -0
  78. package/dist/commands/workflow-command-handlers.js +35 -0
  79. package/dist/commands/workflow-command-handlers.js.map +1 -0
  80. package/dist/commands/workflow-commands.d.ts +4 -0
  81. package/dist/commands/workflow-commands.d.ts.map +1 -0
  82. package/dist/commands/workflow-commands.js +92 -0
  83. package/dist/commands/workflow-commands.js.map +1 -0
  84. package/dist/core/checkpoint.d.ts +12 -4
  85. package/dist/core/checkpoint.d.ts.map +1 -1
  86. package/dist/core/checkpoint.js +114 -28
  87. package/dist/core/checkpoint.js.map +1 -1
  88. package/dist/core/cost-tracker.d.ts +5 -1
  89. package/dist/core/cost-tracker.d.ts.map +1 -1
  90. package/dist/core/cost-tracker.js +12 -2
  91. package/dist/core/cost-tracker.js.map +1 -1
  92. package/dist/core/warn-dedup.d.ts +3 -0
  93. package/dist/core/warn-dedup.d.ts.map +1 -1
  94. package/dist/core/warn-dedup.js +6 -6
  95. package/dist/core/warn-dedup.js.map +1 -1
  96. package/dist/framework/index.d.ts +1 -1
  97. package/dist/framework/index.d.ts.map +1 -1
  98. package/dist/framework/index.js.map +1 -1
  99. package/dist/framework/prompt.d.ts +2 -2
  100. package/dist/framework/query.d.ts +5 -2
  101. package/dist/framework/query.d.ts.map +1 -1
  102. package/dist/framework/query.js +58 -10
  103. package/dist/framework/query.js.map +1 -1
  104. package/dist/framework/store.d.ts +4 -4
  105. package/dist/framework/tool-scheduler.d.ts +67 -4
  106. package/dist/framework/tool-scheduler.d.ts.map +1 -1
  107. package/dist/framework/tool-scheduler.js +271 -50
  108. package/dist/framework/tool-scheduler.js.map +1 -1
  109. package/dist/framework/tool.d.ts +36 -2
  110. package/dist/framework/tool.d.ts.map +1 -1
  111. package/dist/framework/tool.js +29 -1
  112. package/dist/framework/tool.js.map +1 -1
  113. package/dist/harness/assembler.d.ts.map +1 -1
  114. package/dist/harness/assembler.js +4 -2
  115. package/dist/harness/assembler.js.map +1 -1
  116. package/dist/harness/evidence.d.ts.map +1 -1
  117. package/dist/harness/evidence.js +3 -2
  118. package/dist/harness/evidence.js.map +1 -1
  119. package/dist/harness/safety.d.ts +11 -1
  120. package/dist/harness/safety.d.ts.map +1 -1
  121. package/dist/harness/safety.js +112 -16
  122. package/dist/harness/safety.js.map +1 -1
  123. package/dist/index.d.ts +1 -4
  124. package/dist/index.d.ts.map +1 -1
  125. package/dist/index.js.map +1 -1
  126. package/dist/init.d.ts +4 -8
  127. package/dist/init.d.ts.map +1 -1
  128. package/dist/init.js +4 -4
  129. package/dist/init.js.map +1 -1
  130. package/dist/ink-ui/App.d.ts +2 -2
  131. package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
  132. package/dist/ink-ui/components/Markdown.js.map +1 -1
  133. package/dist/ink-ui/components/PixelHorseBanner.d.ts +2 -2
  134. package/dist/ink-ui/components/StatusLine.d.ts +2 -2
  135. package/dist/ink-ui/launch.d.ts +2 -2
  136. package/dist/ink-ui/screens/ReplScreen.d.ts +3 -2
  137. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  138. package/dist/ink-ui/screens/ReplScreen.js +65 -0
  139. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  140. package/dist/memory/embeddings.d.ts.map +1 -1
  141. package/dist/memory/embeddings.js +3 -2
  142. package/dist/memory/embeddings.js.map +1 -1
  143. package/dist/memory/relevant-finder.d.ts +2 -1
  144. package/dist/memory/relevant-finder.d.ts.map +1 -1
  145. package/dist/memory/relevant-finder.js +17 -8
  146. package/dist/memory/relevant-finder.js.map +1 -1
  147. package/dist/memory/semantic-config.d.ts +9 -0
  148. package/dist/memory/semantic-config.d.ts.map +1 -0
  149. package/dist/memory/semantic-config.js +16 -0
  150. package/dist/memory/semantic-config.js.map +1 -0
  151. package/dist/memory/semantic-search.d.ts +1 -6
  152. package/dist/memory/semantic-search.d.ts.map +1 -1
  153. package/dist/memory/semantic-search.js +5 -16
  154. package/dist/memory/semantic-search.js.map +1 -1
  155. package/dist/memory/storage.d.ts +23 -0
  156. package/dist/memory/storage.d.ts.map +1 -1
  157. package/dist/memory/storage.js +109 -8
  158. package/dist/memory/storage.js.map +1 -1
  159. package/dist/memory/vector-store.d.ts +12 -0
  160. package/dist/memory/vector-store.d.ts.map +1 -1
  161. package/dist/memory/vector-store.js +139 -18
  162. package/dist/memory/vector-store.js.map +1 -1
  163. package/dist/migration/command.d.ts.map +1 -1
  164. package/dist/migration/command.js +0 -1
  165. package/dist/migration/command.js.map +1 -1
  166. package/dist/migration/migrate.d.ts.map +1 -1
  167. package/dist/migration/migrate.js +43 -109
  168. package/dist/migration/migrate.js.map +1 -1
  169. package/dist/migration/types.d.ts +0 -1
  170. package/dist/migration/types.d.ts.map +1 -1
  171. package/dist/print-ui/launch.d.ts +11 -3
  172. package/dist/print-ui/launch.d.ts.map +1 -1
  173. package/dist/print-ui/launch.js +25 -0
  174. package/dist/print-ui/launch.js.map +1 -1
  175. package/dist/product/environment.d.ts +3 -5
  176. package/dist/product/environment.d.ts.map +1 -1
  177. package/dist/product/environment.js +4 -32
  178. package/dist/product/environment.js.map +1 -1
  179. package/dist/product/index.d.ts +1 -1
  180. package/dist/product/index.d.ts.map +1 -1
  181. package/dist/product/index.js +1 -3
  182. package/dist/product/index.js.map +1 -1
  183. package/dist/product/paths.d.ts.map +1 -1
  184. package/dist/product/paths.js +12 -0
  185. package/dist/product/paths.js.map +1 -1
  186. package/dist/runtime/agent-runtime-controller.d.ts +3 -2
  187. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  188. package/dist/runtime/agent-runtime-controller.js +24 -3
  189. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  190. package/dist/runtime/agent-runtime-protocol.d.ts +16 -1
  191. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  192. package/dist/runtime/agent-runtime-protocol.js +12 -0
  193. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  194. package/dist/runtime/chat-checkpoint.d.ts +17 -0
  195. package/dist/runtime/chat-checkpoint.d.ts.map +1 -0
  196. package/dist/runtime/chat-checkpoint.js +108 -0
  197. package/dist/runtime/chat-checkpoint.js.map +1 -0
  198. package/dist/runtime/chat-controller.d.ts +16 -46
  199. package/dist/runtime/chat-controller.d.ts.map +1 -1
  200. package/dist/runtime/chat-controller.js +212 -1051
  201. package/dist/runtime/chat-controller.js.map +1 -1
  202. package/dist/runtime/chat-presentation.d.ts +60 -0
  203. package/dist/runtime/chat-presentation.d.ts.map +1 -0
  204. package/dist/runtime/chat-presentation.js +537 -0
  205. package/dist/runtime/chat-presentation.js.map +1 -0
  206. package/dist/runtime/chat-trace.d.ts +52 -0
  207. package/dist/runtime/chat-trace.d.ts.map +1 -0
  208. package/dist/runtime/chat-trace.js +234 -0
  209. package/dist/runtime/chat-trace.js.map +1 -0
  210. package/dist/runtime/chat-workspace.d.ts +22 -0
  211. package/dist/runtime/chat-workspace.d.ts.map +1 -0
  212. package/dist/runtime/chat-workspace.js +154 -0
  213. package/dist/runtime/chat-workspace.js.map +1 -0
  214. package/dist/runtime/goals/accounting.js +1 -1
  215. package/dist/runtime/goals/accounting.js.map +1 -1
  216. package/dist/runtime/goals/completion-audit.d.ts.map +1 -1
  217. package/dist/runtime/goals/completion-audit.js +5 -4
  218. package/dist/runtime/goals/completion-audit.js.map +1 -1
  219. package/dist/runtime/goals/coordinator.d.ts +3 -0
  220. package/dist/runtime/goals/coordinator.d.ts.map +1 -1
  221. package/dist/runtime/goals/coordinator.js +30 -2
  222. package/dist/runtime/goals/coordinator.js.map +1 -1
  223. package/dist/runtime/goals/prompt.d.ts +1 -1
  224. package/dist/runtime/goals/prompt.d.ts.map +1 -1
  225. package/dist/runtime/goals/prompt.js +3 -2
  226. package/dist/runtime/goals/prompt.js.map +1 -1
  227. package/dist/runtime/goals/tools.d.ts +21 -8
  228. package/dist/runtime/goals/tools.d.ts.map +1 -1
  229. package/dist/runtime/goals/tools.js +152 -21
  230. package/dist/runtime/goals/tools.js.map +1 -1
  231. package/dist/runtime/goals/types.d.ts +6 -0
  232. package/dist/runtime/goals/types.d.ts.map +1 -1
  233. package/dist/runtime/goals/types.js.map +1 -1
  234. package/dist/runtime/loop-budget.d.ts +2 -2
  235. package/dist/runtime/model-coordinator.d.ts.map +1 -1
  236. package/dist/runtime/model-coordinator.js.map +1 -1
  237. package/dist/runtime/subagents/child-executor-guard.d.ts.map +1 -1
  238. package/dist/runtime/subagents/child-executor-guard.js +4 -0
  239. package/dist/runtime/subagents/child-executor-guard.js.map +1 -1
  240. package/dist/runtime/subagents/index.d.ts +10 -3
  241. package/dist/runtime/subagents/index.d.ts.map +1 -1
  242. package/dist/runtime/subagents/index.js +25 -1
  243. package/dist/runtime/subagents/index.js.map +1 -1
  244. package/dist/runtime/subagents/policy.d.ts +1 -1
  245. package/dist/runtime/subagents/policy.d.ts.map +1 -1
  246. package/dist/runtime/subagents/policy.js.map +1 -1
  247. package/dist/runtime/subagents/presets.d.ts +2 -2
  248. package/dist/runtime/subagents/provider-gate.d.ts.map +1 -1
  249. package/dist/runtime/subagents/provider-gate.js +0 -1
  250. package/dist/runtime/subagents/provider-gate.js.map +1 -1
  251. package/dist/runtime/subagents/research-artifact.d.ts +101 -0
  252. package/dist/runtime/subagents/research-artifact.d.ts.map +1 -0
  253. package/dist/runtime/subagents/research-artifact.js +210 -0
  254. package/dist/runtime/subagents/research-artifact.js.map +1 -0
  255. package/dist/runtime/subagents/research-citation.d.ts +66 -0
  256. package/dist/runtime/subagents/research-citation.d.ts.map +1 -0
  257. package/dist/runtime/subagents/research-citation.js +185 -0
  258. package/dist/runtime/subagents/research-citation.js.map +1 -0
  259. package/dist/runtime/subagents/research-contract.d.ts +83 -0
  260. package/dist/runtime/subagents/research-contract.d.ts.map +1 -0
  261. package/dist/runtime/subagents/research-contract.js +337 -0
  262. package/dist/runtime/subagents/research-contract.js.map +1 -0
  263. package/dist/runtime/subagents/research-quality.d.ts +47 -0
  264. package/dist/runtime/subagents/research-quality.d.ts.map +1 -0
  265. package/dist/runtime/subagents/research-quality.js +125 -0
  266. package/dist/runtime/subagents/research-quality.js.map +1 -0
  267. package/dist/runtime/subagents/research-renderer.d.ts +95 -0
  268. package/dist/runtime/subagents/research-renderer.d.ts.map +1 -0
  269. package/dist/runtime/subagents/research-renderer.js +186 -0
  270. package/dist/runtime/subagents/research-renderer.js.map +1 -0
  271. package/dist/runtime/subagents/research-types.d.ts +105 -0
  272. package/dist/runtime/subagents/research-types.d.ts.map +1 -0
  273. package/dist/runtime/subagents/research-types.js +16 -0
  274. package/dist/runtime/subagents/research-types.js.map +1 -0
  275. package/dist/runtime/subagents/result-parser.d.ts +1 -5
  276. package/dist/runtime/subagents/result-parser.d.ts.map +1 -1
  277. package/dist/runtime/subagents/result-parser.js +5 -72
  278. package/dist/runtime/subagents/result-parser.js.map +1 -1
  279. package/dist/runtime/subagents/runtime-integration.d.ts +13 -7
  280. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  281. package/dist/runtime/subagents/runtime-integration.js +112 -2
  282. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  283. package/dist/runtime/subagents/supervisor.d.ts +15 -1
  284. package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
  285. package/dist/runtime/subagents/supervisor.js +58 -3
  286. package/dist/runtime/subagents/supervisor.js.map +1 -1
  287. package/dist/runtime/subagents/tool.d.ts +2 -2
  288. package/dist/runtime/subagents/tool.d.ts.map +1 -1
  289. package/dist/runtime/subagents/tool.js +129 -9
  290. package/dist/runtime/subagents/tool.js.map +1 -1
  291. package/dist/runtime/subagents/types.d.ts +20 -0
  292. package/dist/runtime/subagents/types.d.ts.map +1 -1
  293. package/dist/runtime/subagents/types.js.map +1 -1
  294. package/dist/runtime/subagents/web-research-adapter.d.ts +85 -0
  295. package/dist/runtime/subagents/web-research-adapter.d.ts.map +1 -0
  296. package/dist/runtime/subagents/web-research-adapter.js +328 -0
  297. package/dist/runtime/subagents/web-research-adapter.js.map +1 -0
  298. package/dist/runtime/turn-controller.d.ts.map +1 -1
  299. package/dist/runtime/turn-controller.js +3 -1
  300. package/dist/runtime/turn-controller.js.map +1 -1
  301. package/dist/runtime/ui-events.d.ts +25 -8
  302. package/dist/runtime/ui-events.d.ts.map +1 -1
  303. package/dist/runtime/ui-events.js.map +1 -1
  304. package/dist/runtime/ui-view-model.d.ts +40 -0
  305. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  306. package/dist/runtime/ui-view-model.js +126 -0
  307. package/dist/runtime/ui-view-model.js.map +1 -1
  308. package/dist/services/agent-runner.d.ts +5 -2
  309. package/dist/services/agent-runner.d.ts.map +1 -1
  310. package/dist/services/agent-runner.js +18 -18
  311. package/dist/services/agent-runner.js.map +1 -1
  312. package/dist/services/atomic-write.d.ts +9 -1
  313. package/dist/services/atomic-write.d.ts.map +1 -1
  314. package/dist/services/atomic-write.js +55 -2
  315. package/dist/services/atomic-write.js.map +1 -1
  316. package/dist/services/auth/auth.d.ts +11 -7
  317. package/dist/services/auth/auth.d.ts.map +1 -1
  318. package/dist/services/auth/auth.js +133 -34
  319. package/dist/services/auth/auth.js.map +1 -1
  320. package/dist/services/auth/aws.d.ts +2 -0
  321. package/dist/services/auth/aws.d.ts.map +1 -1
  322. package/dist/services/auth/aws.js +126 -12
  323. package/dist/services/auth/aws.js.map +1 -1
  324. package/dist/services/auth/index.d.ts +1 -1
  325. package/dist/services/auth/index.d.ts.map +1 -1
  326. package/dist/services/auth/index.js +2 -1
  327. package/dist/services/auth/index.js.map +1 -1
  328. package/dist/services/auto-fix/autoFixConfig.d.ts +0 -3
  329. package/dist/services/auto-fix/autoFixConfig.d.ts.map +1 -1
  330. package/dist/services/auto-fix/autoFixConfig.js +25 -8
  331. package/dist/services/auto-fix/autoFixConfig.js.map +1 -1
  332. package/dist/services/auto-fix/autoFixHook.d.ts +7 -0
  333. package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
  334. package/dist/services/auto-fix/autoFixHook.js +10 -1
  335. package/dist/services/auto-fix/autoFixHook.js.map +1 -1
  336. package/dist/services/compact/auto-compact.d.ts +2 -0
  337. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  338. package/dist/services/compact/auto-compact.js +15 -1
  339. package/dist/services/compact/auto-compact.js.map +1 -1
  340. package/dist/services/compact/compact.d.ts.map +1 -1
  341. package/dist/services/compact/compact.js +9 -11
  342. package/dist/services/compact/compact.js.map +1 -1
  343. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  344. package/dist/services/compact/summary-generator.js +28 -4
  345. package/dist/services/compact/summary-generator.js.map +1 -1
  346. package/dist/services/compact/tool-call-groups.d.ts +19 -0
  347. package/dist/services/compact/tool-call-groups.d.ts.map +1 -0
  348. package/dist/services/compact/tool-call-groups.js +105 -0
  349. package/dist/services/compact/tool-call-groups.js.map +1 -0
  350. package/dist/services/concurrent-sessions.d.ts +4 -0
  351. package/dist/services/concurrent-sessions.d.ts.map +1 -1
  352. package/dist/services/concurrent-sessions.js +76 -21
  353. package/dist/services/concurrent-sessions.js.map +1 -1
  354. package/dist/services/config-dir.d.ts.map +1 -1
  355. package/dist/services/config-dir.js +19 -5
  356. package/dist/services/config-dir.js.map +1 -1
  357. package/dist/services/config.d.ts +6 -4
  358. package/dist/services/config.d.ts.map +1 -1
  359. package/dist/services/config.js +16 -72
  360. package/dist/services/config.js.map +1 -1
  361. package/dist/services/doctor.d.ts +2 -2
  362. package/dist/services/doctor.js.map +1 -1
  363. package/dist/services/file-glob.d.ts.map +1 -1
  364. package/dist/services/file-glob.js +22 -2
  365. package/dist/services/file-glob.js.map +1 -1
  366. package/dist/services/file-lock.d.ts +7 -0
  367. package/dist/services/file-lock.d.ts.map +1 -0
  368. package/dist/services/file-lock.js +139 -0
  369. package/dist/services/file-lock.js.map +1 -0
  370. package/dist/services/global-config.d.ts +33 -0
  371. package/dist/services/global-config.d.ts.map +1 -1
  372. package/dist/services/global-config.js +67 -4
  373. package/dist/services/global-config.js.map +1 -1
  374. package/dist/services/goal-storage.d.ts.map +1 -1
  375. package/dist/services/goal-storage.js +52 -19
  376. package/dist/services/goal-storage.js.map +1 -1
  377. package/dist/services/llm.d.ts +12 -0
  378. package/dist/services/llm.d.ts.map +1 -1
  379. package/dist/services/llm.js +166 -69
  380. package/dist/services/llm.js.map +1 -1
  381. package/dist/services/mcp/transports.d.ts +0 -1
  382. package/dist/services/mcp/transports.d.ts.map +1 -1
  383. package/dist/services/mcp/transports.js +12 -13
  384. package/dist/services/mcp/transports.js.map +1 -1
  385. package/dist/services/model-catalog.d.ts +2 -0
  386. package/dist/services/model-catalog.d.ts.map +1 -1
  387. package/dist/services/model-catalog.js +25 -15
  388. package/dist/services/model-catalog.js.map +1 -1
  389. package/dist/services/model-context.d.ts +8 -0
  390. package/dist/services/model-context.d.ts.map +1 -1
  391. package/dist/services/model-context.js +147 -7
  392. package/dist/services/model-context.js.map +1 -1
  393. package/dist/services/model-registry.d.ts.map +1 -1
  394. package/dist/services/model-registry.js +32 -0
  395. package/dist/services/model-registry.js.map +1 -1
  396. package/dist/services/provider-resilience/coordinator.d.ts +9 -4
  397. package/dist/services/provider-resilience/coordinator.d.ts.map +1 -1
  398. package/dist/services/provider-resilience/coordinator.js +88 -21
  399. package/dist/services/provider-resilience/coordinator.js.map +1 -1
  400. package/dist/services/provider-resilience/error-classifier.d.ts +1 -0
  401. package/dist/services/provider-resilience/error-classifier.d.ts.map +1 -1
  402. package/dist/services/provider-resilience/error-classifier.js +50 -29
  403. package/dist/services/provider-resilience/error-classifier.js.map +1 -1
  404. package/dist/services/provider-resilience/index.d.ts +3 -3
  405. package/dist/services/provider-resilience/index.d.ts.map +1 -1
  406. package/dist/services/provider-resilience/index.js +3 -1
  407. package/dist/services/provider-resilience/index.js.map +1 -1
  408. package/dist/services/provider-resilience/request-gate.d.ts +6 -0
  409. package/dist/services/provider-resilience/request-gate.d.ts.map +1 -1
  410. package/dist/services/provider-resilience/request-gate.js +24 -9
  411. package/dist/services/provider-resilience/request-gate.js.map +1 -1
  412. package/dist/services/provider-resilience/stream-recovery.d.ts +1 -1
  413. package/dist/services/provider-resilience/stream-recovery.d.ts.map +1 -1
  414. package/dist/services/provider-resilience/stream-recovery.js +1 -1
  415. package/dist/services/provider-resilience/stream-recovery.js.map +1 -1
  416. package/dist/services/provider-resilience/types.d.ts +9 -0
  417. package/dist/services/provider-resilience/types.d.ts.map +1 -1
  418. package/dist/services/provider-resilience/types.js.map +1 -1
  419. package/dist/services/redaction.d.ts.map +1 -1
  420. package/dist/services/redaction.js +29 -1
  421. package/dist/services/redaction.js.map +1 -1
  422. package/dist/services/session-index.d.ts.map +1 -1
  423. package/dist/services/session-index.js +75 -44
  424. package/dist/services/session-index.js.map +1 -1
  425. package/dist/services/session-memory/sessionMemory.d.ts.map +1 -1
  426. package/dist/services/session-memory/sessionMemory.js +6 -3
  427. package/dist/services/session-memory/sessionMemory.js.map +1 -1
  428. package/dist/services/session-storage.d.ts +8 -0
  429. package/dist/services/session-storage.d.ts.map +1 -1
  430. package/dist/services/session-storage.js +105 -27
  431. package/dist/services/session-storage.js.map +1 -1
  432. package/dist/services/storage-maintenance.d.ts.map +1 -1
  433. package/dist/services/storage-maintenance.js +62 -9
  434. package/dist/services/storage-maintenance.js.map +1 -1
  435. package/dist/services/task-manager.d.ts +9 -4
  436. package/dist/services/task-manager.d.ts.map +1 -1
  437. package/dist/services/task-manager.js +18 -4
  438. package/dist/services/task-manager.js.map +1 -1
  439. package/dist/services/tool-allowlist.d.ts +100 -0
  440. package/dist/services/tool-allowlist.d.ts.map +1 -0
  441. package/dist/services/tool-allowlist.js +250 -0
  442. package/dist/services/tool-allowlist.js.map +1 -0
  443. package/dist/services/usage-state.d.ts +1 -0
  444. package/dist/services/usage-state.d.ts.map +1 -1
  445. package/dist/services/usage-state.js +81 -45
  446. package/dist/services/usage-state.js.map +1 -1
  447. package/dist/services/verification-profile.d.ts.map +1 -1
  448. package/dist/services/verification-profile.js +23 -3
  449. package/dist/services/verification-profile.js.map +1 -1
  450. package/dist/services/web-search-adapters.d.ts.map +1 -1
  451. package/dist/services/web-search-adapters.js +48 -18
  452. package/dist/services/web-search-adapters.js.map +1 -1
  453. package/dist/services/web-search-mcp.d.ts.map +1 -1
  454. package/dist/services/web-search-mcp.js +27 -11
  455. package/dist/services/web-search-mcp.js.map +1 -1
  456. package/dist/services/workspace-diff.d.ts +14 -0
  457. package/dist/services/workspace-diff.d.ts.map +1 -1
  458. package/dist/services/workspace-diff.js +60 -11
  459. package/dist/services/workspace-diff.js.map +1 -1
  460. package/dist/services/yaml-config.d.ts.map +1 -1
  461. package/dist/services/yaml-config.js +2 -1
  462. package/dist/services/yaml-config.js.map +1 -1
  463. package/dist/skills/loader.d.ts.map +1 -1
  464. package/dist/skills/loader.js +26 -11
  465. package/dist/skills/loader.js.map +1 -1
  466. package/dist/skills/runtime.d.ts +3 -3
  467. package/dist/skills/runtime.d.ts.map +1 -1
  468. package/dist/skills/runtime.js +37 -4
  469. package/dist/skills/runtime.js.map +1 -1
  470. package/dist/skills/types.d.ts +1 -1
  471. package/dist/skills/types.d.ts.map +1 -1
  472. package/dist/terminal-ui/launch.d.ts +36 -8
  473. package/dist/terminal-ui/launch.d.ts.map +1 -1
  474. package/dist/terminal-ui/launch.js +171 -1
  475. package/dist/terminal-ui/launch.js.map +1 -1
  476. package/dist/terminal-ui/raw-editor.js.map +1 -1
  477. package/dist/tools/bash_security.d.ts +58 -18
  478. package/dist/tools/bash_security.d.ts.map +1 -1
  479. package/dist/tools/bash_security.js +587 -80
  480. package/dist/tools/bash_security.js.map +1 -1
  481. package/dist/tools/git.d.ts +8 -4
  482. package/dist/tools/git.d.ts.map +1 -1
  483. package/dist/tools/git.js +518 -18
  484. package/dist/tools/git.js.map +1 -1
  485. package/dist/tools/index.d.ts +14 -4
  486. package/dist/tools/index.d.ts.map +1 -1
  487. package/dist/tools/index.js +292 -49
  488. package/dist/tools/index.js.map +1 -1
  489. package/dist/tools/lsp.d.ts +74 -6
  490. package/dist/tools/lsp.d.ts.map +1 -1
  491. package/dist/tools/lsp.js +24 -5
  492. package/dist/tools/lsp.js.map +1 -1
  493. package/dist/tools/mcp.d.ts +19 -6
  494. package/dist/tools/mcp.d.ts.map +1 -1
  495. package/dist/tools/mcp.js +143 -26
  496. package/dist/tools/mcp.js.map +1 -1
  497. package/dist/tools/plan.d.ts +4 -4
  498. package/dist/tools/sandbox.d.ts +141 -0
  499. package/dist/tools/sandbox.d.ts.map +1 -0
  500. package/dist/tools/sandbox.js +500 -0
  501. package/dist/tools/sandbox.js.map +1 -0
  502. package/dist/tools/todo.d.ts +3 -3
  503. package/dist/tools/web.d.ts +15 -4
  504. package/dist/tools/web.d.ts.map +1 -1
  505. package/dist/tools/web.js +346 -61
  506. package/dist/tools/web.js.map +1 -1
  507. package/dist/tui-core/frame.js.map +1 -1
  508. package/dist/tui-ui/launch.d.ts +3 -3
  509. package/dist/tui-ui/launch.d.ts.map +1 -1
  510. package/dist/tui-ui/launch.js +46 -8
  511. package/dist/tui-ui/launch.js.map +1 -1
  512. package/dist/tui-ui/layout.d.ts.map +1 -1
  513. package/dist/tui-ui/layout.js +64 -0
  514. package/dist/tui-ui/layout.js.map +1 -1
  515. package/dist/tui-ui/runner.d.ts +6 -0
  516. package/dist/tui-ui/runner.d.ts.map +1 -1
  517. package/dist/tui-ui/runner.js +82 -1
  518. package/dist/tui-ui/runner.js.map +1 -1
  519. package/dist/tui-ui/state.d.ts +28 -2
  520. package/dist/tui-ui/state.d.ts.map +1 -1
  521. package/dist/tui-ui/state.js +48 -7
  522. package/dist/tui-ui/state.js.map +1 -1
  523. package/dist/tui-ui/terminal-image.d.ts +3 -13
  524. package/dist/tui-ui/terminal-image.d.ts.map +1 -1
  525. package/dist/tui-ui/terminal-image.js +5 -160
  526. package/dist/tui-ui/terminal-image.js.map +1 -1
  527. package/dist/ui/markdown.js.map +1 -1
  528. package/dist/utils/debug-log.d.ts +52 -0
  529. package/dist/utils/debug-log.d.ts.map +1 -0
  530. package/dist/utils/debug-log.js +94 -0
  531. package/dist/utils/debug-log.js.map +1 -0
  532. package/dist/utils/errors.d.ts +25 -0
  533. package/dist/utils/errors.d.ts.map +1 -0
  534. package/dist/utils/errors.js +47 -0
  535. package/dist/utils/errors.js.map +1 -0
  536. package/dist/utils/json.d.ts +6 -0
  537. package/dist/utils/json.d.ts.map +1 -0
  538. package/dist/utils/json.js +66 -0
  539. package/dist/utils/json.js.map +1 -0
  540. package/dist/utils/mask.d.ts +35 -0
  541. package/dist/utils/mask.d.ts.map +1 -0
  542. package/dist/utils/mask.js +52 -0
  543. package/dist/utils/mask.js.map +1 -0
  544. package/dist/utils/observability.d.ts +22 -0
  545. package/dist/utils/observability.d.ts.map +1 -0
  546. package/dist/utils/observability.js +80 -0
  547. package/dist/utils/observability.js.map +1 -0
  548. package/dist/utils/token-estimate.d.ts +8 -0
  549. package/dist/utils/token-estimate.d.ts.map +1 -1
  550. package/dist/utils/token-estimate.js +30 -17
  551. package/dist/utils/token-estimate.js.map +1 -1
  552. package/package.json +9 -7
@@ -1,982 +1,50 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.InkChatController = exports.AgentChatController = void 0;
37
- exports.sessionMessagesToTranscriptEntries = sessionMessagesToTranscriptEntries;
38
- exports.createAssistantStreamPresenter = createAssistantStreamPresenter;
39
- exports.createToolEventPresenter = createToolEventPresenter;
3
+ exports.InkChatController = exports.AgentChatController = exports.sessionMessagesToTranscriptEntries = exports.createToolEventPresenter = exports.createAssistantStreamPresenter = void 0;
40
4
  exports.loadSessionIntoRuntime = loadSessionIntoRuntime;
41
5
  exports.closeSession = closeSession;
42
6
  const commands_1 = require("../commands");
43
- const async_hooks_1 = require("async_hooks");
7
+ const crypto_1 = require("crypto");
44
8
  const parser_1 = require("../commands/parser");
45
- const path = __importStar(require("path"));
46
9
  const session_storage_1 = require("../services/session-storage");
47
10
  const config_1 = require("../services/config");
11
+ const provider_resilience_1 = require("../services/provider-resilience");
12
+ const tool_allowlist_1 = require("../services/tool-allowlist");
48
13
  const framework_1 = require("../framework");
49
14
  const prompt_1 = require("./goals/prompt");
50
15
  const harness_1 = require("../harness");
51
16
  const tools_1 = require("../tools");
52
17
  const tool_serializer_1 = require("../framework/tool-serializer");
53
18
  const tool_artifacts_1 = require("../core/tool-artifacts");
54
- const checkpoint_1 = require("../core/checkpoint");
55
19
  const skills_1 = require("../skills");
56
20
  const subagents_1 = require("./subagents");
57
21
  const file_context_1 = require("../services/file-context");
58
22
  const prompt_context_1 = require("../services/prompt-context");
59
- const format_1 = require("../services/format");
60
23
  const workspace_state_1 = require("../services/workspace-state");
61
24
  const verification_profile_1 = require("../services/verification-profile");
62
25
  const ui_events_1 = require("./ui-events");
63
- const ui_view_model_1 = require("./ui-view-model");
64
26
  const agent_status_1 = require("./agent-status");
65
27
  const loop_budget_1 = require("./loop-budget");
66
- const tool_output_presentation_1 = require("./tool-output-presentation");
67
- const aggregate_tool_presenter_1 = require("./aggregate-tool-presenter");
68
- const ANSI_PATTERN = /\x1b\[[0-9;?]*[A-Za-z]/g;
69
- const LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES = 2048;
70
- const TRACE_ARGS_ARTIFACT_THRESHOLD_BYTES = 160;
71
- const TOOL_TRANSCRIPT_ARG_BUDGET = 512;
72
- function stripAnsi(text) {
73
- return text.replace(ANSI_PATTERN, '');
74
- }
75
- function isAbortError(error, abortSignal) {
76
- if (abortSignal?.aborted)
77
- return true;
78
- if (error instanceof Error) {
79
- return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');
80
- }
81
- return false;
82
- }
83
- function errorLayerForChatError(error) {
84
- const message = error instanceof Error ? error.message : String(error);
85
- const lower = message.toLowerCase();
86
- if (/NotEnoughCvError|code:\s*11210|provider|quota|rate.?limit|timeout|connection/i.test(message)) {
87
- return 'provider';
88
- }
89
- if (/tool|command|exec_command|write_file|edit_file/i.test(message)) {
90
- return 'tool';
91
- }
92
- if (/\bmcp\b/i.test(message))
93
- return 'mcp';
94
- if (/\b(session|resume|compact|harness)\b/i.test(message))
95
- return 'session';
96
- if (/\b(skill|skills)\b/i.test(message))
97
- return 'skills';
98
- if (/\b(memory|vector store|recall|forget)\b/i.test(message))
99
- return 'memory';
100
- if (/\b(renderer|terminal|tty|prompt|resize|scrollback)\b/i.test(message))
101
- return 'renderer';
102
- if (lower.includes('abort') || lower.includes('interrupted'))
103
- return 'runtime';
104
- return 'unknown';
105
- }
106
- function formatChatError(error) {
107
- const message = error instanceof Error ? error.message : String(error);
108
- if (/NotEnoughCvError|code:\s*11210/i.test(message)) {
109
- return [
110
- message,
111
- '',
112
- 'Provider quota or credit appears insufficient. The Orion Code session is still active; switch model/provider or recharge the provider account, then continue.',
113
- ].join('\n');
114
- }
115
- return message;
116
- }
117
- function compactMiddle(text, maxLength) {
118
- const compact = text.replace(/\s+/g, ' ').trim();
119
- if (compact.length <= maxLength)
120
- return compact;
121
- if (maxLength <= 3)
122
- return compact.slice(0, maxLength);
123
- const headLength = Math.ceil((maxLength - 3) * 0.55);
124
- const tailLength = Math.floor((maxLength - 3) * 0.45);
125
- return `${compact.slice(0, headLength)}...${compact.slice(-tailLength)}`;
126
- }
127
- function compactToolArgs(args, maxLength = 160) {
128
- for (const key of [
129
- 'path',
130
- 'file_path',
131
- 'file',
132
- 'cwd',
133
- 'command',
134
- 'pattern',
135
- 'query',
136
- 'url',
137
- 'target',
138
- 'sessionId',
139
- ]) {
140
- const value = args[key];
141
- if (typeof value === 'string') {
142
- return compactMiddle(value, maxLength);
143
- }
144
- }
145
- const firstString = Object.values(args).find(value => typeof value === 'string');
146
- if (typeof firstString === 'string') {
147
- return compactMiddle(firstString, maxLength);
148
- }
149
- return '';
150
- }
151
- function fullToolArgsForTrace(name, args) {
152
- if (name === 'exec_command' && typeof args.command === 'string') {
153
- return `$ ${args.command}`;
154
- }
155
- try {
156
- return JSON.stringify(args, null, 2);
157
- }
158
- catch {
159
- return compactToolArgs(args, 2048);
160
- }
161
- }
162
- function buildTraceArgsDetails(projectPath, name, args) {
163
- const argsSummary = compactToolArgs(args);
164
- const fullArgs = (0, session_storage_1.redactTraceText)(fullToolArgsForTrace(name, args)).trim();
165
- const argsBytes = byteLength(fullArgs);
166
- if (!projectPath ||
167
- !fullArgs ||
168
- fullArgs === (0, session_storage_1.redactTraceText)(argsSummary) ||
169
- argsBytes <= TRACE_ARGS_ARTIFACT_THRESHOLD_BYTES) {
170
- return { argsSummary };
171
- }
172
- const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, `${name}-args`, fullArgs, argsBytes);
173
- return artifact ? { argsSummary, argsArtifactId: artifact.id, argsBytes } : { argsSummary };
174
- }
175
- function parseToolCallArgsForRuntime(toolCall) {
176
- try {
177
- const parsed = JSON.parse(toolCall.function.arguments || '{}');
178
- return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
179
- ? parsed
180
- : null;
181
- }
182
- catch {
183
- return null;
184
- }
185
- }
186
- function resolveProjectScopedPath(cwd, filePath) {
187
- const absolute = path.resolve(cwd, filePath);
188
- const relative = path.relative(cwd, absolute);
189
- if (relative.startsWith('..') || path.isAbsolute(relative))
190
- return null;
191
- return absolute;
192
- }
193
- function checkpointTargetsFromToolCalls(cwd, toolCalls) {
194
- const targets = new Set();
195
- for (const toolCall of toolCalls) {
196
- const name = toolCall.function.name;
197
- if (name !== 'write_file' && name !== 'edit_file')
198
- continue;
199
- const args = parseToolCallArgsForRuntime(toolCall);
200
- if (!args || typeof args.path !== 'string')
201
- continue;
202
- if (name === 'edit_file' && args.preview === true)
203
- continue;
204
- const target = resolveProjectScopedPath(cwd, args.path);
205
- if (target)
206
- targets.add(target);
207
- }
208
- return Array.from(targets);
209
- }
210
- function createPreToolCheckpoint(events, sessionId, turnId, checkpointId, cwd, toolCalls) {
211
- const targets = checkpointTargetsFromToolCalls(cwd, toolCalls);
212
- if (targets.length === 0)
213
- return { created: false, targetCount: 0, risky: false };
214
- const risky = (0, checkpoint_1.shouldCreateMultiFileCheckpoint)(targets.length);
215
- const checkpoint = (0, checkpoint_1.createCheckpoint)(cwd, checkpointId, targets);
216
- if (!sessionId)
217
- return { created: true, targetCount: targets.length, risky };
218
- const relativeTargets = targets.map(target => path.relative(cwd, target));
219
- recordTraceEvent(events, sessionId, {
220
- turnId,
221
- type: 'checkpoint',
222
- checkpointId,
223
- checkpointFileCount: checkpoint?.files.length ?? 0,
224
- checkpointFiles: checkpoint?.files.map(file => file.path) ?? [],
225
- workspaceFiles: relativeTargets,
226
- note: checkpoint
227
- ? risky
228
- ? 'risky_multi_file_checkpoint'
229
- : 'pre_edit_checkpoint'
230
- : 'pre_edit_checkpoint_skipped',
231
- });
232
- return { created: true, targetCount: targets.length, risky };
233
- }
234
- function byteLength(text) {
235
- return Buffer.byteLength(text, 'utf8');
236
- }
237
- function traceTurnId(turnId) {
238
- return turnId == null ? `turn-${Date.now()}` : String(turnId);
239
- }
240
- function compactTraceError(error) {
241
- const message = error instanceof Error ? error.message : String(error);
242
- return compactMiddle(message, 240);
243
- }
244
- function getLastRequestDiagnostics(llm) {
245
- if (!llm)
246
- return undefined;
247
- const reader = llm.getLastRequestDiagnostics;
248
- return typeof reader === 'function' ? reader.call(llm) : undefined;
249
- }
250
- function compactPathList(paths, maxItems = 40) {
251
- return paths.slice(0, maxItems);
252
- }
253
- function formatWorkspaceFileForTrace(file) {
254
- const metadata = [
255
- typeof file.sizeBytes === 'number' ? `${file.sizeBytes}B` : '',
256
- typeof file.mtimeMs === 'number' ? `mtime=${file.mtimeMs}` : '',
257
- ]
258
- .filter(Boolean)
259
- .join(' ');
260
- return `${file.status} ${file.path}${metadata ? ` (${metadata})` : ''}`;
261
- }
262
- function appendWorkspaceSnapshotTrace(events, sessionId, turnId, phase, snapshot) {
263
- if (!sessionId)
264
- return;
265
- recordTraceEvent(events, sessionId, {
266
- turnId,
267
- type: 'workspace_snapshot',
268
- workspacePhase: phase,
269
- workspaceGitAvailable: snapshot.gitAvailable,
270
- workspaceDirty: snapshot.dirty,
271
- workspaceBranch: snapshot.branch,
272
- workspaceFileCount: snapshot.fileCount,
273
- workspaceFiles: compactPathList(snapshot.files.map(formatWorkspaceFileForTrace)),
274
- error: snapshot.error ? compactMiddle(snapshot.error, 240) : undefined,
275
- });
276
- }
277
- function appendWorkspaceDeltaTrace(events, sessionId, turnId, before, after) {
278
- const delta = (0, workspace_state_1.diffWorkspaceSnapshots)(before, after);
279
- if (sessionId) {
280
- recordTraceEvent(events, sessionId, {
281
- turnId,
282
- type: 'workspace_delta',
283
- workspaceFileCount: delta.filesAfterTurn.length,
284
- workspaceFiles: compactPathList(delta.filesAfterTurn),
285
- workspaceNewByTurn: compactPathList(delta.newFilesByTurn),
286
- workspaceChangedByTurn: compactPathList(delta.changedByTurn),
287
- workspaceModifiedPreExistingByTurn: compactPathList(delta.modifiedPreExistingByTurn),
288
- workspaceResolvedByTurn: compactPathList(delta.resolvedByTurn),
289
- note: `pre_existing=${delta.preExistingFiles.length}`,
290
- });
291
- }
292
- return delta;
293
- }
294
- function workspaceDeltaHasTurnChanges(delta) {
295
- return (delta.newFilesByTurn.length > 0 ||
296
- delta.changedByTurn.length > 0 ||
297
- delta.resolvedByTurn.length > 0);
298
- }
299
- function formatFailureRecoveryNotice(turnId, delta, checkpointIds) {
300
- const files = compactPathList([...delta.newFilesByTurn, ...delta.changedByTurn, ...delta.resolvedByTurn], 8);
301
- const fileText = files.length > 0 ? files.join(', ') : 'workspace changes recorded';
302
- const checkpointText = checkpointIds.length > 0
303
- ? ` Checkpoints: ${checkpointIds.join(', ')}. Preview rollback with /checkpoint restore <id>; restore each listed checkpoint if multiple.`
304
- : '';
305
- return `Turn failed after modifying files: ${fileText}. Inspect /trace ${turnId}.${checkpointText}`;
306
- }
307
- function appendVerificationProfileTrace(events, sessionId, turnId, profile) {
308
- if (!sessionId || profile.changedFiles.length === 0)
309
- return;
310
- recordTraceEvent(events, sessionId, {
311
- turnId,
312
- type: 'verification_profile',
313
- verificationProfile: profile.profile,
314
- verificationRequired: profile.required,
315
- verificationRisky: (0, verification_profile_1.isRiskyEdit)(profile.changedFiles),
316
- verificationCommands: compactPathList(profile.commands, 8),
317
- verificationChangedFiles: compactPathList(profile.changedFiles),
318
- note: profile.reason,
319
- });
320
- }
321
- function appendVerificationResultTrace(events, sessionId, turnId, result) {
322
- if (!sessionId)
323
- return;
324
- recordTraceEvent(events, sessionId, {
325
- turnId,
326
- type: 'verification_result',
327
- verificationCommand: result.command,
328
- verificationPassed: result.success,
329
- outputBytes: result.outputBytes,
330
- error: result.error ? compactMiddle(result.error, 240) : undefined,
331
- });
332
- }
333
- function appendVerificationSummaryTrace(events, sessionId, turnId, summary, changedFiles) {
334
- if (!sessionId || changedFiles.length === 0)
335
- return;
336
- recordTraceEvent(events, sessionId, {
337
- turnId,
338
- type: 'verification_summary',
339
- verificationProfile: summary.profile,
340
- verificationRequired: summary.required,
341
- verificationCommands: compactPathList(summary.commandsRun, 12),
342
- verificationPassedCommands: compactPathList(summary.passedCommands, 12),
343
- verificationFailedCommands: compactPathList(summary.failedCommands, 12),
344
- verificationMissingCommands: compactPathList(summary.missingCommands, 12),
345
- verificationChangedFiles: compactPathList(changedFiles),
346
- verificationClaimAllowed: summary.claimAllowed,
347
- note: summary.skippedReason,
348
- });
349
- }
350
- function compactVerificationCommands(commands, maxItems = 12) {
351
- return commands.slice(0, maxItems).map(session_storage_1.redactTraceText);
352
- }
353
- function withVerificationLoopStats(stats, summary) {
354
- return {
355
- ...stats,
356
- verificationProfile: summary.profile,
357
- verificationRequired: summary.required,
358
- verificationClaimAllowed: summary.claimAllowed,
359
- verificationPassedCommands: compactVerificationCommands(summary.passedCommands),
360
- verificationFailedCommands: compactVerificationCommands(summary.failedCommands),
361
- verificationMissingCommands: compactVerificationCommands(summary.missingCommands),
362
- verificationSkippedReason: summary.skippedReason
363
- ? (0, session_storage_1.redactTraceText)(summary.skippedReason)
364
- : undefined,
365
- };
366
- }
367
- function shouldRecordVerificationLoopStats(profile, summary) {
368
- return (profile.changedFiles.length > 0 ||
369
- summary.commandsRun.length > 0 ||
370
- summary.passedCommands.length > 0 ||
371
- summary.failedCommands.length > 0 ||
372
- summary.missingCommands.length > 0);
373
- }
374
- function appendPostWorkspaceTrace(events, sessionId, turnId, cwd, before, verificationResults = []) {
375
- const postWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(cwd);
376
- appendWorkspaceSnapshotTrace(events, sessionId, turnId, 'post_turn', postWorkspace);
377
- const delta = appendWorkspaceDeltaTrace(events, sessionId, turnId, before, postWorkspace);
378
- const profile = (0, verification_profile_1.selectVerificationProfile)(cwd, delta.changedByTurn);
379
- const summary = (0, verification_profile_1.summarizeVerificationState)(profile, verificationResults);
380
- appendVerificationProfileTrace(events, sessionId, turnId, profile);
381
- appendVerificationSummaryTrace(events, sessionId, turnId, summary, profile.changedFiles);
382
- return { delta, profile, summary };
383
- }
384
- function appendAssistantNotice(messages, notice) {
385
- for (let index = messages.length - 1; index >= 0; index--) {
386
- const message = messages[index];
387
- if (message.role === 'assistant' && !message.tool_calls) {
388
- message.content = message.content ? `${message.content}\n\n${notice}` : notice;
389
- return;
390
- }
391
- }
392
- messages.push({
393
- role: 'assistant',
394
- content: notice,
395
- timestamp: Date.now(),
396
- });
397
- }
398
- function recordTraceEvent(events, sessionId, event) {
399
- if (!sessionId)
400
- return null;
401
- const goal = goalTraceContext.getStore();
402
- const traceEvent = (0, session_storage_1.appendSessionTraceEvent)(sessionId, {
403
- ...event,
404
- goalId: goal?.goalId,
405
- goalRevision: goal?.goalRevision,
406
- goalInputKind: goal?.goalInputKind,
407
- goalStopReason: goal?.getStopReason(),
408
- });
409
- if (traceEvent) {
410
- events.traceEventRecorded?.(traceEvent);
411
- }
412
- return traceEvent;
413
- }
414
- function recordProviderTraceEvents(events, sessionId, turnId, stats) {
415
- if ((stats.providerRetryCount ?? 0) > 0) {
416
- recordTraceEvent(events, sessionId, {
417
- turnId,
418
- type: 'provider_retry',
419
- providerRetryCount: stats.providerRetryCount,
420
- providerRetryDelayMs: stats.providerRetryDelayMs,
421
- providerRetryErrorTypes: stats.providerRetryErrorTypes,
422
- providerLastRetryErrorType: stats.providerLastRetryErrorType,
423
- providerLastRetryStatus: stats.providerLastRetryStatus,
424
- providerFinalModel: stats.providerFinalModel,
425
- providerUsingFallback: stats.providerUsingFallback,
426
- });
427
- }
428
- if ((stats.providerFallbackCount ?? 0) > 0 || stats.providerUsingFallback) {
429
- recordTraceEvent(events, sessionId, {
430
- turnId,
431
- type: 'provider_fallback',
432
- providerFallbackCount: stats.providerFallbackCount,
433
- providerFallbackFromModel: stats.providerFallbackFromModel,
434
- providerFallbackToModel: stats.providerFallbackToModel,
435
- providerFinalModel: stats.providerFinalModel,
436
- providerUsingFallback: stats.providerUsingFallback,
437
- });
438
- }
439
- }
440
- function toHarnessDiagnostics(state) {
441
- const stats = state.promptAssemblyStats;
442
- const redactOptional = (value) => typeof value === 'string' ? (0, session_storage_1.redactTraceText)(value) : undefined;
443
- const redactList = (values) => values?.slice(0, 6).map(session_storage_1.redactTraceText);
444
- return {
445
- taskEpoch: state.taskEpoch,
446
- rootObjective: redactOptional(state.rootObjective ?? state.contract?.objective),
447
- activeInstruction: redactOptional(state.activeInstruction ?? state.contract?.userIntent),
448
- openQuestions: redactList(state.openQuestions),
449
- diagnostics: redactList(state.diagnostics?.slice(-6)),
450
- ledgerSize: state.ledger?.length ?? 0,
451
- evidenceSize: state.evidenceIndex?.length ?? 0,
452
- turnSummaryCount: state.turnSummaries?.length ?? 0,
453
- promptAssembly: stats
454
- ? {
455
- modelId: stats.modelId,
456
- estimatedTokens: stats.estimatedTokens,
457
- budgetTokens: stats.budgetTokens,
458
- sections: stats.sections.slice(0, 12),
459
- includedEvidence: stats.includedEvidence.length,
460
- omittedEvidence: stats.omittedEvidence.length,
461
- }
462
- : undefined,
463
- };
464
- }
465
- function emitHarnessDiagnostics(events, state) {
466
- events.harnessDiagnosticsUpdated?.(toHarnessDiagnostics(state));
467
- }
468
- function toolStartContent(event) {
469
- return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromStarted)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
470
- }
471
- function toolFinishContent(event) {
472
- return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromFinished)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
473
- }
474
- function structuredToolStartActivity(event, seq) {
475
- const command = event.name === 'exec_command' && typeof event.args.command === 'string'
476
- ? event.args.command
477
- : undefined;
478
- const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
479
- return {
480
- state: 'running',
481
- name: event.name,
482
- detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
483
- command: safeCommand,
484
- body: '',
485
- seq,
486
- };
487
- }
488
- function structuredToolFinishActivity(event, seq, options = {}) {
489
- const modelVisible = (0, tool_serializer_1.parseToolResultEnvelope)(event.modelVisibleResult);
490
- const durable = (0, tool_serializer_1.parseToolResultEnvelope)(event.result);
491
- const durableOutput = typeof durable.output === 'string' ? durable.output : '';
492
- const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
493
- const outputBytes = event.outputBytes ?? Buffer.byteLength(durableOutput, 'utf8');
494
- const aggregatePresentation = (0, aggregate_tool_presenter_1.presentAggregateToolResult)(event.name, durableOutput, outputBytes);
495
- const aggregate = aggregatePresentation?.view;
496
- const storedArtifact = event.artifactRef ??
497
- (options.projectPath &&
498
- durableOutput &&
499
- (outputBytes > tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY.inlineMaxBytes || aggregate)
500
- ? ((0, tool_artifacts_1.storeArtifact)(options.projectPath, event.name, durableOutput, outputBytes) ?? undefined)
501
- : undefined);
502
- const artifactRef = storedArtifact
503
- ? { id: storedArtifact.id, outputBytes: storedArtifact.outputBytes }
504
- : undefined;
505
- const outputView = (0, tool_output_presentation_1.createToolOutputView)({
506
- toolName: event.name,
507
- success: event.success,
508
- summary: event.summary,
509
- rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
510
- outputBytes,
511
- artifactRef,
512
- callId: event.callId,
513
- sequence: seq,
514
- turnId: options.turnId,
515
- policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
516
- });
517
- if (aggregate) {
518
- outputView.aggregate = {
519
- ...aggregate,
520
- steps: aggregate.steps.map(step => ({ ...step, detailRef: outputView.detailRef })),
521
- };
522
- }
523
- const command = event.name === 'exec_command' && typeof event.args.command === 'string'
524
- ? event.args.command
525
- : undefined;
526
- const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
527
- return {
528
- state: event.success ? 'success' : 'error',
529
- name: event.name,
530
- detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
531
- command: safeCommand,
532
- duration: `${event.duration}ms`,
533
- summary: event.summary ? (0, session_storage_1.redactTraceText)(event.summary.split(/\r?\n/u, 1)[0]) : undefined,
534
- outputBytes,
535
- body: (0, session_storage_1.redactTraceText)(modelVisible.output),
536
- error: event.error ? (0, session_storage_1.redactTraceText)(event.error) : undefined,
537
- seq,
538
- artifactHint: artifactRef ? `/artifacts show ${artifactRef.id} --full` : undefined,
539
- callId: event.callId,
540
- turnId: options.turnId,
541
- outputView,
542
- };
543
- }
544
- function isSyntheticCompactContext(content) {
545
- return (content.startsWith('[Orion Code Context State v2]') ||
546
- content.startsWith('[Context Summary]') ||
547
- content.startsWith('I will continue from this Orion Code Context State') ||
548
- content.startsWith('I understand the context. I will continue the conversation with this background information.'));
549
- }
550
- function sessionToolCallSummaries(message) {
551
- return (message.tool_calls ?? []).map(call => {
552
- const args = parseToolCallArgs(call.function.arguments);
553
- const detail = compactToolArgs(args);
554
- return {
555
- id: call.id,
556
- content: `Requested ${call.function.name}${detail ? ` ${detail}` : ''}`,
557
- };
558
- });
559
- }
560
- function parseToolCallArgs(rawArgs) {
561
- try {
562
- return rawArgs ? JSON.parse(rawArgs) : {};
563
- }
564
- catch {
565
- return rawArgs ? { arguments: rawArgs } : {};
566
- }
567
- }
568
- function parseSessionToolResult(content) {
569
- try {
570
- const parsed = JSON.parse(content);
571
- return {
572
- success: parsed.success === true,
573
- error: typeof parsed.error === 'string' ? parsed.error : undefined,
574
- summary: typeof parsed.summary === 'string' ? parsed.summary : undefined,
575
- };
576
- }
577
- catch {
578
- return { success: false, error: 'Invalid JSON result' };
579
- }
580
- }
581
- function removeTrailingUserMessage(runtime) {
582
- const history = runtime.store.getSnapshot().conversationHistory;
583
- if (history.length === 0)
584
- return;
585
- const lastMsg = history[history.length - 1];
586
- if (lastMsg?.role === 'user') {
587
- runtime.store.setState({ conversationHistory: history.slice(0, -1) });
588
- }
589
- }
590
- function sessionToolResultSummary(message, toolCallsById) {
591
- if (!message.toolCallId)
592
- return null;
593
- const call = toolCallsById.get(message.toolCallId);
594
- if (!call)
595
- return null;
596
- const args = parseToolCallArgs(call.function.arguments);
597
- const detail = compactToolArgs(args);
598
- const parsed = parseSessionToolResult(message.content);
599
- const firstLine = parsed.summary ||
600
- `${parsed.success ? '✓' : '✗'} ${call.function.name}${detail ? ` ${detail}` : ''}`;
601
- return parsed.error ? `${firstLine}\nError: ${parsed.error}` : firstLine;
602
- }
603
- function sessionMessagesToTranscriptEntries(sessionId, options = {}) {
604
- const messages = (0, session_storage_1.loadSessionTranscriptMessages)(sessionId);
605
- const resultTraces = options.includeToolOutputViews
606
- ? (0, session_storage_1.readSessionTraceEvents)(sessionId).filter(trace => trace.type === 'tool_result' && trace.callId)
607
- : [];
608
- const resultTraceByCallId = new Map(resultTraces.map(trace => [trace.callId, trace]));
609
- const sequenceByCallId = new Map();
610
- resultTraces.forEach((trace, index) => {
611
- if (!sequenceByCallId.has(trace.callId))
612
- sequenceByCallId.set(trace.callId, index + 1);
613
- });
614
- const entries = [];
615
- const toolCallsById = new Map();
616
- const completedToolCallIds = new Set();
617
- let fallbackToolSequence = 0;
618
- for (const message of messages) {
619
- for (const call of message.tool_calls ?? []) {
620
- toolCallsById.set(call.id, call);
621
- }
622
- if (message.role === 'tool' && message.toolCallId) {
623
- completedToolCallIds.add(message.toolCallId);
624
- }
625
- }
626
- messages.forEach((message, index) => {
627
- if (isSyntheticCompactContext(message.content))
628
- return;
629
- const idBase = `session-${sessionId.slice(0, 8)}-${index}`;
630
- if (message.role === 'user') {
631
- entries.push({ id: `${idBase}-user`, role: 'user', content: message.content });
632
- return;
633
- }
634
- if (message.role === 'assistant') {
635
- if (message.content?.trim()) {
636
- entries.push({ id: `${idBase}-assistant`, role: 'assistant', content: message.content });
637
- }
638
- for (const summary of sessionToolCallSummaries(message)) {
639
- if (!completedToolCallIds.has(summary.id)) {
640
- entries.push({
641
- id: `${idBase}-tool-call-${entries.length}`,
642
- role: 'tool',
643
- content: summary.content,
644
- });
645
- }
646
- }
647
- return;
648
- }
649
- if (message.role === 'tool') {
650
- const summary = sessionToolResultSummary(message, toolCallsById);
651
- const call = message.toolCallId ? toolCallsById.get(message.toolCallId) : undefined;
652
- const trace = message.toolCallId ? resultTraceByCallId.get(message.toolCallId) : undefined;
653
- const durable = (0, tool_serializer_1.parseToolResultEnvelope)(message.content);
654
- const modelVisible = message.modelVisibleContent
655
- ? (0, tool_serializer_1.parseToolResultEnvelope)(message.modelVisibleContent)
656
- : durable;
657
- const durableOutput = typeof durable.output === 'string' ? durable.output : '';
658
- const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
659
- const outputBytes = trace?.outputBytes ??
660
- (durable.schemaVersion === 1 ? durable.outputBytes : undefined) ??
661
- Buffer.byteLength(durableOutput, 'utf8');
662
- const artifactId = durable.artifactRef?.id ?? trace?.artifactId;
663
- fallbackToolSequence += 1;
664
- const sequence = message.toolCallId
665
- ? (sequenceByCallId.get(message.toolCallId) ?? fallbackToolSequence)
666
- : fallbackToolSequence;
667
- const outputView = options.includeToolOutputViews && call && message.toolCallId
668
- ? (0, tool_output_presentation_1.createToolOutputView)({
669
- toolName: call.function.name,
670
- success: durable.success,
671
- summary: durable.summary,
672
- rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
673
- outputBytes,
674
- artifactRef: artifactId ? { id: artifactId, outputBytes } : undefined,
675
- callId: message.toolCallId,
676
- sequence,
677
- turnId: trace?.turnId,
678
- policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
679
- })
680
- : undefined;
681
- entries.push({
682
- id: `${idBase}-tool`,
683
- role: 'tool',
684
- content: summary ??
685
- (message.toolCallId
686
- ? `Tool result ${message.toolCallId}\n${message.content}`
687
- : message.content),
688
- toolActivity: call && message.toolCallId && outputView
689
- ? {
690
- state: durable.success ? 'success' : 'error',
691
- name: call.function.name,
692
- detail: (0, session_storage_1.redactTraceText)(compactToolArgs(parseToolCallArgs(call.function.arguments))),
693
- summary: durable.summary
694
- ? (0, session_storage_1.redactTraceText)(durable.summary.split(/\r?\n/u, 1)[0])
695
- : undefined,
696
- outputBytes,
697
- body: (0, session_storage_1.redactTraceText)(durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput),
698
- error: durable.error ? (0, session_storage_1.redactTraceText)(durable.error) : undefined,
699
- duration: typeof trace?.duration === 'number' ? `${trace.duration}ms` : undefined,
700
- seq: sequence,
701
- artifactHint: artifactId ? `/artifacts show ${artifactId} --full` : undefined,
702
- callId: message.toolCallId,
703
- turnId: trace?.turnId,
704
- outputView,
705
- }
706
- : undefined,
707
- });
708
- return;
709
- }
710
- if (message.role === 'system') {
711
- entries.push({ id: `${idBase}-system`, role: 'system', content: message.content });
712
- }
713
- });
714
- return entries;
715
- }
716
- function createAssistantStreamPresenter(events, abortSignal) {
717
- let activeSegmentText = '';
718
- let activeEntryId = null;
719
- const ensureLiveEntry = () => {
720
- if (abortSignal?.aborted || !activeSegmentText)
721
- return null;
722
- if (activeEntryId) {
723
- events.update(activeEntryId, { content: activeSegmentText });
724
- return activeEntryId;
725
- }
726
- activeEntryId = events.append({
727
- role: 'assistant',
728
- content: activeSegmentText,
729
- live: true,
730
- });
731
- return activeEntryId;
732
- };
733
- const flushSegment = () => {
734
- if (abortSignal?.aborted) {
735
- if (activeEntryId)
736
- events.remove(activeEntryId);
737
- activeEntryId = null;
738
- activeSegmentText = '';
739
- return;
740
- }
741
- const entryId = ensureLiveEntry();
742
- if (!entryId)
743
- return;
744
- events.finalize(entryId);
745
- activeEntryId = null;
746
- activeSegmentText = '';
747
- };
748
- return {
749
- appendChunk(chunk) {
750
- if (abortSignal?.aborted || !chunk)
751
- return;
752
- activeSegmentText += chunk;
753
- ensureLiveEntry();
754
- },
755
- closeSegment() {
756
- flushSegment();
757
- },
758
- discardSegment() {
759
- if (activeEntryId)
760
- events.remove(activeEntryId);
761
- activeEntryId = null;
762
- activeSegmentText = '';
763
- },
764
- ensureMessage(content) {
765
- if (abortSignal?.aborted || !content || activeSegmentText.length > 0)
766
- return;
767
- activeSegmentText = content;
768
- ensureLiveEntry();
769
- },
770
- replaceMessage(content) {
771
- if (abortSignal?.aborted || !content)
772
- return;
773
- activeSegmentText = content;
774
- ensureLiveEntry();
775
- },
776
- };
777
- }
778
- const goalTraceContext = new async_hooks_1.AsyncLocalStorage();
779
- class LocalFastPathBlockedError extends Error {
780
- constructor(message) {
781
- super(message);
782
- this.name = 'LocalFastPathBlockedError';
783
- }
784
- }
785
- function parseLocalFastPath(input) {
786
- const text = input.trim();
787
- if (/^git\s+status$/i.test(text)) {
788
- return { tool: 'git_status', args: {}, label: 'git status' };
789
- }
790
- const readMatch = /^(?:read|读取)\s+(.+)$/i.exec(text);
791
- const readTarget = readMatch?.[1]?.trim();
792
- const looksLikePath = Boolean(readTarget) &&
793
- !/\s/.test(readTarget) &&
794
- (/[/\\.]/.test(readTarget) || readTarget.startsWith('~'));
795
- if (readTarget && looksLikePath) {
796
- return { tool: 'read_file', args: { path: readTarget }, label: `read ${readTarget}` };
797
- }
798
- const grepMatch = /^(?:grep|搜索)\s+(.+)$/i.exec(text);
799
- if (grepMatch?.[1]?.trim()) {
800
- return {
801
- tool: 'grep',
802
- args: { pattern: grepMatch[1].trim() },
803
- label: `grep ${grepMatch[1].trim()}`,
804
- };
805
- }
806
- const runTestMatch = /^(?:run\s+test|运行测试)\s*[::]\s*(.+)$/i.exec(text);
807
- if (runTestMatch?.[1]?.trim()) {
808
- return {
809
- tool: 'exec_command',
810
- args: { command: runTestMatch[1].trim() },
811
- label: `run test: ${runTestMatch[1].trim()}`,
812
- };
813
- }
814
- return null;
815
- }
816
- function formatLocalFastPathAssistantContent(action, rawResult, projectPath) {
817
- const envelope = (0, tool_serializer_1.parseToolResultEnvelope)(rawResult);
818
- const rawOutput = typeof envelope.output === 'string' ? envelope.output : '';
819
- const output = rawOutput.trim();
820
- const summary = envelope.summary || `${action.tool} ${envelope.success ? 'completed' : 'failed'}`;
821
- const lines = [
822
- envelope.success
823
- ? `Local fast path completed ${action.label}.`
824
- : `Local fast path failed ${action.label}.`,
825
- '',
826
- summary,
827
- ];
828
- if (!envelope.success && envelope.error) {
829
- lines.push(`Error: ${envelope.error}`);
830
- }
831
- if (!output) {
832
- return { content: lines.join('\n'), artifactRef: envelope.artifactRef };
833
- }
834
- let artifactRef = envelope.artifactRef;
835
- let preview = output;
836
- const outputBytes = envelope.outputBytes ?? byteLength(rawOutput);
837
- if (byteLength(rawOutput) > LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES) {
838
- if (!artifactRef) {
839
- const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, action.tool, rawOutput, outputBytes);
840
- artifactRef = artifact ? { id: artifact.id, outputBytes: artifact.outputBytes } : undefined;
841
- }
842
- preview = (0, tool_artifacts_1.truncateForContext)(output, LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES);
843
- }
844
- if (artifactRef) {
845
- lines.push('', `Full output: /artifacts show ${artifactRef.id} --full (${(0, format_1.formatBytes)(artifactRef.outputBytes)})`);
846
- }
847
- lines.push('', 'Preview:', preview);
848
- return { content: lines.join('\n'), artifactRef };
849
- }
850
- function createToolEventPresenter(events, options = {}) {
851
- const runningToolEntries = new Map();
852
- let toolSequenceCounter = 0;
853
- return {
854
- start(event) {
855
- const seq = ++toolSequenceCounter;
856
- const entryId = events.append({
857
- role: 'tool',
858
- title: 'tool',
859
- content: toolStartContent(event),
860
- toolActivity: structuredToolStartActivity(event, seq),
861
- });
862
- runningToolEntries.set(event.callId, {
863
- entryId,
864
- name: event.name,
865
- args: event.args,
866
- sequence: seq,
867
- batchCount: event.batchCount,
868
- batchIndex: event.batchIndex,
869
- });
870
- events.toolStarted?.({
871
- callId: event.callId,
872
- name: event.name,
873
- args: event.args,
874
- sequence: seq,
875
- batchCount: event.batchCount,
876
- batchIndex: event.batchIndex,
877
- });
878
- },
879
- finish(event) {
880
- const content = toolFinishContent(event);
881
- const stored = runningToolEntries.get(event.callId);
882
- const seq = stored?.sequence ?? ++toolSequenceCounter;
883
- const toolActivity = structuredToolFinishActivity(event, seq, options);
884
- if (stored) {
885
- events.finalize(stored.entryId, {
886
- role: event.success ? 'tool' : 'error',
887
- title: 'tool',
888
- content,
889
- toolActivity,
890
- });
891
- runningToolEntries.delete(event.callId);
892
- }
893
- else {
894
- const entryId = events.append({
895
- role: event.success ? 'tool' : 'error',
896
- title: 'tool',
897
- content,
898
- toolActivity,
899
- });
900
- events.finalize(entryId);
901
- }
902
- events.toolFinished?.({
903
- callId: event.callId,
904
- name: event.name,
905
- args: event.args,
906
- success: event.success,
907
- duration: event.duration,
908
- summary: event.summary,
909
- error: event.error,
910
- outputBytes: event.outputBytes,
911
- artifactRef: toolActivity.outputView?.detailRef?.artifactId
912
- ? {
913
- id: toolActivity.outputView.detailRef.artifactId,
914
- outputBytes: toolActivity.outputView.detailRef.outputBytes,
915
- }
916
- : event.artifactRef,
917
- externalAssertion: event.externalAssertion,
918
- sequence: seq,
919
- batchCount: event.batchCount,
920
- batchIndex: event.batchIndex,
921
- });
922
- },
923
- finalizePendingAsSkipped(reason = 'permission denied') {
924
- for (const [callId, entry] of runningToolEntries) {
925
- events.finalize(entry.entryId, {
926
- role: 'tool',
927
- title: 'tool',
928
- content: `Skipped · ${reason}`,
929
- toolActivity: {
930
- state: 'skipped',
931
- name: entry.name,
932
- detail: '',
933
- body: '',
934
- error: reason,
935
- seq: entry.sequence,
936
- },
937
- });
938
- events.toolFinished?.({
939
- callId,
940
- name: entry.name,
941
- args: entry.args,
942
- success: false,
943
- skipped: true,
944
- duration: 0,
945
- error: reason,
946
- sequence: entry.sequence,
947
- batchCount: entry.batchCount,
948
- batchIndex: entry.batchIndex,
949
- });
950
- }
951
- runningToolEntries.clear();
952
- },
953
- };
954
- }
955
- async function captureConsoleOutput(fn) {
956
- const lines = [];
957
- const originalLog = console.log;
958
- const originalError = console.error;
959
- const originalWarn = console.warn;
960
- const capture = (...args) => {
961
- lines.push(stripAnsi(args.map(arg => (typeof arg === 'string' ? arg : JSON.stringify(arg))).join(' ')));
962
- };
963
- console.log = capture;
964
- console.error = capture;
965
- console.warn = capture;
966
- try {
967
- const result = await fn();
968
- return { result, output: lines.join('\n').trim() };
969
- }
970
- finally {
971
- console.log = originalLog;
972
- console.error = originalError;
973
- console.warn = originalWarn;
974
- }
975
- }
28
+ const observability_1 = require("../utils/observability");
29
+ const chat_trace_1 = require("./chat-trace");
30
+ const chat_checkpoint_1 = require("./chat-checkpoint");
31
+ const chat_workspace_1 = require("./chat-workspace");
32
+ const chat_presentation_1 = require("./chat-presentation");
33
+ var chat_presentation_2 = require("./chat-presentation");
34
+ Object.defineProperty(exports, "createAssistantStreamPresenter", { enumerable: true, get: function () { return chat_presentation_2.createAssistantStreamPresenter; } });
35
+ Object.defineProperty(exports, "createToolEventPresenter", { enumerable: true, get: function () { return chat_presentation_2.createToolEventPresenter; } });
36
+ Object.defineProperty(exports, "sessionMessagesToTranscriptEntries", { enumerable: true, get: function () { return chat_presentation_2.sessionMessagesToTranscriptEntries; } });
976
37
  class AgentChatController {
977
38
  setGoalCoordinator(coord) {
978
39
  this.goalCoordinator = coord;
979
40
  }
41
+ resolveToolAllowlist() {
42
+ const cwd = this.runtime.cwd;
43
+ if (this.toolAllowlistCache?.cwd !== cwd) {
44
+ this.toolAllowlistCache = { cwd, evaluator: (0, tool_allowlist_1.resolveProjectToolAllowlist)(cwd).evaluator };
45
+ }
46
+ return this.toolAllowlistCache.evaluator;
47
+ }
980
48
  constructor(runtime, events, controllerOptions = {}) {
981
49
  this.runtime = runtime;
982
50
  this.events = events;
@@ -1002,7 +70,7 @@ class AgentChatController {
1002
70
  });
1003
71
  const parsed = (0, parser_1.parseInput)(text);
1004
72
  if (!parsed.isCommand) {
1005
- const localFastPath = parseLocalFastPath(text);
73
+ const localFastPath = (0, chat_presentation_1.parseLocalFastPath)(text);
1006
74
  if (localFastPath) {
1007
75
  await this.runLocalFastPath(text, localFastPath, options);
1008
76
  return;
@@ -1065,7 +133,7 @@ class AgentChatController {
1065
133
  let result;
1066
134
  let output;
1067
135
  try {
1068
- ({ result, output } = await captureConsoleOutput(() => command.execute(ctx, parsed.args)));
136
+ ({ result, output } = await (0, chat_presentation_1.captureConsoleOutput)(() => command.execute(ctx, parsed.args)));
1069
137
  }
1070
138
  finally {
1071
139
  unsubscribeCommandUsage?.();
@@ -1075,7 +143,7 @@ class AgentChatController {
1075
143
  }
1076
144
  const providerRequests = Math.max(commandProviderAttempts, commandUsageEvents);
1077
145
  if (providerRequests > 0) {
1078
- const diagnostics = getLastRequestDiagnostics(this.runtime.llm);
146
+ const diagnostics = (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm);
1079
147
  const retryCount = diagnostics?.retryCount ?? 0;
1080
148
  const fallbackCount = diagnostics?.fallbackTriggered ? 1 : 0;
1081
149
  this.setLoopStats({
@@ -1130,6 +198,10 @@ class AgentChatController {
1130
198
  this.events.showSessionPicker(result.sessionPicker);
1131
199
  return;
1132
200
  }
201
+ if (result.modelPicker) {
202
+ this.events.showModelPicker?.(result.modelPicker);
203
+ return;
204
+ }
1133
205
  if (result.editPreview) {
1134
206
  this.events.showEditPreview(result.editPreview);
1135
207
  return;
@@ -1150,7 +222,7 @@ class AgentChatController {
1150
222
  await run();
1151
223
  return;
1152
224
  }
1153
- await goalTraceContext.run({
225
+ await chat_trace_1.goalTraceContext.run({
1154
226
  goalId: request.goal.goalId,
1155
227
  goalRevision: request.goal.revision,
1156
228
  goalInputKind: request.inputKind,
@@ -1162,30 +234,35 @@ class AgentChatController {
1162
234
  this.runtime.ensureSession() ??
1163
235
  (0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
1164
236
  const sessionId = activeSession?.id;
1165
- const turnId = traceTurnId(options.turnId);
237
+ const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
238
+ (0, observability_1.setDiagnosticTraceContext)({
239
+ traceId: `${sessionId ?? 'local'}:${turnId}`,
240
+ ...(sessionId ? { sessionId } : {}),
241
+ turnId,
242
+ });
1166
243
  const localCallId = `local-${turnId}`;
1167
244
  const start = Date.now();
1168
245
  const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
1169
- const traceArgs = buildTraceArgsDetails(this.runtime.cwd, action.tool, action.args);
246
+ const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, action.tool, action.args);
1170
247
  if (sessionId) {
1171
248
  (0, session_storage_1.appendSessionMessage)(sessionId, {
1172
249
  role: 'user',
1173
250
  content: input,
1174
251
  timestamp: Date.now(),
1175
252
  });
1176
- recordTraceEvent(this.events, sessionId, {
253
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1177
254
  turnId,
1178
255
  type: 'turn_start',
1179
- inputBytes: byteLength(input),
256
+ inputBytes: (0, chat_trace_1.byteLength)(input),
1180
257
  localFastPathUsed: true,
1181
258
  });
1182
- appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
1183
- recordTraceEvent(this.events, sessionId, {
259
+ (0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
260
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1184
261
  turnId,
1185
262
  type: 'local_fast_path',
1186
263
  name: action.tool,
1187
264
  ...traceArgs,
1188
- note: compactMiddle(action.label, 160),
265
+ note: (0, chat_trace_1.compactMiddle)(action.label, 160),
1189
266
  });
1190
267
  }
1191
268
  if (options.persistAsUserMessage !== false) {
@@ -1206,13 +283,13 @@ class AgentChatController {
1206
283
  const permission = tool?.checkPermissions?.(action.args, toolContext);
1207
284
  if (permission?.behavior === 'deny' || tool?.isDestructive?.(action.args) === true) {
1208
285
  const reason = permission?.reason || 'Local fast path blocked a destructive tool request.';
1209
- throw new LocalFastPathBlockedError(reason);
286
+ throw new chat_presentation_1.LocalFastPathBlockedError(reason);
1210
287
  }
1211
288
  if (permission?.behavior === 'ask') {
1212
- throw new LocalFastPathBlockedError(permission.reason || 'Local fast path requires an allow-safe command.');
289
+ throw new chat_presentation_1.LocalFastPathBlockedError(permission.reason || 'Local fast path requires an allow-safe command.');
1213
290
  }
1214
291
  if (sessionId) {
1215
- recordTraceEvent(this.events, sessionId, {
292
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1216
293
  turnId,
1217
294
  type: 'tool_call',
1218
295
  name: action.tool,
@@ -1230,7 +307,7 @@ class AgentChatController {
1230
307
  const outputBytes = typeof envelope.outputBytes === 'number'
1231
308
  ? envelope.outputBytes
1232
309
  : Buffer.byteLength(result, 'utf8');
1233
- const formattedLocalResult = formatLocalFastPathAssistantContent(action, result, this.runtime.cwd);
310
+ const formattedLocalResult = (0, chat_presentation_1.formatLocalFastPathAssistantContent)(action, result, this.runtime.cwd);
1234
311
  const assistantContent = formattedLocalResult.content;
1235
312
  const stats = (0, framework_1.createLocalFastPathLoopStats)({
1236
313
  finishReason: envelope.success ? 'completed' : 'failed',
@@ -1258,8 +335,8 @@ class AgentChatController {
1258
335
  this.events.append({
1259
336
  role: envelope.success ? 'tool' : 'error',
1260
337
  title: 'local',
1261
- content: toolFinishContent(localToolResultEvent),
1262
- toolActivity: structuredToolFinishActivity(localToolResultEvent, 1, {
338
+ content: (0, chat_presentation_1.toolFinishContent)(localToolResultEvent),
339
+ toolActivity: (0, chat_presentation_1.structuredToolFinishActivity)(localToolResultEvent, 1, {
1263
340
  projectPath: this.runtime.cwd,
1264
341
  turnId,
1265
342
  }),
@@ -1267,7 +344,7 @@ class AgentChatController {
1267
344
  this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
1268
345
  this.setLoopStats(stats);
1269
346
  if (sessionId) {
1270
- recordTraceEvent(this.events, sessionId, {
347
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1271
348
  turnId,
1272
349
  type: 'tool_result',
1273
350
  name: action.tool,
@@ -1280,10 +357,10 @@ class AgentChatController {
1280
357
  outputBytes,
1281
358
  modelVisibleBytes: 0,
1282
359
  artifactId: formattedLocalResult.artifactRef?.id,
1283
- error: envelope.error ? compactMiddle(envelope.error, 240) : undefined,
360
+ error: envelope.error ? (0, chat_trace_1.compactMiddle)(envelope.error, 240) : undefined,
1284
361
  });
1285
- appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
1286
- recordTraceEvent(this.events, sessionId, {
362
+ (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
363
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1287
364
  turnId,
1288
365
  type: 'complete',
1289
366
  finishReason: stats.finishReason,
@@ -1311,21 +388,21 @@ class AgentChatController {
1311
388
  this.events.setStatus('Local command failed. Ready for the next input.');
1312
389
  const assistantContent = `Local fast path failed for ${action.label}.\n\n${message}`;
1313
390
  this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
1314
- const finishReason = error instanceof LocalFastPathBlockedError ? 'blocked' : 'failed';
391
+ const finishReason = error instanceof chat_presentation_1.LocalFastPathBlockedError ? 'blocked' : 'failed';
1315
392
  const stats = (0, framework_1.createLocalFastPathLoopStats)({
1316
393
  finishReason,
1317
394
  toolCalls: 0,
1318
395
  });
1319
396
  this.setLoopStats(stats);
1320
397
  if (sessionId) {
1321
- recordTraceEvent(this.events, sessionId, {
398
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1322
399
  turnId,
1323
400
  type: 'error',
1324
401
  name: action.tool,
1325
- error: compactTraceError(error),
402
+ error: (0, chat_trace_1.compactTraceError)(error),
1326
403
  });
1327
- appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
1328
- recordTraceEvent(this.events, sessionId, {
404
+ (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
405
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1329
406
  turnId,
1330
407
  type: 'complete',
1331
408
  finishReason: stats.finishReason,
@@ -1356,7 +433,7 @@ class AgentChatController {
1356
433
  setSession: session => {
1357
434
  this.runtime.setSession(session);
1358
435
  const renderer = this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer ?? 'terminal';
1359
- this.events.replaceTranscript(sessionMessagesToTranscriptEntries(session.id, {
436
+ this.events.replaceTranscript((0, chat_presentation_1.sessionMessagesToTranscriptEntries)(session.id, {
1360
437
  includeToolOutputViews: renderer === 'tui',
1361
438
  }));
1362
439
  },
@@ -1411,7 +488,7 @@ class AgentChatController {
1411
488
  if (sessionId) {
1412
489
  const traceType = stateToTraceType[event.state];
1413
490
  if (traceType) {
1414
- recordTraceEvent(this.events, sessionId, {
491
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1415
492
  turnId: String(turnId),
1416
493
  type: traceType,
1417
494
  name: `${event.role}:${event.taskId}`,
@@ -1489,11 +566,16 @@ class AgentChatController {
1489
566
  // any provider request so failures without usage cannot inherit stale data.
1490
567
  this.runtime.store.setState({ tokenUsage: null });
1491
568
  const abortSignal = options.abortSignal;
1492
- const turnId = traceTurnId(options.turnId);
569
+ const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
1493
570
  const activeSession = this.runtime.getSession() ??
1494
571
  this.runtime.ensureSession() ??
1495
572
  (0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
1496
573
  const sessionId = activeSession?.id;
574
+ (0, observability_1.setDiagnosticTraceContext)({
575
+ traceId: `${sessionId ?? 'unsaved'}:${turnId}`,
576
+ ...(sessionId ? { sessionId } : {}),
577
+ turnId,
578
+ });
1497
579
  const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
1498
580
  const runtimeTools = (0, tools_1.getRuntimeTools)();
1499
581
  const skillResolution = (0, skills_1.resolveSkillsForTurn)({
@@ -1511,13 +593,13 @@ class AgentChatController {
1511
593
  timestamp: Date.now(),
1512
594
  appliedSkills: appliedSkillNames.length > 0 ? appliedSkillNames : undefined,
1513
595
  });
1514
- recordTraceEvent(this.events, sessionId, {
596
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1515
597
  turnId,
1516
598
  type: 'turn_start',
1517
- inputBytes: byteLength(input),
599
+ inputBytes: (0, chat_trace_1.byteLength)(input),
1518
600
  note: appliedSkillNames.length > 0 ? `skills=${appliedSkillNames.join(',')}` : undefined,
1519
601
  });
1520
- appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
602
+ (0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
1521
603
  }
1522
604
  if (options.persistAsUserMessage !== false) {
1523
605
  this.runtime.store.addMessage({ role: 'user', content: input });
@@ -1564,8 +646,8 @@ class AgentChatController {
1564
646
  onSubtaskEvent: event => {
1565
647
  this.handleSubtaskEvent(event, sessionId, turnId);
1566
648
  },
1567
- onSubtaskResult: (result, _batchId) => {
1568
- if (!projectPath || result.status !== 'completed')
649
+ onSubtaskResult: (result, _batchId, objective, researchContext) => {
650
+ if (!projectPath)
1569
651
  return;
1570
652
  const json = JSON.stringify(result);
1571
653
  const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, `subtask_${result.role}`, json, Buffer.byteLength(json, 'utf8'));
@@ -1574,7 +656,7 @@ class AgentChatController {
1574
656
  // The subtask state transition (subtask_completed) is already
1575
657
  // emitted by handleSubtaskEvent above.
1576
658
  if (sessionId) {
1577
- recordTraceEvent(this.events, sessionId, {
659
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1578
660
  turnId: String(turnId),
1579
661
  type: 'subtask_artifact_stored',
1580
662
  name: `${result.role}:${result.id}`,
@@ -1584,6 +666,74 @@ class AgentChatController {
1584
666
  });
1585
667
  }
1586
668
  }
669
+ // v0.1.4 Research-to-Evidence integration: normalize every
670
+ // terminal research result (including partial/failure states),
671
+ // persist it under a packet-specific CAS scope, and forward the
672
+ // canonical lifecycle stream to every renderer.
673
+ if (result.role !== 'research' || !sessionId)
674
+ return;
675
+ try {
676
+ const goal = this.goalCoordinator?.goal;
677
+ const objectiveRevision = goal?.contract?.objectiveRevision;
678
+ const hasGoalBinding = typeof goal?.goalId === 'string' && typeof objectiveRevision === 'number';
679
+ // Preserve the authoritative request produced from the
680
+ // original subtask capability. Reconstruct local-only only for
681
+ // legacy callers that predate the additive callback context.
682
+ const baseRequest = researchContext?.request ??
683
+ (0, subagents_1.createLocalResearchRequest)(objective?.trim() || result.summary || 'repository research', projectPath);
684
+ const request = {
685
+ ...baseRequest,
686
+ scope: { ...baseRequest.scope, projectRoot: projectPath },
687
+ ...(hasGoalBinding
688
+ ? {
689
+ goalBinding: {
690
+ goalId: goal.goalId,
691
+ objectiveRevision,
692
+ },
693
+ }
694
+ : {}),
695
+ };
696
+ const packet = (0, subagents_1.subtaskResultToPacket)(result, request, {
697
+ projectPath,
698
+ sessionId,
699
+ ...(hasGoalBinding ? { goalId: goal.goalId, objectiveRevision } : {}),
700
+ }, {
701
+ externalSources: researchContext?.web?.sources,
702
+ externalNotes: researchContext?.web?.notes,
703
+ externalTimedOut: researchContext?.web?.timedOut,
704
+ externalAborted: researchContext?.web?.aborted,
705
+ });
706
+ // Citation resolution can downgrade claims and mark superseded
707
+ // same-URL sources stale. Resolve before validation/persistence so
708
+ // the CAS token, durable packet and renderer view describe the
709
+ // exact same final state (#105).
710
+ const resolution = (0, subagents_1.resolveCitations)(packet);
711
+ const validation = (0, subagents_1.validatePacket)(packet);
712
+ if (!validation.ok)
713
+ return;
714
+ const saved = (0, subagents_1.saveResearchPacket)((0, subagents_1.createFileArtifactStore)(projectPath), packet, {
715
+ projectPath,
716
+ sessionId,
717
+ packetId: packet.packetId,
718
+ ...(packet.goalId ? { goalId: packet.goalId } : {}),
719
+ });
720
+ const view = (0, subagents_1.buildResearchView)(packet, resolution);
721
+ for (const event of (0, subagents_1.toLifecycleEvents)(view, resolution)) {
722
+ this.events.researchEvent?.(event);
723
+ }
724
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
725
+ turnId: String(turnId),
726
+ type: 'subtask_artifact_stored',
727
+ name: `research:${packet.packetId}`,
728
+ argsSummary: `${view.stage}/${view.auditStatus}: ${packet.summary}`.slice(0, 200),
729
+ argsArtifactId: `research-${saved.casToken.slice(0, 16)}`,
730
+ argsBytes: Buffer.byteLength(JSON.stringify(packet), 'utf8'),
731
+ });
732
+ }
733
+ catch {
734
+ // Research persistence/rendering is observational. A storage
735
+ // failure must not alter the child result or root turn state.
736
+ }
1587
737
  },
1588
738
  // R6: wire live permission state so the subagent policy gate can
1589
739
  // prevent background delegation while the user is deciding a tool
@@ -1628,8 +778,8 @@ class AgentChatController {
1628
778
  let pendingCompact;
1629
779
  const verificationResults = [];
1630
780
  const sessionMessagesToRecord = [];
1631
- const assistantStream = createAssistantStreamPresenter(this.events, abortSignal);
1632
- const toolEvents = createToolEventPresenter(this.events, {
781
+ const assistantStream = (0, chat_presentation_1.createAssistantStreamPresenter)(this.events, abortSignal);
782
+ const toolEvents = (0, chat_presentation_1.createToolEventPresenter)(this.events, {
1633
783
  projectPath: this.runtime.cwd,
1634
784
  turnId,
1635
785
  });
@@ -1669,6 +819,10 @@ class AgentChatController {
1669
819
  },
1670
820
  sessionId,
1671
821
  turnId,
822
+ // Tools that fan out to other tools (batch_read) have to re-run the
823
+ // permission gate per sub-step; they need the mode and the allowlist.
824
+ permissionMode: snapshot.permissionMode,
825
+ toolAllowlist: this.resolveToolAllowlist(),
1672
826
  });
1673
827
  };
1674
828
  const loopBudget = (0, loop_budget_1.resolveRuntimeLoopBudget)(input, this.runtime.config, harness.toJSON());
@@ -1709,6 +863,7 @@ class AgentChatController {
1709
863
  costTracker: snapshot.costTracker,
1710
864
  permissionMode: snapshot.permissionMode,
1711
865
  toolConfirmation: this.runtime.config.toolConfirmation,
866
+ toolAllowlist: this.resolveToolAllowlist(),
1712
867
  confirmToolUse: this.controllerOptions.confirmToolUse,
1713
868
  toolContext: {
1714
869
  cwd: this.runtime.cwd,
@@ -1735,7 +890,7 @@ class AgentChatController {
1735
890
  assistantStream.discardSegment();
1736
891
  this.events.setStatus((0, agent_status_1.agentStepStatus)(event.turn));
1737
892
  if (sessionId) {
1738
- recordTraceEvent(this.events, sessionId, {
893
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1739
894
  turnId,
1740
895
  type: 'request_start',
1741
896
  model: event.model,
@@ -1745,7 +900,7 @@ class AgentChatController {
1745
900
  break;
1746
901
  case 'prompt_assembly':
1747
902
  if (sessionId) {
1748
- recordTraceEvent(this.events, sessionId, {
903
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1749
904
  turnId,
1750
905
  type: 'prompt_assembly',
1751
906
  promptModelId: event.modelId,
@@ -1769,7 +924,7 @@ class AgentChatController {
1769
924
  {
1770
925
  const batchReadOnlyCount = event.toolCalls.filter(tc => {
1771
926
  const def = skillResolution.tools.find(t => t.name === tc.function.name);
1772
- const args = parseToolCallArgsForRuntime(tc);
927
+ const args = (0, chat_checkpoint_1.parseToolCallArgsForRuntime)(tc);
1773
928
  return args && def?.isReadOnly?.(args) === true;
1774
929
  }).length;
1775
930
  const suggestion = (0, agent_status_1.batchingSuggestion)(batchReadOnlyCount);
@@ -1777,8 +932,8 @@ class AgentChatController {
1777
932
  this.events.append({ role: 'status', content: suggestion });
1778
933
  }
1779
934
  }
1780
- const checkpointId = checkpointSequence === 0 ? turnId : `${turnId}-checkpoint-${checkpointSequence + 1}`;
1781
- const checkpointResult = createPreToolCheckpoint(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
935
+ const checkpointId = `${turnId}-${checkpointSequence + 1}-${(0, crypto_1.randomUUID)()}`;
936
+ const checkpointResult = (0, chat_checkpoint_1.createPreToolCheckpoint)(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
1782
937
  if (checkpointResult.created) {
1783
938
  checkpointIds.push(checkpointId);
1784
939
  checkpointSequence++;
@@ -1800,11 +955,11 @@ class AgentChatController {
1800
955
  });
1801
956
  }
1802
957
  if (sessionId) {
1803
- recordTraceEvent(this.events, sessionId, {
958
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1804
959
  turnId,
1805
960
  type: 'assistant_tool_calls',
1806
961
  toolCallCount: event.toolCalls.length,
1807
- contentBytes: byteLength(event.content || ''),
962
+ contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1808
963
  });
1809
964
  }
1810
965
  sessionMessagesToRecord.push({
@@ -1828,8 +983,8 @@ class AgentChatController {
1828
983
  assistantStream.closeSegment();
1829
984
  toolEvents.start(event);
1830
985
  if (sessionId) {
1831
- const traceArgs = buildTraceArgsDetails(this.runtime.cwd, event.name, event.args);
1832
- recordTraceEvent(this.events, sessionId, {
986
+ const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, event.name, event.args);
987
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1833
988
  turnId,
1834
989
  type: 'tool_call',
1835
990
  name: event.name,
@@ -1842,17 +997,17 @@ class AgentChatController {
1842
997
  break;
1843
998
  case 'permission_decision':
1844
999
  if (sessionId) {
1845
- recordTraceEvent(this.events, sessionId, {
1000
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1846
1001
  turnId,
1847
1002
  type: 'permission_decision',
1848
1003
  name: event.name,
1849
1004
  callId: event.callId,
1850
- argsSummary: compactToolArgs(event.args),
1005
+ argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
1851
1006
  permissionBehavior: event.decision.behavior,
1852
1007
  permissionApproved: event.decision.approved,
1853
1008
  permissionSource: event.decision.source,
1854
1009
  permissionReason: event.decision.reason
1855
- ? compactMiddle(event.decision.reason, 240)
1010
+ ? (0, chat_trace_1.compactMiddle)(event.decision.reason, 240)
1856
1011
  : undefined,
1857
1012
  permissionDuration: event.decision.duration,
1858
1013
  batchCount: event.batchCount,
@@ -1861,22 +1016,22 @@ class AgentChatController {
1861
1016
  }
1862
1017
  break;
1863
1018
  case 'tool_result': {
1864
- observedToolResultBytes += event.outputBytes ?? byteLength(event.result);
1865
- observedModelVisibleToolBytes += byteLength(event.modelVisibleResult);
1019
+ observedToolResultBytes += event.outputBytes ?? (0, chat_trace_1.byteLength)(event.result);
1020
+ observedModelVisibleToolBytes += (0, chat_trace_1.byteLength)(event.modelVisibleResult);
1866
1021
  toolEvents.finish(event);
1867
1022
  if (sessionId) {
1868
- recordTraceEvent(this.events, sessionId, {
1023
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1869
1024
  turnId,
1870
1025
  type: 'tool_result',
1871
1026
  name: event.name,
1872
1027
  callId: event.callId,
1873
- argsSummary: compactToolArgs(event.args),
1028
+ argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
1874
1029
  success: event.success,
1875
1030
  duration: event.duration,
1876
1031
  outputBytes: event.outputBytes,
1877
- modelVisibleBytes: byteLength(event.modelVisibleResult),
1032
+ modelVisibleBytes: (0, chat_trace_1.byteLength)(event.modelVisibleResult),
1878
1033
  artifactId: event.artifactRef?.id,
1879
- error: event.error ? compactMiddle(event.error, 240) : undefined,
1034
+ error: event.error ? (0, chat_trace_1.compactMiddle)(event.error, 240) : undefined,
1880
1035
  batchCount: event.batchCount,
1881
1036
  batchIndex: event.batchIndex,
1882
1037
  });
@@ -1890,7 +1045,7 @@ class AgentChatController {
1890
1045
  });
1891
1046
  if (verificationResult) {
1892
1047
  verificationResults.push(verificationResult);
1893
- appendVerificationResultTrace(this.events, sessionId, turnId, verificationResult);
1048
+ (0, chat_workspace_1.appendVerificationResultTrace)(this.events, sessionId, turnId, verificationResult);
1894
1049
  }
1895
1050
  sessionMessagesToRecord.push({
1896
1051
  role: 'tool',
@@ -1904,10 +1059,10 @@ class AgentChatController {
1904
1059
  case 'strategy_exhausted':
1905
1060
  this.events.append({ role: 'status', content: event.suggestion });
1906
1061
  if (sessionId) {
1907
- recordTraceEvent(this.events, sessionId, {
1062
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1908
1063
  turnId,
1909
1064
  type: 'strategy_exhausted',
1910
- note: compactMiddle(event.suggestion, 240),
1065
+ note: (0, chat_trace_1.compactMiddle)(event.suggestion, 240),
1911
1066
  });
1912
1067
  }
1913
1068
  break;
@@ -1923,10 +1078,10 @@ class AgentChatController {
1923
1078
  finalContent = event.content;
1924
1079
  assistantStream.ensureMessage(event.content);
1925
1080
  if (sessionId) {
1926
- recordTraceEvent(this.events, sessionId, {
1081
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1927
1082
  turnId,
1928
1083
  type: 'message',
1929
- contentBytes: byteLength(event.content),
1084
+ contentBytes: (0, chat_trace_1.byteLength)(event.content),
1930
1085
  });
1931
1086
  }
1932
1087
  if (event.content) {
@@ -1960,12 +1115,12 @@ class AgentChatController {
1960
1115
  pendingCompact = event.compact;
1961
1116
  if (event.stats) {
1962
1117
  pendingCompleteStats = event.stats;
1963
- recordProviderTraceEvents(this.events, sessionId, turnId, event.stats);
1118
+ (0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, event.stats);
1964
1119
  pendingCompleteTrace = {
1965
1120
  turnId,
1966
1121
  type: 'complete',
1967
1122
  model: event.model,
1968
- contentBytes: byteLength(event.content || ''),
1123
+ contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1969
1124
  finishReason: event.stats.finishReason,
1970
1125
  llmRequests: event.stats.llmRequests,
1971
1126
  toolCalls: event.stats.toolCalls,
@@ -1989,7 +1144,7 @@ class AgentChatController {
1989
1144
  turnId,
1990
1145
  type: 'complete',
1991
1146
  model: event.model,
1992
- contentBytes: byteLength(event.content || ''),
1147
+ contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1993
1148
  };
1994
1149
  }
1995
1150
  break;
@@ -2000,7 +1155,7 @@ class AgentChatController {
2000
1155
  const stats = pendingCompleteStats ??
2001
1156
  (0, framework_1.createFailedLoopStats)({
2002
1157
  loopBudget,
2003
- diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
1158
+ diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
2004
1159
  turnsStarted: observedTurnsStarted,
2005
1160
  llmRequests: observedLlmRequests,
2006
1161
  toolCalls: observedToolCalls,
@@ -2012,16 +1167,16 @@ class AgentChatController {
2012
1167
  persistInterruptedAccounting(finalUsage, stats, finalUsage !== undefined || stats.llmRequests === 0);
2013
1168
  assistantStream.discardSegment();
2014
1169
  this.events.setStatus('Interrupted.');
2015
- removeTrailingUserMessage(this.runtime);
1170
+ (0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
2016
1171
  if (sessionId) {
2017
- const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2018
- recordTraceEvent(this.events, sessionId, {
1172
+ const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1173
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2019
1174
  turnId,
2020
1175
  type: 'aborted',
2021
1176
  note: 'aborted_after_query',
2022
1177
  });
2023
- const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
2024
- ? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
1178
+ const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1179
+ ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
2025
1180
  : undefined;
2026
1181
  if (recoveryNotice) {
2027
1182
  this.events.append({
@@ -2042,15 +1197,15 @@ class AgentChatController {
2042
1197
  }
2043
1198
  assistantStream.closeSegment();
2044
1199
  if (sessionId) {
2045
- const { profile, summary } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1200
+ const { profile, summary } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2046
1201
  if (profile.changedFiles.length > 0 && profile.required) {
2047
1202
  this.events.setStatus((0, agent_status_1.verifyingStatus)(profile.profile));
2048
1203
  this.controllerOptions.onVerificationStateChange?.('running');
2049
1204
  }
2050
- if (shouldRecordVerificationLoopStats(profile, summary)) {
1205
+ if ((0, chat_workspace_1.shouldRecordVerificationLoopStats)(profile, summary)) {
2051
1206
  const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
2052
1207
  if (stats) {
2053
- pendingCompleteStats = withVerificationLoopStats(stats, summary);
1208
+ pendingCompleteStats = (0, chat_workspace_1.withVerificationLoopStats)(stats, summary);
2054
1209
  }
2055
1210
  }
2056
1211
  if ((0, verification_profile_1.shouldGateCompletion)(summary)) {
@@ -2064,16 +1219,16 @@ class AgentChatController {
2064
1219
  content: notice,
2065
1220
  });
2066
1221
  finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
2067
- appendAssistantNotice(sessionMessagesToRecord, notice);
1222
+ (0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
2068
1223
  if (pendingCompleteTrace) {
2069
1224
  pendingCompleteTrace.finishReason = 'completion_gate';
2070
- pendingCompleteTrace.contentBytes = byteLength(finalContent);
1225
+ pendingCompleteTrace.contentBytes = (0, chat_trace_1.byteLength)(finalContent);
2071
1226
  pendingCompleteTrace.note = 'verification_incomplete';
2072
1227
  }
2073
1228
  const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
2074
1229
  if (stats) {
2075
1230
  pendingCompleteStats = {
2076
- ...withVerificationLoopStats(stats, summary),
1231
+ ...(0, chat_workspace_1.withVerificationLoopStats)(stats, summary),
2077
1232
  finishReason: 'completion_gate',
2078
1233
  };
2079
1234
  }
@@ -2112,7 +1267,7 @@ class AgentChatController {
2112
1267
  content: notice,
2113
1268
  });
2114
1269
  finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
2115
- appendAssistantNotice(sessionMessagesToRecord, notice);
1270
+ (0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
2116
1271
  }
2117
1272
  if (pendingCompleteStats) {
2118
1273
  this.setLoopStats(this.foldSubagentUsage(pendingCompleteStats, subagentBundle));
@@ -2149,7 +1304,7 @@ class AgentChatController {
2149
1304
  }
2150
1305
  this.runtime.store.setContextUsage(pendingCompact.after);
2151
1306
  if (sessionId) {
2152
- recordTraceEvent(this.events, sessionId, {
1307
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2153
1308
  turnId,
2154
1309
  type: 'compact_completed',
2155
1310
  checkpointId: committedCheckpointId,
@@ -2166,11 +1321,11 @@ class AgentChatController {
2166
1321
  }
2167
1322
  catch (error) {
2168
1323
  if (sessionId) {
2169
- recordTraceEvent(this.events, sessionId, {
1324
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2170
1325
  turnId,
2171
1326
  type: 'compact_failed',
2172
1327
  model: finalModel || this.runtime.llm.getModel(),
2173
- error: compactTraceError(error),
1328
+ error: (0, chat_trace_1.compactTraceError)(error),
2174
1329
  note: pendingCompact.mode,
2175
1330
  });
2176
1331
  }
@@ -2201,10 +1356,10 @@ class AgentChatController {
2201
1356
  });
2202
1357
  const harnessState = harness.toJSON();
2203
1358
  this.runtime.store.setState({ harnessState });
2204
- emitHarnessDiagnostics(this.events, harnessState);
1359
+ (0, chat_trace_1.emitHarnessDiagnostics)(this.events, harnessState);
2205
1360
  if (sessionId) {
2206
1361
  if (pendingCompleteTrace) {
2207
- recordTraceEvent(this.events, sessionId, pendingCompleteTrace);
1362
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, pendingCompleteTrace);
2208
1363
  }
2209
1364
  (0, session_storage_1.updateSessionSkills)(sessionId, appliedSkillNames);
2210
1365
  (0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
@@ -2217,7 +1372,7 @@ class AgentChatController {
2217
1372
  }
2218
1373
  catch (error) {
2219
1374
  // v0.2.25: Provider retry exhausted is a recoverable turn failure.
2220
- if (error instanceof Error && error.name === 'ProviderRetryExhaustedError') {
1375
+ if (error instanceof provider_resilience_1.ProviderRetryExhaustedError) {
2221
1376
  const diag = error.diagnostics;
2222
1377
  const attempts = diag?.attempts?.length ?? '?';
2223
1378
  const kind = diag?.attempts?.[diag.attempts.length - 1]?.failureKind ?? 'unknown';
@@ -2241,12 +1396,12 @@ class AgentChatController {
2241
1396
  }
2242
1397
  return;
2243
1398
  }
2244
- if (isAbortError(error, abortSignal)) {
1399
+ if ((0, chat_trace_1.isAbortError)(error, abortSignal)) {
2245
1400
  const interruptedStats = error instanceof framework_1.QueryLoopError
2246
1401
  ? error.stats
2247
1402
  : (0, framework_1.createFailedLoopStats)({
2248
1403
  loopBudget,
2249
- diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
1404
+ diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
2250
1405
  turnsStarted: observedTurnsStarted,
2251
1406
  llmRequests: observedLlmRequests,
2252
1407
  toolCalls: observedToolCalls,
@@ -2262,16 +1417,16 @@ class AgentChatController {
2262
1417
  persistInterruptedAccounting(interruptedRootUsage, interruptedStats, interruptedStats.llmRequests === 0);
2263
1418
  assistantStream.discardSegment();
2264
1419
  this.events.setStatus('Interrupted.');
2265
- removeTrailingUserMessage(this.runtime);
1420
+ (0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
2266
1421
  if (sessionId) {
2267
- const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2268
- recordTraceEvent(this.events, sessionId, {
1422
+ const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1423
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2269
1424
  turnId,
2270
1425
  type: 'aborted',
2271
1426
  note: 'abort_error',
2272
1427
  });
2273
- const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
2274
- ? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
1428
+ const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1429
+ ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
2275
1430
  : undefined;
2276
1431
  if (recoveryNotice) {
2277
1432
  this.events.append({
@@ -2288,15 +1443,15 @@ class AgentChatController {
2288
1443
  assistantStream.discardSegment();
2289
1444
  this.events.append({
2290
1445
  role: 'error',
2291
- content: formatChatError(error),
2292
- errorLayer: errorLayerForChatError(error),
1446
+ content: (0, chat_trace_1.formatChatError)(error),
1447
+ errorLayer: (0, chat_trace_1.errorLayerForChatError)(error),
2293
1448
  });
2294
1449
  this.events.setStatus('Turn failed. Ready for the next input.');
2295
1450
  const failedStats = this.foldSubagentUsage(error instanceof framework_1.QueryLoopError
2296
1451
  ? error.stats
2297
1452
  : (0, framework_1.createFailedLoopStats)({
2298
1453
  loopBudget,
2299
- diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
1454
+ diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
2300
1455
  turnsStarted: observedTurnsStarted,
2301
1456
  llmRequests: observedLlmRequests,
2302
1457
  toolCalls: observedToolCalls,
@@ -2316,10 +1471,10 @@ class AgentChatController {
2316
1471
  }
2317
1472
  this.setLoopStats(failedStats);
2318
1473
  if (sessionId) {
2319
- recordProviderTraceEvents(this.events, sessionId, turnId, failedStats);
2320
- const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2321
- const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
2322
- ? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
1474
+ (0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, failedStats);
1475
+ const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1476
+ const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1477
+ ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
2323
1478
  : undefined;
2324
1479
  if (recoveryNotice) {
2325
1480
  this.events.append({
@@ -2329,13 +1484,13 @@ class AgentChatController {
2329
1484
  content: recoveryNotice,
2330
1485
  });
2331
1486
  }
2332
- recordTraceEvent(this.events, sessionId, {
1487
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2333
1488
  turnId,
2334
1489
  type: 'error',
2335
- error: compactTraceError(error),
1490
+ error: (0, chat_trace_1.compactTraceError)(error),
2336
1491
  note: recoveryNotice,
2337
1492
  });
2338
- recordTraceEvent(this.events, sessionId, {
1493
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2339
1494
  turnId,
2340
1495
  type: 'complete',
2341
1496
  model: failedStats.providerFinalModel ?? this.runtime.llm.getModel(),
@@ -2355,6 +1510,12 @@ class AgentChatController {
2355
1510
  localFastPathUsed: failedStats.localFastPathUsed,
2356
1511
  });
2357
1512
  (0, session_storage_1.removeLastIncompleteAssistantMessage)(sessionId);
1513
+ // A failed turn must not leave the user's prompt dangling in the
1514
+ // persisted session (it would replay on resume). The in-memory history
1515
+ // is cleaned above (2969-2972); mirror that for the on-disk transcript.
1516
+ if (options.persistAsUserMessage !== false) {
1517
+ (0, session_storage_1.removeTrailingSessionUserMessage)(sessionId);
1518
+ }
2358
1519
  }
2359
1520
  const history = this.runtime.store.getSnapshot().conversationHistory;
2360
1521
  if (history.length > 0) {