@astralyn/pi 1.4.5 → 1.4.7

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 (324) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/bundle/chunks/chunk-FODCTZXW.js +230 -0
  3. package/dist/bundle/chunks/{chunk-I5S7H7GA.js → chunk-FYKNSJG6.js} +1 -1
  4. package/dist/bundle/chunks/{chunk-AXFWZIHH.js → chunk-MG5XDTXV.js} +1 -1
  5. package/dist/bundle/chunks/{chunk-ALHAFUHP.js → chunk-PU2IWWXV.js} +1 -1
  6. package/dist/bundle/chunks/{chunk-5M3YJ54Z.js → chunk-RO2VH6UZ.js} +1 -1
  7. package/dist/bundle/chunks/chunk-YJTSOLP2.js +1499 -0
  8. package/dist/bundle/chunks/{cli-FH77R7JR.js → cli-MEL7SGJD.js} +1 -1
  9. package/dist/bundle/chunks/{execute-GMFGC27P.js → execute-4CWRNHPO.js} +1 -1
  10. package/dist/bundle/chunks/{runtime-R5CMHJ5P.js → runtime-R3X67XMR.js} +1 -1
  11. package/dist/bundle/chunks/{virtual-modules-6FUV7ZDV.js → virtual-modules-PKEOKGYI.js} +1 -1
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/index.js +1 -1
  14. package/dist/bundle/rpc-entry.js +1 -1
  15. package/dist/core/agent-session.d.ts +0 -3
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +0 -4
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/extensions/index.d.ts +1 -1
  20. package/dist/core/extensions/index.d.ts.map +1 -1
  21. package/dist/core/extensions/index.js.map +1 -1
  22. package/dist/core/isolated-session.d.ts +23 -0
  23. package/dist/core/isolated-session.d.ts.map +1 -0
  24. package/dist/core/isolated-session.js +55 -0
  25. package/dist/core/isolated-session.js.map +1 -0
  26. package/dist/core/package-manager.d.ts +7 -1
  27. package/dist/core/package-manager.d.ts.map +1 -1
  28. package/dist/core/package-manager.js +72 -1
  29. package/dist/core/package-manager.js.map +1 -1
  30. package/dist/core/resource-loader.d.ts +1 -0
  31. package/dist/core/resource-loader.d.ts.map +1 -1
  32. package/dist/core/resource-loader.js +23 -7
  33. package/dist/core/resource-loader.js.map +1 -1
  34. package/dist/core/settings-manager.d.ts +4 -2
  35. package/dist/core/settings-manager.d.ts.map +1 -1
  36. package/dist/core/settings-manager.js +11 -0
  37. package/dist/core/settings-manager.js.map +1 -1
  38. package/dist/core/settings-schema.d.ts +7 -0
  39. package/dist/core/settings-schema.d.ts.map +1 -1
  40. package/dist/core/settings-schema.js +6 -0
  41. package/dist/core/settings-schema.js.map +1 -1
  42. package/dist/core/skills.d.ts +10 -0
  43. package/dist/core/skills.d.ts.map +1 -1
  44. package/dist/core/skills.js +23 -0
  45. package/dist/core/skills.js.map +1 -1
  46. package/dist/core/tasks/codec.d.ts +12 -0
  47. package/dist/core/tasks/codec.d.ts.map +1 -0
  48. package/dist/core/tasks/codec.js +139 -0
  49. package/dist/core/tasks/codec.js.map +1 -0
  50. package/dist/core/tasks/delivery.d.ts +11 -4
  51. package/dist/core/tasks/delivery.d.ts.map +1 -1
  52. package/dist/core/tasks/delivery.js +9 -9
  53. package/dist/core/tasks/delivery.js.map +1 -1
  54. package/dist/core/tasks/execution.d.ts +71 -0
  55. package/dist/core/tasks/execution.d.ts.map +1 -0
  56. package/dist/core/tasks/execution.js +292 -0
  57. package/dist/core/tasks/execution.js.map +1 -0
  58. package/dist/core/tasks/format.d.ts +0 -2
  59. package/dist/core/tasks/format.d.ts.map +1 -1
  60. package/dist/core/tasks/format.js +1 -16
  61. package/dist/core/tasks/format.js.map +1 -1
  62. package/dist/core/tasks/limits.d.ts +12 -1
  63. package/dist/core/tasks/limits.d.ts.map +1 -1
  64. package/dist/core/tasks/limits.js +20 -1
  65. package/dist/core/tasks/limits.js.map +1 -1
  66. package/dist/core/tasks/output.d.ts +17 -17
  67. package/dist/core/tasks/output.d.ts.map +1 -1
  68. package/dist/core/tasks/output.js +72 -69
  69. package/dist/core/tasks/output.js.map +1 -1
  70. package/dist/core/tasks/presentation.d.ts +14 -5
  71. package/dist/core/tasks/presentation.d.ts.map +1 -1
  72. package/dist/core/tasks/presentation.js +56 -185
  73. package/dist/core/tasks/presentation.js.map +1 -1
  74. package/dist/core/tasks/record.d.ts +45 -0
  75. package/dist/core/tasks/record.d.ts.map +1 -0
  76. package/dist/core/tasks/record.js +80 -0
  77. package/dist/core/tasks/record.js.map +1 -0
  78. package/dist/core/tasks/runtime.d.ts +22 -22
  79. package/dist/core/tasks/runtime.d.ts.map +1 -1
  80. package/dist/core/tasks/runtime.js +170 -343
  81. package/dist/core/tasks/runtime.js.map +1 -1
  82. package/dist/core/tasks/scheduler.d.ts +16 -0
  83. package/dist/core/tasks/scheduler.d.ts.map +1 -0
  84. package/dist/core/tasks/scheduler.js +42 -0
  85. package/dist/core/tasks/scheduler.js.map +1 -0
  86. package/dist/core/tasks/session.d.ts +1 -1
  87. package/dist/core/tasks/session.d.ts.map +1 -1
  88. package/dist/core/tasks/session.js +22 -35
  89. package/dist/core/tasks/session.js.map +1 -1
  90. package/dist/core/tasks/store.d.ts +18 -25
  91. package/dist/core/tasks/store.d.ts.map +1 -1
  92. package/dist/core/tasks/store.js +45 -43
  93. package/dist/core/tasks/store.js.map +1 -1
  94. package/dist/core/tasks/types.d.ts +159 -70
  95. package/dist/core/tasks/types.d.ts.map +1 -1
  96. package/dist/core/tasks/types.js +3 -9
  97. package/dist/core/tasks/types.js.map +1 -1
  98. package/dist/core/tools/shell-execution.d.ts +8 -7
  99. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  100. package/dist/core/tools/shell-execution.js +19 -27
  101. package/dist/core/tools/shell-execution.js.map +1 -1
  102. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  103. package/dist/core/tools/shell-tool.js +42 -47
  104. package/dist/core/tools/shell-tool.js.map +1 -1
  105. package/dist/core/usage-totals.d.ts +4 -3
  106. package/dist/core/usage-totals.d.ts.map +1 -1
  107. package/dist/core/usage-totals.js +32 -8
  108. package/dist/core/usage-totals.js.map +1 -1
  109. package/dist/extensions/agent/activity.d.ts +4 -4
  110. package/dist/extensions/agent/activity.d.ts.map +1 -1
  111. package/dist/extensions/agent/activity.js +15 -24
  112. package/dist/extensions/agent/activity.js.map +1 -1
  113. package/dist/extensions/agent/index.d.ts +2 -11
  114. package/dist/extensions/agent/index.d.ts.map +1 -1
  115. package/dist/extensions/agent/index.js +3 -88
  116. package/dist/extensions/agent/index.js.map +1 -1
  117. package/dist/extensions/agent/progress.d.ts +31 -0
  118. package/dist/extensions/agent/progress.d.ts.map +1 -0
  119. package/dist/extensions/agent/progress.js +135 -0
  120. package/dist/extensions/agent/progress.js.map +1 -0
  121. package/dist/extensions/agent/render.d.ts.map +1 -1
  122. package/dist/extensions/agent/render.js +8 -17
  123. package/dist/extensions/agent/render.js.map +1 -1
  124. package/dist/extensions/agent/report.d.ts +9 -0
  125. package/dist/extensions/agent/report.d.ts.map +1 -0
  126. package/dist/extensions/agent/report.js +40 -0
  127. package/dist/extensions/agent/report.js.map +1 -0
  128. package/dist/extensions/agent/settings-panel.d.ts +43 -0
  129. package/dist/extensions/agent/settings-panel.d.ts.map +1 -0
  130. package/dist/extensions/agent/settings-panel.js +125 -0
  131. package/dist/extensions/agent/settings-panel.js.map +1 -0
  132. package/dist/extensions/agent/settings.d.ts +1 -1
  133. package/dist/extensions/agent/settings.d.ts.map +1 -1
  134. package/dist/extensions/agent/settings.js +101 -83
  135. package/dist/extensions/agent/settings.js.map +1 -1
  136. package/dist/extensions/agent/tool.d.ts +13 -0
  137. package/dist/extensions/agent/tool.d.ts.map +1 -0
  138. package/dist/extensions/agent/tool.js +88 -0
  139. package/dist/extensions/agent/tool.js.map +1 -0
  140. package/dist/extensions/agent/types.d.ts +19 -21
  141. package/dist/extensions/agent/types.d.ts.map +1 -1
  142. package/dist/extensions/agent/types.js +2 -10
  143. package/dist/extensions/agent/types.js.map +1 -1
  144. package/dist/extensions/agent/worker.d.ts +16 -0
  145. package/dist/extensions/agent/worker.d.ts.map +1 -0
  146. package/dist/extensions/agent/worker.js +66 -0
  147. package/dist/extensions/agent/worker.js.map +1 -0
  148. package/dist/extensions/btw/agent.d.ts +1 -1
  149. package/dist/extensions/btw/agent.d.ts.map +1 -1
  150. package/dist/extensions/btw/agent.js +3 -20
  151. package/dist/extensions/btw/agent.js.map +1 -1
  152. package/dist/extensions/cached-compaction/index.d.ts.map +1 -1
  153. package/dist/extensions/cached-compaction/index.js +3 -22
  154. package/dist/extensions/cached-compaction/index.js.map +1 -1
  155. package/dist/extensions/cached-compaction/render.d.ts +1 -0
  156. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  157. package/dist/extensions/cached-compaction/render.js +42 -14
  158. package/dist/extensions/cached-compaction/render.js.map +1 -1
  159. package/dist/extensions/deepwiki/client.d.ts.map +1 -1
  160. package/dist/extensions/deepwiki/client.js +6 -78
  161. package/dist/extensions/deepwiki/client.js.map +1 -1
  162. package/dist/extensions/deepwiki/transport.d.ts +3 -0
  163. package/dist/extensions/deepwiki/transport.d.ts.map +1 -0
  164. package/dist/extensions/deepwiki/transport.js +96 -0
  165. package/dist/extensions/deepwiki/transport.js.map +1 -0
  166. package/dist/extensions/provider/ui/builtin-data.d.ts +3 -3
  167. package/dist/extensions/provider/ui/builtin-data.d.ts.map +1 -1
  168. package/dist/extensions/provider/ui/builtin-data.js.map +1 -1
  169. package/dist/extensions/provider/ui/compat.d.ts +3 -3
  170. package/dist/extensions/provider/ui/compat.d.ts.map +1 -1
  171. package/dist/extensions/provider/ui/compat.js.map +1 -1
  172. package/dist/extensions/provider/ui/controls.d.ts +2 -2
  173. package/dist/extensions/provider/ui/controls.d.ts.map +1 -1
  174. package/dist/extensions/provider/ui/controls.js.map +1 -1
  175. package/dist/extensions/provider/ui/dialogs.d.ts +3 -3
  176. package/dist/extensions/provider/ui/dialogs.d.ts.map +1 -1
  177. package/dist/extensions/provider/ui/dialogs.js.map +1 -1
  178. package/dist/extensions/provider/ui/dictionary.d.ts +2 -2
  179. package/dist/extensions/provider/ui/dictionary.d.ts.map +1 -1
  180. package/dist/extensions/provider/ui/dictionary.js.map +1 -1
  181. package/dist/extensions/provider/ui/editor.d.ts.map +1 -1
  182. package/dist/extensions/provider/ui/editor.js +1 -3
  183. package/dist/extensions/provider/ui/editor.js.map +1 -1
  184. package/dist/extensions/provider/ui/fetch-models.d.ts +2 -2
  185. package/dist/extensions/provider/ui/fetch-models.d.ts.map +1 -1
  186. package/dist/extensions/provider/ui/fetch-models.js.map +1 -1
  187. package/dist/extensions/provider/ui/model-fields.d.ts +2 -2
  188. package/dist/extensions/provider/ui/model-fields.d.ts.map +1 -1
  189. package/dist/extensions/provider/ui/model-fields.js.map +1 -1
  190. package/dist/extensions/provider/ui/model-options.d.ts +6 -6
  191. package/dist/extensions/provider/ui/model-options.d.ts.map +1 -1
  192. package/dist/extensions/provider/ui/model-options.js.map +1 -1
  193. package/dist/extensions/provider/ui/pane.d.ts +21 -12
  194. package/dist/extensions/provider/ui/pane.d.ts.map +1 -1
  195. package/dist/extensions/provider/ui/pane.js.map +1 -1
  196. package/dist/extensions/provider/ui/provider-fields.d.ts +3 -3
  197. package/dist/extensions/provider/ui/provider-fields.d.ts.map +1 -1
  198. package/dist/extensions/provider/ui/provider-fields.js.map +1 -1
  199. package/dist/extensions/provider/ui/thinking-map.d.ts +2 -2
  200. package/dist/extensions/provider/ui/thinking-map.d.ts.map +1 -1
  201. package/dist/extensions/provider/ui/thinking-map.js.map +1 -1
  202. package/dist/extensions/run-summary/format.js +1 -1
  203. package/dist/extensions/run-summary/format.js.map +1 -1
  204. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  205. package/dist/extensions/statusline/usage.js +2 -6
  206. package/dist/extensions/statusline/usage.js.map +1 -1
  207. package/dist/extensions/tasks/tool/actions.d.ts +1 -1
  208. package/dist/extensions/tasks/tool/actions.d.ts.map +1 -1
  209. package/dist/extensions/tasks/tool/actions.js +50 -115
  210. package/dist/extensions/tasks/tool/actions.js.map +1 -1
  211. package/dist/extensions/tasks/tool/constants.d.ts +1 -6
  212. package/dist/extensions/tasks/tool/constants.d.ts.map +1 -1
  213. package/dist/extensions/tasks/tool/constants.js +1 -6
  214. package/dist/extensions/tasks/tool/constants.js.map +1 -1
  215. package/dist/extensions/tasks/tool/schema.d.ts +0 -3
  216. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  217. package/dist/extensions/tasks/tool/schema.js +5 -14
  218. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  219. package/dist/extensions/tasks/tool/types.d.ts +2 -8
  220. package/dist/extensions/tasks/tool/types.d.ts.map +1 -1
  221. package/dist/extensions/tasks/tool/types.js +0 -2
  222. package/dist/extensions/tasks/tool/types.js.map +1 -1
  223. package/dist/extensions/tasks/tool.d.ts.map +1 -1
  224. package/dist/extensions/tasks/tool.js +2 -2
  225. package/dist/extensions/tasks/tool.js.map +1 -1
  226. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  227. package/dist/extensions/tasks/ui/completion-render.js +46 -47
  228. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  229. package/dist/extensions/tasks/ui/inspector.d.ts +5 -3
  230. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  231. package/dist/extensions/tasks/ui/inspector.js +18 -6
  232. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  233. package/dist/extensions/tasks/ui/layout.d.ts +7 -7
  234. package/dist/extensions/tasks/ui/layout.d.ts.map +1 -1
  235. package/dist/extensions/tasks/ui/layout.js +118 -84
  236. package/dist/extensions/tasks/ui/layout.js.map +1 -1
  237. package/dist/extensions/tasks/ui/list.d.ts.map +1 -1
  238. package/dist/extensions/tasks/ui/list.js +45 -31
  239. package/dist/extensions/tasks/ui/list.js.map +1 -1
  240. package/dist/extensions/tasks/ui/manager.d.ts +16 -7
  241. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  242. package/dist/extensions/tasks/ui/manager.js +167 -129
  243. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  244. package/dist/extensions/tasks/ui/model.d.ts +29 -0
  245. package/dist/extensions/tasks/ui/model.d.ts.map +1 -1
  246. package/dist/extensions/tasks/ui/model.js +16 -1
  247. package/dist/extensions/tasks/ui/model.js.map +1 -1
  248. package/dist/extensions/tasks/ui/render.d.ts +1 -1
  249. package/dist/extensions/tasks/ui/render.d.ts.map +1 -1
  250. package/dist/extensions/tasks/ui/render.js +12 -9
  251. package/dist/extensions/tasks/ui/render.js.map +1 -1
  252. package/dist/extensions/tasks/ui/status.d.ts +15 -0
  253. package/dist/extensions/tasks/ui/status.d.ts.map +1 -0
  254. package/dist/extensions/tasks/ui/status.js +16 -0
  255. package/dist/extensions/tasks/ui/status.js.map +1 -0
  256. package/dist/extensions/tasks/ui/tree.js +1 -1
  257. package/dist/extensions/tasks/ui/tree.js.map +1 -1
  258. package/dist/extensions/tasks/ui/views.d.ts +10 -5
  259. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  260. package/dist/extensions/tasks/ui/views.js +61 -36
  261. package/dist/extensions/tasks/ui/views.js.map +1 -1
  262. package/dist/index.d.ts +2 -1
  263. package/dist/index.d.ts.map +1 -1
  264. package/dist/index.js.map +1 -1
  265. package/dist/modes/interactive/components/config-selector.d.ts +14 -1
  266. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  267. package/dist/modes/interactive/components/config-selector.js +258 -7
  268. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  269. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  270. package/dist/modes/interactive/components/keybinding-hints.js +2 -1
  271. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  272. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  273. package/dist/modes/interactive/components/model-selector.js +7 -4
  274. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  275. package/dist/modes/interactive/components/status-marker.d.ts +2 -1
  276. package/dist/modes/interactive/components/status-marker.d.ts.map +1 -1
  277. package/dist/modes/interactive/components/status-marker.js +0 -1
  278. package/dist/modes/interactive/components/status-marker.js.map +1 -1
  279. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  280. package/dist/modes/interactive/components/thinking-selector.js +10 -3
  281. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  282. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  283. package/dist/modes/interactive/interactive-mode.js +7 -1
  284. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  285. package/dist/utils/duration.d.ts +3 -0
  286. package/dist/utils/duration.d.ts.map +1 -0
  287. package/dist/utils/duration.js +17 -0
  288. package/dist/utils/duration.js.map +1 -0
  289. package/dist/utils/number.d.ts +3 -0
  290. package/dist/utils/number.d.ts.map +1 -0
  291. package/dist/utils/number.js +5 -0
  292. package/dist/utils/number.js.map +1 -0
  293. package/docs/bundled/extensions/agent.md +14 -12
  294. package/docs/bundled/extensions/cached-compaction.md +13 -4
  295. package/docs/bundled/extensions/deepwiki.md +3 -1
  296. package/docs/bundled/extensions/statusline.md +1 -1
  297. package/docs/bundled/tasks.md +15 -14
  298. package/docs/extensions.md +26 -10
  299. package/docs/packages.md +5 -3
  300. package/docs/sdk.md +3 -3
  301. package/docs/session-format.md +28 -24
  302. package/docs/settings.md +11 -0
  303. package/docs/skills.md +23 -0
  304. package/npm-shrinkwrap.json +2 -2
  305. package/package.json +1 -1
  306. package/schemas/settings.schema.json +36 -0
  307. package/dist/bundle/chunks/chunk-FSJ45CRP.js +0 -229
  308. package/dist/bundle/chunks/chunk-W3FIUMGM.js +0 -1501
  309. package/dist/core/tasks/history.d.ts +0 -4
  310. package/dist/core/tasks/history.d.ts.map +0 -1
  311. package/dist/core/tasks/history.js +0 -131
  312. package/dist/core/tasks/history.js.map +0 -1
  313. package/dist/extensions/agent/runner.d.ts +0 -24
  314. package/dist/extensions/agent/runner.d.ts.map +0 -1
  315. package/dist/extensions/agent/runner.js +0 -274
  316. package/dist/extensions/agent/runner.js.map +0 -1
  317. package/dist/extensions/deepwiki/http.d.ts +0 -13
  318. package/dist/extensions/deepwiki/http.d.ts.map +0 -1
  319. package/dist/extensions/deepwiki/http.js +0 -88
  320. package/dist/extensions/deepwiki/http.js.map +0 -1
  321. package/dist/extensions/tasks/ui/task-view.d.ts +0 -13
  322. package/dist/extensions/tasks/ui/task-view.d.ts.map +0 -1
  323. package/dist/extensions/tasks/ui/task-view.js +0 -20
  324. package/dist/extensions/tasks/ui/task-view.js.map +0 -1
@@ -1,4 +0,0 @@
1
- import type { TaskSnapshot } from "./types.ts";
2
- export declare const TASK_HISTORY_VERSION = 2;
3
- export declare function parseTaskHistory(record: unknown): TaskSnapshot | undefined;
4
- //# sourceMappingURL=history.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../../src/core/tasks/history.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAuBtC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAgG1E"}
@@ -1,131 +0,0 @@
1
- import { boundedResult, boundText, TASK_INFO_BYTES, TASK_RESULT_BYTES, TASK_TITLE_BYTES } from "./output.js";
2
- export const TASK_HISTORY_VERSION = 2;
3
- /** Read persisted data properties only; never invoke getters or custom serialization. */
4
- function dataObject(value) {
5
- if (value === null || typeof value !== "object" || Array.isArray(value))
6
- throw new Error("Expected object");
7
- const prototype = Object.getPrototypeOf(value);
8
- if (prototype !== Object.prototype && prototype !== null)
9
- throw new Error("Expected plain object");
10
- return value;
11
- }
12
- function field(object, key) {
13
- const descriptor = Object.getOwnPropertyDescriptor(object, key);
14
- if (descriptor && !("value" in descriptor))
15
- throw new Error("Unexpected accessor");
16
- return descriptor?.value;
17
- }
18
- function historyString(value, bytes, exact = false) {
19
- if (typeof value !== "string")
20
- throw new Error("Expected string");
21
- if (exact && (!value || value.length > bytes || Buffer.byteLength(value) > bytes || value.includes("\0")))
22
- throw new Error("Invalid identity or path");
23
- return boundText(value, bytes);
24
- }
25
- export function parseTaskHistory(record) {
26
- try {
27
- const envelope = dataObject(record);
28
- if (field(envelope, "version") !== TASK_HISTORY_VERSION)
29
- return undefined;
30
- const source = dataObject(field(envelope, "task"));
31
- const kind = field(source, "kind");
32
- const mode = field(source, "mode");
33
- const status = field(source, "status");
34
- if (typeof kind !== "string" || !/^[a-z][a-z0-9-]{0,63}$/.test(kind))
35
- return undefined;
36
- if (mode !== "foreground" && mode !== "background")
37
- return undefined;
38
- if (status !== "completed" &&
39
- status !== "partial" &&
40
- status !== "failed" &&
41
- status !== "cancelled" &&
42
- status !== "timeout")
43
- return undefined;
44
- const startedAt = field(source, "startedAt");
45
- const endedAt = field(source, "endedAt");
46
- if (typeof startedAt !== "number" ||
47
- !Number.isSafeInteger(startedAt) ||
48
- startedAt < 0 ||
49
- typeof endedAt !== "number" ||
50
- !Number.isSafeInteger(endedAt) ||
51
- endedAt < startedAt)
52
- return undefined;
53
- const anchor = field(source, "anchorId");
54
- const task = {
55
- id: historyString(field(source, "id"), 512, true),
56
- kind,
57
- mode,
58
- status,
59
- startedAt,
60
- endedAt,
61
- title: historyString(field(source, "title"), TASK_TITLE_BYTES),
62
- toolCallId: historyString(field(source, "toolCallId"), 512, true),
63
- anchorId: anchor === null ? null : historyString(anchor, 8192, true),
64
- };
65
- if (!task.id.startsWith(`${kind}-`) || task.id.length <= kind.length + 1)
66
- return undefined;
67
- for (const [key, bytes] of [
68
- ["command", 8192],
69
- ["cwd", 4096],
70
- ["error", 4096],
71
- ["outputPath", 8192],
72
- ]) {
73
- const value = field(source, key);
74
- if (value !== undefined)
75
- task[key] = historyString(value, bytes, key === "outputPath");
76
- }
77
- const info = field(source, "info");
78
- if (info !== undefined) {
79
- const value = dataObject(info);
80
- const original = field(value, "text");
81
- const truncated = field(value, "truncated");
82
- if (typeof truncated !== "boolean")
83
- return undefined;
84
- const text = historyString(original, TASK_INFO_BYTES);
85
- task.info = { text, truncated: truncated || text !== original };
86
- }
87
- for (const key of ["commandTruncated", "resultTruncated"]) {
88
- const value = field(source, key);
89
- if (value !== undefined && typeof value !== "boolean")
90
- return undefined;
91
- task[key] = value;
92
- }
93
- const exitCode = field(source, "exitCode");
94
- if (exitCode !== undefined) {
95
- if (exitCode !== null && (typeof exitCode !== "number" || !Number.isSafeInteger(exitCode)))
96
- return undefined;
97
- task.exitCode = exitCode;
98
- }
99
- if (task.command !== undefined && task.command !== field(source, "command"))
100
- task.commandTruncated = true;
101
- const result = field(source, "result");
102
- if (result !== undefined) {
103
- const object = dataObject(result);
104
- const blocks = field(object, "content");
105
- if (!Array.isArray(blocks))
106
- return undefined;
107
- const content = [];
108
- let remaining = TASK_RESULT_BYTES;
109
- for (let index = 0; index < blocks.length && remaining > 0; index++) {
110
- const block = dataObject(field(blocks, String(index)));
111
- const type = field(block, "type");
112
- if (type !== "text" && type !== "image")
113
- return undefined;
114
- const original = type === "text" ? field(block, "text") : undefined;
115
- const text = type === "text" ? historyString(original, remaining) : "[Image omitted from background history]";
116
- if (text !== original)
117
- task.resultTruncated = true;
118
- content.push({ type: "text", text });
119
- remaining -= Math.max(1, Buffer.byteLength(text));
120
- }
121
- if (content.length < blocks.length)
122
- task.resultTruncated = true;
123
- task.result = boundedResult({ content, details: undefined });
124
- }
125
- return task;
126
- }
127
- catch {
128
- return undefined;
129
- }
130
- }
131
- //# sourceMappingURL=history.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["../../../src/core/tasks/history.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport { boundedResult, boundText, TASK_INFO_BYTES, TASK_RESULT_BYTES, TASK_TITLE_BYTES } from \"./output.ts\";\nimport type { TaskSnapshot } from \"./types.ts\";\n\nexport const TASK_HISTORY_VERSION = 2;\n\n/** Read persisted data properties only; never invoke getters or custom serialization. */\nfunction dataObject(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\nfunction 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 historyString(value: unknown, bytes: number, exact = false): string {\n\tif (typeof value !== \"string\") throw new Error(\"Expected string\");\n\tif (exact && (!value || value.length > bytes || Buffer.byteLength(value) > bytes || value.includes(\"\\0\")))\n\t\tthrow new Error(\"Invalid identity or path\");\n\treturn boundText(value, bytes);\n}\n\nexport function parseTaskHistory(record: unknown): TaskSnapshot | undefined {\n\ttry {\n\t\tconst envelope = dataObject(record);\n\t\tif (field(envelope, \"version\") !== TASK_HISTORY_VERSION) return undefined;\n\t\tconst source = dataObject(field(envelope, \"task\"));\n\t\tconst kind = field(source, \"kind\");\n\t\tconst mode = field(source, \"mode\");\n\t\tconst status = field(source, \"status\");\n\t\tif (typeof kind !== \"string\" || !/^[a-z][a-z0-9-]{0,63}$/.test(kind)) return undefined;\n\t\tif (mode !== \"foreground\" && mode !== \"background\") return undefined;\n\t\tif (\n\t\t\tstatus !== \"completed\" &&\n\t\t\tstatus !== \"partial\" &&\n\t\t\tstatus !== \"failed\" &&\n\t\t\tstatus !== \"cancelled\" &&\n\t\t\tstatus !== \"timeout\"\n\t\t)\n\t\t\treturn undefined;\n\t\tconst startedAt = field(source, \"startedAt\");\n\t\tconst endedAt = field(source, \"endedAt\");\n\t\tif (\n\t\t\ttypeof startedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(startedAt) ||\n\t\t\tstartedAt < 0 ||\n\t\t\ttypeof endedAt !== \"number\" ||\n\t\t\t!Number.isSafeInteger(endedAt) ||\n\t\t\tendedAt < startedAt\n\t\t)\n\t\t\treturn undefined;\n\t\tconst anchor = field(source, \"anchorId\");\n\t\tconst task: TaskSnapshot = {\n\t\t\tid: historyString(field(source, \"id\"), 512, true),\n\t\t\tkind,\n\t\t\tmode,\n\t\t\tstatus,\n\t\t\tstartedAt,\n\t\t\tendedAt,\n\t\t\ttitle: historyString(field(source, \"title\"), TASK_TITLE_BYTES),\n\t\t\ttoolCallId: historyString(field(source, \"toolCallId\"), 512, true),\n\t\t\tanchorId: anchor === null ? null : historyString(anchor, 8192, true),\n\t\t};\n\t\tif (!task.id.startsWith(`${kind}-`) || task.id.length <= kind.length + 1) return undefined;\n\t\tfor (const [key, bytes] of [\n\t\t\t[\"command\", 8192],\n\t\t\t[\"cwd\", 4096],\n\t\t\t[\"error\", 4096],\n\t\t\t[\"outputPath\", 8192],\n\t\t] as const) {\n\t\t\tconst value = field(source, key);\n\t\t\tif (value !== undefined) task[key] = historyString(value, bytes, key === \"outputPath\");\n\t\t}\n\t\tconst info = field(source, \"info\");\n\t\tif (info !== undefined) {\n\t\t\tconst value = dataObject(info);\n\t\t\tconst original = field(value, \"text\");\n\t\t\tconst truncated = field(value, \"truncated\");\n\t\t\tif (typeof truncated !== \"boolean\") return undefined;\n\t\t\tconst text = historyString(original, TASK_INFO_BYTES);\n\t\t\ttask.info = { text, truncated: truncated || text !== original };\n\t\t}\n\t\tfor (const key of [\"commandTruncated\", \"resultTruncated\"] as const) {\n\t\t\tconst value = field(source, key);\n\t\t\tif (value !== undefined && typeof value !== \"boolean\") return undefined;\n\t\t\ttask[key] = value;\n\t\t}\n\t\tconst exitCode = field(source, \"exitCode\");\n\t\tif (exitCode !== undefined) {\n\t\t\tif (exitCode !== null && (typeof exitCode !== \"number\" || !Number.isSafeInteger(exitCode))) return undefined;\n\t\t\ttask.exitCode = exitCode;\n\t\t}\n\t\tif (task.command !== undefined && task.command !== field(source, \"command\")) task.commandTruncated = true;\n\t\tconst result = field(source, \"result\");\n\t\tif (result !== undefined) {\n\t\t\tconst object = dataObject(result);\n\t\t\tconst blocks = field(object, \"content\");\n\t\t\tif (!Array.isArray(blocks)) return undefined;\n\t\t\tconst content: AgentToolResult<unknown>[\"content\"] = [];\n\t\t\tlet remaining = TASK_RESULT_BYTES;\n\t\t\tfor (let index = 0; index < blocks.length && remaining > 0; index++) {\n\t\t\t\tconst block = dataObject(field(blocks, String(index)));\n\t\t\t\tconst type = field(block, \"type\");\n\t\t\t\tif (type !== \"text\" && type !== \"image\") return undefined;\n\t\t\t\tconst original = type === \"text\" ? field(block, \"text\") : undefined;\n\t\t\t\tconst text =\n\t\t\t\t\ttype === \"text\" ? historyString(original, remaining) : \"[Image omitted from background history]\";\n\t\t\t\tif (text !== original) task.resultTruncated = true;\n\t\t\t\tcontent.push({ type: \"text\", text });\n\t\t\t\tremaining -= Math.max(1, Buffer.byteLength(text));\n\t\t\t}\n\t\t\tif (content.length < blocks.length) task.resultTruncated = true;\n\t\t\ttask.result = boundedResult({ content, details: undefined });\n\t\t}\n\t\treturn task;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
@@ -1,24 +0,0 @@
1
- import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
- import type { Model } from "@earendil-works/pi-ai/compat";
3
- import type { ModelRuntime } from "../../core/model-runtime.ts";
4
- import type { TaskCompletion, TaskControl } from "../../core/tasks/types.ts";
5
- import { type AgentToolDetails } from "./types.ts";
6
- /** One small session-local queue; Tasks owns the visible queued/running state. */
7
- export declare class AgentGate {
8
- private active;
9
- private readonly limit;
10
- private readonly waiting;
11
- constructor(limit?: number);
12
- acquire(signal: AbortSignal): Promise<() => void>;
13
- private next;
14
- }
15
- export interface AgentRequest {
16
- prompt: string;
17
- cwd: string;
18
- model: Model<any>;
19
- thinking: ThinkingLevel;
20
- modelRuntime: ModelRuntime;
21
- projectTrusted: boolean;
22
- }
23
- export declare function runAgent(control: TaskControl<AgentToolDetails>, request: AgentRequest, gate: AgentGate): Promise<TaskCompletion<AgentToolDetails>>;
24
- //# sourceMappingURL=runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../../src/extensions/agent/runner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,KAAK,EAAS,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAKhE,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAsB,MAAM,2BAA2B,CAAC;AAYjG,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,YAAY,CAAC;AAIpB,kFAAkF;AAClF,qBAAa,SAAS;IACrB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAIhB;gBAEI,KAAK,SAAI;IAIrB,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAmCjD,OAAO,CAAC,IAAI;CAQZ;AAED,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;CACxB;AA+ED,wBAAsB,QAAQ,CAC7B,OAAO,EAAE,WAAW,CAAC,gBAAgB,CAAC,EACtC,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,GACb,OAAO,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAiI3C"}
@@ -1,274 +0,0 @@
1
- import { unlink } from "node:fs/promises";
2
- import { getAgentDir } from "../../config.js";
3
- import { DefaultResourceLoader } from "../../core/resource-loader.js";
4
- import { createAgentSession } from "../../core/sdk.js";
5
- import { SessionManager } from "../../core/session-manager.js";
6
- import { SettingsManager } from "../../core/settings-manager.js";
7
- import { combineUsage } from "../../core/usage-totals.js";
8
- import { raceWithAbortSignal } from "../../utils/abort.js";
9
- import { writeOutputFile } from "../../utils/output-files.js";
10
- import { activitiesText, activityTarget, boundedAgentText, clipText, compactArguments, finalAssistantText, } from "./activity.js";
11
- import { AGENT_MAX_ACTIVITIES, AGENT_REPORT_BYTES, emptyUsage, } from "./types.js";
12
- const AGENT_TOOLS = ["read", "bash", "edit", "write"];
13
- /** One small session-local queue; Tasks owns the visible queued/running state. */
14
- export class AgentGate {
15
- constructor(limit = 4) {
16
- this.active = 0;
17
- this.waiting = [];
18
- this.limit = limit;
19
- }
20
- acquire(signal) {
21
- if (signal.aborted)
22
- return Promise.reject(signal.reason ?? new Error("Agent cancelled while queued."));
23
- return new Promise((resolve, reject) => {
24
- let settled = false;
25
- let released = false;
26
- const release = () => {
27
- if (released)
28
- return;
29
- released = true;
30
- this.active--;
31
- this.next();
32
- };
33
- const waiter = {
34
- signal,
35
- abort: () => {
36
- if (settled)
37
- return;
38
- settled = true;
39
- const index = this.waiting.indexOf(waiter);
40
- if (index >= 0)
41
- this.waiting.splice(index, 1);
42
- signal.removeEventListener("abort", waiter.abort);
43
- reject(signal.reason ?? new Error("Agent cancelled while queued."));
44
- },
45
- enter: () => {
46
- if (settled)
47
- return;
48
- settled = true;
49
- signal.removeEventListener("abort", waiter.abort);
50
- this.active++;
51
- resolve(release);
52
- },
53
- };
54
- signal.addEventListener("abort", waiter.abort, { once: true });
55
- if (this.active < this.limit)
56
- waiter.enter();
57
- else
58
- this.waiting.push(waiter);
59
- });
60
- }
61
- next() {
62
- const waiter = this.waiting.shift();
63
- if (!waiter)
64
- return;
65
- if (waiter.signal.aborted) {
66
- waiter.abort();
67
- this.next();
68
- }
69
- else
70
- waiter.enter();
71
- }
72
- }
73
- function workerPrompt(base) {
74
- return [
75
- base,
76
- "You are an Agent working independently on one delegated task.",
77
- "You cannot see the parent conversation. Treat the parent Agent as your caller, rely on the task briefing and available workspace context, and do not ask the end user questions. If anything is unclear, explain the ambiguity in your final report.",
78
- "Work in the assigned directory and stay within the requested scope. Use read for known-path file reads and bash for file discovery, search, and shell commands.",
79
- "Do not delegate or start background work. Run required commands in the foreground and wait for them.",
80
- "Only your final report returns to the caller. Make it self-contained: include essential findings or changes, verification when applicable, blockers, and unresolved risks; omit process narration.",
81
- ]
82
- .filter((part) => Boolean(part?.trim()))
83
- .join("\n\n");
84
- }
85
- function errorText(error) {
86
- return clipText(error instanceof Error ? error.message : String(error), 4096);
87
- }
88
- async function removeOutputFile(path) {
89
- await unlink(path).catch((error) => {
90
- if (error.code !== "ENOENT")
91
- throw error;
92
- });
93
- }
94
- async function finalText(control, report, error) {
95
- const text = !report ? (error ?? "No report returned.") : error ? `${report}\n\nError: ${error}` : report;
96
- if (Buffer.byteLength(text) <= AGENT_REPORT_BYTES)
97
- return text;
98
- let path;
99
- try {
100
- path = await writeOutputFile("pi-agent", ".md", text);
101
- control.setOutputPath(path, () => removeOutputFile(path));
102
- return boundedAgentText(text, AGENT_REPORT_BYTES, path);
103
- }
104
- catch {
105
- if (path)
106
- await removeOutputFile(path).catch(() => { });
107
- return boundedAgentText(text);
108
- }
109
- }
110
- async function prepareWorkerSession(request, signal) {
111
- signal.throwIfAborted();
112
- const agentDir = getAgentDir();
113
- const source = SettingsManager.create(request.cwd, agentDir, { projectTrusted: request.projectTrusted });
114
- const loader = new DefaultResourceLoader({
115
- cwd: request.cwd,
116
- agentDir,
117
- settingsManager: source,
118
- noExtensions: true,
119
- noSkills: true,
120
- noPromptTemplates: true,
121
- noThemes: true,
122
- systemPromptOverride: workerPrompt,
123
- });
124
- await loader.reload();
125
- signal.throwIfAborted();
126
- // Resource discovery can reload its source; execution owns a detached snapshot, never that source.
127
- const settingsManager = SettingsManager.inMemory({ ...source.getGlobalSettings(), cacheWarming: "off" }, { projectTrusted: request.projectTrusted });
128
- settingsManager.applyOverrides(source.getProjectSettings());
129
- return {
130
- cwd: request.cwd,
131
- agentDir,
132
- modelRuntime: request.modelRuntime,
133
- model: request.model,
134
- thinkingLevel: request.thinking,
135
- backgroundAllowed: false,
136
- resourceLoader: loader,
137
- settingsManager,
138
- sessionManager: SessionManager.inMemory(request.cwd),
139
- tools: AGENT_TOOLS,
140
- };
141
- }
142
- export async function runAgent(control, request, gate) {
143
- const { signal } = control;
144
- const release = await gate.acquire(signal);
145
- let session;
146
- let unsubscribe;
147
- let usage = emptyUsage();
148
- let lastMessage;
149
- const seen = new WeakSet();
150
- const activities = [];
151
- const modelName = `${request.model.provider}/${request.model.id}`;
152
- const details = (status, error) => ({
153
- version: 1,
154
- taskId: control.id,
155
- status,
156
- model: modelName,
157
- thinking: request.thinking,
158
- ...(error ? { error } : {}),
159
- activities: structuredClone(activities),
160
- });
161
- const publish = () => {
162
- control.publish({
163
- content: [{ type: "text", text: activities.length ? activitiesText(activities) : "Starting Agent…" }],
164
- details: details("running"),
165
- usage,
166
- });
167
- };
168
- const abort = () => {
169
- void session?.abort().catch(() => { });
170
- };
171
- signal.addEventListener("abort", abort, { once: true });
172
- try {
173
- const options = await raceWithAbortSignal(prepareWorkerSession(request, signal), signal);
174
- signal.throwIfAborted();
175
- // Adopt an actual session before checking cancellation; never race away its cleanup handle.
176
- const created = await createAgentSession(options);
177
- session = created.session;
178
- signal.throwIfAborted();
179
- unsubscribe = session.subscribe((event) => {
180
- // Cancellation during prompt preflight can precede the run's own abort controller.
181
- if (event.type === "agent_start" && signal.aborted) {
182
- abort();
183
- return;
184
- }
185
- if (event.type === "message_end" && event.message.role === "assistant") {
186
- lastMessage = event.message;
187
- if (!seen.has(event.message)) {
188
- seen.add(event.message);
189
- usage = combineUsage(usage, event.message.usage);
190
- }
191
- return;
192
- }
193
- if (event.type === "compaction_end" && event.result?.usage) {
194
- usage = combineUsage(usage, event.result.usage);
195
- return;
196
- }
197
- if (event.type === "tool_execution_start") {
198
- activities.push({
199
- id: event.toolCallId,
200
- name: event.toolName,
201
- args: compactArguments(event.args),
202
- target: activityTarget(event.toolName, event.args),
203
- status: "running",
204
- });
205
- if (activities.length > AGENT_MAX_ACTIVITIES)
206
- activities.shift();
207
- }
208
- else if (event.type === "tool_execution_end") {
209
- const activity = activities.findLast((item) => item.id === event.toolCallId);
210
- if (!activity)
211
- return;
212
- activity.status = signal.aborted ? "cancelled" : event.isError ? "error" : "ok";
213
- activity.durationMs = event.durationMs;
214
- if (event.isError) {
215
- const result = event.result;
216
- activity.error = clipText(result.content
217
- ?.filter((block) => block.type === "text")
218
- .map((block) => block.text ?? "")
219
- .join("\n") || "Tool call failed.", 1000);
220
- }
221
- }
222
- else
223
- return;
224
- publish();
225
- });
226
- publish();
227
- control.accept();
228
- signal.throwIfAborted();
229
- await session.prompt(request.prompt, { expandPromptTemplates: false });
230
- const report = finalAssistantText(session.messages);
231
- const status = signal.aborted || lastMessage?.stopReason === "aborted"
232
- ? "cancelled"
233
- : !lastMessage || lastMessage.stopReason === "error" || lastMessage.stopReason === "length"
234
- ? "failed"
235
- : "completed";
236
- const error = status === "cancelled"
237
- ? "Agent cancelled."
238
- : status === "failed"
239
- ? errorText(lastMessage?.errorMessage || "Agent ended without a complete report.")
240
- : undefined;
241
- return {
242
- status,
243
- error,
244
- usage,
245
- result: {
246
- content: [{ type: "text", text: await finalText(control, report, error) }],
247
- details: details(status, error),
248
- ...(status === "completed" ? {} : { isError: true }),
249
- },
250
- };
251
- }
252
- catch (error) {
253
- const status = signal.aborted ? "cancelled" : "failed";
254
- const reason = status === "cancelled" ? "Agent cancelled." : errorText(error);
255
- const report = session ? finalAssistantText(session.messages) : "";
256
- return {
257
- status,
258
- error: reason,
259
- usage,
260
- result: {
261
- content: [{ type: "text", text: await finalText(control, report, reason) }],
262
- details: details(status, reason),
263
- isError: true,
264
- },
265
- };
266
- }
267
- finally {
268
- signal.removeEventListener("abort", abort);
269
- unsubscribe?.();
270
- session?.dispose();
271
- release();
272
- }
273
- }
274
- //# sourceMappingURL=runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/extensions/agent/runner.ts"],"names":[],"mappings":"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","sourcesContent":["import { unlink } from \"node:fs/promises\";\nimport type { AgentMessage, ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Model, Usage } from \"@earendil-works/pi-ai/compat\";\nimport { getAgentDir } from \"../../config.ts\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { ModelRuntime } from \"../../core/model-runtime.ts\";\nimport { DefaultResourceLoader } from \"../../core/resource-loader.ts\";\nimport { type CreateAgentSessionOptions, createAgentSession } from \"../../core/sdk.ts\";\nimport { SessionManager } from \"../../core/session-manager.ts\";\nimport { SettingsManager } from \"../../core/settings-manager.ts\";\nimport type { TaskCompletion, TaskControl, TaskTerminalStatus } from \"../../core/tasks/types.ts\";\nimport { combineUsage } from \"../../core/usage-totals.ts\";\nimport { raceWithAbortSignal } from \"../../utils/abort.ts\";\nimport { writeOutputFile } from \"../../utils/output-files.ts\";\nimport {\n\tactivitiesText,\n\tactivityTarget,\n\tboundedAgentText,\n\tclipText,\n\tcompactArguments,\n\tfinalAssistantText,\n} from \"./activity.ts\";\nimport {\n\tAGENT_MAX_ACTIVITIES,\n\tAGENT_REPORT_BYTES,\n\ttype AgentActivity,\n\ttype AgentToolDetails,\n\temptyUsage,\n} from \"./types.ts\";\n\nconst AGENT_TOOLS = [\"read\", \"bash\", \"edit\", \"write\"];\n\n/** One small session-local queue; Tasks owns the visible queued/running state. */\nexport class AgentGate {\n\tprivate active = 0;\n\tprivate readonly limit: number;\n\tprivate readonly waiting: Array<{\n\t\tsignal: AbortSignal;\n\t\tabort(): void;\n\t\tenter(): void;\n\t}> = [];\n\n\tconstructor(limit = 4) {\n\t\tthis.limit = limit;\n\t}\n\n\tacquire(signal: AbortSignal): Promise<() => void> {\n\t\tif (signal.aborted) return Promise.reject(signal.reason ?? new Error(\"Agent cancelled while queued.\"));\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet settled = false;\n\t\t\tlet released = false;\n\t\t\tconst release = () => {\n\t\t\t\tif (released) return;\n\t\t\t\treleased = true;\n\t\t\t\tthis.active--;\n\t\t\t\tthis.next();\n\t\t\t};\n\t\t\tconst waiter = {\n\t\t\t\tsignal,\n\t\t\t\tabort: () => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tconst index = this.waiting.indexOf(waiter);\n\t\t\t\t\tif (index >= 0) this.waiting.splice(index, 1);\n\t\t\t\t\tsignal.removeEventListener(\"abort\", waiter.abort);\n\t\t\t\t\treject(signal.reason ?? new Error(\"Agent cancelled while queued.\"));\n\t\t\t\t},\n\t\t\t\tenter: () => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tsignal.removeEventListener(\"abort\", waiter.abort);\n\t\t\t\t\tthis.active++;\n\t\t\t\t\tresolve(release);\n\t\t\t\t},\n\t\t\t};\n\t\t\tsignal.addEventListener(\"abort\", waiter.abort, { once: true });\n\t\t\tif (this.active < this.limit) waiter.enter();\n\t\t\telse this.waiting.push(waiter);\n\t\t});\n\t}\n\n\tprivate next(): void {\n\t\tconst waiter = this.waiting.shift();\n\t\tif (!waiter) return;\n\t\tif (waiter.signal.aborted) {\n\t\t\twaiter.abort();\n\t\t\tthis.next();\n\t\t} else waiter.enter();\n\t}\n}\n\nexport interface AgentRequest {\n\tprompt: string;\n\tcwd: string;\n\tmodel: Model<any>;\n\tthinking: ThinkingLevel;\n\tmodelRuntime: ModelRuntime;\n\tprojectTrusted: boolean;\n}\n\nfunction workerPrompt(base: string | undefined): string {\n\treturn [\n\t\tbase,\n\t\t\"You are an Agent working independently on one delegated task.\",\n\t\t\"You cannot see the parent conversation. Treat the parent Agent as your caller, rely on the task briefing and available workspace context, and do not ask the end user questions. If anything is unclear, explain the ambiguity in your final report.\",\n\t\t\"Work in the assigned directory and stay within the requested scope. Use read for known-path file reads and bash for file discovery, search, and shell commands.\",\n\t\t\"Do not delegate or start background work. Run required commands in the foreground and wait for them.\",\n\t\t\"Only your final report returns to the caller. Make it self-contained: include essential findings or changes, verification when applicable, blockers, and unresolved risks; omit process narration.\",\n\t]\n\t\t.filter((part): part is string => Boolean(part?.trim()))\n\t\t.join(\"\\n\\n\");\n}\n\nfunction errorText(error: unknown): string {\n\treturn clipText(error instanceof Error ? error.message : String(error), 4096);\n}\n\nasync function removeOutputFile(path: string): Promise<void> {\n\tawait unlink(path).catch((error: NodeJS.ErrnoException) => {\n\t\tif (error.code !== \"ENOENT\") throw error;\n\t});\n}\n\nasync function finalText(\n\tcontrol: TaskControl<AgentToolDetails>,\n\treport: string,\n\terror: string | undefined,\n): Promise<string> {\n\tconst text = !report ? (error ?? \"No report returned.\") : error ? `${report}\\n\\nError: ${error}` : report;\n\tif (Buffer.byteLength(text) <= AGENT_REPORT_BYTES) return text;\n\tlet path: string | undefined;\n\ttry {\n\t\tpath = await writeOutputFile(\"pi-agent\", \".md\", text);\n\t\tcontrol.setOutputPath(path, () => removeOutputFile(path!));\n\t\treturn boundedAgentText(text, AGENT_REPORT_BYTES, path);\n\t} catch {\n\t\tif (path) await removeOutputFile(path).catch(() => {});\n\t\treturn boundedAgentText(text);\n\t}\n}\n\nasync function prepareWorkerSession(request: AgentRequest, signal: AbortSignal): Promise<CreateAgentSessionOptions> {\n\tsignal.throwIfAborted();\n\tconst agentDir = getAgentDir();\n\tconst source = SettingsManager.create(request.cwd, agentDir, { projectTrusted: request.projectTrusted });\n\tconst loader = new DefaultResourceLoader({\n\t\tcwd: request.cwd,\n\t\tagentDir,\n\t\tsettingsManager: source,\n\t\tnoExtensions: true,\n\t\tnoSkills: true,\n\t\tnoPromptTemplates: true,\n\t\tnoThemes: true,\n\t\tsystemPromptOverride: workerPrompt,\n\t});\n\tawait loader.reload();\n\tsignal.throwIfAborted();\n\t// Resource discovery can reload its source; execution owns a detached snapshot, never that source.\n\tconst settingsManager = SettingsManager.inMemory(\n\t\t{ ...source.getGlobalSettings(), cacheWarming: \"off\" },\n\t\t{ projectTrusted: request.projectTrusted },\n\t);\n\tsettingsManager.applyOverrides(source.getProjectSettings());\n\treturn {\n\t\tcwd: request.cwd,\n\t\tagentDir,\n\t\tmodelRuntime: request.modelRuntime,\n\t\tmodel: request.model,\n\t\tthinkingLevel: request.thinking,\n\t\tbackgroundAllowed: false,\n\t\tresourceLoader: loader,\n\t\tsettingsManager,\n\t\tsessionManager: SessionManager.inMemory(request.cwd),\n\t\ttools: AGENT_TOOLS,\n\t};\n}\n\nexport async function runAgent(\n\tcontrol: TaskControl<AgentToolDetails>,\n\trequest: AgentRequest,\n\tgate: AgentGate,\n): Promise<TaskCompletion<AgentToolDetails>> {\n\tconst { signal } = control;\n\tconst release = await gate.acquire(signal);\n\tlet session: AgentSession | undefined;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet usage: Usage = emptyUsage();\n\tlet lastMessage: Extract<AgentMessage, { role: \"assistant\" }> | undefined;\n\tconst seen = new WeakSet<AgentMessage>();\n\tconst activities: AgentActivity[] = [];\n\tconst modelName = `${request.model.provider}/${request.model.id}`;\n\tconst details = (status: AgentToolDetails[\"status\"], error?: string): AgentToolDetails => ({\n\t\tversion: 1,\n\t\ttaskId: control.id,\n\t\tstatus,\n\t\tmodel: modelName,\n\t\tthinking: request.thinking,\n\t\t...(error ? { error } : {}),\n\t\tactivities: structuredClone(activities),\n\t});\n\tconst publish = () => {\n\t\tcontrol.publish({\n\t\t\tcontent: [{ type: \"text\", text: activities.length ? activitiesText(activities) : \"Starting Agent…\" }],\n\t\t\tdetails: details(\"running\"),\n\t\t\tusage,\n\t\t});\n\t};\n\tconst abort = () => {\n\t\tvoid session?.abort().catch(() => {});\n\t};\n\tsignal.addEventListener(\"abort\", abort, { once: true });\n\ttry {\n\t\tconst options = await raceWithAbortSignal(prepareWorkerSession(request, signal), signal);\n\t\tsignal.throwIfAborted();\n\t\t// Adopt an actual session before checking cancellation; never race away its cleanup handle.\n\t\tconst created = await createAgentSession(options);\n\t\tsession = created.session;\n\t\tsignal.throwIfAborted();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\t// Cancellation during prompt preflight can precede the run's own abort controller.\n\t\t\tif (event.type === \"agent_start\" && signal.aborted) {\n\t\t\t\tabort();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\tlastMessage = event.message;\n\t\t\t\tif (!seen.has(event.message)) {\n\t\t\t\t\tseen.add(event.message);\n\t\t\t\t\tusage = combineUsage(usage, event.message.usage);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"compaction_end\" && event.result?.usage) {\n\t\t\t\tusage = combineUsage(usage, event.result.usage);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\tactivities.push({\n\t\t\t\t\tid: event.toolCallId,\n\t\t\t\t\tname: event.toolName,\n\t\t\t\t\targs: compactArguments(event.args),\n\t\t\t\t\ttarget: activityTarget(event.toolName, event.args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t});\n\t\t\t\tif (activities.length > AGENT_MAX_ACTIVITIES) activities.shift();\n\t\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\t\tconst activity = activities.findLast((item) => item.id === event.toolCallId);\n\t\t\t\tif (!activity) return;\n\t\t\t\tactivity.status = signal.aborted ? \"cancelled\" : event.isError ? \"error\" : \"ok\";\n\t\t\t\tactivity.durationMs = event.durationMs;\n\t\t\t\tif (event.isError) {\n\t\t\t\t\tconst result = event.result as { content?: Array<{ type: string; text?: string }> };\n\t\t\t\t\tactivity.error = clipText(\n\t\t\t\t\t\tresult.content\n\t\t\t\t\t\t\t?.filter((block) => block.type === \"text\")\n\t\t\t\t\t\t\t.map((block) => block.text ?? \"\")\n\t\t\t\t\t\t\t.join(\"\\n\") || \"Tool call failed.\",\n\t\t\t\t\t\t1000,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else return;\n\t\t\tpublish();\n\t\t});\n\t\tpublish();\n\t\tcontrol.accept();\n\t\tsignal.throwIfAborted();\n\t\tawait session.prompt(request.prompt, { expandPromptTemplates: false });\n\t\tconst report = finalAssistantText(session.messages);\n\t\tconst status: TaskTerminalStatus =\n\t\t\tsignal.aborted || lastMessage?.stopReason === \"aborted\"\n\t\t\t\t? \"cancelled\"\n\t\t\t\t: !lastMessage || lastMessage.stopReason === \"error\" || lastMessage.stopReason === \"length\"\n\t\t\t\t\t? \"failed\"\n\t\t\t\t\t: \"completed\";\n\t\tconst error =\n\t\t\tstatus === \"cancelled\"\n\t\t\t\t? \"Agent cancelled.\"\n\t\t\t\t: status === \"failed\"\n\t\t\t\t\t? errorText(lastMessage?.errorMessage || \"Agent ended without a complete report.\")\n\t\t\t\t\t: undefined;\n\t\treturn {\n\t\t\tstatus,\n\t\t\terror,\n\t\t\tusage,\n\t\t\tresult: {\n\t\t\t\tcontent: [{ type: \"text\", text: await finalText(control, report, error) }],\n\t\t\t\tdetails: details(status, error),\n\t\t\t\t...(status === \"completed\" ? {} : { isError: true }),\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tconst status: TaskTerminalStatus = signal.aborted ? \"cancelled\" : \"failed\";\n\t\tconst reason = status === \"cancelled\" ? \"Agent cancelled.\" : errorText(error);\n\t\tconst report = session ? finalAssistantText(session.messages) : \"\";\n\t\treturn {\n\t\t\tstatus,\n\t\t\terror: reason,\n\t\t\tusage,\n\t\t\tresult: {\n\t\t\t\tcontent: [{ type: \"text\", text: await finalText(control, report, reason) }],\n\t\t\t\tdetails: details(status, reason),\n\t\t\t\tisError: true,\n\t\t\t},\n\t\t};\n\t} finally {\n\t\tsignal.removeEventListener(\"abort\", abort);\n\t\tunsubscribe?.();\n\t\tsession?.dispose();\n\t\trelease();\n\t}\n}\n"]}
@@ -1,13 +0,0 @@
1
- export declare const DEEPWIKI_RESPONSE_BODY_BYTES: number;
2
- export interface FetchRetryOptions {
3
- timeoutMs: number;
4
- retries?: number;
5
- signal?: AbortSignal;
6
- label?: string;
7
- }
8
- /** Fetch with a per-attempt timeout and bounded retries for transient failures. */
9
- export declare function fetchWithRetry(url: string, request: RequestInit, options: FetchRetryOptions): Promise<{
10
- response: Response;
11
- text: string;
12
- }>;
13
- //# sourceMappingURL=http.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/extensions/deepwiki/http.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,QAAkB,CAAC;AAG5D,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAkED,mFAAmF;AACnF,wBAAsB,cAAc,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB/C"}
@@ -1,88 +0,0 @@
1
- import { readResponseTextBounded } from "../../utils/http-response.js";
2
- export const DEEPWIKI_RESPONSE_BODY_BYTES = 8 * 1024 * 1024;
3
- const DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE = `DeepWiki response exceeded ${DEEPWIKI_RESPONSE_BODY_BYTES} bytes`;
4
- function delay(milliseconds, label, signal) {
5
- return new Promise((resolve, reject) => {
6
- const handleAbort = () => {
7
- cleanup();
8
- reject(new Error(`${label} request aborted`));
9
- };
10
- const timer = setTimeout(() => {
11
- cleanup();
12
- resolve();
13
- }, milliseconds);
14
- const cleanup = () => {
15
- clearTimeout(timer);
16
- signal?.removeEventListener("abort", handleAbort);
17
- };
18
- if (signal?.aborted) {
19
- handleAbort();
20
- return;
21
- }
22
- signal?.addEventListener("abort", handleAbort, { once: true });
23
- });
24
- }
25
- async function attemptOnce(url, request, timeoutMs, label, signal) {
26
- const controller = new AbortController();
27
- let timedOut = false;
28
- const abortFromParent = () => controller.abort(signal?.reason);
29
- const timeout = setTimeout(() => {
30
- timedOut = true;
31
- controller.abort();
32
- }, timeoutMs);
33
- if (signal?.aborted)
34
- abortFromParent();
35
- else
36
- signal?.addEventListener("abort", abortFromParent, { once: true });
37
- try {
38
- const response = await fetch(url, { ...request, signal: controller.signal });
39
- const text = await readResponseTextBounded(response, {
40
- maxBytes: DEEPWIKI_RESPONSE_BODY_BYTES,
41
- overflowMessage: DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,
42
- signal: controller.signal,
43
- });
44
- return { ok: true, response, text };
45
- }
46
- catch (error) {
47
- if (timedOut)
48
- throw new Error(`${label} request timed out after ${timeoutMs / 1000}s`);
49
- if (signal?.aborted)
50
- throw new Error(`${label} request aborted`);
51
- const normalizedError = error instanceof Error ? error : new Error(String(error));
52
- return {
53
- ok: false,
54
- error: normalizedError,
55
- retryable: normalizedError.message !== DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,
56
- };
57
- }
58
- finally {
59
- clearTimeout(timeout);
60
- signal?.removeEventListener("abort", abortFromParent);
61
- }
62
- }
63
- /** Fetch with a per-attempt timeout and bounded retries for transient failures. */
64
- export async function fetchWithRetry(url, request, options) {
65
- const retries = options.retries ?? 2;
66
- const label = options.label ?? "HTTP";
67
- let lastError;
68
- for (let attemptIndex = 0; attemptIndex <= retries; attemptIndex++) {
69
- if (attemptIndex > 0)
70
- await delay(1000 * attemptIndex, label, options.signal);
71
- const outcome = await attemptOnce(url, request, options.timeoutMs, label, options.signal);
72
- if (!outcome.ok) {
73
- lastError = outcome.error;
74
- if (!outcome.retryable)
75
- throw outcome.error;
76
- continue;
77
- }
78
- const { response, text } = outcome;
79
- const retryable = response.status >= 500 || response.status === 429;
80
- if (!response.ok && retryable && attemptIndex < retries) {
81
- lastError = new Error(`${label} HTTP ${response.status}`);
82
- continue;
83
- }
84
- return { response, text };
85
- }
86
- throw lastError ?? new Error(`${label} request failed`);
87
- }
88
- //# sourceMappingURL=http.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/extensions/deepwiki/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { readResponseTextBounded } from \"../../utils/http-response.ts\";\n\nexport const DEEPWIKI_RESPONSE_BODY_BYTES = 8 * 1024 * 1024;\nconst DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE = `DeepWiki response exceeded ${DEEPWIKI_RESPONSE_BODY_BYTES} bytes`;\n\nexport interface FetchRetryOptions {\n\ttimeoutMs: number;\n\tretries?: number;\n\tsignal?: AbortSignal;\n\tlabel?: string;\n}\n\nfunction delay(milliseconds: number, label: string, signal: AbortSignal | undefined): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst handleAbort = () => {\n\t\t\tcleanup();\n\t\t\treject(new Error(`${label} request aborted`));\n\t\t};\n\t\tconst timer = setTimeout(() => {\n\t\t\tcleanup();\n\t\t\tresolve();\n\t\t}, milliseconds);\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timer);\n\t\t\tsignal?.removeEventListener(\"abort\", handleAbort);\n\t\t};\n\n\t\tif (signal?.aborted) {\n\t\t\thandleAbort();\n\t\t\treturn;\n\t\t}\n\t\tsignal?.addEventListener(\"abort\", handleAbort, { once: true });\n\t});\n}\n\nasync function attemptOnce(\n\turl: string,\n\trequest: RequestInit,\n\ttimeoutMs: number,\n\tlabel: string,\n\tsignal: AbortSignal | undefined,\n): Promise<{ ok: true; response: Response; text: string } | { ok: false; error: Error; retryable: boolean }> {\n\tconst controller = new AbortController();\n\tlet timedOut = false;\n\tconst abortFromParent = () => controller.abort(signal?.reason);\n\tconst timeout = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\n\tif (signal?.aborted) abortFromParent();\n\telse signal?.addEventListener(\"abort\", abortFromParent, { once: true });\n\n\ttry {\n\t\tconst response = await fetch(url, { ...request, signal: controller.signal });\n\t\tconst text = await readResponseTextBounded(response, {\n\t\t\tmaxBytes: DEEPWIKI_RESPONSE_BODY_BYTES,\n\t\t\toverflowMessage: DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\treturn { ok: true, response, text };\n\t} catch (error) {\n\t\tif (timedOut) throw new Error(`${label} request timed out after ${timeoutMs / 1000}s`);\n\t\tif (signal?.aborted) throw new Error(`${label} request aborted`);\n\t\tconst normalizedError = error instanceof Error ? error : new Error(String(error));\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror: normalizedError,\n\t\t\tretryable: normalizedError.message !== DEEPWIKI_RESPONSE_OVERFLOW_MESSAGE,\n\t\t};\n\t} finally {\n\t\tclearTimeout(timeout);\n\t\tsignal?.removeEventListener(\"abort\", abortFromParent);\n\t}\n}\n\n/** Fetch with a per-attempt timeout and bounded retries for transient failures. */\nexport async function fetchWithRetry(\n\turl: string,\n\trequest: RequestInit,\n\toptions: FetchRetryOptions,\n): Promise<{ response: Response; text: string }> {\n\tconst retries = options.retries ?? 2;\n\tconst label = options.label ?? \"HTTP\";\n\tlet lastError: Error | undefined;\n\n\tfor (let attemptIndex = 0; attemptIndex <= retries; attemptIndex++) {\n\t\tif (attemptIndex > 0) await delay(1000 * attemptIndex, label, options.signal);\n\t\tconst outcome = await attemptOnce(url, request, options.timeoutMs, label, options.signal);\n\t\tif (!outcome.ok) {\n\t\t\tlastError = outcome.error;\n\t\t\tif (!outcome.retryable) throw outcome.error;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { response, text } = outcome;\n\t\tconst retryable = response.status >= 500 || response.status === 429;\n\t\tif (!response.ok && retryable && attemptIndex < retries) {\n\t\t\tlastError = new Error(`${label} HTTP ${response.status}`);\n\t\t\tcontinue;\n\t\t}\n\t\treturn { response, text };\n\t}\n\n\tthrow lastError ?? new Error(`${label} request failed`);\n}\n"]}