@astralyn/pi 0.99.0 → 1.0.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 (512) hide show
  1. package/CHANGELOG.md +39 -3
  2. package/dist/bundle/chunks/anthropic-messages-CG2BSDQS.js +6 -0
  3. package/dist/bundle/chunks/anthropic.js +2 -2
  4. package/dist/bundle/chunks/{azure-openai-responses-RPBERDXD.js → azure-openai-responses-PBA4QKCM.js} +1 -1
  5. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  6. package/dist/bundle/chunks/{chunk-ABVRAYXT.js → chunk-6UFFVA7M.js} +2 -2
  7. package/dist/bundle/chunks/chunk-GIG5IHES.js +2 -0
  8. package/dist/bundle/chunks/{chunk-VW2P3X6P.js → chunk-HESRDUKO.js} +414 -666
  9. package/dist/bundle/chunks/{chunk-A576H74Y.js → chunk-PFZKRUMO.js} +1 -1
  10. package/dist/bundle/chunks/chunk-SGLYRVQL.js +2 -0
  11. package/dist/bundle/chunks/chunk-TRHTWM3C.js +2 -0
  12. package/dist/bundle/chunks/{chunk-DEWXBB6W.js → chunk-V66VGGOM.js} +1 -1
  13. package/dist/bundle/chunks/chunk-Z2RKSI3O.js +2 -0
  14. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-ZYSAFXXL.js → cloudflare-workers-ai-system-one-YB7XPPP4.js} +1 -1
  15. package/dist/bundle/chunks/codemode-worker.js +67 -8
  16. package/dist/bundle/chunks/github-copilot.js +1 -1
  17. package/dist/bundle/chunks/{google-generative-ai-SDNQVVXA.js → google-generative-ai-V5ZM5MCL.js} +1 -1
  18. package/dist/bundle/chunks/{google-vertex-LZXOLBIO.js → google-vertex-22THOFP5.js} +1 -1
  19. package/dist/bundle/chunks/{llama-cpp-classify-7IYGGPND.js → llama-cpp-classify-R7DQLTQN.js} +1 -1
  20. package/dist/bundle/chunks/{mistral-conversations-VYKPSSAM.js → mistral-conversations-WHSCJJWP.js} +1 -1
  21. package/dist/bundle/chunks/openai-chatgpt.js +1 -1
  22. package/dist/bundle/chunks/{openai-codex-responses-HZ4VUDXD.js → openai-codex-responses-N7GDPBPP.js} +1 -1
  23. package/dist/bundle/chunks/openai-codex.js +1 -1
  24. package/dist/bundle/chunks/{openai-completions-SKDGF6OE.js → openai-completions-RGGQK5UW.js} +1 -1
  25. package/dist/bundle/chunks/{openai-responses-FPML4SSG.js → openai-responses-3ZLD5JYI.js} +1 -1
  26. package/dist/bundle/chunks/{openrouter-images-5524IQHX.js → openrouter-images-YP3YVB54.js} +1 -1
  27. package/dist/bundle/chunks/openrouter.js +1 -1
  28. package/dist/bundle/chunks/radius.js +1 -1
  29. package/dist/bundle/chunks/{typesafe-system-one-Z2CDLKEY.js → typesafe-system-one-RREJAKWB.js} +1 -1
  30. package/dist/bundle/chunks/virtual-modules-4RQ2L6W4.js +2 -0
  31. package/dist/bundle/cli.js +1 -1
  32. package/dist/bundle/index.js +1 -1
  33. package/dist/bundle/rpc-entry.js +1 -1
  34. package/dist/cli/args.js +1 -1
  35. package/dist/cli/args.js.map +1 -1
  36. package/dist/config.d.ts +5 -8
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +16 -13
  39. package/dist/config.js.map +1 -1
  40. package/dist/core/agent-session.d.ts +21 -1
  41. package/dist/core/agent-session.d.ts.map +1 -1
  42. package/dist/core/agent-session.js +64 -11
  43. package/dist/core/agent-session.js.map +1 -1
  44. package/dist/core/extensions/index.d.ts +1 -1
  45. package/dist/core/extensions/index.d.ts.map +1 -1
  46. package/dist/core/extensions/index.js.map +1 -1
  47. package/dist/core/extensions/loader.d.ts.map +1 -1
  48. package/dist/core/extensions/loader.js +13 -1
  49. package/dist/core/extensions/loader.js.map +1 -1
  50. package/dist/core/extensions/types.d.ts +6 -1
  51. package/dist/core/extensions/types.d.ts.map +1 -1
  52. package/dist/core/extensions/types.js.map +1 -1
  53. package/dist/core/keybindings.d.ts +51 -11
  54. package/dist/core/keybindings.d.ts.map +1 -1
  55. package/dist/core/keybindings.js +11 -3
  56. package/dist/core/keybindings.js.map +1 -1
  57. package/dist/core/mcp-servers.d.ts +34 -7
  58. package/dist/core/mcp-servers.d.ts.map +1 -1
  59. package/dist/core/mcp-servers.js +52 -11
  60. package/dist/core/mcp-servers.js.map +1 -1
  61. package/dist/core/model-registry.d.ts +3 -1
  62. package/dist/core/model-registry.d.ts.map +1 -1
  63. package/dist/core/model-registry.js +4 -0
  64. package/dist/core/model-registry.js.map +1 -1
  65. package/dist/core/model-runtime.d.ts +6 -0
  66. package/dist/core/model-runtime.d.ts.map +1 -1
  67. package/dist/core/model-runtime.js +22 -18
  68. package/dist/core/model-runtime.js.map +1 -1
  69. package/dist/core/radius.d.ts +2 -0
  70. package/dist/core/radius.d.ts.map +1 -1
  71. package/dist/core/radius.js +2 -0
  72. package/dist/core/radius.js.map +1 -1
  73. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  74. package/dist/core/remote-catalog-provider.js +4 -9
  75. package/dist/core/remote-catalog-provider.js.map +1 -1
  76. package/dist/core/sdk.d.ts.map +1 -1
  77. package/dist/core/sdk.js +1 -0
  78. package/dist/core/sdk.js.map +1 -1
  79. package/dist/core/settings-manager.d.ts +7 -5
  80. package/dist/core/settings-manager.d.ts.map +1 -1
  81. package/dist/core/settings-manager.js +2 -1
  82. package/dist/core/settings-manager.js.map +1 -1
  83. package/dist/core/system-prompt.js +1 -1
  84. package/dist/core/system-prompt.js.map +1 -1
  85. package/dist/core/tasks/format.d.ts +7 -0
  86. package/dist/core/tasks/format.d.ts.map +1 -0
  87. package/dist/core/tasks/format.js +14 -0
  88. package/dist/core/tasks/format.js.map +1 -0
  89. package/dist/core/tasks/history.d.ts.map +1 -1
  90. package/dist/core/tasks/history.js +0 -19
  91. package/dist/core/tasks/history.js.map +1 -1
  92. package/dist/core/tasks/output.d.ts +8 -0
  93. package/dist/core/tasks/output.d.ts.map +1 -1
  94. package/dist/core/tasks/output.js +19 -0
  95. package/dist/core/tasks/output.js.map +1 -1
  96. package/dist/core/tasks/presentation.d.ts +1 -3
  97. package/dist/core/tasks/presentation.d.ts.map +1 -1
  98. package/dist/core/tasks/presentation.js +79 -166
  99. package/dist/core/tasks/presentation.js.map +1 -1
  100. package/dist/core/tasks/runtime.d.ts +16 -9
  101. package/dist/core/tasks/runtime.d.ts.map +1 -1
  102. package/dist/core/tasks/runtime.js +89 -106
  103. package/dist/core/tasks/runtime.js.map +1 -1
  104. package/dist/core/tasks/session.d.ts.map +1 -1
  105. package/dist/core/tasks/session.js +13 -4
  106. package/dist/core/tasks/session.js.map +1 -1
  107. package/dist/core/tasks/store.d.ts +20 -6
  108. package/dist/core/tasks/store.d.ts.map +1 -1
  109. package/dist/core/tasks/store.js +45 -18
  110. package/dist/core/tasks/store.js.map +1 -1
  111. package/dist/core/tasks/types.d.ts +14 -54
  112. package/dist/core/tasks/types.d.ts.map +1 -1
  113. package/dist/core/tasks/types.js +1 -5
  114. package/dist/core/tasks/types.js.map +1 -1
  115. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  116. package/dist/core/tools/renderers/bash.js +11 -34
  117. package/dist/core/tools/renderers/bash.js.map +1 -1
  118. package/dist/core/tools/shell-execution.d.ts +0 -1
  119. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  120. package/dist/core/tools/shell-execution.js +3 -10
  121. package/dist/core/tools/shell-execution.js.map +1 -1
  122. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  123. package/dist/core/tools/shell-tool.js +2 -4
  124. package/dist/core/tools/shell-tool.js.map +1 -1
  125. package/dist/core/tools/tasks/actions.d.ts +1 -1
  126. package/dist/core/tools/tasks/actions.d.ts.map +1 -1
  127. package/dist/core/tools/tasks/actions.js +26 -12
  128. package/dist/core/tools/tasks/actions.js.map +1 -1
  129. package/dist/core/tools/tasks/constants.d.ts +2 -6
  130. package/dist/core/tools/tasks/constants.d.ts.map +1 -1
  131. package/dist/core/tools/tasks/constants.js +2 -6
  132. package/dist/core/tools/tasks/constants.js.map +1 -1
  133. package/dist/core/tools/tasks/schema.d.ts +1 -1
  134. package/dist/core/tools/tasks/schema.d.ts.map +1 -1
  135. package/dist/core/tools/tasks/schema.js +8 -7
  136. package/dist/core/tools/tasks/schema.js.map +1 -1
  137. package/dist/core/tools/tasks/types.d.ts +8 -38
  138. package/dist/core/tools/tasks/types.d.ts.map +1 -1
  139. package/dist/core/tools/tasks/types.js +6 -11
  140. package/dist/core/tools/tasks/types.js.map +1 -1
  141. package/dist/core/virtual-models.d.ts +2 -0
  142. package/dist/core/virtual-models.d.ts.map +1 -1
  143. package/dist/core/virtual-models.js +19 -12
  144. package/dist/core/virtual-models.js.map +1 -1
  145. package/dist/extensions/btw/agent.d.ts +17 -8
  146. package/dist/extensions/btw/agent.d.ts.map +1 -1
  147. package/dist/extensions/btw/agent.js +74 -76
  148. package/dist/extensions/btw/agent.js.map +1 -1
  149. package/dist/extensions/btw/controller.d.ts +0 -1
  150. package/dist/extensions/btw/controller.d.ts.map +1 -1
  151. package/dist/extensions/btw/controller.js +26 -33
  152. package/dist/extensions/btw/controller.js.map +1 -1
  153. package/dist/extensions/btw/panel.d.ts +13 -14
  154. package/dist/extensions/btw/panel.d.ts.map +1 -1
  155. package/dist/extensions/btw/panel.js +38 -29
  156. package/dist/extensions/btw/panel.js.map +1 -1
  157. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  158. package/dist/extensions/codemode/execute.js +197 -51
  159. package/dist/extensions/codemode/execute.js.map +1 -1
  160. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  161. package/dist/extensions/codemode/renderer.js +43 -25
  162. package/dist/extensions/codemode/renderer.js.map +1 -1
  163. package/dist/extensions/codemode/tool.d.ts +12 -11
  164. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  165. package/dist/extensions/codemode/tool.js +73 -129
  166. package/dist/extensions/codemode/tool.js.map +1 -1
  167. package/dist/extensions/codemode/worker.d.ts +1 -1
  168. package/dist/extensions/codemode/worker.js +1 -1
  169. package/dist/extensions/codemode/worker.js.map +1 -1
  170. package/dist/extensions/deepwiki/schema.d.ts +1 -1
  171. package/dist/extensions/index.d.ts.map +1 -1
  172. package/dist/extensions/index.js +0 -2
  173. package/dist/extensions/index.js.map +1 -1
  174. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  175. package/dist/extensions/mcp/cli.js +20 -5
  176. package/dist/extensions/mcp/cli.js.map +1 -1
  177. package/dist/extensions/mcp/config.d.ts +4 -2
  178. package/dist/extensions/mcp/config.d.ts.map +1 -1
  179. package/dist/extensions/mcp/config.js +14 -2
  180. package/dist/extensions/mcp/config.js.map +1 -1
  181. package/dist/extensions/mcp/index.d.ts +32 -8
  182. package/dist/extensions/mcp/index.d.ts.map +1 -1
  183. package/dist/extensions/mcp/index.js +235 -61
  184. package/dist/extensions/mcp/index.js.map +1 -1
  185. package/dist/extensions/mcp/oauth.d.ts +10 -7
  186. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  187. package/dist/extensions/mcp/oauth.js +56 -31
  188. package/dist/extensions/mcp/oauth.js.map +1 -1
  189. package/dist/extensions/mcp/runtime.d.ts +2 -0
  190. package/dist/extensions/mcp/runtime.d.ts.map +1 -1
  191. package/dist/extensions/mcp/runtime.js +16 -9
  192. package/dist/extensions/mcp/runtime.js.map +1 -1
  193. package/dist/extensions/mcp/tools.d.ts +5 -4
  194. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  195. package/dist/extensions/mcp/tools.js +33 -15
  196. package/dist/extensions/mcp/tools.js.map +1 -1
  197. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  198. package/dist/extensions/mcp/ui.js +4 -2
  199. package/dist/extensions/mcp/ui.js.map +1 -1
  200. package/dist/extensions/provider/catalog.d.ts +8 -1
  201. package/dist/extensions/provider/catalog.d.ts.map +1 -1
  202. package/dist/extensions/provider/catalog.js +31 -0
  203. package/dist/extensions/provider/catalog.js.map +1 -1
  204. package/dist/extensions/provider/connection.d.ts +4 -1
  205. package/dist/extensions/provider/connection.d.ts.map +1 -1
  206. package/dist/extensions/provider/connection.js +1 -5
  207. package/dist/extensions/provider/connection.js.map +1 -1
  208. package/dist/extensions/provider/editing.d.ts +36 -0
  209. package/dist/extensions/provider/editing.d.ts.map +1 -0
  210. package/dist/extensions/provider/editing.js +99 -0
  211. package/dist/extensions/provider/editing.js.map +1 -0
  212. package/dist/extensions/provider/json-fields.d.ts +5 -0
  213. package/dist/extensions/provider/json-fields.d.ts.map +1 -0
  214. package/dist/extensions/provider/json-fields.js +31 -0
  215. package/dist/extensions/provider/json-fields.js.map +1 -0
  216. package/dist/extensions/provider/store.d.ts +1 -4
  217. package/dist/extensions/provider/store.d.ts.map +1 -1
  218. package/dist/extensions/provider/store.js +2 -30
  219. package/dist/extensions/provider/store.js.map +1 -1
  220. package/dist/extensions/provider/ui/builtin-data.d.ts +0 -2
  221. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  222. package/dist/extensions/provider/ui/builtin-data.js +14 -79
  223. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  224. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  225. package/dist/extensions/provider/ui/compat.js +6 -9
  226. package/dist/extensions/provider/ui/compat.js.map +1 -1
  227. package/dist/extensions/provider/ui/controls.d.ts +48 -0
  228. package/dist/extensions/provider/ui/controls.d.ts.map +1 -0
  229. package/dist/extensions/provider/ui/controls.js +108 -0
  230. package/dist/extensions/provider/ui/controls.js.map +1 -0
  231. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  232. package/dist/extensions/provider/ui/dictionary.js +6 -9
  233. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  234. package/dist/extensions/provider/ui/editor.d.ts +3 -3
  235. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  236. package/dist/extensions/provider/ui/editor.js +35 -140
  237. package/dist/extensions/provider/ui/editor.js.map +1 -1
  238. package/dist/extensions/provider/ui/fetch-models.d.ts +0 -3
  239. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  240. package/dist/extensions/provider/ui/fetch-models.js +49 -44
  241. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  242. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  243. package/dist/extensions/provider/ui/model-fields.js +11 -14
  244. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  245. package/dist/extensions/provider/ui/model-options.d.ts +4 -34
  246. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  247. package/dist/extensions/provider/ui/model-options.js +90 -271
  248. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  249. package/dist/extensions/provider/ui/pane.d.ts +4 -18
  250. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  251. package/dist/extensions/provider/ui/pane.js.map +1 -1
  252. package/dist/extensions/provider/ui/provider-fields.d.ts +2 -19
  253. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  254. package/dist/extensions/provider/ui/provider-fields.js +58 -171
  255. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  256. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  257. package/dist/extensions/provider/ui/thinking-map.js +6 -9
  258. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  259. package/dist/extensions/question/detail-pane.d.ts +7 -2
  260. package/dist/extensions/question/detail-pane.d.ts.map +1 -1
  261. package/dist/extensions/question/detail-pane.js +16 -5
  262. package/dist/extensions/question/detail-pane.js.map +1 -1
  263. package/dist/extensions/question/dialog-view.d.ts +41 -0
  264. package/dist/extensions/question/dialog-view.d.ts.map +1 -0
  265. package/dist/extensions/question/dialog-view.js +329 -0
  266. package/dist/extensions/question/dialog-view.js.map +1 -0
  267. package/dist/extensions/question/dialog.d.ts +3 -3
  268. package/dist/extensions/question/dialog.d.ts.map +1 -1
  269. package/dist/extensions/question/dialog.js +220 -634
  270. package/dist/extensions/question/dialog.js.map +1 -1
  271. package/dist/extensions/question/index.d.ts.map +1 -1
  272. package/dist/extensions/question/index.js +2 -3
  273. package/dist/extensions/question/index.js.map +1 -1
  274. package/dist/extensions/question/render.d.ts.map +1 -1
  275. package/dist/extensions/question/render.js +22 -32
  276. package/dist/extensions/question/render.js.map +1 -1
  277. package/dist/extensions/question/results.d.ts.map +1 -1
  278. package/dist/extensions/question/results.js +56 -12
  279. package/dist/extensions/question/results.js.map +1 -1
  280. package/dist/extensions/question/schema.d.ts +21 -6
  281. package/dist/extensions/question/schema.d.ts.map +1 -1
  282. package/dist/extensions/question/schema.js.map +1 -1
  283. package/dist/extensions/question/state.d.ts +9 -7
  284. package/dist/extensions/question/state.d.ts.map +1 -1
  285. package/dist/extensions/question/state.js +63 -54
  286. package/dist/extensions/question/state.js.map +1 -1
  287. package/dist/extensions/question/types.d.ts +41 -18
  288. package/dist/extensions/question/types.d.ts.map +1 -1
  289. package/dist/extensions/question/types.js.map +1 -1
  290. package/dist/extensions/statusline/index.d.ts +4 -0
  291. package/dist/extensions/statusline/index.d.ts.map +1 -1
  292. package/dist/extensions/statusline/index.js +18 -355
  293. package/dist/extensions/statusline/index.js.map +1 -1
  294. package/dist/extensions/statusline/render.d.ts +19 -0
  295. package/dist/extensions/statusline/render.d.ts.map +1 -0
  296. package/dist/extensions/statusline/render.js +163 -0
  297. package/dist/extensions/statusline/render.js.map +1 -0
  298. package/dist/extensions/statusline/usage.d.ts +12 -0
  299. package/dist/extensions/statusline/usage.d.ts.map +1 -0
  300. package/dist/extensions/statusline/usage.js +36 -0
  301. package/dist/extensions/statusline/usage.js.map +1 -0
  302. package/dist/extensions/tool-search/tool.d.ts +5 -4
  303. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  304. package/dist/extensions/tool-search/tool.js +7 -28
  305. package/dist/extensions/tool-search/tool.js.map +1 -1
  306. package/dist/extensions/web-search/execute.d.ts +1 -5
  307. package/dist/extensions/web-search/execute.d.ts.map +1 -1
  308. package/dist/extensions/web-search/execute.js +4 -9
  309. package/dist/extensions/web-search/execute.js.map +1 -1
  310. package/dist/extensions/web-search/format.d.ts +12 -3
  311. package/dist/extensions/web-search/format.d.ts.map +1 -1
  312. package/dist/extensions/web-search/format.js +33 -25
  313. package/dist/extensions/web-search/format.js.map +1 -1
  314. package/dist/extensions/web-search/index.d.ts.map +1 -1
  315. package/dist/extensions/web-search/index.js +6 -29
  316. package/dist/extensions/web-search/index.js.map +1 -1
  317. package/dist/extensions/web-search/providers/deepseek.d.ts.map +1 -1
  318. package/dist/extensions/web-search/providers/deepseek.js +0 -1
  319. package/dist/extensions/web-search/providers/deepseek.js.map +1 -1
  320. package/dist/extensions/web-search/providers/http.d.ts +1 -1
  321. package/dist/extensions/web-search/providers/http.d.ts.map +1 -1
  322. package/dist/extensions/web-search/providers/http.js.map +1 -1
  323. package/dist/extensions/web-search/providers/minimax.d.ts.map +1 -1
  324. package/dist/extensions/web-search/providers/minimax.js +0 -1
  325. package/dist/extensions/web-search/providers/minimax.js.map +1 -1
  326. package/dist/extensions/web-search/render.d.ts +7 -2
  327. package/dist/extensions/web-search/render.d.ts.map +1 -1
  328. package/dist/extensions/web-search/render.js +32 -4
  329. package/dist/extensions/web-search/render.js.map +1 -1
  330. package/dist/extensions/web-search/results.d.ts.map +1 -1
  331. package/dist/extensions/web-search/results.js +3 -8
  332. package/dist/extensions/web-search/results.js.map +1 -1
  333. package/dist/extensions/web-search/types.d.ts +4 -2
  334. package/dist/extensions/web-search/types.d.ts.map +1 -1
  335. package/dist/extensions/web-search/types.js.map +1 -1
  336. package/dist/index.d.ts +2 -4
  337. package/dist/index.d.ts.map +1 -1
  338. package/dist/index.js +0 -1
  339. package/dist/index.js.map +1 -1
  340. package/dist/main.d.ts.map +1 -1
  341. package/dist/main.js +6 -0
  342. package/dist/main.js.map +1 -1
  343. package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
  344. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  345. package/dist/modes/interactive/components/oauth-selector.js +24 -21
  346. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  347. package/dist/modes/interactive/components/pi-logo-animation.d.ts +68 -0
  348. package/dist/modes/interactive/components/pi-logo-animation.d.ts.map +1 -0
  349. package/dist/modes/interactive/components/pi-logo-animation.js +1076 -0
  350. package/dist/modes/interactive/components/pi-logo-animation.js.map +1 -0
  351. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts +7 -0
  352. package/dist/modes/interactive/components/pi-logo-animation.lazy.d.ts.map +1 -0
  353. package/dist/modes/interactive/components/pi-logo-animation.lazy.js +12 -0
  354. package/dist/modes/interactive/components/pi-logo-animation.lazy.js.map +1 -0
  355. package/dist/modes/interactive/components/pi-logo.d.ts +7 -0
  356. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -1
  357. package/dist/modes/interactive/components/pi-logo.js +13 -1
  358. package/dist/modes/interactive/components/pi-logo.js.map +1 -1
  359. package/dist/modes/interactive/components/radius-login-selector.d.ts +15 -0
  360. package/dist/modes/interactive/components/radius-login-selector.d.ts.map +1 -0
  361. package/dist/modes/interactive/components/radius-login-selector.js +83 -0
  362. package/dist/modes/interactive/components/radius-login-selector.js.map +1 -0
  363. package/dist/modes/interactive/components/settings-selector.d.ts +3 -3
  364. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  365. package/dist/modes/interactive/components/settings-selector.js +5 -5
  366. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  367. package/dist/modes/interactive/components/status-marker.d.ts +0 -2
  368. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  369. package/dist/modes/interactive/components/status-marker.js +0 -4
  370. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  371. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  372. package/dist/modes/interactive/components/user-message.js +5 -4
  373. package/dist/modes/interactive/components/user-message.js.map +1 -1
  374. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  375. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/visual-truncate.js +36 -6
  377. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  378. package/dist/modes/interactive/interactive-mode.d.ts +10 -0
  379. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  380. package/dist/modes/interactive/interactive-mode.js +167 -40
  381. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  382. package/dist/modes/interactive/tasks/completion-render.d.ts +1 -1
  383. package/dist/modes/interactive/tasks/completion-render.d.ts.map +1 -1
  384. package/dist/modes/interactive/tasks/completion-render.js +28 -82
  385. package/dist/modes/interactive/tasks/completion-render.js.map +1 -1
  386. package/dist/modes/interactive/tasks/index.d.ts.map +1 -1
  387. package/dist/modes/interactive/tasks/index.js +18 -13
  388. package/dist/modes/interactive/tasks/index.js.map +1 -1
  389. package/dist/modes/interactive/tasks/inspector.d.ts +35 -0
  390. package/dist/modes/interactive/tasks/inspector.d.ts.map +1 -0
  391. package/dist/modes/interactive/tasks/inspector.js +93 -0
  392. package/dist/modes/interactive/tasks/inspector.js.map +1 -0
  393. package/dist/modes/interactive/tasks/layout.d.ts +40 -0
  394. package/dist/modes/interactive/tasks/layout.d.ts.map +1 -0
  395. package/dist/modes/interactive/tasks/layout.js +212 -0
  396. package/dist/modes/interactive/tasks/layout.js.map +1 -0
  397. package/dist/modes/interactive/tasks/list.d.ts +21 -0
  398. package/dist/modes/interactive/tasks/list.d.ts.map +1 -0
  399. package/dist/modes/interactive/tasks/list.js +96 -0
  400. package/dist/modes/interactive/tasks/list.js.map +1 -0
  401. package/dist/modes/interactive/tasks/manager.d.ts +29 -36
  402. package/dist/modes/interactive/tasks/manager.d.ts.map +1 -1
  403. package/dist/modes/interactive/tasks/manager.js +315 -315
  404. package/dist/modes/interactive/tasks/manager.js.map +1 -1
  405. package/dist/modes/interactive/tasks/model.d.ts +21 -0
  406. package/dist/modes/interactive/tasks/model.d.ts.map +1 -0
  407. package/dist/modes/interactive/tasks/model.js +41 -0
  408. package/dist/modes/interactive/tasks/model.js.map +1 -0
  409. package/dist/modes/interactive/tasks/render.d.ts +5 -19
  410. package/dist/modes/interactive/tasks/render.d.ts.map +1 -1
  411. package/dist/modes/interactive/tasks/render.js +18 -102
  412. package/dist/modes/interactive/tasks/render.js.map +1 -1
  413. package/dist/modes/interactive/tasks/task-view.d.ts +8 -48
  414. package/dist/modes/interactive/tasks/task-view.d.ts.map +1 -1
  415. package/dist/modes/interactive/tasks/task-view.js +11 -51
  416. package/dist/modes/interactive/tasks/task-view.js.map +1 -1
  417. package/dist/modes/interactive/tasks/text.d.ts +1 -7
  418. package/dist/modes/interactive/tasks/text.d.ts.map +1 -1
  419. package/dist/modes/interactive/tasks/text.js +6 -29
  420. package/dist/modes/interactive/tasks/text.js.map +1 -1
  421. package/dist/modes/interactive/tasks/viewport.d.ts +2 -0
  422. package/dist/modes/interactive/tasks/viewport.d.ts.map +1 -1
  423. package/dist/modes/interactive/tasks/viewport.js +17 -7
  424. package/dist/modes/interactive/tasks/viewport.js.map +1 -1
  425. package/dist/modes/interactive/tasks/views.d.ts +9 -0
  426. package/dist/modes/interactive/tasks/views.d.ts.map +1 -0
  427. package/dist/modes/interactive/tasks/views.js +42 -0
  428. package/dist/modes/interactive/tasks/views.js.map +1 -0
  429. package/dist/modes/interactive/theme/system-theme.d.ts +2 -1
  430. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -1
  431. package/dist/modes/interactive/theme/system-theme.js +16 -5
  432. package/dist/modes/interactive/theme/system-theme.js.map +1 -1
  433. package/docs/bundled/README.md +0 -1
  434. package/docs/bundled/extensions/question.md +2 -2
  435. package/docs/bundled/extensions/statusline.md +24 -15
  436. package/docs/bundled/tasks.md +34 -48
  437. package/docs/codemode.md +207 -0
  438. package/docs/docs.json +4 -4
  439. package/docs/environment-variables.md +1 -1
  440. package/docs/extensions.md +7 -9
  441. package/docs/keybindings.md +13 -6
  442. package/docs/mcp.md +142 -82
  443. package/docs/models.md +21 -0
  444. package/docs/providers.md +8 -0
  445. package/docs/sdk.md +2 -2
  446. package/docs/session-format.md +12 -22
  447. package/docs/settings.md +4 -2
  448. package/docs/tui.md +1 -1
  449. package/docs/usage.md +6 -16
  450. package/examples/README.md +1 -1
  451. package/examples/extensions/README.md +1 -2
  452. package/examples/extensions/built-in-tool-renderer.ts +16 -40
  453. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  454. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  455. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  456. package/examples/extensions/gondolin/package-lock.json +2 -2
  457. package/examples/extensions/gondolin/package.json +1 -1
  458. package/examples/extensions/minimal-mode.ts +24 -96
  459. package/examples/extensions/sandbox/package-lock.json +2 -2
  460. package/examples/extensions/sandbox/package.json +1 -1
  461. package/examples/extensions/with-deps/package-lock.json +2 -2
  462. package/examples/extensions/with-deps/package.json +1 -1
  463. package/examples/sdk/14-codemode-mcp.ts +2 -2
  464. package/npm-shrinkwrap.json +69 -58
  465. package/package.json +11 -10
  466. package/dist/bundle/chunks/anthropic-messages-KIXY7EDT.js +0 -6
  467. package/dist/bundle/chunks/chunk-CLLDCO64.js +0 -2
  468. package/dist/bundle/chunks/chunk-UUSTLCVC.js +0 -2
  469. package/dist/bundle/chunks/chunk-VWCWZD6E.js +0 -2
  470. package/dist/bundle/chunks/virtual-modules-TQRORWJQ.js +0 -2
  471. package/dist/core/tasks/view-data.d.ts +0 -8
  472. package/dist/core/tasks/view-data.d.ts.map +0 -1
  473. package/dist/core/tasks/view-data.js +0 -61
  474. package/dist/core/tasks/view-data.js.map +0 -1
  475. package/dist/core/tasks/view.d.ts +0 -30
  476. package/dist/core/tasks/view.d.ts.map +0 -1
  477. package/dist/core/tasks/view.js +0 -50
  478. package/dist/core/tasks/view.js.map +0 -1
  479. package/dist/core/tools/renderers/shell-task.d.ts +0 -4
  480. package/dist/core/tools/renderers/shell-task.d.ts.map +0 -1
  481. package/dist/core/tools/renderers/shell-task.js +0 -35
  482. package/dist/core/tools/renderers/shell-task.js.map +0 -1
  483. package/dist/extensions/todo/constants.d.ts +0 -16
  484. package/dist/extensions/todo/constants.d.ts.map +0 -1
  485. package/dist/extensions/todo/constants.js +0 -30
  486. package/dist/extensions/todo/constants.js.map +0 -1
  487. package/dist/extensions/todo/index.d.ts +0 -3
  488. package/dist/extensions/todo/index.d.ts.map +0 -1
  489. package/dist/extensions/todo/index.js +0 -98
  490. package/dist/extensions/todo/index.js.map +0 -1
  491. package/dist/extensions/todo/schema.d.ts +0 -60
  492. package/dist/extensions/todo/schema.d.ts.map +0 -1
  493. package/dist/extensions/todo/schema.js +0 -56
  494. package/dist/extensions/todo/schema.js.map +0 -1
  495. package/dist/extensions/todo/state.d.ts +0 -34
  496. package/dist/extensions/todo/state.d.ts.map +0 -1
  497. package/dist/extensions/todo/state.js +0 -425
  498. package/dist/extensions/todo/state.js.map +0 -1
  499. package/dist/extensions/todo/view.d.ts +0 -36
  500. package/dist/extensions/todo/view.d.ts.map +0 -1
  501. package/dist/extensions/todo/view.js +0 -580
  502. package/dist/extensions/todo/view.js.map +0 -1
  503. package/dist/extensions/todo/widget.d.ts +0 -15
  504. package/dist/extensions/todo/widget.d.ts.map +0 -1
  505. package/dist/extensions/todo/widget.js +0 -50
  506. package/dist/extensions/todo/widget.js.map +0 -1
  507. package/dist/modes/interactive/tasks/fallback-view.d.ts +0 -4
  508. package/dist/modes/interactive/tasks/fallback-view.d.ts.map +0 -1
  509. package/dist/modes/interactive/tasks/fallback-view.js +0 -27
  510. package/dist/modes/interactive/tasks/fallback-view.js.map +0 -1
  511. package/docs/bundled/extensions/todo.md +0 -104
  512. package/examples/extensions/todo.ts +0 -297
@@ -1 +1 @@
1
- {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../../src/core/tasks/presentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWjG,MAAM,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/B,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC;AAC9B,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,8EAA8E;AAC9E,SAAS,MAAM,CAAC,KAAc;IAC7B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7G,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/D,IAAI,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5F,OAAO,UAAU,EAAE,KAAK,CAAC;AAC1B,CAAC;AAED,oFAAoF;AACpF,SAAS,MAAM,CAAC,KAAc,EAAE,KAAa;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK;QAAE,OAAO,MAAM,CAAC;IACtE,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK;YAAE,GAAG,GAAG,MAAM,CAAC;;YACnF,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,MAAc,EAAE,GAAW,EAAE,KAAa;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,IAAI,CAAC,KAAc,EAAE,KAAa;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7C,IAAI,OAAO,SAAS,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QACpC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC;QAC1C,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,CAAC;QAChD,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC;QACtD,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC;QAC5C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;QACnD,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;KAC5C,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAI,KAAc,EAAE,IAA2B;IAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnH,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAmB;QAClC,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC;QAClD,IAAI,EAAE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC;KAC/C,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,UAAU,CAAC,KAAK,GAAG;YAClB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;YACxC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;SACnD,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAY,EAAE;YACrD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO;gBACN,GAAG,UAAU,CAAC,KAAK,CAAC;gBACpB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC;gBAC3C,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC;gBACjD,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC;gBAC/C,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;aAC3C,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACrC,IACC,KAAK,KAAK,WAAW;QACrB,KAAK,KAAK,SAAS;QACnB,KAAK,KAAK,QAAQ;QAClB,KAAK,KAAK,WAAW;QACrB,KAAK,KAAK,SAAS;QAEnB,OAAO,KAAK,CAAC;IACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC7C,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAChD,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACrD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACvF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QAC9D,IACC,OAAO,MAAM,KAAK,QAAQ;YAC1B,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC;YAC9B,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,GAAG;YACnB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG;YAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAErB,OAAO,SAAS,CAAC;QAClB,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,IACC,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;YAChC,SAAS,GAAG,CAAC;YACb,OAAO,OAAO,KAAK,QAAQ;YAC3B,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC;YAC9B,OAAO,GAAG,SAAS;YAEnB,OAAO,SAAS,CAAC;QAClB,MAAM,MAAM,GAAG;YACd,OAAO,EAAE,CAAU;YACnB,MAAM;YACN,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,CAAC;YACvD,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC/C,SAAS;YACT,OAAO;YACP,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;YAC5C,QAAQ,EAAE,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC;SAClD,CAAC;QACF,IAAI,QAAgC,CAAC;QACrC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC3C,IACC,QAAQ,KAAK,SAAS;gBACtB,QAAQ,KAAK,IAAI;gBACjB,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAEjE,OAAO,SAAS,CAAC;YAClB,2EAA2E;YAC3E,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YACjF,QAAQ,GAAG;gBACV,GAAG,MAAM;gBACT,IAAI;gBACJ,MAAM;gBACN,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC;gBAC3C,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;gBAChE,GAAG,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC;gBACxC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/C,UAAU,EACT,UAAU;oBACV,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC1B,UAAU,CAAC,MAAM,IAAI,IAAI;oBACzB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,IAAI;oBACpD,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,SAAS;gBACb,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;aACnD,CAAC;QACH,CAAC;aAAM,CAAC;YACP,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACvC,QAAQ,GAAG;gBACV,GAAG,MAAM;gBACT,IAAI;gBACJ,MAAM;gBACN,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC;gBAChD,MAAM,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC;aACrE,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAkB;IACxD,MAAM,MAAM,GAAa;QACxB,IAAI,EACH,IAAI,CAAC,MAAM,EAAE,OAAO;aAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;aACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,CAAC,IAAI,CAAC;YACZ,IAAI,CAAC,UAAU,EAAE,IAAI;YACrB,EAAE;QACH,SAAS,EAAE,IAAI,CAAC,eAAe,IAAI,KAAK;KACxC,CAAC;IACF,MAAM,MAAM,GAAG;QACd,OAAO,EAAE,CAAC;QACV,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ;KACnC,CAAC;IACF,MAAM,QAAQ,GAAG,kBAAkB,CAClC,IAAI,CAAC,MAAM,KAAK,KAAK;QACpB,CAAC,CAAC;YACA,GAAG,MAAM;YACT,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI;YACnC,OAAO,EACN,IAAI,CAAC,OAAO,KAAK,SAAS;gBACzB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,gBAAgB,IAAI,KAAK,EAAE;YACrE,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,IAAI,MAAM;SAChD;QACF,CAAC,CAAC;YACA,GAAG,MAAM;YACT,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACnC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;SAC3D,CACH,CAAC;IACF,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACzE,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACzE,MAAM,QAAQ,GAAG,uEAAuE,CAAC;AAEzF,SAAS,SAAS,CAAC,KAAe,EAAE,KAAa,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;QACvC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1D,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;KAChC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,+EAA+E;AAC/E,SAAS,YAAY,CAAC,QAAgC;IACrD,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACzB,KAAK,WAAW;YACf,OAAO,6EAA6E,CAAC;QACtF,KAAK,SAAS;YACb,OAAO,+IAA+I,CAAC;QACxJ,KAAK,QAAQ,CAAC;QACd,KAAK,SAAS,CAAC,CAAC,CAAC;YAChB,IAAI,QAAQ,CAAC,QAAQ;gBAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC;YAChD,OAAO,6FAA6F,CAAC;QACtG,CAAC;QACD;YACC,OAAO,EAAE,CAAC;IACZ,CAAC;AACF,CAAC;AAED,6FAA6F;AAC7F,SAAS,gBAAgB,CAAC,QAAgC;IACzD,MAAM,MAAM,GAAG;QACd,cAAc,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,MAAM,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACpG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;KAC5D,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClB,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC/B,IAAI,QAAQ,CAAC,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,aAAa,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACzF,IAAI,QAAQ,CAAC,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,QAAQ,CAAC,UAAU;YAAE,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,SAAS,GAAG,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3D,8EAA8E;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3F,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3F,OAAO,CACN,MAAM;YACN,QAAQ,CAAC,KAAK;iBACZ,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBACtB,MAAM,OAAO,GAAG,OAAO,KAAK,GAAG,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC1I,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI;oBAC9B,CAAC,CAAC,MAAM,CAAC,MAAM;oBACf,CAAC,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvE,OAAO,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;YACrG,CAAC,CAAC;iBACD,IAAI,CAAC,aAAa,CAAC;YACrB,MAAM,CACN,CAAC;IACH,CAAC;IACD,OAAO,CACN,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,CAC/G,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAkB;IACvD,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO;QACN,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,iBAAiB;QAC7B,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;QAClC,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;AACH,CAAC","sourcesContent":["import type { CustomMessage } from \"../messages.ts\";\nimport { truncateHead } from \"../tools/truncate.ts\";\nimport { boundText, TASK_DETAILS_BYTES, TASK_RESULT_BYTES, TASK_TITLE_BYTES } from \"./output.ts\";\nimport type {\n\tTaskCompletionSnapshot,\n\tTaskItem,\n\tTaskItemReport,\n\tTaskProjection,\n\tTaskSnapshot,\n\tTaskTerminalStatus,\n\tTaskText,\n} from \"./types.ts\";\n\nconst OUTPUT_BYTES = 40 * 1024;\nconst REPORT_BYTES = 4 * 1024;\nconst MAX_ITEMS = 8;\nconst MODEL_LINES = 2000;\n\n/** Read data properties only, including at the persisted-message boundary. */\nfunction object(value: unknown): object {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected snapshot object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain snapshot\");\n\treturn value;\n}\n\nfunction field(value: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected snapshot accessor\");\n\treturn descriptor?.value;\n}\n\n/** Bound escaped JSON as well as UTF-8, without serializing an unbounded source. */\nfunction string(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected snapshot text\");\n\tconst prefix = boundText(value, bytes - 2);\n\tif (Buffer.byteLength(JSON.stringify(prefix)) <= bytes) return prefix;\n\tlet low = 0;\n\tlet high = Buffer.byteLength(prefix);\n\twhile (low < high) {\n\t\tconst middle = Math.ceil((low + high) / 2);\n\t\tif (Buffer.byteLength(JSON.stringify(boundText(prefix, middle))) <= bytes) low = middle;\n\t\telse high = middle - 1;\n\t}\n\treturn boundText(prefix, low);\n}\n\nfunction optionalString(source: object, key: string, bytes: number): string | undefined {\n\tconst value = field(source, key);\n\treturn value === undefined ? undefined : string(value, bytes);\n}\n\nfunction text(value: unknown, bytes: number): TaskText {\n\tconst source = object(value);\n\tconst original = field(source, \"text\");\n\tconst truncated = field(source, \"truncated\");\n\tif (typeof truncated !== \"boolean\") throw new Error(\"Expected truncation flag\");\n\tconst bounded = string(original, bytes);\n\treturn { text: bounded, truncated: truncated || bounded !== original };\n}\n\nfunction itemReport(value: unknown): TaskItemReport {\n\tconst source = object(value);\n\treturn {\n\t\tid: string(field(source, \"id\"), 256),\n\t\tlabel: string(field(source, \"label\"), 512),\n\t\tcategory: string(field(source, \"category\"), 128),\n\t\tdescription: string(field(source, \"description\"), 512),\n\t\tstatus: string(field(source, \"status\"), 128),\n\t\treport: text(field(source, \"report\"), REPORT_BYTES),\n\t\terror: optionalString(source, \"error\", 1024),\n\t};\n}\n\nfunction items<T>(value: unknown, read: (value: unknown) => T): T[] {\n\tif (!Array.isArray(value)) throw new Error(\"Expected items\");\n\treturn Array.from({ length: Math.min(value.length, MAX_ITEMS) }, (_, index) => read(field(value, String(index))));\n}\n\n/** Shared by live publication and history restoration; never imports an executor's private details. */\nexport function readTaskProjection(value: unknown): TaskProjection {\n\tconst source = object(value);\n\tconst projection: TaskProjection = {\n\t\tnextStep: optionalString(source, \"nextStep\", 2048),\n\t\ttext: optionalString(source, \"text\", 16 * 1024),\n\t};\n\tconst shell = field(source, \"shell\");\n\tif (shell !== undefined) {\n\t\tconst fields = object(shell);\n\t\tprojection.shell = {\n\t\t\tname: string(field(fields, \"name\"), 128),\n\t\t\toutput: text(field(fields, \"output\"), OUTPUT_BYTES),\n\t\t};\n\t}\n\tconst reports = field(source, \"items\");\n\tif (reports !== undefined) {\n\t\tprojection.items = items(reports, (value): TaskItem => {\n\t\t\tconst fields = object(value);\n\t\t\treturn {\n\t\t\t\t...itemReport(value),\n\t\t\t\tinput: string(field(fields, \"input\"), 4096),\n\t\t\t\tactivity: string(field(fields, \"activity\"), 1024),\n\t\t\t\tcontext: optionalString(fields, \"context\", 256),\n\t\t\t\tusage: optionalString(fields, \"usage\", 256),\n\t\t\t};\n\t\t});\n\t}\n\treturn projection;\n}\n\nfunction terminalStatus(value: unknown): TaskTerminalStatus {\n\tif (\n\t\tvalue === \"completed\" ||\n\t\tvalue === \"partial\" ||\n\t\tvalue === \"failed\" ||\n\t\tvalue === \"cancelled\" ||\n\t\tvalue === \"timeout\"\n\t)\n\t\treturn value;\n\tthrow new Error(\"Expected terminal status\");\n}\n\n/** Only this format is understood. Invalid/older details receive the renderer's bounded plain-text fallback. */\nexport function readTaskCompletion(value: unknown): TaskCompletionSnapshot | undefined {\n\ttry {\n\t\tconst source = object(value);\n\t\tif (field(source, \"version\") !== 1) return undefined;\n\t\tconst taskId = field(source, \"taskId\");\n\t\tconst kind = field(source, \"kind\");\n\t\tif (typeof kind !== \"string\" || !/^[a-z][a-z0-9-]{0,63}$/.test(kind)) return undefined;\n\t\tconst format = field(source, \"format\");\n\t\tif (format !== \"log\" && format !== \"report\") return undefined;\n\t\tif (\n\t\t\ttypeof taskId !== \"string\" ||\n\t\t\t!taskId.startsWith(`${kind}-`) ||\n\t\t\ttaskId.length <= kind.length + 1 ||\n\t\t\ttaskId.length > 512 ||\n\t\t\tBuffer.byteLength(taskId) > 512 ||\n\t\t\ttaskId.includes(\"\\0\")\n\t\t)\n\t\t\treturn undefined;\n\t\tconst startedAt = field(source, \"startedAt\");\n\t\tconst endedAt = field(source, \"endedAt\");\n\t\tif (\n\t\t\ttypeof startedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(startedAt) ||\n\t\t\tstartedAt < 0 ||\n\t\t\ttypeof endedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(endedAt) ||\n\t\t\tendedAt < startedAt\n\t\t)\n\t\t\treturn undefined;\n\t\tconst common = {\n\t\t\tversion: 1 as const,\n\t\t\ttaskId,\n\t\t\ttitle: string(field(source, \"title\"), TASK_TITLE_BYTES),\n\t\t\tstatus: terminalStatus(field(source, \"status\")),\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t\terror: optionalString(source, \"error\", 4096),\n\t\t\tnextStep: optionalString(source, \"nextStep\", 2048),\n\t\t};\n\t\tlet snapshot: TaskCompletionSnapshot;\n\t\tif (format === \"log\") {\n\t\t\tconst command = field(source, \"command\");\n\t\t\tconst outputPath = field(source, \"outputPath\");\n\t\t\tconst exitCode = field(source, \"exitCode\");\n\t\t\tif (\n\t\t\t\texitCode !== undefined &&\n\t\t\t\texitCode !== null &&\n\t\t\t\t(typeof exitCode !== \"number\" || !Number.isSafeInteger(exitCode))\n\t\t\t)\n\t\t\t\treturn undefined;\n\t\t\t// A clipped path would name a different file. Omit oversized paths intact.\n\t\t\tif (outputPath !== undefined && typeof outputPath !== \"string\") return undefined;\n\t\t\tsnapshot = {\n\t\t\t\t...common,\n\t\t\t\tkind,\n\t\t\t\tformat,\n\t\t\t\tshell: optionalString(source, \"shell\", 128),\n\t\t\t\tcommand: command === undefined ? undefined : text(command, 8192),\n\t\t\t\tcwd: optionalString(source, \"cwd\", 4096),\n\t\t\t\t...(exitCode !== undefined ? { exitCode } : {}),\n\t\t\t\toutputPath:\n\t\t\t\t\toutputPath &&\n\t\t\t\t\t!outputPath.includes(\"\\0\") &&\n\t\t\t\t\toutputPath.length <= 8192 &&\n\t\t\t\t\tBuffer.byteLength(JSON.stringify(outputPath)) <= 8192\n\t\t\t\t\t\t? outputPath\n\t\t\t\t\t\t: undefined,\n\t\t\t\toutput: text(field(source, \"output\"), OUTPUT_BYTES),\n\t\t\t};\n\t\t} else {\n\t\t\tconst output = field(source, \"output\");\n\t\t\tsnapshot = {\n\t\t\t\t...common,\n\t\t\t\tkind,\n\t\t\t\tformat,\n\t\t\t\titems: items(field(source, \"items\"), itemReport),\n\t\t\t\toutput: output === undefined ? undefined : text(output, OUTPUT_BYTES),\n\t\t\t};\n\t\t}\n\t\treturn Buffer.byteLength(JSON.stringify(snapshot)) <= TASK_DETAILS_BYTES ? snapshot : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function taskCompletionSnapshot(task: TaskSnapshot): TaskCompletionSnapshot {\n\tconst output: TaskText = {\n\t\ttext:\n\t\t\ttask.result?.content\n\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t.map((block) => block.text)\n\t\t\t\t.join(\"\\n\") ||\n\t\t\ttask.projection?.text ||\n\t\t\t\"\",\n\t\ttruncated: task.resultTruncated ?? false,\n\t};\n\tconst common = {\n\t\tversion: 1,\n\t\ttaskId: task.id,\n\t\ttitle: task.title,\n\t\tstatus: task.status,\n\t\tstartedAt: task.startedAt,\n\t\tendedAt: task.endedAt,\n\t\terror: task.error,\n\t\tnextStep: task.projection?.nextStep,\n\t};\n\tconst snapshot = readTaskCompletion(\n\t\ttask.format === \"log\"\n\t\t\t? {\n\t\t\t\t\t...common,\n\t\t\t\t\tkind: task.kind,\n\t\t\t\t\tformat: \"log\",\n\t\t\t\t\tshell: task.projection?.shell?.name,\n\t\t\t\t\tcommand:\n\t\t\t\t\t\ttask.command === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: { text: task.command, truncated: task.commandTruncated ?? false },\n\t\t\t\t\tcwd: task.cwd,\n\t\t\t\t\toutputPath: task.outputPath,\n\t\t\t\t\t...(task.exitCode !== undefined ? { exitCode: task.exitCode } : {}),\n\t\t\t\t\toutput: task.projection?.shell?.output ?? output,\n\t\t\t\t}\n\t\t\t: {\n\t\t\t\t\t...common,\n\t\t\t\t\tkind: task.kind,\n\t\t\t\t\tformat: \"report\",\n\t\t\t\t\titems: task.projection?.items ?? [],\n\t\t\t\t\toutput: task.projection?.items?.length ? undefined : output,\n\t\t\t\t},\n\t);\n\tif (!snapshot) throw new Error(\"Invalid background completion snapshot\");\n\treturn snapshot;\n}\n\nconst singleLine = (value: string) => value.replace(/\\s+/gu, \" \").trim();\nconst OMISSION = \"\\n[Saved output truncated; use tasks read for retained task details.]\";\n\nfunction modelText(value: TaskText, bytes: number, lines: number): string {\n\tconst result = truncateHead(value.text, {\n\t\tmaxBytes: Math.max(0, bytes - Buffer.byteLength(OMISSION)),\n\t\tmaxLines: Math.max(1, lines - 1),\n\t});\n\treturn result.content + (value.truncated || result.truncated ? OMISSION : \"\");\n}\n\n/** One bounded action hint per terminal outcome; completed work needs none. */\nfunction nextStepLine(snapshot: TaskCompletionSnapshot): string {\n\tswitch (snapshot.status) {\n\t\tcase \"cancelled\":\n\t\t\treturn \"Next step: the task was cancelled — do not restart it unless the user asks.\";\n\t\tcase \"timeout\":\n\t\t\treturn \"Next step: the task hit its timeout; inspect the partial output above, then rerun with a longer timeout or in smaller pieces if still needed.\";\n\t\tcase \"failed\":\n\t\tcase \"partial\": {\n\t\t\tif (snapshot.nextStep) return snapshot.nextStep;\n\t\t\treturn \"Next step: diagnose from the output above before retrying; rerun only what is still needed.\";\n\t\t}\n\t\tdefault:\n\t\t\treturn \"\";\n\t}\n}\n\n/** The context and the card share facts; only the context receives this prose projection. */\nfunction notificationText(snapshot: TaskCompletionSnapshot): string {\n\tconst header = [\n\t\t`Background ${snapshot.kind} ${snapshot.taskId}: ${snapshot.status} — ${singleLine(snapshot.title)}`,\n\t\tsnapshot.error ? `Error: ${singleLine(snapshot.error)}` : \"\",\n\t].filter(Boolean);\n\tif (snapshot.format === \"log\") {\n\t\tif (snapshot.command) header.push(`Command:\\n${modelText(snapshot.command, 8192, 128)}`);\n\t\tif (snapshot.cwd) header.push(`cwd: ${singleLine(snapshot.cwd)}`);\n\t\tif (snapshot.outputPath) header.push(`Output: ${singleLine(snapshot.outputPath)}`);\n\t}\n\tconst prefix = `${header.join(\"\\n\")}\\n\\n`;\n\tconst guidance = nextStepLine(snapshot);\n\tconst suffix = guidance ? `\\n\\n${guidance}` : \"\";\n\tconst remaining = TASK_RESULT_BYTES - Buffer.byteLength(prefix) - Buffer.byteLength(suffix);\n\tconst lines = MODEL_LINES - prefix.split(\"\\n\").length - (guidance ? 3 : 0);\n\tif (snapshot.format === \"report\" && snapshot.items.length) {\n\t\t// Allocate before formatting, so one verbose report cannot erase later items.\n\t\tconst budget = Math.floor((remaining - 8 * snapshot.items.length) / snapshot.items.length);\n\t\tconst lineBudget = Math.floor((lines - 4 * snapshot.items.length) / snapshot.items.length);\n\t\treturn (\n\t\t\tprefix +\n\t\t\tsnapshot.items\n\t\t\t\t.map((worker, index) => {\n\t\t\t\t\tconst heading = `### ${index + 1}. ${singleLine(worker.description)} (${singleLine(worker.category)}) — ${singleLine(worker.status)}\\n\\n`;\n\t\t\t\t\tconst reason = worker.error ? `Error: ${singleLine(worker.error)}\\n\\n` : \"\";\n\t\t\t\t\tconst body = worker.report.text\n\t\t\t\t\t\t? worker.report\n\t\t\t\t\t\t: { text: \"No report returned.\", truncated: worker.report.truncated };\n\t\t\t\t\treturn heading + reason + modelText(body, budget - Buffer.byteLength(heading + reason), lineBudget);\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\\n---\\n\\n\") +\n\t\t\tsuffix\n\t\t);\n\t}\n\treturn (\n\t\tprefix + modelText(snapshot.output ?? { text: \"No text result.\", truncated: false }, remaining, lines) + suffix\n\t);\n}\n\nexport function taskCompletionMessage(task: TaskSnapshot): CustomMessage<TaskCompletionSnapshot> {\n\tconst details = taskCompletionSnapshot(task);\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType: \"task-completion\",\n\t\tdisplay: true,\n\t\tcontent: notificationText(details),\n\t\tdetails,\n\t\ttimestamp: Date.now(),\n\t};\n}\n"]}
1
+ {"version":3,"file":"presentation.js","sourceRoot":"","sources":["../../../src/core/tasks/presentation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CustomMessage } from \"../messages.ts\";\nimport { truncateHead, truncateTail } from \"../tools/truncate.ts\";\nimport { boundTail, boundText, TASK_DETAILS_BYTES, TASK_RESULT_BYTES, TASK_TITLE_BYTES } from \"./output.ts\";\nimport type { TaskCompletionSnapshot, TaskSnapshot, TaskTerminalStatus, TaskText } from \"./types.ts\";\n\nconst OUTPUT_BYTES = 40 * 1024;\nconst MODEL_LINES = 2000;\n\n/** Read data properties only, including at the persisted-message boundary. */\nfunction object(value: unknown): object {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected snapshot object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain snapshot\");\n\treturn value;\n}\n\nfunction field(value: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected snapshot accessor\");\n\treturn descriptor?.value;\n}\n\n/** Bound escaped JSON as well as UTF-8, without serializing an unbounded source. */\nfunction string(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected snapshot text\");\n\tconst prefix = boundText(value, bytes - 2);\n\tif (Buffer.byteLength(JSON.stringify(prefix)) <= bytes) return prefix;\n\tlet low = 0;\n\tlet high = Buffer.byteLength(prefix);\n\twhile (low < high) {\n\t\tconst middle = Math.ceil((low + high) / 2);\n\t\tif (Buffer.byteLength(JSON.stringify(boundText(prefix, middle))) <= bytes) low = middle;\n\t\telse high = middle - 1;\n\t}\n\treturn boundText(prefix, low);\n}\n\n/** The end of a text whose escaped JSON fits `bytes`: a command's outcome is at its end. */\nfunction tail(value: string, bytes: number): TaskText {\n\tconst fits = (size: number) => Buffer.byteLength(JSON.stringify(boundTail(value, size).text)) <= bytes;\n\tlet low = 0;\n\tlet high = Buffer.byteLength(value);\n\tif (fits(high)) return { text: value, truncated: false };\n\twhile (low < high) {\n\t\tconst middle = Math.ceil((low + high) / 2);\n\t\tif (fits(middle)) low = middle;\n\t\telse high = middle - 1;\n\t}\n\treturn boundTail(value, low);\n}\n\nfunction optionalString(source: object, key: string, bytes: number): string | undefined {\n\tconst value = field(source, key);\n\treturn value === undefined ? undefined : string(value, bytes);\n}\n\nfunction text(value: unknown, bytes: number): TaskText {\n\tconst source = object(value);\n\tconst original = field(source, \"text\");\n\tconst truncated = field(source, \"truncated\");\n\tif (typeof truncated !== \"boolean\") throw new Error(\"Expected truncation flag\");\n\tconst bounded = string(original, bytes);\n\treturn { text: bounded, truncated: truncated || bounded !== original };\n}\n\nfunction terminalStatus(value: unknown): TaskTerminalStatus {\n\tif (\n\t\tvalue === \"completed\" ||\n\t\tvalue === \"partial\" ||\n\t\tvalue === \"failed\" ||\n\t\tvalue === \"cancelled\" ||\n\t\tvalue === \"timeout\"\n\t)\n\t\treturn value;\n\tthrow new Error(\"Expected terminal status\");\n}\n\n/** Only this format is understood. Invalid/older details receive the renderer's bounded plain-text fallback. */\nexport function readTaskCompletion(value: unknown): TaskCompletionSnapshot | undefined {\n\ttry {\n\t\tconst source = object(value);\n\t\tif (field(source, \"version\") !== 2) return undefined;\n\t\tconst taskId = field(source, \"taskId\");\n\t\tconst kind = field(source, \"kind\");\n\t\tif (typeof kind !== \"string\" || !/^[a-z][a-z0-9-]{0,63}$/.test(kind)) return undefined;\n\t\tif (\n\t\t\ttypeof taskId !== \"string\" ||\n\t\t\t!taskId.startsWith(`${kind}-`) ||\n\t\t\ttaskId.length <= kind.length + 1 ||\n\t\t\ttaskId.length > 512 ||\n\t\t\tBuffer.byteLength(taskId) > 512 ||\n\t\t\ttaskId.includes(\"\\0\")\n\t\t)\n\t\t\treturn undefined;\n\t\tconst startedAt = field(source, \"startedAt\");\n\t\tconst endedAt = field(source, \"endedAt\");\n\t\tif (\n\t\t\ttypeof startedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(startedAt) ||\n\t\t\tstartedAt < 0 ||\n\t\t\ttypeof endedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(endedAt) ||\n\t\t\tendedAt < startedAt\n\t\t)\n\t\t\treturn undefined;\n\t\tconst command = field(source, \"command\");\n\t\tconst outputPath = field(source, \"outputPath\");\n\t\tconst exitCode = field(source, \"exitCode\");\n\t\tif (\n\t\t\texitCode !== undefined &&\n\t\t\texitCode !== null &&\n\t\t\t(typeof exitCode !== \"number\" || !Number.isSafeInteger(exitCode))\n\t\t)\n\t\t\treturn undefined;\n\t\t// A clipped path would name a different file. Omit oversized paths intact.\n\t\tif (outputPath !== undefined && typeof outputPath !== \"string\") return undefined;\n\t\tconst snapshot: TaskCompletionSnapshot = {\n\t\t\tversion: 2,\n\t\t\tkind,\n\t\t\ttaskId,\n\t\t\ttitle: string(field(source, \"title\"), TASK_TITLE_BYTES),\n\t\t\tstatus: terminalStatus(field(source, \"status\")),\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t\terror: optionalString(source, \"error\", 4096),\n\t\t\tcommand: command === undefined ? undefined : text(command, 8192),\n\t\t\tcwd: optionalString(source, \"cwd\", 4096),\n\t\t\toutputPath:\n\t\t\t\toutputPath &&\n\t\t\t\t!outputPath.includes(\"\\0\") &&\n\t\t\t\toutputPath.length <= 8192 &&\n\t\t\t\tBuffer.byteLength(JSON.stringify(outputPath)) <= 8192\n\t\t\t\t\t? outputPath\n\t\t\t\t\t: undefined,\n\t\t\t...(exitCode !== undefined ? { exitCode } : {}),\n\t\t\toutput: text(field(source, \"output\"), OUTPUT_BYTES),\n\t\t};\n\t\treturn Buffer.byteLength(JSON.stringify(snapshot)) <= TASK_DETAILS_BYTES ? snapshot : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function taskCompletionSnapshot(task: TaskSnapshot): TaskCompletionSnapshot {\n\tconst result =\n\t\ttask.result?.content\n\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t.map((block) => block.text)\n\t\t\t.join(\"\\n\") ?? \"\";\n\tconst output = tail(result, OUTPUT_BYTES);\n\tconst snapshot = readTaskCompletion({\n\t\tversion: 2,\n\t\tkind: task.kind,\n\t\ttaskId: task.id,\n\t\ttitle: task.title,\n\t\tstatus: task.status,\n\t\tstartedAt: task.startedAt,\n\t\tendedAt: task.endedAt,\n\t\terror: task.error,\n\t\tcommand:\n\t\t\ttask.command === undefined ? undefined : { text: task.command, truncated: task.commandTruncated ?? false },\n\t\tcwd: task.cwd,\n\t\toutputPath: task.outputPath,\n\t\t...(task.exitCode !== undefined ? { exitCode: task.exitCode } : {}),\n\t\toutput: { text: output.text, truncated: output.truncated || (task.resultTruncated ?? false) },\n\t});\n\tif (!snapshot) throw new Error(\"Invalid task completion snapshot\");\n\treturn snapshot;\n}\n\nconst singleLine = (value: string) => value.replace(/\\s+/gu, \" \").trim();\nconst OMISSION = \"\\n[Saved output truncated; use tasks read for retained task details.]\";\n\nfunction modelText(value: TaskText, bytes: number, lines: number): string {\n\tconst result = truncateHead(value.text, {\n\t\tmaxBytes: Math.max(0, bytes - Buffer.byteLength(OMISSION)),\n\t\tmaxLines: Math.max(1, lines - 1),\n\t});\n\treturn result.content + (value.truncated || result.truncated ? OMISSION : \"\");\n}\n\nconst EARLIER_OMISSION = \"[Earlier output truncated; use tasks read for retained task details.]\\n\";\n\n/** Output keeps its end, where the outcome is. */\nfunction modelTail(value: TaskText, bytes: number, lines: number): string {\n\tconst result = truncateTail(value.text, {\n\t\tmaxBytes: Math.max(0, bytes - Buffer.byteLength(EARLIER_OMISSION)),\n\t\tmaxLines: Math.max(1, lines - 1),\n\t});\n\treturn (value.truncated || result.truncated ? EARLIER_OMISSION : \"\") + result.content;\n}\n\n/** One bounded action hint per terminal outcome; completed work needs none. */\nfunction nextStepLine(status: TaskTerminalStatus): string {\n\tswitch (status) {\n\t\tcase \"cancelled\":\n\t\t\treturn \"Next step: the task was cancelled — do not restart it unless the user asks.\";\n\t\tcase \"timeout\":\n\t\t\treturn \"Next step: the task hit its timeout; inspect the partial output above, then rerun with a longer timeout or in smaller pieces if still needed.\";\n\t\tcase \"failed\":\n\t\tcase \"partial\":\n\t\t\treturn \"Next step: diagnose from the output above before retrying; rerun only what is still needed.\";\n\t\tdefault:\n\t\t\treturn \"\";\n\t}\n}\n\n/** The context and the card share facts; only the context receives this prose projection. */\nfunction notificationText(snapshot: TaskCompletionSnapshot): string {\n\tconst header = [\n\t\t`Background ${snapshot.kind} ${snapshot.taskId}: ${snapshot.status}${snapshot.command ? \"\" : ` — ${singleLine(snapshot.title)}`}`,\n\t\tsnapshot.error ? `Error: ${singleLine(snapshot.error)}` : \"\",\n\t].filter(Boolean);\n\tif (snapshot.command) header.push(`Command:\\n${modelText(snapshot.command, 8192, 128)}`);\n\tif (snapshot.cwd) header.push(`cwd: ${singleLine(snapshot.cwd)}`);\n\tif (snapshot.outputPath) header.push(`Output: ${singleLine(snapshot.outputPath)}`);\n\tconst prefix = `${header.join(\"\\n\")}\\n\\n`;\n\tconst guidance = nextStepLine(snapshot.status);\n\tconst suffix = guidance ? `\\n\\n${guidance}` : \"\";\n\tconst remaining = TASK_RESULT_BYTES - Buffer.byteLength(prefix) - Buffer.byteLength(suffix);\n\tconst lines = MODEL_LINES - prefix.split(\"\\n\").length - (guidance ? 3 : 0);\n\tconst output = snapshot.output.text ? snapshot.output : { text: \"No text result.\", truncated: false };\n\treturn prefix + modelTail(output, remaining, lines) + suffix;\n}\n\nexport function taskCompletionMessage(task: TaskSnapshot): CustomMessage<TaskCompletionSnapshot> {\n\tconst details = taskCompletionSnapshot(task);\n\treturn {\n\t\trole: \"custom\",\n\t\tcustomType: \"task-completion\",\n\t\tdisplay: true,\n\t\tcontent: notificationText(details),\n\t\tdetails,\n\t\ttimestamp: Date.now(),\n\t};\n}\n"]}
@@ -1,8 +1,7 @@
1
+ import type { AgentToolResult } from "@earendil-works/pi-agent-core";
1
2
  import { type TaskExecution, type TaskRead, type TaskRuntimeOptions, type TaskSnapshot, type TasksContext, type TaskToolOutcome } from "./types.ts";
2
- import { TaskViewRegistry } from "./view.ts";
3
3
  /** Session-local supervision. Executors own their processes, items and output files. */
4
4
  export declare class TaskRuntime implements TasksContext {
5
- readonly views: TaskViewRegistry;
6
5
  private readonly store;
7
6
  private readonly executions;
8
7
  private readonly listeners;
@@ -18,13 +17,18 @@ export declare class TaskRuntime implements TasksContext {
18
17
  /**
19
18
  * Rehydrate terminal version-2 custom data only, newest endedAt in each history
20
19
  * (later input wins ties). Existing runtime records win ID collisions. No execution, accounting,
21
- * notification, or deletion ownership is restored, including for worker projections.
22
- * The host supplies the current branch; closed services ignore restoration.
20
+ * notification, or deletion ownership is restored. Foreground records take their output
21
+ * from the branch's tool results. The host supplies the current branch; closed services
22
+ * ignore restoration.
23
23
  */
24
- restoreHistory(records: readonly unknown[]): void;
24
+ restoreHistory(records: readonly unknown[], toolResults?: ReadonlyMap<string, AgentToolResult<unknown>["content"]>): void;
25
25
  get enabled(): boolean;
26
26
  setEnabled(enabled: boolean): void;
27
+ /** Foreground work is bounded by its caller; only background work holds a slot. */
28
+ private backgroundActive;
29
+ private limitError;
27
30
  execute<T>(execution: TaskExecution<T>): Promise<TaskToolOutcome<T>>;
31
+ private detachable;
28
32
  detachForeground(): number;
29
33
  detach(id: string): boolean;
30
34
  private prepareDetach;
@@ -50,18 +54,21 @@ export declare class TaskRuntime implements TasksContext {
50
54
  holdDelivery(id: string): () => void;
51
55
  pause(): () => void;
52
56
  pendingNotifications(): TaskSnapshot[];
53
- /**
54
- * Only explicit result-delivery holds delay an automatic completion.
55
- */
57
+ /** Only explicit result-delivery holds delay an automatic completion. */
56
58
  private candidate;
57
59
  claimNotification(id: string): boolean;
58
60
  markDelivered(id: string): void;
59
61
  releaseNotification(id: string): void;
60
62
  close(): void;
61
63
  shutdown(graceMs?: number): Promise<void>;
64
+ /** Running tasks whose launch anchor is outside the branch made of `ancestors`. */
65
+ activeOutsideBranch(ancestors: ReadonlySet<string>): TaskSnapshot[];
66
+ /**
67
+ * Hidden results stay pending: returning to their branch delivers them again.
68
+ * Restored history is already delivered.
69
+ */
62
70
  cancelOutsideBranch(ancestors: ReadonlySet<string>): Promise<void>;
63
71
  private drain;
64
- private snapshot;
65
72
  private emit;
66
73
  }
67
74
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAIN,KAAK,aAAa,EAIlB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAmC7C,wFAAwF;AACxF,qBAAa,WAAY,YAAW,YAAY;IAC/C,QAAQ,CAAC,KAAK,mBAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,OAAO,CAAS;IAExB,IAAI,MAAM,IAAI,OAAO,CAEpB;IACD,OAAO,CAAC,MAAM,CAAK;IAEnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,OAAO,GAAE,kBAAuB;IAU5C;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI;IAIjD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK5B,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAqO1E,gBAAgB,IAAI,MAAM;IAY1B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAW3B,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IAYpB,IAAI,IAAI,YAAY,EAAE;IAItB,OAAO,CAAC,MAAM;IAed,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY;IAIvB,IAAI,CACT,EAAE,EAAE,MAAM,EACV,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3E,OAAO,CAAC,QAAQ,CAAC;IAsBpB,OAAO,CAAC,UAAU;IAYlB,wGAAwG;IAClG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA2BvF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIzB,OAAO,CAAC,MAAM;IASd,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAQ3C;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,IAAI;IAa9B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,IAAI;IAapC,KAAK,IAAI,MAAM,IAAI;IAWnB,oBAAoB,IAAI,YAAY,EAAE;IAOtC;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAQtC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO/B,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQrC,KAAK,IAAI,IAAI;IAcP,QAAQ,CAAC,OAAO,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAe1D,KAAK;IAgBnB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,IAAI;CAWZ"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/runtime.ts"],"names":[],"mappings":"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"}
@@ -1,36 +1,21 @@
1
1
  import { randomUUID } from "node:crypto";
2
- import { boundedResult, boundText, finiteLimit, readOutputSlice, sliceText, TASK_TITLE_BYTES } from "./output.js";
3
- import { readTaskProjection } from "./presentation.js";
4
- import { TaskStore } from "./store.js";
2
+ import { boundText, finiteLimit, readOutputSlice, retainResult, sliceText, TASK_TITLE_BYTES } from "./output.js";
3
+ import { changed, snapshotOf, TaskStore } from "./store.js";
5
4
  import { TASK_BACKGROUND_REJECTION, TaskExecutionError, TaskLookupError, } from "./types.js";
6
- import { TaskViewRegistry } from "./view.js";
7
- import { readTaskViewData } from "./view-data.js";
8
5
  function errorText(error) {
9
6
  try {
10
7
  return boundText(error instanceof Error ? error.message : String(error), 4096);
11
8
  }
12
9
  catch {
13
- return "Background execution failed (unprintable error)";
10
+ return "Task execution failed (unprintable error)";
14
11
  }
15
12
  }
16
- function storeResult(task, result, truncated = false) {
17
- const bounded = boundedResult({ content: result.content, details: undefined });
18
- task.result = bounded;
19
- task.resultTruncated =
20
- truncated ||
21
- bounded.content.length !== result.content.length ||
22
- bounded.content.some((block, index) => {
23
- const original = result.content[index];
24
- return original?.type !== "text" || block.type !== "text" || block.text !== original.text;
25
- });
26
- }
27
13
  /** Session-local supervision. Executors own their processes, items and output files. */
28
14
  export class TaskRuntime {
29
15
  get closed() {
30
16
  return this._closed;
31
17
  }
32
18
  constructor(options = {}) {
33
- this.views = new TaskViewRegistry();
34
19
  this.executions = new Map();
35
20
  this.listeners = new Set();
36
21
  this._closed = false;
@@ -39,18 +24,19 @@ export class TaskRuntime {
39
24
  this.configuredEnabled = options.enabled ?? false;
40
25
  this.maxActive = Math.max(1, finiteLimit(options.maxActive, 8, 128));
41
26
  this.maxHistory = finiteLimit(options.maxHistory, 32, 1024);
42
- // Separate foreground shell history, plus the existing history/protected-record allowance.
27
+ // Separate foreground and background histories, plus the protected-record allowance.
43
28
  this.maxRetained = this.maxActive + 2 * Math.max(1, this.maxHistory) + this.maxHistory;
44
29
  this.store = new TaskStore(this.maxHistory, this.maxRetained, () => this.closed, options.onCleanupError);
45
30
  }
46
31
  /**
47
32
  * Rehydrate terminal version-2 custom data only, newest endedAt in each history
48
33
  * (later input wins ties). Existing runtime records win ID collisions. No execution, accounting,
49
- * notification, or deletion ownership is restored, including for worker projections.
50
- * The host supplies the current branch; closed services ignore restoration.
34
+ * notification, or deletion ownership is restored. Foreground records take their output
35
+ * from the branch's tool results. The host supplies the current branch; closed services
36
+ * ignore restoration.
51
37
  */
52
- restoreHistory(records) {
53
- this.store.restoreHistory(records);
38
+ restoreHistory(records, toolResults) {
39
+ this.store.restoreHistory(records, toolResults);
54
40
  }
55
41
  get enabled() {
56
42
  return this.configuredEnabled && !this.closed && this.options.backgroundAllowed !== false;
@@ -59,31 +45,42 @@ export class TaskRuntime {
59
45
  this.configuredEnabled = enabled;
60
46
  this.emit();
61
47
  }
48
+ /** Foreground work is bounded by its caller; only background work holds a slot. */
49
+ backgroundActive() {
50
+ let count = 0;
51
+ for (const record of this.store.records.values())
52
+ if (!record.settled && record.task.mode === "background")
53
+ count++;
54
+ return count;
55
+ }
56
+ limitError() {
57
+ return new Error(`Background task limit reached (${this.maxActive}); stop or wait for a background task, or run in the foreground.`);
58
+ }
62
59
  async execute(execution) {
63
60
  // Admission and registration happen synchronously, before invoking user code or awaiting anything.
64
61
  if (execution.background && this.options.backgroundAllowed === false)
65
62
  throw new Error(TASK_BACKGROUND_REJECTION);
66
63
  if (this.closed)
67
- throw new Error("Background service is closed");
68
- if (execution.background && !this.enabled)
69
- throw new Error("Background execution is not available in this host");
64
+ throw new Error("Task service is closed");
65
+ if (execution.background) {
66
+ if (!this.enabled)
67
+ throw new Error("Background execution is not available in this host");
68
+ if (this.backgroundActive() >= this.maxActive)
69
+ throw this.limitError();
70
+ if (this.store.records.size + this.store.cleanups.size >= this.maxRetained) {
71
+ throw new Error("Task history retention limit reached; deliver pending notifications or release pinned or claimed records");
72
+ }
73
+ }
70
74
  if (execution.signal?.aborted)
71
75
  throw execution.signal.reason ?? new Error("Execution aborted");
72
- if ([...this.store.records.values()].filter((record) => !record.settled).length >= this.maxActive) {
73
- throw new Error(`Background execution limit reached (${this.maxActive})`);
74
- }
75
- if (this.store.records.size + this.store.cleanups.size >= this.maxRetained) {
76
- throw new Error("Background history retention limit reached; deliver pending notifications or release pinned or claimed records");
77
- }
78
76
  if (!/^[a-z][a-z0-9-]{0,63}$/.test(execution.kind))
79
77
  throw new Error("Invalid task source");
80
78
  const anchorId = this.options.anchor?.() ?? null;
81
79
  if (anchorId !== null && Buffer.byteLength(anchorId) > 8192)
82
- throw new Error("Background branch anchor is too large");
80
+ throw new Error("Task branch anchor is too large");
83
81
  const task = {
84
82
  id: `${execution.kind}-${randomUUID()}`,
85
83
  kind: execution.kind,
86
- format: execution.format ?? "report",
87
84
  title: boundText(execution.title, TASK_TITLE_BYTES),
88
85
  toolCallId: boundText(execution.toolCallId, 512),
89
86
  anchorId,
@@ -104,10 +101,8 @@ export class TaskRuntime {
104
101
  const record = {
105
102
  task,
106
103
  settled: false,
107
- accounted: false,
108
104
  visible: true,
109
- suppressed: false,
110
- delivery: "pending",
105
+ delivery: "none",
111
106
  pins: 0,
112
107
  deliveryHolds: 0,
113
108
  waiters: new Set(),
@@ -125,14 +120,14 @@ export class TaskRuntime {
125
120
  record.settled ||
126
121
  active.handedOff ||
127
122
  this.closed ||
128
- record.suppressed ||
123
+ !record.visible ||
129
124
  active.controller.signal.aborted)
130
125
  return;
131
126
  active.handedOff = true;
132
- record.handedOff = true;
133
127
  task.mode = "background";
128
+ changed(record);
134
129
  active.removeParent();
135
- resolveCaller({ kind: "background", task: this.snapshot(record) });
130
+ resolveCaller({ kind: "background", task: snapshotOf(record) });
136
131
  this.emit();
137
132
  },
138
133
  done: new Promise((resolve) => {
@@ -173,20 +168,20 @@ export class TaskRuntime {
173
168
  active.accepted = true;
174
169
  if (task.status === "queued")
175
170
  task.status = "running";
171
+ changed(record);
176
172
  if (active.detachRequested)
177
173
  active.removeParent();
178
174
  // Let an already available final result win over a handoff.
179
175
  queueMicrotask(() => queueMicrotask(active.handoff));
180
176
  this.emit();
181
177
  },
182
- publish: (result, projection) => {
178
+ publish: (result) => {
183
179
  if (record.settled || this.closed)
184
180
  return;
185
- storeResult(task, result);
181
+ retainResult(task, result);
182
+ changed(record);
186
183
  if (result.usage !== undefined)
187
184
  active.publishedUsage = structuredClone(result.usage);
188
- if (projection)
189
- task.projection = readTaskProjection(projection);
190
185
  if (!active.detachRequested && !active.handedOff) {
191
186
  try {
192
187
  onUpdate?.(result);
@@ -200,22 +195,17 @@ export class TaskRuntime {
200
195
  setOutputPath: (path, cleanup) => {
201
196
  if (record.settled) {
202
197
  if (cleanup)
203
- throw new Error("Background execution has settled");
198
+ throw new Error("Task execution has settled");
204
199
  return;
205
200
  }
206
201
  if (record.cleanup)
207
202
  throw new Error("Managed output is already registered");
208
203
  // Never truncate a real filesystem path into a different path.
209
204
  if (Buffer.byteLength(path) > 8192)
210
- throw new Error("Background output path is too large");
205
+ throw new Error("Task output path is too large");
211
206
  record.cleanup = cleanup;
212
207
  task.outputPath = path;
213
- this.emit();
214
- },
215
- publishView: (data) => {
216
- if (record.settled || this.closed)
217
- return;
218
- task.viewData = readTaskViewData(data);
208
+ changed(record);
219
209
  this.emit();
220
210
  },
221
211
  };
@@ -237,7 +227,7 @@ export class TaskRuntime {
237
227
  ? "failed"
238
228
  : "completed");
239
229
  if (completion) {
240
- storeResult(task, completion.result);
230
+ retainResult(task, completion.result);
241
231
  if (completion.error !== undefined)
242
232
  task.error = boundText(completion.error, 4096);
243
233
  if (completion.exitCode !== undefined)
@@ -245,28 +235,24 @@ export class TaskRuntime {
245
235
  }
246
236
  if (failed) {
247
237
  task.error = errorText(error);
248
- storeResult(task, {
249
- content: [{ type: "text", text: task.error }, ...(task.result?.content ?? [])],
250
- details: task.result?.details,
251
- }, task.resultTruncated);
238
+ retainResult(task, { content: [{ type: "text", text: task.error }, ...(task.result?.content ?? [])], details: undefined }, task.resultTruncated);
252
239
  }
240
+ changed(record);
253
241
  let settlementWarning;
254
242
  try {
255
- this.options.onSettled?.(this.snapshot(record), completion?.usage ?? completion?.result.usage ?? active.publishedUsage);
243
+ this.options.onSettled?.(snapshotOf(record), completion?.usage ?? completion?.result.usage ?? active.publishedUsage);
256
244
  }
257
245
  catch (accountingError) {
258
246
  const warning = `Usage settlement failed: ${errorText(accountingError)}`;
259
247
  settlementWarning = warning;
260
248
  task.error = boundText([task.error, warning].filter(Boolean).join("\n"), 8192);
261
- storeResult(task, {
262
- content: [{ type: "text", text: warning }, ...(task.result?.content ?? [])],
263
- details: task.result?.details,
264
- }, task.resultTruncated);
249
+ retainResult(task, { content: [{ type: "text", text: warning }, ...(task.result?.content ?? [])], details: undefined }, task.resultTruncated);
250
+ changed(record);
265
251
  }
266
252
  active.publishedUsage = undefined;
267
- record.accounted = true;
253
+ // Delivery becomes eligible only after settlement is persisted.
254
+ record.delivery = active.handedOff ? "pending" : "delivered";
268
255
  if (!active.handedOff) {
269
- record.delivery = "delivered";
270
256
  if (failed)
271
257
  rejectCaller(error);
272
258
  else {
@@ -294,26 +280,35 @@ export class TaskRuntime {
294
280
  this.emit();
295
281
  return caller;
296
282
  }
283
+ detachable(record) {
284
+ const active = this.executions.get(record.task.id);
285
+ return !!active && !record.settled && !active.detachRequested && !active.controller.signal.aborted;
286
+ }
297
287
  detachForeground() {
298
288
  if (!this.enabled)
299
289
  return 0;
300
- const records = [...this.store.records.values()].filter((record) => {
301
- const active = this.executions.get(record.task.id);
302
- return active && !record.settled && !active.detachRequested && !active.controller.signal.aborted;
303
- });
290
+ const eligible = [...this.store.records.values()]
291
+ .filter((record) => this.detachable(record))
292
+ .sort((left, right) => left.task.startedAt - right.task.startedAt);
293
+ if (!eligible.length)
294
+ return 0;
295
+ const free = this.maxActive - this.backgroundActive();
296
+ if (free <= 0)
297
+ throw this.limitError();
298
+ const records = eligible.slice(0, free);
304
299
  for (const record of records)
305
300
  this.prepareDetach(record);
306
301
  for (const record of records)
307
302
  this.finishDetach(record);
308
- if (records.length)
309
- this.emit();
303
+ this.emit();
310
304
  return records.length;
311
305
  }
312
306
  detach(id) {
313
307
  const record = this.lookup(id);
314
- const active = this.executions.get(record.task.id);
315
- if (!this.enabled || !active || record.settled || active.detachRequested || active.controller.signal.aborted)
308
+ if (!this.enabled || !this.detachable(record))
316
309
  return false;
310
+ if (this.backgroundActive() >= this.maxActive)
311
+ throw this.limitError();
317
312
  this.prepareDetach(record);
318
313
  this.finishDetach(record);
319
314
  this.emit();
@@ -323,6 +318,7 @@ export class TaskRuntime {
323
318
  const active = this.executions.get(record.task.id);
324
319
  active.detachRequested = true;
325
320
  record.task.mode = "background";
321
+ changed(record);
326
322
  if (active.accepted)
327
323
  active.removeParent();
328
324
  }
@@ -339,7 +335,7 @@ export class TaskRuntime {
339
335
  }
340
336
  }
341
337
  list() {
342
- return [...this.store.records.values()].filter((record) => record.visible).map((record) => this.snapshot(record));
338
+ return [...this.store.records.values()].filter((record) => record.visible).map(snapshotOf);
343
339
  }
344
340
  lookup(id) {
345
341
  const exact = this.store.records.get(id);
@@ -347,18 +343,18 @@ export class TaskRuntime {
347
343
  return exact;
348
344
  const matches = [...this.store.records.values()].filter(({ task }) => task.id.startsWith(id) || task.id.slice(task.kind.length + 1).startsWith(id));
349
345
  if (!id || matches.length !== 1) {
350
- throw new TaskLookupError(matches.length > 1 ? "ambiguous" : "unknown", matches.map((record) => this.snapshot(record)));
346
+ throw new TaskLookupError(matches.length > 1 ? "ambiguous" : "unknown", matches.map(snapshotOf));
351
347
  }
352
348
  return matches[0];
353
349
  }
354
350
  get(id) {
355
- return this.snapshot(this.lookup(id));
351
+ return snapshotOf(this.lookup(id));
356
352
  }
357
353
  async read(id, options = {}) {
358
354
  const record = this.lookup(id);
359
355
  const release = this.retain(record.task.id);
360
356
  try {
361
- const task = this.snapshot(record);
357
+ const task = snapshotOf(record);
362
358
  if (task.outputPath) {
363
359
  try {
364
360
  return { task, ...(await readOutputSlice(task.outputPath, options)) };
@@ -382,7 +378,6 @@ export class TaskRuntime {
382
378
  .filter((block) => block.type === "text")
383
379
  .map((block) => block.text)
384
380
  .join("\n") ||
385
- task.projection?.text ||
386
381
  task.error ||
387
382
  "No output yet.");
388
383
  }
@@ -392,7 +387,7 @@ export class TaskRuntime {
392
387
  throw signal.reason ?? new Error("Wait aborted");
393
388
  const record = this.lookup(id);
394
389
  if (record.settled)
395
- return this.snapshot(record);
390
+ return snapshotOf(record);
396
391
  return new Promise((resolve, reject) => {
397
392
  let finished = false;
398
393
  let timer;
@@ -407,7 +402,7 @@ export class TaskRuntime {
407
402
  if (aborted)
408
403
  reject(signal?.reason ?? new Error("Wait aborted"));
409
404
  else
410
- resolve(this.snapshot(record));
405
+ resolve(snapshotOf(record));
411
406
  this.store.trim();
412
407
  this.emit();
413
408
  };
@@ -428,6 +423,7 @@ export class TaskRuntime {
428
423
  if (!active || record.settled || active.controller.signal.aborted)
429
424
  return false;
430
425
  record.task.status = "stopping";
426
+ changed(record);
431
427
  active.controller.abort();
432
428
  this.emit();
433
429
  return true;
@@ -484,22 +480,11 @@ export class TaskRuntime {
484
480
  pendingNotifications() {
485
481
  if (this.closed || this.pauses > 0)
486
482
  return [];
487
- return [...this.store.records.values()]
488
- .filter((record) => this.candidate(record))
489
- .map((record) => this.snapshot(record));
483
+ return [...this.store.records.values()].filter((record) => this.candidate(record)).map(snapshotOf);
490
484
  }
491
- /**
492
- * Only explicit result-delivery holds delay an automatic completion.
493
- */
485
+ /** Only explicit result-delivery holds delay an automatic completion. */
494
486
  candidate(record) {
495
- return (record.visible &&
496
- record.settled &&
497
- record.accounted &&
498
- record.handedOff === true &&
499
- !record.suppressed &&
500
- record.delivery === "pending" &&
501
- record.waiters.size === 0 &&
502
- record.deliveryHolds === 0);
487
+ return record.visible && record.delivery === "pending" && record.waiters.size === 0 && record.deliveryHolds === 0;
503
488
  }
504
489
  claimNotification(id) {
505
490
  if (this.closed || this.pauses > 0)
@@ -529,10 +514,8 @@ export class TaskRuntime {
529
514
  if (this.closed)
530
515
  return;
531
516
  this._closed = true;
532
- this.views.close();
533
517
  this.listeners.clear();
534
518
  for (const record of this.store.records.values()) {
535
- record.suppressed = true;
536
519
  this.executions.get(record.task.id)?.removeParent();
537
520
  this.cancel(record);
538
521
  for (const waiter of [...record.waiters])
@@ -544,17 +527,20 @@ export class TaskRuntime {
544
527
  this.close();
545
528
  await this.drain([...this.store.records.values()], graceMs);
546
529
  }
530
+ /** Running tasks whose launch anchor is outside the branch made of `ancestors`. */
531
+ activeOutsideBranch(ancestors) {
532
+ return [...this.store.records.values()]
533
+ .filter((record) => !record.settled && record.task.anchorId !== null && !ancestors.has(record.task.anchorId))
534
+ .map(snapshotOf);
535
+ }
536
+ /**
537
+ * Hidden results stay pending: returning to their branch delivers them again.
538
+ * Restored history is already delivered.
539
+ */
547
540
  async cancelOutsideBranch(ancestors) {
548
- for (const record of this.store.records.values()) {
541
+ for (const record of this.store.records.values())
549
542
  record.visible = record.task.anchorId === null || ancestors.has(record.task.anchorId);
550
- // Returning to a branch revives its undelivered completions; restored history
551
- // stays delivered and suppressed.
552
- if (record.visible && record.delivery === "pending")
553
- record.suppressed = false;
554
- }
555
543
  const outside = [...this.store.records.values()].filter((record) => !record.visible);
556
- for (const record of outside)
557
- record.suppressed = true;
558
544
  for (const record of outside)
559
545
  this.cancel(record);
560
546
  this.store.trim();
@@ -576,9 +562,6 @@ export class TaskRuntime {
576
562
  clearTimeout(timer);
577
563
  }
578
564
  }
579
- snapshot(record) {
580
- return structuredClone(record.task);
581
- }
582
565
  emit() {
583
566
  if (this.closed)
584
567
  return;