@orion-agents/orion-code 0.1.4 → 0.1.6

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 (540) hide show
  1. package/README.md +73 -38
  2. package/README.zh-CN.md +32 -10
  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 +4 -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 +74 -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 +617 -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 +805 -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 +175 -0
  37. package/dist/commands/diagnostic-commands.js.map +1 -0
  38. package/dist/commands/index.d.ts +9 -10
  39. package/dist/commands/index.d.ts.map +1 -1
  40. package/dist/commands/index.js +42 -3563
  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 +15 -0
  47. package/dist/commands/model-command-handlers.d.ts.map +1 -0
  48. package/dist/commands/model-command-handlers.js +526 -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 +85 -0
  53. package/dist/commands/model-commands.js.map +1 -0
  54. package/dist/commands/parser.d.ts +12 -0
  55. package/dist/commands/parser.d.ts.map +1 -1
  56. package/dist/commands/parser.js +48 -7
  57. package/dist/commands/parser.js.map +1 -1
  58. package/dist/commands/registry.d.ts +4 -0
  59. package/dist/commands/registry.d.ts.map +1 -0
  60. package/dist/commands/registry.js +566 -0
  61. package/dist/commands/registry.js.map +1 -0
  62. package/dist/commands/session-command-handlers.d.ts +10 -0
  63. package/dist/commands/session-command-handlers.d.ts.map +1 -0
  64. package/dist/commands/session-command-handlers.js +626 -0
  65. package/dist/commands/session-command-handlers.js.map +1 -0
  66. package/dist/commands/session-commands.d.ts +4 -0
  67. package/dist/commands/session-commands.d.ts.map +1 -0
  68. package/dist/commands/session-commands.js +102 -0
  69. package/dist/commands/session-commands.js.map +1 -0
  70. package/dist/commands/system-commands.d.ts +4 -0
  71. package/dist/commands/system-commands.d.ts.map +1 -0
  72. package/dist/commands/system-commands.js +80 -0
  73. package/dist/commands/system-commands.js.map +1 -0
  74. package/dist/commands/target-command.d.ts +1 -1
  75. package/dist/commands/target-command.d.ts.map +1 -1
  76. package/dist/commands/target-command.js +42 -6
  77. package/dist/commands/target-command.js.map +1 -1
  78. package/dist/commands/tool-commands.d.ts +4 -0
  79. package/dist/commands/tool-commands.d.ts.map +1 -0
  80. package/dist/commands/tool-commands.js +49 -0
  81. package/dist/commands/tool-commands.js.map +1 -0
  82. package/dist/commands/types.d.ts +69 -5
  83. package/dist/commands/types.d.ts.map +1 -1
  84. package/dist/commands/types.js +3 -4
  85. package/dist/commands/types.js.map +1 -1
  86. package/dist/commands/workflow-command-handlers.d.ts +7 -0
  87. package/dist/commands/workflow-command-handlers.d.ts.map +1 -0
  88. package/dist/commands/workflow-command-handlers.js +32 -0
  89. package/dist/commands/workflow-command-handlers.js.map +1 -0
  90. package/dist/commands/workflow-commands.d.ts +4 -0
  91. package/dist/commands/workflow-commands.d.ts.map +1 -0
  92. package/dist/commands/workflow-commands.js +124 -0
  93. package/dist/commands/workflow-commands.js.map +1 -0
  94. package/dist/core/checkpoint.d.ts +12 -4
  95. package/dist/core/checkpoint.d.ts.map +1 -1
  96. package/dist/core/checkpoint.js +114 -28
  97. package/dist/core/checkpoint.js.map +1 -1
  98. package/dist/core/cost-tracker.d.ts +17 -1
  99. package/dist/core/cost-tracker.d.ts.map +1 -1
  100. package/dist/core/cost-tracker.js +24 -8
  101. package/dist/core/cost-tracker.js.map +1 -1
  102. package/dist/core/warn-dedup.d.ts +3 -0
  103. package/dist/core/warn-dedup.d.ts.map +1 -1
  104. package/dist/core/warn-dedup.js +6 -6
  105. package/dist/core/warn-dedup.js.map +1 -1
  106. package/dist/framework/index.d.ts +1 -1
  107. package/dist/framework/index.d.ts.map +1 -1
  108. package/dist/framework/index.js.map +1 -1
  109. package/dist/framework/prompt.d.ts +2 -2
  110. package/dist/framework/query.d.ts +2 -2
  111. package/dist/framework/query.d.ts.map +1 -1
  112. package/dist/framework/query.js +57 -10
  113. package/dist/framework/query.js.map +1 -1
  114. package/dist/framework/store.d.ts +15 -6
  115. package/dist/framework/store.d.ts.map +1 -1
  116. package/dist/framework/store.js +18 -0
  117. package/dist/framework/store.js.map +1 -1
  118. package/dist/framework/tool-scheduler.d.ts +16 -13
  119. package/dist/framework/tool-scheduler.d.ts.map +1 -1
  120. package/dist/framework/tool-scheduler.js +155 -38
  121. package/dist/framework/tool-scheduler.js.map +1 -1
  122. package/dist/framework/tool.d.ts +39 -2
  123. package/dist/framework/tool.d.ts.map +1 -1
  124. package/dist/framework/tool.js +27 -1
  125. package/dist/framework/tool.js.map +1 -1
  126. package/dist/harness/assembler.d.ts.map +1 -1
  127. package/dist/harness/assembler.js +4 -2
  128. package/dist/harness/assembler.js.map +1 -1
  129. package/dist/harness/drift-guard.d.ts.map +1 -1
  130. package/dist/harness/drift-guard.js +9 -1
  131. package/dist/harness/drift-guard.js.map +1 -1
  132. package/dist/harness/evidence.d.ts.map +1 -1
  133. package/dist/harness/evidence.js +3 -2
  134. package/dist/harness/evidence.js.map +1 -1
  135. package/dist/harness/safety.d.ts +11 -1
  136. package/dist/harness/safety.d.ts.map +1 -1
  137. package/dist/harness/safety.js +112 -16
  138. package/dist/harness/safety.js.map +1 -1
  139. package/dist/index.d.ts +1 -4
  140. package/dist/index.d.ts.map +1 -1
  141. package/dist/index.js.map +1 -1
  142. package/dist/init.d.ts +4 -8
  143. package/dist/init.d.ts.map +1 -1
  144. package/dist/init.js +4 -4
  145. package/dist/init.js.map +1 -1
  146. package/dist/ink-ui/App.d.ts +2 -2
  147. package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
  148. package/dist/ink-ui/components/Markdown.js.map +1 -1
  149. package/dist/ink-ui/components/PixelHorseBanner.d.ts +2 -2
  150. package/dist/ink-ui/components/StatusLine.d.ts +2 -2
  151. package/dist/ink-ui/launch.d.ts +2 -2
  152. package/dist/ink-ui/screens/ReplScreen.d.ts +4 -3
  153. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  154. package/dist/ink-ui/screens/ReplScreen.js +103 -31
  155. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  156. package/dist/memory/relevant-finder.d.ts +2 -1
  157. package/dist/memory/relevant-finder.d.ts.map +1 -1
  158. package/dist/memory/relevant-finder.js +17 -8
  159. package/dist/memory/relevant-finder.js.map +1 -1
  160. package/dist/memory/semantic-config.d.ts +9 -0
  161. package/dist/memory/semantic-config.d.ts.map +1 -0
  162. package/dist/memory/semantic-config.js +16 -0
  163. package/dist/memory/semantic-config.js.map +1 -0
  164. package/dist/memory/semantic-search.d.ts +1 -6
  165. package/dist/memory/semantic-search.d.ts.map +1 -1
  166. package/dist/memory/semantic-search.js +3 -15
  167. package/dist/memory/semantic-search.js.map +1 -1
  168. package/dist/memory/storage.d.ts +23 -0
  169. package/dist/memory/storage.d.ts.map +1 -1
  170. package/dist/memory/storage.js +116 -9
  171. package/dist/memory/storage.js.map +1 -1
  172. package/dist/memory/validation.d.ts +3 -0
  173. package/dist/memory/validation.d.ts.map +1 -1
  174. package/dist/memory/validation.js +123 -10
  175. package/dist/memory/validation.js.map +1 -1
  176. package/dist/memory/vector-store.d.ts +30 -0
  177. package/dist/memory/vector-store.d.ts.map +1 -1
  178. package/dist/memory/vector-store.js +160 -21
  179. package/dist/memory/vector-store.js.map +1 -1
  180. package/dist/migration/command.d.ts.map +1 -1
  181. package/dist/migration/command.js +0 -1
  182. package/dist/migration/command.js.map +1 -1
  183. package/dist/migration/migrate.d.ts.map +1 -1
  184. package/dist/migration/migrate.js +59 -107
  185. package/dist/migration/migrate.js.map +1 -1
  186. package/dist/migration/types.d.ts +0 -1
  187. package/dist/migration/types.d.ts.map +1 -1
  188. package/dist/print-ui/launch.d.ts +13 -3
  189. package/dist/print-ui/launch.d.ts.map +1 -1
  190. package/dist/print-ui/launch.js +28 -3
  191. package/dist/print-ui/launch.js.map +1 -1
  192. package/dist/product/environment.d.ts +3 -5
  193. package/dist/product/environment.d.ts.map +1 -1
  194. package/dist/product/environment.js +4 -32
  195. package/dist/product/environment.js.map +1 -1
  196. package/dist/product/index.d.ts +1 -1
  197. package/dist/product/index.d.ts.map +1 -1
  198. package/dist/product/index.js +1 -3
  199. package/dist/product/index.js.map +1 -1
  200. package/dist/product/paths.d.ts.map +1 -1
  201. package/dist/product/paths.js +16 -11
  202. package/dist/product/paths.js.map +1 -1
  203. package/dist/runtime/agent-runtime-controller.d.ts +4 -2
  204. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  205. package/dist/runtime/agent-runtime-controller.js +129 -15
  206. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  207. package/dist/runtime/agent-runtime-protocol.d.ts +15 -0
  208. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  209. package/dist/runtime/agent-runtime-protocol.js +6 -0
  210. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  211. package/dist/runtime/chat-checkpoint.d.ts +17 -0
  212. package/dist/runtime/chat-checkpoint.d.ts.map +1 -0
  213. package/dist/runtime/chat-checkpoint.js +108 -0
  214. package/dist/runtime/chat-checkpoint.js.map +1 -0
  215. package/dist/runtime/chat-controller.d.ts +10 -51
  216. package/dist/runtime/chat-controller.d.ts.map +1 -1
  217. package/dist/runtime/chat-controller.js +256 -1070
  218. package/dist/runtime/chat-controller.js.map +1 -1
  219. package/dist/runtime/chat-effort.d.ts +5 -0
  220. package/dist/runtime/chat-effort.d.ts.map +1 -0
  221. package/dist/runtime/chat-effort.js +47 -0
  222. package/dist/runtime/chat-effort.js.map +1 -0
  223. package/dist/runtime/chat-presentation.d.ts +60 -0
  224. package/dist/runtime/chat-presentation.d.ts.map +1 -0
  225. package/dist/runtime/chat-presentation.js +537 -0
  226. package/dist/runtime/chat-presentation.js.map +1 -0
  227. package/dist/runtime/chat-trace.d.ts +52 -0
  228. package/dist/runtime/chat-trace.d.ts.map +1 -0
  229. package/dist/runtime/chat-trace.js +234 -0
  230. package/dist/runtime/chat-trace.js.map +1 -0
  231. package/dist/runtime/chat-workspace.d.ts +22 -0
  232. package/dist/runtime/chat-workspace.d.ts.map +1 -0
  233. package/dist/runtime/chat-workspace.js +154 -0
  234. package/dist/runtime/chat-workspace.js.map +1 -0
  235. package/dist/runtime/goals/accounting.js +1 -1
  236. package/dist/runtime/goals/accounting.js.map +1 -1
  237. package/dist/runtime/goals/completion-audit.d.ts.map +1 -1
  238. package/dist/runtime/goals/completion-audit.js +5 -4
  239. package/dist/runtime/goals/completion-audit.js.map +1 -1
  240. package/dist/runtime/goals/coordinator.d.ts +3 -0
  241. package/dist/runtime/goals/coordinator.d.ts.map +1 -1
  242. package/dist/runtime/goals/coordinator.js +56 -2
  243. package/dist/runtime/goals/coordinator.js.map +1 -1
  244. package/dist/runtime/goals/prompt.d.ts +1 -1
  245. package/dist/runtime/goals/prompt.d.ts.map +1 -1
  246. package/dist/runtime/goals/prompt.js +4 -3
  247. package/dist/runtime/goals/prompt.js.map +1 -1
  248. package/dist/runtime/goals/tools.d.ts +32 -8
  249. package/dist/runtime/goals/tools.d.ts.map +1 -1
  250. package/dist/runtime/goals/tools.js +187 -11
  251. package/dist/runtime/goals/tools.js.map +1 -1
  252. package/dist/runtime/goals/types.d.ts +9 -0
  253. package/dist/runtime/goals/types.d.ts.map +1 -1
  254. package/dist/runtime/goals/types.js +1 -0
  255. package/dist/runtime/goals/types.js.map +1 -1
  256. package/dist/runtime/loop-budget.d.ts +2 -2
  257. package/dist/runtime/rich-text/markdown-parser.d.ts +2 -0
  258. package/dist/runtime/rich-text/markdown-parser.d.ts.map +1 -1
  259. package/dist/runtime/rich-text/markdown-parser.js +50 -10
  260. package/dist/runtime/rich-text/markdown-parser.js.map +1 -1
  261. package/dist/runtime/subagents/index.d.ts +2 -2
  262. package/dist/runtime/subagents/index.d.ts.map +1 -1
  263. package/dist/runtime/subagents/index.js +2 -1
  264. package/dist/runtime/subagents/index.js.map +1 -1
  265. package/dist/runtime/subagents/policy.d.ts +1 -1
  266. package/dist/runtime/subagents/policy.d.ts.map +1 -1
  267. package/dist/runtime/subagents/policy.js.map +1 -1
  268. package/dist/runtime/subagents/presets.d.ts +2 -2
  269. package/dist/runtime/subagents/research-artifact.d.ts +7 -0
  270. package/dist/runtime/subagents/research-artifact.d.ts.map +1 -1
  271. package/dist/runtime/subagents/research-artifact.js +73 -27
  272. package/dist/runtime/subagents/research-artifact.js.map +1 -1
  273. package/dist/runtime/subagents/research-contract.d.ts +18 -4
  274. package/dist/runtime/subagents/research-contract.d.ts.map +1 -1
  275. package/dist/runtime/subagents/research-contract.js +122 -17
  276. package/dist/runtime/subagents/research-contract.js.map +1 -1
  277. package/dist/runtime/subagents/research-renderer.d.ts +27 -11
  278. package/dist/runtime/subagents/research-renderer.d.ts.map +1 -1
  279. package/dist/runtime/subagents/research-renderer.js +34 -2
  280. package/dist/runtime/subagents/research-renderer.js.map +1 -1
  281. package/dist/runtime/subagents/result-parser.d.ts +1 -5
  282. package/dist/runtime/subagents/result-parser.d.ts.map +1 -1
  283. package/dist/runtime/subagents/result-parser.js +5 -72
  284. package/dist/runtime/subagents/result-parser.js.map +1 -1
  285. package/dist/runtime/subagents/runtime-integration.d.ts +13 -7
  286. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  287. package/dist/runtime/subagents/runtime-integration.js +112 -2
  288. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  289. package/dist/runtime/subagents/supervisor.d.ts +15 -1
  290. package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
  291. package/dist/runtime/subagents/supervisor.js +58 -3
  292. package/dist/runtime/subagents/supervisor.js.map +1 -1
  293. package/dist/runtime/subagents/tool.d.ts +2 -2
  294. package/dist/runtime/subagents/tool.d.ts.map +1 -1
  295. package/dist/runtime/subagents/tool.js +129 -9
  296. package/dist/runtime/subagents/tool.js.map +1 -1
  297. package/dist/runtime/subagents/types.d.ts +20 -0
  298. package/dist/runtime/subagents/types.d.ts.map +1 -1
  299. package/dist/runtime/subagents/types.js.map +1 -1
  300. package/dist/runtime/subagents/web-research-adapter.d.ts +4 -2
  301. package/dist/runtime/subagents/web-research-adapter.d.ts.map +1 -1
  302. package/dist/runtime/subagents/web-research-adapter.js +81 -15
  303. package/dist/runtime/subagents/web-research-adapter.js.map +1 -1
  304. package/dist/runtime/ui-events.d.ts +36 -8
  305. package/dist/runtime/ui-events.d.ts.map +1 -1
  306. package/dist/runtime/ui-events.js.map +1 -1
  307. package/dist/runtime/ui-view-model.d.ts +53 -4
  308. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  309. package/dist/runtime/ui-view-model.js +190 -10
  310. package/dist/runtime/ui-view-model.js.map +1 -1
  311. package/dist/services/agent-runner.d.ts +5 -2
  312. package/dist/services/agent-runner.d.ts.map +1 -1
  313. package/dist/services/agent-runner.js +18 -18
  314. package/dist/services/agent-runner.js.map +1 -1
  315. package/dist/services/atomic-write.d.ts +9 -1
  316. package/dist/services/atomic-write.d.ts.map +1 -1
  317. package/dist/services/atomic-write.js +55 -2
  318. package/dist/services/atomic-write.js.map +1 -1
  319. package/dist/services/auth/auth.d.ts +11 -7
  320. package/dist/services/auth/auth.d.ts.map +1 -1
  321. package/dist/services/auth/auth.js +117 -31
  322. package/dist/services/auth/auth.js.map +1 -1
  323. package/dist/services/auth/aws.d.ts +2 -0
  324. package/dist/services/auth/aws.d.ts.map +1 -1
  325. package/dist/services/auth/aws.js +126 -12
  326. package/dist/services/auth/aws.js.map +1 -1
  327. package/dist/services/auth/index.d.ts +1 -1
  328. package/dist/services/auth/index.d.ts.map +1 -1
  329. package/dist/services/auth/index.js +2 -1
  330. package/dist/services/auth/index.js.map +1 -1
  331. package/dist/services/auto-fix/autoFixConfig.d.ts +0 -3
  332. package/dist/services/auto-fix/autoFixConfig.d.ts.map +1 -1
  333. package/dist/services/auto-fix/autoFixConfig.js +25 -8
  334. package/dist/services/auto-fix/autoFixConfig.js.map +1 -1
  335. package/dist/services/auto-fix/autoFixHook.d.ts +7 -0
  336. package/dist/services/auto-fix/autoFixHook.d.ts.map +1 -1
  337. package/dist/services/auto-fix/autoFixHook.js +10 -1
  338. package/dist/services/auto-fix/autoFixHook.js.map +1 -1
  339. package/dist/services/compact/auto-compact.d.ts +2 -0
  340. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  341. package/dist/services/compact/auto-compact.js +15 -1
  342. package/dist/services/compact/auto-compact.js.map +1 -1
  343. package/dist/services/compact/compact.d.ts.map +1 -1
  344. package/dist/services/compact/compact.js +9 -11
  345. package/dist/services/compact/compact.js.map +1 -1
  346. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  347. package/dist/services/compact/summary-generator.js +28 -4
  348. package/dist/services/compact/summary-generator.js.map +1 -1
  349. package/dist/services/compact/tool-call-groups.d.ts +19 -0
  350. package/dist/services/compact/tool-call-groups.d.ts.map +1 -0
  351. package/dist/services/compact/tool-call-groups.js +105 -0
  352. package/dist/services/compact/tool-call-groups.js.map +1 -0
  353. package/dist/services/concurrent-sessions.d.ts +4 -0
  354. package/dist/services/concurrent-sessions.d.ts.map +1 -1
  355. package/dist/services/concurrent-sessions.js +59 -12
  356. package/dist/services/concurrent-sessions.js.map +1 -1
  357. package/dist/services/config.d.ts +8 -4
  358. package/dist/services/config.d.ts.map +1 -1
  359. package/dist/services/config.js +15 -71
  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/effort.d.ts +40 -0
  364. package/dist/services/effort.d.ts.map +1 -0
  365. package/dist/services/effort.js +88 -0
  366. package/dist/services/effort.js.map +1 -0
  367. package/dist/services/file-glob.d.ts.map +1 -1
  368. package/dist/services/file-glob.js +22 -2
  369. package/dist/services/file-glob.js.map +1 -1
  370. package/dist/services/file-lock.d.ts +7 -0
  371. package/dist/services/file-lock.d.ts.map +1 -0
  372. package/dist/services/file-lock.js +193 -0
  373. package/dist/services/file-lock.js.map +1 -0
  374. package/dist/services/global-config.d.ts +9 -0
  375. package/dist/services/global-config.d.ts.map +1 -1
  376. package/dist/services/global-config.js +79 -4
  377. package/dist/services/global-config.js.map +1 -1
  378. package/dist/services/goal-storage.d.ts.map +1 -1
  379. package/dist/services/goal-storage.js +35 -11
  380. package/dist/services/goal-storage.js.map +1 -1
  381. package/dist/services/llm.d.ts +35 -17
  382. package/dist/services/llm.d.ts.map +1 -1
  383. package/dist/services/llm.js +249 -113
  384. package/dist/services/llm.js.map +1 -1
  385. package/dist/services/mcp/transports.d.ts +0 -1
  386. package/dist/services/mcp/transports.d.ts.map +1 -1
  387. package/dist/services/mcp/transports.js +12 -13
  388. package/dist/services/mcp/transports.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 +111 -7
  392. package/dist/services/model-context.js.map +1 -1
  393. package/dist/services/model-registry.d.ts +3 -0
  394. package/dist/services/model-registry.d.ts.map +1 -1
  395. package/dist/services/model-registry.js +59 -2
  396. package/dist/services/model-registry.js.map +1 -1
  397. package/dist/services/provider-diagnostics.d.ts +1 -1
  398. package/dist/services/provider-diagnostics.d.ts.map +1 -1
  399. package/dist/services/provider-diagnostics.js +30 -16
  400. package/dist/services/provider-diagnostics.js.map +1 -1
  401. package/dist/services/provider-resilience/coordinator.d.ts +8 -3
  402. package/dist/services/provider-resilience/coordinator.d.ts.map +1 -1
  403. package/dist/services/provider-resilience/coordinator.js +86 -19
  404. package/dist/services/provider-resilience/coordinator.js.map +1 -1
  405. package/dist/services/provider-resilience/error-classifier.d.ts +1 -0
  406. package/dist/services/provider-resilience/error-classifier.d.ts.map +1 -1
  407. package/dist/services/provider-resilience/error-classifier.js +50 -26
  408. package/dist/services/provider-resilience/error-classifier.js.map +1 -1
  409. package/dist/services/provider-resilience/index.d.ts +3 -3
  410. package/dist/services/provider-resilience/index.d.ts.map +1 -1
  411. package/dist/services/provider-resilience/index.js +3 -1
  412. package/dist/services/provider-resilience/index.js.map +1 -1
  413. package/dist/services/provider-resilience/request-gate.d.ts +6 -0
  414. package/dist/services/provider-resilience/request-gate.d.ts.map +1 -1
  415. package/dist/services/provider-resilience/request-gate.js +24 -9
  416. package/dist/services/provider-resilience/request-gate.js.map +1 -1
  417. package/dist/services/provider-resilience/types.d.ts +10 -1
  418. package/dist/services/provider-resilience/types.d.ts.map +1 -1
  419. package/dist/services/provider-resilience/types.js.map +1 -1
  420. package/dist/services/redaction.d.ts.map +1 -1
  421. package/dist/services/redaction.js +29 -1
  422. package/dist/services/redaction.js.map +1 -1
  423. package/dist/services/session-index.d.ts.map +1 -1
  424. package/dist/services/session-index.js +75 -44
  425. package/dist/services/session-index.js.map +1 -1
  426. package/dist/services/session-memory/sessionMemory.d.ts.map +1 -1
  427. package/dist/services/session-memory/sessionMemory.js +6 -3
  428. package/dist/services/session-memory/sessionMemory.js.map +1 -1
  429. package/dist/services/session-storage.d.ts +12 -0
  430. package/dist/services/session-storage.d.ts.map +1 -1
  431. package/dist/services/session-storage.js +301 -230
  432. package/dist/services/session-storage.js.map +1 -1
  433. package/dist/services/storage-maintenance.d.ts.map +1 -1
  434. package/dist/services/storage-maintenance.js +25 -7
  435. package/dist/services/storage-maintenance.js.map +1 -1
  436. package/dist/services/task-manager.d.ts +6 -1
  437. package/dist/services/task-manager.d.ts.map +1 -1
  438. package/dist/services/task-manager.js +18 -4
  439. package/dist/services/task-manager.js.map +1 -1
  440. package/dist/services/tool-allowlist.d.ts +20 -10
  441. package/dist/services/tool-allowlist.d.ts.map +1 -1
  442. package/dist/services/tool-allowlist.js +64 -15
  443. package/dist/services/tool-allowlist.js.map +1 -1
  444. package/dist/services/usage-state.d.ts +10 -0
  445. package/dist/services/usage-state.d.ts.map +1 -1
  446. package/dist/services/usage-state.js +116 -45
  447. package/dist/services/usage-state.js.map +1 -1
  448. package/dist/services/verification-profile.d.ts.map +1 -1
  449. package/dist/services/verification-profile.js +23 -3
  450. package/dist/services/verification-profile.js.map +1 -1
  451. package/dist/services/workspace-diff.d.ts +14 -0
  452. package/dist/services/workspace-diff.d.ts.map +1 -1
  453. package/dist/services/workspace-diff.js +60 -11
  454. package/dist/services/workspace-diff.js.map +1 -1
  455. package/dist/services/yaml-config.d.ts.map +1 -1
  456. package/dist/services/yaml-config.js +2 -1
  457. package/dist/services/yaml-config.js.map +1 -1
  458. package/dist/skills/loader.d.ts.map +1 -1
  459. package/dist/skills/loader.js +23 -9
  460. package/dist/skills/loader.js.map +1 -1
  461. package/dist/skills/runtime.d.ts +3 -3
  462. package/dist/skills/runtime.d.ts.map +1 -1
  463. package/dist/skills/runtime.js +37 -4
  464. package/dist/skills/runtime.js.map +1 -1
  465. package/dist/skills/types.d.ts +1 -1
  466. package/dist/skills/types.d.ts.map +1 -1
  467. package/dist/terminal-ui/launch.d.ts +26 -8
  468. package/dist/terminal-ui/launch.d.ts.map +1 -1
  469. package/dist/terminal-ui/launch.js +82 -39
  470. package/dist/terminal-ui/launch.js.map +1 -1
  471. package/dist/tools/bash_security.d.ts +17 -0
  472. package/dist/tools/bash_security.d.ts.map +1 -1
  473. package/dist/tools/bash_security.js +233 -27
  474. package/dist/tools/bash_security.js.map +1 -1
  475. package/dist/tools/git.d.ts +8 -8
  476. package/dist/tools/git.d.ts.map +1 -1
  477. package/dist/tools/git.js +248 -55
  478. package/dist/tools/git.js.map +1 -1
  479. package/dist/tools/index.d.ts +13 -3
  480. package/dist/tools/index.d.ts.map +1 -1
  481. package/dist/tools/index.js +262 -30
  482. package/dist/tools/index.js.map +1 -1
  483. package/dist/tools/lsp.d.ts +74 -6
  484. package/dist/tools/lsp.d.ts.map +1 -1
  485. package/dist/tools/lsp.js +24 -5
  486. package/dist/tools/lsp.js.map +1 -1
  487. package/dist/tools/mcp.d.ts +11 -4
  488. package/dist/tools/mcp.d.ts.map +1 -1
  489. package/dist/tools/mcp.js +99 -3
  490. package/dist/tools/mcp.js.map +1 -1
  491. package/dist/tools/plan.d.ts +4 -4
  492. package/dist/tools/sandbox.d.ts +5 -1
  493. package/dist/tools/sandbox.d.ts.map +1 -1
  494. package/dist/tools/sandbox.js +29 -13
  495. package/dist/tools/sandbox.js.map +1 -1
  496. package/dist/tools/todo.d.ts +3 -3
  497. package/dist/tools/web.d.ts +15 -4
  498. package/dist/tools/web.d.ts.map +1 -1
  499. package/dist/tools/web.js +240 -26
  500. package/dist/tools/web.js.map +1 -1
  501. package/dist/tui-ui/launch.d.ts +3 -3
  502. package/dist/tui-ui/launch.d.ts.map +1 -1
  503. package/dist/tui-ui/launch.js +3 -3
  504. package/dist/tui-ui/launch.js.map +1 -1
  505. package/dist/tui-ui/layout.d.ts.map +1 -1
  506. package/dist/tui-ui/layout.js +19 -5
  507. package/dist/tui-ui/layout.js.map +1 -1
  508. package/dist/tui-ui/pickers.d.ts.map +1 -1
  509. package/dist/tui-ui/pickers.js +1 -0
  510. package/dist/tui-ui/pickers.js.map +1 -1
  511. package/dist/tui-ui/runner.d.ts +2 -1
  512. package/dist/tui-ui/runner.d.ts.map +1 -1
  513. package/dist/tui-ui/runner.js +18 -29
  514. package/dist/tui-ui/runner.js.map +1 -1
  515. package/dist/tui-ui/state.d.ts +13 -1
  516. package/dist/tui-ui/state.d.ts.map +1 -1
  517. package/dist/tui-ui/state.js +28 -1
  518. package/dist/tui-ui/state.js.map +1 -1
  519. package/dist/ui/markdown.js.map +1 -1
  520. package/dist/utils/debug-log.d.ts +3 -3
  521. package/dist/utils/debug-log.d.ts.map +1 -1
  522. package/dist/utils/debug-log.js +7 -4
  523. package/dist/utils/debug-log.js.map +1 -1
  524. package/dist/utils/json.d.ts +6 -0
  525. package/dist/utils/json.d.ts.map +1 -0
  526. package/dist/utils/json.js +66 -0
  527. package/dist/utils/json.js.map +1 -0
  528. package/dist/utils/mask.d.ts +8 -1
  529. package/dist/utils/mask.d.ts.map +1 -1
  530. package/dist/utils/mask.js +10 -12
  531. package/dist/utils/mask.js.map +1 -1
  532. package/dist/utils/observability.d.ts +22 -0
  533. package/dist/utils/observability.d.ts.map +1 -0
  534. package/dist/utils/observability.js +80 -0
  535. package/dist/utils/observability.js.map +1 -0
  536. package/dist/utils/token-estimate.d.ts +8 -0
  537. package/dist/utils/token-estimate.d.ts.map +1 -1
  538. package/dist/utils/token-estimate.js +30 -17
  539. package/dist/utils/token-estimate.js.map +1 -1
  540. package/package.json +9 -8
@@ -1,989 +1,49 @@
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");
48
12
  const tool_allowlist_1 = require("../services/tool-allowlist");
49
13
  const framework_1 = require("../framework");
50
14
  const prompt_1 = require("./goals/prompt");
51
15
  const harness_1 = require("../harness");
52
16
  const tools_1 = require("../tools");
17
+ const tool_scheduler_1 = require("../framework/tool-scheduler");
53
18
  const tool_serializer_1 = require("../framework/tool-serializer");
54
19
  const tool_artifacts_1 = require("../core/tool-artifacts");
55
- const checkpoint_1 = require("../core/checkpoint");
56
20
  const skills_1 = require("../skills");
57
21
  const subagents_1 = require("./subagents");
58
22
  const file_context_1 = require("../services/file-context");
59
23
  const prompt_context_1 = require("../services/prompt-context");
60
- const format_1 = require("../services/format");
61
24
  const workspace_state_1 = require("../services/workspace-state");
62
25
  const verification_profile_1 = require("../services/verification-profile");
63
26
  const ui_events_1 = require("./ui-events");
64
- const ui_view_model_1 = require("./ui-view-model");
65
27
  const agent_status_1 = require("./agent-status");
66
28
  const loop_budget_1 = require("./loop-budget");
67
- const tool_output_presentation_1 = require("./tool-output-presentation");
68
- const aggregate_tool_presenter_1 = require("./aggregate-tool-presenter");
69
- const ANSI_PATTERN = /\x1b\[[0-9;?]*[A-Za-z]/g;
70
- const LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES = 2048;
71
- const TRACE_ARGS_ARTIFACT_THRESHOLD_BYTES = 160;
72
- const TOOL_TRANSCRIPT_ARG_BUDGET = 512;
73
- function stripAnsi(text) {
74
- return text.replace(ANSI_PATTERN, '');
75
- }
76
- function isAbortError(error, abortSignal) {
77
- if (abortSignal?.aborted)
78
- return true;
79
- if (error instanceof Error) {
80
- return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');
81
- }
82
- return false;
83
- }
84
- function errorLayerForChatError(error) {
85
- const message = error instanceof Error ? error.message : String(error);
86
- const lower = message.toLowerCase();
87
- if (/NotEnoughCvError|code:\s*11210|provider|quota|rate.?limit|timeout|connection/i.test(message)) {
88
- return 'provider';
89
- }
90
- if (/tool|command|exec_command|write_file|edit_file/i.test(message)) {
91
- return 'tool';
92
- }
93
- if (/\bmcp\b/i.test(message))
94
- return 'mcp';
95
- if (/\b(session|resume|compact|harness)\b/i.test(message))
96
- return 'session';
97
- if (/\b(skill|skills)\b/i.test(message))
98
- return 'skills';
99
- if (/\b(memory|vector store|recall|forget)\b/i.test(message))
100
- return 'memory';
101
- if (/\b(renderer|terminal|tty|prompt|resize|scrollback)\b/i.test(message))
102
- return 'renderer';
103
- if (lower.includes('abort') || lower.includes('interrupted'))
104
- return 'runtime';
105
- return 'unknown';
106
- }
107
- function formatChatError(error) {
108
- const message = error instanceof Error ? error.message : String(error);
109
- if (/NotEnoughCvError|code:\s*11210/i.test(message)) {
110
- return [
111
- message,
112
- '',
113
- 'Provider quota or credit appears insufficient. The Orion Code session is still active; switch model/provider or recharge the provider account, then continue.',
114
- ].join('\n');
115
- }
116
- return message;
117
- }
118
- function compactMiddle(text, maxLength) {
119
- const compact = text.replace(/\s+/g, ' ').trim();
120
- if (compact.length <= maxLength)
121
- return compact;
122
- if (maxLength <= 3)
123
- return compact.slice(0, maxLength);
124
- const headLength = Math.ceil((maxLength - 3) * 0.55);
125
- const tailLength = Math.floor((maxLength - 3) * 0.45);
126
- return `${compact.slice(0, headLength)}...${compact.slice(-tailLength)}`;
127
- }
128
- function compactToolArgs(args, maxLength = 160) {
129
- for (const key of [
130
- 'path',
131
- 'file_path',
132
- 'file',
133
- 'cwd',
134
- 'command',
135
- 'pattern',
136
- 'query',
137
- 'url',
138
- 'target',
139
- 'sessionId',
140
- ]) {
141
- const value = args[key];
142
- if (typeof value === 'string') {
143
- return compactMiddle(value, maxLength);
144
- }
145
- }
146
- const firstString = Object.values(args).find(value => typeof value === 'string');
147
- if (typeof firstString === 'string') {
148
- return compactMiddle(firstString, maxLength);
149
- }
150
- return '';
151
- }
152
- function fullToolArgsForTrace(name, args) {
153
- if (name === 'exec_command' && typeof args.command === 'string') {
154
- return `$ ${args.command}`;
155
- }
156
- try {
157
- return JSON.stringify(args, null, 2);
158
- }
159
- catch {
160
- return compactToolArgs(args, 2048);
161
- }
162
- }
163
- function buildTraceArgsDetails(projectPath, name, args) {
164
- const argsSummary = compactToolArgs(args);
165
- const fullArgs = (0, session_storage_1.redactTraceText)(fullToolArgsForTrace(name, args)).trim();
166
- const argsBytes = byteLength(fullArgs);
167
- if (!projectPath ||
168
- !fullArgs ||
169
- fullArgs === (0, session_storage_1.redactTraceText)(argsSummary) ||
170
- argsBytes <= TRACE_ARGS_ARTIFACT_THRESHOLD_BYTES) {
171
- return { argsSummary };
172
- }
173
- const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, `${name}-args`, fullArgs, argsBytes);
174
- return artifact ? { argsSummary, argsArtifactId: artifact.id, argsBytes } : { argsSummary };
175
- }
176
- function parseToolCallArgsForRuntime(toolCall) {
177
- try {
178
- const parsed = JSON.parse(toolCall.function.arguments || '{}');
179
- return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)
180
- ? parsed
181
- : null;
182
- }
183
- catch {
184
- return null;
185
- }
186
- }
187
- function resolveProjectScopedPath(cwd, filePath) {
188
- const absolute = path.resolve(cwd, filePath);
189
- const relative = path.relative(cwd, absolute);
190
- if (relative.startsWith('..') || path.isAbsolute(relative))
191
- return null;
192
- return absolute;
193
- }
194
- function checkpointTargetsFromToolCalls(cwd, toolCalls) {
195
- const targets = new Set();
196
- for (const toolCall of toolCalls) {
197
- const name = toolCall.function.name;
198
- if (name !== 'write_file' && name !== 'edit_file')
199
- continue;
200
- const args = parseToolCallArgsForRuntime(toolCall);
201
- if (!args || typeof args.path !== 'string')
202
- continue;
203
- if (name === 'edit_file' && args.preview === true)
204
- continue;
205
- const target = resolveProjectScopedPath(cwd, args.path);
206
- if (target)
207
- targets.add(target);
208
- }
209
- return Array.from(targets);
210
- }
211
- function createPreToolCheckpoint(events, sessionId, turnId, checkpointId, cwd, toolCalls) {
212
- const targets = checkpointTargetsFromToolCalls(cwd, toolCalls);
213
- if (targets.length === 0)
214
- return { created: false, targetCount: 0, risky: false };
215
- const risky = (0, checkpoint_1.shouldCreateMultiFileCheckpoint)(targets.length);
216
- const checkpoint = (0, checkpoint_1.createCheckpoint)(cwd, checkpointId, targets);
217
- if (!sessionId)
218
- return { created: true, targetCount: targets.length, risky };
219
- const relativeTargets = targets.map(target => path.relative(cwd, target));
220
- recordTraceEvent(events, sessionId, {
221
- turnId,
222
- type: 'checkpoint',
223
- checkpointId,
224
- checkpointFileCount: checkpoint?.files.length ?? 0,
225
- checkpointFiles: checkpoint?.files.map(file => file.path) ?? [],
226
- workspaceFiles: relativeTargets,
227
- note: checkpoint
228
- ? risky
229
- ? 'risky_multi_file_checkpoint'
230
- : 'pre_edit_checkpoint'
231
- : 'pre_edit_checkpoint_skipped',
232
- });
233
- return { created: true, targetCount: targets.length, risky };
234
- }
235
- function byteLength(text) {
236
- return Buffer.byteLength(text, 'utf8');
237
- }
238
- function traceTurnId(turnId) {
239
- return turnId == null ? `turn-${Date.now()}` : String(turnId);
240
- }
241
- function compactTraceError(error) {
242
- const message = error instanceof Error ? error.message : String(error);
243
- return compactMiddle(message, 240);
244
- }
245
- function getLastRequestDiagnostics(llm) {
246
- if (!llm)
247
- return undefined;
248
- const reader = llm.getLastRequestDiagnostics;
249
- return typeof reader === 'function' ? reader.call(llm) : undefined;
250
- }
251
- function compactPathList(paths, maxItems = 40) {
252
- return paths.slice(0, maxItems);
253
- }
254
- function formatWorkspaceFileForTrace(file) {
255
- const metadata = [
256
- typeof file.sizeBytes === 'number' ? `${file.sizeBytes}B` : '',
257
- typeof file.mtimeMs === 'number' ? `mtime=${file.mtimeMs}` : '',
258
- ]
259
- .filter(Boolean)
260
- .join(' ');
261
- return `${file.status} ${file.path}${metadata ? ` (${metadata})` : ''}`;
262
- }
263
- function appendWorkspaceSnapshotTrace(events, sessionId, turnId, phase, snapshot) {
264
- if (!sessionId)
265
- return;
266
- recordTraceEvent(events, sessionId, {
267
- turnId,
268
- type: 'workspace_snapshot',
269
- workspacePhase: phase,
270
- workspaceGitAvailable: snapshot.gitAvailable,
271
- workspaceDirty: snapshot.dirty,
272
- workspaceBranch: snapshot.branch,
273
- workspaceFileCount: snapshot.fileCount,
274
- workspaceFiles: compactPathList(snapshot.files.map(formatWorkspaceFileForTrace)),
275
- error: snapshot.error ? compactMiddle(snapshot.error, 240) : undefined,
276
- });
277
- }
278
- function appendWorkspaceDeltaTrace(events, sessionId, turnId, before, after) {
279
- const delta = (0, workspace_state_1.diffWorkspaceSnapshots)(before, after);
280
- if (sessionId) {
281
- recordTraceEvent(events, sessionId, {
282
- turnId,
283
- type: 'workspace_delta',
284
- workspaceFileCount: delta.filesAfterTurn.length,
285
- workspaceFiles: compactPathList(delta.filesAfterTurn),
286
- workspaceNewByTurn: compactPathList(delta.newFilesByTurn),
287
- workspaceChangedByTurn: compactPathList(delta.changedByTurn),
288
- workspaceModifiedPreExistingByTurn: compactPathList(delta.modifiedPreExistingByTurn),
289
- workspaceResolvedByTurn: compactPathList(delta.resolvedByTurn),
290
- note: `pre_existing=${delta.preExistingFiles.length}`,
291
- });
292
- }
293
- return delta;
294
- }
295
- function workspaceDeltaHasTurnChanges(delta) {
296
- return (delta.newFilesByTurn.length > 0 ||
297
- delta.changedByTurn.length > 0 ||
298
- delta.resolvedByTurn.length > 0);
299
- }
300
- function formatFailureRecoveryNotice(turnId, delta, checkpointIds) {
301
- const files = compactPathList([...delta.newFilesByTurn, ...delta.changedByTurn, ...delta.resolvedByTurn], 8);
302
- const fileText = files.length > 0 ? files.join(', ') : 'workspace changes recorded';
303
- const checkpointText = checkpointIds.length > 0
304
- ? ` Checkpoints: ${checkpointIds.join(', ')}. Preview rollback with /checkpoint restore <id>; restore each listed checkpoint if multiple.`
305
- : '';
306
- return `Turn failed after modifying files: ${fileText}. Inspect /trace ${turnId}.${checkpointText}`;
307
- }
308
- function appendVerificationProfileTrace(events, sessionId, turnId, profile) {
309
- if (!sessionId || profile.changedFiles.length === 0)
310
- return;
311
- recordTraceEvent(events, sessionId, {
312
- turnId,
313
- type: 'verification_profile',
314
- verificationProfile: profile.profile,
315
- verificationRequired: profile.required,
316
- verificationRisky: (0, verification_profile_1.isRiskyEdit)(profile.changedFiles),
317
- verificationCommands: compactPathList(profile.commands, 8),
318
- verificationChangedFiles: compactPathList(profile.changedFiles),
319
- note: profile.reason,
320
- });
321
- }
322
- function appendVerificationResultTrace(events, sessionId, turnId, result) {
323
- if (!sessionId)
324
- return;
325
- recordTraceEvent(events, sessionId, {
326
- turnId,
327
- type: 'verification_result',
328
- verificationCommand: result.command,
329
- verificationPassed: result.success,
330
- outputBytes: result.outputBytes,
331
- error: result.error ? compactMiddle(result.error, 240) : undefined,
332
- });
333
- }
334
- function appendVerificationSummaryTrace(events, sessionId, turnId, summary, changedFiles) {
335
- if (!sessionId || changedFiles.length === 0)
336
- return;
337
- recordTraceEvent(events, sessionId, {
338
- turnId,
339
- type: 'verification_summary',
340
- verificationProfile: summary.profile,
341
- verificationRequired: summary.required,
342
- verificationCommands: compactPathList(summary.commandsRun, 12),
343
- verificationPassedCommands: compactPathList(summary.passedCommands, 12),
344
- verificationFailedCommands: compactPathList(summary.failedCommands, 12),
345
- verificationMissingCommands: compactPathList(summary.missingCommands, 12),
346
- verificationChangedFiles: compactPathList(changedFiles),
347
- verificationClaimAllowed: summary.claimAllowed,
348
- note: summary.skippedReason,
349
- });
350
- }
351
- function compactVerificationCommands(commands, maxItems = 12) {
352
- return commands.slice(0, maxItems).map(session_storage_1.redactTraceText);
353
- }
354
- function withVerificationLoopStats(stats, summary) {
355
- return {
356
- ...stats,
357
- verificationProfile: summary.profile,
358
- verificationRequired: summary.required,
359
- verificationClaimAllowed: summary.claimAllowed,
360
- verificationPassedCommands: compactVerificationCommands(summary.passedCommands),
361
- verificationFailedCommands: compactVerificationCommands(summary.failedCommands),
362
- verificationMissingCommands: compactVerificationCommands(summary.missingCommands),
363
- verificationSkippedReason: summary.skippedReason
364
- ? (0, session_storage_1.redactTraceText)(summary.skippedReason)
365
- : undefined,
366
- };
367
- }
368
- function shouldRecordVerificationLoopStats(profile, summary) {
369
- return (profile.changedFiles.length > 0 ||
370
- summary.commandsRun.length > 0 ||
371
- summary.passedCommands.length > 0 ||
372
- summary.failedCommands.length > 0 ||
373
- summary.missingCommands.length > 0);
374
- }
375
- function appendPostWorkspaceTrace(events, sessionId, turnId, cwd, before, verificationResults = []) {
376
- const postWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(cwd);
377
- appendWorkspaceSnapshotTrace(events, sessionId, turnId, 'post_turn', postWorkspace);
378
- const delta = appendWorkspaceDeltaTrace(events, sessionId, turnId, before, postWorkspace);
379
- const profile = (0, verification_profile_1.selectVerificationProfile)(cwd, delta.changedByTurn);
380
- const summary = (0, verification_profile_1.summarizeVerificationState)(profile, verificationResults);
381
- appendVerificationProfileTrace(events, sessionId, turnId, profile);
382
- appendVerificationSummaryTrace(events, sessionId, turnId, summary, profile.changedFiles);
383
- return { delta, profile, summary };
384
- }
385
- function appendAssistantNotice(messages, notice) {
386
- for (let index = messages.length - 1; index >= 0; index--) {
387
- const message = messages[index];
388
- if (message.role === 'assistant' && !message.tool_calls) {
389
- message.content = message.content ? `${message.content}\n\n${notice}` : notice;
390
- return;
391
- }
392
- }
393
- messages.push({
394
- role: 'assistant',
395
- content: notice,
396
- timestamp: Date.now(),
397
- });
398
- }
399
- function recordTraceEvent(events, sessionId, event) {
400
- if (!sessionId)
401
- return null;
402
- const goal = goalTraceContext.getStore();
403
- const traceEvent = (0, session_storage_1.appendSessionTraceEvent)(sessionId, {
404
- ...event,
405
- goalId: goal?.goalId,
406
- goalRevision: goal?.goalRevision,
407
- goalInputKind: goal?.goalInputKind,
408
- goalStopReason: goal?.getStopReason(),
409
- });
410
- if (traceEvent) {
411
- events.traceEventRecorded?.(traceEvent);
412
- }
413
- return traceEvent;
414
- }
415
- function recordProviderTraceEvents(events, sessionId, turnId, stats) {
416
- if ((stats.providerRetryCount ?? 0) > 0) {
417
- recordTraceEvent(events, sessionId, {
418
- turnId,
419
- type: 'provider_retry',
420
- providerRetryCount: stats.providerRetryCount,
421
- providerRetryDelayMs: stats.providerRetryDelayMs,
422
- providerRetryErrorTypes: stats.providerRetryErrorTypes,
423
- providerLastRetryErrorType: stats.providerLastRetryErrorType,
424
- providerLastRetryStatus: stats.providerLastRetryStatus,
425
- providerFinalModel: stats.providerFinalModel,
426
- providerUsingFallback: stats.providerUsingFallback,
427
- });
428
- }
429
- if ((stats.providerFallbackCount ?? 0) > 0 || stats.providerUsingFallback) {
430
- recordTraceEvent(events, sessionId, {
431
- turnId,
432
- type: 'provider_fallback',
433
- providerFallbackCount: stats.providerFallbackCount,
434
- providerFallbackFromModel: stats.providerFallbackFromModel,
435
- providerFallbackToModel: stats.providerFallbackToModel,
436
- providerFinalModel: stats.providerFinalModel,
437
- providerUsingFallback: stats.providerUsingFallback,
438
- });
439
- }
440
- }
441
- function toHarnessDiagnostics(state) {
442
- const stats = state.promptAssemblyStats;
443
- const redactOptional = (value) => typeof value === 'string' ? (0, session_storage_1.redactTraceText)(value) : undefined;
444
- const redactList = (values) => values?.slice(0, 6).map(session_storage_1.redactTraceText);
445
- return {
446
- taskEpoch: state.taskEpoch,
447
- rootObjective: redactOptional(state.rootObjective ?? state.contract?.objective),
448
- activeInstruction: redactOptional(state.activeInstruction ?? state.contract?.userIntent),
449
- openQuestions: redactList(state.openQuestions),
450
- diagnostics: redactList(state.diagnostics?.slice(-6)),
451
- ledgerSize: state.ledger?.length ?? 0,
452
- evidenceSize: state.evidenceIndex?.length ?? 0,
453
- turnSummaryCount: state.turnSummaries?.length ?? 0,
454
- promptAssembly: stats
455
- ? {
456
- modelId: stats.modelId,
457
- estimatedTokens: stats.estimatedTokens,
458
- budgetTokens: stats.budgetTokens,
459
- sections: stats.sections.slice(0, 12),
460
- includedEvidence: stats.includedEvidence.length,
461
- omittedEvidence: stats.omittedEvidence.length,
462
- }
463
- : undefined,
464
- };
465
- }
466
- function emitHarnessDiagnostics(events, state) {
467
- events.harnessDiagnosticsUpdated?.(toHarnessDiagnostics(state));
468
- }
469
- function toolStartContent(event) {
470
- return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromStarted)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
471
- }
472
- function toolFinishContent(event) {
473
- return (0, ui_view_model_1.formatToolActivityTranscript)((0, ui_view_model_1.toolActivityFromFinished)(event, compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)));
474
- }
475
- function structuredToolStartActivity(event, seq) {
476
- const command = event.name === 'exec_command' && typeof event.args.command === 'string'
477
- ? event.args.command
478
- : undefined;
479
- const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
480
- return {
481
- state: 'running',
482
- name: event.name,
483
- detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
484
- command: safeCommand,
485
- body: '',
486
- seq,
487
- };
488
- }
489
- function structuredToolFinishActivity(event, seq, options = {}) {
490
- const modelVisible = (0, tool_serializer_1.parseToolResultEnvelope)(event.modelVisibleResult);
491
- const durable = (0, tool_serializer_1.parseToolResultEnvelope)(event.result);
492
- const durableOutput = typeof durable.output === 'string' ? durable.output : '';
493
- const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
494
- const outputBytes = event.outputBytes ?? Buffer.byteLength(durableOutput, 'utf8');
495
- const aggregatePresentation = (0, aggregate_tool_presenter_1.presentAggregateToolResult)(event.name, durableOutput, outputBytes);
496
- const aggregate = aggregatePresentation?.view;
497
- const storedArtifact = event.artifactRef ??
498
- (options.projectPath &&
499
- durableOutput &&
500
- (outputBytes > tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY.inlineMaxBytes || aggregate)
501
- ? ((0, tool_artifacts_1.storeArtifact)(options.projectPath, event.name, durableOutput, outputBytes) ?? undefined)
502
- : undefined);
503
- const artifactRef = storedArtifact
504
- ? { id: storedArtifact.id, outputBytes: storedArtifact.outputBytes }
505
- : undefined;
506
- const outputView = (0, tool_output_presentation_1.createToolOutputView)({
507
- toolName: event.name,
508
- success: event.success,
509
- summary: event.summary,
510
- rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
511
- outputBytes,
512
- artifactRef,
513
- callId: event.callId,
514
- sequence: seq,
515
- turnId: options.turnId,
516
- policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
517
- });
518
- if (aggregate) {
519
- outputView.aggregate = {
520
- ...aggregate,
521
- steps: aggregate.steps.map(step => ({ ...step, detailRef: outputView.detailRef })),
522
- };
523
- }
524
- const command = event.name === 'exec_command' && typeof event.args.command === 'string'
525
- ? event.args.command
526
- : undefined;
527
- const safeCommand = command ? (0, session_storage_1.redactTraceText)(command) : undefined;
528
- return {
529
- state: event.success ? 'success' : 'error',
530
- name: event.name,
531
- detail: command ? '' : (0, session_storage_1.redactTraceText)(compactToolArgs(event.args, TOOL_TRANSCRIPT_ARG_BUDGET)),
532
- command: safeCommand,
533
- duration: `${event.duration}ms`,
534
- summary: event.summary ? (0, session_storage_1.redactTraceText)(event.summary.split(/\r?\n/u, 1)[0]) : undefined,
535
- outputBytes,
536
- body: (0, session_storage_1.redactTraceText)(modelVisible.output),
537
- error: event.error ? (0, session_storage_1.redactTraceText)(event.error) : undefined,
538
- seq,
539
- artifactHint: artifactRef ? `/artifacts show ${artifactRef.id} --full` : undefined,
540
- callId: event.callId,
541
- turnId: options.turnId,
542
- outputView,
543
- };
544
- }
545
- function isSyntheticCompactContext(content) {
546
- return (content.startsWith('[Orion Code Context State v2]') ||
547
- content.startsWith('[Context Summary]') ||
548
- content.startsWith('I will continue from this Orion Code Context State') ||
549
- content.startsWith('I understand the context. I will continue the conversation with this background information.'));
550
- }
551
- function sessionToolCallSummaries(message) {
552
- return (message.tool_calls ?? []).map(call => {
553
- const args = parseToolCallArgs(call.function.arguments);
554
- const detail = compactToolArgs(args);
555
- return {
556
- id: call.id,
557
- content: `Requested ${call.function.name}${detail ? ` ${detail}` : ''}`,
558
- };
559
- });
560
- }
561
- function parseToolCallArgs(rawArgs) {
562
- try {
563
- return rawArgs ? JSON.parse(rawArgs) : {};
564
- }
565
- catch {
566
- return rawArgs ? { arguments: rawArgs } : {};
567
- }
568
- }
569
- function parseSessionToolResult(content) {
570
- try {
571
- const parsed = JSON.parse(content);
572
- return {
573
- success: parsed.success === true,
574
- error: typeof parsed.error === 'string' ? parsed.error : undefined,
575
- summary: typeof parsed.summary === 'string' ? parsed.summary : undefined,
576
- };
577
- }
578
- catch {
579
- return { success: false, error: 'Invalid JSON result' };
580
- }
581
- }
582
- function removeTrailingUserMessage(runtime) {
583
- const history = runtime.store.getSnapshot().conversationHistory;
584
- if (history.length === 0)
585
- return;
586
- const lastMsg = history[history.length - 1];
587
- if (lastMsg?.role === 'user') {
588
- runtime.store.setState({ conversationHistory: history.slice(0, -1) });
589
- }
590
- }
591
- function sessionToolResultSummary(message, toolCallsById) {
592
- if (!message.toolCallId)
593
- return null;
594
- const call = toolCallsById.get(message.toolCallId);
595
- if (!call)
596
- return null;
597
- const args = parseToolCallArgs(call.function.arguments);
598
- const detail = compactToolArgs(args);
599
- const parsed = parseSessionToolResult(message.content);
600
- const firstLine = parsed.summary ||
601
- `${parsed.success ? '✓' : '✗'} ${call.function.name}${detail ? ` ${detail}` : ''}`;
602
- return parsed.error ? `${firstLine}\nError: ${parsed.error}` : firstLine;
603
- }
604
- function sessionMessagesToTranscriptEntries(sessionId, options = {}) {
605
- const messages = (0, session_storage_1.loadSessionTranscriptMessages)(sessionId);
606
- const resultTraces = options.includeToolOutputViews
607
- ? (0, session_storage_1.readSessionTraceEvents)(sessionId).filter(trace => trace.type === 'tool_result' && trace.callId)
608
- : [];
609
- const resultTraceByCallId = new Map(resultTraces.map(trace => [trace.callId, trace]));
610
- const sequenceByCallId = new Map();
611
- resultTraces.forEach((trace, index) => {
612
- if (!sequenceByCallId.has(trace.callId))
613
- sequenceByCallId.set(trace.callId, index + 1);
614
- });
615
- const entries = [];
616
- const toolCallsById = new Map();
617
- const completedToolCallIds = new Set();
618
- let fallbackToolSequence = 0;
619
- for (const message of messages) {
620
- for (const call of message.tool_calls ?? []) {
621
- toolCallsById.set(call.id, call);
622
- }
623
- if (message.role === 'tool' && message.toolCallId) {
624
- completedToolCallIds.add(message.toolCallId);
625
- }
626
- }
627
- messages.forEach((message, index) => {
628
- if (isSyntheticCompactContext(message.content))
629
- return;
630
- const idBase = `session-${sessionId.slice(0, 8)}-${index}`;
631
- if (message.role === 'user') {
632
- entries.push({ id: `${idBase}-user`, role: 'user', content: message.content });
633
- return;
634
- }
635
- if (message.role === 'assistant') {
636
- if (message.content?.trim()) {
637
- entries.push({ id: `${idBase}-assistant`, role: 'assistant', content: message.content });
638
- }
639
- for (const summary of sessionToolCallSummaries(message)) {
640
- if (!completedToolCallIds.has(summary.id)) {
641
- entries.push({
642
- id: `${idBase}-tool-call-${entries.length}`,
643
- role: 'tool',
644
- content: summary.content,
645
- });
646
- }
647
- }
648
- return;
649
- }
650
- if (message.role === 'tool') {
651
- const summary = sessionToolResultSummary(message, toolCallsById);
652
- const call = message.toolCallId ? toolCallsById.get(message.toolCallId) : undefined;
653
- const trace = message.toolCallId ? resultTraceByCallId.get(message.toolCallId) : undefined;
654
- const durable = (0, tool_serializer_1.parseToolResultEnvelope)(message.content);
655
- const modelVisible = message.modelVisibleContent
656
- ? (0, tool_serializer_1.parseToolResultEnvelope)(message.modelVisibleContent)
657
- : durable;
658
- const durableOutput = typeof durable.output === 'string' ? durable.output : '';
659
- const displayOutput = typeof modelVisible.output === 'string' ? modelVisible.output : durableOutput;
660
- const outputBytes = trace?.outputBytes ??
661
- (durable.schemaVersion === 1 ? durable.outputBytes : undefined) ??
662
- Buffer.byteLength(durableOutput, 'utf8');
663
- const artifactId = durable.artifactRef?.id ?? trace?.artifactId;
664
- fallbackToolSequence += 1;
665
- const sequence = message.toolCallId
666
- ? (sequenceByCallId.get(message.toolCallId) ?? fallbackToolSequence)
667
- : fallbackToolSequence;
668
- const outputView = options.includeToolOutputViews && call && message.toolCallId
669
- ? (0, tool_output_presentation_1.createToolOutputView)({
670
- toolName: call.function.name,
671
- success: durable.success,
672
- summary: durable.summary,
673
- rawOutput: durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput,
674
- outputBytes,
675
- artifactRef: artifactId ? { id: artifactId, outputBytes } : undefined,
676
- callId: message.toolCallId,
677
- sequence,
678
- turnId: trace?.turnId,
679
- policy: tool_output_presentation_1.DEFAULT_TOOL_OUTPUT_POLICY,
680
- })
681
- : undefined;
682
- entries.push({
683
- id: `${idBase}-tool`,
684
- role: 'tool',
685
- content: summary ??
686
- (message.toolCallId
687
- ? `Tool result ${message.toolCallId}\n${message.content}`
688
- : message.content),
689
- toolActivity: call && message.toolCallId && outputView
690
- ? {
691
- state: durable.success ? 'success' : 'error',
692
- name: call.function.name,
693
- detail: (0, session_storage_1.redactTraceText)(compactToolArgs(parseToolCallArgs(call.function.arguments))),
694
- summary: durable.summary
695
- ? (0, session_storage_1.redactTraceText)(durable.summary.split(/\r?\n/u, 1)[0])
696
- : undefined,
697
- outputBytes,
698
- body: (0, session_storage_1.redactTraceText)(durableOutput.length <= 64 * 1024 ? durableOutput : displayOutput),
699
- error: durable.error ? (0, session_storage_1.redactTraceText)(durable.error) : undefined,
700
- duration: typeof trace?.duration === 'number' ? `${trace.duration}ms` : undefined,
701
- seq: sequence,
702
- artifactHint: artifactId ? `/artifacts show ${artifactId} --full` : undefined,
703
- callId: message.toolCallId,
704
- turnId: trace?.turnId,
705
- outputView,
706
- }
707
- : undefined,
708
- });
709
- return;
710
- }
711
- if (message.role === 'system') {
712
- entries.push({ id: `${idBase}-system`, role: 'system', content: message.content });
713
- }
714
- });
715
- return entries;
716
- }
717
- function createAssistantStreamPresenter(events, abortSignal) {
718
- let activeSegmentText = '';
719
- let activeEntryId = null;
720
- const ensureLiveEntry = () => {
721
- if (abortSignal?.aborted || !activeSegmentText)
722
- return null;
723
- if (activeEntryId) {
724
- events.update(activeEntryId, { content: activeSegmentText });
725
- return activeEntryId;
726
- }
727
- activeEntryId = events.append({
728
- role: 'assistant',
729
- content: activeSegmentText,
730
- live: true,
731
- });
732
- return activeEntryId;
733
- };
734
- const flushSegment = () => {
735
- if (abortSignal?.aborted) {
736
- if (activeEntryId)
737
- events.remove(activeEntryId);
738
- activeEntryId = null;
739
- activeSegmentText = '';
740
- return;
741
- }
742
- const entryId = ensureLiveEntry();
743
- if (!entryId)
744
- return;
745
- events.finalize(entryId);
746
- activeEntryId = null;
747
- activeSegmentText = '';
748
- };
749
- return {
750
- appendChunk(chunk) {
751
- if (abortSignal?.aborted || !chunk)
752
- return;
753
- activeSegmentText += chunk;
754
- ensureLiveEntry();
755
- },
756
- closeSegment() {
757
- flushSegment();
758
- },
759
- discardSegment() {
760
- if (activeEntryId)
761
- events.remove(activeEntryId);
762
- activeEntryId = null;
763
- activeSegmentText = '';
764
- },
765
- ensureMessage(content) {
766
- if (abortSignal?.aborted || !content || activeSegmentText.length > 0)
767
- return;
768
- activeSegmentText = content;
769
- ensureLiveEntry();
770
- },
771
- replaceMessage(content) {
772
- if (abortSignal?.aborted || !content)
773
- return;
774
- activeSegmentText = content;
775
- ensureLiveEntry();
776
- },
777
- };
778
- }
779
- const goalTraceContext = new async_hooks_1.AsyncLocalStorage();
780
- class LocalFastPathBlockedError extends Error {
781
- constructor(message) {
782
- super(message);
783
- this.name = 'LocalFastPathBlockedError';
784
- }
785
- }
786
- function parseLocalFastPath(input) {
787
- const text = input.trim();
788
- if (/^git\s+status$/i.test(text)) {
789
- return { tool: 'git_status', args: {}, label: 'git status' };
790
- }
791
- const readMatch = /^(?:read|读取)\s+(.+)$/i.exec(text);
792
- const readTarget = readMatch?.[1]?.trim();
793
- const looksLikePath = Boolean(readTarget) &&
794
- !/\s/.test(readTarget) &&
795
- (/[/\\.]/.test(readTarget) || readTarget.startsWith('~'));
796
- if (readTarget && looksLikePath) {
797
- return { tool: 'read_file', args: { path: readTarget }, label: `read ${readTarget}` };
798
- }
799
- const grepMatch = /^(?:grep|搜索)\s+(.+)$/i.exec(text);
800
- if (grepMatch?.[1]?.trim()) {
801
- return {
802
- tool: 'grep',
803
- args: { pattern: grepMatch[1].trim() },
804
- label: `grep ${grepMatch[1].trim()}`,
805
- };
806
- }
807
- const runTestMatch = /^(?:run\s+test|运行测试)\s*[::]\s*(.+)$/i.exec(text);
808
- if (runTestMatch?.[1]?.trim()) {
809
- return {
810
- tool: 'exec_command',
811
- args: { command: runTestMatch[1].trim() },
812
- label: `run test: ${runTestMatch[1].trim()}`,
813
- };
814
- }
815
- return null;
816
- }
817
- function formatLocalFastPathAssistantContent(action, rawResult, projectPath) {
818
- const envelope = (0, tool_serializer_1.parseToolResultEnvelope)(rawResult);
819
- const rawOutput = typeof envelope.output === 'string' ? envelope.output : '';
820
- const output = rawOutput.trim();
821
- const summary = envelope.summary || `${action.tool} ${envelope.success ? 'completed' : 'failed'}`;
822
- const lines = [
823
- envelope.success
824
- ? `Local fast path completed ${action.label}.`
825
- : `Local fast path failed ${action.label}.`,
826
- '',
827
- summary,
828
- ];
829
- if (!envelope.success && envelope.error) {
830
- lines.push(`Error: ${envelope.error}`);
831
- }
832
- if (!output) {
833
- return { content: lines.join('\n'), artifactRef: envelope.artifactRef };
834
- }
835
- let artifactRef = envelope.artifactRef;
836
- let preview = output;
837
- const outputBytes = envelope.outputBytes ?? byteLength(rawOutput);
838
- if (byteLength(rawOutput) > LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES) {
839
- if (!artifactRef) {
840
- const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, action.tool, rawOutput, outputBytes);
841
- artifactRef = artifact ? { id: artifact.id, outputBytes: artifact.outputBytes } : undefined;
842
- }
843
- preview = (0, tool_artifacts_1.truncateForContext)(output, LOCAL_FAST_PATH_INLINE_OUTPUT_BYTES);
844
- }
845
- if (artifactRef) {
846
- lines.push('', `Full output: /artifacts show ${artifactRef.id} --full (${(0, format_1.formatBytes)(artifactRef.outputBytes)})`);
847
- }
848
- lines.push('', 'Preview:', preview);
849
- return { content: lines.join('\n'), artifactRef };
850
- }
851
- function createToolEventPresenter(events, options = {}) {
852
- const runningToolEntries = new Map();
853
- let toolSequenceCounter = 0;
854
- return {
855
- start(event) {
856
- const seq = ++toolSequenceCounter;
857
- const entryId = events.append({
858
- role: 'tool',
859
- title: 'tool',
860
- content: toolStartContent(event),
861
- toolActivity: structuredToolStartActivity(event, seq),
862
- });
863
- runningToolEntries.set(event.callId, {
864
- entryId,
865
- name: event.name,
866
- args: event.args,
867
- sequence: seq,
868
- batchCount: event.batchCount,
869
- batchIndex: event.batchIndex,
870
- });
871
- events.toolStarted?.({
872
- callId: event.callId,
873
- name: event.name,
874
- args: event.args,
875
- sequence: seq,
876
- batchCount: event.batchCount,
877
- batchIndex: event.batchIndex,
878
- });
879
- },
880
- finish(event) {
881
- const content = toolFinishContent(event);
882
- const stored = runningToolEntries.get(event.callId);
883
- const seq = stored?.sequence ?? ++toolSequenceCounter;
884
- const toolActivity = structuredToolFinishActivity(event, seq, options);
885
- if (stored) {
886
- events.finalize(stored.entryId, {
887
- role: event.success ? 'tool' : 'error',
888
- title: 'tool',
889
- content,
890
- toolActivity,
891
- });
892
- runningToolEntries.delete(event.callId);
893
- }
894
- else {
895
- const entryId = events.append({
896
- role: event.success ? 'tool' : 'error',
897
- title: 'tool',
898
- content,
899
- toolActivity,
900
- });
901
- events.finalize(entryId);
902
- }
903
- events.toolFinished?.({
904
- callId: event.callId,
905
- name: event.name,
906
- args: event.args,
907
- success: event.success,
908
- duration: event.duration,
909
- summary: event.summary,
910
- error: event.error,
911
- outputBytes: event.outputBytes,
912
- artifactRef: toolActivity.outputView?.detailRef?.artifactId
913
- ? {
914
- id: toolActivity.outputView.detailRef.artifactId,
915
- outputBytes: toolActivity.outputView.detailRef.outputBytes,
916
- }
917
- : event.artifactRef,
918
- externalAssertion: event.externalAssertion,
919
- sequence: seq,
920
- batchCount: event.batchCount,
921
- batchIndex: event.batchIndex,
922
- });
923
- },
924
- finalizePendingAsSkipped(reason = 'permission denied') {
925
- for (const [callId, entry] of runningToolEntries) {
926
- events.finalize(entry.entryId, {
927
- role: 'tool',
928
- title: 'tool',
929
- content: `Skipped · ${reason}`,
930
- toolActivity: {
931
- state: 'skipped',
932
- name: entry.name,
933
- detail: '',
934
- body: '',
935
- error: reason,
936
- seq: entry.sequence,
937
- },
938
- });
939
- events.toolFinished?.({
940
- callId,
941
- name: entry.name,
942
- args: entry.args,
943
- success: false,
944
- skipped: true,
945
- duration: 0,
946
- error: reason,
947
- sequence: entry.sequence,
948
- batchCount: entry.batchCount,
949
- batchIndex: entry.batchIndex,
950
- });
951
- }
952
- runningToolEntries.clear();
953
- },
954
- };
955
- }
956
- async function captureConsoleOutput(fn) {
957
- const lines = [];
958
- const originalLog = console.log;
959
- const originalError = console.error;
960
- const originalWarn = console.warn;
961
- const capture = (...args) => {
962
- lines.push(stripAnsi(args.map(arg => (typeof arg === 'string' ? arg : JSON.stringify(arg))).join(' ')));
963
- };
964
- console.log = capture;
965
- console.error = capture;
966
- console.warn = capture;
967
- try {
968
- const result = await fn();
969
- return { result, output: lines.join('\n').trim() };
970
- }
971
- finally {
972
- console.log = originalLog;
973
- console.error = originalError;
974
- console.warn = originalWarn;
975
- }
976
- }
29
+ const observability_1 = require("../utils/observability");
30
+ const chat_trace_1 = require("./chat-trace");
31
+ const chat_checkpoint_1 = require("./chat-checkpoint");
32
+ const chat_workspace_1 = require("./chat-workspace");
33
+ const chat_presentation_1 = require("./chat-presentation");
34
+ const chat_effort_1 = require("./chat-effort");
35
+ var chat_presentation_2 = require("./chat-presentation");
36
+ Object.defineProperty(exports, "createAssistantStreamPresenter", { enumerable: true, get: function () { return chat_presentation_2.createAssistantStreamPresenter; } });
37
+ Object.defineProperty(exports, "createToolEventPresenter", { enumerable: true, get: function () { return chat_presentation_2.createToolEventPresenter; } });
38
+ Object.defineProperty(exports, "sessionMessagesToTranscriptEntries", { enumerable: true, get: function () { return chat_presentation_2.sessionMessagesToTranscriptEntries; } });
977
39
  class AgentChatController {
978
40
  setGoalCoordinator(coord) {
979
41
  this.goalCoordinator = coord;
980
42
  }
981
43
  resolveToolAllowlist() {
982
- const cwd = this.runtime.cwd;
983
- if (this.toolAllowlistCache?.cwd !== cwd) {
984
- this.toolAllowlistCache = { cwd, evaluator: (0, tool_allowlist_1.resolveProjectToolAllowlist)(cwd).evaluator };
985
- }
986
- return this.toolAllowlistCache.evaluator;
44
+ // Reload on every scheduling boundary so a project/global approval selected
45
+ // by the interactive prompt affects the very next tool call in this process.
46
+ return (0, tool_allowlist_1.resolveProjectToolAllowlist)(this.runtime.cwd).evaluator;
987
47
  }
988
48
  constructor(runtime, events, controllerOptions = {}) {
989
49
  this.runtime = runtime;
@@ -1010,7 +70,7 @@ class AgentChatController {
1010
70
  });
1011
71
  const parsed = (0, parser_1.parseInput)(text);
1012
72
  if (!parsed.isCommand) {
1013
- const localFastPath = parseLocalFastPath(text);
73
+ const localFastPath = (0, chat_presentation_1.parseLocalFastPath)(text);
1014
74
  if (localFastPath) {
1015
75
  await this.runLocalFastPath(text, localFastPath, options);
1016
76
  return;
@@ -1050,6 +110,23 @@ class AgentChatController {
1050
110
  });
1051
111
  return;
1052
112
  }
113
+ const compatibilityAlias = command.compatibilityAliases?.find(alias => alias.name.toLowerCase() === parsed.name.toLowerCase());
114
+ const deprecation = compatibilityAlias?.lifecycle ??
115
+ (command.lifecycle.status === 'deprecated' ? command.lifecycle : undefined);
116
+ if (deprecation) {
117
+ this.events.append({
118
+ role: 'system',
119
+ title: `/${parsed.name} deprecated`,
120
+ content: `/${parsed.name} is deprecated${deprecation.replacement ? `; use ${deprecation.replacement}` : ''}. It will be removed in ${deprecation.removeIn ?? 'a future release'}.`,
121
+ statusTone: 'warning',
122
+ command: {
123
+ id: command.id,
124
+ name: command.name,
125
+ source: command.source,
126
+ success: true,
127
+ },
128
+ });
129
+ }
1053
130
  const ctx = this.createCommandContext(options.abortSignal, options.turnId);
1054
131
  let commandProviderAttempts = 0;
1055
132
  const commandProviderPreflight = async (context) => {
@@ -1073,7 +150,13 @@ class AgentChatController {
1073
150
  let result;
1074
151
  let output;
1075
152
  try {
1076
- ({ result, output } = await captureConsoleOutput(() => command.execute(ctx, parsed.args)));
153
+ if (command.audience === 'primary') {
154
+ result = await command.execute(ctx, parsed.args);
155
+ output = '';
156
+ }
157
+ else {
158
+ ({ result, output } = await (0, chat_presentation_1.captureConsoleOutput)(() => command.execute(ctx, parsed.args)));
159
+ }
1077
160
  }
1078
161
  finally {
1079
162
  unsubscribeCommandUsage?.();
@@ -1083,7 +166,7 @@ class AgentChatController {
1083
166
  }
1084
167
  const providerRequests = Math.max(commandProviderAttempts, commandUsageEvents);
1085
168
  if (providerRequests > 0) {
1086
- const diagnostics = getLastRequestDiagnostics(this.runtime.llm);
169
+ const diagnostics = (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm);
1087
170
  const retryCount = diagnostics?.retryCount ?? 0;
1088
171
  const fallbackCount = diagnostics?.fallbackTriggered ? 1 : 0;
1089
172
  this.setLoopStats({
@@ -1112,11 +195,18 @@ class AgentChatController {
1112
195
  });
1113
196
  }
1114
197
  }
198
+ const commandMeta = {
199
+ id: command.id,
200
+ name: command.name,
201
+ source: command.source,
202
+ success: result.success,
203
+ };
1115
204
  if (output) {
1116
205
  this.events.append({
1117
206
  role: result.success ? 'system' : 'error',
1118
207
  title: `/${command.name}`,
1119
208
  content: output,
209
+ command: commandMeta,
1120
210
  });
1121
211
  }
1122
212
  if (result.output) {
@@ -1124,6 +214,7 @@ class AgentChatController {
1124
214
  role: result.success ? 'system' : 'error',
1125
215
  title: `/${command.name}`,
1126
216
  content: result.output,
217
+ command: commandMeta,
1127
218
  });
1128
219
  }
1129
220
  if (result.error) {
@@ -1132,6 +223,7 @@ class AgentChatController {
1132
223
  title: `/${command.name}`,
1133
224
  content: result.error,
1134
225
  errorLayer: 'runtime',
226
+ command: commandMeta,
1135
227
  });
1136
228
  }
1137
229
  if (result.sessionPicker) {
@@ -1146,6 +238,9 @@ class AgentChatController {
1146
238
  this.events.showEditPreview(result.editPreview);
1147
239
  return;
1148
240
  }
241
+ if (result.effortEvent) {
242
+ this.events.effortEvent?.(result.effortEvent);
243
+ }
1149
244
  if (result.continueAsChat) {
1150
245
  await this.runChat(result.chatInput ?? parsed.args, options);
1151
246
  }
@@ -1162,7 +257,7 @@ class AgentChatController {
1162
257
  await run();
1163
258
  return;
1164
259
  }
1165
- await goalTraceContext.run({
260
+ await chat_trace_1.goalTraceContext.run({
1166
261
  goalId: request.goal.goalId,
1167
262
  goalRevision: request.goal.revision,
1168
263
  goalInputKind: request.inputKind,
@@ -1174,30 +269,35 @@ class AgentChatController {
1174
269
  this.runtime.ensureSession() ??
1175
270
  (0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
1176
271
  const sessionId = activeSession?.id;
1177
- const turnId = traceTurnId(options.turnId);
272
+ const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
273
+ (0, observability_1.setDiagnosticTraceContext)({
274
+ traceId: `${sessionId ?? 'local'}:${turnId}`,
275
+ ...(sessionId ? { sessionId } : {}),
276
+ turnId,
277
+ });
1178
278
  const localCallId = `local-${turnId}`;
1179
279
  const start = Date.now();
1180
280
  const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
1181
- const traceArgs = buildTraceArgsDetails(this.runtime.cwd, action.tool, action.args);
281
+ const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, action.tool, action.args);
1182
282
  if (sessionId) {
1183
283
  (0, session_storage_1.appendSessionMessage)(sessionId, {
1184
284
  role: 'user',
1185
285
  content: input,
1186
286
  timestamp: Date.now(),
1187
287
  });
1188
- recordTraceEvent(this.events, sessionId, {
288
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1189
289
  turnId,
1190
290
  type: 'turn_start',
1191
- inputBytes: byteLength(input),
291
+ inputBytes: (0, chat_trace_1.byteLength)(input),
1192
292
  localFastPathUsed: true,
1193
293
  });
1194
- appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
1195
- recordTraceEvent(this.events, sessionId, {
294
+ (0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
295
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1196
296
  turnId,
1197
297
  type: 'local_fast_path',
1198
298
  name: action.tool,
1199
299
  ...traceArgs,
1200
- note: compactMiddle(action.label, 160),
300
+ note: (0, chat_trace_1.compactMiddle)(action.label, 160),
1201
301
  });
1202
302
  }
1203
303
  if (options.persistAsUserMessage !== false) {
@@ -1206,6 +306,11 @@ class AgentChatController {
1206
306
  this.events.setStatus(`Running local ${action.label}...`);
1207
307
  try {
1208
308
  const tool = (0, tools_1.getRuntimeTools)().find(candidate => candidate.name === action.tool);
309
+ if (!tool) {
310
+ throw new chat_presentation_1.LocalFastPathBlockedError(`Local fast path tool ${action.tool} is unavailable.`);
311
+ }
312
+ const effectivePermissionMode = this.runtime.store.getEffectivePermissionMode();
313
+ const toolAllowlist = this.resolveToolAllowlist();
1209
314
  const toolContext = {
1210
315
  cwd: this.runtime.cwd,
1211
316
  config: {
@@ -1214,17 +319,57 @@ class AgentChatController {
1214
319
  },
1215
320
  sessionId,
1216
321
  turnId,
322
+ permissionMode: effectivePermissionMode,
323
+ toolAllowlist,
324
+ toolConfirmation: this.runtime.config.toolConfirmation,
325
+ confirmToolUse: this.controllerOptions.confirmToolUse,
1217
326
  };
1218
- const permission = tool?.checkPermissions?.(action.args, toolContext);
1219
- if (permission?.behavior === 'deny' || tool?.isDestructive?.(action.args) === true) {
1220
- const reason = permission?.reason || 'Local fast path blocked a destructive tool request.';
1221
- throw new LocalFastPathBlockedError(reason);
327
+ let permission;
328
+ try {
329
+ permission = tool.checkPermissions?.(action.args, toolContext);
1222
330
  }
1223
- if (permission?.behavior === 'ask') {
1224
- throw new LocalFastPathBlockedError(permission.reason || 'Local fast path requires an allow-safe command.');
331
+ catch (error) {
332
+ const detail = error instanceof Error ? error.message : String(error);
333
+ throw new chat_presentation_1.LocalFastPathBlockedError(`Permission check failed closed: ${detail}`);
334
+ }
335
+ const effective = (0, tool_scheduler_1.resolveEffectivePermission)({
336
+ toolName: action.tool,
337
+ tool,
338
+ args: action.args,
339
+ permission,
340
+ permissionMode: effectivePermissionMode,
341
+ allowlist: toolAllowlist?.(action.tool, action.args),
342
+ toolConfirmation: this.runtime.config.toolConfirmation,
343
+ });
344
+ // Local exec is a hidden shortcut rather than a plan artifact. Even a
345
+ // read-only command must not execute through that shortcut in plan mode.
346
+ if (effectivePermissionMode === 'plan' && action.tool === 'exec_command') {
347
+ throw new chat_presentation_1.LocalFastPathBlockedError('Local run-test fast path is blocked in plan mode; switch mode before executing commands.');
348
+ }
349
+ if (effective.outcome === 'deny' || effective.outcome === 'block') {
350
+ throw new chat_presentation_1.LocalFastPathBlockedError(effective.reason ||
351
+ `Local fast path blocked by ${effective.source ?? 'permission policy'}.`);
352
+ }
353
+ if (effective.outcome === 'confirm') {
354
+ if (this.runtime.config.toolConfirmation === 'deny' ||
355
+ !this.controllerOptions.confirmToolUse) {
356
+ throw new chat_presentation_1.LocalFastPathBlockedError(effective.reason || 'Local fast path requires user confirmation.');
357
+ }
358
+ const approved = await this.controllerOptions.confirmToolUse({
359
+ name: action.tool,
360
+ args: action.args,
361
+ reason: effective.reason,
362
+ abortSignal: options.abortSignal,
363
+ });
364
+ if (!approved) {
365
+ throw new chat_presentation_1.LocalFastPathBlockedError(`Local fast path ${action.tool} requires confirmation and was denied by user.`);
366
+ }
367
+ }
368
+ if (options.abortSignal?.aborted) {
369
+ throw new chat_presentation_1.LocalFastPathBlockedError('Local fast path was cancelled before tool execution.');
1225
370
  }
1226
371
  if (sessionId) {
1227
- recordTraceEvent(this.events, sessionId, {
372
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1228
373
  turnId,
1229
374
  type: 'tool_call',
1230
375
  name: action.tool,
@@ -1242,7 +387,7 @@ class AgentChatController {
1242
387
  const outputBytes = typeof envelope.outputBytes === 'number'
1243
388
  ? envelope.outputBytes
1244
389
  : Buffer.byteLength(result, 'utf8');
1245
- const formattedLocalResult = formatLocalFastPathAssistantContent(action, result, this.runtime.cwd);
390
+ const formattedLocalResult = (0, chat_presentation_1.formatLocalFastPathAssistantContent)(action, result, this.runtime.cwd);
1246
391
  const assistantContent = formattedLocalResult.content;
1247
392
  const stats = (0, framework_1.createLocalFastPathLoopStats)({
1248
393
  finishReason: envelope.success ? 'completed' : 'failed',
@@ -1270,8 +415,8 @@ class AgentChatController {
1270
415
  this.events.append({
1271
416
  role: envelope.success ? 'tool' : 'error',
1272
417
  title: 'local',
1273
- content: toolFinishContent(localToolResultEvent),
1274
- toolActivity: structuredToolFinishActivity(localToolResultEvent, 1, {
418
+ content: (0, chat_presentation_1.toolFinishContent)(localToolResultEvent),
419
+ toolActivity: (0, chat_presentation_1.structuredToolFinishActivity)(localToolResultEvent, 1, {
1275
420
  projectPath: this.runtime.cwd,
1276
421
  turnId,
1277
422
  }),
@@ -1279,7 +424,7 @@ class AgentChatController {
1279
424
  this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
1280
425
  this.setLoopStats(stats);
1281
426
  if (sessionId) {
1282
- recordTraceEvent(this.events, sessionId, {
427
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1283
428
  turnId,
1284
429
  type: 'tool_result',
1285
430
  name: action.tool,
@@ -1292,10 +437,10 @@ class AgentChatController {
1292
437
  outputBytes,
1293
438
  modelVisibleBytes: 0,
1294
439
  artifactId: formattedLocalResult.artifactRef?.id,
1295
- error: envelope.error ? compactMiddle(envelope.error, 240) : undefined,
440
+ error: envelope.error ? (0, chat_trace_1.compactMiddle)(envelope.error, 240) : undefined,
1296
441
  });
1297
- appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
1298
- recordTraceEvent(this.events, sessionId, {
442
+ (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
443
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1299
444
  turnId,
1300
445
  type: 'complete',
1301
446
  finishReason: stats.finishReason,
@@ -1323,21 +468,21 @@ class AgentChatController {
1323
468
  this.events.setStatus('Local command failed. Ready for the next input.');
1324
469
  const assistantContent = `Local fast path failed for ${action.label}.\n\n${message}`;
1325
470
  this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
1326
- const finishReason = error instanceof LocalFastPathBlockedError ? 'blocked' : 'failed';
471
+ const finishReason = error instanceof chat_presentation_1.LocalFastPathBlockedError ? 'blocked' : 'failed';
1327
472
  const stats = (0, framework_1.createLocalFastPathLoopStats)({
1328
473
  finishReason,
1329
474
  toolCalls: 0,
1330
475
  });
1331
476
  this.setLoopStats(stats);
1332
477
  if (sessionId) {
1333
- recordTraceEvent(this.events, sessionId, {
478
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1334
479
  turnId,
1335
480
  type: 'error',
1336
481
  name: action.tool,
1337
- error: compactTraceError(error),
482
+ error: (0, chat_trace_1.compactTraceError)(error),
1338
483
  });
1339
- appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
1340
- recordTraceEvent(this.events, sessionId, {
484
+ (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
485
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1341
486
  turnId,
1342
487
  type: 'complete',
1343
488
  finishReason: stats.finishReason,
@@ -1367,8 +512,9 @@ class AgentChatController {
1367
512
  ensureSession: this.runtime.ensureSession,
1368
513
  setSession: session => {
1369
514
  this.runtime.setSession(session);
515
+ (0, chat_effort_1.applySessionEffort)(this.runtime, this.events, session);
1370
516
  const renderer = this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer ?? 'terminal';
1371
- this.events.replaceTranscript(sessionMessagesToTranscriptEntries(session.id, {
517
+ this.events.replaceTranscript((0, chat_presentation_1.sessionMessagesToTranscriptEntries)(session.id, {
1372
518
  includeToolOutputViews: renderer === 'tui',
1373
519
  }));
1374
520
  },
@@ -1423,7 +569,7 @@ class AgentChatController {
1423
569
  if (sessionId) {
1424
570
  const traceType = stateToTraceType[event.state];
1425
571
  if (traceType) {
1426
- recordTraceEvent(this.events, sessionId, {
572
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1427
573
  turnId: String(turnId),
1428
574
  type: traceType,
1429
575
  name: `${event.role}:${event.taskId}`,
@@ -1501,11 +647,16 @@ class AgentChatController {
1501
647
  // any provider request so failures without usage cannot inherit stale data.
1502
648
  this.runtime.store.setState({ tokenUsage: null });
1503
649
  const abortSignal = options.abortSignal;
1504
- const turnId = traceTurnId(options.turnId);
650
+ const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
1505
651
  const activeSession = this.runtime.getSession() ??
1506
652
  this.runtime.ensureSession() ??
1507
653
  (0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
1508
654
  const sessionId = activeSession?.id;
655
+ (0, observability_1.setDiagnosticTraceContext)({
656
+ traceId: `${sessionId ?? 'unsaved'}:${turnId}`,
657
+ ...(sessionId ? { sessionId } : {}),
658
+ turnId,
659
+ });
1509
660
  const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
1510
661
  const runtimeTools = (0, tools_1.getRuntimeTools)();
1511
662
  const skillResolution = (0, skills_1.resolveSkillsForTurn)({
@@ -1523,19 +674,20 @@ class AgentChatController {
1523
674
  timestamp: Date.now(),
1524
675
  appliedSkills: appliedSkillNames.length > 0 ? appliedSkillNames : undefined,
1525
676
  });
1526
- recordTraceEvent(this.events, sessionId, {
677
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1527
678
  turnId,
1528
679
  type: 'turn_start',
1529
- inputBytes: byteLength(input),
680
+ inputBytes: (0, chat_trace_1.byteLength)(input),
1530
681
  note: appliedSkillNames.length > 0 ? `skills=${appliedSkillNames.join(',')}` : undefined,
1531
682
  });
1532
- appendWorkspaceSnapshotTrace(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
683
+ (0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
1533
684
  }
1534
685
  if (options.persistAsUserMessage !== false) {
1535
686
  this.runtime.store.addMessage({ role: 'user', content: input });
1536
687
  }
1537
688
  (0, prompt_context_1.refreshProjectInstructions)(this.runtime.store, this.runtime.cwd);
1538
689
  const snapshot = this.runtime.store.getSnapshot();
690
+ const effectivePermissionMode = this.runtime.store.getEffectivePermissionMode();
1539
691
  const harness = (0, harness_1.createContextHarness)({
1540
692
  cwd: this.runtime.cwd,
1541
693
  modelId: this.runtime.llm.getModel(),
@@ -1576,7 +728,7 @@ class AgentChatController {
1576
728
  onSubtaskEvent: event => {
1577
729
  this.handleSubtaskEvent(event, sessionId, turnId);
1578
730
  },
1579
- onSubtaskResult: (result, _batchId, objective) => {
731
+ onSubtaskResult: (result, _batchId, objective, researchContext) => {
1580
732
  if (!projectPath)
1581
733
  return;
1582
734
  const json = JSON.stringify(result);
@@ -1586,7 +738,7 @@ class AgentChatController {
1586
738
  // The subtask state transition (subtask_completed) is already
1587
739
  // emitted by handleSubtaskEvent above.
1588
740
  if (sessionId) {
1589
- recordTraceEvent(this.events, sessionId, {
741
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1590
742
  turnId: String(turnId),
1591
743
  type: 'subtask_artifact_stored',
1592
744
  name: `${result.role}:${result.id}`,
@@ -1606,19 +758,38 @@ class AgentChatController {
1606
758
  const goal = this.goalCoordinator?.goal;
1607
759
  const objectiveRevision = goal?.contract?.objectiveRevision;
1608
760
  const hasGoalBinding = typeof goal?.goalId === 'string' && typeof objectiveRevision === 'number';
1609
- const request = (0, subagents_1.createLocalResearchRequest)(objective?.trim() || result.summary || 'repository research', projectPath, hasGoalBinding
1610
- ? {
1611
- goalBinding: {
1612
- goalId: goal.goalId,
1613
- objectiveRevision,
1614
- },
1615
- }
1616
- : undefined);
761
+ // Preserve the authoritative request produced from the
762
+ // original subtask capability. Reconstruct local-only only for
763
+ // legacy callers that predate the additive callback context.
764
+ const baseRequest = researchContext?.request ??
765
+ (0, subagents_1.createLocalResearchRequest)(objective?.trim() || result.summary || 'repository research', projectPath);
766
+ const request = {
767
+ ...baseRequest,
768
+ scope: { ...baseRequest.scope, projectRoot: projectPath },
769
+ ...(hasGoalBinding
770
+ ? {
771
+ goalBinding: {
772
+ goalId: goal.goalId,
773
+ objectiveRevision,
774
+ },
775
+ }
776
+ : {}),
777
+ };
1617
778
  const packet = (0, subagents_1.subtaskResultToPacket)(result, request, {
1618
779
  projectPath,
1619
780
  sessionId,
1620
781
  ...(hasGoalBinding ? { goalId: goal.goalId, objectiveRevision } : {}),
782
+ }, {
783
+ externalSources: researchContext?.web?.sources,
784
+ externalNotes: researchContext?.web?.notes,
785
+ externalTimedOut: researchContext?.web?.timedOut,
786
+ externalAborted: researchContext?.web?.aborted,
1621
787
  });
788
+ // Citation resolution can downgrade claims and mark superseded
789
+ // same-URL sources stale. Resolve before validation/persistence so
790
+ // the CAS token, durable packet and renderer view describe the
791
+ // exact same final state (#105).
792
+ const resolution = (0, subagents_1.resolveCitations)(packet);
1622
793
  const validation = (0, subagents_1.validatePacket)(packet);
1623
794
  if (!validation.ok)
1624
795
  return;
@@ -1628,12 +799,11 @@ class AgentChatController {
1628
799
  packetId: packet.packetId,
1629
800
  ...(packet.goalId ? { goalId: packet.goalId } : {}),
1630
801
  });
1631
- const resolution = (0, subagents_1.resolveCitations)(packet);
1632
802
  const view = (0, subagents_1.buildResearchView)(packet, resolution);
1633
803
  for (const event of (0, subagents_1.toLifecycleEvents)(view, resolution)) {
1634
804
  this.events.researchEvent?.(event);
1635
805
  }
1636
- recordTraceEvent(this.events, sessionId, {
806
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1637
807
  turnId: String(turnId),
1638
808
  type: 'subtask_artifact_stored',
1639
809
  name: `research:${packet.packetId}`,
@@ -1690,8 +860,8 @@ class AgentChatController {
1690
860
  let pendingCompact;
1691
861
  const verificationResults = [];
1692
862
  const sessionMessagesToRecord = [];
1693
- const assistantStream = createAssistantStreamPresenter(this.events, abortSignal);
1694
- const toolEvents = createToolEventPresenter(this.events, {
863
+ const assistantStream = (0, chat_presentation_1.createAssistantStreamPresenter)(this.events, abortSignal);
864
+ const toolEvents = (0, chat_presentation_1.createToolEventPresenter)(this.events, {
1695
865
  projectPath: this.runtime.cwd,
1696
866
  turnId,
1697
867
  });
@@ -1731,6 +901,12 @@ class AgentChatController {
1731
901
  },
1732
902
  sessionId,
1733
903
  turnId,
904
+ // Tools that fan out to other tools (batch_read) have to re-run the
905
+ // permission gate per sub-step; they need the mode and the allowlist.
906
+ permissionMode: effectivePermissionMode,
907
+ toolAllowlist: this.resolveToolAllowlist(),
908
+ toolConfirmation: this.runtime.config.toolConfirmation,
909
+ confirmToolUse: this.controllerOptions.confirmToolUse,
1734
910
  });
1735
911
  };
1736
912
  const loopBudget = (0, loop_budget_1.resolveRuntimeLoopBudget)(input, this.runtime.config, harness.toJSON());
@@ -1769,7 +945,7 @@ class AgentChatController {
1769
945
  llm: this.runtime.llm,
1770
946
  streamCallbacks,
1771
947
  costTracker: snapshot.costTracker,
1772
- permissionMode: snapshot.permissionMode,
948
+ permissionMode: effectivePermissionMode,
1773
949
  toolConfirmation: this.runtime.config.toolConfirmation,
1774
950
  toolAllowlist: this.resolveToolAllowlist(),
1775
951
  confirmToolUse: this.controllerOptions.confirmToolUse,
@@ -1781,6 +957,10 @@ class AgentChatController {
1781
957
  },
1782
958
  sessionId,
1783
959
  turnId,
960
+ permissionMode: effectivePermissionMode,
961
+ toolAllowlist: this.resolveToolAllowlist(),
962
+ toolConfirmation: this.runtime.config.toolConfirmation,
963
+ confirmToolUse: this.controllerOptions.confirmToolUse,
1784
964
  },
1785
965
  abortSignal,
1786
966
  harness,
@@ -1798,7 +978,7 @@ class AgentChatController {
1798
978
  assistantStream.discardSegment();
1799
979
  this.events.setStatus((0, agent_status_1.agentStepStatus)(event.turn));
1800
980
  if (sessionId) {
1801
- recordTraceEvent(this.events, sessionId, {
981
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1802
982
  turnId,
1803
983
  type: 'request_start',
1804
984
  model: event.model,
@@ -1808,7 +988,7 @@ class AgentChatController {
1808
988
  break;
1809
989
  case 'prompt_assembly':
1810
990
  if (sessionId) {
1811
- recordTraceEvent(this.events, sessionId, {
991
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1812
992
  turnId,
1813
993
  type: 'prompt_assembly',
1814
994
  promptModelId: event.modelId,
@@ -1832,7 +1012,7 @@ class AgentChatController {
1832
1012
  {
1833
1013
  const batchReadOnlyCount = event.toolCalls.filter(tc => {
1834
1014
  const def = skillResolution.tools.find(t => t.name === tc.function.name);
1835
- const args = parseToolCallArgsForRuntime(tc);
1015
+ const args = (0, chat_checkpoint_1.parseToolCallArgsForRuntime)(tc);
1836
1016
  return args && def?.isReadOnly?.(args) === true;
1837
1017
  }).length;
1838
1018
  const suggestion = (0, agent_status_1.batchingSuggestion)(batchReadOnlyCount);
@@ -1840,8 +1020,8 @@ class AgentChatController {
1840
1020
  this.events.append({ role: 'status', content: suggestion });
1841
1021
  }
1842
1022
  }
1843
- const checkpointId = checkpointSequence === 0 ? turnId : `${turnId}-checkpoint-${checkpointSequence + 1}`;
1844
- const checkpointResult = createPreToolCheckpoint(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
1023
+ const checkpointId = `${turnId}-${checkpointSequence + 1}-${(0, crypto_1.randomUUID)()}`;
1024
+ const checkpointResult = (0, chat_checkpoint_1.createPreToolCheckpoint)(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
1845
1025
  if (checkpointResult.created) {
1846
1026
  checkpointIds.push(checkpointId);
1847
1027
  checkpointSequence++;
@@ -1863,11 +1043,11 @@ class AgentChatController {
1863
1043
  });
1864
1044
  }
1865
1045
  if (sessionId) {
1866
- recordTraceEvent(this.events, sessionId, {
1046
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1867
1047
  turnId,
1868
1048
  type: 'assistant_tool_calls',
1869
1049
  toolCallCount: event.toolCalls.length,
1870
- contentBytes: byteLength(event.content || ''),
1050
+ contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1871
1051
  });
1872
1052
  }
1873
1053
  sessionMessagesToRecord.push({
@@ -1891,8 +1071,8 @@ class AgentChatController {
1891
1071
  assistantStream.closeSegment();
1892
1072
  toolEvents.start(event);
1893
1073
  if (sessionId) {
1894
- const traceArgs = buildTraceArgsDetails(this.runtime.cwd, event.name, event.args);
1895
- recordTraceEvent(this.events, sessionId, {
1074
+ const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, event.name, event.args);
1075
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1896
1076
  turnId,
1897
1077
  type: 'tool_call',
1898
1078
  name: event.name,
@@ -1905,17 +1085,17 @@ class AgentChatController {
1905
1085
  break;
1906
1086
  case 'permission_decision':
1907
1087
  if (sessionId) {
1908
- recordTraceEvent(this.events, sessionId, {
1088
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1909
1089
  turnId,
1910
1090
  type: 'permission_decision',
1911
1091
  name: event.name,
1912
1092
  callId: event.callId,
1913
- argsSummary: compactToolArgs(event.args),
1093
+ argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
1914
1094
  permissionBehavior: event.decision.behavior,
1915
1095
  permissionApproved: event.decision.approved,
1916
1096
  permissionSource: event.decision.source,
1917
1097
  permissionReason: event.decision.reason
1918
- ? compactMiddle(event.decision.reason, 240)
1098
+ ? (0, chat_trace_1.compactMiddle)(event.decision.reason, 240)
1919
1099
  : undefined,
1920
1100
  permissionDuration: event.decision.duration,
1921
1101
  batchCount: event.batchCount,
@@ -1924,22 +1104,22 @@ class AgentChatController {
1924
1104
  }
1925
1105
  break;
1926
1106
  case 'tool_result': {
1927
- observedToolResultBytes += event.outputBytes ?? byteLength(event.result);
1928
- observedModelVisibleToolBytes += byteLength(event.modelVisibleResult);
1107
+ observedToolResultBytes += event.outputBytes ?? (0, chat_trace_1.byteLength)(event.result);
1108
+ observedModelVisibleToolBytes += (0, chat_trace_1.byteLength)(event.modelVisibleResult);
1929
1109
  toolEvents.finish(event);
1930
1110
  if (sessionId) {
1931
- recordTraceEvent(this.events, sessionId, {
1111
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1932
1112
  turnId,
1933
1113
  type: 'tool_result',
1934
1114
  name: event.name,
1935
1115
  callId: event.callId,
1936
- argsSummary: compactToolArgs(event.args),
1116
+ argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
1937
1117
  success: event.success,
1938
1118
  duration: event.duration,
1939
1119
  outputBytes: event.outputBytes,
1940
- modelVisibleBytes: byteLength(event.modelVisibleResult),
1120
+ modelVisibleBytes: (0, chat_trace_1.byteLength)(event.modelVisibleResult),
1941
1121
  artifactId: event.artifactRef?.id,
1942
- error: event.error ? compactMiddle(event.error, 240) : undefined,
1122
+ error: event.error ? (0, chat_trace_1.compactMiddle)(event.error, 240) : undefined,
1943
1123
  batchCount: event.batchCount,
1944
1124
  batchIndex: event.batchIndex,
1945
1125
  });
@@ -1953,7 +1133,7 @@ class AgentChatController {
1953
1133
  });
1954
1134
  if (verificationResult) {
1955
1135
  verificationResults.push(verificationResult);
1956
- appendVerificationResultTrace(this.events, sessionId, turnId, verificationResult);
1136
+ (0, chat_workspace_1.appendVerificationResultTrace)(this.events, sessionId, turnId, verificationResult);
1957
1137
  }
1958
1138
  sessionMessagesToRecord.push({
1959
1139
  role: 'tool',
@@ -1967,10 +1147,10 @@ class AgentChatController {
1967
1147
  case 'strategy_exhausted':
1968
1148
  this.events.append({ role: 'status', content: event.suggestion });
1969
1149
  if (sessionId) {
1970
- recordTraceEvent(this.events, sessionId, {
1150
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1971
1151
  turnId,
1972
1152
  type: 'strategy_exhausted',
1973
- note: compactMiddle(event.suggestion, 240),
1153
+ note: (0, chat_trace_1.compactMiddle)(event.suggestion, 240),
1974
1154
  });
1975
1155
  }
1976
1156
  break;
@@ -1986,10 +1166,10 @@ class AgentChatController {
1986
1166
  finalContent = event.content;
1987
1167
  assistantStream.ensureMessage(event.content);
1988
1168
  if (sessionId) {
1989
- recordTraceEvent(this.events, sessionId, {
1169
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1990
1170
  turnId,
1991
1171
  type: 'message',
1992
- contentBytes: byteLength(event.content),
1172
+ contentBytes: (0, chat_trace_1.byteLength)(event.content),
1993
1173
  });
1994
1174
  }
1995
1175
  if (event.content) {
@@ -2023,12 +1203,12 @@ class AgentChatController {
2023
1203
  pendingCompact = event.compact;
2024
1204
  if (event.stats) {
2025
1205
  pendingCompleteStats = event.stats;
2026
- recordProviderTraceEvents(this.events, sessionId, turnId, event.stats);
1206
+ (0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, event.stats);
2027
1207
  pendingCompleteTrace = {
2028
1208
  turnId,
2029
1209
  type: 'complete',
2030
1210
  model: event.model,
2031
- contentBytes: byteLength(event.content || ''),
1211
+ contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
2032
1212
  finishReason: event.stats.finishReason,
2033
1213
  llmRequests: event.stats.llmRequests,
2034
1214
  toolCalls: event.stats.toolCalls,
@@ -2052,7 +1232,7 @@ class AgentChatController {
2052
1232
  turnId,
2053
1233
  type: 'complete',
2054
1234
  model: event.model,
2055
- contentBytes: byteLength(event.content || ''),
1235
+ contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
2056
1236
  };
2057
1237
  }
2058
1238
  break;
@@ -2063,7 +1243,7 @@ class AgentChatController {
2063
1243
  const stats = pendingCompleteStats ??
2064
1244
  (0, framework_1.createFailedLoopStats)({
2065
1245
  loopBudget,
2066
- diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
1246
+ diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
2067
1247
  turnsStarted: observedTurnsStarted,
2068
1248
  llmRequests: observedLlmRequests,
2069
1249
  toolCalls: observedToolCalls,
@@ -2075,16 +1255,16 @@ class AgentChatController {
2075
1255
  persistInterruptedAccounting(finalUsage, stats, finalUsage !== undefined || stats.llmRequests === 0);
2076
1256
  assistantStream.discardSegment();
2077
1257
  this.events.setStatus('Interrupted.');
2078
- removeTrailingUserMessage(this.runtime);
1258
+ (0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
2079
1259
  if (sessionId) {
2080
- const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2081
- recordTraceEvent(this.events, sessionId, {
1260
+ const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1261
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2082
1262
  turnId,
2083
1263
  type: 'aborted',
2084
1264
  note: 'aborted_after_query',
2085
1265
  });
2086
- const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
2087
- ? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
1266
+ const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1267
+ ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
2088
1268
  : undefined;
2089
1269
  if (recoveryNotice) {
2090
1270
  this.events.append({
@@ -2105,15 +1285,15 @@ class AgentChatController {
2105
1285
  }
2106
1286
  assistantStream.closeSegment();
2107
1287
  if (sessionId) {
2108
- const { profile, summary } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1288
+ const { profile, summary } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2109
1289
  if (profile.changedFiles.length > 0 && profile.required) {
2110
1290
  this.events.setStatus((0, agent_status_1.verifyingStatus)(profile.profile));
2111
1291
  this.controllerOptions.onVerificationStateChange?.('running');
2112
1292
  }
2113
- if (shouldRecordVerificationLoopStats(profile, summary)) {
1293
+ if ((0, chat_workspace_1.shouldRecordVerificationLoopStats)(profile, summary)) {
2114
1294
  const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
2115
1295
  if (stats) {
2116
- pendingCompleteStats = withVerificationLoopStats(stats, summary);
1296
+ pendingCompleteStats = (0, chat_workspace_1.withVerificationLoopStats)(stats, summary);
2117
1297
  }
2118
1298
  }
2119
1299
  if ((0, verification_profile_1.shouldGateCompletion)(summary)) {
@@ -2127,16 +1307,16 @@ class AgentChatController {
2127
1307
  content: notice,
2128
1308
  });
2129
1309
  finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
2130
- appendAssistantNotice(sessionMessagesToRecord, notice);
1310
+ (0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
2131
1311
  if (pendingCompleteTrace) {
2132
1312
  pendingCompleteTrace.finishReason = 'completion_gate';
2133
- pendingCompleteTrace.contentBytes = byteLength(finalContent);
1313
+ pendingCompleteTrace.contentBytes = (0, chat_trace_1.byteLength)(finalContent);
2134
1314
  pendingCompleteTrace.note = 'verification_incomplete';
2135
1315
  }
2136
1316
  const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
2137
1317
  if (stats) {
2138
1318
  pendingCompleteStats = {
2139
- ...withVerificationLoopStats(stats, summary),
1319
+ ...(0, chat_workspace_1.withVerificationLoopStats)(stats, summary),
2140
1320
  finishReason: 'completion_gate',
2141
1321
  };
2142
1322
  }
@@ -2175,7 +1355,7 @@ class AgentChatController {
2175
1355
  content: notice,
2176
1356
  });
2177
1357
  finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
2178
- appendAssistantNotice(sessionMessagesToRecord, notice);
1358
+ (0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
2179
1359
  }
2180
1360
  if (pendingCompleteStats) {
2181
1361
  this.setLoopStats(this.foldSubagentUsage(pendingCompleteStats, subagentBundle));
@@ -2212,7 +1392,7 @@ class AgentChatController {
2212
1392
  }
2213
1393
  this.runtime.store.setContextUsage(pendingCompact.after);
2214
1394
  if (sessionId) {
2215
- recordTraceEvent(this.events, sessionId, {
1395
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2216
1396
  turnId,
2217
1397
  type: 'compact_completed',
2218
1398
  checkpointId: committedCheckpointId,
@@ -2229,11 +1409,11 @@ class AgentChatController {
2229
1409
  }
2230
1410
  catch (error) {
2231
1411
  if (sessionId) {
2232
- recordTraceEvent(this.events, sessionId, {
1412
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2233
1413
  turnId,
2234
1414
  type: 'compact_failed',
2235
1415
  model: finalModel || this.runtime.llm.getModel(),
2236
- error: compactTraceError(error),
1416
+ error: (0, chat_trace_1.compactTraceError)(error),
2237
1417
  note: pendingCompact.mode,
2238
1418
  });
2239
1419
  }
@@ -2264,10 +1444,10 @@ class AgentChatController {
2264
1444
  });
2265
1445
  const harnessState = harness.toJSON();
2266
1446
  this.runtime.store.setState({ harnessState });
2267
- emitHarnessDiagnostics(this.events, harnessState);
1447
+ (0, chat_trace_1.emitHarnessDiagnostics)(this.events, harnessState);
2268
1448
  if (sessionId) {
2269
1449
  if (pendingCompleteTrace) {
2270
- recordTraceEvent(this.events, sessionId, pendingCompleteTrace);
1450
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, pendingCompleteTrace);
2271
1451
  }
2272
1452
  (0, session_storage_1.updateSessionSkills)(sessionId, appliedSkillNames);
2273
1453
  (0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
@@ -2280,7 +1460,7 @@ class AgentChatController {
2280
1460
  }
2281
1461
  catch (error) {
2282
1462
  // v0.2.25: Provider retry exhausted is a recoverable turn failure.
2283
- if (error instanceof Error && error.name === 'ProviderRetryExhaustedError') {
1463
+ if (error instanceof provider_resilience_1.ProviderRetryExhaustedError) {
2284
1464
  const diag = error.diagnostics;
2285
1465
  const attempts = diag?.attempts?.length ?? '?';
2286
1466
  const kind = diag?.attempts?.[diag.attempts.length - 1]?.failureKind ?? 'unknown';
@@ -2304,12 +1484,12 @@ class AgentChatController {
2304
1484
  }
2305
1485
  return;
2306
1486
  }
2307
- if (isAbortError(error, abortSignal)) {
1487
+ if ((0, chat_trace_1.isAbortError)(error, abortSignal)) {
2308
1488
  const interruptedStats = error instanceof framework_1.QueryLoopError
2309
1489
  ? error.stats
2310
1490
  : (0, framework_1.createFailedLoopStats)({
2311
1491
  loopBudget,
2312
- diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
1492
+ diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
2313
1493
  turnsStarted: observedTurnsStarted,
2314
1494
  llmRequests: observedLlmRequests,
2315
1495
  toolCalls: observedToolCalls,
@@ -2325,16 +1505,16 @@ class AgentChatController {
2325
1505
  persistInterruptedAccounting(interruptedRootUsage, interruptedStats, interruptedStats.llmRequests === 0);
2326
1506
  assistantStream.discardSegment();
2327
1507
  this.events.setStatus('Interrupted.');
2328
- removeTrailingUserMessage(this.runtime);
1508
+ (0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
2329
1509
  if (sessionId) {
2330
- const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2331
- recordTraceEvent(this.events, sessionId, {
1510
+ const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1511
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2332
1512
  turnId,
2333
1513
  type: 'aborted',
2334
1514
  note: 'abort_error',
2335
1515
  });
2336
- const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
2337
- ? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
1516
+ const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1517
+ ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
2338
1518
  : undefined;
2339
1519
  if (recoveryNotice) {
2340
1520
  this.events.append({
@@ -2351,15 +1531,15 @@ class AgentChatController {
2351
1531
  assistantStream.discardSegment();
2352
1532
  this.events.append({
2353
1533
  role: 'error',
2354
- content: formatChatError(error),
2355
- errorLayer: errorLayerForChatError(error),
1534
+ content: (0, chat_trace_1.formatChatError)(error),
1535
+ errorLayer: (0, chat_trace_1.errorLayerForChatError)(error),
2356
1536
  });
2357
1537
  this.events.setStatus('Turn failed. Ready for the next input.');
2358
1538
  const failedStats = this.foldSubagentUsage(error instanceof framework_1.QueryLoopError
2359
1539
  ? error.stats
2360
1540
  : (0, framework_1.createFailedLoopStats)({
2361
1541
  loopBudget,
2362
- diagnostics: observedLlmRequests > 0 ? getLastRequestDiagnostics(this.runtime.llm) : undefined,
1542
+ diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
2363
1543
  turnsStarted: observedTurnsStarted,
2364
1544
  llmRequests: observedLlmRequests,
2365
1545
  toolCalls: observedToolCalls,
@@ -2379,10 +1559,10 @@ class AgentChatController {
2379
1559
  }
2380
1560
  this.setLoopStats(failedStats);
2381
1561
  if (sessionId) {
2382
- recordProviderTraceEvents(this.events, sessionId, turnId, failedStats);
2383
- const { delta } = appendPostWorkspaceTrace(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
2384
- const recoveryNotice = workspaceDeltaHasTurnChanges(delta)
2385
- ? formatFailureRecoveryNotice(turnId, delta, checkpointIds)
1562
+ (0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, failedStats);
1563
+ const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1564
+ const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1565
+ ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
2386
1566
  : undefined;
2387
1567
  if (recoveryNotice) {
2388
1568
  this.events.append({
@@ -2392,13 +1572,13 @@ class AgentChatController {
2392
1572
  content: recoveryNotice,
2393
1573
  });
2394
1574
  }
2395
- recordTraceEvent(this.events, sessionId, {
1575
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2396
1576
  turnId,
2397
1577
  type: 'error',
2398
- error: compactTraceError(error),
1578
+ error: (0, chat_trace_1.compactTraceError)(error),
2399
1579
  note: recoveryNotice,
2400
1580
  });
2401
- recordTraceEvent(this.events, sessionId, {
1581
+ (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
2402
1582
  turnId,
2403
1583
  type: 'complete',
2404
1584
  model: failedStats.providerFinalModel ?? this.runtime.llm.getModel(),
@@ -2418,6 +1598,12 @@ class AgentChatController {
2418
1598
  localFastPathUsed: failedStats.localFastPathUsed,
2419
1599
  });
2420
1600
  (0, session_storage_1.removeLastIncompleteAssistantMessage)(sessionId);
1601
+ // A failed turn must not leave the user's prompt dangling in the
1602
+ // persisted session (it would replay on resume). The in-memory history
1603
+ // is cleaned above (2969-2972); mirror that for the on-disk transcript.
1604
+ if (options.persistAsUserMessage !== false) {
1605
+ (0, session_storage_1.removeTrailingSessionUserMessage)(sessionId);
1606
+ }
2421
1607
  }
2422
1608
  const history = this.runtime.store.getSnapshot().conversationHistory;
2423
1609
  if (history.length > 0) {