@orion-agents/orion-code 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (861) hide show
  1. package/CHANGELOG.md +495 -0
  2. package/README.md +142 -314
  3. package/README.zh-CN.md +117 -559
  4. package/dist/cli.js +71 -90
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/context-commands.d.ts.map +1 -1
  7. package/dist/commands/context-commands.js +14 -7
  8. package/dist/commands/context-commands.js.map +1 -1
  9. package/dist/commands/context-tool-command-handlers.d.ts +4 -5
  10. package/dist/commands/context-tool-command-handlers.d.ts.map +1 -1
  11. package/dist/commands/context-tool-command-handlers.js +174 -208
  12. package/dist/commands/context-tool-command-handlers.js.map +1 -1
  13. package/dist/commands/core-command-handlers.d.ts +3 -6
  14. package/dist/commands/core-command-handlers.d.ts.map +1 -1
  15. package/dist/commands/core-command-handlers.js +66 -664
  16. package/dist/commands/core-command-handlers.js.map +1 -1
  17. package/dist/commands/diagnostic-command-handlers.d.ts +1 -2
  18. package/dist/commands/diagnostic-command-handlers.d.ts.map +1 -1
  19. package/dist/commands/diagnostic-command-handlers.js +3 -17
  20. package/dist/commands/diagnostic-command-handlers.js.map +1 -1
  21. package/dist/commands/diagnostic-commands.d.ts.map +1 -1
  22. package/dist/commands/diagnostic-commands.js +0 -45
  23. package/dist/commands/diagnostic-commands.js.map +1 -1
  24. package/dist/commands/index.d.ts +1 -1
  25. package/dist/commands/index.d.ts.map +1 -1
  26. package/dist/commands/index.js +2 -7
  27. package/dist/commands/index.js.map +1 -1
  28. package/dist/commands/model-command-handlers.d.ts +2 -2
  29. package/dist/commands/model-command-handlers.d.ts.map +1 -1
  30. package/dist/commands/model-command-handlers.js +168 -3
  31. package/dist/commands/model-command-handlers.js.map +1 -1
  32. package/dist/commands/model-commands.d.ts.map +1 -1
  33. package/dist/commands/model-commands.js +0 -11
  34. package/dist/commands/model-commands.js.map +1 -1
  35. package/dist/commands/registry.d.ts.map +1 -1
  36. package/dist/commands/registry.js +1 -139
  37. package/dist/commands/registry.js.map +1 -1
  38. package/dist/commands/session-command-handlers.d.ts.map +1 -1
  39. package/dist/commands/session-command-handlers.js +35 -119
  40. package/dist/commands/session-command-handlers.js.map +1 -1
  41. package/dist/commands/session-commands.d.ts.map +1 -1
  42. package/dist/commands/session-commands.js +2 -50
  43. package/dist/commands/session-commands.js.map +1 -1
  44. package/dist/commands/target-command.d.ts +9 -15
  45. package/dist/commands/target-command.d.ts.map +1 -1
  46. package/dist/commands/target-command.js +16 -130
  47. package/dist/commands/target-command.js.map +1 -1
  48. package/dist/commands/tool-commands.d.ts.map +1 -1
  49. package/dist/commands/tool-commands.js +0 -10
  50. package/dist/commands/tool-commands.js.map +1 -1
  51. package/dist/commands/types.d.ts +14 -14
  52. package/dist/commands/types.d.ts.map +1 -1
  53. package/dist/commands/types.js +1 -1
  54. package/dist/commands/types.js.map +1 -1
  55. package/dist/commands/workflow-command-handlers.d.ts.map +1 -1
  56. package/dist/commands/workflow-command-handlers.js +1 -3
  57. package/dist/commands/workflow-command-handlers.js.map +1 -1
  58. package/dist/commands/workflow-commands.d.ts.map +1 -1
  59. package/dist/commands/workflow-commands.js +2 -24
  60. package/dist/commands/workflow-commands.js.map +1 -1
  61. package/dist/framework/agent-mode.d.ts +2 -3
  62. package/dist/framework/agent-mode.d.ts.map +1 -1
  63. package/dist/framework/agent-mode.js +8 -31
  64. package/dist/framework/agent-mode.js.map +1 -1
  65. package/dist/framework/index.d.ts +8 -6
  66. package/dist/framework/index.d.ts.map +1 -1
  67. package/dist/framework/index.js +14 -9
  68. package/dist/framework/index.js.map +1 -1
  69. package/dist/framework/loop-budget-contract.d.ts +20 -0
  70. package/dist/framework/loop-budget-contract.d.ts.map +1 -0
  71. package/dist/framework/loop-budget-contract.js +13 -0
  72. package/dist/framework/loop-budget-contract.js.map +1 -0
  73. package/dist/framework/prompt.d.ts.map +1 -1
  74. package/dist/framework/prompt.js +5 -4
  75. package/dist/framework/prompt.js.map +1 -1
  76. package/dist/framework/query.d.ts +71 -26
  77. package/dist/framework/query.d.ts.map +1 -1
  78. package/dist/framework/query.js +371 -102
  79. package/dist/framework/query.js.map +1 -1
  80. package/dist/framework/stop-decision.d.ts +56 -0
  81. package/dist/framework/stop-decision.d.ts.map +1 -0
  82. package/dist/framework/stop-decision.js +36 -0
  83. package/dist/framework/stop-decision.js.map +1 -0
  84. package/dist/framework/store.d.ts +4 -2
  85. package/dist/framework/store.d.ts.map +1 -1
  86. package/dist/framework/store.js +1 -0
  87. package/dist/framework/store.js.map +1 -1
  88. package/dist/framework/tool-call-orchestrator.d.ts +80 -0
  89. package/dist/framework/tool-call-orchestrator.d.ts.map +1 -0
  90. package/dist/framework/tool-call-orchestrator.js +192 -0
  91. package/dist/framework/tool-call-orchestrator.js.map +1 -0
  92. package/dist/framework/tool-state.d.ts +12 -11
  93. package/dist/framework/tool-state.d.ts.map +1 -1
  94. package/dist/framework/tool-state.js +36 -28
  95. package/dist/framework/tool-state.js.map +1 -1
  96. package/dist/framework/tool.d.ts +0 -9
  97. package/dist/framework/tool.d.ts.map +1 -1
  98. package/dist/framework/tool.js.map +1 -1
  99. package/dist/harness/assembler.d.ts.map +1 -1
  100. package/dist/harness/assembler.js +77 -19
  101. package/dist/harness/assembler.js.map +1 -1
  102. package/dist/harness/capability-profile.d.ts +3 -0
  103. package/dist/harness/capability-profile.d.ts.map +1 -0
  104. package/dist/harness/capability-profile.js +44 -0
  105. package/dist/harness/capability-profile.js.map +1 -0
  106. package/dist/harness/capsule.d.ts.map +1 -1
  107. package/dist/harness/capsule.js +22 -3
  108. package/dist/harness/capsule.js.map +1 -1
  109. package/dist/harness/compact-benchmark-corpus.d.ts +10 -0
  110. package/dist/harness/compact-benchmark-corpus.d.ts.map +1 -0
  111. package/dist/harness/compact-benchmark-corpus.js +56 -0
  112. package/dist/harness/compact-benchmark-corpus.js.map +1 -0
  113. package/dist/harness/context-harness.d.ts +23 -3
  114. package/dist/harness/context-harness.d.ts.map +1 -1
  115. package/dist/harness/context-harness.js +183 -11
  116. package/dist/harness/context-harness.js.map +1 -1
  117. package/dist/harness/contract.d.ts.map +1 -1
  118. package/dist/harness/contract.js +106 -11
  119. package/dist/harness/contract.js.map +1 -1
  120. package/dist/harness/drift-guard.d.ts +2 -1
  121. package/dist/harness/drift-guard.d.ts.map +1 -1
  122. package/dist/harness/drift-guard.js +315 -20
  123. package/dist/harness/drift-guard.js.map +1 -1
  124. package/dist/harness/evidence.d.ts.map +1 -1
  125. package/dist/harness/evidence.js +25 -12
  126. package/dist/harness/evidence.js.map +1 -1
  127. package/dist/harness/index.d.ts +7 -2
  128. package/dist/harness/index.d.ts.map +1 -1
  129. package/dist/harness/index.js +19 -1
  130. package/dist/harness/index.js.map +1 -1
  131. package/dist/harness/ledger.d.ts.map +1 -1
  132. package/dist/harness/ledger.js +44 -14
  133. package/dist/harness/ledger.js.map +1 -1
  134. package/dist/harness/progress-controller.d.ts +14 -0
  135. package/dist/harness/progress-controller.d.ts.map +1 -0
  136. package/dist/harness/progress-controller.js +110 -0
  137. package/dist/harness/progress-controller.js.map +1 -0
  138. package/dist/harness/state.d.ts.map +1 -1
  139. package/dist/harness/state.js +5 -2
  140. package/dist/harness/state.js.map +1 -1
  141. package/dist/harness/stop-controller.d.ts +15 -0
  142. package/dist/harness/stop-controller.d.ts.map +1 -0
  143. package/dist/harness/stop-controller.js +87 -0
  144. package/dist/harness/stop-controller.js.map +1 -0
  145. package/dist/harness/types.d.ts +137 -0
  146. package/dist/harness/types.d.ts.map +1 -1
  147. package/dist/harness/verification.d.ts +7 -0
  148. package/dist/harness/verification.d.ts.map +1 -0
  149. package/dist/harness/verification.js +122 -0
  150. package/dist/harness/verification.js.map +1 -0
  151. package/dist/index.d.ts +70 -26
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +64 -59
  154. package/dist/index.js.map +1 -1
  155. package/dist/memory/index.d.ts +1 -0
  156. package/dist/memory/index.d.ts.map +1 -1
  157. package/dist/memory/index.js +1 -0
  158. package/dist/memory/index.js.map +1 -1
  159. package/dist/memory/prompt-context.d.ts +42 -0
  160. package/dist/memory/prompt-context.d.ts.map +1 -0
  161. package/dist/memory/prompt-context.js +129 -0
  162. package/dist/memory/prompt-context.js.map +1 -0
  163. package/dist/print-ui/launch.d.ts.map +1 -1
  164. package/dist/print-ui/launch.js +9 -2
  165. package/dist/print-ui/launch.js.map +1 -1
  166. package/dist/product/paths.d.ts +7 -0
  167. package/dist/product/paths.d.ts.map +1 -1
  168. package/dist/product/paths.js +19 -0
  169. package/dist/product/paths.js.map +1 -1
  170. package/dist/runtime/agent-loop.d.ts +78 -0
  171. package/dist/runtime/agent-loop.d.ts.map +1 -0
  172. package/dist/runtime/agent-loop.js +418 -0
  173. package/dist/runtime/agent-loop.js.map +1 -0
  174. package/dist/runtime/agent-runtime-controller.d.ts +10 -57
  175. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  176. package/dist/runtime/agent-runtime-controller.js +265 -1215
  177. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  178. package/dist/runtime/agent-runtime-protocol.d.ts +4 -5
  179. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  180. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  181. package/dist/runtime/agent-runtime-runner.d.ts +34 -0
  182. package/dist/runtime/agent-runtime-runner.d.ts.map +1 -0
  183. package/dist/runtime/agent-runtime-runner.js +3 -0
  184. package/dist/runtime/agent-runtime-runner.js.map +1 -0
  185. package/dist/runtime/batch-read-service.d.ts +29 -0
  186. package/dist/runtime/batch-read-service.d.ts.map +1 -0
  187. package/dist/runtime/batch-read-service.js +212 -0
  188. package/dist/runtime/batch-read-service.js.map +1 -0
  189. package/dist/runtime/builtin-tool-provider.d.ts +30 -0
  190. package/dist/runtime/builtin-tool-provider.d.ts.map +1 -0
  191. package/dist/runtime/builtin-tool-provider.js +233 -0
  192. package/dist/runtime/builtin-tool-provider.js.map +1 -0
  193. package/dist/runtime/capabilities/compiler.d.ts +11 -0
  194. package/dist/runtime/capabilities/compiler.d.ts.map +1 -0
  195. package/dist/runtime/capabilities/compiler.js +719 -0
  196. package/dist/runtime/capabilities/compiler.js.map +1 -0
  197. package/dist/runtime/capabilities/index.d.ts +3 -0
  198. package/dist/runtime/capabilities/index.d.ts.map +1 -0
  199. package/dist/runtime/capabilities/index.js +9 -0
  200. package/dist/runtime/capabilities/index.js.map +1 -0
  201. package/dist/runtime/capabilities/types.d.ts +175 -0
  202. package/dist/runtime/capabilities/types.d.ts.map +1 -0
  203. package/dist/runtime/capabilities/types.js +3 -0
  204. package/dist/runtime/capabilities/types.js.map +1 -0
  205. package/dist/runtime/capability-receipt-journal.d.ts +29 -0
  206. package/dist/runtime/capability-receipt-journal.d.ts.map +1 -0
  207. package/dist/runtime/capability-receipt-journal.js +264 -0
  208. package/dist/runtime/capability-receipt-journal.js.map +1 -0
  209. package/dist/runtime/capability-step-factory.d.ts +73 -0
  210. package/dist/runtime/capability-step-factory.d.ts.map +1 -0
  211. package/dist/runtime/capability-step-factory.js +302 -0
  212. package/dist/runtime/capability-step-factory.js.map +1 -0
  213. package/dist/runtime/compact-transaction.d.ts +225 -0
  214. package/dist/runtime/compact-transaction.d.ts.map +1 -0
  215. package/dist/runtime/compact-transaction.js +622 -0
  216. package/dist/runtime/compact-transaction.js.map +1 -0
  217. package/dist/runtime/composer/buffer.d.ts +3 -4
  218. package/dist/runtime/composer/buffer.d.ts.map +1 -1
  219. package/dist/runtime/composer/buffer.js +3 -4
  220. package/dist/runtime/composer/buffer.js.map +1 -1
  221. package/dist/runtime/composer/grapheme.d.ts +2 -4
  222. package/dist/runtime/composer/grapheme.d.ts.map +1 -1
  223. package/dist/runtime/composer/grapheme.js +2 -4
  224. package/dist/runtime/composer/grapheme.js.map +1 -1
  225. package/dist/runtime/composer/layout.d.ts +1 -3
  226. package/dist/runtime/composer/layout.d.ts.map +1 -1
  227. package/dist/runtime/composer/layout.js +1 -3
  228. package/dist/runtime/composer/layout.js.map +1 -1
  229. package/dist/runtime/core-tools/descriptors.d.ts +17 -0
  230. package/dist/runtime/core-tools/descriptors.d.ts.map +1 -0
  231. package/dist/runtime/core-tools/descriptors.js +185 -0
  232. package/dist/runtime/core-tools/descriptors.js.map +1 -0
  233. package/dist/runtime/first-party-core-provider.d.ts +55 -0
  234. package/dist/runtime/first-party-core-provider.d.ts.map +1 -0
  235. package/dist/runtime/first-party-core-provider.js +197 -0
  236. package/dist/runtime/first-party-core-provider.js.map +1 -0
  237. package/dist/runtime/first-party-long-tail-provider.d.ts +57 -0
  238. package/dist/runtime/first-party-long-tail-provider.d.ts.map +1 -0
  239. package/dist/runtime/first-party-long-tail-provider.js +238 -0
  240. package/dist/runtime/first-party-long-tail-provider.js.map +1 -0
  241. package/dist/runtime/first-party-tool-services.d.ts +43 -0
  242. package/dist/runtime/first-party-tool-services.d.ts.map +1 -0
  243. package/dist/runtime/first-party-tool-services.js +200 -0
  244. package/dist/runtime/first-party-tool-services.js.map +1 -0
  245. package/dist/runtime/first-party-tool-universe.d.ts +14 -0
  246. package/dist/runtime/first-party-tool-universe.d.ts.map +1 -0
  247. package/dist/runtime/first-party-tool-universe.js +20 -0
  248. package/dist/runtime/first-party-tool-universe.js.map +1 -0
  249. package/dist/runtime/goal-lifecycle-v2.d.ts +63 -0
  250. package/dist/runtime/goal-lifecycle-v2.d.ts.map +1 -0
  251. package/dist/runtime/goal-lifecycle-v2.js +253 -0
  252. package/dist/runtime/goal-lifecycle-v2.js.map +1 -0
  253. package/dist/runtime/goal-runtime-coordinator.d.ts +105 -0
  254. package/dist/runtime/goal-runtime-coordinator.d.ts.map +1 -0
  255. package/dist/runtime/goal-runtime-coordinator.js +506 -0
  256. package/dist/runtime/goal-runtime-coordinator.js.map +1 -0
  257. package/dist/runtime/goals/types.d.ts +0 -1
  258. package/dist/runtime/goals/types.d.ts.map +1 -1
  259. package/dist/runtime/goals/types.js +0 -1
  260. package/dist/runtime/goals/types.js.map +1 -1
  261. package/dist/runtime/harness-confluence.d.ts +165 -0
  262. package/dist/runtime/harness-confluence.d.ts.map +1 -0
  263. package/dist/runtime/harness-confluence.js +807 -0
  264. package/dist/runtime/harness-confluence.js.map +1 -0
  265. package/dist/runtime/harness-eval.d.ts +96 -0
  266. package/dist/runtime/harness-eval.d.ts.map +1 -0
  267. package/dist/runtime/harness-eval.js +181 -0
  268. package/dist/runtime/harness-eval.js.map +1 -0
  269. package/dist/runtime/harness-metrics.d.ts +202 -0
  270. package/dist/runtime/harness-metrics.d.ts.map +1 -0
  271. package/dist/runtime/harness-metrics.js +415 -0
  272. package/dist/runtime/harness-metrics.js.map +1 -0
  273. package/dist/runtime/legacy-session-importer.d.ts +99 -0
  274. package/dist/runtime/legacy-session-importer.d.ts.map +1 -0
  275. package/dist/runtime/legacy-session-importer.js +455 -0
  276. package/dist/runtime/legacy-session-importer.js.map +1 -0
  277. package/dist/runtime/legacy-thread-materializer.d.ts +72 -0
  278. package/dist/runtime/legacy-thread-materializer.d.ts.map +1 -0
  279. package/dist/runtime/legacy-thread-materializer.js +553 -0
  280. package/dist/runtime/legacy-thread-materializer.js.map +1 -0
  281. package/dist/runtime/long-tail-tools/descriptors.d.ts +23 -0
  282. package/dist/runtime/long-tail-tools/descriptors.d.ts.map +1 -0
  283. package/dist/runtime/long-tail-tools/descriptors.js +423 -0
  284. package/dist/runtime/long-tail-tools/descriptors.js.map +1 -0
  285. package/dist/runtime/loop-budget.d.ts +1 -1
  286. package/dist/runtime/loop-budget.d.ts.map +1 -1
  287. package/dist/runtime/loop-budget.js +2 -2
  288. package/dist/runtime/loop-budget.js.map +1 -1
  289. package/dist/runtime/mcp/first-party-mcp-adapter.d.ts +75 -0
  290. package/dist/runtime/mcp/first-party-mcp-adapter.d.ts.map +1 -0
  291. package/dist/runtime/mcp/first-party-mcp-adapter.js +484 -0
  292. package/dist/runtime/mcp/first-party-mcp-adapter.js.map +1 -0
  293. package/dist/runtime/mcp/first-party-mcp-config.d.ts +13 -0
  294. package/dist/runtime/mcp/first-party-mcp-config.d.ts.map +1 -0
  295. package/dist/runtime/mcp/first-party-mcp-config.js +139 -0
  296. package/dist/runtime/mcp/first-party-mcp-config.js.map +1 -0
  297. package/dist/runtime/mcp/index.d.ts +5 -0
  298. package/dist/runtime/mcp/index.d.ts.map +1 -0
  299. package/dist/{skills → runtime/mcp}/index.js +3 -9
  300. package/dist/runtime/mcp/index.js.map +1 -0
  301. package/dist/runtime/mcp/lazy-mcp-runtime.d.ts +95 -0
  302. package/dist/runtime/mcp/lazy-mcp-runtime.d.ts.map +1 -0
  303. package/dist/runtime/mcp/lazy-mcp-runtime.js +854 -0
  304. package/dist/runtime/mcp/lazy-mcp-runtime.js.map +1 -0
  305. package/dist/runtime/mcp/types.d.ts +128 -0
  306. package/dist/runtime/mcp/types.d.ts.map +1 -0
  307. package/dist/runtime/mcp/types.js +5 -0
  308. package/dist/runtime/mcp/types.js.map +1 -0
  309. package/dist/runtime/model-coordinator.d.ts +44 -1
  310. package/dist/runtime/model-coordinator.d.ts.map +1 -1
  311. package/dist/runtime/model-coordinator.js +161 -19
  312. package/dist/runtime/model-coordinator.js.map +1 -1
  313. package/dist/runtime/orion-runtime-v1.d.ts +321 -0
  314. package/dist/runtime/orion-runtime-v1.d.ts.map +1 -0
  315. package/dist/runtime/orion-runtime-v1.js +958 -0
  316. package/dist/runtime/orion-runtime-v1.js.map +1 -0
  317. package/dist/runtime/orion-session-runner.d.ts +37 -0
  318. package/dist/runtime/orion-session-runner.d.ts.map +1 -0
  319. package/dist/runtime/orion-session-runner.js +146 -0
  320. package/dist/runtime/orion-session-runner.js.map +1 -0
  321. package/dist/runtime/product-orion-runtime.d.ts +35 -0
  322. package/dist/runtime/product-orion-runtime.d.ts.map +1 -0
  323. package/dist/runtime/product-orion-runtime.js +1019 -0
  324. package/dist/runtime/product-orion-runtime.js.map +1 -0
  325. package/dist/runtime/prompts/index.d.ts +3 -0
  326. package/dist/runtime/prompts/index.d.ts.map +1 -0
  327. package/dist/{ink-ui/types.js → runtime/prompts/index.js} +3 -2
  328. package/dist/runtime/prompts/index.js.map +1 -0
  329. package/dist/runtime/prompts/prompt-registry.d.ts +22 -0
  330. package/dist/runtime/prompts/prompt-registry.d.ts.map +1 -0
  331. package/dist/runtime/prompts/prompt-registry.js +356 -0
  332. package/dist/runtime/prompts/prompt-registry.js.map +1 -0
  333. package/dist/runtime/prompts/types.d.ts +111 -0
  334. package/dist/runtime/prompts/types.d.ts.map +1 -0
  335. package/dist/runtime/prompts/types.js +5 -0
  336. package/dist/runtime/prompts/types.js.map +1 -0
  337. package/dist/runtime/protocol/canonical.d.ts +3 -0
  338. package/dist/runtime/protocol/canonical.d.ts.map +1 -0
  339. package/dist/runtime/protocol/canonical.js +21 -0
  340. package/dist/runtime/protocol/canonical.js.map +1 -0
  341. package/dist/runtime/protocol/index.d.ts +4 -0
  342. package/dist/runtime/protocol/index.d.ts.map +1 -0
  343. package/dist/runtime/protocol/index.js +16 -0
  344. package/dist/runtime/protocol/index.js.map +1 -0
  345. package/dist/runtime/protocol/runtime-protocol-v1.d.ts +671 -0
  346. package/dist/runtime/protocol/runtime-protocol-v1.d.ts.map +1 -0
  347. package/dist/runtime/protocol/runtime-protocol-v1.js +557 -0
  348. package/dist/runtime/protocol/runtime-protocol-v1.js.map +1 -0
  349. package/dist/runtime/release-receipts.d.ts +109 -0
  350. package/dist/runtime/release-receipts.d.ts.map +1 -0
  351. package/dist/runtime/release-receipts.js +304 -0
  352. package/dist/runtime/release-receipts.js.map +1 -0
  353. package/dist/runtime/resource-scope.d.ts +123 -0
  354. package/dist/runtime/resource-scope.d.ts.map +1 -0
  355. package/dist/runtime/resource-scope.js +363 -0
  356. package/dist/runtime/resource-scope.js.map +1 -0
  357. package/dist/runtime/runtime-event-buffer.d.ts +78 -0
  358. package/dist/runtime/runtime-event-buffer.d.ts.map +1 -0
  359. package/dist/runtime/runtime-event-buffer.js +237 -0
  360. package/dist/runtime/runtime-event-buffer.js.map +1 -0
  361. package/dist/runtime/runtime-services.d.ts +87 -0
  362. package/dist/runtime/runtime-services.d.ts.map +1 -0
  363. package/dist/runtime/runtime-services.js +180 -0
  364. package/dist/runtime/runtime-services.js.map +1 -0
  365. package/dist/runtime/skills/bounded-lru-cache.d.ts +34 -0
  366. package/dist/runtime/skills/bounded-lru-cache.d.ts.map +1 -0
  367. package/dist/runtime/skills/bounded-lru-cache.js +100 -0
  368. package/dist/runtime/skills/bounded-lru-cache.js.map +1 -0
  369. package/dist/runtime/skills/filesystem-skill-provider.d.ts +96 -0
  370. package/dist/runtime/skills/filesystem-skill-provider.d.ts.map +1 -0
  371. package/dist/runtime/skills/filesystem-skill-provider.js +829 -0
  372. package/dist/runtime/skills/filesystem-skill-provider.js.map +1 -0
  373. package/dist/runtime/skills/index.d.ts +5 -0
  374. package/dist/runtime/skills/index.d.ts.map +1 -0
  375. package/dist/{ink-ui/controllers/chat-controller.js → runtime/skills/index.js} +5 -2
  376. package/dist/runtime/skills/index.js.map +1 -0
  377. package/dist/runtime/skills/lazy-skill-runtime.d.ts +77 -0
  378. package/dist/runtime/skills/lazy-skill-runtime.d.ts.map +1 -0
  379. package/dist/runtime/skills/lazy-skill-runtime.js +673 -0
  380. package/dist/runtime/skills/lazy-skill-runtime.js.map +1 -0
  381. package/dist/runtime/skills/types.d.ts +137 -0
  382. package/dist/runtime/skills/types.d.ts.map +1 -0
  383. package/dist/runtime/skills/types.js +13 -0
  384. package/dist/runtime/skills/types.js.map +1 -0
  385. package/dist/runtime/step-snapshot.d.ts +183 -0
  386. package/dist/runtime/step-snapshot.d.ts.map +1 -0
  387. package/dist/runtime/step-snapshot.js +286 -0
  388. package/dist/runtime/step-snapshot.js.map +1 -0
  389. package/dist/runtime/subagent-thread-runtime.d.ts +239 -0
  390. package/dist/runtime/subagent-thread-runtime.d.ts.map +1 -0
  391. package/dist/runtime/subagent-thread-runtime.js +876 -0
  392. package/dist/runtime/subagent-thread-runtime.js.map +1 -0
  393. package/dist/runtime/subagents/index.d.ts +5 -2
  394. package/dist/runtime/subagents/index.d.ts.map +1 -1
  395. package/dist/runtime/subagents/index.js +10 -2
  396. package/dist/runtime/subagents/index.js.map +1 -1
  397. package/dist/runtime/subagents/parent-step-fork.d.ts +36 -0
  398. package/dist/runtime/subagents/parent-step-fork.d.ts.map +1 -0
  399. package/dist/runtime/subagents/parent-step-fork.js +83 -0
  400. package/dist/runtime/subagents/parent-step-fork.js.map +1 -0
  401. package/dist/runtime/subagents/production.d.ts +65 -42
  402. package/dist/runtime/subagents/production.d.ts.map +1 -1
  403. package/dist/runtime/subagents/production.js +494 -151
  404. package/dist/runtime/subagents/production.js.map +1 -1
  405. package/dist/runtime/subagents/receipt-journal.d.ts +20 -0
  406. package/dist/runtime/subagents/receipt-journal.d.ts.map +1 -0
  407. package/dist/runtime/subagents/receipt-journal.js +74 -0
  408. package/dist/runtime/subagents/receipt-journal.js.map +1 -0
  409. package/dist/runtime/subagents/runner.d.ts +12 -1
  410. package/dist/runtime/subagents/runner.d.ts.map +1 -1
  411. package/dist/runtime/subagents/runner.js +62 -1
  412. package/dist/runtime/subagents/runner.js.map +1 -1
  413. package/dist/runtime/subagents/runtime-contract.d.ts +29 -0
  414. package/dist/runtime/subagents/runtime-contract.d.ts.map +1 -0
  415. package/dist/runtime/subagents/runtime-contract.js +3 -0
  416. package/dist/runtime/subagents/runtime-contract.js.map +1 -0
  417. package/dist/runtime/subagents/runtime-integration.d.ts +41 -56
  418. package/dist/runtime/subagents/runtime-integration.d.ts.map +1 -1
  419. package/dist/runtime/subagents/runtime-integration.js +34 -197
  420. package/dist/runtime/subagents/runtime-integration.js.map +1 -1
  421. package/dist/runtime/subagents/supervisor.d.ts +19 -7
  422. package/dist/runtime/subagents/supervisor.d.ts.map +1 -1
  423. package/dist/runtime/subagents/supervisor.js +88 -39
  424. package/dist/runtime/subagents/supervisor.js.map +1 -1
  425. package/dist/runtime/subagents/types.d.ts +5 -2
  426. package/dist/runtime/subagents/types.d.ts.map +1 -1
  427. package/dist/runtime/subagents/types.js +1 -1
  428. package/dist/runtime/subagents/types.js.map +1 -1
  429. package/dist/runtime/task-context-service.d.ts +91 -0
  430. package/dist/runtime/task-context-service.d.ts.map +1 -0
  431. package/dist/runtime/task-context-service.js +122 -0
  432. package/dist/runtime/task-context-service.js.map +1 -0
  433. package/dist/runtime/thread-admission.d.ts +130 -0
  434. package/dist/runtime/thread-admission.d.ts.map +1 -0
  435. package/dist/runtime/thread-admission.js +276 -0
  436. package/dist/runtime/thread-admission.js.map +1 -0
  437. package/dist/runtime/thread-compact-persistence.d.ts +50 -0
  438. package/dist/runtime/thread-compact-persistence.d.ts.map +1 -0
  439. package/dist/runtime/thread-compact-persistence.js +176 -0
  440. package/dist/runtime/thread-compact-persistence.js.map +1 -0
  441. package/dist/runtime/thread-event-store.d.ts +98 -0
  442. package/dist/runtime/thread-event-store.d.ts.map +1 -0
  443. package/dist/runtime/thread-event-store.js +737 -0
  444. package/dist/runtime/thread-event-store.js.map +1 -0
  445. package/dist/runtime/thread-projection.d.ts +91 -0
  446. package/dist/runtime/thread-projection.d.ts.map +1 -0
  447. package/dist/runtime/thread-projection.js +407 -0
  448. package/dist/runtime/thread-projection.js.map +1 -0
  449. package/dist/runtime/thread-runtime.d.ts +165 -0
  450. package/dist/runtime/thread-runtime.d.ts.map +1 -0
  451. package/dist/runtime/thread-runtime.js +704 -0
  452. package/dist/runtime/thread-runtime.js.map +1 -0
  453. package/dist/runtime/thread-tool-journal.d.ts +11 -0
  454. package/dist/runtime/thread-tool-journal.d.ts.map +1 -0
  455. package/dist/runtime/thread-tool-journal.js +131 -0
  456. package/dist/runtime/thread-tool-journal.js.map +1 -0
  457. package/dist/runtime/thread-ui-adapter.d.ts +85 -0
  458. package/dist/runtime/thread-ui-adapter.d.ts.map +1 -0
  459. package/dist/runtime/thread-ui-adapter.js +514 -0
  460. package/dist/runtime/thread-ui-adapter.js.map +1 -0
  461. package/dist/runtime/tool-gateway.d.ts +159 -0
  462. package/dist/runtime/tool-gateway.d.ts.map +1 -0
  463. package/dist/runtime/tool-gateway.js +311 -0
  464. package/dist/runtime/tool-gateway.js.map +1 -0
  465. package/dist/runtime/turn-commit.d.ts +103 -0
  466. package/dist/runtime/turn-commit.d.ts.map +1 -0
  467. package/dist/runtime/turn-commit.js +321 -0
  468. package/dist/runtime/turn-commit.js.map +1 -0
  469. package/dist/runtime/ui-events.d.ts +15 -5
  470. package/dist/runtime/ui-events.d.ts.map +1 -1
  471. package/dist/runtime/ui-events.js +0 -1
  472. package/dist/runtime/ui-events.js.map +1 -1
  473. package/dist/runtime/ui-view-model.d.ts +1 -1
  474. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  475. package/dist/runtime/ui-view-model.js +3 -5
  476. package/dist/runtime/ui-view-model.js.map +1 -1
  477. package/dist/services/compact/auto-compact.d.ts +82 -2
  478. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  479. package/dist/services/compact/auto-compact.js +226 -44
  480. package/dist/services/compact/auto-compact.js.map +1 -1
  481. package/dist/services/compact/compact.d.ts +54 -37
  482. package/dist/services/compact/compact.d.ts.map +1 -1
  483. package/dist/services/compact/compact.js +512 -127
  484. package/dist/services/compact/compact.js.map +1 -1
  485. package/dist/services/compact/coordinator.d.ts +5 -1
  486. package/dist/services/compact/coordinator.d.ts.map +1 -1
  487. package/dist/services/compact/coordinator.js +10 -1
  488. package/dist/services/compact/coordinator.js.map +1 -1
  489. package/dist/services/compact/fingerprint.d.ts +27 -0
  490. package/dist/services/compact/fingerprint.d.ts.map +1 -0
  491. package/dist/services/compact/fingerprint.js +69 -0
  492. package/dist/services/compact/fingerprint.js.map +1 -0
  493. package/dist/services/compact/index.d.ts +7 -5
  494. package/dist/services/compact/index.d.ts.map +1 -1
  495. package/dist/services/compact/index.js +19 -6
  496. package/dist/services/compact/index.js.map +1 -1
  497. package/dist/services/compact/planner.d.ts +41 -0
  498. package/dist/services/compact/planner.d.ts.map +1 -0
  499. package/dist/services/compact/planner.js +102 -0
  500. package/dist/services/compact/planner.js.map +1 -0
  501. package/dist/services/compact/semantic-summary.d.ts +93 -0
  502. package/dist/services/compact/semantic-summary.d.ts.map +1 -0
  503. package/dist/services/compact/semantic-summary.js +158 -0
  504. package/dist/services/compact/semantic-summary.js.map +1 -0
  505. package/dist/services/compact/summary-generator.d.ts +23 -0
  506. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  507. package/dist/services/compact/summary-generator.js +173 -39
  508. package/dist/services/compact/summary-generator.js.map +1 -1
  509. package/dist/services/config-dir.d.ts +1 -1
  510. package/dist/services/config-dir.d.ts.map +1 -1
  511. package/dist/services/config-dir.js +2 -1
  512. package/dist/services/config-dir.js.map +1 -1
  513. package/dist/services/config.d.ts +2 -16
  514. package/dist/services/config.d.ts.map +1 -1
  515. package/dist/services/config.js +2 -29
  516. package/dist/services/config.js.map +1 -1
  517. package/dist/services/doctor.d.ts +0 -2
  518. package/dist/services/doctor.d.ts.map +1 -1
  519. package/dist/services/doctor.js +39 -64
  520. package/dist/services/doctor.js.map +1 -1
  521. package/dist/services/file-context.d.ts.map +1 -1
  522. package/dist/services/file-context.js +29 -33
  523. package/dist/services/file-context.js.map +1 -1
  524. package/dist/services/global-config.d.ts +8 -2
  525. package/dist/services/global-config.d.ts.map +1 -1
  526. package/dist/services/global-config.js +8 -0
  527. package/dist/services/global-config.js.map +1 -1
  528. package/dist/services/llm.d.ts +3 -0
  529. package/dist/services/llm.d.ts.map +1 -1
  530. package/dist/services/llm.js +7 -0
  531. package/dist/services/llm.js.map +1 -1
  532. package/dist/services/project-instructions.d.ts.map +1 -1
  533. package/dist/services/project-instructions.js +10 -17
  534. package/dist/services/project-instructions.js.map +1 -1
  535. package/dist/services/safe-project-reader.d.ts +30 -0
  536. package/dist/services/safe-project-reader.d.ts.map +1 -0
  537. package/dist/services/safe-project-reader.js +141 -0
  538. package/dist/services/safe-project-reader.js.map +1 -0
  539. package/dist/services/session-storage.d.ts +134 -5
  540. package/dist/services/session-storage.d.ts.map +1 -1
  541. package/dist/services/session-storage.js +727 -57
  542. package/dist/services/session-storage.js.map +1 -1
  543. package/dist/services/usage-state.d.ts +7 -0
  544. package/dist/services/usage-state.d.ts.map +1 -1
  545. package/dist/services/usage-state.js +117 -16
  546. package/dist/services/usage-state.js.map +1 -1
  547. package/dist/skills/builtin/code-review/SKILL.md +51 -0
  548. package/dist/skills/builtin/security-check/SKILL.md +54 -0
  549. package/dist/skills/builtin/test-gen/SKILL.md +49 -0
  550. package/dist/terminal-ui/launch.d.ts +3 -1
  551. package/dist/terminal-ui/launch.d.ts.map +1 -1
  552. package/dist/terminal-ui/launch.js +19 -3
  553. package/dist/terminal-ui/launch.js.map +1 -1
  554. package/dist/tools/core/common.d.ts +34 -0
  555. package/dist/tools/core/common.d.ts.map +1 -0
  556. package/dist/tools/core/common.js +164 -0
  557. package/dist/tools/core/common.js.map +1 -0
  558. package/dist/tools/core/edit-file.d.ts +10 -0
  559. package/dist/tools/core/edit-file.d.ts.map +1 -0
  560. package/dist/tools/core/edit-file.js +301 -0
  561. package/dist/tools/core/edit-file.js.map +1 -0
  562. package/dist/tools/core/exec-command.d.ts +2 -0
  563. package/dist/tools/core/exec-command.d.ts.map +1 -0
  564. package/dist/tools/core/exec-command.js +347 -0
  565. package/dist/tools/core/exec-command.js.map +1 -0
  566. package/dist/tools/core/glob.d.ts +2 -0
  567. package/dist/tools/core/glob.d.ts.map +1 -0
  568. package/dist/tools/core/glob.js +133 -0
  569. package/dist/tools/core/glob.js.map +1 -0
  570. package/dist/tools/core/grep.d.ts +12 -0
  571. package/dist/tools/core/grep.d.ts.map +1 -0
  572. package/dist/tools/core/grep.js +223 -0
  573. package/dist/tools/core/grep.js.map +1 -0
  574. package/dist/tools/core/index.d.ts +15 -0
  575. package/dist/tools/core/index.d.ts.map +1 -0
  576. package/dist/tools/core/index.js +31 -0
  577. package/dist/tools/core/index.js.map +1 -0
  578. package/dist/tools/core/list-files.d.ts +2 -0
  579. package/dist/tools/core/list-files.d.ts.map +1 -0
  580. package/dist/tools/core/list-files.js +87 -0
  581. package/dist/tools/core/list-files.js.map +1 -0
  582. package/dist/tools/core/read-file.d.ts +2 -0
  583. package/dist/tools/core/read-file.d.ts.map +1 -0
  584. package/dist/tools/core/read-file.js +129 -0
  585. package/dist/tools/core/read-file.js.map +1 -0
  586. package/dist/tools/core/write-file.d.ts +2 -0
  587. package/dist/tools/core/write-file.d.ts.map +1 -0
  588. package/dist/tools/core/write-file.js +65 -0
  589. package/dist/tools/core/write-file.js.map +1 -0
  590. package/dist/tools/todo.d.ts +3 -4
  591. package/dist/tools/todo.d.ts.map +1 -1
  592. package/dist/tools/todo.js +80 -79
  593. package/dist/tools/todo.js.map +1 -1
  594. package/dist/tui-ui/chrome-view-model.js +1 -1
  595. package/dist/tui-ui/chrome-view-model.js.map +1 -1
  596. package/dist/tui-ui/layout.js +1 -1
  597. package/dist/tui-ui/layout.js.map +1 -1
  598. package/docs/migration/v0.1.9-to-v0.2.0.md +98 -0
  599. package/docs/orion.example.json +79 -0
  600. package/docs/plan/v0.2.0-dsh-harness-redesign-plan.md +1234 -0
  601. package/docs/plan/v0.2.0-release-checklist.md +91 -0
  602. package/docs/readme.md +27 -0
  603. package/npm-shrinkwrap.json +9 -438
  604. package/package.json +19 -11
  605. package/dist/agents/coder.d.ts +0 -12
  606. package/dist/agents/coder.d.ts.map +0 -1
  607. package/dist/agents/coder.js +0 -48
  608. package/dist/agents/coder.js.map +0 -1
  609. package/dist/agents/coordinator.d.ts +0 -86
  610. package/dist/agents/coordinator.d.ts.map +0 -1
  611. package/dist/agents/coordinator.js +0 -251
  612. package/dist/agents/coordinator.js.map +0 -1
  613. package/dist/agents/fork.d.ts +0 -69
  614. package/dist/agents/fork.d.ts.map +0 -1
  615. package/dist/agents/fork.js +0 -164
  616. package/dist/agents/fork.js.map +0 -1
  617. package/dist/agents/leader.d.ts +0 -12
  618. package/dist/agents/leader.d.ts.map +0 -1
  619. package/dist/agents/leader.js +0 -49
  620. package/dist/agents/leader.js.map +0 -1
  621. package/dist/agents/router.d.ts +0 -59
  622. package/dist/agents/router.d.ts.map +0 -1
  623. package/dist/agents/router.js +0 -193
  624. package/dist/agents/router.js.map +0 -1
  625. package/dist/agents/worker-pool.d.ts +0 -72
  626. package/dist/agents/worker-pool.d.ts.map +0 -1
  627. package/dist/agents/worker-pool.js +0 -224
  628. package/dist/agents/worker-pool.js.map +0 -1
  629. package/dist/commands/legacy-commands.d.ts +0 -4
  630. package/dist/commands/legacy-commands.d.ts.map +0 -1
  631. package/dist/commands/legacy-commands.js +0 -44
  632. package/dist/commands/legacy-commands.js.map +0 -1
  633. package/dist/core/agent.d.ts +0 -84
  634. package/dist/core/agent.d.ts.map +0 -1
  635. package/dist/core/agent.js +0 -58
  636. package/dist/core/agent.js.map +0 -1
  637. package/dist/core/brain.d.ts +0 -50
  638. package/dist/core/brain.d.ts.map +0 -1
  639. package/dist/core/brain.js +0 -95
  640. package/dist/core/brain.js.map +0 -1
  641. package/dist/framework/tool-scheduler.d.ts +0 -186
  642. package/dist/framework/tool-scheduler.d.ts.map +0 -1
  643. package/dist/framework/tool-scheduler.js +0 -558
  644. package/dist/framework/tool-scheduler.js.map +0 -1
  645. package/dist/harness/harness.d.ts +0 -58
  646. package/dist/harness/harness.d.ts.map +0 -1
  647. package/dist/harness/harness.js +0 -195
  648. package/dist/harness/harness.js.map +0 -1
  649. package/dist/harness/safety.d.ts +0 -101
  650. package/dist/harness/safety.d.ts.map +0 -1
  651. package/dist/harness/safety.js +0 -322
  652. package/dist/harness/safety.js.map +0 -1
  653. package/dist/init.d.ts +0 -108
  654. package/dist/init.d.ts.map +0 -1
  655. package/dist/init.js +0 -393
  656. package/dist/init.js.map +0 -1
  657. package/dist/ink-ui/App.d.ts +0 -9
  658. package/dist/ink-ui/App.d.ts.map +0 -1
  659. package/dist/ink-ui/App.js +0 -12
  660. package/dist/ink-ui/App.js.map +0 -1
  661. package/dist/ink-ui/components/Markdown.d.ts +0 -10
  662. package/dist/ink-ui/components/Markdown.d.ts.map +0 -1
  663. package/dist/ink-ui/components/Markdown.js +0 -210
  664. package/dist/ink-ui/components/Markdown.js.map +0 -1
  665. package/dist/ink-ui/components/NativeCursor.d.ts +0 -12
  666. package/dist/ink-ui/components/NativeCursor.d.ts.map +0 -1
  667. package/dist/ink-ui/components/NativeCursor.js +0 -35
  668. package/dist/ink-ui/components/NativeCursor.js.map +0 -1
  669. package/dist/ink-ui/components/PixelHorseBanner.d.ts +0 -8
  670. package/dist/ink-ui/components/PixelHorseBanner.d.ts.map +0 -1
  671. package/dist/ink-ui/components/PixelHorseBanner.js +0 -97
  672. package/dist/ink-ui/components/PixelHorseBanner.js.map +0 -1
  673. package/dist/ink-ui/components/PromptInput.d.ts +0 -13
  674. package/dist/ink-ui/components/PromptInput.d.ts.map +0 -1
  675. package/dist/ink-ui/components/PromptInput.js +0 -30
  676. package/dist/ink-ui/components/PromptInput.js.map +0 -1
  677. package/dist/ink-ui/components/RunningHorseIndicator.d.ts +0 -13
  678. package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +0 -1
  679. package/dist/ink-ui/components/RunningHorseIndicator.js +0 -53
  680. package/dist/ink-ui/components/RunningHorseIndicator.js.map +0 -1
  681. package/dist/ink-ui/components/SelectList.d.ts +0 -16
  682. package/dist/ink-ui/components/SelectList.d.ts.map +0 -1
  683. package/dist/ink-ui/components/SelectList.js +0 -60
  684. package/dist/ink-ui/components/SelectList.js.map +0 -1
  685. package/dist/ink-ui/components/StatusLine.d.ts +0 -11
  686. package/dist/ink-ui/components/StatusLine.d.ts.map +0 -1
  687. package/dist/ink-ui/components/StatusLine.js +0 -70
  688. package/dist/ink-ui/components/StatusLine.js.map +0 -1
  689. package/dist/ink-ui/components/ToolActivity.d.ts +0 -19
  690. package/dist/ink-ui/components/ToolActivity.d.ts.map +0 -1
  691. package/dist/ink-ui/components/ToolActivity.js +0 -134
  692. package/dist/ink-ui/components/ToolActivity.js.map +0 -1
  693. package/dist/ink-ui/components/Transcript.d.ts +0 -14
  694. package/dist/ink-ui/components/Transcript.d.ts.map +0 -1
  695. package/dist/ink-ui/components/Transcript.js +0 -66
  696. package/dist/ink-ui/components/Transcript.js.map +0 -1
  697. package/dist/ink-ui/controllers/chat-controller.d.ts +0 -2
  698. package/dist/ink-ui/controllers/chat-controller.d.ts.map +0 -1
  699. package/dist/ink-ui/controllers/chat-controller.js.map +0 -1
  700. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +0 -6
  701. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +0 -1
  702. package/dist/ink-ui/hooks/use-raw-input-bridge.js +0 -27
  703. package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +0 -1
  704. package/dist/ink-ui/hooks/use-terminal-size.d.ts +0 -7
  705. package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +0 -1
  706. package/dist/ink-ui/hooks/use-terminal-size.js +0 -34
  707. package/dist/ink-ui/hooks/use-terminal-size.js.map +0 -1
  708. package/dist/ink-ui/launch.d.ts +0 -9
  709. package/dist/ink-ui/launch.d.ts.map +0 -1
  710. package/dist/ink-ui/launch.js +0 -101
  711. package/dist/ink-ui/launch.js.map +0 -1
  712. package/dist/ink-ui/runtime/grapheme.d.ts +0 -10
  713. package/dist/ink-ui/runtime/grapheme.d.ts.map +0 -1
  714. package/dist/ink-ui/runtime/grapheme.js +0 -17
  715. package/dist/ink-ui/runtime/grapheme.js.map +0 -1
  716. package/dist/ink-ui/runtime/input-buffer.d.ts +0 -10
  717. package/dist/ink-ui/runtime/input-buffer.d.ts.map +0 -1
  718. package/dist/ink-ui/runtime/input-buffer.js +0 -18
  719. package/dist/ink-ui/runtime/input-buffer.js.map +0 -1
  720. package/dist/ink-ui/runtime/layout-budget.d.ts +0 -13
  721. package/dist/ink-ui/runtime/layout-budget.d.ts.map +0 -1
  722. package/dist/ink-ui/runtime/layout-budget.js +0 -25
  723. package/dist/ink-ui/runtime/layout-budget.js.map +0 -1
  724. package/dist/ink-ui/runtime/native-cursor.d.ts +0 -62
  725. package/dist/ink-ui/runtime/native-cursor.d.ts.map +0 -1
  726. package/dist/ink-ui/runtime/native-cursor.js +0 -398
  727. package/dist/ink-ui/runtime/native-cursor.js.map +0 -1
  728. package/dist/ink-ui/runtime/prompt-layout.d.ts +0 -10
  729. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +0 -1
  730. package/dist/ink-ui/runtime/prompt-layout.js +0 -21
  731. package/dist/ink-ui/runtime/prompt-layout.js.map +0 -1
  732. package/dist/ink-ui/runtime/raw-input.d.ts +0 -4
  733. package/dist/ink-ui/runtime/raw-input.d.ts.map +0 -1
  734. package/dist/ink-ui/runtime/raw-input.js +0 -15
  735. package/dist/ink-ui/runtime/raw-input.js.map +0 -1
  736. package/dist/ink-ui/runtime/transcript-state.d.ts +0 -37
  737. package/dist/ink-ui/runtime/transcript-state.d.ts.map +0 -1
  738. package/dist/ink-ui/runtime/transcript-state.js +0 -91
  739. package/dist/ink-ui/runtime/transcript-state.js.map +0 -1
  740. package/dist/ink-ui/screens/ReplScreen.d.ts +0 -24
  741. package/dist/ink-ui/screens/ReplScreen.d.ts.map +0 -1
  742. package/dist/ink-ui/screens/ReplScreen.js +0 -756
  743. package/dist/ink-ui/screens/ReplScreen.js.map +0 -1
  744. package/dist/ink-ui/types.d.ts +0 -2
  745. package/dist/ink-ui/types.d.ts.map +0 -1
  746. package/dist/ink-ui/types.js.map +0 -1
  747. package/dist/runtime/chat-checkpoint.d.ts +0 -17
  748. package/dist/runtime/chat-checkpoint.d.ts.map +0 -1
  749. package/dist/runtime/chat-checkpoint.js +0 -105
  750. package/dist/runtime/chat-checkpoint.js.map +0 -1
  751. package/dist/runtime/chat-command-scope.d.ts +0 -5
  752. package/dist/runtime/chat-command-scope.d.ts.map +0 -1
  753. package/dist/runtime/chat-command-scope.js +0 -22
  754. package/dist/runtime/chat-command-scope.js.map +0 -1
  755. package/dist/runtime/chat-controller.d.ts +0 -62
  756. package/dist/runtime/chat-controller.d.ts.map +0 -1
  757. package/dist/runtime/chat-controller.js +0 -1630
  758. package/dist/runtime/chat-controller.js.map +0 -1
  759. package/dist/runtime/chat-effort.d.ts +0 -5
  760. package/dist/runtime/chat-effort.d.ts.map +0 -1
  761. package/dist/runtime/chat-effort.js +0 -47
  762. package/dist/runtime/chat-effort.js.map +0 -1
  763. package/dist/runtime/chat-presentation.d.ts +0 -63
  764. package/dist/runtime/chat-presentation.d.ts.map +0 -1
  765. package/dist/runtime/chat-presentation.js +0 -561
  766. package/dist/runtime/chat-presentation.js.map +0 -1
  767. package/dist/runtime/chat-trace.d.ts +0 -52
  768. package/dist/runtime/chat-trace.d.ts.map +0 -1
  769. package/dist/runtime/chat-trace.js +0 -234
  770. package/dist/runtime/chat-trace.js.map +0 -1
  771. package/dist/runtime/chat-workspace.d.ts +0 -22
  772. package/dist/runtime/chat-workspace.d.ts.map +0 -1
  773. package/dist/runtime/chat-workspace.js +0 -154
  774. package/dist/runtime/chat-workspace.js.map +0 -1
  775. package/dist/runtime/goals/accounting.d.ts +0 -45
  776. package/dist/runtime/goals/accounting.d.ts.map +0 -1
  777. package/dist/runtime/goals/accounting.js +0 -114
  778. package/dist/runtime/goals/accounting.js.map +0 -1
  779. package/dist/runtime/goals/coordinator.d.ts +0 -89
  780. package/dist/runtime/goals/coordinator.d.ts.map +0 -1
  781. package/dist/runtime/goals/coordinator.js +0 -1481
  782. package/dist/runtime/goals/coordinator.js.map +0 -1
  783. package/dist/runtime/goals/lifecycle.d.ts +0 -13
  784. package/dist/runtime/goals/lifecycle.d.ts.map +0 -1
  785. package/dist/runtime/goals/lifecycle.js +0 -46
  786. package/dist/runtime/goals/lifecycle.js.map +0 -1
  787. package/dist/runtime/goals/prompt.d.ts +0 -16
  788. package/dist/runtime/goals/prompt.d.ts.map +0 -1
  789. package/dist/runtime/goals/prompt.js +0 -88
  790. package/dist/runtime/goals/prompt.js.map +0 -1
  791. package/dist/runtime/goals/tools.d.ts +0 -61
  792. package/dist/runtime/goals/tools.d.ts.map +0 -1
  793. package/dist/runtime/goals/tools.js +0 -568
  794. package/dist/runtime/goals/tools.js.map +0 -1
  795. package/dist/sdk/index.d.ts +0 -10
  796. package/dist/sdk/index.d.ts.map +0 -1
  797. package/dist/sdk/index.js +0 -23
  798. package/dist/sdk/index.js.map +0 -1
  799. package/dist/sdk/init.d.ts +0 -24
  800. package/dist/sdk/init.d.ts.map +0 -1
  801. package/dist/sdk/init.js +0 -48
  802. package/dist/sdk/init.js.map +0 -1
  803. package/dist/sdk/query.d.ts +0 -19
  804. package/dist/sdk/query.d.ts.map +0 -1
  805. package/dist/sdk/query.js +0 -42
  806. package/dist/sdk/query.js.map +0 -1
  807. package/dist/sdk/sessions.d.ts +0 -19
  808. package/dist/sdk/sessions.d.ts.map +0 -1
  809. package/dist/sdk/sessions.js +0 -57
  810. package/dist/sdk/sessions.js.map +0 -1
  811. package/dist/sdk/types.d.ts +0 -47
  812. package/dist/sdk/types.d.ts.map +0 -1
  813. package/dist/sdk/types.js +0 -8
  814. package/dist/sdk/types.js.map +0 -1
  815. package/dist/services/agent-runner.d.ts +0 -71
  816. package/dist/services/agent-runner.d.ts.map +0 -1
  817. package/dist/services/agent-runner.js +0 -185
  818. package/dist/services/agent-runner.js.map +0 -1
  819. package/dist/services/compact/micro-compact.d.ts +0 -21
  820. package/dist/services/compact/micro-compact.d.ts.map +0 -1
  821. package/dist/services/compact/micro-compact.js +0 -99
  822. package/dist/services/compact/micro-compact.js.map +0 -1
  823. package/dist/services/task-manager.d.ts +0 -161
  824. package/dist/services/task-manager.d.ts.map +0 -1
  825. package/dist/services/task-manager.js +0 -315
  826. package/dist/services/task-manager.js.map +0 -1
  827. package/dist/skills/discovery.d.ts +0 -22
  828. package/dist/skills/discovery.d.ts.map +0 -1
  829. package/dist/skills/discovery.js +0 -75
  830. package/dist/skills/discovery.js.map +0 -1
  831. package/dist/skills/index.d.ts +0 -11
  832. package/dist/skills/index.d.ts.map +0 -1
  833. package/dist/skills/index.js.map +0 -1
  834. package/dist/skills/loader.d.ts +0 -53
  835. package/dist/skills/loader.d.ts.map +0 -1
  836. package/dist/skills/loader.js +0 -421
  837. package/dist/skills/loader.js.map +0 -1
  838. package/dist/skills/registry.d.ts +0 -41
  839. package/dist/skills/registry.d.ts.map +0 -1
  840. package/dist/skills/registry.js +0 -157
  841. package/dist/skills/registry.js.map +0 -1
  842. package/dist/skills/runtime.d.ts +0 -46
  843. package/dist/skills/runtime.d.ts.map +0 -1
  844. package/dist/skills/runtime.js +0 -364
  845. package/dist/skills/runtime.js.map +0 -1
  846. package/dist/skills/types.d.ts +0 -112
  847. package/dist/skills/types.d.ts.map +0 -1
  848. package/dist/skills/types.js +0 -24
  849. package/dist/skills/types.js.map +0 -1
  850. package/dist/tools/index.d.ts +0 -52
  851. package/dist/tools/index.d.ts.map +0 -1
  852. package/dist/tools/index.js +0 -2268
  853. package/dist/tools/index.js.map +0 -1
  854. package/dist/tools/mcp.d.ts +0 -99
  855. package/dist/tools/mcp.d.ts.map +0 -1
  856. package/dist/tools/mcp.js +0 -695
  857. package/dist/tools/mcp.js.map +0 -1
  858. package/dist/tools/plan.d.ts +0 -17
  859. package/dist/tools/plan.d.ts.map +0 -1
  860. package/dist/tools/plan.js +0 -84
  861. package/dist/tools/plan.js.map +0 -1
@@ -1,1630 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InkChatController = exports.AgentChatController = exports.sessionMessagesToTranscriptEntries = exports.createToolEventPresenter = exports.createAssistantStreamPresenter = void 0;
4
- exports.loadSessionIntoRuntime = loadSessionIntoRuntime;
5
- exports.closeSession = closeSession;
6
- const commands_1 = require("../commands");
7
- const crypto_1 = require("crypto");
8
- const parser_1 = require("../commands/parser");
9
- const session_storage_1 = require("../services/session-storage");
10
- const config_1 = require("../services/config");
11
- const provider_resilience_1 = require("../services/provider-resilience");
12
- const tool_allowlist_1 = require("../services/tool-allowlist");
13
- const framework_1 = require("../framework");
14
- const prompt_1 = require("./goals/prompt");
15
- const harness_1 = require("../harness");
16
- const tools_1 = require("../tools");
17
- const tool_scheduler_1 = require("../framework/tool-scheduler");
18
- const tool_serializer_1 = require("../framework/tool-serializer");
19
- const tool_artifacts_1 = require("../core/tool-artifacts");
20
- const skills_1 = require("../skills");
21
- const subagents_1 = require("./subagents");
22
- const file_context_1 = require("../services/file-context");
23
- const prompt_context_1 = require("../services/prompt-context");
24
- const workspace_state_1 = require("../services/workspace-state");
25
- const verification_profile_1 = require("../services/verification-profile");
26
- const ui_events_1 = require("./ui-events");
27
- const ui_view_model_1 = require("./ui-view-model");
28
- const agent_status_1 = require("./agent-status");
29
- const loop_budget_1 = require("./loop-budget");
30
- const observability_1 = require("../utils/observability");
31
- const chat_trace_1 = require("./chat-trace");
32
- const chat_checkpoint_1 = require("./chat-checkpoint");
33
- const chat_workspace_1 = require("./chat-workspace");
34
- const chat_presentation_1 = require("./chat-presentation");
35
- const chat_effort_1 = require("./chat-effort");
36
- const agent_mode_1 = require("../framework/agent-mode");
37
- const chat_command_scope_1 = require("./chat-command-scope");
38
- var chat_presentation_2 = require("./chat-presentation");
39
- Object.defineProperty(exports, "createAssistantStreamPresenter", { enumerable: true, get: function () { return chat_presentation_2.createAssistantStreamPresenter; } });
40
- Object.defineProperty(exports, "createToolEventPresenter", { enumerable: true, get: function () { return chat_presentation_2.createToolEventPresenter; } });
41
- Object.defineProperty(exports, "sessionMessagesToTranscriptEntries", { enumerable: true, get: function () { return chat_presentation_2.sessionMessagesToTranscriptEntries; } });
42
- class AgentChatController {
43
- setGoalCoordinator(coord) {
44
- this.goalCoordinator = coord;
45
- }
46
- resolveToolAllowlist() {
47
- // Resolve on every evaluation, including execution. A model response can
48
- // contain several serial calls prepared before the first permission prompt;
49
- // once the user chooses project/global scope, the next call in that same
50
- // response must observe the persisted grant instead of prompting again.
51
- return (toolName, args) => (0, tool_allowlist_1.resolveProjectToolAllowlist)(this.runtime.cwd).evaluator?.(toolName, args);
52
- }
53
- constructor(runtime, events, controllerOptions = {}) {
54
- this.runtime = runtime;
55
- this.events = events;
56
- this.controllerOptions = controllerOptions;
57
- /** v0.2.26: optional goal coordinator for prompt injection and turn finalization. */
58
- this.goalCoordinator = null;
59
- }
60
- setLoopStats(stats) {
61
- this.runtime.store.setLastLoopStats(stats);
62
- this.events.loopStatsUpdated?.(stats);
63
- }
64
- async runInput(input, options = {}) {
65
- const text = input.trim();
66
- if (!text)
67
- return;
68
- // Every root input owns a fresh accounting snapshot. Commands and local
69
- // fast paths are known zero-provider turns; runChat changes tokenUsage to
70
- // null before networking so missing provider usage remains fail-closed.
71
- const storeWithState = this.runtime.store;
72
- storeWithState.setState?.({
73
- tokenUsage: { promptTokens: 0, completionTokens: 0 },
74
- lastLoopStats: undefined,
75
- });
76
- const parsed = (0, parser_1.parseInput)(text);
77
- if (!parsed.isCommand) {
78
- const localFastPath = (0, chat_presentation_1.parseLocalFastPath)(text);
79
- if (localFastPath) {
80
- await this.runLocalFastPath(text, localFastPath, options);
81
- return;
82
- }
83
- await this.runChat(text, options);
84
- return;
85
- }
86
- const command = (0, commands_1.findCommand)(parsed.name);
87
- if (!command) {
88
- if ((0, skills_1.hasMatchingSkill)(text, this.runtime.cwd)) {
89
- await this.runChat(text, options);
90
- return;
91
- }
92
- const suggestions = (0, parser_1.buildCommandSuggestions)(parsed.name);
93
- this.events.append({
94
- role: 'error',
95
- title: 'unknown command',
96
- content: suggestions.length > 0
97
- ? `Unknown command: /${parsed.name}\nDid you mean: ${suggestions.map(item => `/${item}`).join(', ')}?`
98
- : `Unknown command: /${parsed.name}`,
99
- errorLayer: 'runtime',
100
- });
101
- return;
102
- }
103
- const activeRenderer = this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer ?? 'terminal';
104
- if ((0, chat_command_scope_1.rejectUnsupportedRenderer)(this.events, command, activeRenderer))
105
- return;
106
- if (parsed.name === 'clear') {
107
- if (this.events.clearView) {
108
- this.events.clearView();
109
- }
110
- else {
111
- this.events.clearTranscript();
112
- }
113
- this.events.setStatus('View cleared. Conversation context is preserved.');
114
- return;
115
- }
116
- if (parsed.name === 'exit' || parsed.name === 'quit' || parsed.name === 'q') {
117
- this.events.shutdownRequested?.('user request');
118
- await this.runtime.shutdown();
119
- return;
120
- }
121
- const compatibilityAlias = command.compatibilityAliases?.find(alias => alias.name.toLowerCase() === parsed.name.toLowerCase());
122
- const deprecation = compatibilityAlias?.lifecycle ??
123
- (command.lifecycle.status === 'deprecated' ? command.lifecycle : undefined);
124
- if (deprecation) {
125
- this.events.append({
126
- role: 'system',
127
- title: `/${parsed.name} deprecated`,
128
- content: `/${parsed.name} is deprecated${deprecation.replacement ? `; use ${deprecation.replacement}` : ''}. It will be removed in ${deprecation.removeIn ?? 'a future release'}.`,
129
- statusTone: 'warning',
130
- command: {
131
- id: command.id,
132
- name: command.name,
133
- source: command.source,
134
- success: true,
135
- },
136
- });
137
- }
138
- const ctx = this.createCommandContext(options.abortSignal, options.turnId);
139
- let commandProviderAttempts = 0;
140
- const commandProviderPreflight = async (context) => {
141
- commandProviderAttempts += 1;
142
- return this.controllerOptions.beforeProviderRequest
143
- ? this.controllerOptions.beforeProviderRequest(context)
144
- : { available: true };
145
- };
146
- const restoreProviderPreflight = typeof this.runtime.llm?.setProviderRequestPreflight === 'function'
147
- ? this.runtime.llm.setProviderRequestPreflight(commandProviderPreflight)
148
- : undefined;
149
- const commandUsage = { promptTokens: 0, completionTokens: 0 };
150
- let commandUsageEvents = 0;
151
- const unsubscribeCommandUsage = typeof this.runtime.llm?.subscribeUsage === 'function'
152
- ? this.runtime.llm.subscribeUsage(event => {
153
- commandUsageEvents += 1;
154
- commandUsage.promptTokens += event.usage.promptTokens;
155
- commandUsage.completionTokens += event.usage.completionTokens;
156
- })
157
- : undefined;
158
- let result;
159
- let output;
160
- try {
161
- if (command.audience === 'primary') {
162
- result = await command.execute(ctx, parsed.args);
163
- output = '';
164
- }
165
- else {
166
- ({ result, output } = await (0, chat_presentation_1.captureConsoleOutput)(() => command.execute(ctx, parsed.args)));
167
- }
168
- }
169
- finally {
170
- unsubscribeCommandUsage?.();
171
- restoreProviderPreflight?.();
172
- if (commandUsage.promptTokens > 0 || commandUsage.completionTokens > 0) {
173
- this.runtime.store.setTokenUsage(commandUsage);
174
- }
175
- const providerRequests = Math.max(commandProviderAttempts, commandUsageEvents);
176
- if (providerRequests > 0) {
177
- const diagnostics = (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm);
178
- const retryCount = diagnostics?.retryCount ?? 0;
179
- const fallbackCount = diagnostics?.fallbackTriggered ? 1 : 0;
180
- this.setLoopStats({
181
- turnsStarted: 1,
182
- llmRequests: providerRequests,
183
- toolCalls: 0,
184
- readOnlyToolCalls: 0,
185
- unsafeToolCalls: 0,
186
- toolResultBytes: 0,
187
- modelVisibleToolBytes: 0,
188
- summarizedBytes: 0,
189
- finishReason: commandUsageEvents > 0 ? 'completed' : 'failed',
190
- providerRetryCount: retryCount,
191
- providerRetryDelayMs: diagnostics?.retryDelayMs,
192
- providerRetryErrorTypes: diagnostics?.retryErrorTypes,
193
- providerLastRetryErrorType: diagnostics?.lastRetryErrorType,
194
- providerLastRetryStatus: diagnostics?.lastRetryStatus,
195
- providerFallbackCount: fallbackCount,
196
- providerFallbackFromModel: diagnostics?.fallbackFromModel,
197
- providerFallbackToModel: diagnostics?.fallbackToModel,
198
- providerFinalModel: diagnostics?.finalModel,
199
- providerUsingFallback: diagnostics?.usingFallback,
200
- singleReadOnlyStreak: 0,
201
- batchReadSuggestionCount: 0,
202
- localFastPathUsed: false,
203
- });
204
- }
205
- }
206
- const commandMeta = {
207
- id: command.id,
208
- name: command.name,
209
- source: command.source,
210
- success: result.success,
211
- };
212
- if (output) {
213
- this.events.append({
214
- role: result.success ? 'system' : 'error',
215
- title: `/${command.name}`,
216
- content: output,
217
- command: commandMeta,
218
- });
219
- }
220
- if (result.output) {
221
- this.events.append({
222
- role: result.success ? 'system' : 'error',
223
- title: `/${command.name}`,
224
- content: result.output,
225
- command: commandMeta,
226
- });
227
- }
228
- if (result.error) {
229
- this.events.append({
230
- role: 'error',
231
- title: `/${command.name}`,
232
- content: result.error,
233
- errorLayer: 'runtime',
234
- command: commandMeta,
235
- });
236
- }
237
- if (result.sessionPicker) {
238
- this.events.showSessionPicker(result.sessionPicker);
239
- return;
240
- }
241
- if (result.modelPicker) {
242
- this.events.showModelPicker?.(result.modelPicker);
243
- return;
244
- }
245
- if (result.editPreview) {
246
- this.events.showEditPreview(result.editPreview);
247
- return;
248
- }
249
- if (result.effortEvent) {
250
- this.events.effortEvent?.(result.effortEvent);
251
- }
252
- if (result.continueAsChat) {
253
- await this.runChat(result.chatInput ?? parsed.args, options);
254
- }
255
- }
256
- async runRequest(request, options = {}) {
257
- const internalInput = request.text?.trim() ||
258
- 'Continue pursuing the active goal from its persisted plan and evidence.';
259
- const run = () => this.runInput(internalInput, {
260
- ...options,
261
- persistAsUserMessage: request.persistAsUserMessage,
262
- inputKind: request.inputKind,
263
- });
264
- if (!request.goal) {
265
- await run();
266
- return;
267
- }
268
- await chat_trace_1.goalTraceContext.run({
269
- goalId: request.goal.goalId,
270
- goalRevision: request.goal.revision,
271
- goalInputKind: request.inputKind,
272
- getStopReason: () => this.goalCoordinator?.goal?.stopReason?.message,
273
- }, run);
274
- }
275
- async runLocalFastPath(input, action, options = {}) {
276
- const activeSession = this.runtime.getSession() ??
277
- this.runtime.ensureSession() ??
278
- (0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
279
- const sessionId = activeSession?.id;
280
- const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
281
- (0, observability_1.setDiagnosticTraceContext)({
282
- traceId: `${sessionId ?? 'local'}:${turnId}`,
283
- ...(sessionId ? { sessionId } : {}),
284
- turnId,
285
- });
286
- const localCallId = `local-${turnId}`;
287
- const start = Date.now();
288
- const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
289
- const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, action.tool, action.args);
290
- if (sessionId) {
291
- (0, session_storage_1.appendSessionMessage)(sessionId, {
292
- role: 'user',
293
- content: input,
294
- timestamp: Date.now(),
295
- });
296
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
297
- turnId,
298
- type: 'turn_start',
299
- inputBytes: (0, chat_trace_1.byteLength)(input),
300
- localFastPathUsed: true,
301
- });
302
- (0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
303
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
304
- turnId,
305
- type: 'local_fast_path',
306
- name: action.tool,
307
- ...traceArgs,
308
- note: (0, chat_trace_1.compactMiddle)(action.label, 160),
309
- });
310
- }
311
- if (options.persistAsUserMessage !== false) {
312
- this.runtime.store.addMessage({ role: 'user', content: input });
313
- }
314
- this.events.setStatus(`Running local ${action.label}...`);
315
- try {
316
- const tool = (0, tools_1.getRuntimeTools)().find(candidate => candidate.name === action.tool);
317
- if (!tool) {
318
- throw new chat_presentation_1.LocalFastPathBlockedError(`Local fast path tool ${action.tool} is unavailable.`);
319
- }
320
- const effectivePermissionMode = this.runtime.store.getEffectivePermissionMode();
321
- const toolAllowlist = this.resolveToolAllowlist();
322
- const toolContext = {
323
- cwd: this.runtime.cwd,
324
- config: {
325
- name: this.runtime.config.name,
326
- mode: this.runtime.config.mode,
327
- },
328
- sessionId,
329
- turnId,
330
- permissionMode: effectivePermissionMode,
331
- toolAllowlist,
332
- toolConfirmation: this.runtime.config.toolConfirmation,
333
- confirmToolUse: effectivePermissionMode === 'auto' ? undefined : this.controllerOptions.confirmToolUse,
334
- };
335
- let permission;
336
- try {
337
- permission = tool.checkPermissions?.(action.args, toolContext);
338
- }
339
- catch (error) {
340
- const detail = error instanceof Error ? error.message : String(error);
341
- throw new chat_presentation_1.LocalFastPathBlockedError(`Permission check failed closed: ${detail}`);
342
- }
343
- const effective = (0, tool_scheduler_1.resolveEffectivePermission)({
344
- toolName: action.tool,
345
- tool,
346
- args: action.args,
347
- permission,
348
- permissionMode: effectivePermissionMode,
349
- allowlist: toolAllowlist?.(action.tool, action.args),
350
- toolConfirmation: this.runtime.config.toolConfirmation,
351
- });
352
- if (effective.outcome === 'deny') {
353
- throw new chat_presentation_1.LocalFastPathBlockedError(effective.reason ||
354
- `Local fast path blocked by ${effective.source ?? 'permission policy'}.`);
355
- }
356
- if (effective.outcome === 'confirm') {
357
- if (this.runtime.config.toolConfirmation === 'deny' ||
358
- !this.controllerOptions.confirmToolUse) {
359
- throw new chat_presentation_1.LocalFastPathBlockedError(effective.reason || 'Local fast path requires user confirmation.');
360
- }
361
- const approved = await this.controllerOptions.confirmToolUse({
362
- name: action.tool,
363
- args: action.args,
364
- reason: effective.reason,
365
- abortSignal: options.abortSignal,
366
- });
367
- if (!approved) {
368
- throw new chat_presentation_1.LocalFastPathBlockedError(`Local fast path ${action.tool} requires confirmation and was denied by user.`);
369
- }
370
- }
371
- if (options.abortSignal?.aborted) {
372
- throw new chat_presentation_1.LocalFastPathBlockedError('Local fast path was cancelled before tool execution.');
373
- }
374
- if (sessionId) {
375
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
376
- turnId,
377
- type: 'tool_call',
378
- name: action.tool,
379
- callId: localCallId,
380
- ...traceArgs,
381
- });
382
- }
383
- const result = await (0, tools_1.executeTool)(action.tool, action.args, options.abortSignal, {
384
- ...toolContext,
385
- sessionId,
386
- turnId,
387
- });
388
- const duration = Date.now() - start;
389
- const envelope = (0, tool_serializer_1.parseToolResultEnvelope)(result);
390
- const outputBytes = typeof envelope.outputBytes === 'number'
391
- ? envelope.outputBytes
392
- : Buffer.byteLength(result, 'utf8');
393
- const formattedLocalResult = (0, chat_presentation_1.formatLocalFastPathAssistantContent)(action, result, this.runtime.cwd);
394
- const assistantContent = formattedLocalResult.content;
395
- const stats = (0, framework_1.createLocalFastPathLoopStats)({
396
- finishReason: envelope.success ? 'completed' : 'failed',
397
- toolCalls: 1,
398
- readOnlyToolCalls: action.tool === 'exec_command' ? 0 : 1,
399
- unsafeToolCalls: action.tool === 'exec_command' ? 1 : 0,
400
- toolResultBytes: outputBytes,
401
- modelVisibleToolBytes: 0,
402
- summarizedBytes: outputBytes,
403
- });
404
- const localToolResultEvent = {
405
- type: 'tool_result',
406
- name: action.tool,
407
- args: action.args,
408
- callId: localCallId,
409
- result,
410
- modelVisibleResult: result,
411
- duration,
412
- success: envelope.success,
413
- error: envelope.error,
414
- summary: envelope.summary,
415
- outputBytes,
416
- artifactRef: formattedLocalResult.artifactRef,
417
- };
418
- this.events.append({
419
- role: envelope.success ? 'tool' : 'error',
420
- title: 'local',
421
- content: (0, chat_presentation_1.toolFinishContent)(localToolResultEvent),
422
- toolActivity: (0, chat_presentation_1.structuredToolFinishActivity)(localToolResultEvent, 1, {
423
- projectPath: this.runtime.cwd,
424
- turnId,
425
- }),
426
- });
427
- this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
428
- this.setLoopStats(stats);
429
- if (sessionId) {
430
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
431
- turnId,
432
- type: 'tool_result',
433
- name: action.tool,
434
- callId: localCallId,
435
- argsSummary: traceArgs.argsSummary,
436
- argsArtifactId: traceArgs.argsArtifactId,
437
- argsBytes: traceArgs.argsBytes,
438
- success: envelope.success,
439
- duration,
440
- outputBytes,
441
- modelVisibleBytes: 0,
442
- artifactId: formattedLocalResult.artifactRef?.id,
443
- error: envelope.error ? (0, chat_trace_1.compactMiddle)(envelope.error, 240) : undefined,
444
- });
445
- (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
446
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
447
- turnId,
448
- type: 'complete',
449
- finishReason: stats.finishReason,
450
- llmRequests: stats.llmRequests,
451
- toolCalls: stats.toolCalls,
452
- readOnlyToolCalls: stats.readOnlyToolCalls,
453
- unsafeToolCalls: stats.unsafeToolCalls,
454
- localFastPathUsed: true,
455
- });
456
- (0, session_storage_1.appendSessionMessage)(sessionId, {
457
- role: 'assistant',
458
- content: assistantContent,
459
- timestamp: Date.now(),
460
- });
461
- }
462
- this.events.setStatus(envelope.success ? `Completed local ${action.label}` : `Failed local ${action.label}`);
463
- }
464
- catch (error) {
465
- const message = error instanceof Error ? error.message : String(error);
466
- this.events.append({ role: 'error', title: 'local', content: message, errorLayer: 'tool' });
467
- this.events.setStatus('Local command failed. Ready for the next input.');
468
- const assistantContent = `Local fast path failed for ${action.label}.\n\n${message}`;
469
- this.runtime.store.addMessage({ role: 'assistant', content: assistantContent });
470
- const finishReason = error instanceof chat_presentation_1.LocalFastPathBlockedError ? 'blocked' : 'failed';
471
- const stats = (0, framework_1.createLocalFastPathLoopStats)({
472
- finishReason,
473
- toolCalls: 0,
474
- });
475
- this.setLoopStats(stats);
476
- if (sessionId) {
477
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
478
- turnId,
479
- type: 'error',
480
- name: action.tool,
481
- error: (0, chat_trace_1.compactTraceError)(error),
482
- });
483
- (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace);
484
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
485
- turnId,
486
- type: 'complete',
487
- finishReason: stats.finishReason,
488
- llmRequests: stats.llmRequests,
489
- toolCalls: stats.toolCalls,
490
- localFastPathUsed: true,
491
- note: 'local_fast_path_failed',
492
- });
493
- (0, session_storage_1.appendSessionMessage)(sessionId, {
494
- role: 'assistant',
495
- content: assistantContent,
496
- timestamp: Date.now(),
497
- });
498
- }
499
- }
500
- }
501
- createCommandContext(abortSignal, turnId) {
502
- return {
503
- cwd: this.runtime.cwd,
504
- config: this.runtime.config,
505
- store: this.runtime.store,
506
- llm: this.runtime.llm,
507
- compactCoordinator: this.runtime.compactCoordinator,
508
- runtime: this.runtime.runtime,
509
- sessionId: this.runtime.getSession()?.id,
510
- turnId,
511
- ensureSession: this.runtime.ensureSession,
512
- setSession: session => {
513
- this.runtime.setSession(session);
514
- (0, chat_effort_1.applySessionEffort)(this.runtime, this.events, session);
515
- const renderer = this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer ?? 'terminal';
516
- this.events.replaceTranscript((0, chat_presentation_1.sessionMessagesToTranscriptEntries)(session.id, {
517
- includeToolOutputViews: renderer === 'tui',
518
- }));
519
- },
520
- sessionRestored: event => {
521
- this.events.sessionRestored?.(event);
522
- },
523
- getSession: this.runtime.getSession,
524
- abortSignal,
525
- writeOutput: text => {
526
- if (text.trim()) {
527
- this.events.append({ role: 'system', content: text });
528
- }
529
- },
530
- writeLine: text => {
531
- if (text?.trim()) {
532
- this.events.append({ role: 'system', content: text });
533
- }
534
- },
535
- clearView: () => {
536
- if (this.events.clearView) {
537
- this.events.clearView();
538
- }
539
- else {
540
- this.events.clearTranscript();
541
- }
542
- },
543
- requestShutdown: reason => {
544
- this.events.shutdownRequested?.(reason);
545
- },
546
- uiRenderer: this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer ?? 'terminal',
547
- uiCapabilities: (0, ui_events_1.resolveUiRendererCapabilities)(this.controllerOptions.uiCapabilities, this.controllerOptions.uiRenderer ?? this.runtime.config.ui?.renderer),
548
- agentModeLifecycle: this.controllerOptions.agentModeLifecycle,
549
- };
550
- }
551
- /**
552
- * Forward a subagent lifecycle event to the runtime event sink and session
553
- * trace. Renderers consume the same event across terminal/Ink/TUI; this is
554
- * the only place a subtask event touches the root loop.
555
- */
556
- handleSubtaskEvent(event, sessionId, turnId) {
557
- // Emit the renderer-independent runtime event first so all renderers
558
- // (terminal/Ink/TUI) consume the same lifecycle through one protocol.
559
- this.events.subtaskEvent?.(event);
560
- const stateToTraceType = {
561
- queued: 'subtask_requested',
562
- running: 'subtask_started',
563
- completed: 'subtask_completed',
564
- failed: 'subtask_failed',
565
- cancelled: 'subtask_cancelled',
566
- rejected: 'subtask_rejected',
567
- timed_out: 'subtask_timed_out',
568
- };
569
- if (sessionId) {
570
- const traceType = stateToTraceType[event.state];
571
- if (traceType) {
572
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
573
- turnId: String(turnId),
574
- type: traceType,
575
- name: `${event.role}:${event.taskId}`,
576
- argsSummary: event.objective.slice(0, 160),
577
- });
578
- }
579
- }
580
- // Surface start/complete/fail/cancel summaries in the transcript so all
581
- // renderers show subtask progress without renderer-local logic.
582
- if (event.state === 'running') {
583
- this.events.append({
584
- role: 'system',
585
- content: `▸ subtask ${event.role} started: ${event.objective.slice(0, 120)}`,
586
- });
587
- }
588
- else if (event.state === 'completed' ||
589
- event.state === 'failed' ||
590
- event.state === 'cancelled' ||
591
- event.state === 'timed_out' ||
592
- event.state === 'rejected') {
593
- const summary = event.summary ? ` — ${event.summary.slice(0, 200)}` : '';
594
- this.events.append({
595
- role: 'system',
596
- content: `◂ subtask ${event.role} ${event.state}${summary}`,
597
- });
598
- }
599
- }
600
- /**
601
- * Fold reconciled child aggregate usage into the root turn's loop stats so
602
- * `/cost` and loop-budget accounting reflect subagent cost. Child model
603
- * requests and tool calls are added to the root counters; a note records the
604
- * subagent contribution so it is distinguishable from root work.
605
- */
606
- foldSubagentUsage(stats, bundle) {
607
- if (!bundle)
608
- return stats;
609
- const usage = bundle.getAggregateUsage();
610
- if (usage.modelRequests === 0 && usage.toolCalls === 0 && usage.usageComplete === true)
611
- return stats;
612
- const subtaskCount = bundle.getSubtaskCount();
613
- const subagentSuffix = `subagents: ${usage.modelRequests} req/${usage.toolCalls} calls across ${subtaskCount} task(s)`;
614
- return {
615
- ...stats,
616
- llmRequests: (stats.llmRequests ?? 0) + usage.modelRequests,
617
- toolCalls: (stats.toolCalls ?? 0) + usage.toolCalls,
618
- readOnlyToolCalls: (stats.readOnlyToolCalls ?? 0) + usage.toolCalls,
619
- subagentPromptTokens: usage.promptTokens,
620
- subagentCompletionTokens: usage.completionTokens,
621
- subagentTotalTokens: usage.promptTokens + usage.completionTokens,
622
- usageAccountingComplete: stats.usageAccountingComplete !== false &&
623
- usage.usageComplete === true,
624
- continuationHint: stats.continuationHint
625
- ? `${stats.continuationHint} (${subagentSuffix})`
626
- : subagentSuffix,
627
- };
628
- }
629
- async runChat(input, options = {}) {
630
- if (!input) {
631
- this.events.append({
632
- role: 'error',
633
- content: 'Usage: /chat <message>',
634
- errorLayer: 'runtime',
635
- });
636
- return;
637
- }
638
- if (!this.runtime.llm || !(0, config_1.isConfigured)(this.runtime.config)) {
639
- this.events.append({
640
- role: 'error',
641
- content: 'LLM is not configured. Set ORION_CODE_API_KEY in ~/.orion-code/orion.json or environment.',
642
- errorLayer: 'provider',
643
- });
644
- return;
645
- }
646
- // Usage belongs to a single root turn. Clear the previous snapshot before
647
- // any provider request so failures without usage cannot inherit stale data.
648
- this.runtime.store.setState({ tokenUsage: null });
649
- const abortSignal = options.abortSignal;
650
- const turnId = (0, chat_trace_1.traceTurnId)(options.turnId);
651
- const activeSession = this.runtime.getSession() ??
652
- this.runtime.ensureSession() ??
653
- (0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
654
- const sessionId = activeSession?.id;
655
- (0, observability_1.setDiagnosticTraceContext)({
656
- traceId: `${sessionId ?? 'unsaved'}:${turnId}`,
657
- ...(sessionId ? { sessionId } : {}),
658
- turnId,
659
- });
660
- const preWorkspace = (0, workspace_state_1.captureWorkspaceSnapshot)(this.runtime.cwd);
661
- const runtimeTools = (0, tools_1.getRuntimeTools)();
662
- const skillResolution = (0, skills_1.resolveSkillsForTurn)({
663
- cwd: this.runtime.cwd,
664
- input,
665
- tools: runtimeTools,
666
- projectPath: activeSession?.projectPath,
667
- sessionId,
668
- });
669
- const appliedSkillNames = skillResolution.skills.map(skill => skill.name);
670
- if (sessionId && options.persistAsUserMessage !== false) {
671
- (0, session_storage_1.appendSessionMessage)(sessionId, {
672
- role: 'user',
673
- content: input,
674
- timestamp: Date.now(),
675
- appliedSkills: appliedSkillNames.length > 0 ? appliedSkillNames : undefined,
676
- });
677
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
678
- turnId,
679
- type: 'turn_start',
680
- inputBytes: (0, chat_trace_1.byteLength)(input),
681
- note: appliedSkillNames.length > 0 ? `skills=${appliedSkillNames.join(',')}` : undefined,
682
- });
683
- (0, chat_workspace_1.appendWorkspaceSnapshotTrace)(this.events, sessionId, turnId, 'pre_turn', preWorkspace);
684
- }
685
- if (options.persistAsUserMessage !== false) {
686
- this.runtime.store.addMessage({ role: 'user', content: input });
687
- }
688
- (0, prompt_context_1.refreshProjectInstructions)(this.runtime.store, this.runtime.cwd);
689
- const snapshot = this.runtime.store.getSnapshot();
690
- const effectivePermissionMode = this.runtime.store.getEffectivePermissionMode();
691
- const onPlanModeChange = (0, agent_mode_1.createPlanModeChangeHandler)(this.runtime.store, this.controllerOptions.agentModeLifecycle);
692
- const harness = (0, harness_1.createContextHarness)({
693
- cwd: this.runtime.cwd,
694
- modelId: this.runtime.llm.getModel(),
695
- state: snapshot.harnessState,
696
- config: {
697
- enabled: true,
698
- driftGuard: 'warn',
699
- completionGate: true,
700
- },
701
- });
702
- const intent = harness.updateContractFromUserInput(options.inputKind === 'goal_continuation'
703
- ? (this.goalCoordinator?.goal?.objective ?? input)
704
- : input);
705
- harness.recordAppliedSkills(skillResolution.skills);
706
- // Reconcile diagnostic: when harness state is present but objective may be incomplete
707
- if (snapshot.harnessState &&
708
- !snapshot.harnessState.rootObjective &&
709
- !snapshot.harnessState.contract?.objective) {
710
- this.events.setStatus('Resume diagnostic: harness state restored but objective may be incomplete. Run /harness explain to review.');
711
- }
712
- const subagentConfig = this.runtime.config.subagents;
713
- // The subtask capability is a root-level tool. It is exposed on normal
714
- // turns, but respects an active skill scope: when a skill restricts the
715
- // tool set, subtask is not appended (the skill owns the scope).
716
- const projectPath = activeSession?.projectPath;
717
- const subagentBundle = subagentConfig &&
718
- subagentConfig.mode !== 'off' &&
719
- this.runtime.llm &&
720
- !skillResolution.toolScopeActive
721
- ? (0, subagents_1.createSubagentBundleForTurn)({
722
- config: subagentConfig,
723
- cwd: this.runtime.cwd,
724
- rootLlmConfig: (0, subagents_1.deriveRootLlmConfig)(this.runtime.config),
725
- modelLabel: this.runtime.llm.getModel(),
726
- rootObjectiveSummary: harness.toJSON()?.rootObjective ?? input,
727
- abortSignal,
728
- resilience: this.runtime.llm.resilience,
729
- onSubtaskEvent: event => {
730
- this.handleSubtaskEvent(event, sessionId, turnId);
731
- },
732
- onSubtaskResult: (result, _batchId, objective, researchContext) => {
733
- if (!projectPath)
734
- return;
735
- const json = JSON.stringify(result);
736
- const artifact = (0, tool_artifacts_1.storeArtifact)(projectPath, `subtask_${result.role}`, json, Buffer.byteLength(json, 'utf8'));
737
- if (artifact) {
738
- // Record a trace event for artifact discoverability only.
739
- // The subtask state transition (subtask_completed) is already
740
- // emitted by handleSubtaskEvent above.
741
- if (sessionId) {
742
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
743
- turnId: String(turnId),
744
- type: 'subtask_artifact_stored',
745
- name: `${result.role}:${result.id}`,
746
- argsSummary: result.summary.slice(0, 200),
747
- argsArtifactId: artifact.id,
748
- argsBytes: artifact.outputBytes,
749
- });
750
- }
751
- }
752
- // v0.1.4 Research-to-Evidence integration: normalize every
753
- // terminal research result (including partial/failure states),
754
- // persist it under a packet-specific CAS scope, and forward the
755
- // canonical lifecycle stream to every renderer.
756
- if (result.role !== 'research' || !sessionId)
757
- return;
758
- try {
759
- const goal = this.goalCoordinator?.goal;
760
- const objectiveRevision = goal?.contract?.objectiveRevision;
761
- const hasGoalBinding = typeof goal?.goalId === 'string' && typeof objectiveRevision === 'number';
762
- // Preserve the authoritative request produced from the
763
- // original subtask capability. Reconstruct local-only only for
764
- // legacy callers that predate the additive callback context.
765
- const baseRequest = researchContext?.request ??
766
- (0, subagents_1.createLocalResearchRequest)(objective?.trim() || result.summary || 'repository research', projectPath);
767
- const request = {
768
- ...baseRequest,
769
- scope: { ...baseRequest.scope, projectRoot: projectPath },
770
- ...(hasGoalBinding
771
- ? {
772
- goalBinding: {
773
- goalId: goal.goalId,
774
- objectiveRevision,
775
- },
776
- }
777
- : {}),
778
- };
779
- const packet = (0, subagents_1.subtaskResultToPacket)(result, request, {
780
- projectPath,
781
- sessionId,
782
- ...(hasGoalBinding ? { goalId: goal.goalId, objectiveRevision } : {}),
783
- }, {
784
- externalSources: researchContext?.web?.sources,
785
- externalNotes: researchContext?.web?.notes,
786
- externalTimedOut: researchContext?.web?.timedOut,
787
- externalAborted: researchContext?.web?.aborted,
788
- });
789
- // Citation resolution can downgrade claims and mark superseded
790
- // same-URL sources stale. Resolve before validation/persistence so
791
- // the CAS token, durable packet and renderer view describe the
792
- // exact same final state (#105).
793
- const resolution = (0, subagents_1.resolveCitations)(packet);
794
- const validation = (0, subagents_1.validatePacket)(packet);
795
- if (!validation.ok)
796
- return;
797
- const saved = (0, subagents_1.saveResearchPacket)((0, subagents_1.createFileArtifactStore)(projectPath), packet, {
798
- projectPath,
799
- sessionId,
800
- packetId: packet.packetId,
801
- ...(packet.goalId ? { goalId: packet.goalId } : {}),
802
- });
803
- const view = (0, subagents_1.buildResearchView)(packet, resolution);
804
- for (const event of (0, subagents_1.toLifecycleEvents)(view, resolution)) {
805
- this.events.researchEvent?.(event);
806
- }
807
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
808
- turnId: String(turnId),
809
- type: 'subtask_artifact_stored',
810
- name: `research:${packet.packetId}`,
811
- argsSummary: `${view.stage}/${view.auditStatus}: ${packet.summary}`.slice(0, 200),
812
- argsArtifactId: `research-${saved.casToken.slice(0, 16)}`,
813
- argsBytes: Buffer.byteLength(JSON.stringify(packet), 'utf8'),
814
- });
815
- }
816
- catch {
817
- // Research persistence/rendering is observational. A storage
818
- // failure must not alter the child result or root turn state.
819
- }
820
- },
821
- // R6: wire live permission state so the subagent policy gate can
822
- // prevent background delegation while the user is deciding a tool
823
- // permission. Injected by AgentRuntimeController via chatOptions.
824
- hasPendingPermission: this.controllerOptions.hasPendingPermission,
825
- // R6: wire child usage callback so CostTracker records subagent
826
- // token consumption. Injected by AgentRuntimeController via chatOptions.
827
- onChildUsage: this.controllerOptions.onChildUsage,
828
- beforeProviderRequest: this.controllerOptions.beforeProviderRequest,
829
- })
830
- : null;
831
- const subtaskTool = subagentBundle?.tool ?? null;
832
- const turnTools = subtaskTool ? [...skillResolution.tools, subtaskTool] : skillResolution.tools;
833
- const promptCtx = {
834
- cwd: this.runtime.cwd,
835
- platform: process.platform,
836
- nodeVersion: process.version,
837
- tools: turnTools,
838
- memoryContent: snapshot.memoryContent,
839
- skillsContent: snapshot.skillsContent,
840
- projectInstructionsContent: snapshot.projectInstructionsContent,
841
- activeSkillsContent: skillResolution.promptInjection,
842
- referencedFilesContent: (0, file_context_1.buildReferencedFilesPrompt)(input, this.runtime.cwd),
843
- planMode: snapshot.planMode || snapshot.agentMode === 'plan',
844
- agentMode: snapshot.agentMode,
845
- goalContent: this.goalCoordinator?.goal?.status === 'active'
846
- ? (0, prompt_1.buildGoalContextFragment)(this.goalCoordinator.goal)?.text
847
- : undefined,
848
- };
849
- const systemPrompt = (0, framework_1.buildSystemPrompt)(promptCtx);
850
- const messages = [
851
- { role: 'system', content: systemPrompt.static, cacheControl: { type: 'ephemeral' } },
852
- ...(systemPrompt.dynamic ? [{ role: 'system', content: systemPrompt.dynamic }] : []),
853
- ...snapshot.conversationHistory,
854
- ...(options.persistAsUserMessage === false
855
- ? [{ role: 'user', content: input }]
856
- : []),
857
- ];
858
- let finalContent = '';
859
- let finalUsage;
860
- let finalModel = '';
861
- let pendingCompleteTrace = null;
862
- let pendingCompleteStats;
863
- let pendingCompact;
864
- const verificationResults = [];
865
- const sessionMessagesToRecord = [];
866
- const assistantStream = (0, chat_presentation_1.createAssistantStreamPresenter)(this.events, abortSignal);
867
- const toolEvents = (0, chat_presentation_1.createToolEventPresenter)(this.events, {
868
- projectPath: this.runtime.cwd,
869
- turnId,
870
- });
871
- let checkpointSequence = 0;
872
- const checkpointIds = [];
873
- const streamCallbacks = {
874
- onChunk: chunk => {
875
- assistantStream.appendChunk(chunk);
876
- },
877
- };
878
- const toolExecutor = async (name, args, signal) => {
879
- // The runtime-bound `subtask` tool is not in the global TOOLS registry;
880
- // dispatch it directly so it reaches the Supervisor closure.
881
- if (name === 'subtask' && subtaskTool) {
882
- const result = await subtaskTool.execute(args, {
883
- cwd: this.runtime.cwd,
884
- config: { name: this.runtime.config.name, mode: this.runtime.config.mode },
885
- abortSignal: signal,
886
- sessionId,
887
- turnId,
888
- });
889
- return JSON.stringify(result);
890
- }
891
- if (!turnTools.some(tool => tool.name === name)) {
892
- return JSON.stringify({
893
- success: false,
894
- error: skillResolution.toolScopeActive
895
- ? `Tool ${name} is not available for the active skill scope. Available tools: ${skillResolution.tools.map(tool => tool.name).join(', ') || 'none'}`
896
- : `Tool ${name} is not available.`,
897
- });
898
- }
899
- return (0, tools_1.executeTool)(name, args, signal, {
900
- cwd: this.runtime.cwd,
901
- config: {
902
- name: this.runtime.config.name,
903
- mode: this.runtime.config.mode,
904
- },
905
- sessionId,
906
- turnId,
907
- // Tools that fan out to other tools (batch_read) have to re-run the
908
- // permission gate per sub-step; they need the mode and the allowlist.
909
- permissionMode: effectivePermissionMode,
910
- toolAllowlist: this.resolveToolAllowlist(),
911
- toolConfirmation: this.runtime.config.toolConfirmation,
912
- confirmToolUse: effectivePermissionMode === 'auto' ? undefined : this.controllerOptions.confirmToolUse,
913
- onPlanModeChange,
914
- });
915
- };
916
- const loopBudget = options.inputKind === 'goal_continuation'
917
- ? (0, loop_budget_1.resolveAutonomousGoalLoopBudget)(this.runtime.config)
918
- : (0, loop_budget_1.resolveRuntimeLoopBudget)(input, this.runtime.config, harness.toJSON());
919
- let observedTurnsStarted = 0;
920
- let observedLlmRequests = 0;
921
- let observedToolCalls = 0;
922
- let observedReadOnlyToolCalls = 0;
923
- let observedUnsafeToolCalls = 0;
924
- let observedToolResultBytes = 0;
925
- let observedModelVisibleToolBytes = 0;
926
- const restoreProviderPreflight = typeof this.runtime.llm.setProviderRequestPreflight === 'function'
927
- ? this.runtime.llm.setProviderRequestPreflight(this.controllerOptions.beforeProviderRequest)
928
- : undefined;
929
- const persistInterruptedAccounting = (rootUsage, stats, usageAccountingComplete) => {
930
- const accountingStats = {
931
- ...stats,
932
- finishReason: 'cancelled',
933
- usageAccountingComplete,
934
- };
935
- const interruptedStats = this.foldSubagentUsage(accountingStats, subagentBundle);
936
- this.setLoopStats(interruptedStats);
937
- const subagentUsage = subagentBundle?.getAggregateUsage();
938
- const knownZeroRootUsage = usageAccountingComplete && interruptedStats.llmRequests === 0;
939
- if (rootUsage || knownZeroRootUsage) {
940
- this.runtime.store.setTokenUsage({
941
- promptTokens: (rootUsage?.promptTokens ?? 0) + (subagentUsage?.promptTokens ?? 0),
942
- completionTokens: (rootUsage?.completionTokens ?? 0) + (subagentUsage?.completionTokens ?? 0),
943
- });
944
- }
945
- };
946
- try {
947
- for await (const event of (0, framework_1.query)({
948
- messages,
949
- tools: turnTools,
950
- toolExecutor,
951
- llm: this.runtime.llm,
952
- streamCallbacks,
953
- costTracker: snapshot.costTracker,
954
- permissionMode: effectivePermissionMode,
955
- toolConfirmation: this.runtime.config.toolConfirmation,
956
- toolAllowlist: this.resolveToolAllowlist(),
957
- confirmToolUse: effectivePermissionMode === 'auto' ? undefined : this.controllerOptions.confirmToolUse,
958
- toolContext: {
959
- cwd: this.runtime.cwd,
960
- config: {
961
- name: this.runtime.config.name,
962
- mode: this.runtime.config.mode,
963
- },
964
- sessionId,
965
- turnId,
966
- permissionMode: effectivePermissionMode,
967
- toolAllowlist: this.resolveToolAllowlist(),
968
- toolConfirmation: this.runtime.config.toolConfirmation,
969
- confirmToolUse: effectivePermissionMode === 'auto' ? undefined : this.controllerOptions.confirmToolUse,
970
- onPlanModeChange,
971
- },
972
- abortSignal,
973
- harness,
974
- input,
975
- loopBudget,
976
- onContextUsage: usage => {
977
- this.runtime.store.setContextUsage(usage);
978
- },
979
- compactCoordinator: this.runtime.compactCoordinator,
980
- })) {
981
- switch (event.type) {
982
- case 'request_start':
983
- observedTurnsStarted = Math.max(observedTurnsStarted, event.turn);
984
- observedLlmRequests++;
985
- assistantStream.discardSegment();
986
- this.events.setStatus((0, agent_status_1.agentStepStatus)(event.turn));
987
- if (sessionId) {
988
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
989
- turnId,
990
- type: 'request_start',
991
- model: event.model,
992
- turn: event.turn,
993
- });
994
- }
995
- break;
996
- case 'prompt_assembly':
997
- if (sessionId) {
998
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
999
- turnId,
1000
- type: 'prompt_assembly',
1001
- promptModelId: event.modelId,
1002
- promptEstimatedTokens: event.estimatedTokens,
1003
- promptBudgetTokens: event.budgetTokens,
1004
- promptCoreTokens: event.coreTokens,
1005
- promptEvidenceBudgetTokens: event.evidenceBudgetTokens,
1006
- promptRecentTurnBudgetTokens: event.recentTurnBudgetTokens,
1007
- promptSections: event.sections,
1008
- promptIncludedEvidence: event.includedEvidence,
1009
- promptOmittedEvidence: event.omittedEvidence,
1010
- promptIncludedEvidenceCount: event.includedEvidenceCount,
1011
- promptOmittedEvidenceCount: event.omittedEvidenceCount,
1012
- });
1013
- }
1014
- break;
1015
- case 'assistant_tool_calls':
1016
- assistantStream.ensureMessage(event.content || '');
1017
- assistantStream.closeSegment();
1018
- this.events.setStatus((0, agent_status_1.runningToolsStatus)(event.toolCalls.length));
1019
- {
1020
- const batchReadOnlyCount = event.toolCalls.filter(tc => {
1021
- const def = skillResolution.tools.find(t => t.name === tc.function.name);
1022
- const args = (0, chat_checkpoint_1.parseToolCallArgsForRuntime)(tc);
1023
- return args && def?.isReadOnly?.(args) === true;
1024
- }).length;
1025
- const suggestion = (0, agent_status_1.batchingSuggestion)(batchReadOnlyCount);
1026
- if (suggestion) {
1027
- this.events.append({ role: 'status', content: suggestion });
1028
- }
1029
- }
1030
- const checkpointId = `${turnId}-${checkpointSequence + 1}-${(0, crypto_1.randomUUID)()}`;
1031
- const checkpointResult = (0, chat_checkpoint_1.createPreToolCheckpoint)(this.events, sessionId, turnId, checkpointId, this.runtime.cwd, event.toolCalls);
1032
- if (checkpointResult.created) {
1033
- checkpointIds.push(checkpointId);
1034
- checkpointSequence++;
1035
- }
1036
- if (checkpointResult.created && checkpointResult.risky) {
1037
- this.events.append({
1038
- role: 'status',
1039
- title: 'checkpoint',
1040
- statusTone: 'warning',
1041
- content: `Risky edit: ${checkpointResult.targetCount} files in one turn. Checkpoint ${checkpointId} created for rollback (/checkpoints restore ${checkpointId}).`,
1042
- });
1043
- }
1044
- else if (checkpointResult.risky) {
1045
- this.events.append({
1046
- role: 'status',
1047
- title: 'checkpoint',
1048
- statusTone: 'warning',
1049
- content: `Risky edit: ${checkpointResult.targetCount} files in one turn, but checkpoint creation failed. Restore any pre-existing checkpoint manually or revert via git.`,
1050
- });
1051
- }
1052
- if (sessionId) {
1053
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1054
- turnId,
1055
- type: 'assistant_tool_calls',
1056
- toolCallCount: event.toolCalls.length,
1057
- contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1058
- });
1059
- }
1060
- sessionMessagesToRecord.push({
1061
- role: 'assistant',
1062
- content: event.content || '',
1063
- timestamp: Date.now(),
1064
- tool_calls: event.toolCalls,
1065
- });
1066
- break;
1067
- case 'tool_call':
1068
- observedToolCalls++;
1069
- {
1070
- const toolDefinition = skillResolution.tools.find(tool => tool.name === event.name);
1071
- if (toolDefinition?.isReadOnly?.(event.args) === true) {
1072
- observedReadOnlyToolCalls++;
1073
- }
1074
- else {
1075
- observedUnsafeToolCalls++;
1076
- }
1077
- }
1078
- assistantStream.closeSegment();
1079
- toolEvents.start(event);
1080
- if (sessionId) {
1081
- const traceArgs = (0, chat_trace_1.buildTraceArgsDetails)(this.runtime.cwd, event.name, event.args);
1082
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1083
- turnId,
1084
- type: 'tool_call',
1085
- name: event.name,
1086
- callId: event.callId,
1087
- ...traceArgs,
1088
- batchCount: event.batchCount,
1089
- batchIndex: event.batchIndex,
1090
- });
1091
- }
1092
- break;
1093
- case 'permission_decision':
1094
- toolEvents.permission(event);
1095
- if (sessionId) {
1096
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1097
- turnId,
1098
- type: 'permission_decision',
1099
- name: event.name,
1100
- callId: event.callId,
1101
- argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
1102
- permissionBehavior: event.decision.behavior,
1103
- permissionApproved: event.decision.approved,
1104
- permissionSource: event.decision.source,
1105
- permissionReason: event.decision.reason
1106
- ? (0, chat_trace_1.compactMiddle)(event.decision.reason, 240)
1107
- : undefined,
1108
- permissionDuration: event.decision.duration,
1109
- batchCount: event.batchCount,
1110
- batchIndex: event.batchIndex,
1111
- });
1112
- }
1113
- break;
1114
- case 'tool_result': {
1115
- observedToolResultBytes += event.outputBytes ?? (0, chat_trace_1.byteLength)(event.result);
1116
- observedModelVisibleToolBytes += (0, chat_trace_1.byteLength)(event.modelVisibleResult);
1117
- toolEvents.finish(event);
1118
- if (sessionId) {
1119
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1120
- turnId,
1121
- type: 'tool_result',
1122
- name: event.name,
1123
- callId: event.callId,
1124
- argsSummary: (0, chat_trace_1.compactToolArgs)(event.args),
1125
- success: event.success,
1126
- duration: event.duration,
1127
- outputBytes: event.outputBytes,
1128
- modelVisibleBytes: (0, chat_trace_1.byteLength)(event.modelVisibleResult),
1129
- artifactId: event.artifactRef?.id,
1130
- error: event.error ? (0, chat_trace_1.compactMiddle)(event.error, 240) : undefined,
1131
- batchCount: event.batchCount,
1132
- batchIndex: event.batchIndex,
1133
- });
1134
- }
1135
- const verificationResult = (0, verification_profile_1.collectVerificationCommandResult)({
1136
- toolName: event.name,
1137
- args: event.args,
1138
- success: event.success,
1139
- outputBytes: event.outputBytes,
1140
- error: event.error,
1141
- });
1142
- if (verificationResult) {
1143
- verificationResults.push(verificationResult);
1144
- (0, chat_workspace_1.appendVerificationResultTrace)(this.events, sessionId, turnId, verificationResult);
1145
- }
1146
- sessionMessagesToRecord.push({
1147
- role: 'tool',
1148
- content: event.result,
1149
- modelVisibleContent: event.modelVisibleResult,
1150
- timestamp: Date.now(),
1151
- toolCallId: event.callId,
1152
- });
1153
- break;
1154
- }
1155
- case 'strategy_exhausted':
1156
- this.events.append({ role: 'status', content: event.suggestion });
1157
- if (sessionId) {
1158
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1159
- turnId,
1160
- type: 'strategy_exhausted',
1161
- note: (0, chat_trace_1.compactMiddle)(event.suggestion, 240),
1162
- });
1163
- }
1164
- break;
1165
- case 'warning':
1166
- this.events.append({
1167
- role: 'status',
1168
- statusTone: 'warning',
1169
- title: 'harness',
1170
- content: event.message,
1171
- });
1172
- break;
1173
- case 'message':
1174
- finalContent = event.content;
1175
- assistantStream.ensureMessage(event.content);
1176
- if (sessionId) {
1177
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1178
- turnId,
1179
- type: 'message',
1180
- contentBytes: (0, chat_trace_1.byteLength)(event.content),
1181
- });
1182
- }
1183
- if (event.content) {
1184
- sessionMessagesToRecord.push({
1185
- role: 'assistant',
1186
- content: event.content,
1187
- timestamp: Date.now(),
1188
- });
1189
- }
1190
- break;
1191
- case 'complete':
1192
- if (event.stats?.finishReason === 'blocked') {
1193
- toolEvents.finalizePendingAsSkipped('permission denied');
1194
- }
1195
- if (event.content && !finalContent) {
1196
- if (event.stats?.finishReason === 'budget_exceeded') {
1197
- assistantStream.replaceMessage(event.content);
1198
- }
1199
- else {
1200
- assistantStream.ensureMessage(event.content);
1201
- }
1202
- sessionMessagesToRecord.push({
1203
- role: 'assistant',
1204
- content: event.content,
1205
- timestamp: Date.now(),
1206
- });
1207
- }
1208
- finalContent = event.content;
1209
- finalUsage = event.usage;
1210
- finalModel = event.model;
1211
- pendingCompact = event.compact;
1212
- if (event.stats) {
1213
- pendingCompleteStats = event.stats;
1214
- (0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, event.stats);
1215
- pendingCompleteTrace = {
1216
- turnId,
1217
- type: 'complete',
1218
- model: event.model,
1219
- contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1220
- finishReason: event.stats.finishReason,
1221
- llmRequests: event.stats.llmRequests,
1222
- toolCalls: event.stats.toolCalls,
1223
- readOnlyToolCalls: event.stats.readOnlyToolCalls,
1224
- unsafeToolCalls: event.stats.unsafeToolCalls,
1225
- loopBudgetSource: event.stats.loopBudgetSource,
1226
- loopBudgetBaseProfile: event.stats.loopBudgetBaseProfile,
1227
- loopBudgetMaxLlmRequests: event.stats.loopBudgetMaxLlmRequests,
1228
- loopBudgetMaxToolCalls: event.stats.loopBudgetMaxToolCalls,
1229
- loopBudgetMaxReadOnlyFragmentation: event.stats.loopBudgetMaxReadOnlyFragmentation,
1230
- loopBudgetMaxModelVisibleBytes: event.stats.loopBudgetMaxModelVisibleBytes,
1231
- loopBudgetConfigOverride: event.stats.loopBudgetConfigOverride,
1232
- budgetExceededReason: event.stats.budgetExceededReason,
1233
- continuationActions: event.stats.continuationActions,
1234
- continuationHint: event.stats.continuationHint,
1235
- lastToolName: event.stats.lastToolName,
1236
- lastToolSummary: event.stats.lastToolSummary,
1237
- lastToolSuccess: event.stats.lastToolSuccess,
1238
- localFastPathUsed: event.stats.localFastPathUsed,
1239
- };
1240
- }
1241
- else {
1242
- pendingCompleteTrace = {
1243
- turnId,
1244
- type: 'complete',
1245
- model: event.model,
1246
- contentBytes: (0, chat_trace_1.byteLength)(event.content || ''),
1247
- };
1248
- }
1249
- break;
1250
- }
1251
- }
1252
- const wasAborted = abortSignal?.aborted === true;
1253
- if (wasAborted) {
1254
- const stats = pendingCompleteStats ??
1255
- (0, framework_1.createFailedLoopStats)({
1256
- loopBudget,
1257
- diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
1258
- turnsStarted: observedTurnsStarted,
1259
- llmRequests: observedLlmRequests,
1260
- toolCalls: observedToolCalls,
1261
- readOnlyToolCalls: observedReadOnlyToolCalls,
1262
- unsafeToolCalls: observedUnsafeToolCalls,
1263
- toolResultBytes: observedToolResultBytes,
1264
- modelVisibleToolBytes: observedModelVisibleToolBytes,
1265
- });
1266
- persistInterruptedAccounting(finalUsage, stats, finalUsage !== undefined || stats.llmRequests === 0);
1267
- assistantStream.discardSegment();
1268
- this.events.setStatus('Interrupted.');
1269
- (0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
1270
- if (sessionId) {
1271
- const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1272
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1273
- turnId,
1274
- type: 'aborted',
1275
- note: 'aborted_after_query',
1276
- });
1277
- const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1278
- ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
1279
- : undefined;
1280
- if (recoveryNotice) {
1281
- this.events.append({
1282
- role: 'status',
1283
- title: 'recovery',
1284
- statusTone: 'warning',
1285
- content: recoveryNotice,
1286
- });
1287
- }
1288
- (0, session_storage_1.removeLastIncompleteAssistantMessage)(sessionId);
1289
- }
1290
- // Persist any accumulated session messages before returning,
1291
- // so tool results from the interrupted turn are not lost.
1292
- if (sessionId && sessionMessagesToRecord.length > 0) {
1293
- (0, session_storage_1.appendSessionMessages)(sessionId, sessionMessagesToRecord);
1294
- }
1295
- return;
1296
- }
1297
- assistantStream.closeSegment();
1298
- if (sessionId) {
1299
- const { profile, summary } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1300
- if (profile.changedFiles.length > 0 && profile.required) {
1301
- this.events.setStatus((0, agent_status_1.verifyingStatus)(profile.profile));
1302
- this.controllerOptions.onVerificationStateChange?.('running');
1303
- }
1304
- if ((0, chat_workspace_1.shouldRecordVerificationLoopStats)(profile, summary)) {
1305
- const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
1306
- if (stats) {
1307
- pendingCompleteStats = (0, chat_workspace_1.withVerificationLoopStats)(stats, summary);
1308
- }
1309
- }
1310
- if ((0, verification_profile_1.shouldGateCompletion)(summary)) {
1311
- this.events.setStatus((0, agent_status_1.verificationGateStatus)(summary.skippedReason ?? 'verification checks not run'));
1312
- this.controllerOptions.onVerificationStateChange?.('gated');
1313
- const notice = (0, verification_profile_1.formatVerificationGateNotice)(summary);
1314
- this.events.append({
1315
- role: 'status',
1316
- title: 'verification',
1317
- statusTone: 'warning',
1318
- content: notice,
1319
- });
1320
- finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
1321
- (0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
1322
- if (pendingCompleteTrace) {
1323
- pendingCompleteTrace.finishReason = 'completion_gate';
1324
- pendingCompleteTrace.contentBytes = (0, chat_trace_1.byteLength)(finalContent);
1325
- pendingCompleteTrace.note = 'verification_incomplete';
1326
- }
1327
- const stats = pendingCompleteStats ?? this.runtime.store.getSnapshot().lastLoopStats;
1328
- if (stats) {
1329
- pendingCompleteStats = {
1330
- ...(0, chat_workspace_1.withVerificationLoopStats)(stats, summary),
1331
- finishReason: 'completion_gate',
1332
- };
1333
- }
1334
- }
1335
- else if (profile.changedFiles.length > 0 && profile.required) {
1336
- this.controllerOptions.onVerificationStateChange?.('passed');
1337
- }
1338
- }
1339
- if (pendingCompleteStats?.finishReason === 'budget_exceeded') {
1340
- const stats = pendingCompleteStats;
1341
- const budgetStop = (0, ui_view_model_1.createLoopBudgetStopView)(stats);
1342
- const notice = (0, ui_view_model_1.formatLoopBudgetStopView)(budgetStop, (0, ui_view_model_1.budgetStopLocaleForInput)(input));
1343
- this.events.append({
1344
- role: 'status',
1345
- title: 'budget',
1346
- statusTone: 'warning',
1347
- content: notice,
1348
- budgetStop,
1349
- });
1350
- finalContent = finalContent ? `${finalContent}\n\n${notice}` : notice;
1351
- (0, chat_trace_1.appendAssistantNotice)(sessionMessagesToRecord, notice);
1352
- if (pendingCompleteTrace) {
1353
- pendingCompleteTrace.contentBytes = (0, chat_trace_1.byteLength)(finalContent);
1354
- }
1355
- }
1356
- if (pendingCompleteStats) {
1357
- this.setLoopStats(this.foldSubagentUsage(pendingCompleteStats, subagentBundle));
1358
- }
1359
- if (finalContent) {
1360
- this.runtime.store.addMessage({ role: 'assistant', content: finalContent });
1361
- }
1362
- if (sessionId && sessionMessagesToRecord.length > 0) {
1363
- (0, session_storage_1.appendSessionMessages)(sessionId, sessionMessagesToRecord);
1364
- }
1365
- if (pendingCompact) {
1366
- try {
1367
- let committedCheckpointId;
1368
- if (sessionId) {
1369
- const sourceMessageCount = (0, session_storage_1.readSessionMessages)(sessionId).length;
1370
- const checkpoint = (0, session_storage_1.commitSessionCompactCheckpoint)({
1371
- sessionId,
1372
- mode: pendingCompact.mode,
1373
- modelId: finalModel || this.runtime.llm.getModel(),
1374
- sourceMessageCount,
1375
- transcriptStartMessageIndex: Math.max(0, sourceMessageCount - 20),
1376
- modelHistory: pendingCompact.modelHistory,
1377
- summary: pendingCompact.summary,
1378
- beforeUsage: pendingCompact.before,
1379
- afterUsage: pendingCompact.after,
1380
- });
1381
- committedCheckpointId = checkpoint.checkpointId;
1382
- this.runtime.store.setState({ conversationHistory: checkpoint.modelHistory });
1383
- }
1384
- else {
1385
- this.runtime.store.setState({
1386
- conversationHistory: pendingCompact.modelHistory.filter(message => message.role !== 'system'),
1387
- });
1388
- }
1389
- this.runtime.store.setContextUsage(pendingCompact.after);
1390
- if (sessionId) {
1391
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1392
- turnId,
1393
- type: 'compact_completed',
1394
- checkpointId: committedCheckpointId,
1395
- model: finalModel || this.runtime.llm.getModel(),
1396
- note: pendingCompact.mode,
1397
- });
1398
- }
1399
- this.events.append({
1400
- role: 'status',
1401
- title: 'auto-compact',
1402
- statusTone: 'neutral',
1403
- content: `Context reached ${pendingCompact.before.percent}% of the safe input budget. Agent core committed a ${pendingCompact.mode} compact checkpoint; current context is ${pendingCompact.after.percent}%.`,
1404
- });
1405
- }
1406
- catch (error) {
1407
- if (sessionId) {
1408
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1409
- turnId,
1410
- type: 'compact_failed',
1411
- model: finalModel || this.runtime.llm.getModel(),
1412
- error: (0, chat_trace_1.compactTraceError)(error),
1413
- note: pendingCompact.mode,
1414
- });
1415
- }
1416
- this.events.append({
1417
- role: 'error',
1418
- title: 'compact-failed',
1419
- content: `Compact checkpoint failed; the previous model context remains active. ${error instanceof Error ? error.message : String(error)}`,
1420
- errorLayer: 'runtime',
1421
- });
1422
- }
1423
- }
1424
- if (finalUsage) {
1425
- // Fold subagent token usage into /cost accounting.
1426
- if (subagentBundle) {
1427
- const subUsage = subagentBundle.getAggregateUsage();
1428
- finalUsage = {
1429
- promptTokens: finalUsage.promptTokens + subUsage.promptTokens,
1430
- completionTokens: finalUsage.completionTokens + subUsage.completionTokens,
1431
- };
1432
- }
1433
- this.runtime.store.setTokenUsage(finalUsage);
1434
- }
1435
- harness.ingestTurn({
1436
- userInput: input,
1437
- assistantContent: finalContent,
1438
- sessionMessages: sessionMessagesToRecord,
1439
- intent,
1440
- });
1441
- const harnessState = harness.toJSON();
1442
- this.runtime.store.setState({ harnessState });
1443
- (0, chat_trace_1.emitHarnessDiagnostics)(this.events, harnessState);
1444
- if (sessionId) {
1445
- if (pendingCompleteTrace) {
1446
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, pendingCompleteTrace);
1447
- }
1448
- (0, session_storage_1.updateSessionSkills)(sessionId, appliedSkillNames);
1449
- (0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
1450
- }
1451
- this.events.setStatus(finalModel ? `Completed with ${finalModel}` : 'Completed');
1452
- }
1453
- catch (error) {
1454
- // v0.2.25: Provider retry exhausted is a recoverable turn failure.
1455
- if (error instanceof provider_resilience_1.ProviderRetryExhaustedError) {
1456
- const diag = error.diagnostics;
1457
- const attempts = diag?.attempts?.length ?? '?';
1458
- const kind = diag?.attempts?.[diag.attempts.length - 1]?.failureKind ?? 'unknown';
1459
- this.events.setStatus(`Provider unavailable (${kind}, ${attempts} attempts). Retry exhausted — ready for next input.`);
1460
- this.events.append({
1461
- role: 'error',
1462
- title: 'provider',
1463
- content: `Provider retry exhausted after ${attempts} attempts (${kind}). The turn was not completed. You can try again or wait for the provider to recover.`,
1464
- errorLayer: 'provider',
1465
- });
1466
- // v0.2.25: If a goal is active, pause it on provider retry exhaustion
1467
- // so it doesn't auto-continue and burn retries.
1468
- try {
1469
- const gc = this.goalCoordinator;
1470
- if (gc?.goal?.status === 'active') {
1471
- gc.deferContinuation();
1472
- }
1473
- }
1474
- catch {
1475
- /* best effort */
1476
- }
1477
- return;
1478
- }
1479
- if ((0, chat_trace_1.isAbortError)(error, abortSignal)) {
1480
- const interruptedStats = error instanceof framework_1.QueryLoopError
1481
- ? error.stats
1482
- : (0, framework_1.createFailedLoopStats)({
1483
- loopBudget,
1484
- diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
1485
- turnsStarted: observedTurnsStarted,
1486
- llmRequests: observedLlmRequests,
1487
- toolCalls: observedToolCalls,
1488
- readOnlyToolCalls: observedReadOnlyToolCalls,
1489
- unsafeToolCalls: observedUnsafeToolCalls,
1490
- toolResultBytes: observedToolResultBytes,
1491
- modelVisibleToolBytes: observedModelVisibleToolBytes,
1492
- });
1493
- const interruptedRootUsage = error instanceof framework_1.QueryLoopError ? error.aggregateUsage : undefined;
1494
- // A thrown abort after a provider request started can only prove a
1495
- // lower bound: the in-flight request may be billable even when its
1496
- // final usage chunk never arrived.
1497
- persistInterruptedAccounting(interruptedRootUsage, interruptedStats, interruptedStats.llmRequests === 0);
1498
- assistantStream.discardSegment();
1499
- this.events.setStatus('Interrupted.');
1500
- (0, chat_presentation_1.removeTrailingUserMessage)(this.runtime);
1501
- if (sessionId) {
1502
- const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1503
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1504
- turnId,
1505
- type: 'aborted',
1506
- note: 'abort_error',
1507
- });
1508
- const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1509
- ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
1510
- : undefined;
1511
- if (recoveryNotice) {
1512
- this.events.append({
1513
- role: 'status',
1514
- title: 'recovery',
1515
- statusTone: 'warning',
1516
- content: recoveryNotice,
1517
- });
1518
- }
1519
- (0, session_storage_1.removeLastIncompleteAssistantMessage)(sessionId);
1520
- }
1521
- return;
1522
- }
1523
- assistantStream.discardSegment();
1524
- this.events.append({
1525
- role: 'error',
1526
- content: (0, chat_trace_1.formatChatError)(error),
1527
- errorLayer: (0, chat_trace_1.errorLayerForChatError)(error),
1528
- });
1529
- this.events.setStatus('Turn failed. Ready for the next input.');
1530
- const failedStats = this.foldSubagentUsage(error instanceof framework_1.QueryLoopError
1531
- ? error.stats
1532
- : (0, framework_1.createFailedLoopStats)({
1533
- loopBudget,
1534
- diagnostics: observedLlmRequests > 0 ? (0, chat_trace_1.getLastRequestDiagnostics)(this.runtime.llm) : undefined,
1535
- turnsStarted: observedTurnsStarted,
1536
- llmRequests: observedLlmRequests,
1537
- toolCalls: observedToolCalls,
1538
- readOnlyToolCalls: observedReadOnlyToolCalls,
1539
- unsafeToolCalls: observedUnsafeToolCalls,
1540
- toolResultBytes: observedToolResultBytes,
1541
- modelVisibleToolBytes: observedModelVisibleToolBytes,
1542
- }), subagentBundle);
1543
- const rootUsage = error instanceof framework_1.QueryLoopError ? error.aggregateUsage : undefined;
1544
- const subagentUsage = subagentBundle?.getAggregateUsage();
1545
- const hasSubagentUsage = (subagentUsage?.promptTokens ?? 0) > 0 || (subagentUsage?.completionTokens ?? 0) > 0;
1546
- if (rootUsage || hasSubagentUsage) {
1547
- this.runtime.store.setTokenUsage({
1548
- promptTokens: (rootUsage?.promptTokens ?? 0) + (subagentUsage?.promptTokens ?? 0),
1549
- completionTokens: (rootUsage?.completionTokens ?? 0) + (subagentUsage?.completionTokens ?? 0),
1550
- });
1551
- }
1552
- this.setLoopStats(failedStats);
1553
- if (sessionId) {
1554
- (0, chat_trace_1.recordProviderTraceEvents)(this.events, sessionId, turnId, failedStats);
1555
- const { delta } = (0, chat_workspace_1.appendPostWorkspaceTrace)(this.events, sessionId, turnId, this.runtime.cwd, preWorkspace, verificationResults);
1556
- const recoveryNotice = (0, chat_workspace_1.workspaceDeltaHasTurnChanges)(delta)
1557
- ? (0, chat_workspace_1.formatFailureRecoveryNotice)(turnId, delta, checkpointIds)
1558
- : undefined;
1559
- if (recoveryNotice) {
1560
- this.events.append({
1561
- role: 'status',
1562
- title: 'recovery',
1563
- statusTone: 'warning',
1564
- content: recoveryNotice,
1565
- });
1566
- }
1567
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1568
- turnId,
1569
- type: 'error',
1570
- error: (0, chat_trace_1.compactTraceError)(error),
1571
- note: recoveryNotice,
1572
- });
1573
- (0, chat_trace_1.recordTraceEvent)(this.events, sessionId, {
1574
- turnId,
1575
- type: 'complete',
1576
- model: failedStats.providerFinalModel ?? this.runtime.llm.getModel(),
1577
- contentBytes: 0,
1578
- finishReason: failedStats.finishReason,
1579
- llmRequests: failedStats.llmRequests,
1580
- toolCalls: failedStats.toolCalls,
1581
- readOnlyToolCalls: failedStats.readOnlyToolCalls,
1582
- unsafeToolCalls: failedStats.unsafeToolCalls,
1583
- loopBudgetSource: failedStats.loopBudgetSource,
1584
- loopBudgetBaseProfile: failedStats.loopBudgetBaseProfile,
1585
- loopBudgetMaxLlmRequests: failedStats.loopBudgetMaxLlmRequests,
1586
- loopBudgetMaxToolCalls: failedStats.loopBudgetMaxToolCalls,
1587
- loopBudgetMaxReadOnlyFragmentation: failedStats.loopBudgetMaxReadOnlyFragmentation,
1588
- loopBudgetMaxModelVisibleBytes: failedStats.loopBudgetMaxModelVisibleBytes,
1589
- loopBudgetConfigOverride: failedStats.loopBudgetConfigOverride,
1590
- localFastPathUsed: failedStats.localFastPathUsed,
1591
- });
1592
- (0, session_storage_1.removeLastIncompleteAssistantMessage)(sessionId);
1593
- // A failed turn must not leave the user's prompt dangling in the
1594
- // persisted session (it would replay on resume). The in-memory history
1595
- // is cleaned above (2969-2972); mirror that for the on-disk transcript.
1596
- if (options.persistAsUserMessage !== false) {
1597
- (0, session_storage_1.removeTrailingSessionUserMessage)(sessionId);
1598
- }
1599
- }
1600
- const history = this.runtime.store.getSnapshot().conversationHistory;
1601
- if (history.length > 0) {
1602
- this.runtime.store.setState({ conversationHistory: history.slice(0, -1) });
1603
- }
1604
- }
1605
- finally {
1606
- restoreProviderPreflight?.();
1607
- }
1608
- }
1609
- }
1610
- exports.AgentChatController = AgentChatController;
1611
- exports.InkChatController = AgentChatController;
1612
- function loadSessionIntoRuntime(runtime, sessionId) {
1613
- const history = (0, session_storage_1.loadSessionHistory)(sessionId);
1614
- runtime.store.setState({ conversationHistory: history });
1615
- runtime.store.setState({
1616
- harnessState: (0, session_storage_1.loadSessionHarnessState)(sessionId) ?? (0, session_storage_1.loadSessionMeta)(sessionId)?.harnessState,
1617
- });
1618
- return `Restored ${history.length} messages`;
1619
- }
1620
- function closeSession(runtime) {
1621
- const session = runtime.getSession();
1622
- if (!session)
1623
- return;
1624
- const messages = (0, session_storage_1.readSessionMessages)(session.id);
1625
- if (messages.length > 0) {
1626
- (0, session_storage_1.updateSessionSummary)(session.id, messages);
1627
- }
1628
- (0, session_storage_1.endSession)(session.id);
1629
- }
1630
- //# sourceMappingURL=chat-controller.js.map