@astralyn/pi 1.4.10 → 1.5.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 (595) hide show
  1. package/CHANGELOG.md +88 -0
  2. package/dist/bundle/chunks/anthropic-messages-G5ZGBHOH.js +6 -0
  3. package/dist/bundle/chunks/azure-openai-responses-EMPTMYNF.js +2 -0
  4. package/dist/bundle/chunks/bedrock-converse-stream.js +22 -15
  5. package/dist/bundle/chunks/chunk-AXX7FFFD.js +2 -0
  6. package/dist/bundle/chunks/chunk-FNGB3ASD.js +2 -0
  7. package/dist/bundle/chunks/chunk-FPALVF3F.js +4 -0
  8. package/dist/bundle/chunks/chunk-H3UF54OB.js +9 -0
  9. package/dist/bundle/chunks/chunk-IC6JXX2J.js +10 -0
  10. package/dist/bundle/chunks/{chunk-UCH27AVQ.js → chunk-IRUUTK4W.js} +1 -1
  11. package/dist/bundle/chunks/{chunk-MZJC45TM.js → chunk-J7L6O5XA.js} +3 -3
  12. package/dist/bundle/chunks/{chunk-DLVLAQEG.js → chunk-KBFO53OG.js} +3 -3
  13. package/dist/bundle/chunks/{chunk-TPVFPFJP.js → chunk-P7VXFB2M.js} +1 -1
  14. package/dist/bundle/chunks/chunk-PSYLMRL6.js +9 -0
  15. package/dist/bundle/chunks/chunk-QNZARXLE.js +82 -0
  16. package/dist/bundle/chunks/chunk-R3YHAMWH.js +1503 -0
  17. package/dist/bundle/chunks/chunk-RAIYJ5FC.js +4 -0
  18. package/dist/bundle/chunks/{chunk-OV2VMHBX.js → chunk-SR6EWNPW.js} +1 -1
  19. package/dist/bundle/chunks/chunk-TA3YH2ZI.js +16 -0
  20. package/dist/bundle/chunks/{chunk-MF3T3ETJ.js → chunk-THAJ4BZF.js} +58 -62
  21. package/dist/bundle/chunks/{chunk-24FY4C5S.js → chunk-TRSJS3FM.js} +1 -1
  22. package/dist/bundle/chunks/chunk-ZRI3ICDE.js +2 -0
  23. package/dist/bundle/chunks/{cli-MBFCFGI2.js → cli-LAZQG54B.js} +11 -9
  24. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-7BKATOEJ.js → cloudflare-workers-ai-system-one-4L2ABUJE.js} +1 -1
  25. package/dist/bundle/chunks/{execute-FQKRO4XJ.js → execute-ACWDKC3C.js} +1 -1
  26. package/dist/bundle/chunks/github-copilot.js +1 -1
  27. package/dist/bundle/chunks/{google-generative-ai-HTUSU45F.js → google-generative-ai-OOVDGS5W.js} +1 -1
  28. package/dist/bundle/chunks/{google-vertex-AVQV4P76.js → google-vertex-IK5RNG7J.js} +1 -1
  29. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  30. package/dist/bundle/chunks/kimi-coding.js +1 -1
  31. package/dist/bundle/chunks/{llama-cpp-classify-27QYLJZY.js → llama-cpp-classify-XHAVT37C.js} +1 -1
  32. package/dist/bundle/chunks/meta.js +1 -1
  33. package/dist/bundle/chunks/mistral-conversations-Z56KY4OJ.js +5 -0
  34. package/dist/bundle/chunks/{openai-codex-responses-Q25MHDFX.js → openai-codex-responses-5NAH3SK6.js} +1 -1
  35. package/dist/bundle/chunks/openai-completions-S7S6PO3J.js +7 -0
  36. package/dist/bundle/chunks/{openai-decisions-3WYFPGSK.js → openai-decisions-7A36EAHE.js} +1 -1
  37. package/dist/bundle/chunks/{openai-responses-E4BNZIQK.js → openai-responses-ZQRZJKH4.js} +1 -1
  38. package/dist/bundle/chunks/{openrouter-images-CBP3OPOD.js → openrouter-images-X7PX72ON.js} +1 -1
  39. package/dist/bundle/chunks/pi-messages-TXNWPLI4.js +8 -0
  40. package/dist/bundle/chunks/radius.js +1 -1
  41. package/dist/bundle/chunks/{runtime-3RPOJS5T.js → runtime-X3XOMNXQ.js} +1 -1
  42. package/dist/bundle/chunks/{typesafe-system-one-BNICP2LS.js → typesafe-system-one-XJGMSHWL.js} +1 -1
  43. package/dist/bundle/chunks/virtual-modules-T2KLVAFL.js +2 -0
  44. package/dist/bundle/cli.js +1 -1
  45. package/dist/bundle/index.js +1 -1
  46. package/dist/bundle/rpc-entry.js +1 -1
  47. package/dist/cli/args.d.ts.map +1 -1
  48. package/dist/cli/args.js +8 -7
  49. package/dist/cli/args.js.map +1 -1
  50. package/dist/config.d.ts +10 -0
  51. package/dist/config.d.ts.map +1 -1
  52. package/dist/config.js +24 -5
  53. package/dist/config.js.map +1 -1
  54. package/dist/core/agent-session-runtime.d.ts +0 -5
  55. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  56. package/dist/core/agent-session-runtime.js +12 -28
  57. package/dist/core/agent-session-runtime.js.map +1 -1
  58. package/dist/core/agent-session.d.ts +21 -14
  59. package/dist/core/agent-session.d.ts.map +1 -1
  60. package/dist/core/agent-session.js +67 -96
  61. package/dist/core/agent-session.js.map +1 -1
  62. package/dist/core/compaction/branch-summarization.d.ts +4 -2
  63. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  64. package/dist/core/compaction/branch-summarization.js +16 -4
  65. package/dist/core/compaction/branch-summarization.js.map +1 -1
  66. package/dist/core/exec.d.ts +9 -1
  67. package/dist/core/exec.d.ts.map +1 -1
  68. package/dist/core/exec.js +104 -60
  69. package/dist/core/exec.js.map +1 -1
  70. package/dist/core/export-html/template.css +9 -0
  71. package/dist/core/export-html/template.js +165 -45
  72. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  73. package/dist/core/export-html/tool-renderer.js +5 -0
  74. package/dist/core/export-html/tool-renderer.js.map +1 -1
  75. package/dist/core/extensions/index.d.ts +2 -2
  76. package/dist/core/extensions/index.d.ts.map +1 -1
  77. package/dist/core/extensions/index.js.map +1 -1
  78. package/dist/core/extensions/loader.d.ts.map +1 -1
  79. package/dist/core/extensions/loader.js +20 -12
  80. package/dist/core/extensions/loader.js.map +1 -1
  81. package/dist/core/extensions/pi-ai-extension-view.d.ts +19 -0
  82. package/dist/core/extensions/pi-ai-extension-view.d.ts.map +1 -0
  83. package/dist/core/extensions/pi-ai-extension-view.js +22 -0
  84. package/dist/core/extensions/pi-ai-extension-view.js.map +1 -0
  85. package/dist/core/extensions/runner.d.ts +0 -1
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +7 -12
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +41 -23
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js.map +1 -1
  92. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  93. package/dist/core/extensions/virtual-modules.js +8 -7
  94. package/dist/core/extensions/virtual-modules.js.map +1 -1
  95. package/dist/core/mcp-servers.d.ts +11 -4
  96. package/dist/core/mcp-servers.d.ts.map +1 -1
  97. package/dist/core/mcp-servers.js +15 -5
  98. package/dist/core/mcp-servers.js.map +1 -1
  99. package/dist/core/model-config.d.ts +1678 -2029
  100. package/dist/core/model-config.d.ts.map +1 -1
  101. package/dist/core/model-config.js +2 -3
  102. package/dist/core/model-config.js.map +1 -1
  103. package/dist/core/model-resolver.d.ts.map +1 -1
  104. package/dist/core/model-resolver.js +16 -10
  105. package/dist/core/model-resolver.js.map +1 -1
  106. package/dist/core/package-manager.d.ts +14 -0
  107. package/dist/core/package-manager.d.ts.map +1 -1
  108. package/dist/core/package-manager.js +160 -46
  109. package/dist/core/package-manager.js.map +1 -1
  110. package/dist/core/pi-ai-schemas.d.ts +163 -0
  111. package/dist/core/pi-ai-schemas.d.ts.map +1 -0
  112. package/dist/core/pi-ai-schemas.js +21 -0
  113. package/dist/core/pi-ai-schemas.js.map +1 -0
  114. package/dist/core/pi-manifest.d.ts +1 -0
  115. package/dist/core/pi-manifest.d.ts.map +1 -1
  116. package/dist/core/pi-manifest.js +4 -0
  117. package/dist/core/pi-manifest.js.map +1 -1
  118. package/dist/core/project-trust.js +1 -1
  119. package/dist/core/project-trust.js.map +1 -1
  120. package/dist/core/quiescence.d.ts +24 -0
  121. package/dist/core/quiescence.d.ts.map +1 -0
  122. package/dist/core/quiescence.js +81 -0
  123. package/dist/core/quiescence.js.map +1 -0
  124. package/dist/core/resource-loader.d.ts +4 -1
  125. package/dist/core/resource-loader.d.ts.map +1 -1
  126. package/dist/core/resource-loader.js +41 -28
  127. package/dist/core/resource-loader.js.map +1 -1
  128. package/dist/core/sdk.d.ts.map +1 -1
  129. package/dist/core/sdk.js +3 -1
  130. package/dist/core/sdk.js.map +1 -1
  131. package/dist/core/session-manager.d.ts +7 -0
  132. package/dist/core/session-manager.d.ts.map +1 -1
  133. package/dist/core/session-manager.js +32 -13
  134. package/dist/core/session-manager.js.map +1 -1
  135. package/dist/core/settings-manager.d.ts +2 -0
  136. package/dist/core/settings-manager.d.ts.map +1 -1
  137. package/dist/core/settings-manager.js +11 -0
  138. package/dist/core/settings-manager.js.map +1 -1
  139. package/dist/core/settings-schema.d.ts +4 -2
  140. package/dist/core/settings-schema.d.ts.map +1 -1
  141. package/dist/core/settings-schema.js +8 -1
  142. package/dist/core/settings-schema.js.map +1 -1
  143. package/dist/core/skills.d.ts.map +1 -1
  144. package/dist/core/skills.js +6 -14
  145. package/dist/core/skills.js.map +1 -1
  146. package/dist/core/slash-command-name.d.ts +6 -0
  147. package/dist/core/slash-command-name.d.ts.map +1 -0
  148. package/dist/core/slash-command-name.js +11 -0
  149. package/dist/core/slash-command-name.js.map +1 -0
  150. package/dist/core/slash-commands.js +2 -2
  151. package/dist/core/slash-commands.js.map +1 -1
  152. package/dist/core/source-info.d.ts +9 -0
  153. package/dist/core/source-info.d.ts.map +1 -1
  154. package/dist/core/source-info.js +13 -0
  155. package/dist/core/source-info.js.map +1 -1
  156. package/dist/core/system-prompt.d.ts.map +1 -1
  157. package/dist/core/system-prompt.js +5 -6
  158. package/dist/core/system-prompt.js.map +1 -1
  159. package/dist/core/tasks/codec.d.ts +14 -0
  160. package/dist/core/tasks/codec.d.ts.map +1 -1
  161. package/dist/core/tasks/codec.js +57 -4
  162. package/dist/core/tasks/codec.js.map +1 -1
  163. package/dist/core/tasks/delivery.d.ts +4 -20
  164. package/dist/core/tasks/delivery.d.ts.map +1 -1
  165. package/dist/core/tasks/delivery.js +5 -58
  166. package/dist/core/tasks/delivery.js.map +1 -1
  167. package/dist/core/tasks/limits.d.ts +3 -19
  168. package/dist/core/tasks/limits.d.ts.map +1 -1
  169. package/dist/core/tasks/limits.js +3 -24
  170. package/dist/core/tasks/limits.js.map +1 -1
  171. package/dist/core/tasks/record.d.ts +1 -7
  172. package/dist/core/tasks/record.d.ts.map +1 -1
  173. package/dist/core/tasks/record.js +0 -18
  174. package/dist/core/tasks/record.js.map +1 -1
  175. package/dist/core/tasks/reminder.d.ts +3 -2
  176. package/dist/core/tasks/reminder.d.ts.map +1 -1
  177. package/dist/core/tasks/reminder.js +4 -3
  178. package/dist/core/tasks/reminder.js.map +1 -1
  179. package/dist/core/tasks/runtime.d.ts +1 -14
  180. package/dist/core/tasks/runtime.d.ts.map +1 -1
  181. package/dist/core/tasks/runtime.js +3 -96
  182. package/dist/core/tasks/runtime.js.map +1 -1
  183. package/dist/core/tasks/session.d.ts +9 -5
  184. package/dist/core/tasks/session.d.ts.map +1 -1
  185. package/dist/core/tasks/session.js +22 -24
  186. package/dist/core/tasks/session.js.map +1 -1
  187. package/dist/core/tasks/types.d.ts +3 -92
  188. package/dist/core/tasks/types.d.ts.map +1 -1
  189. package/dist/core/tasks/types.js +3 -3
  190. package/dist/core/tasks/types.js.map +1 -1
  191. package/dist/core/tools/bash.d.ts +8 -7
  192. package/dist/core/tools/bash.d.ts.map +1 -1
  193. package/dist/core/tools/bash.js +6 -5
  194. package/dist/core/tools/bash.js.map +1 -1
  195. package/dist/core/tools/edit.d.ts +3 -3
  196. package/dist/core/tools/edit.d.ts.map +1 -1
  197. package/dist/core/tools/edit.js +2 -4
  198. package/dist/core/tools/edit.js.map +1 -1
  199. package/dist/core/tools/find.d.ts +2 -2
  200. package/dist/core/tools/find.d.ts.map +1 -1
  201. package/dist/core/tools/find.js.map +1 -1
  202. package/dist/core/tools/grep.d.ts +2 -2
  203. package/dist/core/tools/grep.d.ts.map +1 -1
  204. package/dist/core/tools/grep.js +1 -1
  205. package/dist/core/tools/grep.js.map +1 -1
  206. package/dist/core/tools/ls.d.ts +2 -2
  207. package/dist/core/tools/ls.d.ts.map +1 -1
  208. package/dist/core/tools/ls.js.map +1 -1
  209. package/dist/core/tools/powershell.d.ts +1 -5
  210. package/dist/core/tools/powershell.d.ts.map +1 -1
  211. package/dist/core/tools/read.d.ts +2 -2
  212. package/dist/core/tools/read.d.ts.map +1 -1
  213. package/dist/core/tools/read.js.map +1 -1
  214. package/dist/core/tools/render-utils.d.ts +4 -6
  215. package/dist/core/tools/render-utils.d.ts.map +1 -1
  216. package/dist/core/tools/render-utils.js +19 -41
  217. package/dist/core/tools/render-utils.js.map +1 -1
  218. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  219. package/dist/core/tools/renderers/bash.js +3 -25
  220. package/dist/core/tools/renderers/bash.js.map +1 -1
  221. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  222. package/dist/core/tools/renderers/write.js +18 -19
  223. package/dist/core/tools/renderers/write.js.map +1 -1
  224. package/dist/core/tools/shell-execution.d.ts +20 -13
  225. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  226. package/dist/core/tools/shell-execution.js +165 -183
  227. package/dist/core/tools/shell-execution.js.map +1 -1
  228. package/dist/core/tools/shell-tool.d.ts +9 -14
  229. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  230. package/dist/core/tools/shell-tool.js +38 -66
  231. package/dist/core/tools/shell-tool.js.map +1 -1
  232. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -4
  233. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  234. package/dist/core/tools/tool-definition-wrapper.js +2 -3
  235. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  236. package/dist/core/tools/write.d.ts +2 -2
  237. package/dist/core/tools/write.d.ts.map +1 -1
  238. package/dist/core/tools/write.js.map +1 -1
  239. package/dist/core/trust-manager.d.ts.map +1 -1
  240. package/dist/core/trust-manager.js +30 -13
  241. package/dist/core/trust-manager.js.map +1 -1
  242. package/dist/core/usage-totals.d.ts +0 -9
  243. package/dist/core/usage-totals.d.ts.map +1 -1
  244. package/dist/core/usage-totals.js +24 -91
  245. package/dist/core/usage-totals.js.map +1 -1
  246. package/dist/extensions/agent/activity-lines.d.ts +2 -3
  247. package/dist/extensions/agent/activity-lines.d.ts.map +1 -1
  248. package/dist/extensions/agent/activity-lines.js +5 -9
  249. package/dist/extensions/agent/activity-lines.js.map +1 -1
  250. package/dist/extensions/agent/activity.d.ts +0 -2
  251. package/dist/extensions/agent/activity.d.ts.map +1 -1
  252. package/dist/extensions/agent/activity.js +1 -1
  253. package/dist/extensions/agent/activity.js.map +1 -1
  254. package/dist/extensions/agent/progress.d.ts +0 -3
  255. package/dist/extensions/agent/progress.d.ts.map +1 -1
  256. package/dist/extensions/agent/progress.js +2 -8
  257. package/dist/extensions/agent/progress.js.map +1 -1
  258. package/dist/extensions/agent/render.js +1 -1
  259. package/dist/extensions/agent/render.js.map +1 -1
  260. package/dist/extensions/agent/tool.d.ts.map +1 -1
  261. package/dist/extensions/agent/tool.js +0 -6
  262. package/dist/extensions/agent/tool.js.map +1 -1
  263. package/dist/{core/isolated-session.d.ts → extensions/agent/worker-session.d.ts} +6 -6
  264. package/dist/extensions/agent/worker-session.d.ts.map +1 -0
  265. package/dist/{core/isolated-session.js → extensions/agent/worker-session.js} +9 -9
  266. package/dist/extensions/agent/worker-session.js.map +1 -0
  267. package/dist/extensions/agent/worker.d.ts +0 -3
  268. package/dist/extensions/agent/worker.d.ts.map +1 -1
  269. package/dist/extensions/agent/worker.js +2 -3
  270. package/dist/extensions/agent/worker.js.map +1 -1
  271. package/dist/extensions/btw/agent.d.ts.map +1 -1
  272. package/dist/extensions/btw/agent.js +2 -1
  273. package/dist/extensions/btw/agent.js.map +1 -1
  274. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  275. package/dist/extensions/cached-compaction/render.js +3 -3
  276. package/dist/extensions/cached-compaction/render.js.map +1 -1
  277. package/dist/extensions/cached-compaction/summary.d.ts +1 -1
  278. package/dist/extensions/cached-compaction/summary.d.ts.map +1 -1
  279. package/dist/extensions/cached-compaction/summary.js +13 -16
  280. package/dist/extensions/cached-compaction/summary.js.map +1 -1
  281. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  282. package/dist/extensions/codemode/renderer.js +6 -2
  283. package/dist/extensions/codemode/renderer.js.map +1 -1
  284. package/dist/extensions/codemode/tool.d.ts +2 -1
  285. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  286. package/dist/extensions/codemode/tool.js +33 -8
  287. package/dist/extensions/codemode/tool.js.map +1 -1
  288. package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
  289. package/dist/extensions/deepwiki/schema.js +1 -1
  290. package/dist/extensions/deepwiki/schema.js.map +1 -1
  291. package/dist/extensions/llama/ui.d.ts.map +1 -1
  292. package/dist/extensions/llama/ui.js +16 -4
  293. package/dist/extensions/llama/ui.js.map +1 -1
  294. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  295. package/dist/extensions/mcp/cli.js +34 -8
  296. package/dist/extensions/mcp/cli.js.map +1 -1
  297. package/dist/extensions/mcp/oauth.d.ts +1 -1
  298. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  299. package/dist/extensions/mcp/oauth.js +36 -13
  300. package/dist/extensions/mcp/oauth.js.map +1 -1
  301. package/dist/extensions/mcp/ui.d.ts +1 -0
  302. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  303. package/dist/extensions/mcp/ui.js +33 -24
  304. package/dist/extensions/mcp/ui.js.map +1 -1
  305. package/dist/extensions/run-summary/index.d.ts +1 -1
  306. package/dist/extensions/run-summary/index.d.ts.map +1 -1
  307. package/dist/extensions/run-summary/index.js +11 -23
  308. package/dist/extensions/run-summary/index.js.map +1 -1
  309. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  310. package/dist/extensions/statusline/usage.js +2 -1
  311. package/dist/extensions/statusline/usage.js.map +1 -1
  312. package/dist/extensions/tasks/tool/actions.d.ts +1 -2
  313. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  314. package/dist/extensions/tasks/tool/actions.js +7 -79
  315. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  316. package/dist/extensions/tasks/tool/constants.d.ts +1 -3
  317. package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
  318. package/dist/extensions/tasks/tool/constants.js +1 -3
  319. package/dist/extensions/tasks/tool/constants.js.map +1 -1
  320. package/dist/extensions/tasks/tool/schema.d.ts +1 -2
  321. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  322. package/dist/extensions/tasks/tool/schema.js +7 -15
  323. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  324. package/dist/extensions/tasks/tool/types.d.ts +1 -19
  325. package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
  326. package/dist/extensions/tasks/tool/types.js.map +1 -1
  327. package/dist/extensions/tasks/tool.d.ts +1 -2
  328. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  329. package/dist/extensions/tasks/tool.js +2 -4
  330. package/dist/extensions/tasks/tool.js.map +1 -1
  331. package/dist/extensions/tasks/ui/completion-render.d.ts +5 -1
  332. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  333. package/dist/extensions/tasks/ui/completion-render.js +25 -70
  334. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  335. package/dist/extensions/tasks/ui/inspector.d.ts +1 -1
  336. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  337. package/dist/extensions/tasks/ui/inspector.js +0 -6
  338. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  339. package/dist/extensions/tasks/ui/manager.d.ts +1 -1
  340. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  341. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  342. package/dist/extensions/tasks/ui/render.d.ts +2 -16
  343. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  344. package/dist/extensions/tasks/ui/render.js +3 -79
  345. package/dist/extensions/tasks/ui/render.js.map +1 -1
  346. package/dist/extensions/tasks/ui/views.d.ts +2 -4
  347. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  348. package/dist/extensions/tasks/ui/views.js +3 -7
  349. package/dist/extensions/tasks/ui/views.js.map +1 -1
  350. package/dist/extensions/tool-presentation/fallback.d.ts.map +1 -0
  351. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.js +5 -5
  352. package/dist/extensions/tool-presentation/fallback.js.map +1 -0
  353. package/dist/extensions/tool-presentation/index.js +1 -1
  354. package/dist/extensions/tool-presentation/index.js.map +1 -1
  355. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.d.ts +1 -1
  356. package/dist/extensions/tool-presentation/shell.d.ts.map +1 -0
  357. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.js +3 -3
  358. package/dist/extensions/tool-presentation/shell.js.map +1 -0
  359. package/dist/extensions/tool-search/tool.d.ts +21 -6
  360. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  361. package/dist/extensions/tool-search/tool.js +104 -36
  362. package/dist/extensions/tool-search/tool.js.map +1 -1
  363. package/dist/index.d.ts +3 -3
  364. package/dist/index.d.ts.map +1 -1
  365. package/dist/index.js.map +1 -1
  366. package/dist/main.d.ts.map +1 -1
  367. package/dist/main.js +15 -8
  368. package/dist/main.js.map +1 -1
  369. package/dist/modes/interactive/components/assistant-message.d.ts +5 -3
  370. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  371. package/dist/modes/interactive/components/assistant-message.js +61 -45
  372. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  373. package/dist/modes/interactive/components/config-selector-skills.d.ts +54 -0
  374. package/dist/modes/interactive/components/config-selector-skills.d.ts.map +1 -0
  375. package/dist/modes/interactive/components/config-selector-skills.js +178 -0
  376. package/dist/modes/interactive/components/config-selector-skills.js.map +1 -0
  377. package/dist/modes/interactive/components/config-selector.d.ts +2 -11
  378. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  379. package/dist/modes/interactive/components/config-selector.js +31 -181
  380. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  381. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  382. package/dist/modes/interactive/components/custom-editor.js +7 -0
  383. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  384. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  385. package/dist/modes/interactive/components/custom-entry.js +2 -1
  386. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  387. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  388. package/dist/modes/interactive/components/custom-message.js +2 -1
  389. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  390. package/dist/modes/interactive/components/extension-editor.d.ts +2 -0
  391. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  392. package/dist/modes/interactive/components/extension-editor.js +4 -0
  393. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  394. package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
  395. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  396. package/dist/modes/interactive/components/login-dialog.js +103 -10
  397. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  398. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -1
  399. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  400. package/dist/modes/interactive/components/markdown-transform.js +3 -2
  401. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  402. package/dist/modes/interactive/components/model-selector.d.ts +1 -0
  403. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  404. package/dist/modes/interactive/components/model-selector.js +17 -6
  405. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  406. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -0
  407. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  408. package/dist/modes/interactive/components/oauth-selector.js +13 -4
  409. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  410. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -0
  411. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  412. package/dist/modes/interactive/components/scoped-models-selector.js +14 -3
  413. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  414. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  415. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  416. package/dist/modes/interactive/components/session-selector-search.js +86 -22
  417. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  418. package/dist/modes/interactive/components/session-selector.d.ts +2 -1
  419. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  420. package/dist/modes/interactive/components/session-selector.js +15 -23
  421. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  422. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  423. package/dist/modes/interactive/components/settings-submenu.js +2 -0
  424. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  425. package/dist/modes/interactive/components/tool-execution.d.ts +7 -0
  426. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/tool-execution.js +48 -9
  428. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  429. package/dist/modes/interactive/components/tree-selector.d.ts +1 -0
  430. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  431. package/dist/modes/interactive/components/tree-selector.js +5 -6
  432. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  433. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -0
  434. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/user-message-selector.js +9 -1
  436. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  437. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  438. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/user-message.js +4 -2
  440. package/dist/modes/interactive/components/user-message.js.map +1 -1
  441. package/dist/modes/interactive/editor-host.d.ts.map +1 -1
  442. package/dist/modes/interactive/editor-host.js +3 -2
  443. package/dist/modes/interactive/editor-host.js.map +1 -1
  444. package/dist/modes/interactive/external-editor.d.ts +1 -0
  445. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  446. package/dist/modes/interactive/external-editor.js +17 -5
  447. package/dist/modes/interactive/external-editor.js.map +1 -1
  448. package/dist/modes/interactive/interactive-mode.d.ts +8 -12
  449. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  450. package/dist/modes/interactive/interactive-mode.js +169 -112
  451. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  452. package/dist/modes/interactive/model-search.d.ts +10 -0
  453. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  454. package/dist/modes/interactive/model-search.js +21 -0
  455. package/dist/modes/interactive/model-search.js.map +1 -1
  456. package/dist/modes/interactive/theme/theme.d.ts +10 -0
  457. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  458. package/dist/modes/interactive/theme/theme.js +30 -23
  459. package/dist/modes/interactive/theme/theme.js.map +1 -1
  460. package/dist/modes/interactive/tool-view/chat.d.ts +2 -2
  461. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  462. package/dist/modes/interactive/tool-view/chat.js +22 -19
  463. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  464. package/dist/modes/interactive/transcript-layout.d.ts +2 -0
  465. package/dist/modes/interactive/transcript-layout.d.ts.map +1 -1
  466. package/dist/modes/interactive/transcript-layout.js +5 -2
  467. package/dist/modes/interactive/transcript-layout.js.map +1 -1
  468. package/dist/modes/print-mode.d.ts.map +1 -1
  469. package/dist/modes/print-mode.js +1 -0
  470. package/dist/modes/print-mode.js.map +1 -1
  471. package/dist/modes/rpc/rpc-client.d.ts +9 -1
  472. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  473. package/dist/modes/rpc/rpc-client.js +23 -23
  474. package/dist/modes/rpc/rpc-client.js.map +1 -1
  475. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  476. package/dist/modes/rpc/rpc-mode.js +1 -3
  477. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  478. package/dist/package-manager-cli.d.ts.map +1 -1
  479. package/dist/package-manager-cli.js +55 -4
  480. package/dist/package-manager-cli.js.map +1 -1
  481. package/dist/utils/ansi.d.ts.map +1 -1
  482. package/dist/utils/ansi.js +5 -2
  483. package/dist/utils/ansi.js.map +1 -1
  484. package/dist/utils/clipboard-command.d.ts.map +1 -1
  485. package/dist/utils/clipboard-command.js +4 -0
  486. package/dist/utils/clipboard-command.js.map +1 -1
  487. package/dist/utils/git.d.ts +1 -1
  488. package/dist/utils/git.d.ts.map +1 -1
  489. package/dist/utils/git.js.map +1 -1
  490. package/dist/utils/image-resize-core.d.ts.map +1 -1
  491. package/dist/utils/image-resize-core.js +5 -3
  492. package/dist/utils/image-resize-core.js.map +1 -1
  493. package/dist/utils/open-browser.d.ts.map +1 -1
  494. package/dist/utils/open-browser.js +4 -1
  495. package/dist/utils/open-browser.js.map +1 -1
  496. package/dist/utils/paths.d.ts +17 -0
  497. package/dist/utils/paths.d.ts.map +1 -1
  498. package/dist/utils/paths.js +42 -1
  499. package/dist/utils/paths.js.map +1 -1
  500. package/dist/utils/shell.d.ts.map +1 -1
  501. package/dist/utils/shell.js +14 -0
  502. package/dist/utils/shell.js.map +1 -1
  503. package/dist/utils/syntax-highlight.d.ts +5 -0
  504. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  505. package/dist/utils/syntax-highlight.js +7 -0
  506. package/dist/utils/syntax-highlight.js.map +1 -1
  507. package/dist/utils/tools-manager.d.ts.map +1 -1
  508. package/dist/utils/tools-manager.js +30 -35
  509. package/dist/utils/tools-manager.js.map +1 -1
  510. package/dist/utils/usage.d.ts +5 -0
  511. package/dist/utils/usage.d.ts.map +1 -0
  512. package/dist/utils/usage.js +16 -0
  513. package/dist/utils/usage.js.map +1 -0
  514. package/docs/bundled/README.md +1 -1
  515. package/docs/bundled/extensions/agent.md +7 -7
  516. package/docs/bundled/extensions/run-summary.md +4 -4
  517. package/docs/bundled/extensions/statusline.md +1 -1
  518. package/docs/bundled/tasks.md +12 -27
  519. package/docs/bundled/tool-presentation.md +2 -2
  520. package/docs/custom-provider.md +1 -1
  521. package/docs/environment-variables.md +2 -0
  522. package/docs/extensions.md +41 -28
  523. package/docs/keybindings.md +1 -1
  524. package/docs/llama-cpp.md +17 -12
  525. package/docs/mcp.md +6 -4
  526. package/docs/models-configuration.md +1 -1
  527. package/docs/models.md +7 -85
  528. package/docs/packages.md +26 -1
  529. package/docs/rpc.md +1 -1
  530. package/docs/sdk.md +10 -8
  531. package/docs/session-format.md +3 -3
  532. package/docs/sessions.md +10 -0
  533. package/docs/settings.md +5 -4
  534. package/docs/terminal-setup.md +2 -2
  535. package/docs/tmux.md +6 -0
  536. package/docs/tui.md +12 -7
  537. package/docs/usage.md +19 -9
  538. package/docs/windows.md +29 -0
  539. package/examples/extensions/README.md +2 -1
  540. package/examples/extensions/custom-provider-anthropic/index.ts +27 -31
  541. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  542. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  543. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  544. package/examples/extensions/debug-provider.ts +2 -2
  545. package/examples/extensions/gondolin/package-lock.json +19 -29
  546. package/examples/extensions/gondolin/package.json +2 -2
  547. package/examples/extensions/preset.ts +2 -0
  548. package/examples/extensions/reload-runtime.ts +17 -5
  549. package/examples/extensions/tools.ts +2 -0
  550. package/examples/extensions/with-deps/package-lock.json +2 -2
  551. package/examples/extensions/with-deps/package.json +1 -1
  552. package/package.json +11 -12
  553. package/schemas/models.schema.json +36 -36
  554. package/schemas/settings.schema.json +17 -0
  555. package/dist/bundle/chunks/anthropic-messages-HWL6AS7T.js +0 -6
  556. package/dist/bundle/chunks/azure-openai-responses-4YYPDYV5.js +0 -2
  557. package/dist/bundle/chunks/chunk-6GTUUUCJ.js +0 -1499
  558. package/dist/bundle/chunks/chunk-6JS2SOFO.js +0 -11
  559. package/dist/bundle/chunks/chunk-ANCZPKX7.js +0 -2
  560. package/dist/bundle/chunks/chunk-FEZ5RM2B.js +0 -2
  561. package/dist/bundle/chunks/chunk-LPF7HQ3S.js +0 -4
  562. package/dist/bundle/chunks/chunk-MMNIHCU7.js +0 -2
  563. package/dist/bundle/chunks/chunk-R267VV5T.js +0 -82
  564. package/dist/bundle/chunks/chunk-RVKT7OUB.js +0 -9
  565. package/dist/bundle/chunks/chunk-SA2AQYEI.js +0 -7
  566. package/dist/bundle/chunks/chunk-ZAIGBRV5.js +0 -16
  567. package/dist/bundle/chunks/mistral-conversations-V2JJTMJ5.js +0 -5
  568. package/dist/bundle/chunks/openai-completions-TXZXILJR.js +0 -7
  569. package/dist/bundle/chunks/pi-messages-LBJQ4NGP.js +0 -8
  570. package/dist/bundle/chunks/virtual-modules-6IJ6V2CG.js +0 -2
  571. package/dist/core/isolated-session.d.ts.map +0 -1
  572. package/dist/core/isolated-session.js.map +0 -1
  573. package/dist/core/tasks/wait.d.ts +0 -19
  574. package/dist/core/tasks/wait.d.ts.map +0 -1
  575. package/dist/core/tasks/wait.js +0 -45
  576. package/dist/core/tasks/wait.js.map +0 -1
  577. package/dist/modes/interactive/tool-view/fallback.d.ts.map +0 -1
  578. package/dist/modes/interactive/tool-view/fallback.js.map +0 -1
  579. package/dist/modes/interactive/tool-view/shell.d.ts.map +0 -1
  580. package/dist/modes/interactive/tool-view/shell.js.map +0 -1
  581. package/dist/modes/interactive/tool-view/tool-execution.d.ts +0 -14
  582. package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +0 -1
  583. package/dist/modes/interactive/tool-view/tool-execution.js +0 -13
  584. package/dist/modes/interactive/tool-view/tool-execution.js.map +0 -1
  585. package/dist/utils/path-identity.d.ts +0 -12
  586. package/dist/utils/path-identity.d.ts.map +0 -1
  587. package/dist/utils/path-identity.js +0 -63
  588. package/dist/utils/path-identity.js.map +0 -1
  589. package/docs/images/doom-extension.png +0 -0
  590. package/docs/images/exy.png +0 -0
  591. package/examples/extensions/sandbox/index.ts +0 -321
  592. package/examples/extensions/sandbox/package-lock.json +0 -92
  593. package/examples/extensions/sandbox/package.json +0 -19
  594. package/npm-shrinkwrap.json +0 -4207
  595. /package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACxC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,kCAAkC,GAAG,wBAAwB,GAAG;IAC3E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAG1D,gGAAgG;AAChG,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,wBAAwB,GAAG,kCAAkC,CAiBrH;AAkDD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,oBAAoB,CAiE/F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,wBAAwB,GAAG;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAGA;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAS3C"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAyB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,wBAAwB;IACxC,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,gCAAgC;IAChC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,yBAAyB;IACzB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;CACjB;AAED,MAAM,MAAM,kCAAkC,GAAG,wBAAwB,GAAG;IAC3E,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACzC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,MAAM,EAAE,KAAK,EAAE,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAG1D,gGAAgG;AAChG,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,wBAAwB,GAAG,kCAAkC,CAiBrH;AAkDD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,wBAAwB,GAAG,oBAAoB,CAgE/F;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,wBAAwB,GAAG;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CAChC,CAGA;AAED,oGAAoG;AACpG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,wBAAwB,GAAG,MAAM,CAEzE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACvC,OAAO,EAAE,oBAAoB,GAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,GAAG,SAAS,CAS3C"}
@@ -80,19 +80,18 @@ export function buildSystemPromptSections(input) {
80
80
  }
81
81
  else {
82
82
  promptSections.preamble =
83
- "You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.";
83
+ "You are a coding assistant running inside pi, a coding agent harness. Help users inspect files, run commands, and modify code.";
84
84
  const visibleTools = declaredTools.filter((name) => !!toolSnippets[name]);
85
85
  const tools = visibleTools.length > 0 ? visibleTools.map((name) => `- ${name}: ${toolSnippets[name]}`).join("\n") : "(none)";
86
- promptSections.tools = `${tools}\n\nIn addition to the tools above, you may have access to other custom tools depending on the project.`;
86
+ promptSections.tools = `${tools}\n\nAdditional tools may be available.`;
87
87
  promptSections.rules = buildRules(declaredTools, toolGuidelines, promptGuidelines);
88
- promptSections.docs = `Pi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):
88
+ promptSections.docs = `Pi documentation (read only when the user asks about the harness itself, its SDK, extensions, themes, skills, or TUI):
89
89
  - Main documentation: ${getReadmePath()}
90
90
  - Additional docs: ${getDocsPath()}
91
91
  - Examples: ${getExamplesPath()} (extensions, custom tools, SDK)
92
92
  - When reading pi docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory
93
- - When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), pi packages (docs/packages.md), environment variables (docs/environment-variables.md), MCP servers (docs/mcp.md), codemode scripts and non-LLM models such as classifiers and image models (docs/codemode.md)
94
- - When working on pi topics, read the docs and examples, and follow .md cross-references before implementing
95
- - Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;
93
+ - When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), packages (docs/packages.md), environment variables (docs/environment-variables.md), MCP servers (docs/mcp.md), codemode scripts and non-LLM models such as classifiers and image models (docs/codemode.md)
94
+ - Before implementing harness changes, read the relevant docs and examples in full, following related cross-references.`;
96
95
  }
97
96
  if (appendSystemPrompt)
98
97
  promptSections.addendum = appendSystemPrompt;
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * System prompt construction and project context loading\n */\n\nimport { getSystemMessageText } from \"@earendil-works/pi-ai\";\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.ts\";\nimport { formatSkillsForPrompt, type Skill } from \"./skills.ts\";\n\nexport interface BuildSystemPromptOptions {\n\t/** Custom system prompt (replaces the default prefix). */\n\tcustomPrompt?: string;\n\t/** Exact full prompt replacement set by a before_agent_start handler. */\n\tforceSystemPrompt?: string;\n\t/** Tools to include in prompt. Default: [read, bash, edit, write]. */\n\tselectedTools?: string[];\n\t/**\n\t * Selected tools whose declarations requests leave out (`prepareLoadout` hidden declarations).\n\t * They are reachable only through another tool, so the tool list and rules leave them out too.\n\t */\n\thiddenTools?: string[];\n\t/** Optional one-line tool snippets keyed by tool name. */\n\ttoolSnippets?: Record<string, string>;\n\t/** Guideline bullets contributed by each tool, keyed by tool name. */\n\ttoolGuidelines?: Record<string, string[]>;\n\t/** Additional guideline bullets appended to the default system prompt rules. */\n\tpromptGuidelines?: string[];\n\t/** Text appended from user configuration before project context, skills, and cwd. */\n\tappendSystemPrompt?: string;\n\t/** Additional XML-wrapped prompt sections keyed by tag name. */\n\tsections?: Record<string, string>;\n\t/** Working directory. */\n\tcwd: string;\n\t/** Pre-loaded context files. */\n\tcontextFiles?: Array<{ path: string; content: string }>;\n\t/** Pre-loaded skills. */\n\tskills?: Skill[];\n}\n\nexport type NormalizedBuildSystemPromptOptions = BuildSystemPromptOptions & {\n\tselectedTools: string[];\n\thiddenTools: string[];\n\ttoolSnippets: Record<string, string>;\n\ttoolGuidelines: Record<string, string[]>;\n\tpromptGuidelines: string[];\n\tappendSystemPrompt: string;\n\tsections: Record<string, string>;\n\tcontextFiles: Array<{ path: string; content: string }>;\n\tskills: Skill[];\n};\n\n/**\n * Ordered system prompt sections, keyed by name. `preamble` is untagged text; every other\n * section is wrapped in a tag of the same name so the model can match later updates to it.\n * These become `SystemMessage.sections` in the transcript.\n */\nexport type SystemPromptSections = Record<string, string>;\n\nconst SYSTEM_PROMPT_SECTION_NAME = /^[a-z][a-z0-9_-]*$/;\n/** Normalize prompt input into the mutable, collection-complete shape exposed to extensions. */\nexport function normalizeBuildSystemPromptOptions(input: BuildSystemPromptOptions): NormalizedBuildSystemPromptOptions {\n\treturn {\n\t\tcustomPrompt: input.customPrompt,\n\t\tforceSystemPrompt: input.forceSystemPrompt,\n\t\tselectedTools: [...(input.selectedTools ?? [\"read\", \"bash\", \"edit\", \"write\"])],\n\t\thiddenTools: [...(input.hiddenTools ?? [])],\n\t\ttoolSnippets: { ...(input.toolSnippets ?? {}) },\n\t\ttoolGuidelines: Object.fromEntries(\n\t\t\tObject.entries(input.toolGuidelines ?? {}).map(([name, guidelines]) => [name, [...guidelines]]),\n\t\t),\n\t\tpromptGuidelines: [...(input.promptGuidelines ?? [])],\n\t\tappendSystemPrompt: input.appendSystemPrompt ?? \"\",\n\t\tsections: { ...(input.sections ?? {}) },\n\t\tcwd: input.cwd,\n\t\tcontextFiles: (input.contextFiles ?? []).map((file) => ({ ...file })),\n\t\tskills: (input.skills ?? []).map((skill) => ({ ...skill })),\n\t};\n}\n\nfunction renderProjectContext(contextFiles: Array<{ path: string; content: string }>): string {\n\treturn [\n\t\t\"Project-specific instructions and guidelines:\",\n\t\t...contextFiles.map(\n\t\t\t({ path, content }) => `<project_instructions path=\"${path}\">\\n${content}\\n</project_instructions>`,\n\t\t),\n\t].join(\"\\n\\n\");\n}\n\nfunction buildRules(\n\tselectedTools: string[],\n\ttoolGuidelines: Record<string, string[]>,\n\tpromptGuidelines: string[],\n): string {\n\tconst rules: string[] = [];\n\tconst seen = new Set<string>();\n\tconst addRule = (rule: string): void => {\n\t\tconst normalized = rule.trim();\n\t\tif (!normalized || seen.has(normalized)) return;\n\t\tseen.add(normalized);\n\t\trules.push(normalized);\n\t};\n\n\tconst hasBash = selectedTools.includes(\"bash\");\n\tconst hasPowerShell = selectedTools.includes(\"powershell\");\n\tconst hasGrep = selectedTools.includes(\"grep\");\n\tconst hasFind = selectedTools.includes(\"find\");\n\tconst hasLs = selectedTools.includes(\"ls\");\n\n\tif ((hasBash || hasPowerShell) && !hasGrep && !hasFind && !hasLs) {\n\t\tif (hasBash && hasPowerShell) {\n\t\t\taddRule(\"Use bash or PowerShell for file operations like listing, searching, and finding files\");\n\t\t} else if (hasPowerShell) {\n\t\t\taddRule(\"Use PowerShell for file operations like listing, searching, and finding files\");\n\t\t} else {\n\t\t\taddRule(\"Use bash for file operations like ls, rg, find\");\n\t\t}\n\t}\n\n\tfor (const name of selectedTools) {\n\t\tfor (const rule of toolGuidelines[name] ?? []) addRule(rule);\n\t}\n\tfor (const rule of promptGuidelines) addRule(rule);\n\taddRule(\"Be concise in your responses\");\n\taddRule(\"Show file paths clearly when working with files\");\n\treturn rules.map((rule) => `- ${rule}`).join(\"\\n\");\n}\n\n/** Build the ordered, independently replaceable sections of the structured system prompt. */\nexport function buildSystemPromptSections(input: BuildSystemPromptOptions): SystemPromptSections {\n\tconst options = normalizeBuildSystemPromptOptions(input);\n\tconst {\n\t\tcustomPrompt,\n\t\tselectedTools,\n\t\thiddenTools,\n\t\ttoolSnippets,\n\t\ttoolGuidelines,\n\t\tpromptGuidelines,\n\t\tappendSystemPrompt,\n\t\tsections: customSections,\n\t\tcwd,\n\t\tcontextFiles,\n\t\tskills,\n\t} = options;\n\n\tfor (const name of Object.keys(customSections)) {\n\t\tif (!SYSTEM_PROMPT_SECTION_NAME.test(name) || name === \"preamble\") {\n\t\t\tthrow new Error(`Invalid system prompt section name: ${name}`);\n\t\t}\n\t}\n\n\tconst declaredTools = selectedTools.filter((name) => !hiddenTools.includes(name));\n\tconst promptSections: Record<string, string> = {};\n\tif (customPrompt) {\n\t\tpromptSections.preamble = customPrompt;\n\t} else {\n\t\tpromptSections.preamble =\n\t\t\t\"You are an expert coding assistant operating inside pi, a coding agent harness. You help users by reading files, executing commands, editing code, and writing new files.\";\n\t\tconst visibleTools = declaredTools.filter((name) => !!toolSnippets[name]);\n\t\tconst tools =\n\t\t\tvisibleTools.length > 0 ? visibleTools.map((name) => `- ${name}: ${toolSnippets[name]}`).join(\"\\n\") : \"(none)\";\n\t\tpromptSections.tools = `${tools}\\n\\nIn addition to the tools above, you may have access to other custom tools depending on the project.`;\n\t\tpromptSections.rules = buildRules(declaredTools, toolGuidelines, promptGuidelines);\n\t\tpromptSections.docs = `Pi documentation (read only when the user asks about pi itself, its SDK, extensions, themes, skills, or TUI):\n- Main documentation: ${getReadmePath()}\n- Additional docs: ${getDocsPath()}\n- Examples: ${getExamplesPath()} (extensions, custom tools, SDK)\n- When reading pi docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory\n- When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), pi packages (docs/packages.md), environment variables (docs/environment-variables.md), MCP servers (docs/mcp.md), codemode scripts and non-LLM models such as classifiers and image models (docs/codemode.md)\n- When working on pi topics, read the docs and examples, and follow .md cross-references before implementing\n- Always read pi .md files completely and follow links to related docs (e.g., tui.md for TUI API details)`;\n\t}\n\n\tif (appendSystemPrompt) promptSections.addendum = appendSystemPrompt;\n\tif (contextFiles.length > 0) promptSections.project_context = renderProjectContext(contextFiles);\n\t// A hidden reader is still reachable through another tool, so skills stay but the hint names no tool.\n\tconst readers = [\"read\", \"bash\"] as const;\n\tconst skillFileReadTool =\n\t\treaders.find((tool) => declaredTools.includes(tool)) ??\n\t\t(readers.some((tool) => selectedTools.includes(tool)) ? \"indirect\" : undefined);\n\tif (skillFileReadTool && skills.length > 0) {\n\t\tconst skillsPrompt = formatSkillsForPrompt(skills, skillFileReadTool).trim();\n\t\tif (skillsPrompt) promptSections.skills = skillsPrompt;\n\t}\n\tpromptSections.cwd = cwd.replace(/\\\\/g, \"/\");\n\tfor (const [name, content] of Object.entries(customSections)) {\n\t\tif (content) promptSections[name] = content;\n\t}\n\n\tconst sections: SystemPromptSections = { preamble: promptSections.preamble };\n\tfor (const [name, content] of Object.entries(promptSections)) {\n\t\tif (name !== \"preamble\") sections[name] = `<${name}>\\n${content}\\n</${name}>`;\n\t}\n\treturn sections;\n}\n\n/**\n * The complete prompt state for `input`. A forced prompt is opaque and lives in `content`\n * with no sections; otherwise `content` is empty and the structured sections carry the prompt.\n */\nexport function buildSystemPromptState(input: BuildSystemPromptOptions): {\n\tcontent: string;\n\tsections?: SystemPromptSections;\n} {\n\tif (input.forceSystemPrompt !== undefined) return { content: input.forceSystemPrompt };\n\treturn { content: \"\", sections: buildSystemPromptSections(input) };\n}\n\n/** Build the system prompt text, rendered exactly as the transcript's system message replays it. */\nexport function buildSystemPrompt(input: BuildSystemPromptOptions): string {\n\treturn getSystemMessageText({ role: \"system\", ...buildSystemPromptState(input), timestamp: 0 });\n}\n\n/**\n * Diff the sections the model currently has (replayed from the transcript, so never null)\n * against the desired ones. Returns a `SystemMessage.sections` patch, or undefined when\n * nothing changed.\n */\nexport function diffSystemPromptSections(\n\tprevious: Record<string, string | null>,\n\tcurrent: SystemPromptSections,\n): Record<string, string | null> | undefined {\n\tconst patch: Record<string, string | null> = {};\n\tfor (const [name, text] of Object.entries(current)) {\n\t\tif (previous[name] !== text) patch[name] = text;\n\t}\n\tfor (const name of Object.keys(previous)) {\n\t\tif (current[name] === undefined) patch[name] = null;\n\t}\n\treturn Object.keys(patch).length > 0 ? patch : undefined;\n}\n"]}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/core/system-prompt.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * System prompt construction and project context loading\n */\n\nimport { getSystemMessageText } from \"@earendil-works/pi-ai\";\nimport { getDocsPath, getExamplesPath, getReadmePath } from \"../config.ts\";\nimport { formatSkillsForPrompt, type Skill } from \"./skills.ts\";\n\nexport interface BuildSystemPromptOptions {\n\t/** Custom system prompt (replaces the default prefix). */\n\tcustomPrompt?: string;\n\t/** Exact full prompt replacement set by a before_agent_start handler. */\n\tforceSystemPrompt?: string;\n\t/** Tools to include in prompt. Default: [read, bash, edit, write]. */\n\tselectedTools?: string[];\n\t/**\n\t * Selected tools whose declarations requests leave out (`prepareLoadout` hidden declarations).\n\t * They are reachable only through another tool, so the tool list and rules leave them out too.\n\t */\n\thiddenTools?: string[];\n\t/** Optional one-line tool snippets keyed by tool name. */\n\ttoolSnippets?: Record<string, string>;\n\t/** Guideline bullets contributed by each tool, keyed by tool name. */\n\ttoolGuidelines?: Record<string, string[]>;\n\t/** Additional guideline bullets appended to the default system prompt rules. */\n\tpromptGuidelines?: string[];\n\t/** Text appended from user configuration before project context, skills, and cwd. */\n\tappendSystemPrompt?: string;\n\t/** Additional XML-wrapped prompt sections keyed by tag name. */\n\tsections?: Record<string, string>;\n\t/** Working directory. */\n\tcwd: string;\n\t/** Pre-loaded context files. */\n\tcontextFiles?: Array<{ path: string; content: string }>;\n\t/** Pre-loaded skills. */\n\tskills?: Skill[];\n}\n\nexport type NormalizedBuildSystemPromptOptions = BuildSystemPromptOptions & {\n\tselectedTools: string[];\n\thiddenTools: string[];\n\ttoolSnippets: Record<string, string>;\n\ttoolGuidelines: Record<string, string[]>;\n\tpromptGuidelines: string[];\n\tappendSystemPrompt: string;\n\tsections: Record<string, string>;\n\tcontextFiles: Array<{ path: string; content: string }>;\n\tskills: Skill[];\n};\n\n/**\n * Ordered system prompt sections, keyed by name. `preamble` is untagged text; every other\n * section is wrapped in a tag of the same name so the model can match later updates to it.\n * These become `SystemMessage.sections` in the transcript.\n */\nexport type SystemPromptSections = Record<string, string>;\n\nconst SYSTEM_PROMPT_SECTION_NAME = /^[a-z][a-z0-9_-]*$/;\n/** Normalize prompt input into the mutable, collection-complete shape exposed to extensions. */\nexport function normalizeBuildSystemPromptOptions(input: BuildSystemPromptOptions): NormalizedBuildSystemPromptOptions {\n\treturn {\n\t\tcustomPrompt: input.customPrompt,\n\t\tforceSystemPrompt: input.forceSystemPrompt,\n\t\tselectedTools: [...(input.selectedTools ?? [\"read\", \"bash\", \"edit\", \"write\"])],\n\t\thiddenTools: [...(input.hiddenTools ?? [])],\n\t\ttoolSnippets: { ...(input.toolSnippets ?? {}) },\n\t\ttoolGuidelines: Object.fromEntries(\n\t\t\tObject.entries(input.toolGuidelines ?? {}).map(([name, guidelines]) => [name, [...guidelines]]),\n\t\t),\n\t\tpromptGuidelines: [...(input.promptGuidelines ?? [])],\n\t\tappendSystemPrompt: input.appendSystemPrompt ?? \"\",\n\t\tsections: { ...(input.sections ?? {}) },\n\t\tcwd: input.cwd,\n\t\tcontextFiles: (input.contextFiles ?? []).map((file) => ({ ...file })),\n\t\tskills: (input.skills ?? []).map((skill) => ({ ...skill })),\n\t};\n}\n\nfunction renderProjectContext(contextFiles: Array<{ path: string; content: string }>): string {\n\treturn [\n\t\t\"Project-specific instructions and guidelines:\",\n\t\t...contextFiles.map(\n\t\t\t({ path, content }) => `<project_instructions path=\"${path}\">\\n${content}\\n</project_instructions>`,\n\t\t),\n\t].join(\"\\n\\n\");\n}\n\nfunction buildRules(\n\tselectedTools: string[],\n\ttoolGuidelines: Record<string, string[]>,\n\tpromptGuidelines: string[],\n): string {\n\tconst rules: string[] = [];\n\tconst seen = new Set<string>();\n\tconst addRule = (rule: string): void => {\n\t\tconst normalized = rule.trim();\n\t\tif (!normalized || seen.has(normalized)) return;\n\t\tseen.add(normalized);\n\t\trules.push(normalized);\n\t};\n\n\tconst hasBash = selectedTools.includes(\"bash\");\n\tconst hasPowerShell = selectedTools.includes(\"powershell\");\n\tconst hasGrep = selectedTools.includes(\"grep\");\n\tconst hasFind = selectedTools.includes(\"find\");\n\tconst hasLs = selectedTools.includes(\"ls\");\n\n\tif ((hasBash || hasPowerShell) && !hasGrep && !hasFind && !hasLs) {\n\t\tif (hasBash && hasPowerShell) {\n\t\t\taddRule(\"Use bash or PowerShell for file operations like listing, searching, and finding files\");\n\t\t} else if (hasPowerShell) {\n\t\t\taddRule(\"Use PowerShell for file operations like listing, searching, and finding files\");\n\t\t} else {\n\t\t\taddRule(\"Use bash for file operations like ls, rg, find\");\n\t\t}\n\t}\n\n\tfor (const name of selectedTools) {\n\t\tfor (const rule of toolGuidelines[name] ?? []) addRule(rule);\n\t}\n\tfor (const rule of promptGuidelines) addRule(rule);\n\taddRule(\"Be concise in your responses\");\n\taddRule(\"Show file paths clearly when working with files\");\n\treturn rules.map((rule) => `- ${rule}`).join(\"\\n\");\n}\n\n/** Build the ordered, independently replaceable sections of the structured system prompt. */\nexport function buildSystemPromptSections(input: BuildSystemPromptOptions): SystemPromptSections {\n\tconst options = normalizeBuildSystemPromptOptions(input);\n\tconst {\n\t\tcustomPrompt,\n\t\tselectedTools,\n\t\thiddenTools,\n\t\ttoolSnippets,\n\t\ttoolGuidelines,\n\t\tpromptGuidelines,\n\t\tappendSystemPrompt,\n\t\tsections: customSections,\n\t\tcwd,\n\t\tcontextFiles,\n\t\tskills,\n\t} = options;\n\n\tfor (const name of Object.keys(customSections)) {\n\t\tif (!SYSTEM_PROMPT_SECTION_NAME.test(name) || name === \"preamble\") {\n\t\t\tthrow new Error(`Invalid system prompt section name: ${name}`);\n\t\t}\n\t}\n\n\tconst declaredTools = selectedTools.filter((name) => !hiddenTools.includes(name));\n\tconst promptSections: Record<string, string> = {};\n\tif (customPrompt) {\n\t\tpromptSections.preamble = customPrompt;\n\t} else {\n\t\tpromptSections.preamble =\n\t\t\t\"You are a coding assistant running inside pi, a coding agent harness. Help users inspect files, run commands, and modify code.\";\n\t\tconst visibleTools = declaredTools.filter((name) => !!toolSnippets[name]);\n\t\tconst tools =\n\t\t\tvisibleTools.length > 0 ? visibleTools.map((name) => `- ${name}: ${toolSnippets[name]}`).join(\"\\n\") : \"(none)\";\n\t\tpromptSections.tools = `${tools}\\n\\nAdditional tools may be available.`;\n\t\tpromptSections.rules = buildRules(declaredTools, toolGuidelines, promptGuidelines);\n\t\tpromptSections.docs = `Pi documentation (read only when the user asks about the harness itself, its SDK, extensions, themes, skills, or TUI):\n- Main documentation: ${getReadmePath()}\n- Additional docs: ${getDocsPath()}\n- Examples: ${getExamplesPath()} (extensions, custom tools, SDK)\n- When reading pi docs or examples, resolve docs/... under Additional docs and examples/... under Examples, not the current working directory\n- When asked about: extensions (docs/extensions.md, examples/extensions/), themes (docs/themes.md), skills (docs/skills.md), prompt templates (docs/prompt-templates.md), TUI components (docs/tui.md), keybindings (docs/keybindings.md), SDK integrations (docs/sdk.md), custom providers (docs/custom-provider.md), adding models (docs/models.md), packages (docs/packages.md), environment variables (docs/environment-variables.md), MCP servers (docs/mcp.md), codemode scripts and non-LLM models such as classifiers and image models (docs/codemode.md)\n- Before implementing harness changes, read the relevant docs and examples in full, following related cross-references.`;\n\t}\n\n\tif (appendSystemPrompt) promptSections.addendum = appendSystemPrompt;\n\tif (contextFiles.length > 0) promptSections.project_context = renderProjectContext(contextFiles);\n\t// A hidden reader is still reachable through another tool, so skills stay but the hint names no tool.\n\tconst readers = [\"read\", \"bash\"] as const;\n\tconst skillFileReadTool =\n\t\treaders.find((tool) => declaredTools.includes(tool)) ??\n\t\t(readers.some((tool) => selectedTools.includes(tool)) ? \"indirect\" : undefined);\n\tif (skillFileReadTool && skills.length > 0) {\n\t\tconst skillsPrompt = formatSkillsForPrompt(skills, skillFileReadTool).trim();\n\t\tif (skillsPrompt) promptSections.skills = skillsPrompt;\n\t}\n\tpromptSections.cwd = cwd.replace(/\\\\/g, \"/\");\n\tfor (const [name, content] of Object.entries(customSections)) {\n\t\tif (content) promptSections[name] = content;\n\t}\n\n\tconst sections: SystemPromptSections = { preamble: promptSections.preamble };\n\tfor (const [name, content] of Object.entries(promptSections)) {\n\t\tif (name !== \"preamble\") sections[name] = `<${name}>\\n${content}\\n</${name}>`;\n\t}\n\treturn sections;\n}\n\n/**\n * The complete prompt state for `input`. A forced prompt is opaque and lives in `content`\n * with no sections; otherwise `content` is empty and the structured sections carry the prompt.\n */\nexport function buildSystemPromptState(input: BuildSystemPromptOptions): {\n\tcontent: string;\n\tsections?: SystemPromptSections;\n} {\n\tif (input.forceSystemPrompt !== undefined) return { content: input.forceSystemPrompt };\n\treturn { content: \"\", sections: buildSystemPromptSections(input) };\n}\n\n/** Build the system prompt text, rendered exactly as the transcript's system message replays it. */\nexport function buildSystemPrompt(input: BuildSystemPromptOptions): string {\n\treturn getSystemMessageText({ role: \"system\", ...buildSystemPromptState(input), timestamp: 0 });\n}\n\n/**\n * Diff the sections the model currently has (replayed from the transcript, so never null)\n * against the desired ones. Returns a `SystemMessage.sections` patch, or undefined when\n * nothing changed.\n */\nexport function diffSystemPromptSections(\n\tprevious: Record<string, string | null>,\n\tcurrent: SystemPromptSections,\n): Record<string, string | null> | undefined {\n\tconst patch: Record<string, string | null> = {};\n\tfor (const [name, text] of Object.entries(current)) {\n\t\tif (previous[name] !== text) patch[name] = text;\n\t}\n\tfor (const name of Object.keys(previous)) {\n\t\tif (current[name] === undefined) patch[name] = null;\n\t}\n\treturn Object.keys(patch).length > 0 ? patch : undefined;\n}\n"]}
@@ -1,7 +1,19 @@
1
+ /**
2
+ * The one reader for persisted task snapshots: session `task-record` entries and
3
+ * `task-completion` message details share this format and these bounds. It also reads the
4
+ * usage settlement those entries carry for session totals.
5
+ */
6
+ import type { Usage } from "@earendil-works/pi-ai/compat";
7
+ import type { SessionEntry } from "../session-manager.ts";
1
8
  import { type TaskSnapshot } from "./types.ts";
2
9
  export declare const TASK_RECORD_TYPE = "task-record";
3
10
  /** Shared by `task-record` entries and `task-completion` details. */
4
11
  export declare const TASK_SNAPSHOT_VERSION = 3;
12
+ /** One task's usage settlement, as session totals account for it. */
13
+ export interface TaskUsageRecord {
14
+ taskId: string;
15
+ usage: Usage;
16
+ }
5
17
  /** Read persisted data properties only; never invoke getters or custom serialization. */
6
18
  export declare function plainObject(value: unknown): Record<string, unknown>;
7
19
  export declare function field(object: object, key: string): unknown;
@@ -9,4 +21,6 @@ export declare function field(object: object, key: string): unknown;
9
21
  export declare function readPersistedTask(value: unknown): TaskSnapshot | undefined;
10
22
  /** The task saved by a `task-record` entry or `task-completion` details. */
11
23
  export declare function readVersionedTask(value: unknown): TaskSnapshot | undefined;
24
+ /** The usage a `task-record` entry, or a released `task-usage` entry, settles for its task. */
25
+ export declare function readTaskUsage(entry: SessionEntry): TaskUsageRecord | undefined;
12
26
  //# sourceMappingURL=codec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/codec.ts"],"names":[],"mappings":"AAeA,OAAO,EAKN,KAAK,YAAY,EAGjB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKnE;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAI1D;AAmDD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAgD1E;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAO1E"}
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/codec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAY1D,OAAO,EAKN,KAAK,YAAY,EAGjB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAIvC,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACb;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKnE;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAI1D;AAmDD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAgD1E;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAO1E;AA+BD,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,CAkB9E"}
@@ -1,12 +1,10 @@
1
- /**
2
- * The one reader for persisted task snapshots: session `task-record` entries and
3
- * `task-completion` message details share this format and these bounds.
4
- */
5
1
  import { boundText, TASK_ERROR_BYTES, TASK_FACT_BYTES, TASK_FACTS, TASK_INPUT_BYTES, TASK_LABEL_BYTES, TASK_PATH_BYTES, TASK_RESULT_BYTES, TASK_TITLE_BYTES, } from "./output.js";
6
2
  import { isTaskTerminal, TASK_KIND_PATTERN, } from "./types.js";
7
3
  export const TASK_RECORD_TYPE = "task-record";
8
4
  /** Shared by `task-record` entries and `task-completion` details. */
9
5
  export const TASK_SNAPSHOT_VERSION = 3;
6
+ /** Released sessions settled usage in separate entries; their billing still counts. */
7
+ const LEGACY_TASK_USAGE_TYPE = "task-usage";
10
8
  /** Read persisted data properties only; never invoke getters or custom serialization. */
11
9
  export function plainObject(value) {
12
10
  if (value === null || typeof value !== "object" || Array.isArray(value))
@@ -136,4 +134,59 @@ export function readVersionedTask(value) {
136
134
  return undefined;
137
135
  }
138
136
  }
137
+ function usageValue(value) {
138
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
139
+ throw new Error("Expected usage value");
140
+ return value;
141
+ }
142
+ /** Only the serializable accounting fields, so a settlement never carries provider extras into totals. */
143
+ function taskUsage(value) {
144
+ const source = plainObject(value);
145
+ const cost = plainObject(field(source, "cost"));
146
+ const reasoning = optional(source, "reasoning", usageValue);
147
+ const cacheWrite1h = optional(source, "cacheWrite1h", usageValue);
148
+ return {
149
+ input: usageValue(field(source, "input")),
150
+ output: usageValue(field(source, "output")),
151
+ cacheRead: usageValue(field(source, "cacheRead")),
152
+ cacheWrite: usageValue(field(source, "cacheWrite")),
153
+ totalTokens: usageValue(field(source, "totalTokens")),
154
+ ...(reasoning === undefined ? {} : { reasoning }),
155
+ ...(cacheWrite1h === undefined ? {} : { cacheWrite1h }),
156
+ cost: {
157
+ input: usageValue(field(cost, "input")),
158
+ output: usageValue(field(cost, "output")),
159
+ cacheRead: usageValue(field(cost, "cacheRead")),
160
+ cacheWrite: usageValue(field(cost, "cacheWrite")),
161
+ total: usageValue(field(cost, "total")),
162
+ },
163
+ };
164
+ }
165
+ /** The usage a `task-record` entry, or a released `task-usage` entry, settles for its task. */
166
+ export function readTaskUsage(entry) {
167
+ if (entry.type !== "custom")
168
+ return undefined;
169
+ if (entry.customType !== TASK_RECORD_TYPE && entry.customType !== LEGACY_TASK_USAGE_TYPE)
170
+ return undefined;
171
+ try {
172
+ const data = plainObject(entry.data);
173
+ let taskId;
174
+ if (entry.customType === TASK_RECORD_TYPE) {
175
+ if (field(data, "version") !== TASK_SNAPSHOT_VERSION)
176
+ return undefined;
177
+ taskId = field(plainObject(field(data, "task")), "id");
178
+ }
179
+ else {
180
+ if (field(data, "version") !== 1)
181
+ return undefined;
182
+ taskId = field(data, "taskId");
183
+ }
184
+ if (typeof taskId !== "string" || !taskId.trim())
185
+ return undefined;
186
+ return { taskId, usage: taskUsage(field(data, "usage")) };
187
+ }
188
+ catch {
189
+ return undefined;
190
+ }
191
+ }
139
192
  //# sourceMappingURL=codec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/core/tasks/codec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The one reader for persisted task snapshots: session `task-record` entries and\n * `task-completion` message details share this format and these bounds.\n */\nimport {\n\tboundText,\n\tTASK_ERROR_BYTES,\n\tTASK_FACT_BYTES,\n\tTASK_FACTS,\n\tTASK_INPUT_BYTES,\n\tTASK_LABEL_BYTES,\n\tTASK_PATH_BYTES,\n\tTASK_RESULT_BYTES,\n\tTASK_TITLE_BYTES,\n} from \"./output.ts\";\nimport {\n\tisTaskTerminal,\n\tTASK_KIND_PATTERN,\n\ttype TaskFact,\n\ttype TaskInput,\n\ttype TaskSnapshot,\n\ttype TaskStatus,\n\ttype TaskText,\n} from \"./types.ts\";\n\nexport const TASK_RECORD_TYPE = \"task-record\";\n/** Shared by `task-record` entries and `task-completion` details. */\nexport const TASK_SNAPSHOT_VERSION = 3;\n\n/** Read persisted data properties only; never invoke getters or custom serialization. */\nexport function plainObject(value: unknown): Record<string, unknown> {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain object\");\n\treturn value as Record<string, unknown>;\n}\n\nexport function field(object: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected accessor\");\n\treturn descriptor?.value;\n}\n\nfunction text(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected string\");\n\treturn boundText(value, bytes);\n}\n\n/** Identities and paths are never clipped: a shortened value would name something else. */\nfunction exact(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\" || !value || Buffer.byteLength(value) > bytes || value.includes(\"\\0\"))\n\t\tthrow new Error(\"Invalid identity or path\");\n\treturn value;\n}\n\nfunction optional<T>(source: object, key: string, read: (value: unknown) => T): T | undefined {\n\tconst value = field(source, key);\n\treturn value === undefined ? undefined : read(value);\n}\n\nfunction taskText(value: unknown, bytes: number): TaskText {\n\tconst source = plainObject(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 = text(original, bytes);\n\treturn { text: bounded, truncated: truncated || bounded !== original };\n}\n\nfunction taskInput(value: unknown): TaskInput {\n\tconst source = plainObject(value);\n\tconst language = optional(source, \"language\", (item) => text(item, 64));\n\treturn {\n\t\tlabel: text(field(source, \"label\"), TASK_LABEL_BYTES),\n\t\t...taskText(source, TASK_INPUT_BYTES),\n\t\t...(language ? { language } : {}),\n\t};\n}\n\nfunction taskFacts(value: unknown): TaskFact[] {\n\tif (!Array.isArray(value)) throw new Error(\"Expected facts\");\n\treturn value.slice(0, TASK_FACTS).map((row): TaskFact => {\n\t\tif (!Array.isArray(row) || row.length !== 2) throw new Error(\"Expected fact\");\n\t\treturn [text(row[0], TASK_LABEL_BYTES), text(row[1], TASK_FACT_BYTES)];\n\t});\n}\n\nfunction timestamp(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) throw new Error(\"Expected time\");\n\treturn value;\n}\n\n/** A bounded terminal snapshot, or undefined for any other shape or version. */\nexport function readPersistedTask(value: unknown): TaskSnapshot | undefined {\n\ttry {\n\t\tconst source = plainObject(value);\n\t\tconst kind = field(source, \"kind\");\n\t\tconst mode = field(source, \"mode\");\n\t\tconst status = field(source, \"status\") as TaskStatus;\n\t\tconst output = field(source, \"output\");\n\t\tif (typeof kind !== \"string\" || !TASK_KIND_PATTERN.test(kind)) return undefined;\n\t\tif (mode !== \"foreground\" && mode !== \"background\") return undefined;\n\t\tif (output !== \"log\" && output !== \"report\") return undefined;\n\t\tif (typeof status !== \"string\" || !isTaskTerminal(status)) return undefined;\n\t\tconst startedAt = timestamp(field(source, \"startedAt\"));\n\t\tconst endedAt = timestamp(field(source, \"endedAt\"));\n\t\tif (endedAt < startedAt) return undefined;\n\t\tconst id = exact(field(source, \"id\"), 512);\n\t\tif (!id.startsWith(`${kind}-`) || id.length <= kind.length + 1) return undefined;\n\t\tconst anchor = field(source, \"anchorId\");\n\t\tconst task: TaskSnapshot = {\n\t\t\tid,\n\t\t\tkind,\n\t\t\tlabel: text(field(source, \"label\"), TASK_LABEL_BYTES),\n\t\t\ttitle: text(field(source, \"title\"), TASK_TITLE_BYTES),\n\t\t\toutput,\n\t\t\ttoolCallId: exact(field(source, \"toolCallId\"), 512),\n\t\t\tanchorId: anchor === null ? null : exact(anchor, 8192),\n\t\t\tmode,\n\t\t\tstatus,\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t};\n\t\tconst input = optional(source, \"input\", taskInput);\n\t\tconst facts = optional(source, \"facts\", taskFacts);\n\t\tconst outputPath = optional(source, \"outputPath\", (item) => exact(item, TASK_PATH_BYTES));\n\t\tconst result = optional(source, \"result\", (item) => taskText(item, TASK_RESULT_BYTES));\n\t\tconst display = optional(source, \"display\", (item) => taskText(item, TASK_RESULT_BYTES));\n\t\tconst error = optional(source, \"error\", (item) => text(item, TASK_ERROR_BYTES));\n\t\treturn {\n\t\t\t...task,\n\t\t\t...(input ? { input } : {}),\n\t\t\t...(facts ? { facts } : {}),\n\t\t\t...(outputPath ? { outputPath } : {}),\n\t\t\t...(result ? { result } : {}),\n\t\t\t...(display ? { display } : {}),\n\t\t\t...(error !== undefined ? { error } : {}),\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** The task saved by a `task-record` entry or `task-completion` details. */\nexport function readVersionedTask(value: unknown): TaskSnapshot | undefined {\n\ttry {\n\t\tconst source = plainObject(value);\n\t\treturn field(source, \"version\") === TASK_SNAPSHOT_VERSION ? readPersistedTask(field(source, \"task\")) : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/core/tasks/codec.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The one reader for persisted task snapshots: session `task-record` entries and\n * `task-completion` message details share this format and these bounds. It also reads the\n * usage settlement those entries carry for session totals.\n */\nimport type { Usage } from \"@earendil-works/pi-ai/compat\";\nimport type { SessionEntry } from \"../session-manager.ts\";\nimport {\n\tboundText,\n\tTASK_ERROR_BYTES,\n\tTASK_FACT_BYTES,\n\tTASK_FACTS,\n\tTASK_INPUT_BYTES,\n\tTASK_LABEL_BYTES,\n\tTASK_PATH_BYTES,\n\tTASK_RESULT_BYTES,\n\tTASK_TITLE_BYTES,\n} from \"./output.ts\";\nimport {\n\tisTaskTerminal,\n\tTASK_KIND_PATTERN,\n\ttype TaskFact,\n\ttype TaskInput,\n\ttype TaskSnapshot,\n\ttype TaskStatus,\n\ttype TaskText,\n} from \"./types.ts\";\n\nexport const TASK_RECORD_TYPE = \"task-record\";\n/** Shared by `task-record` entries and `task-completion` details. */\nexport const TASK_SNAPSHOT_VERSION = 3;\n/** Released sessions settled usage in separate entries; their billing still counts. */\nconst LEGACY_TASK_USAGE_TYPE = \"task-usage\";\n\n/** One task's usage settlement, as session totals account for it. */\nexport interface TaskUsageRecord {\n\ttaskId: string;\n\tusage: Usage;\n}\n\n/** Read persisted data properties only; never invoke getters or custom serialization. */\nexport function plainObject(value: unknown): Record<string, unknown> {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"Expected object\");\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) throw new Error(\"Expected plain object\");\n\treturn value as Record<string, unknown>;\n}\n\nexport function field(object: object, key: string): unknown {\n\tconst descriptor = Object.getOwnPropertyDescriptor(object, key);\n\tif (descriptor && !(\"value\" in descriptor)) throw new Error(\"Unexpected accessor\");\n\treturn descriptor?.value;\n}\n\nfunction text(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected string\");\n\treturn boundText(value, bytes);\n}\n\n/** Identities and paths are never clipped: a shortened value would name something else. */\nfunction exact(value: unknown, bytes: number): string {\n\tif (typeof value !== \"string\" || !value || Buffer.byteLength(value) > bytes || value.includes(\"\\0\"))\n\t\tthrow new Error(\"Invalid identity or path\");\n\treturn value;\n}\n\nfunction optional<T>(source: object, key: string, read: (value: unknown) => T): T | undefined {\n\tconst value = field(source, key);\n\treturn value === undefined ? undefined : read(value);\n}\n\nfunction taskText(value: unknown, bytes: number): TaskText {\n\tconst source = plainObject(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 = text(original, bytes);\n\treturn { text: bounded, truncated: truncated || bounded !== original };\n}\n\nfunction taskInput(value: unknown): TaskInput {\n\tconst source = plainObject(value);\n\tconst language = optional(source, \"language\", (item) => text(item, 64));\n\treturn {\n\t\tlabel: text(field(source, \"label\"), TASK_LABEL_BYTES),\n\t\t...taskText(source, TASK_INPUT_BYTES),\n\t\t...(language ? { language } : {}),\n\t};\n}\n\nfunction taskFacts(value: unknown): TaskFact[] {\n\tif (!Array.isArray(value)) throw new Error(\"Expected facts\");\n\treturn value.slice(0, TASK_FACTS).map((row): TaskFact => {\n\t\tif (!Array.isArray(row) || row.length !== 2) throw new Error(\"Expected fact\");\n\t\treturn [text(row[0], TASK_LABEL_BYTES), text(row[1], TASK_FACT_BYTES)];\n\t});\n}\n\nfunction timestamp(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0) throw new Error(\"Expected time\");\n\treturn value;\n}\n\n/** A bounded terminal snapshot, or undefined for any other shape or version. */\nexport function readPersistedTask(value: unknown): TaskSnapshot | undefined {\n\ttry {\n\t\tconst source = plainObject(value);\n\t\tconst kind = field(source, \"kind\");\n\t\tconst mode = field(source, \"mode\");\n\t\tconst status = field(source, \"status\") as TaskStatus;\n\t\tconst output = field(source, \"output\");\n\t\tif (typeof kind !== \"string\" || !TASK_KIND_PATTERN.test(kind)) return undefined;\n\t\tif (mode !== \"foreground\" && mode !== \"background\") return undefined;\n\t\tif (output !== \"log\" && output !== \"report\") return undefined;\n\t\tif (typeof status !== \"string\" || !isTaskTerminal(status)) return undefined;\n\t\tconst startedAt = timestamp(field(source, \"startedAt\"));\n\t\tconst endedAt = timestamp(field(source, \"endedAt\"));\n\t\tif (endedAt < startedAt) return undefined;\n\t\tconst id = exact(field(source, \"id\"), 512);\n\t\tif (!id.startsWith(`${kind}-`) || id.length <= kind.length + 1) return undefined;\n\t\tconst anchor = field(source, \"anchorId\");\n\t\tconst task: TaskSnapshot = {\n\t\t\tid,\n\t\t\tkind,\n\t\t\tlabel: text(field(source, \"label\"), TASK_LABEL_BYTES),\n\t\t\ttitle: text(field(source, \"title\"), TASK_TITLE_BYTES),\n\t\t\toutput,\n\t\t\ttoolCallId: exact(field(source, \"toolCallId\"), 512),\n\t\t\tanchorId: anchor === null ? null : exact(anchor, 8192),\n\t\t\tmode,\n\t\t\tstatus,\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t};\n\t\tconst input = optional(source, \"input\", taskInput);\n\t\tconst facts = optional(source, \"facts\", taskFacts);\n\t\tconst outputPath = optional(source, \"outputPath\", (item) => exact(item, TASK_PATH_BYTES));\n\t\tconst result = optional(source, \"result\", (item) => taskText(item, TASK_RESULT_BYTES));\n\t\tconst display = optional(source, \"display\", (item) => taskText(item, TASK_RESULT_BYTES));\n\t\tconst error = optional(source, \"error\", (item) => text(item, TASK_ERROR_BYTES));\n\t\treturn {\n\t\t\t...task,\n\t\t\t...(input ? { input } : {}),\n\t\t\t...(facts ? { facts } : {}),\n\t\t\t...(outputPath ? { outputPath } : {}),\n\t\t\t...(result ? { result } : {}),\n\t\t\t...(display ? { display } : {}),\n\t\t\t...(error !== undefined ? { error } : {}),\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** The task saved by a `task-record` entry or `task-completion` details. */\nexport function readVersionedTask(value: unknown): TaskSnapshot | undefined {\n\ttry {\n\t\tconst source = plainObject(value);\n\t\treturn field(source, \"version\") === TASK_SNAPSHOT_VERSION ? readPersistedTask(field(source, \"task\")) : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction usageValue(value: unknown): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) throw new Error(\"Expected usage value\");\n\treturn value;\n}\n\n/** Only the serializable accounting fields, so a settlement never carries provider extras into totals. */\nfunction taskUsage(value: unknown): Usage {\n\tconst source = plainObject(value);\n\tconst cost = plainObject(field(source, \"cost\"));\n\tconst reasoning = optional(source, \"reasoning\", usageValue);\n\tconst cacheWrite1h = optional(source, \"cacheWrite1h\", usageValue);\n\treturn {\n\t\tinput: usageValue(field(source, \"input\")),\n\t\toutput: usageValue(field(source, \"output\")),\n\t\tcacheRead: usageValue(field(source, \"cacheRead\")),\n\t\tcacheWrite: usageValue(field(source, \"cacheWrite\")),\n\t\ttotalTokens: usageValue(field(source, \"totalTokens\")),\n\t\t...(reasoning === undefined ? {} : { reasoning }),\n\t\t...(cacheWrite1h === undefined ? {} : { cacheWrite1h }),\n\t\tcost: {\n\t\t\tinput: usageValue(field(cost, \"input\")),\n\t\t\toutput: usageValue(field(cost, \"output\")),\n\t\t\tcacheRead: usageValue(field(cost, \"cacheRead\")),\n\t\t\tcacheWrite: usageValue(field(cost, \"cacheWrite\")),\n\t\t\ttotal: usageValue(field(cost, \"total\")),\n\t\t},\n\t};\n}\n\n/** The usage a `task-record` entry, or a released `task-usage` entry, settles for its task. */\nexport function readTaskUsage(entry: SessionEntry): TaskUsageRecord | undefined {\n\tif (entry.type !== \"custom\") return undefined;\n\tif (entry.customType !== TASK_RECORD_TYPE && entry.customType !== LEGACY_TASK_USAGE_TYPE) return undefined;\n\ttry {\n\t\tconst data = plainObject(entry.data);\n\t\tlet taskId: unknown;\n\t\tif (entry.customType === TASK_RECORD_TYPE) {\n\t\t\tif (field(data, \"version\") !== TASK_SNAPSHOT_VERSION) return undefined;\n\t\t\ttaskId = field(plainObject(field(data, \"task\")), \"id\");\n\t\t} else {\n\t\t\tif (field(data, \"version\") !== 1) return undefined;\n\t\t\ttaskId = field(data, \"taskId\");\n\t\t}\n\t\tif (typeof taskId !== \"string\" || !taskId.trim()) return undefined;\n\t\treturn { taskId, usage: taskUsage(field(data, \"usage\")) };\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
@@ -11,7 +11,7 @@ export interface TaskDeliveryOptions {
11
11
  }
12
12
  /**
13
13
  * Sole owner of "has this completion reached the model": the pending queue, claims, the in-flight
14
- * completion, failures, pauses, wait receipts and observation holds. An undelivered completion is
14
+ * completion, failures and pauses. An undelivered completion is
15
15
  * a retention lease on its task, so the runtime keeps the record and its output exactly as long
16
16
  * as delivery needs them, and a bare runtime carries no delivery concept at all.
17
17
  */
@@ -23,10 +23,7 @@ export declare class TaskDelivery {
23
23
  private delivery?;
24
24
  /** Settlement order. */
25
25
  private readonly completions;
26
- /** Task IDs under an observation hold or wait receipt, with the number of holders. */
27
- private readonly holds;
28
26
  private readonly failures;
29
- private readonly waits;
30
27
  private readonly listeners;
31
28
  constructor(options: TaskDeliveryOptions);
32
29
  private get service();
@@ -37,8 +34,7 @@ export declare class TaskDelivery {
37
34
  /**
38
35
  * Whether a completion is in flight or will be delivered without further input: queued on the
39
36
  * current runtime, visible on the branch and not failed. A failed delivery only retries on the
40
- * next input, so it does not count. Held completions count: releasing the hold, or the
41
- * acknowledgement that replaces it, always follows.
37
+ * next input, so it does not count.
42
38
  */
43
39
  hasDeliverableWork(): boolean;
44
40
  /** Nestable across asynchronous preflight and service replacement. */
@@ -51,13 +47,8 @@ export declare class TaskDelivery {
51
47
  /** Release every lease held for a runtime that closed or was replaced, so its output cleanup can run. */
52
48
  discard(service: TaskDeliveryService): void;
53
49
  /**
54
- * Keep `taskIds` out of automatic delivery until the release runs. Holds may precede
55
- * settlement, and releasing one re-evaluates the queue.
56
- */
57
- hold(taskIds: readonly string[]): () => void;
58
- /**
59
- * Completions that would be delivered next, oldest launch first: on the visible branch, not
60
- * claimed and not held. Failed deliveries stay listed until the next retry.
50
+ * Completions that would be delivered next, oldest launch first: on the visible branch and not
51
+ * claimed. Failed deliveries stay listed until the next retry.
61
52
  */
62
53
  pending(): TaskSnapshot[];
63
54
  schedule(): void;
@@ -70,13 +61,6 @@ export declare class TaskDelivery {
70
61
  queueCleared(): void;
71
62
  /** Acknowledge only successful appends, using identity even when metadata was rewritten. */
72
63
  messagePersisted(message: AgentMessage): void;
73
- /**
74
- * A wait observed a settled background task. Its observation hold is still in place; take over
75
- * the hold until the wait's tool result is persisted, then acknowledge it instead of notifying.
76
- */
77
- bindWait(toolCallId: string, taskId: string): void;
78
- private acknowledgeWait;
79
- private releaseWaits;
80
64
  dispose(): void;
81
65
  }
82
66
  //# sourceMappingURL=delivery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7D,6FAA6F;AAC7F,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;AAE/F,MAAM,WAAW,mBAAmB;IACnC,OAAO,IAAI,mBAAmB,CAAC;IAC/B,UAAU,IAAI,OAAO,CAAC;IACtB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAmBD;;;;;GAKG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,wBAAwB;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA6B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0D;IAChF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;gBACvC,OAAO,EAAE,mBAAmB;IAGxC,OAAO,KAAK,OAAO,GAElB;IACD,OAAO,CAAC,IAAI;IAGZ,0EAA0E;IAC1E,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAO3C,OAAO,CAAC,OAAO;IAUf;;;;;OAKG;IACH,kBAAkB,IAAI,OAAO;IAY7B,sEAAsE;IACtE,KAAK,IAAI,MAAM,IAAI;IAWnB,KAAK,IAAI,IAAI;IAMb,oGAAoG;IACpG,OAAO,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAO3D,yGAAyG;IACzG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQjC,yGAAyG;IACzG,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAS3C;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,IAAI;IAiB5C;;;OAGG;IACH,OAAO,IAAI,YAAY,EAAE;IASzB,QAAQ,IAAI,IAAI;IAWhB,OAAO,CAAC,UAAU;YAMJ,KAAK;IAiDnB,mFAAmF;IACnF,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAK3C,gFAAgF;IAChF,UAAU,IAAI,IAAI;IAQlB,YAAY,IAAI,IAAI;IAIpB,4FAA4F;IAC5F,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAU7C;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAKlD,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;IAKpB,OAAO,IAAI,IAAI;CAWf"}
1
+ {"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/delivery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE7D,6FAA6F;AAC7F,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;AAE/F,MAAM,WAAW,mBAAmB;IACnC,OAAO,IAAI,mBAAmB,CAAC;IAC/B,UAAU,IAAI,OAAO,CAAC;IACtB,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3C;AAmBD;;;;;GAKG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,QAAQ,CAAC,CAAW;IAC5B,wBAAwB;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;gBACvC,OAAO,EAAE,mBAAmB;IAGxC,OAAO,KAAK,OAAO,GAElB;IACD,OAAO,CAAC,IAAI;IAGZ,0EAA0E;IAC1E,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAO3C,OAAO,CAAC,OAAO;IAUf;;;;OAIG;IACH,kBAAkB,IAAI,OAAO;IAY7B,sEAAsE;IACtE,KAAK,IAAI,MAAM,IAAI;IAWnB,KAAK,IAAI,IAAI;IAMb,oGAAoG;IACpG,OAAO,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAO3D,yGAAyG;IACzG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQjC,yGAAyG;IACzG,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAS3C;;;OAGG;IACH,OAAO,IAAI,YAAY,EAAE;IASzB,QAAQ,IAAI,IAAI;IAWhB,OAAO,CAAC,UAAU;YAMJ,KAAK;IAiDnB,mFAAmF;IACnF,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAK3C,gFAAgF;IAChF,UAAU,IAAI,IAAI;IAOlB,YAAY,IAAI,IAAI;IAIpB,4FAA4F;IAC5F,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAS7C,OAAO,IAAI,IAAI;CAUf"}
@@ -1,7 +1,7 @@
1
1
  import { taskCompletionMessage } from "./presentation.js";
2
2
  /**
3
3
  * Sole owner of "has this completion reached the model": the pending queue, claims, the in-flight
4
- * completion, failures, pauses, wait receipts and observation holds. An undelivered completion is
4
+ * completion, failures and pauses. An undelivered completion is
5
5
  * a retention lease on its task, so the runtime keeps the record and its output exactly as long
6
6
  * as delivery needs them, and a bare runtime carries no delivery concept at all.
7
7
  */
@@ -11,10 +11,7 @@ export class TaskDelivery {
11
11
  this.pauses = 0;
12
12
  /** Settlement order. */
13
13
  this.completions = new Map();
14
- /** Task IDs under an observation hold or wait receipt, with the number of holders. */
15
- this.holds = new Map();
16
14
  this.failures = new Set();
17
- this.waits = new Map();
18
15
  this.listeners = new Set();
19
16
  this.options = options;
20
17
  }
@@ -44,8 +41,7 @@ export class TaskDelivery {
44
41
  /**
45
42
  * Whether a completion is in flight or will be delivered without further input: queued on the
46
43
  * current runtime, visible on the branch and not failed. A failed delivery only retries on the
47
- * next input, so it does not count. Held completions count: releasing the hold, or the
48
- * acknowledgement that replaces it, always follows.
44
+ * next input, so it does not count.
49
45
  */
50
46
  hasDeliverableWork() {
51
47
  if (this.disposed)
@@ -107,32 +103,8 @@ export class TaskDelivery {
107
103
  this.changed();
108
104
  }
109
105
  /**
110
- * Keep `taskIds` out of automatic delivery until the release runs. Holds may precede
111
- * settlement, and releasing one re-evaluates the queue.
112
- */
113
- hold(taskIds) {
114
- const ids = [...taskIds];
115
- for (const id of ids)
116
- this.holds.set(id, (this.holds.get(id) ?? 0) + 1);
117
- let released = false;
118
- return () => {
119
- if (released)
120
- return;
121
- released = true;
122
- for (const id of ids) {
123
- const count = (this.holds.get(id) ?? 1) - 1;
124
- if (count > 0)
125
- this.holds.set(id, count);
126
- else
127
- this.holds.delete(id);
128
- }
129
- this.schedule();
130
- this.changed();
131
- };
132
- }
133
- /**
134
- * Completions that would be delivered next, oldest launch first: on the visible branch, not
135
- * claimed and not held. Failed deliveries stay listed until the next retry.
106
+ * Completions that would be delivered next, oldest launch first: on the visible branch and not
107
+ * claimed. Failed deliveries stay listed until the next retry.
136
108
  */
137
109
  pending() {
138
110
  const service = this.service;
@@ -140,7 +112,7 @@ export class TaskDelivery {
140
112
  return [];
141
113
  return service.list().filter((task) => {
142
114
  const completion = this.completions.get(task.id);
143
- return completion?.service === service && !completion.claimed && !this.holds.has(task.id);
115
+ return completion?.service === service && !completion.claimed;
144
116
  });
145
117
  }
146
118
  schedule() {
@@ -213,7 +185,6 @@ export class TaskDelivery {
213
185
  }
214
186
  /** A queued message that was never emitted remains claimed for the next run. */
215
187
  agentEnded() {
216
- this.releaseWaits();
217
188
  const delivery = this.delivery;
218
189
  if (delivery?.phase === "started") {
219
190
  delivery.queued?.reject(new Error("the completion message was not persisted"));
@@ -230,33 +201,9 @@ export class TaskDelivery {
230
201
  this.acknowledge(delivery.id);
231
202
  delivery.queued?.resolve();
232
203
  }
233
- if (message.role === "toolResult")
234
- this.acknowledgeWait(message.toolCallId);
235
- }
236
- /**
237
- * A wait observed a settled background task. Its observation hold is still in place; take over
238
- * the hold until the wait's tool result is persisted, then acknowledge it instead of notifying.
239
- */
240
- bindWait(toolCallId, taskId) {
241
- this.waits.get(toolCallId)?.release();
242
- this.waits.set(toolCallId, { taskId, release: this.hold([taskId]) });
243
- }
244
- acknowledgeWait(toolCallId) {
245
- const receipt = this.waits.get(toolCallId);
246
- if (!receipt)
247
- return;
248
- this.waits.delete(toolCallId);
249
- this.acknowledge(receipt.taskId);
250
- receipt.release();
251
- }
252
- releaseWaits() {
253
- for (const receipt of this.waits.values())
254
- receipt.release();
255
- this.waits.clear();
256
204
  }
257
205
  dispose() {
258
206
  this.disposed = true;
259
- this.releaseWaits();
260
207
  for (const completion of this.completions.values())
261
208
  completion.release();
262
209
  this.completions.clear();
@@ -1 +1 @@
1
- {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/core/tasks/delivery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport { taskCompletionMessage } from \"./presentation.ts\";\nimport type { TaskSnapshot, TasksContext } from \"./types.ts\";\n\n/** All the delivery policy needs from a runtime: its public, session-independent surface. */\nexport type TaskDeliveryService = Pick<TasksContext, \"enabled\" | \"closed\" | \"list\" | \"retain\">;\n\nexport interface TaskDeliveryOptions {\n\tservice(): TaskDeliveryService;\n\tcanDeliver(): boolean;\n\tdeliver(message: CustomMessage, waitForPersistence: () => Promise<void>): Promise<void>;\n\twarn(event: string, message: string): void;\n}\n\n/** A settled handoff the model has not yet seen, kept retained by a lease until it has. */\ninterface Completion {\n\tservice: TaskDeliveryService;\n\t/** The retention lease: the record and its output stay available until delivery or acknowledgement. */\n\trelease(): void;\n\t/** Handed to the host and awaiting persistence. */\n\tclaimed: boolean;\n}\n\ninterface Delivery {\n\tid: string;\n\t/** Agent-core preserves message identity; extension rewrites mutate it in place. */\n\tmessage: CustomMessage;\n\tphase: \"pending\" | \"started\" | \"persisted\";\n\tqueued?: { resolve(): void; reject(reason: Error): void };\n}\n\n/**\n * Sole owner of \"has this completion reached the model\": the pending queue, claims, the in-flight\n * completion, failures, pauses, wait receipts and observation holds. An undelivered completion is\n * a retention lease on its task, so the runtime keeps the record and its output exactly as long\n * as delivery needs them, and a bare runtime carries no delivery concept at all.\n */\nexport class TaskDelivery {\n\tprivate readonly options: TaskDeliveryOptions;\n\tprivate disposed = false;\n\tprivate pauses = 0;\n\tprivate timer?: ReturnType<typeof setTimeout>;\n\tprivate delivery?: Delivery;\n\t/** Settlement order. */\n\tprivate readonly completions = new Map<string, Completion>();\n\t/** Task IDs under an observation hold or wait receipt, with the number of holders. */\n\tprivate readonly holds = new Map<string, number>();\n\tprivate readonly failures = new Set<string>();\n\tprivate readonly waits = new Map<string, { taskId: string; release(): void }>();\n\tprivate readonly listeners = new Set<() => void>();\n\tconstructor(options: TaskDeliveryOptions) {\n\t\tthis.options = options;\n\t}\n\tprivate get service(): TaskDeliveryService {\n\t\treturn this.options.service();\n\t}\n\tprivate warn(event: string, message: string): void {\n\t\tthis.options.warn(event, message);\n\t}\n\t/** Called whenever what `hasDeliverableWork()` reads may have changed. */\n\tsubscribe(listener: () => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\tprivate changed(): void {\n\t\tfor (const listener of [...this.listeners]) {\n\t\t\ttry {\n\t\t\t\tlistener();\n\t\t\t} catch {\n\t\t\t\t// Observers cannot interrupt delivery.\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Whether a completion is in flight or will be delivered without further input: queued on the\n\t * current runtime, visible on the branch and not failed. A failed delivery only retries on the\n\t * next input, so it does not count. Held completions count: releasing the hold, or the\n\t * acknowledgement that replaces it, always follows.\n\t */\n\thasDeliverableWork(): boolean {\n\t\tif (this.disposed) return false;\n\t\tconst service = this.service;\n\t\tif (service.closed) return false;\n\t\tif (this.delivery) return true;\n\t\tif (!service.enabled || this.completions.size === 0) return false;\n\t\treturn service.list().some((task) => {\n\t\t\tconst completion = this.completions.get(task.id);\n\t\t\treturn completion?.service === service && !this.failures.has(task.id);\n\t\t});\n\t}\n\n\t/** Nestable across asynchronous preflight and service replacement. */\n\tpause(): () => void {\n\t\tthis.pauses++;\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tthis.pauses--;\n\t\t\tthis.schedule();\n\t\t};\n\t}\n\n\tretry(): void {\n\t\tthis.failures.clear();\n\t\tthis.schedule();\n\t\tthis.changed();\n\t}\n\n\t/** A handed-off task settled on `service`; it awaits automatic delivery under a retention lease. */\n\tenqueue(service: TaskDeliveryService, taskId: string): void {\n\t\tif (this.disposed || service.closed || this.completions.has(taskId)) return;\n\t\tthis.completions.set(taskId, { service, release: service.retain(taskId), claimed: false });\n\t\tthis.schedule();\n\t\tthis.changed();\n\t}\n\n\t/** The model has the result (or the host consumed it): stop waiting to deliver and release the lease. */\n\tacknowledge(taskId: string): void {\n\t\tconst completion = this.completions.get(taskId);\n\t\tif (!completion) return;\n\t\tthis.completions.delete(taskId);\n\t\tcompletion.release();\n\t\tthis.changed();\n\t}\n\n\t/** Release every lease held for a runtime that closed or was replaced, so its output cleanup can run. */\n\tdiscard(service: TaskDeliveryService): void {\n\t\tfor (const [id, completion] of [...this.completions]) {\n\t\t\tif (completion.service !== service) continue;\n\t\t\tthis.completions.delete(id);\n\t\t\tcompletion.release();\n\t\t}\n\t\tthis.changed();\n\t}\n\n\t/**\n\t * Keep `taskIds` out of automatic delivery until the release runs. Holds may precede\n\t * settlement, and releasing one re-evaluates the queue.\n\t */\n\thold(taskIds: readonly string[]): () => void {\n\t\tconst ids = [...taskIds];\n\t\tfor (const id of ids) this.holds.set(id, (this.holds.get(id) ?? 0) + 1);\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tfor (const id of ids) {\n\t\t\t\tconst count = (this.holds.get(id) ?? 1) - 1;\n\t\t\t\tif (count > 0) this.holds.set(id, count);\n\t\t\t\telse this.holds.delete(id);\n\t\t\t}\n\t\t\tthis.schedule();\n\t\t\tthis.changed();\n\t\t};\n\t}\n\n\t/**\n\t * Completions that would be delivered next, oldest launch first: on the visible branch, not\n\t * claimed and not held. Failed deliveries stay listed until the next retry.\n\t */\n\tpending(): TaskSnapshot[] {\n\t\tconst service = this.service;\n\t\tif (service.closed) return [];\n\t\treturn service.list().filter((task) => {\n\t\t\tconst completion = this.completions.get(task.id);\n\t\t\treturn completion?.service === service && !completion.claimed && !this.holds.has(task.id);\n\t\t});\n\t}\n\n\tschedule(): void {\n\t\tif (this.disposed || this.timer || this.delivery) return;\n\t\tthis.timer = setTimeout(() => {\n\t\t\tthis.timer = undefined;\n\t\t\tvoid this.drain().catch(() =>\n\t\t\t\tthis.warn(\"task_delivery\", \"Background notification drain failed; delivery was not confirmed.\"),\n\t\t\t);\n\t\t}, 0);\n\t\tthis.timer.unref?.();\n\t}\n\n\tprivate canDeliver(service: TaskDeliveryService): boolean {\n\t\treturn (\n\t\t\t!this.disposed && service === this.service && service.enabled && this.pauses === 0 && this.options.canDeliver()\n\t\t);\n\t}\n\n\tprivate async drain(): Promise<void> {\n\t\tconst service = this.service;\n\t\tif (this.delivery || !this.canDeliver(service)) return;\n\t\tif (this.failures.size) {\n\t\t\tconst retained = new Set(service.list().map((task) => task.id));\n\t\t\tfor (const id of this.failures) if (!retained.has(id)) this.failures.delete(id);\n\t\t}\n\t\tconst task = this.pending().find((task) => !this.failures.has(task.id));\n\t\tif (!task) return;\n\t\tconst completion = this.completions.get(task.id)!;\n\t\tconst message = taskCompletionMessage(task);\n\t\tcompletion.claimed = true;\n\t\t// Exactly one completion may be in flight, whether queued for steering or running its\n\t\t// own turn; there is no separate claim registry.\n\t\tconst delivery: Delivery = {\n\t\t\tid: task.id,\n\t\t\tmessage,\n\t\t\tphase: \"pending\",\n\t\t};\n\t\tthis.delivery = delivery;\n\t\tlet deliveryError: unknown;\n\t\ttry {\n\t\t\tawait this.options.deliver(\n\t\t\t\tdelivery.message,\n\t\t\t\t() =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\tif (delivery.phase === \"persisted\") resolve();\n\t\t\t\t\t\telse delivery.queued = { resolve, reject };\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tdeliveryError = error;\n\t\t} finally {\n\t\t\tif (delivery.phase !== \"persisted\") {\n\t\t\t\tcompletion.claimed = false;\n\t\t\t\tif (service === this.service) this.failures.add(task.id);\n\t\t\t\tconst reason = deliveryError instanceof Error ? `: ${deliveryError.message}` : \"\";\n\t\t\t\tthis.warn(\n\t\t\t\t\t\"task_delivery\",\n\t\t\t\t\t`Background completion delivery failed for ${task.id}${reason}; it will retry on the next input.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.delivery = undefined;\n\t\t\tif (this.canDeliver(this.service) && this.pending().some((task) => !this.failures.has(task.id)))\n\t\t\t\tthis.schedule();\n\t\t\tthis.changed();\n\t\t}\n\t}\n\n\t/** Record dequeueing before message hooks can fail or rewrite the notification. */\n\tmessageStarted(message: AgentMessage): void {\n\t\tconst delivery = this.delivery;\n\t\tif (delivery?.message === message && delivery.phase === \"pending\") delivery.phase = \"started\";\n\t}\n\n\t/** A queued message that was never emitted remains claimed for the next run. */\n\tagentEnded(): void {\n\t\tthis.releaseWaits();\n\t\tconst delivery = this.delivery;\n\t\tif (delivery?.phase === \"started\") {\n\t\t\tdelivery.queued?.reject(new Error(\"the completion message was not persisted\"));\n\t\t}\n\t}\n\n\tqueueCleared(): void {\n\t\tthis.delivery?.queued?.reject(new Error(\"the completion message was dequeued before delivery\"));\n\t}\n\n\t/** Acknowledge only successful appends, using identity even when metadata was rewritten. */\n\tmessagePersisted(message: AgentMessage): void {\n\t\tconst delivery = this.delivery;\n\t\tif (delivery?.message === message && delivery.phase !== \"persisted\") {\n\t\t\tdelivery.phase = \"persisted\";\n\t\t\tthis.acknowledge(delivery.id);\n\t\t\tdelivery.queued?.resolve();\n\t\t}\n\t\tif (message.role === \"toolResult\") this.acknowledgeWait(message.toolCallId);\n\t}\n\n\t/**\n\t * A wait observed a settled background task. Its observation hold is still in place; take over\n\t * the hold until the wait's tool result is persisted, then acknowledge it instead of notifying.\n\t */\n\tbindWait(toolCallId: string, taskId: string): void {\n\t\tthis.waits.get(toolCallId)?.release();\n\t\tthis.waits.set(toolCallId, { taskId, release: this.hold([taskId]) });\n\t}\n\n\tprivate acknowledgeWait(toolCallId: string): void {\n\t\tconst receipt = this.waits.get(toolCallId);\n\t\tif (!receipt) return;\n\t\tthis.waits.delete(toolCallId);\n\t\tthis.acknowledge(receipt.taskId);\n\t\treceipt.release();\n\t}\n\n\tprivate releaseWaits(): void {\n\t\tfor (const receipt of this.waits.values()) receipt.release();\n\t\tthis.waits.clear();\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.releaseWaits();\n\t\tfor (const completion of this.completions.values()) completion.release();\n\t\tthis.completions.clear();\n\t\tthis.delivery?.queued?.reject(new Error(\"the session was disposed\"));\n\t\tif (this.timer) clearTimeout(this.timer);\n\t\tthis.timer = undefined;\n\t\tthis.changed();\n\t\tthis.listeners.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../../src/core/tasks/delivery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { CustomMessage } from \"../messages.ts\";\nimport { taskCompletionMessage } from \"./presentation.ts\";\nimport type { TaskSnapshot, TasksContext } from \"./types.ts\";\n\n/** All the delivery policy needs from a runtime: its public, session-independent surface. */\nexport type TaskDeliveryService = Pick<TasksContext, \"enabled\" | \"closed\" | \"list\" | \"retain\">;\n\nexport interface TaskDeliveryOptions {\n\tservice(): TaskDeliveryService;\n\tcanDeliver(): boolean;\n\tdeliver(message: CustomMessage, waitForPersistence: () => Promise<void>): Promise<void>;\n\twarn(event: string, message: string): void;\n}\n\n/** A settled handoff the model has not yet seen, kept retained by a lease until it has. */\ninterface Completion {\n\tservice: TaskDeliveryService;\n\t/** The retention lease: the record and its output stay available until delivery or acknowledgement. */\n\trelease(): void;\n\t/** Handed to the host and awaiting persistence. */\n\tclaimed: boolean;\n}\n\ninterface Delivery {\n\tid: string;\n\t/** Agent-core preserves message identity; extension rewrites mutate it in place. */\n\tmessage: CustomMessage;\n\tphase: \"pending\" | \"started\" | \"persisted\";\n\tqueued?: { resolve(): void; reject(reason: Error): void };\n}\n\n/**\n * Sole owner of \"has this completion reached the model\": the pending queue, claims, the in-flight\n * completion, failures and pauses. An undelivered completion is\n * a retention lease on its task, so the runtime keeps the record and its output exactly as long\n * as delivery needs them, and a bare runtime carries no delivery concept at all.\n */\nexport class TaskDelivery {\n\tprivate readonly options: TaskDeliveryOptions;\n\tprivate disposed = false;\n\tprivate pauses = 0;\n\tprivate timer?: ReturnType<typeof setTimeout>;\n\tprivate delivery?: Delivery;\n\t/** Settlement order. */\n\tprivate readonly completions = new Map<string, Completion>();\n\tprivate readonly failures = new Set<string>();\n\tprivate readonly listeners = new Set<() => void>();\n\tconstructor(options: TaskDeliveryOptions) {\n\t\tthis.options = options;\n\t}\n\tprivate get service(): TaskDeliveryService {\n\t\treturn this.options.service();\n\t}\n\tprivate warn(event: string, message: string): void {\n\t\tthis.options.warn(event, message);\n\t}\n\t/** Called whenever what `hasDeliverableWork()` reads may have changed. */\n\tsubscribe(listener: () => void): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.listeners.delete(listener);\n\t\t};\n\t}\n\n\tprivate changed(): void {\n\t\tfor (const listener of [...this.listeners]) {\n\t\t\ttry {\n\t\t\t\tlistener();\n\t\t\t} catch {\n\t\t\t\t// Observers cannot interrupt delivery.\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Whether a completion is in flight or will be delivered without further input: queued on the\n\t * current runtime, visible on the branch and not failed. A failed delivery only retries on the\n\t * next input, so it does not count.\n\t */\n\thasDeliverableWork(): boolean {\n\t\tif (this.disposed) return false;\n\t\tconst service = this.service;\n\t\tif (service.closed) return false;\n\t\tif (this.delivery) return true;\n\t\tif (!service.enabled || this.completions.size === 0) return false;\n\t\treturn service.list().some((task) => {\n\t\t\tconst completion = this.completions.get(task.id);\n\t\t\treturn completion?.service === service && !this.failures.has(task.id);\n\t\t});\n\t}\n\n\t/** Nestable across asynchronous preflight and service replacement. */\n\tpause(): () => void {\n\t\tthis.pauses++;\n\t\tlet released = false;\n\t\treturn () => {\n\t\t\tif (released) return;\n\t\t\treleased = true;\n\t\t\tthis.pauses--;\n\t\t\tthis.schedule();\n\t\t};\n\t}\n\n\tretry(): void {\n\t\tthis.failures.clear();\n\t\tthis.schedule();\n\t\tthis.changed();\n\t}\n\n\t/** A handed-off task settled on `service`; it awaits automatic delivery under a retention lease. */\n\tenqueue(service: TaskDeliveryService, taskId: string): void {\n\t\tif (this.disposed || service.closed || this.completions.has(taskId)) return;\n\t\tthis.completions.set(taskId, { service, release: service.retain(taskId), claimed: false });\n\t\tthis.schedule();\n\t\tthis.changed();\n\t}\n\n\t/** The model has the result (or the host consumed it): stop waiting to deliver and release the lease. */\n\tacknowledge(taskId: string): void {\n\t\tconst completion = this.completions.get(taskId);\n\t\tif (!completion) return;\n\t\tthis.completions.delete(taskId);\n\t\tcompletion.release();\n\t\tthis.changed();\n\t}\n\n\t/** Release every lease held for a runtime that closed or was replaced, so its output cleanup can run. */\n\tdiscard(service: TaskDeliveryService): void {\n\t\tfor (const [id, completion] of [...this.completions]) {\n\t\t\tif (completion.service !== service) continue;\n\t\t\tthis.completions.delete(id);\n\t\t\tcompletion.release();\n\t\t}\n\t\tthis.changed();\n\t}\n\n\t/**\n\t * Completions that would be delivered next, oldest launch first: on the visible branch and not\n\t * claimed. Failed deliveries stay listed until the next retry.\n\t */\n\tpending(): TaskSnapshot[] {\n\t\tconst service = this.service;\n\t\tif (service.closed) return [];\n\t\treturn service.list().filter((task) => {\n\t\t\tconst completion = this.completions.get(task.id);\n\t\t\treturn completion?.service === service && !completion.claimed;\n\t\t});\n\t}\n\n\tschedule(): void {\n\t\tif (this.disposed || this.timer || this.delivery) return;\n\t\tthis.timer = setTimeout(() => {\n\t\t\tthis.timer = undefined;\n\t\t\tvoid this.drain().catch(() =>\n\t\t\t\tthis.warn(\"task_delivery\", \"Background notification drain failed; delivery was not confirmed.\"),\n\t\t\t);\n\t\t}, 0);\n\t\tthis.timer.unref?.();\n\t}\n\n\tprivate canDeliver(service: TaskDeliveryService): boolean {\n\t\treturn (\n\t\t\t!this.disposed && service === this.service && service.enabled && this.pauses === 0 && this.options.canDeliver()\n\t\t);\n\t}\n\n\tprivate async drain(): Promise<void> {\n\t\tconst service = this.service;\n\t\tif (this.delivery || !this.canDeliver(service)) return;\n\t\tif (this.failures.size) {\n\t\t\tconst retained = new Set(service.list().map((task) => task.id));\n\t\t\tfor (const id of this.failures) if (!retained.has(id)) this.failures.delete(id);\n\t\t}\n\t\tconst task = this.pending().find((task) => !this.failures.has(task.id));\n\t\tif (!task) return;\n\t\tconst completion = this.completions.get(task.id)!;\n\t\tconst message = taskCompletionMessage(task);\n\t\tcompletion.claimed = true;\n\t\t// Exactly one completion may be in flight, whether queued for steering or running its\n\t\t// own turn; there is no separate claim registry.\n\t\tconst delivery: Delivery = {\n\t\t\tid: task.id,\n\t\t\tmessage,\n\t\t\tphase: \"pending\",\n\t\t};\n\t\tthis.delivery = delivery;\n\t\tlet deliveryError: unknown;\n\t\ttry {\n\t\t\tawait this.options.deliver(\n\t\t\t\tdelivery.message,\n\t\t\t\t() =>\n\t\t\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t\t\tif (delivery.phase === \"persisted\") resolve();\n\t\t\t\t\t\telse delivery.queued = { resolve, reject };\n\t\t\t\t\t}),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tdeliveryError = error;\n\t\t} finally {\n\t\t\tif (delivery.phase !== \"persisted\") {\n\t\t\t\tcompletion.claimed = false;\n\t\t\t\tif (service === this.service) this.failures.add(task.id);\n\t\t\t\tconst reason = deliveryError instanceof Error ? `: ${deliveryError.message}` : \"\";\n\t\t\t\tthis.warn(\n\t\t\t\t\t\"task_delivery\",\n\t\t\t\t\t`Background completion delivery failed for ${task.id}${reason}; it will retry on the next input.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.delivery = undefined;\n\t\t\tif (this.canDeliver(this.service) && this.pending().some((task) => !this.failures.has(task.id)))\n\t\t\t\tthis.schedule();\n\t\t\tthis.changed();\n\t\t}\n\t}\n\n\t/** Record dequeueing before message hooks can fail or rewrite the notification. */\n\tmessageStarted(message: AgentMessage): void {\n\t\tconst delivery = this.delivery;\n\t\tif (delivery?.message === message && delivery.phase === \"pending\") delivery.phase = \"started\";\n\t}\n\n\t/** A queued message that was never emitted remains claimed for the next run. */\n\tagentEnded(): void {\n\t\tconst delivery = this.delivery;\n\t\tif (delivery?.phase === \"started\") {\n\t\t\tdelivery.queued?.reject(new Error(\"the completion message was not persisted\"));\n\t\t}\n\t}\n\n\tqueueCleared(): void {\n\t\tthis.delivery?.queued?.reject(new Error(\"the completion message was dequeued before delivery\"));\n\t}\n\n\t/** Acknowledge only successful appends, using identity even when metadata was rewritten. */\n\tmessagePersisted(message: AgentMessage): void {\n\t\tconst delivery = this.delivery;\n\t\tif (delivery?.message === message && delivery.phase !== \"persisted\") {\n\t\t\tdelivery.phase = \"persisted\";\n\t\t\tthis.acknowledge(delivery.id);\n\t\t\tdelivery.queued?.resolve();\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tfor (const completion of this.completions.values()) completion.release();\n\t\tthis.completions.clear();\n\t\tthis.delivery?.queued?.reject(new Error(\"the session was disposed\"));\n\t\tif (this.timer) clearTimeout(this.timer);\n\t\tthis.timer = undefined;\n\t\tthis.changed();\n\t\tthis.listeners.clear();\n\t}\n}\n"]}
@@ -1,28 +1,12 @@
1
1
  import type { TaskSnapshot } from "./types.ts";
2
- /**
3
- * Shared observation-window limits, the one definition used by the runtime and the tasks tool.
4
- * Execution timeouts are configured separately by each executor.
5
- *
6
- * A wait returns as soon as its task settles, and steering or another completion interrupts it, so
7
- * the default only bounds how long a wait on unfinished work blocks before the model has control
8
- * again. It is the longest window that stays inside the common five-minute prompt-cache lifetime,
9
- * with a minute's margin for the request around it: a longer one makes the next request miss the
10
- * cache or need a warming refresh.
11
- */
12
- export declare const TASKS_WAIT_DEFAULT_MS: number;
13
- export declare const TASKS_WAIT_MIN_MS = 1000;
14
- export declare const TASKS_WAIT_MAX_MS: number;
2
+ /** Shared read limits, the one definition used by the runtime and the tasks tool. */
15
3
  /** Floor for a model-requested read slice; the default and ceiling are TASK_READ_BYTES and TASK_RESULT_BYTES. */
16
4
  export declare const TASKS_READ_MIN_BYTES = 256;
17
- /** The wait window the runtime honours: any finite value up to the ceiling, including 0. */
18
- export declare function boundWaitMs(waitMs: number | undefined): number;
19
- /** The wait window a tool call runs, which the pending-call renderer also shows. */
20
- export declare function clampWaitMs(waitMs: number | undefined): number;
21
5
  /** The read size a tool call runs. */
22
6
  export declare function clampReadBytes(bytes: number | undefined): number;
23
7
  /**
24
- * The end a read starts from when the caller names none, the one definition every read,
25
- * wait and projection shares: a report's beginning is its summary, a log's end is its outcome.
8
+ * The end a read starts from when the caller names none, the one definition every read
9
+ * and projection shares: a report's beginning is its summary, a log's end is its outcome.
26
10
  */
27
11
  export declare function defaultReadMode(task: Pick<TaskSnapshot, "output">): "head" | "tail";
28
12
  //# sourceMappingURL=limits.d.ts.map