@agimon-ai/doompi-task 0.0.1-alpha.9 → 0.0.1-alpha.91

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 (383) hide show
  1. package/README.md +123 -15
  2. package/dist/apiContracts.cjs +54 -0
  3. package/dist/apiContracts.cjs.map +1 -0
  4. package/dist/apiContracts.d.mts +53 -0
  5. package/dist/apiContracts.d.mts.map +1 -0
  6. package/dist/apiContracts.mjs +49 -0
  7. package/dist/apiContracts.mjs.map +1 -0
  8. package/dist/commands.cjs +4 -2
  9. package/dist/commands.d.mts +12 -6
  10. package/dist/commands.d.mts.map +1 -1
  11. package/dist/commands.mjs +2 -2
  12. package/dist/config-BPNE_wEU.cjs +173 -0
  13. package/dist/config-BPNE_wEU.cjs.map +1 -0
  14. package/dist/config-DmsCPDuF.mjs +72 -0
  15. package/dist/config-DmsCPDuF.mjs.map +1 -0
  16. package/dist/config.cjs +19 -2
  17. package/dist/config.d.mts +2 -38
  18. package/dist/config.mjs +2 -2
  19. package/dist/delegation-3hMdTFXF.cjs +661 -0
  20. package/dist/delegation-3hMdTFXF.cjs.map +1 -0
  21. package/dist/delegation-BiOy3_7g.mjs +7 -0
  22. package/dist/delegation-BiOy3_7g.mjs.map +1 -0
  23. package/dist/delegation-CkGbRaOl.mjs +626 -0
  24. package/dist/delegation-CkGbRaOl.mjs.map +1 -0
  25. package/dist/delegation-LDpHP2CC.cjs +12 -0
  26. package/dist/delegation-LDpHP2CC.cjs.map +1 -0
  27. package/dist/delegation-Ot2xltLi.d.mts +6 -0
  28. package/dist/delegation-Ot2xltLi.d.mts.map +1 -0
  29. package/dist/delegationManager.cjs +10 -0
  30. package/dist/delegationManager.d.mts +3 -0
  31. package/dist/delegationManager.mjs +3 -0
  32. package/dist/delegationPlatform-Cfn-Lqew.cjs +95 -0
  33. package/dist/delegationPlatform-Cfn-Lqew.cjs.map +1 -0
  34. package/dist/delegationPlatform-DZ4SZ8a5.mjs +64 -0
  35. package/dist/delegationPlatform-DZ4SZ8a5.mjs.map +1 -0
  36. package/dist/extensions/mcp-ui.mjs +23 -0
  37. package/dist/extensions/mcp-ui.mjs.map +1 -0
  38. package/dist/extensions/mcp.cjs +1876 -0
  39. package/dist/extensions/mcp.cjs.map +1 -0
  40. package/dist/extensions/mcp.d.mts +5 -0
  41. package/dist/extensions/mcp.d.mts.map +1 -0
  42. package/dist/extensions/mcp.mjs +1846 -0
  43. package/dist/extensions/mcp.mjs.map +1 -0
  44. package/dist/extensions/pi.cjs +437 -1
  45. package/dist/extensions/pi.cjs.map +1 -1
  46. package/dist/extensions/pi.d.mts +5 -2
  47. package/dist/extensions/pi.d.mts.map +1 -0
  48. package/dist/extensions/pi.mjs +432 -1
  49. package/dist/extensions/pi.mjs.map +1 -1
  50. package/dist/extensions/server.cjs +380 -0
  51. package/dist/extensions/server.cjs.map +1 -0
  52. package/dist/extensions/server.d.mts +5 -0
  53. package/dist/extensions/server.d.mts.map +1 -0
  54. package/dist/extensions/server.mjs +375 -0
  55. package/dist/extensions/server.mjs.map +1 -0
  56. package/dist/extensions/web.mjs +1013 -0
  57. package/dist/extensions/web.mjs.map +1 -0
  58. package/dist/format.cli-ChQsP1MQ.cjs +393 -0
  59. package/dist/format.cli-ChQsP1MQ.cjs.map +1 -0
  60. package/dist/format.cli-Cnc591eb.mjs +322 -0
  61. package/dist/format.cli-Cnc591eb.mjs.map +1 -0
  62. package/dist/{delegation/manager.d.cts → index-3-3ZJlaH.d.mts} +42 -39
  63. package/dist/index-3-3ZJlaH.d.mts.map +1 -0
  64. package/dist/{store/taskStore.d.cts → index-B7oVjSey.d.mts} +16 -23
  65. package/dist/index-B7oVjSey.d.mts.map +1 -0
  66. package/dist/{store/reconcile.d.cts → index-BNMm9g0K.d.mts} +4 -4
  67. package/dist/index-BNMm9g0K.d.mts.map +1 -0
  68. package/dist/{tool/responseEnvelope.d.cts → index-C3DgOhEm.d.mts} +17 -5
  69. package/dist/index-C3DgOhEm.d.mts.map +1 -0
  70. package/dist/{config.d.cts → index-D4goIk4Z.d.mts} +8 -3
  71. package/dist/index-D4goIk4Z.d.mts.map +1 -0
  72. package/dist/{store/reducer.d.mts → index-DIpc6_uJ.d.mts} +5 -5
  73. package/dist/index-DIpc6_uJ.d.mts.map +1 -0
  74. package/dist/{store/paths.d.cts → index-XY9VPmfm.d.mts} +9 -6
  75. package/dist/index-XY9VPmfm.d.mts.map +1 -0
  76. package/dist/index.cjs +106 -1
  77. package/dist/index.d.mts +16 -15
  78. package/dist/index.mjs +16 -1
  79. package/dist/invariants-DhjEjBPU.cjs +79 -0
  80. package/dist/invariants-DhjEjBPU.cjs.map +1 -0
  81. package/dist/invariants-q_UamF7D.mjs +62 -0
  82. package/dist/invariants-q_UamF7D.mjs.map +1 -0
  83. package/dist/logSinkTelemetry-C5QjZipw.mjs +41 -0
  84. package/dist/logSinkTelemetry-C5QjZipw.mjs.map +1 -0
  85. package/dist/logSinkTelemetry-CqiTuh3a.cjs +52 -0
  86. package/dist/logSinkTelemetry-CqiTuh3a.cjs.map +1 -0
  87. package/dist/logSinkTelemetry.cjs +6 -2
  88. package/dist/logSinkTelemetry.d.mts +7 -35
  89. package/dist/logSinkTelemetry.d.mts.map +1 -1
  90. package/dist/logSinkTelemetry.mjs +3 -2
  91. package/dist/paths-Bg8EEbk1.mjs +218 -0
  92. package/dist/paths-Bg8EEbk1.mjs.map +1 -0
  93. package/dist/paths-BsFVRulr.cjs +320 -0
  94. package/dist/paths-BsFVRulr.cjs.map +1 -0
  95. package/dist/processLiveness-Ccd9wenT.mjs +20 -0
  96. package/dist/processLiveness-Ccd9wenT.mjs.map +1 -0
  97. package/dist/processLiveness-umpNgsPR.cjs +25 -0
  98. package/dist/processLiveness-umpNgsPR.cjs.map +1 -0
  99. package/dist/promptGuidelines-DaxWrqud.d.mts +14 -0
  100. package/dist/promptGuidelines-DaxWrqud.d.mts.map +1 -0
  101. package/dist/promptGuidelines-g4QT8GNM.mjs +26 -0
  102. package/dist/promptGuidelines-g4QT8GNM.mjs.map +1 -0
  103. package/dist/promptGuidelines-j_SZTzlH.cjs +31 -0
  104. package/dist/promptGuidelines-j_SZTzlH.cjs.map +1 -0
  105. package/dist/reconcile-BcD-hTbd.mjs +63 -0
  106. package/dist/reconcile-BcD-hTbd.mjs.map +1 -0
  107. package/dist/reconcile-cRL0NjDr.cjs +80 -0
  108. package/dist/reconcile-cRL0NjDr.cjs.map +1 -0
  109. package/dist/reducer-BEfJFM5L.mjs +345 -0
  110. package/dist/reducer-BEfJFM5L.mjs.map +1 -0
  111. package/dist/reducer-BV0YIZ2o.cjs +380 -0
  112. package/dist/reducer-BV0YIZ2o.cjs.map +1 -0
  113. package/dist/root.cli-swHZqusx.d.mts +56 -0
  114. package/dist/root.cli-swHZqusx.d.mts.map +1 -0
  115. package/dist/selectors-BaS6dObz.mjs +142 -0
  116. package/dist/selectors-BaS6dObz.mjs.map +1 -0
  117. package/dist/{tui/selectors.d.cts → selectors-DPDPPjH3.d.mts} +11 -4
  118. package/dist/selectors-DPDPPjH3.d.mts.map +1 -0
  119. package/dist/selectors-b-69vb4W.cjs +189 -0
  120. package/dist/selectors-b-69vb4W.cjs.map +1 -0
  121. package/dist/storeInvariants.cjs +5 -0
  122. package/dist/storeInvariants.d.mts +23 -0
  123. package/dist/storeInvariants.d.mts.map +1 -0
  124. package/dist/storeInvariants.mjs +2 -0
  125. package/dist/storePaths.cjs +14 -0
  126. package/dist/storePaths.d.mts +2 -0
  127. package/dist/storePaths.mjs +2 -0
  128. package/dist/storeProcessLiveness.cjs +3 -0
  129. package/dist/{store/processLiveness.d.mts → storeProcessLiveness.d.mts} +3 -4
  130. package/dist/storeProcessLiveness.d.mts.map +1 -0
  131. package/dist/storeProcessLiveness.mjs +2 -0
  132. package/dist/storeReconcile.cjs +5 -0
  133. package/dist/storeReconcile.d.mts +2 -0
  134. package/dist/storeReconcile.mjs +2 -0
  135. package/dist/storeReducer.cjs +8 -0
  136. package/dist/storeReducer.d.mts +2 -0
  137. package/dist/storeReducer.mjs +2 -0
  138. package/dist/storeTaskGraph.cjs +7 -0
  139. package/dist/storeTaskGraph.d.mts +2 -0
  140. package/dist/storeTaskGraph.mjs +2 -0
  141. package/dist/storeTaskStore.cjs +3 -0
  142. package/dist/storeTaskStore.d.mts +2 -0
  143. package/dist/storeTaskStore.mjs +2 -0
  144. package/dist/storeTypes.cjs +6 -0
  145. package/dist/storeTypes.d.mts +2 -0
  146. package/dist/storeTypes.mjs +2 -0
  147. package/dist/task-B4aF5J9s.mjs +6 -0
  148. package/dist/task-B4aF5J9s.mjs.map +1 -0
  149. package/dist/task-CXF9VULl.cjs +49 -0
  150. package/dist/task-CXF9VULl.cjs.map +1 -0
  151. package/dist/task-CkFjC3Fo.d.mts +5 -0
  152. package/dist/task-CkFjC3Fo.d.mts.map +1 -0
  153. package/dist/{tool/schema.d.cts → task-DHSvdK6E.d.mts} +34 -18
  154. package/dist/task-DHSvdK6E.d.mts.map +1 -0
  155. package/dist/task-DKHKuems.mjs +116 -0
  156. package/dist/task-DKHKuems.mjs.map +1 -0
  157. package/dist/task-DaagqdPK.cjs +11 -0
  158. package/dist/task-DaagqdPK.cjs.map +1 -0
  159. package/dist/task-Dqy88_rr.cjs +193 -0
  160. package/dist/task-Dqy88_rr.cjs.map +1 -0
  161. package/dist/task-giCbpKzV.mjs +26 -0
  162. package/dist/task-giCbpKzV.mjs.map +1 -0
  163. package/dist/{store/types.d.mts → task-hLh4BOO7.d.mts} +37 -15
  164. package/dist/task-hLh4BOO7.d.mts.map +1 -0
  165. package/dist/task-space.cli-BH4Iy_7m.cjs +372 -0
  166. package/dist/task-space.cli-BH4Iy_7m.cjs.map +1 -0
  167. package/dist/task-space.cli-CMYNjgOW.mjs +355 -0
  168. package/dist/task-space.cli-CMYNjgOW.mjs.map +1 -0
  169. package/dist/task.cli-BM34E7GG.mjs +157 -0
  170. package/dist/task.cli-BM34E7GG.mjs.map +1 -0
  171. package/dist/task.cli-CiTkjUaX.cjs +174 -0
  172. package/dist/task.cli-CiTkjUaX.cjs.map +1 -0
  173. package/dist/taskGraph-BOQvT0-M.mjs +63 -0
  174. package/dist/taskGraph-BOQvT0-M.mjs.map +1 -0
  175. package/dist/taskGraph-BskRslrr.cjs +92 -0
  176. package/dist/taskGraph-BskRslrr.cjs.map +1 -0
  177. package/dist/{store/taskGraph.d.cts → taskGraph-YQXCfXTn.d.mts} +4 -4
  178. package/dist/taskGraph-YQXCfXTn.d.mts.map +1 -0
  179. package/dist/taskOverlay-B5wJHiml.cjs +175 -0
  180. package/dist/taskOverlay-B5wJHiml.cjs.map +1 -0
  181. package/dist/taskOverlay-CljDoTj_.mjs +164 -0
  182. package/dist/taskOverlay-CljDoTj_.mjs.map +1 -0
  183. package/dist/taskResult-D2G7b4w-.cjs +224 -0
  184. package/dist/taskResult-D2G7b4w-.cjs.map +1 -0
  185. package/dist/taskResult-edBAAKSH.mjs +165 -0
  186. package/dist/taskResult-edBAAKSH.mjs.map +1 -0
  187. package/dist/taskStore-CFx12KJk.mjs +213 -0
  188. package/dist/taskStore-CFx12KJk.mjs.map +1 -0
  189. package/dist/taskStore-T1pPy-UJ.cjs +220 -0
  190. package/dist/taskStore-T1pPy-UJ.cjs.map +1 -0
  191. package/dist/tasks.cli-8VvuN9YQ.cjs +40 -0
  192. package/dist/tasks.cli-8VvuN9YQ.cjs.map +1 -0
  193. package/dist/tasks.cli-BZj83YD_.mjs +29 -0
  194. package/dist/tasks.cli-BZj83YD_.mjs.map +1 -0
  195. package/dist/telemetry-DOyZLj8E.d.mts +36 -0
  196. package/dist/telemetry-DOyZLj8E.d.mts.map +1 -0
  197. package/dist/telemetry-I4md7Xzz.cjs +31 -0
  198. package/dist/telemetry-I4md7Xzz.cjs.map +1 -0
  199. package/dist/telemetry-PmX_1Y8a.mjs +26 -0
  200. package/dist/telemetry-PmX_1Y8a.mjs.map +1 -0
  201. package/dist/toolPromptGuidelines.cjs +3 -0
  202. package/dist/toolPromptGuidelines.d.mts +2 -0
  203. package/dist/toolPromptGuidelines.mjs +2 -0
  204. package/dist/toolResponseEnvelope.cjs +12 -0
  205. package/dist/toolResponseEnvelope.d.mts +2 -0
  206. package/dist/toolResponseEnvelope.mjs +2 -0
  207. package/dist/toolSchema.cjs +17 -0
  208. package/dist/toolSchema.d.mts +3 -0
  209. package/dist/toolSchema.mjs +3 -0
  210. package/dist/toolTaskTool.cjs +6 -0
  211. package/dist/toolTaskTool.d.mts +3 -0
  212. package/dist/toolTaskTool.mjs +3 -0
  213. package/dist/tuiFormat.cjs +14 -0
  214. package/dist/tuiFormat.d.mts +61 -0
  215. package/dist/tuiFormat.d.mts.map +1 -0
  216. package/dist/tuiFormat.mjs +2 -0
  217. package/dist/tuiSelectors.cjs +10 -0
  218. package/dist/tuiSelectors.d.mts +2 -0
  219. package/dist/tuiSelectors.mjs +2 -0
  220. package/dist/tuiTaskOverlay.cjs +4 -0
  221. package/dist/{tui/taskOverlay.d.cts → tuiTaskOverlay.d.mts} +9 -8
  222. package/dist/tuiTaskOverlay.d.mts.map +1 -0
  223. package/dist/tuiTaskOverlay.mjs +2 -0
  224. package/dist/tuiTaskSpace.cjs +5 -0
  225. package/dist/{tui/taskSpace.d.cts → tuiTaskSpace.d.mts} +11 -12
  226. package/dist/tuiTaskSpace.d.mts.map +1 -0
  227. package/dist/tuiTaskSpace.mjs +2 -0
  228. package/package.json +175 -109
  229. package/src/types/webTasks.ts +24 -0
  230. package/dist/_virtual/_rolldown/runtime.cjs +0 -1
  231. package/dist/commands.cjs.map +0 -1
  232. package/dist/commands.d.cts +0 -14
  233. package/dist/commands.d.cts.map +0 -1
  234. package/dist/commands.mjs.map +0 -1
  235. package/dist/config.cjs.map +0 -1
  236. package/dist/config.d.cts.map +0 -1
  237. package/dist/config.d.mts.map +0 -1
  238. package/dist/config.mjs.map +0 -1
  239. package/dist/delegation/manager.cjs +0 -6
  240. package/dist/delegation/manager.cjs.map +0 -1
  241. package/dist/delegation/manager.d.cts.map +0 -1
  242. package/dist/delegation/manager.d.mts +0 -189
  243. package/dist/delegation/manager.d.mts.map +0 -1
  244. package/dist/delegation/manager.mjs +0 -6
  245. package/dist/delegation/manager.mjs.map +0 -1
  246. package/dist/extension.cjs +0 -3
  247. package/dist/extension.cjs.map +0 -1
  248. package/dist/extension.d.cts +0 -12
  249. package/dist/extension.d.cts.map +0 -1
  250. package/dist/extension.d.mts +0 -12
  251. package/dist/extension.d.mts.map +0 -1
  252. package/dist/extension.mjs +0 -3
  253. package/dist/extension.mjs.map +0 -1
  254. package/dist/extensions/doom.cjs +0 -2
  255. package/dist/extensions/doom.cjs.map +0 -1
  256. package/dist/extensions/doom.d.cts +0 -6
  257. package/dist/extensions/doom.d.cts.map +0 -1
  258. package/dist/extensions/doom.d.mts +0 -7
  259. package/dist/extensions/doom.d.mts.map +0 -1
  260. package/dist/extensions/doom.mjs +0 -2
  261. package/dist/extensions/doom.mjs.map +0 -1
  262. package/dist/extensions/pi.d.cts +0 -2
  263. package/dist/index.d.cts +0 -15
  264. package/dist/logSinkTelemetry.cjs.map +0 -1
  265. package/dist/logSinkTelemetry.d.cts +0 -51
  266. package/dist/logSinkTelemetry.d.cts.map +0 -1
  267. package/dist/logSinkTelemetry.mjs.map +0 -1
  268. package/dist/store/invariants.cjs +0 -2
  269. package/dist/store/invariants.cjs.map +0 -1
  270. package/dist/store/invariants.d.cts +0 -14
  271. package/dist/store/invariants.d.cts.map +0 -1
  272. package/dist/store/invariants.d.mts +0 -14
  273. package/dist/store/invariants.d.mts.map +0 -1
  274. package/dist/store/invariants.mjs +0 -2
  275. package/dist/store/invariants.mjs.map +0 -1
  276. package/dist/store/paths.cjs +0 -2
  277. package/dist/store/paths.cjs.map +0 -1
  278. package/dist/store/paths.d.cts.map +0 -1
  279. package/dist/store/paths.d.mts +0 -23
  280. package/dist/store/paths.d.mts.map +0 -1
  281. package/dist/store/paths.mjs +0 -2
  282. package/dist/store/paths.mjs.map +0 -1
  283. package/dist/store/processLiveness.cjs +0 -2
  284. package/dist/store/processLiveness.cjs.map +0 -1
  285. package/dist/store/processLiveness.d.cts +0 -12
  286. package/dist/store/processLiveness.d.cts.map +0 -1
  287. package/dist/store/processLiveness.d.mts.map +0 -1
  288. package/dist/store/processLiveness.mjs +0 -2
  289. package/dist/store/processLiveness.mjs.map +0 -1
  290. package/dist/store/reconcile.cjs +0 -2
  291. package/dist/store/reconcile.cjs.map +0 -1
  292. package/dist/store/reconcile.d.cts.map +0 -1
  293. package/dist/store/reconcile.d.mts +0 -34
  294. package/dist/store/reconcile.d.mts.map +0 -1
  295. package/dist/store/reconcile.mjs +0 -2
  296. package/dist/store/reconcile.mjs.map +0 -1
  297. package/dist/store/reducer.cjs +0 -3
  298. package/dist/store/reducer.cjs.map +0 -1
  299. package/dist/store/reducer.d.cts +0 -72
  300. package/dist/store/reducer.d.cts.map +0 -1
  301. package/dist/store/reducer.d.mts.map +0 -1
  302. package/dist/store/reducer.mjs +0 -3
  303. package/dist/store/reducer.mjs.map +0 -1
  304. package/dist/store/taskGraph.cjs +0 -2
  305. package/dist/store/taskGraph.cjs.map +0 -1
  306. package/dist/store/taskGraph.d.cts.map +0 -1
  307. package/dist/store/taskGraph.d.mts +0 -25
  308. package/dist/store/taskGraph.d.mts.map +0 -1
  309. package/dist/store/taskGraph.mjs +0 -2
  310. package/dist/store/taskGraph.mjs.map +0 -1
  311. package/dist/store/taskStore.cjs +0 -2
  312. package/dist/store/taskStore.cjs.map +0 -1
  313. package/dist/store/taskStore.d.cts.map +0 -1
  314. package/dist/store/taskStore.d.mts +0 -77
  315. package/dist/store/taskStore.d.mts.map +0 -1
  316. package/dist/store/taskStore.mjs +0 -2
  317. package/dist/store/taskStore.mjs.map +0 -1
  318. package/dist/store/types.cjs +0 -2
  319. package/dist/store/types.cjs.map +0 -1
  320. package/dist/store/types.d.cts +0 -165
  321. package/dist/store/types.d.cts.map +0 -1
  322. package/dist/store/types.d.mts.map +0 -1
  323. package/dist/store/types.mjs +0 -2
  324. package/dist/store/types.mjs.map +0 -1
  325. package/dist/tool/promptGuidelines.cjs +0 -2
  326. package/dist/tool/promptGuidelines.cjs.map +0 -1
  327. package/dist/tool/promptGuidelines.d.cts +0 -5
  328. package/dist/tool/promptGuidelines.d.cts.map +0 -1
  329. package/dist/tool/promptGuidelines.d.mts +0 -5
  330. package/dist/tool/promptGuidelines.d.mts.map +0 -1
  331. package/dist/tool/promptGuidelines.mjs +0 -2
  332. package/dist/tool/promptGuidelines.mjs.map +0 -1
  333. package/dist/tool/responseEnvelope.cjs +0 -6
  334. package/dist/tool/responseEnvelope.cjs.map +0 -1
  335. package/dist/tool/responseEnvelope.d.cts.map +0 -1
  336. package/dist/tool/responseEnvelope.d.mts +0 -39
  337. package/dist/tool/responseEnvelope.d.mts.map +0 -1
  338. package/dist/tool/responseEnvelope.mjs +0 -6
  339. package/dist/tool/responseEnvelope.mjs.map +0 -1
  340. package/dist/tool/schema.cjs +0 -2
  341. package/dist/tool/schema.cjs.map +0 -1
  342. package/dist/tool/schema.d.cts.map +0 -1
  343. package/dist/tool/schema.d.mts +0 -86
  344. package/dist/tool/schema.d.mts.map +0 -1
  345. package/dist/tool/schema.mjs +0 -2
  346. package/dist/tool/schema.mjs.map +0 -1
  347. package/dist/tool/taskTool.cjs +0 -3
  348. package/dist/tool/taskTool.cjs.map +0 -1
  349. package/dist/tool/taskTool.d.cts +0 -17
  350. package/dist/tool/taskTool.d.cts.map +0 -1
  351. package/dist/tool/taskTool.d.mts +0 -17
  352. package/dist/tool/taskTool.d.mts.map +0 -1
  353. package/dist/tool/taskTool.mjs +0 -3
  354. package/dist/tool/taskTool.mjs.map +0 -1
  355. package/dist/tui/format.cjs +0 -4
  356. package/dist/tui/format.cjs.map +0 -1
  357. package/dist/tui/format.d.cts +0 -62
  358. package/dist/tui/format.d.cts.map +0 -1
  359. package/dist/tui/format.d.mts +0 -62
  360. package/dist/tui/format.d.mts.map +0 -1
  361. package/dist/tui/format.mjs +0 -4
  362. package/dist/tui/format.mjs.map +0 -1
  363. package/dist/tui/selectors.cjs +0 -2
  364. package/dist/tui/selectors.cjs.map +0 -1
  365. package/dist/tui/selectors.d.cts.map +0 -1
  366. package/dist/tui/selectors.d.mts +0 -53
  367. package/dist/tui/selectors.d.mts.map +0 -1
  368. package/dist/tui/selectors.mjs +0 -2
  369. package/dist/tui/selectors.mjs.map +0 -1
  370. package/dist/tui/taskOverlay.cjs +0 -2
  371. package/dist/tui/taskOverlay.cjs.map +0 -1
  372. package/dist/tui/taskOverlay.d.cts.map +0 -1
  373. package/dist/tui/taskOverlay.d.mts +0 -38
  374. package/dist/tui/taskOverlay.d.mts.map +0 -1
  375. package/dist/tui/taskOverlay.mjs +0 -2
  376. package/dist/tui/taskOverlay.mjs.map +0 -1
  377. package/dist/tui/taskSpace.cjs +0 -5
  378. package/dist/tui/taskSpace.cjs.map +0 -1
  379. package/dist/tui/taskSpace.d.cts.map +0 -1
  380. package/dist/tui/taskSpace.d.mts +0 -61
  381. package/dist/tui/taskSpace.d.mts.map +0 -1
  382. package/dist/tui/taskSpace.mjs +0 -5
  383. package/dist/tui/taskSpace.mjs.map +0 -1
@@ -0,0 +1,164 @@
1
+ import { _ as resolveCollapseKey, m as getMaxWidgetLines } from "./config-DmsCPDuF.mjs";
2
+ import { c as visibleTasks, n as deriveTaskProjection, o as selectOverlayLayoutFromProjection } from "./selectors-BaS6dObz.mjs";
3
+ import { c as formatOverlayTaskLine } from "./format.cli-Cnc591eb.mjs";
4
+ import { allocateAgentIdentityColor } from "@agimon-ai/doompi-ui/theme";
5
+ import { truncateToWidth } from "@earendil-works/pi-tui";
6
+ //#region src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.ts
7
+ const WIDGET_KEY = "doom-tasks";
8
+ const OVERLAY_HEADING = "Tasks";
9
+ const PROGRESS_TICK_MS = 1e3;
10
+ /** The widget owns its collapse key, while the session root owns its lifetime. */
11
+ function registerTaskCollapseShortcut(pi, overlay, waitUntilReady, isActive) {
12
+ const key = resolveCollapseKey();
13
+ if (key === "off") return;
14
+ pi.registerShortcut(key, {
15
+ description: "Collapse or expand the task overlay",
16
+ handler: async (context) => {
17
+ if (!isActive() || !context.hasUI) return;
18
+ await waitUntilReady(context);
19
+ if (!isActive() || !overlay.isRegistered()) return;
20
+ overlay.toggleCollapse();
21
+ }
22
+ });
23
+ }
24
+ /**
25
+ * Persistent widget listing tasks above the editor.
26
+ *
27
+ * Registered once per UI context and refreshed with `requestRender()`; it
28
+ * auto-hides when there is nothing to show so an idle session keeps a clean
29
+ * prompt.
30
+ */
31
+ var TaskOverlay = class {
32
+ options;
33
+ uiCtx;
34
+ widgetRegistered = false;
35
+ tui;
36
+ progressTimer;
37
+ collapsed = false;
38
+ constructor(options) {
39
+ this.options = options;
40
+ }
41
+ /** Identity-compare so repeated session_start handlers stay idempotent. */
42
+ setUICtx(ctx) {
43
+ if (ctx === this.uiCtx) return;
44
+ if (this.uiCtx && this.widgetRegistered) this.uiCtx.setWidget(WIDGET_KEY, void 0);
45
+ this.stopProgressTimer();
46
+ this.uiCtx = ctx;
47
+ this.widgetRegistered = false;
48
+ this.tui = void 0;
49
+ }
50
+ update() {
51
+ if (!this.uiCtx) {
52
+ this.stopProgressTimer();
53
+ return;
54
+ }
55
+ const tasks = visibleTasks(this.options.getTasks());
56
+ if (tasks.length === 0) {
57
+ if (this.widgetRegistered) {
58
+ this.uiCtx.setWidget(WIDGET_KEY, void 0);
59
+ this.widgetRegistered = false;
60
+ this.tui = void 0;
61
+ }
62
+ this.stopProgressTimer();
63
+ return;
64
+ }
65
+ if (this.widgetRegistered) {
66
+ this.syncProgressTimer(tasks);
67
+ this.tui?.requestRender();
68
+ return;
69
+ }
70
+ this.uiCtx.setWidget(WIDGET_KEY, (tui, factoryTheme) => {
71
+ this.tui = tui;
72
+ return {
73
+ render: (width) => this.renderWidget(this.uiCtx?.theme ?? factoryTheme, width),
74
+ invalidate: () => {}
75
+ };
76
+ }, { placement: "aboveEditor" });
77
+ this.widgetRegistered = true;
78
+ this.syncProgressTimer(tasks);
79
+ }
80
+ syncProgressTimer(tasks) {
81
+ const hasRunningDelegation = tasks.some((task) => task.status !== "deleted" && task.delegation?.state === "running");
82
+ if (this.collapsed || !this.widgetRegistered || !hasRunningDelegation) {
83
+ this.stopProgressTimer();
84
+ return;
85
+ }
86
+ if (this.progressTimer) return;
87
+ this.progressTimer = setInterval(() => this.tui?.requestRender(), PROGRESS_TICK_MS);
88
+ this.progressTimer.unref?.();
89
+ }
90
+ stopProgressTimer() {
91
+ if (this.progressTimer) clearInterval(this.progressTimer);
92
+ this.progressTimer = void 0;
93
+ }
94
+ toggleCollapse() {
95
+ this.collapsed = !this.collapsed;
96
+ this.syncProgressTimer(this.options.getTasks());
97
+ this.tui?.requestRender(true);
98
+ }
99
+ isRegistered() {
100
+ return this.widgetRegistered;
101
+ }
102
+ renderWidget(theme, width) {
103
+ const projection = deriveTaskProjection(this.options.getTasks());
104
+ if (projection.visible.length === 0) return [];
105
+ const truncate = (line) => truncateToWidth(line, width, "…");
106
+ const headingColor = projection.hasActiveWork ? "accent" : "dim";
107
+ const headingIcon = projection.hasActiveWork ? "●" : "○";
108
+ let headingText = `${OVERLAY_HEADING} (${projection.counts.completed}/${projection.counts.total})`;
109
+ if (projection.counts.failed > 0) headingText += ` · ${projection.counts.failed} failed`;
110
+ const heading = truncate(`${theme.fg(headingColor, headingIcon)} ${theme.fg(headingColor, headingText)}`);
111
+ if (this.collapsed) {
112
+ const key = resolveCollapseKey();
113
+ const hint = key === "off" ? "collapsed" : `${key} to expand`;
114
+ return this.withTrailingSpacer([heading, truncate(`${theme.fg("dim", "└─")} ${theme.fg("dim", hint)}`)]);
115
+ }
116
+ const layout = selectOverlayLayoutFromProjection(projection, getMaxWidgetLines() - 1);
117
+ const occupiedColors = /* @__PURE__ */ new Set();
118
+ const agentColors = /* @__PURE__ */ new Map();
119
+ for (const task of layout.visible) {
120
+ if (task.delegation?.state !== "running") continue;
121
+ const identity = task.delegation.runId ?? task.delegation.requestId;
122
+ const color = allocateAgentIdentityColor(identity, occupiedColors);
123
+ occupiedColors.add(color);
124
+ agentColors.set(identity, color);
125
+ }
126
+ const nowMs = Date.now();
127
+ const lines = [heading];
128
+ for (const task of layout.visible) {
129
+ const progress = this.options.delegation.progressFor(task);
130
+ const identity = task.delegation?.runId ?? task.delegation?.requestId;
131
+ lines.push(truncate(`${theme.fg("dim", "├─")} ${formatOverlayTaskLine(task, theme, projection.showIds, progress, nowMs, identity ? agentColors.get(identity) : void 0)}`));
132
+ }
133
+ const hidden = layout.hiddenCompleted + layout.truncatedTail;
134
+ if (hidden === 0) {
135
+ const last = lines.length - 1;
136
+ lines[last] = lines[last].replace("├─", "└─");
137
+ return this.withTrailingSpacer(lines);
138
+ }
139
+ const parts = [];
140
+ if (layout.hiddenCompleted > 0) parts.push(`${layout.hiddenCompleted} completed`);
141
+ if (layout.truncatedTail > 0) parts.push(`${layout.truncatedTail} pending`);
142
+ const summary = parts.length > 0 ? `+${hidden} more (${parts.join(", ")})` : `+${hidden} more`;
143
+ lines.push(truncate(`${theme.fg("dim", "└─")} ${theme.fg("dim", summary)}`));
144
+ return this.withTrailingSpacer(lines);
145
+ }
146
+ /** Pi adds a spacer above the widget but none below, which glues the last row to the input box. */
147
+ withTrailingSpacer(lines) {
148
+ if (lines.length === 0) return lines;
149
+ lines.push("");
150
+ return lines;
151
+ }
152
+ dispose() {
153
+ this.stopProgressTimer();
154
+ if (this.uiCtx) this.uiCtx.setWidget(WIDGET_KEY, void 0);
155
+ this.widgetRegistered = false;
156
+ this.tui = void 0;
157
+ this.uiCtx = void 0;
158
+ this.collapsed = false;
159
+ }
160
+ };
161
+ //#endregion
162
+ export { registerTaskCollapseShortcut as n, TaskOverlay as t };
163
+
164
+ //# sourceMappingURL=taskOverlay-CljDoTj_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskOverlay-CljDoTj_.mjs","names":[],"sources":["../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.ts"],"sourcesContent":["import { allocateAgentIdentityColor } from '@agimon-ai/doompi-ui/theme';\nimport type { ExtensionAPI, ExtensionContext, ExtensionUIContext, Theme } from '@earendil-works/pi-coding-agent';\nimport type { KeyId } from '@earendil-works/pi-tui';\nimport { type TUI, truncateToWidth } from '@earendil-works/pi-tui';\n\nimport type { Task } from '../../../../../../models/task';\nimport { COLLAPSE_KEY_OFF, getMaxWidgetLines, resolveCollapseKey } from '../../../../../../services/config';\nimport type { DelegationManager } from '../../../../../../services/delegation';\nimport { formatOverlayTaskLine } from '../../_shared/format.cli';\nimport { deriveTaskProjection, selectOverlayLayoutFromProjection, visibleTasks } from './selectors';\n\nconst WIDGET_KEY = 'doom-tasks';\nconst OVERLAY_HEADING = 'Tasks';\nconst PROGRESS_TICK_MS = 1000;\n\nexport interface TaskOverlayOptions {\n getTasks: () => readonly Task[];\n delegation: DelegationManager;\n}\n\n/** The widget owns its collapse key, while the session root owns its lifetime. */\nexport function registerTaskCollapseShortcut(\n pi: Pick<ExtensionAPI, 'registerShortcut'>,\n overlay: TaskOverlay,\n waitUntilReady: (context: ExtensionContext) => Promise<void>,\n isActive: () => boolean,\n): void {\n const key = resolveCollapseKey();\n if (key === COLLAPSE_KEY_OFF) return;\n pi.registerShortcut(key as KeyId, {\n description: 'Collapse or expand the task overlay',\n handler: async (context) => {\n if (!isActive() || !context.hasUI) return;\n await waitUntilReady(context);\n if (!isActive() || !overlay.isRegistered()) return;\n overlay.toggleCollapse();\n },\n });\n}\n\n/**\n * Persistent widget listing tasks above the editor.\n *\n * Registered once per UI context and refreshed with `requestRender()`; it\n * auto-hides when there is nothing to show so an idle session keeps a clean\n * prompt.\n */\nexport class TaskOverlay {\n private readonly options: TaskOverlayOptions;\n private uiCtx: ExtensionUIContext | undefined;\n private widgetRegistered = false;\n private tui: TUI | undefined;\n private progressTimer: NodeJS.Timeout | undefined;\n private collapsed = false;\n\n constructor(options: TaskOverlayOptions) {\n this.options = options;\n }\n\n /** Identity-compare so repeated session_start handlers stay idempotent. */\n setUICtx(ctx: ExtensionUIContext): void {\n if (ctx === this.uiCtx) return;\n if (this.uiCtx && this.widgetRegistered) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.stopProgressTimer();\n this.uiCtx = ctx;\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n\n update(): void {\n if (!this.uiCtx) {\n this.stopProgressTimer();\n return;\n }\n const tasks = visibleTasks(this.options.getTasks());\n\n if (tasks.length === 0) {\n if (this.widgetRegistered) {\n this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n this.stopProgressTimer();\n return;\n }\n\n if (this.widgetRegistered) {\n this.syncProgressTimer(tasks);\n this.tui?.requestRender();\n return;\n }\n\n this.uiCtx.setWidget(\n WIDGET_KEY,\n (tui, factoryTheme) => {\n this.tui = tui;\n return {\n render: (width: number) => this.renderWidget(this.uiCtx?.theme ?? factoryTheme, width),\n invalidate: () => {\n // Nothing is cached: the next render reads the live theme and store.\n },\n };\n },\n { placement: 'aboveEditor' },\n );\n this.widgetRegistered = true;\n this.syncProgressTimer(tasks);\n }\n\n private syncProgressTimer(tasks: readonly Task[]): void {\n const hasRunningDelegation = tasks.some(\n (task) => task.status !== 'deleted' && task.delegation?.state === 'running',\n );\n if (this.collapsed || !this.widgetRegistered || !hasRunningDelegation) {\n this.stopProgressTimer();\n return;\n }\n if (this.progressTimer) return;\n this.progressTimer = setInterval(() => this.tui?.requestRender(), PROGRESS_TICK_MS);\n this.progressTimer.unref?.();\n }\n\n private stopProgressTimer(): void {\n if (this.progressTimer) clearInterval(this.progressTimer);\n this.progressTimer = undefined;\n }\n\n toggleCollapse(): void {\n this.collapsed = !this.collapsed;\n this.syncProgressTimer(this.options.getTasks());\n // Forced redraw: collapsing changes the widget height, not just its content.\n this.tui?.requestRender(true);\n }\n\n isRegistered(): boolean {\n return this.widgetRegistered;\n }\n\n private renderWidget(theme: Theme, width: number): string[] {\n const projection = deriveTaskProjection(this.options.getTasks());\n if (projection.visible.length === 0) return [];\n\n const truncate = (line: string): string => truncateToWidth(line, width, '…');\n const headingColor = projection.hasActiveWork ? 'accent' : 'dim';\n const headingIcon = projection.hasActiveWork ? '●' : '○';\n let headingText = `${OVERLAY_HEADING} (${projection.counts.completed}/${projection.counts.total})`;\n if (projection.counts.failed > 0) headingText += ` · ${projection.counts.failed} failed`;\n const heading = truncate(`${theme.fg(headingColor, headingIcon)} ${theme.fg(headingColor, headingText)}`);\n\n if (this.collapsed) {\n const key = resolveCollapseKey();\n const hint = key === COLLAPSE_KEY_OFF ? 'collapsed' : `${key} to expand`;\n return this.withTrailingSpacer([heading, truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', hint)}`)]);\n }\n\n const layout = selectOverlayLayoutFromProjection(projection, getMaxWidgetLines() - 1);\n const occupiedColors = new Set<ReturnType<typeof allocateAgentIdentityColor>>();\n const agentColors = new Map<string, ReturnType<typeof allocateAgentIdentityColor>>();\n for (const task of layout.visible) {\n if (task.delegation?.state !== 'running') continue;\n const identity = task.delegation.runId ?? task.delegation.requestId;\n const color = allocateAgentIdentityColor(identity, occupiedColors);\n occupiedColors.add(color);\n agentColors.set(identity, color);\n }\n\n const nowMs = Date.now();\n const lines = [heading];\n for (const task of layout.visible) {\n const progress = this.options.delegation.progressFor(task);\n const identity = task.delegation?.runId ?? task.delegation?.requestId;\n lines.push(\n truncate(\n `${theme.fg('dim', '├─')} ${formatOverlayTaskLine(\n task,\n theme,\n projection.showIds,\n progress,\n nowMs,\n identity ? agentColors.get(identity) : undefined,\n )}`,\n ),\n );\n }\n\n const hidden = layout.hiddenCompleted + layout.truncatedTail;\n if (hidden === 0) {\n const last = lines.length - 1;\n lines[last] = lines[last].replace('├─', '└─');\n return this.withTrailingSpacer(lines);\n }\n\n const parts: string[] = [];\n if (layout.hiddenCompleted > 0) parts.push(`${layout.hiddenCompleted} completed`);\n if (layout.truncatedTail > 0) parts.push(`${layout.truncatedTail} pending`);\n const summary = parts.length > 0 ? `+${hidden} more (${parts.join(', ')})` : `+${hidden} more`;\n lines.push(truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', summary)}`));\n return this.withTrailingSpacer(lines);\n }\n\n /** Pi adds a spacer above the widget but none below, which glues the last row to the input box. */\n private withTrailingSpacer(lines: string[]): string[] {\n if (lines.length === 0) return lines;\n lines.push('');\n return lines;\n }\n\n dispose(): void {\n this.stopProgressTimer();\n if (this.uiCtx) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n this.uiCtx = undefined;\n this.collapsed = false;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,224 @@
1
+ const require_taskGraph = require("./taskGraph-BskRslrr.cjs");
2
+ //#region src/services/taskResult/index.ts
3
+ const MSG_ALL_COMPLETE_CLEAR = "All tasks are completed. Review the full task list once more, then close it with task {\"action\":\"clear\"}.";
4
+ /**
5
+ * Steering for a mixed batch. Unlike a batch of spawned subagents, a failed
6
+ * entry here had no side effect at all, so retrying the failures is the safe
7
+ * move and the model must be told so or it will do nothing. The hazard is the
8
+ * other half: resending an applied create would make a second task.
9
+ */
10
+ const MSG_UPSERT_PARTIAL = "The applied entries are committed. Resend only the failed entries, corrected — a failed entry changed nothing, so a corrected retry is safe. Do not resend an entry that already applied: an entry without an id creates a second task.";
11
+ const MSG_UPSERT_NONE_APPLIED = "No task changed, so the whole call can be resent once corrected.";
12
+ const MSG_ASSIGN_PARTIAL = "Successful assignments are already running. Retry only the failed entries after correcting their task state or arguments; do not resend successful entries.";
13
+ /** LLM-facing report for a native assignment batch. */
14
+ function formatAssignmentResults(items) {
15
+ if (items.length === 1) return items[0].message;
16
+ const succeeded = items.filter((item) => item.ok).length;
17
+ const failed = items.length - succeeded;
18
+ const lines = [`Assigned ${succeeded}/${items.length} tasks${failed > 0 ? `; ${failed} failed` : ""}.`, ...items.map((item) => item.ok ? `- [${item.index}] Delegated #${item.id} to ${item.agent}` : `- [${item.index}] Failed #${item.id} → ${item.agent}: ${item.message}`)];
19
+ if (failed > 0 && succeeded > 0) lines.push("", MSG_ASSIGN_PARTIAL);
20
+ if (failed === 0) lines.push("", "All assignments are running independently in the background. Continue non-overlapping work, or end your turn.");
21
+ return lines.join("\n");
22
+ }
23
+ /** `[status] #id subject (activeForm) [agent] ⛓ #dep` — the `list` line format. */
24
+ function formatListLine(task) {
25
+ const block = task.blockedBy?.length ? ` ⛓ ${task.blockedBy.map((id) => `#${id}`).join(",")}` : "";
26
+ const form = task.status === "in_progress" && task.activeForm ? ` (${task.activeForm})` : "";
27
+ const delegated = task.delegation && task.delegation.state !== "cancelled" ? ` [${task.delegation.agent}]` : "";
28
+ return `[${task.status}] #${task.id} ${task.subject}${form}${delegated}${block}`;
29
+ }
30
+ function formatDelegationLines(task) {
31
+ const delegation = task.delegation;
32
+ if (!delegation) return [];
33
+ const lines = [` delegated to: ${delegation.agent} (${delegation.state})`];
34
+ if (delegation.model) lines.push(` model: ${delegation.model}`);
35
+ if (delegation.result?.error) lines.push(` error: ${delegation.result.error}`);
36
+ if (delegation.result?.outputPath) lines.push(` output file: ${delegation.result.outputPath}`);
37
+ if (delegation.result?.output) lines.push(` output: ${delegation.result.output}`);
38
+ return lines;
39
+ }
40
+ function formatGetLines(task, document) {
41
+ const blocks = require_taskGraph.deriveBlocks(document.tasks).get(task.id) ?? [];
42
+ const lines = [`#${task.id} [${task.status}] ${task.subject}`];
43
+ if (task.description) lines.push(` description: ${task.description}`);
44
+ if (task.activeForm) lines.push(` activeForm: ${task.activeForm}`);
45
+ if (task.blockedBy?.length) lines.push(` blockedBy: ${task.blockedBy.map((id) => `#${id}`).join(", ")}`);
46
+ if (blocks.length) lines.push(` blocks: ${blocks.map((id) => `#${id}`).join(", ")}`);
47
+ if (task.owner) lines.push(` owner: ${task.owner}`);
48
+ lines.push(...formatDelegationLines(task));
49
+ return lines.join("\n");
50
+ }
51
+ /** One entry's outcome. Batch lines prefix this with `- [n] `. */
52
+ function formatUpsertItem(item) {
53
+ switch (item.kind) {
54
+ case "created": {
55
+ const ref = item.ref ? ` (ref "${item.ref}")` : "";
56
+ const deps = item.blockedBy?.length ? ` — blocked by ${item.blockedBy.map((id) => `#${id}`).join(", ")}` : "";
57
+ return `Created #${item.id}${ref}: ${item.subject} (${item.status})${deps}`;
58
+ }
59
+ case "updated": {
60
+ const transition = item.fromStatus === item.toStatus ? "" : ` (${item.fromStatus} -> ${item.toStatus})`;
61
+ return `Updated #${item.id}${transition}`;
62
+ }
63
+ case "unchanged": return `No change: #${item.id} already matches the requested values (status: ${item.status})`;
64
+ case "failed": return `Failed${item.id === void 0 ? "" : ` #${item.id}`}: ${item.message}`;
65
+ }
66
+ }
67
+ /**
68
+ * The thrown message when an upsert applied nothing. Kept separate from
69
+ * `formatContent` because the caller wraps it in the actionable Options block
70
+ * rather than returning it as a successful result.
71
+ */
72
+ function formatUpsertFailureText(op) {
73
+ if (op.items.length === 1) return op.items[0].kind === "failed" ? op.items[0].message : "no entry was applied";
74
+ return [
75
+ "no entry was applied.",
76
+ ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),
77
+ MSG_UPSERT_NONE_APPLIED
78
+ ].join("\n");
79
+ }
80
+ /**
81
+ * Pure formatter: `(op, document) -> string`. The switch is closed over `Op`,
82
+ * so a new reducer variant fails to compile until it is handled here.
83
+ */
84
+ function formatContent(op, document) {
85
+ switch (op.kind) {
86
+ case "upsert": {
87
+ const lines = op.items.length === 1 ? [formatUpsertItem(op.items[0])] : [
88
+ `Upsert applied ${op.applied}/${op.items.length} entries${op.failed > 0 ? `; ${op.failed} failed` : ""}.`,
89
+ ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),
90
+ ...op.failed > 0 ? ["", MSG_UPSERT_PARTIAL] : []
91
+ ];
92
+ if (op.applied > 0 && require_taskGraph.isTaskListComplete(document.tasks)) lines.push(MSG_ALL_COMPLETE_CLEAR);
93
+ return lines.join("\n");
94
+ }
95
+ case "delete": return `Deleted #${op.id}: ${op.subject}`;
96
+ case "clear": return `Closed task list (cleared ${op.count} tasks)`;
97
+ case "list": {
98
+ let view = document.tasks;
99
+ if (!op.includeDeleted) view = view.filter((task) => task.status !== "deleted");
100
+ if (op.statusFilter) view = view.filter((task) => task.status === op.statusFilter);
101
+ return view.length === 0 ? "No tasks" : view.map(formatListLine).join("\n");
102
+ }
103
+ case "get": return formatGetLines(op.task, document);
104
+ case "error": return `Error: ${op.message}`;
105
+ }
106
+ }
107
+ /** Build the LLM-facing envelope. `details` carries the post-mutation snapshot. */
108
+ function buildToolResult(action, params, document, op) {
109
+ return {
110
+ content: [{
111
+ type: "text",
112
+ text: formatContent(op, document)
113
+ }],
114
+ details: {
115
+ action,
116
+ params,
117
+ tasks: document.tasks,
118
+ nextId: document.nextId,
119
+ rev: document.rev,
120
+ ...op.kind === "error" ? { error: op.message } : {},
121
+ ...op.kind === "upsert" ? { upsert: {
122
+ applied: op.items.flatMap((item) => item.kind === "failed" ? [] : [item.id]),
123
+ failed: op.failed
124
+ } } : {}
125
+ }
126
+ };
127
+ }
128
+ /** Envelope for a native assignment batch, including ids used by the consolidated TUI result. */
129
+ function buildAssignmentResult(params, document, text, assignment) {
130
+ return {
131
+ content: [{
132
+ type: "text",
133
+ text
134
+ }],
135
+ details: {
136
+ action: "assign",
137
+ params,
138
+ tasks: document.tasks,
139
+ nextId: document.nextId,
140
+ rev: document.rev,
141
+ assignment
142
+ }
143
+ };
144
+ }
145
+ /** Envelope for delegation actions, which do not flow through the reducer. */
146
+ function buildTextResult(action, params, document, text, error) {
147
+ return {
148
+ content: [{
149
+ type: "text",
150
+ text: error ? `Error: ${error}` : text
151
+ }],
152
+ details: {
153
+ action,
154
+ params,
155
+ tasks: document.tasks,
156
+ nextId: document.nextId,
157
+ rev: document.rev,
158
+ ...error ? { error } : {}
159
+ }
160
+ };
161
+ }
162
+ //#endregion
163
+ Object.defineProperty(exports, "MSG_ALL_COMPLETE_CLEAR", {
164
+ enumerable: true,
165
+ get: function() {
166
+ return MSG_ALL_COMPLETE_CLEAR;
167
+ }
168
+ });
169
+ Object.defineProperty(exports, "MSG_ASSIGN_PARTIAL", {
170
+ enumerable: true,
171
+ get: function() {
172
+ return MSG_ASSIGN_PARTIAL;
173
+ }
174
+ });
175
+ Object.defineProperty(exports, "MSG_UPSERT_NONE_APPLIED", {
176
+ enumerable: true,
177
+ get: function() {
178
+ return MSG_UPSERT_NONE_APPLIED;
179
+ }
180
+ });
181
+ Object.defineProperty(exports, "MSG_UPSERT_PARTIAL", {
182
+ enumerable: true,
183
+ get: function() {
184
+ return MSG_UPSERT_PARTIAL;
185
+ }
186
+ });
187
+ Object.defineProperty(exports, "buildAssignmentResult", {
188
+ enumerable: true,
189
+ get: function() {
190
+ return buildAssignmentResult;
191
+ }
192
+ });
193
+ Object.defineProperty(exports, "buildTextResult", {
194
+ enumerable: true,
195
+ get: function() {
196
+ return buildTextResult;
197
+ }
198
+ });
199
+ Object.defineProperty(exports, "buildToolResult", {
200
+ enumerable: true,
201
+ get: function() {
202
+ return buildToolResult;
203
+ }
204
+ });
205
+ Object.defineProperty(exports, "formatAssignmentResults", {
206
+ enumerable: true,
207
+ get: function() {
208
+ return formatAssignmentResults;
209
+ }
210
+ });
211
+ Object.defineProperty(exports, "formatContent", {
212
+ enumerable: true,
213
+ get: function() {
214
+ return formatContent;
215
+ }
216
+ });
217
+ Object.defineProperty(exports, "formatUpsertFailureText", {
218
+ enumerable: true,
219
+ get: function() {
220
+ return formatUpsertFailureText;
221
+ }
222
+ });
223
+
224
+ //# sourceMappingURL=taskResult-D2G7b4w-.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskResult-D2G7b4w-.cjs","names":["deriveBlocks","isTaskListComplete"],"sources":["../src/services/taskResult/index.ts"],"sourcesContent":["import type {\n AssignmentSummary,\n Task,\n TaskAction,\n TaskDetails,\n TaskDocument,\n TaskMutationParams,\n UpsertItemOutcome,\n} from '../../models/task';\nimport { deriveBlocks, isTaskListComplete } from '../../models/taskGraph';\nimport type { Op } from '../reducer';\n\nexport const MSG_ALL_COMPLETE_CLEAR =\n 'All tasks are completed. Review the full task list once more, then close it with task {\"action\":\"clear\"}.';\n\n/**\n * Steering for a mixed batch. Unlike a batch of spawned subagents, a failed\n * entry here had no side effect at all, so retrying the failures is the safe\n * move and the model must be told so or it will do nothing. The hazard is the\n * other half: resending an applied create would make a second task.\n */\nexport const MSG_UPSERT_PARTIAL =\n 'The applied entries are committed. Resend only the failed entries, corrected — a failed entry changed nothing, so a corrected retry is safe. Do not resend an entry that already applied: an entry without an id creates a second task.';\n\nexport const MSG_UPSERT_NONE_APPLIED = 'No task changed, so the whole call can be resent once corrected.';\n\nexport const MSG_ASSIGN_PARTIAL =\n 'Successful assignments are already running. Retry only the failed entries after correcting their task state or arguments; do not resend successful entries.';\n\nexport interface AssignmentItemResult {\n index: number;\n id: number;\n agent: string;\n ok: boolean;\n message: string;\n}\n\n/** LLM-facing report for a native assignment batch. */\nexport function formatAssignmentResults(items: readonly AssignmentItemResult[]): string {\n if (items.length === 1) return items[0].message;\n\n const succeeded = items.filter((item) => item.ok).length;\n const failed = items.length - succeeded;\n const lines = [\n `Assigned ${succeeded}/${items.length} tasks${failed > 0 ? `; ${failed} failed` : ''}.`,\n ...items.map((item) =>\n item.ok\n ? `- [${item.index}] Delegated #${item.id} to ${item.agent}`\n : `- [${item.index}] Failed #${item.id} → ${item.agent}: ${item.message}`,\n ),\n ];\n\n if (failed > 0 && succeeded > 0) lines.push('', MSG_ASSIGN_PARTIAL);\n if (failed === 0) {\n lines.push(\n '',\n 'All assignments are running independently in the background. Continue non-overlapping work, or end your turn.',\n );\n }\n return lines.join('\\n');\n}\n\n/** `[status] #id subject (activeForm) [agent] ⛓ #dep` — the `list` line format. */\nfunction formatListLine(task: Task): string {\n const block = task.blockedBy?.length ? ` ⛓ ${task.blockedBy.map((id) => `#${id}`).join(',')}` : '';\n const form = task.status === 'in_progress' && task.activeForm ? ` (${task.activeForm})` : '';\n const delegated = task.delegation && task.delegation.state !== 'cancelled' ? ` [${task.delegation.agent}]` : '';\n return `[${task.status}] #${task.id} ${task.subject}${form}${delegated}${block}`;\n}\n\nfunction formatDelegationLines(task: Task): string[] {\n const delegation = task.delegation;\n if (!delegation) return [];\n\n const lines = [` delegated to: ${delegation.agent} (${delegation.state})`];\n if (delegation.model) lines.push(` model: ${delegation.model}`);\n if (delegation.result?.error) lines.push(` error: ${delegation.result.error}`);\n if (delegation.result?.outputPath) lines.push(` output file: ${delegation.result.outputPath}`);\n if (delegation.result?.output) lines.push(` output: ${delegation.result.output}`);\n return lines;\n}\n\nfunction formatGetLines(task: Task, document: TaskDocument): string {\n const blocks = deriveBlocks(document.tasks).get(task.id) ?? [];\n const lines = [`#${task.id} [${task.status}] ${task.subject}`];\n if (task.description) lines.push(` description: ${task.description}`);\n if (task.activeForm) lines.push(` activeForm: ${task.activeForm}`);\n if (task.blockedBy?.length) lines.push(` blockedBy: ${task.blockedBy.map((id) => `#${id}`).join(', ')}`);\n if (blocks.length) lines.push(` blocks: ${blocks.map((id) => `#${id}`).join(', ')}`);\n if (task.owner) lines.push(` owner: ${task.owner}`);\n lines.push(...formatDelegationLines(task));\n return lines.join('\\n');\n}\n\n/** One entry's outcome. Batch lines prefix this with `- [n] `. */\nfunction formatUpsertItem(item: UpsertItemOutcome): string {\n switch (item.kind) {\n case 'created': {\n const ref = item.ref ? ` (ref \"${item.ref}\")` : '';\n const deps = item.blockedBy?.length ? ` — blocked by ${item.blockedBy.map((id) => `#${id}`).join(', ')}` : '';\n return `Created #${item.id}${ref}: ${item.subject} (${item.status})${deps}`;\n }\n case 'updated': {\n const transition = item.fromStatus === item.toStatus ? '' : ` (${item.fromStatus} -> ${item.toStatus})`;\n return `Updated #${item.id}${transition}`;\n }\n case 'unchanged':\n return `No change: #${item.id} already matches the requested values (status: ${item.status})`;\n case 'failed':\n return `Failed${item.id === undefined ? '' : ` #${item.id}`}: ${item.message}`;\n }\n}\n\n/**\n * The thrown message when an upsert applied nothing. Kept separate from\n * `formatContent` because the caller wraps it in the actionable Options block\n * rather than returning it as a successful result.\n */\nexport function formatUpsertFailureText(op: Extract<Op, { kind: 'upsert' }>): string {\n if (op.items.length === 1) return op.items[0].kind === 'failed' ? op.items[0].message : 'no entry was applied';\n return [\n 'no entry was applied.',\n ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),\n MSG_UPSERT_NONE_APPLIED,\n ].join('\\n');\n}\n\n/**\n * Pure formatter: `(op, document) -> string`. The switch is closed over `Op`,\n * so a new reducer variant fails to compile until it is handled here.\n */\nexport function formatContent(op: Op, document: TaskDocument): string {\n switch (op.kind) {\n case 'upsert': {\n // A batch of one is the common case and must not read like a bulk\n // report, so it keeps the exact single-line shape it has always had.\n const lines =\n op.items.length === 1\n ? [formatUpsertItem(op.items[0])]\n : [\n `Upsert applied ${op.applied}/${op.items.length} entries${op.failed > 0 ? `; ${op.failed} failed` : ''}.`,\n ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),\n ...(op.failed > 0 ? ['', MSG_UPSERT_PARTIAL] : []),\n ];\n // Once, last, and only when something landed: emitting it per entry\n // would repeat it for every completion in a batch.\n if (op.applied > 0 && isTaskListComplete(document.tasks)) lines.push(MSG_ALL_COMPLETE_CLEAR);\n return lines.join('\\n');\n }\n case 'delete':\n return `Deleted #${op.id}: ${op.subject}`;\n case 'clear':\n return `Closed task list (cleared ${op.count} tasks)`;\n case 'list': {\n let view = document.tasks;\n if (!op.includeDeleted) view = view.filter((task) => task.status !== 'deleted');\n if (op.statusFilter) view = view.filter((task) => task.status === op.statusFilter);\n return view.length === 0 ? 'No tasks' : view.map(formatListLine).join('\\n');\n }\n case 'get':\n return formatGetLines(op.task, document);\n case 'error':\n return `Error: ${op.message}`;\n }\n}\n\nexport interface ToolResult {\n content: Array<{ type: 'text'; text: string }>;\n details: TaskDetails;\n}\n\n/** Build the LLM-facing envelope. `details` carries the post-mutation snapshot. */\nexport function buildToolResult(\n action: TaskAction,\n params: TaskMutationParams,\n document: TaskDocument,\n op: Op,\n): ToolResult {\n return {\n content: [{ type: 'text', text: formatContent(op, document) }],\n details: {\n action,\n params: params as Record<string, unknown>,\n tasks: document.tasks,\n nextId: document.nextId,\n rev: document.rev,\n ...(op.kind === 'error' ? { error: op.message } : {}),\n // Deliberately no `error` on a partial success: renderResult treats\n // `details.error` as total failure and would hide the rows for the\n // entries that did land.\n ...(op.kind === 'upsert'\n ? {\n upsert: {\n applied: op.items.flatMap((item) => (item.kind === 'failed' ? [] : [item.id])),\n failed: op.failed,\n },\n }\n : {}),\n },\n };\n}\n\n/** Envelope for a native assignment batch, including ids used by the consolidated TUI result. */\nexport function buildAssignmentResult(\n params: TaskMutationParams,\n document: TaskDocument,\n text: string,\n assignment: AssignmentSummary,\n): ToolResult {\n return {\n content: [{ type: 'text', text }],\n details: {\n action: 'assign',\n params: params as Record<string, unknown>,\n tasks: document.tasks,\n nextId: document.nextId,\n rev: document.rev,\n assignment,\n },\n };\n}\n\n/** Envelope for delegation actions, which do not flow through the reducer. */\nexport function buildTextResult(\n action: TaskAction,\n params: TaskMutationParams,\n document: TaskDocument,\n text: string,\n error?: string,\n): ToolResult {\n return {\n content: [{ type: 'text', text: error ? `Error: ${error}` : text }],\n details: {\n action,\n params: params as Record<string, unknown>,\n tasks: document.tasks,\n nextId: document.nextId,\n rev: document.rev,\n ...(error ? { error } : {}),\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,165 @@
1
+ import { i as isTaskListComplete, t as deriveBlocks } from "./taskGraph-BOQvT0-M.mjs";
2
+ //#region src/services/taskResult/index.ts
3
+ const MSG_ALL_COMPLETE_CLEAR = "All tasks are completed. Review the full task list once more, then close it with task {\"action\":\"clear\"}.";
4
+ /**
5
+ * Steering for a mixed batch. Unlike a batch of spawned subagents, a failed
6
+ * entry here had no side effect at all, so retrying the failures is the safe
7
+ * move and the model must be told so or it will do nothing. The hazard is the
8
+ * other half: resending an applied create would make a second task.
9
+ */
10
+ const MSG_UPSERT_PARTIAL = "The applied entries are committed. Resend only the failed entries, corrected — a failed entry changed nothing, so a corrected retry is safe. Do not resend an entry that already applied: an entry without an id creates a second task.";
11
+ const MSG_UPSERT_NONE_APPLIED = "No task changed, so the whole call can be resent once corrected.";
12
+ const MSG_ASSIGN_PARTIAL = "Successful assignments are already running. Retry only the failed entries after correcting their task state or arguments; do not resend successful entries.";
13
+ /** LLM-facing report for a native assignment batch. */
14
+ function formatAssignmentResults(items) {
15
+ if (items.length === 1) return items[0].message;
16
+ const succeeded = items.filter((item) => item.ok).length;
17
+ const failed = items.length - succeeded;
18
+ const lines = [`Assigned ${succeeded}/${items.length} tasks${failed > 0 ? `; ${failed} failed` : ""}.`, ...items.map((item) => item.ok ? `- [${item.index}] Delegated #${item.id} to ${item.agent}` : `- [${item.index}] Failed #${item.id} → ${item.agent}: ${item.message}`)];
19
+ if (failed > 0 && succeeded > 0) lines.push("", MSG_ASSIGN_PARTIAL);
20
+ if (failed === 0) lines.push("", "All assignments are running independently in the background. Continue non-overlapping work, or end your turn.");
21
+ return lines.join("\n");
22
+ }
23
+ /** `[status] #id subject (activeForm) [agent] ⛓ #dep` — the `list` line format. */
24
+ function formatListLine(task) {
25
+ const block = task.blockedBy?.length ? ` ⛓ ${task.blockedBy.map((id) => `#${id}`).join(",")}` : "";
26
+ const form = task.status === "in_progress" && task.activeForm ? ` (${task.activeForm})` : "";
27
+ const delegated = task.delegation && task.delegation.state !== "cancelled" ? ` [${task.delegation.agent}]` : "";
28
+ return `[${task.status}] #${task.id} ${task.subject}${form}${delegated}${block}`;
29
+ }
30
+ function formatDelegationLines(task) {
31
+ const delegation = task.delegation;
32
+ if (!delegation) return [];
33
+ const lines = [` delegated to: ${delegation.agent} (${delegation.state})`];
34
+ if (delegation.model) lines.push(` model: ${delegation.model}`);
35
+ if (delegation.result?.error) lines.push(` error: ${delegation.result.error}`);
36
+ if (delegation.result?.outputPath) lines.push(` output file: ${delegation.result.outputPath}`);
37
+ if (delegation.result?.output) lines.push(` output: ${delegation.result.output}`);
38
+ return lines;
39
+ }
40
+ function formatGetLines(task, document) {
41
+ const blocks = deriveBlocks(document.tasks).get(task.id) ?? [];
42
+ const lines = [`#${task.id} [${task.status}] ${task.subject}`];
43
+ if (task.description) lines.push(` description: ${task.description}`);
44
+ if (task.activeForm) lines.push(` activeForm: ${task.activeForm}`);
45
+ if (task.blockedBy?.length) lines.push(` blockedBy: ${task.blockedBy.map((id) => `#${id}`).join(", ")}`);
46
+ if (blocks.length) lines.push(` blocks: ${blocks.map((id) => `#${id}`).join(", ")}`);
47
+ if (task.owner) lines.push(` owner: ${task.owner}`);
48
+ lines.push(...formatDelegationLines(task));
49
+ return lines.join("\n");
50
+ }
51
+ /** One entry's outcome. Batch lines prefix this with `- [n] `. */
52
+ function formatUpsertItem(item) {
53
+ switch (item.kind) {
54
+ case "created": {
55
+ const ref = item.ref ? ` (ref "${item.ref}")` : "";
56
+ const deps = item.blockedBy?.length ? ` — blocked by ${item.blockedBy.map((id) => `#${id}`).join(", ")}` : "";
57
+ return `Created #${item.id}${ref}: ${item.subject} (${item.status})${deps}`;
58
+ }
59
+ case "updated": {
60
+ const transition = item.fromStatus === item.toStatus ? "" : ` (${item.fromStatus} -> ${item.toStatus})`;
61
+ return `Updated #${item.id}${transition}`;
62
+ }
63
+ case "unchanged": return `No change: #${item.id} already matches the requested values (status: ${item.status})`;
64
+ case "failed": return `Failed${item.id === void 0 ? "" : ` #${item.id}`}: ${item.message}`;
65
+ }
66
+ }
67
+ /**
68
+ * The thrown message when an upsert applied nothing. Kept separate from
69
+ * `formatContent` because the caller wraps it in the actionable Options block
70
+ * rather than returning it as a successful result.
71
+ */
72
+ function formatUpsertFailureText(op) {
73
+ if (op.items.length === 1) return op.items[0].kind === "failed" ? op.items[0].message : "no entry was applied";
74
+ return [
75
+ "no entry was applied.",
76
+ ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),
77
+ MSG_UPSERT_NONE_APPLIED
78
+ ].join("\n");
79
+ }
80
+ /**
81
+ * Pure formatter: `(op, document) -> string`. The switch is closed over `Op`,
82
+ * so a new reducer variant fails to compile until it is handled here.
83
+ */
84
+ function formatContent(op, document) {
85
+ switch (op.kind) {
86
+ case "upsert": {
87
+ const lines = op.items.length === 1 ? [formatUpsertItem(op.items[0])] : [
88
+ `Upsert applied ${op.applied}/${op.items.length} entries${op.failed > 0 ? `; ${op.failed} failed` : ""}.`,
89
+ ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),
90
+ ...op.failed > 0 ? ["", MSG_UPSERT_PARTIAL] : []
91
+ ];
92
+ if (op.applied > 0 && isTaskListComplete(document.tasks)) lines.push(MSG_ALL_COMPLETE_CLEAR);
93
+ return lines.join("\n");
94
+ }
95
+ case "delete": return `Deleted #${op.id}: ${op.subject}`;
96
+ case "clear": return `Closed task list (cleared ${op.count} tasks)`;
97
+ case "list": {
98
+ let view = document.tasks;
99
+ if (!op.includeDeleted) view = view.filter((task) => task.status !== "deleted");
100
+ if (op.statusFilter) view = view.filter((task) => task.status === op.statusFilter);
101
+ return view.length === 0 ? "No tasks" : view.map(formatListLine).join("\n");
102
+ }
103
+ case "get": return formatGetLines(op.task, document);
104
+ case "error": return `Error: ${op.message}`;
105
+ }
106
+ }
107
+ /** Build the LLM-facing envelope. `details` carries the post-mutation snapshot. */
108
+ function buildToolResult(action, params, document, op) {
109
+ return {
110
+ content: [{
111
+ type: "text",
112
+ text: formatContent(op, document)
113
+ }],
114
+ details: {
115
+ action,
116
+ params,
117
+ tasks: document.tasks,
118
+ nextId: document.nextId,
119
+ rev: document.rev,
120
+ ...op.kind === "error" ? { error: op.message } : {},
121
+ ...op.kind === "upsert" ? { upsert: {
122
+ applied: op.items.flatMap((item) => item.kind === "failed" ? [] : [item.id]),
123
+ failed: op.failed
124
+ } } : {}
125
+ }
126
+ };
127
+ }
128
+ /** Envelope for a native assignment batch, including ids used by the consolidated TUI result. */
129
+ function buildAssignmentResult(params, document, text, assignment) {
130
+ return {
131
+ content: [{
132
+ type: "text",
133
+ text
134
+ }],
135
+ details: {
136
+ action: "assign",
137
+ params,
138
+ tasks: document.tasks,
139
+ nextId: document.nextId,
140
+ rev: document.rev,
141
+ assignment
142
+ }
143
+ };
144
+ }
145
+ /** Envelope for delegation actions, which do not flow through the reducer. */
146
+ function buildTextResult(action, params, document, text, error) {
147
+ return {
148
+ content: [{
149
+ type: "text",
150
+ text: error ? `Error: ${error}` : text
151
+ }],
152
+ details: {
153
+ action,
154
+ params,
155
+ tasks: document.tasks,
156
+ nextId: document.nextId,
157
+ rev: document.rev,
158
+ ...error ? { error } : {}
159
+ }
160
+ };
161
+ }
162
+ //#endregion
163
+ export { buildAssignmentResult as a, formatAssignmentResults as c, MSG_UPSERT_PARTIAL as i, formatContent as l, MSG_ASSIGN_PARTIAL as n, buildTextResult as o, MSG_UPSERT_NONE_APPLIED as r, buildToolResult as s, MSG_ALL_COMPLETE_CLEAR as t, formatUpsertFailureText as u };
164
+
165
+ //# sourceMappingURL=taskResult-edBAAKSH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskResult-edBAAKSH.mjs","names":[],"sources":["../src/services/taskResult/index.ts"],"sourcesContent":["import type {\n AssignmentSummary,\n Task,\n TaskAction,\n TaskDetails,\n TaskDocument,\n TaskMutationParams,\n UpsertItemOutcome,\n} from '../../models/task';\nimport { deriveBlocks, isTaskListComplete } from '../../models/taskGraph';\nimport type { Op } from '../reducer';\n\nexport const MSG_ALL_COMPLETE_CLEAR =\n 'All tasks are completed. Review the full task list once more, then close it with task {\"action\":\"clear\"}.';\n\n/**\n * Steering for a mixed batch. Unlike a batch of spawned subagents, a failed\n * entry here had no side effect at all, so retrying the failures is the safe\n * move and the model must be told so or it will do nothing. The hazard is the\n * other half: resending an applied create would make a second task.\n */\nexport const MSG_UPSERT_PARTIAL =\n 'The applied entries are committed. Resend only the failed entries, corrected — a failed entry changed nothing, so a corrected retry is safe. Do not resend an entry that already applied: an entry without an id creates a second task.';\n\nexport const MSG_UPSERT_NONE_APPLIED = 'No task changed, so the whole call can be resent once corrected.';\n\nexport const MSG_ASSIGN_PARTIAL =\n 'Successful assignments are already running. Retry only the failed entries after correcting their task state or arguments; do not resend successful entries.';\n\nexport interface AssignmentItemResult {\n index: number;\n id: number;\n agent: string;\n ok: boolean;\n message: string;\n}\n\n/** LLM-facing report for a native assignment batch. */\nexport function formatAssignmentResults(items: readonly AssignmentItemResult[]): string {\n if (items.length === 1) return items[0].message;\n\n const succeeded = items.filter((item) => item.ok).length;\n const failed = items.length - succeeded;\n const lines = [\n `Assigned ${succeeded}/${items.length} tasks${failed > 0 ? `; ${failed} failed` : ''}.`,\n ...items.map((item) =>\n item.ok\n ? `- [${item.index}] Delegated #${item.id} to ${item.agent}`\n : `- [${item.index}] Failed #${item.id} → ${item.agent}: ${item.message}`,\n ),\n ];\n\n if (failed > 0 && succeeded > 0) lines.push('', MSG_ASSIGN_PARTIAL);\n if (failed === 0) {\n lines.push(\n '',\n 'All assignments are running independently in the background. Continue non-overlapping work, or end your turn.',\n );\n }\n return lines.join('\\n');\n}\n\n/** `[status] #id subject (activeForm) [agent] ⛓ #dep` — the `list` line format. */\nfunction formatListLine(task: Task): string {\n const block = task.blockedBy?.length ? ` ⛓ ${task.blockedBy.map((id) => `#${id}`).join(',')}` : '';\n const form = task.status === 'in_progress' && task.activeForm ? ` (${task.activeForm})` : '';\n const delegated = task.delegation && task.delegation.state !== 'cancelled' ? ` [${task.delegation.agent}]` : '';\n return `[${task.status}] #${task.id} ${task.subject}${form}${delegated}${block}`;\n}\n\nfunction formatDelegationLines(task: Task): string[] {\n const delegation = task.delegation;\n if (!delegation) return [];\n\n const lines = [` delegated to: ${delegation.agent} (${delegation.state})`];\n if (delegation.model) lines.push(` model: ${delegation.model}`);\n if (delegation.result?.error) lines.push(` error: ${delegation.result.error}`);\n if (delegation.result?.outputPath) lines.push(` output file: ${delegation.result.outputPath}`);\n if (delegation.result?.output) lines.push(` output: ${delegation.result.output}`);\n return lines;\n}\n\nfunction formatGetLines(task: Task, document: TaskDocument): string {\n const blocks = deriveBlocks(document.tasks).get(task.id) ?? [];\n const lines = [`#${task.id} [${task.status}] ${task.subject}`];\n if (task.description) lines.push(` description: ${task.description}`);\n if (task.activeForm) lines.push(` activeForm: ${task.activeForm}`);\n if (task.blockedBy?.length) lines.push(` blockedBy: ${task.blockedBy.map((id) => `#${id}`).join(', ')}`);\n if (blocks.length) lines.push(` blocks: ${blocks.map((id) => `#${id}`).join(', ')}`);\n if (task.owner) lines.push(` owner: ${task.owner}`);\n lines.push(...formatDelegationLines(task));\n return lines.join('\\n');\n}\n\n/** One entry's outcome. Batch lines prefix this with `- [n] `. */\nfunction formatUpsertItem(item: UpsertItemOutcome): string {\n switch (item.kind) {\n case 'created': {\n const ref = item.ref ? ` (ref \"${item.ref}\")` : '';\n const deps = item.blockedBy?.length ? ` — blocked by ${item.blockedBy.map((id) => `#${id}`).join(', ')}` : '';\n return `Created #${item.id}${ref}: ${item.subject} (${item.status})${deps}`;\n }\n case 'updated': {\n const transition = item.fromStatus === item.toStatus ? '' : ` (${item.fromStatus} -> ${item.toStatus})`;\n return `Updated #${item.id}${transition}`;\n }\n case 'unchanged':\n return `No change: #${item.id} already matches the requested values (status: ${item.status})`;\n case 'failed':\n return `Failed${item.id === undefined ? '' : ` #${item.id}`}: ${item.message}`;\n }\n}\n\n/**\n * The thrown message when an upsert applied nothing. Kept separate from\n * `formatContent` because the caller wraps it in the actionable Options block\n * rather than returning it as a successful result.\n */\nexport function formatUpsertFailureText(op: Extract<Op, { kind: 'upsert' }>): string {\n if (op.items.length === 1) return op.items[0].kind === 'failed' ? op.items[0].message : 'no entry was applied';\n return [\n 'no entry was applied.',\n ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),\n MSG_UPSERT_NONE_APPLIED,\n ].join('\\n');\n}\n\n/**\n * Pure formatter: `(op, document) -> string`. The switch is closed over `Op`,\n * so a new reducer variant fails to compile until it is handled here.\n */\nexport function formatContent(op: Op, document: TaskDocument): string {\n switch (op.kind) {\n case 'upsert': {\n // A batch of one is the common case and must not read like a bulk\n // report, so it keeps the exact single-line shape it has always had.\n const lines =\n op.items.length === 1\n ? [formatUpsertItem(op.items[0])]\n : [\n `Upsert applied ${op.applied}/${op.items.length} entries${op.failed > 0 ? `; ${op.failed} failed` : ''}.`,\n ...op.items.map((item) => `- [${item.index}] ${formatUpsertItem(item)}`),\n ...(op.failed > 0 ? ['', MSG_UPSERT_PARTIAL] : []),\n ];\n // Once, last, and only when something landed: emitting it per entry\n // would repeat it for every completion in a batch.\n if (op.applied > 0 && isTaskListComplete(document.tasks)) lines.push(MSG_ALL_COMPLETE_CLEAR);\n return lines.join('\\n');\n }\n case 'delete':\n return `Deleted #${op.id}: ${op.subject}`;\n case 'clear':\n return `Closed task list (cleared ${op.count} tasks)`;\n case 'list': {\n let view = document.tasks;\n if (!op.includeDeleted) view = view.filter((task) => task.status !== 'deleted');\n if (op.statusFilter) view = view.filter((task) => task.status === op.statusFilter);\n return view.length === 0 ? 'No tasks' : view.map(formatListLine).join('\\n');\n }\n case 'get':\n return formatGetLines(op.task, document);\n case 'error':\n return `Error: ${op.message}`;\n }\n}\n\nexport interface ToolResult {\n content: Array<{ type: 'text'; text: string }>;\n details: TaskDetails;\n}\n\n/** Build the LLM-facing envelope. `details` carries the post-mutation snapshot. */\nexport function buildToolResult(\n action: TaskAction,\n params: TaskMutationParams,\n document: TaskDocument,\n op: Op,\n): ToolResult {\n return {\n content: [{ type: 'text', text: formatContent(op, document) }],\n details: {\n action,\n params: params as Record<string, unknown>,\n tasks: document.tasks,\n nextId: document.nextId,\n rev: document.rev,\n ...(op.kind === 'error' ? { error: op.message } : {}),\n // Deliberately no `error` on a partial success: renderResult treats\n // `details.error` as total failure and would hide the rows for the\n // entries that did land.\n ...(op.kind === 'upsert'\n ? {\n upsert: {\n applied: op.items.flatMap((item) => (item.kind === 'failed' ? [] : [item.id])),\n failed: op.failed,\n },\n }\n : {}),\n },\n };\n}\n\n/** Envelope for a native assignment batch, including ids used by the consolidated TUI result. */\nexport function buildAssignmentResult(\n params: TaskMutationParams,\n document: TaskDocument,\n text: string,\n assignment: AssignmentSummary,\n): ToolResult {\n return {\n content: [{ type: 'text', text }],\n details: {\n action: 'assign',\n params: params as Record<string, unknown>,\n tasks: document.tasks,\n nextId: document.nextId,\n rev: document.rev,\n assignment,\n },\n };\n}\n\n/** Envelope for delegation actions, which do not flow through the reducer. */\nexport function buildTextResult(\n action: TaskAction,\n params: TaskMutationParams,\n document: TaskDocument,\n text: string,\n error?: string,\n): ToolResult {\n return {\n content: [{ type: 'text', text: error ? `Error: ${error}` : text }],\n details: {\n action,\n params: params as Record<string, unknown>,\n tasks: document.tasks,\n nextId: document.nextId,\n rev: document.rev,\n ...(error ? { error } : {}),\n },\n };\n}\n"],"mappings":"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"}