@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,174 @@
1
+ const require_task = require("./task-Dqy88_rr.cjs");
2
+ require("./config-BPNE_wEU.cjs");
3
+ const require_telemetry = require("./telemetry-I4md7Xzz.cjs");
4
+ const require_taskResult = require("./taskResult-D2G7b4w-.cjs");
5
+ const require_promptGuidelines = require("./promptGuidelines-j_SZTzlH.cjs");
6
+ const require_reducer = require("./reducer-BV0YIZ2o.cjs");
7
+ let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
8
+ let _agimon_ai_doompi_core_piExtension = require("@agimon-ai/doompi-core/piExtension");
9
+ //#region src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.ts
10
+ /** @deprecated Task usage policy now lives only in the tool description. */
11
+ const DEFAULT_PROMPT_SNIPPET = "Track only complex, multi-step jobs that benefit from persistent progress or delegation; skip simple work";
12
+ var task_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliTool)((context) => (0, _agimon_ai_doompi_core_piExtension.definePiTool)(createTaskTool(context.root.toolDependencies)));
13
+ const ACTION_ATTRIBUTE = "tool.action";
14
+ const TASK_ID_ATTRIBUTE = "task.id";
15
+ const REDUCER_ACTIONS = /* @__PURE__ */ new Set([
16
+ "upsert",
17
+ "list",
18
+ "get",
19
+ "delete",
20
+ "clear"
21
+ ]);
22
+ var TaskToolExecutionError = class extends Error {};
23
+ function actionableTaskError(action, message) {
24
+ return new TaskToolExecutionError([
25
+ `Task ${action} failed: ${message}`,
26
+ "",
27
+ "Options:",
28
+ "- List the task board and inspect the current ids, states, and blockers.",
29
+ "- Correct the arguments or state conflict, then retry once.",
30
+ "- Ask the user before cancelling work or changing dependencies to recover."
31
+ ].join("\n"));
32
+ }
33
+ /**
34
+ * Reject a field that belongs to a different action.
35
+ *
36
+ * The params schema is flat and shared across every action, so this is the only
37
+ * place `{"action":"upsert","id":3}` can be caught — and it must be, because
38
+ * the entry it carries has no id and would silently create a duplicate task.
39
+ */
40
+ function rejectStrayFields(action, params) {
41
+ const stray = Object.keys(params).filter((key) => params[key] !== void 0 && !require_task.taskActionAcceptsField(action, key));
42
+ if (stray.length === 0) return;
43
+ const hint = action === "upsert" ? ` ${require_task.MSG_UPSERT_FIELD_MISPLACED}` : "";
44
+ throw actionableTaskError(action, `${action} does not accept ${stray.join(", ")}.${hint}`);
45
+ }
46
+ /** assignments[] is the only assign contract, even when it contains one task. */
47
+ function resolveAssignments(params) {
48
+ const assignments = params.assignments;
49
+ if (!assignments || assignments.length === 0) throw actionableTaskError("assign", "assign requires a non-empty assignments[] array");
50
+ return assignments;
51
+ }
52
+ function assignOptions(request, signal) {
53
+ return {
54
+ agent: request.agent,
55
+ inlineAgent: request.inlineAgent,
56
+ instructions: request.instructions,
57
+ relevantFiles: request.relevantFiles,
58
+ priorFindings: request.priorFindings,
59
+ model: request.model,
60
+ context: request.context,
61
+ signal
62
+ };
63
+ }
64
+ async function executeAssignmentBatch(delegation, assignments, signal, report) {
65
+ const results = [];
66
+ for (const [index, assignment] of assignments.entries()) {
67
+ let outcome;
68
+ try {
69
+ outcome = await delegation.assign(assignment.id, assignOptions(assignment, signal));
70
+ } catch (error) {
71
+ report?.error(require_telemetry.TASK_EVENT.toolFailed, error, {
72
+ [ACTION_ATTRIBUTE]: "assign",
73
+ [TASK_ID_ATTRIBUTE]: assignment.id
74
+ });
75
+ outcome = {
76
+ ok: false,
77
+ message: error instanceof Error ? error.message : String(error)
78
+ };
79
+ }
80
+ results.push({
81
+ index,
82
+ id: assignment.id,
83
+ agent: assignment.agent,
84
+ ...outcome
85
+ });
86
+ }
87
+ return results;
88
+ }
89
+ /** Run an action through the reducer, persisting only when it produced a change. */
90
+ async function executeReducerAction(store, action, params, maxTasks) {
91
+ const { document, value } = await store.mutate((current) => {
92
+ const result = require_reducer.applyTaskMutation(current, action, params, void 0, maxTasks);
93
+ return {
94
+ ...require_reducer.isCommittingOp(result.op) ? { document: result.document } : {},
95
+ value: result
96
+ };
97
+ });
98
+ if (value.op.kind === "error") throw actionableTaskError(action, value.op.message);
99
+ if (value.op.kind === "upsert" && value.op.applied === 0) throw actionableTaskError(action, require_taskResult.formatUpsertFailureText(value.op));
100
+ return require_taskResult.buildToolResult(action, params, document, value.op);
101
+ }
102
+ function createTaskTool(dependencies, renderers = {}) {
103
+ const { store, delegation, maxTasks = 15 } = dependencies;
104
+ return {
105
+ name: require_task.TOOL_NAME,
106
+ label: require_task.TOOL_LABEL,
107
+ description: "Shared task list for complex jobs, plus delegation of tracked tasks to background subagents. Use it only when persistent coordination pays off: dependencies, parallel workstreams, or a long-running plan. Do not use it for simple requests, routine edits, straightforward command sequences, or merely because the user listed multiple steps. Actions: upsert (create and change tasks), list, get, delete (tombstone), clear (close the list), assign (delegate through assignments[]), cancel (stop a delegated run). The list is shared across the current session tree, including delegated subagents, while unrelated sessions start empty and stores persist until retention cleanup.",
108
+ promptGuidelines: require_promptGuidelines.DEFAULT_PROMPT_GUIDELINES,
109
+ parameters: require_task.TaskParamsSchema,
110
+ renderShell: "self",
111
+ async execute(_toolCallId, params, signal, onUpdate, ctx) {
112
+ const action = params.action;
113
+ const mutationParams = params;
114
+ try {
115
+ await dependencies.waitUntilReady?.(ctx, signal);
116
+ rejectStrayFields(action, mutationParams);
117
+ if (REDUCER_ACTIONS.has(action)) {
118
+ const result = await executeReducerAction(store, action, mutationParams, maxTasks);
119
+ dependencies.onChange?.();
120
+ return result;
121
+ }
122
+ if (action === "assign") {
123
+ const assignments = resolveAssignments(mutationParams);
124
+ const first = assignments[0];
125
+ const progress = assignments.length === 1 && first ? `Delegating task #${first.id}...` : `Delegating ${assignments.length} tasks...`;
126
+ onUpdate?.(require_taskResult.buildTextResult(action, mutationParams, store.snapshot, progress));
127
+ const results = await executeAssignmentBatch(delegation, assignments, signal, dependencies.report);
128
+ dependencies.onChange?.();
129
+ const text = require_taskResult.formatAssignmentResults(results);
130
+ const assigned = results.flatMap((item) => item.ok ? [item.id] : []);
131
+ if (assigned.length === 0) throw actionableTaskError(action, text);
132
+ return require_taskResult.buildAssignmentResult(mutationParams, store.snapshot, text, {
133
+ assigned,
134
+ failed: results.length - assigned.length
135
+ });
136
+ }
137
+ onUpdate?.(require_taskResult.buildTextResult(action, mutationParams, store.snapshot, `Requesting cancellation for task #${mutationParams.id ?? "unknown"}...`));
138
+ const outcome = await delegation.cancel(mutationParams.id ?? NaN);
139
+ dependencies.onChange?.();
140
+ if (!outcome.ok) throw actionableTaskError(action, outcome.message);
141
+ return require_taskResult.buildTextResult(action, mutationParams, store.snapshot, outcome.message, void 0);
142
+ } catch (error) {
143
+ dependencies.report?.error(require_telemetry.TASK_EVENT.toolFailed, error, {
144
+ [ACTION_ATTRIBUTE]: action,
145
+ ...mutationParams.id === void 0 ? {} : { [TASK_ID_ATTRIBUTE]: mutationParams.id }
146
+ });
147
+ if (error instanceof TaskToolExecutionError) throw error;
148
+ throw actionableTaskError(action, error instanceof Error ? error.message : String(error));
149
+ }
150
+ },
151
+ ...renderers
152
+ };
153
+ }
154
+ //#endregion
155
+ Object.defineProperty(exports, "DEFAULT_PROMPT_SNIPPET", {
156
+ enumerable: true,
157
+ get: function() {
158
+ return DEFAULT_PROMPT_SNIPPET;
159
+ }
160
+ });
161
+ Object.defineProperty(exports, "createTaskTool", {
162
+ enumerable: true,
163
+ get: function() {
164
+ return createTaskTool;
165
+ }
166
+ });
167
+ Object.defineProperty(exports, "task_cli_default", {
168
+ enumerable: true,
169
+ get: function() {
170
+ return task_cli_default;
171
+ }
172
+ });
173
+
174
+ //# sourceMappingURL=task.cli-CiTkjUaX.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.cli-CiTkjUaX.cjs","names":["defineCliTool","definePiTool","taskActionAcceptsField","MSG_UPSERT_FIELD_MISPLACED","TASK_EVENT","applyTaskMutation","isCommittingOp","formatUpsertFailureText","buildToolResult","TOOL_NAME","TOOL_LABEL","DEFAULT_PROMPT_GUIDELINES","TaskParamsSchema","buildTextResult","formatAssignmentResults","buildAssignmentResult"],"sources":["../src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.ts"],"sourcesContent":["import { defineCliTool, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport { definePiTool, type PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\nimport type { ToolDefinition, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { DEFAULT_PROMPT_GUIDELINES } from '../../../../../../constants/promptGuidelines';\nimport type { TaskAction, TaskAssignment, TaskMutationParams } from '../../../../../../models/task';\nimport {\n MSG_UPSERT_FIELD_MISPLACED,\n TaskParamsSchema,\n TOOL_LABEL,\n TOOL_NAME,\n taskActionAcceptsField,\n} from '../../../../../../schemas/task';\nimport { DEFAULT_MAX_TASKS } from '../../../../../../services/config';\nimport type { AssignOptions, DelegationManager, DelegationOutcome } from '../../../../../../services/delegation';\nimport { applyTaskMutation, isCommittingOp, type ReducerAction } from '../../../../../../services/reducer';\nimport {\n type AssignmentItemResult,\n buildAssignmentResult,\n buildTextResult,\n buildToolResult,\n formatAssignmentResults,\n formatUpsertFailureText,\n type ToolResult,\n} from '../../../../../../services/taskResult';\nimport type { TaskStore } from '../../../../../../services/taskStore';\nimport { TASK_EVENT, type TaskFailureReporter } from '../../../../../../types/telemetry';\nimport type { TaskPiScope } from '../../_lib/root.cli';\n\nexport { DEFAULT_PROMPT_GUIDELINES } from '../../../../../../constants/promptGuidelines';\n\n/** @deprecated Task usage policy now lives only in the tool description. */\nexport const DEFAULT_PROMPT_SNIPPET =\n 'Track only complex, multi-step jobs that benefit from persistent progress or delegation; skip simple work';\n\nexport interface TaskToolDependencies {\n store: TaskStore;\n delegation: DelegationManager;\n maxTasks?: number;\n onChange?: () => void;\n report?: TaskFailureReporter;\n waitUntilReady?: (context: ExtensionContext, signal?: AbortSignal) => Promise<void>;\n}\n\nexport default defineCliTool((context: WithRoot<PiPluginContext, TaskPiScope>) =>\n definePiTool(createTaskTool(context.root.toolDependencies)),\n);\n\nconst ACTION_ATTRIBUTE = 'tool.action';\nconst TASK_ID_ATTRIBUTE = 'task.id';\nconst REDUCER_ACTIONS = new Set<TaskAction>(['upsert', 'list', 'get', 'delete', 'clear']);\n\nclass TaskToolExecutionError extends Error {}\n\nfunction actionableTaskError(action: TaskAction, message: string): TaskToolExecutionError {\n return new TaskToolExecutionError(\n [\n `Task ${action} failed: ${message}`,\n '',\n 'Options:',\n '- List the task board and inspect the current ids, states, and blockers.',\n '- Correct the arguments or state conflict, then retry once.',\n '- Ask the user before cancelling work or changing dependencies to recover.',\n ].join('\\n'),\n );\n}\n\n/**\n * Reject a field that belongs to a different action.\n *\n * The params schema is flat and shared across every action, so this is the only\n * place `{\"action\":\"upsert\",\"id\":3}` can be caught — and it must be, because\n * the entry it carries has no id and would silently create a duplicate task.\n */\nfunction rejectStrayFields(action: TaskAction, params: TaskMutationParams): void {\n const stray = Object.keys(params).filter((key) => params[key] !== undefined && !taskActionAcceptsField(action, key));\n if (stray.length === 0) return;\n const hint = action === 'upsert' ? ` ${MSG_UPSERT_FIELD_MISPLACED}` : '';\n throw actionableTaskError(action, `${action} does not accept ${stray.join(', ')}.${hint}`);\n}\n\n/** assignments[] is the only assign contract, even when it contains one task. */\nfunction resolveAssignments(params: TaskMutationParams): TaskAssignment[] {\n const assignments = params.assignments;\n if (!assignments || assignments.length === 0) {\n throw actionableTaskError('assign', 'assign requires a non-empty assignments[] array');\n }\n return assignments;\n}\n\nfunction assignOptions(request: TaskAssignment, signal: AbortSignal | undefined): AssignOptions {\n return {\n agent: request.agent,\n inlineAgent: request.inlineAgent,\n instructions: request.instructions,\n relevantFiles: request.relevantFiles,\n priorFindings: request.priorFindings,\n model: request.model,\n context: request.context,\n signal,\n };\n}\n\nasync function executeAssignmentBatch(\n delegation: DelegationManager,\n assignments: readonly TaskAssignment[],\n signal: AbortSignal | undefined,\n report: TaskFailureReporter | undefined,\n): Promise<AssignmentItemResult[]> {\n const results: AssignmentItemResult[] = [];\n for (const [index, assignment] of assignments.entries()) {\n let outcome: DelegationOutcome;\n try {\n outcome = await delegation.assign(assignment.id, assignOptions(assignment, signal));\n } catch (error) {\n report?.error(TASK_EVENT.toolFailed, error, {\n [ACTION_ATTRIBUTE]: 'assign',\n [TASK_ID_ATTRIBUTE]: assignment.id,\n });\n outcome = { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n results.push({ index, id: assignment.id, agent: assignment.agent, ...outcome });\n }\n return results;\n}\n\n/** Run an action through the reducer, persisting only when it produced a change. */\nasync function executeReducerAction(\n store: TaskStore,\n action: ReducerAction,\n params: TaskMutationParams,\n maxTasks: number,\n): Promise<ToolResult> {\n const { document, value } = await store.mutate((current) => {\n const result = applyTaskMutation(current, action, params, undefined, maxTasks);\n return {\n ...(isCommittingOp(result.op) ? { document: result.document } : {}),\n value: result,\n };\n });\n if (value.op.kind === 'error') throw actionableTaskError(action, value.op.message);\n // An upsert that applied nothing is a failed call: it wrote nothing and left\n // `rev` alone, so it must not read to the model as a success. A batch where\n // some entries landed returns normally — that is what partial apply means.\n if (value.op.kind === 'upsert' && value.op.applied === 0) {\n throw actionableTaskError(action, formatUpsertFailureText(value.op));\n }\n // `document` is the committed document, so `details.rev` matches what landed\n // on disk; `value.document` is the pre-write copy and lags by one.\n return buildToolResult(action, params, document, value.op);\n}\n\nexport function createTaskTool(\n dependencies: TaskToolDependencies,\n renderers: Pick<ToolDefinition<typeof TaskParamsSchema, ToolResult['details']>, 'renderCall' | 'renderResult'> = {},\n): ToolDefinition<typeof TaskParamsSchema, ToolResult['details']> {\n const { store, delegation, maxTasks = DEFAULT_MAX_TASKS } = dependencies;\n\n return {\n name: TOOL_NAME,\n label: TOOL_LABEL,\n description:\n 'Shared task list for complex jobs, plus delegation of tracked tasks to background subagents. Use it only when persistent coordination pays off: dependencies, parallel workstreams, or a long-running plan. Do not use it for simple requests, routine edits, straightforward command sequences, or merely because the user listed multiple steps. Actions: upsert (create and change tasks), list, get, delete (tombstone), clear (close the list), assign (delegate through assignments[]), cancel (stop a delegated run). The list is shared across the current session tree, including delegated subagents, while unrelated sessions start empty and stores persist until retention cleanup.',\n promptGuidelines: DEFAULT_PROMPT_GUIDELINES,\n parameters: TaskParamsSchema,\n // Task rows carry their own status colors. Owning the shell prevents Pi's\n // pending/success/error background fill from obscuring those row states.\n renderShell: 'self',\n\n async execute(_toolCallId, params, signal, onUpdate, ctx) {\n const action = params.action as TaskAction;\n const mutationParams = params as TaskMutationParams;\n\n try {\n await dependencies.waitUntilReady?.(ctx, signal);\n rejectStrayFields(action, mutationParams);\n if (REDUCER_ACTIONS.has(action)) {\n const result = await executeReducerAction(store, action as ReducerAction, mutationParams, maxTasks);\n dependencies.onChange?.();\n return result;\n }\n\n if (action === 'assign') {\n const assignments = resolveAssignments(mutationParams);\n const first = assignments[0];\n const progress =\n assignments.length === 1 && first\n ? `Delegating task #${first.id}...`\n : `Delegating ${assignments.length} tasks...`;\n onUpdate?.(buildTextResult(action, mutationParams, store.snapshot, progress));\n const results = await executeAssignmentBatch(delegation, assignments, signal, dependencies.report);\n dependencies.onChange?.();\n const text = formatAssignmentResults(results);\n const assigned = results.flatMap((item) => (item.ok ? [item.id] : []));\n if (assigned.length === 0) throw actionableTaskError(action, text);\n return buildAssignmentResult(mutationParams, store.snapshot, text, {\n assigned,\n failed: results.length - assigned.length,\n });\n }\n\n onUpdate?.(\n buildTextResult(\n action,\n mutationParams,\n store.snapshot,\n `Requesting cancellation for task #${mutationParams.id ?? 'unknown'}...`,\n ),\n );\n const outcome = await delegation.cancel(mutationParams.id ?? Number.NaN);\n dependencies.onChange?.();\n if (!outcome.ok) throw actionableTaskError(action, outcome.message);\n return buildTextResult(action, mutationParams, store.snapshot, outcome.message, undefined);\n } catch (error) {\n // Rethrown so pi still renders the failure to the model; recorded\n // because this is where a store fault becomes visible to the user.\n dependencies.report?.error(TASK_EVENT.toolFailed, error, {\n [ACTION_ATTRIBUTE]: action,\n ...(mutationParams.id === undefined ? {} : { [TASK_ID_ATTRIBUTE]: mutationParams.id }),\n });\n if (error instanceof TaskToolExecutionError) throw error;\n throw actionableTaskError(action, error instanceof Error ? error.message : String(error));\n }\n },\n\n ...renderers,\n };\n}\n"],"mappings":";;;;;;;;;;AAgCA,MAAa,yBACX;AAWF,IAAA,oBAAA,GAAeA,qCAAAA,cAAAA,EAAe,aAAA,GAC5BC,mCAAAA,aAAAA,CAAa,eAAe,QAAQ,KAAK,gBAAgB,CAAC,CAC5D;AAEA,MAAM,mBAAmB;AACzB,MAAM,oBAAoB;AAC1B,MAAM,kCAAkB,IAAI,IAAgB;CAAC;CAAU;CAAQ;CAAO;CAAU;AAAO,CAAC;AAExF,IAAM,yBAAN,cAAqC,MAAM,CAAC;AAE5C,SAAS,oBAAoB,QAAoB,SAAyC;CACxF,OAAO,IAAI,uBACT;EACE,QAAQ,OAAO,WAAW;EAC1B;EACA;EACA;EACA;EACA;CACF,CAAC,CAAC,KAAK,IAAI,CACb;AACF;;;;;;;;AASA,SAAS,kBAAkB,QAAoB,QAAkC;CAC/E,MAAM,QAAQ,OAAO,KAAK,MAAM,CAAC,CAAC,QAAQ,QAAQ,OAAO,SAAS,KAAA,KAAa,CAACC,aAAAA,uBAAuB,QAAQ,GAAG,CAAC;CACnH,IAAI,MAAM,WAAW,GAAG;CACxB,MAAM,OAAO,WAAW,WAAW,IAAIC,aAAAA,+BAA+B;CACtE,MAAM,oBAAoB,QAAQ,GAAG,OAAO,mBAAmB,MAAM,KAAK,IAAI,EAAE,GAAG,MAAM;AAC3F;;AAGA,SAAS,mBAAmB,QAA8C;CACxE,MAAM,cAAc,OAAO;CAC3B,IAAI,CAAC,eAAe,YAAY,WAAW,GACzC,MAAM,oBAAoB,UAAU,iDAAiD;CAEvF,OAAO;AACT;AAEA,SAAS,cAAc,SAAyB,QAAgD;CAC9F,OAAO;EACL,OAAO,QAAQ;EACf,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACtB,eAAe,QAAQ;EACvB,eAAe,QAAQ;EACvB,OAAO,QAAQ;EACf,SAAS,QAAQ;EACjB;CACF;AACF;AAEA,eAAe,uBACb,YACA,aACA,QACA,QACiC;CACjC,MAAM,UAAkC,CAAC;CACzC,KAAK,MAAM,CAAC,OAAO,eAAe,YAAY,QAAQ,GAAG;EACvD,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,WAAW,OAAO,WAAW,IAAI,cAAc,YAAY,MAAM,CAAC;EACpF,SAAS,OAAO;GACd,QAAQ,MAAMC,kBAAAA,WAAW,YAAY,OAAO;KACzC,mBAAmB;KACnB,oBAAoB,WAAW;GAClC,CAAC;GACD,UAAU;IAAE,IAAI;IAAO,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GAAE;EACzF;EACA,QAAQ,KAAK;GAAE;GAAO,IAAI,WAAW;GAAI,OAAO,WAAW;GAAO,GAAG;EAAQ,CAAC;CAChF;CACA,OAAO;AACT;;AAGA,eAAe,qBACb,OACA,QACA,QACA,UACqB;CACrB,MAAM,EAAE,UAAU,UAAU,MAAM,MAAM,QAAQ,YAAY;EAC1D,MAAM,SAASC,gBAAAA,kBAAkB,SAAS,QAAQ,QAAQ,KAAA,GAAW,QAAQ;EAC7E,OAAO;GACL,GAAIC,gBAAAA,eAAe,OAAO,EAAE,IAAI,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;GACjE,OAAO;EACT;CACF,CAAC;CACD,IAAI,MAAM,GAAG,SAAS,SAAS,MAAM,oBAAoB,QAAQ,MAAM,GAAG,OAAO;CAIjF,IAAI,MAAM,GAAG,SAAS,YAAY,MAAM,GAAG,YAAY,GACrD,MAAM,oBAAoB,QAAQC,mBAAAA,wBAAwB,MAAM,EAAE,CAAC;CAIrE,OAAOC,mBAAAA,gBAAgB,QAAQ,QAAQ,UAAU,MAAM,EAAE;AAC3D;AAEA,SAAgB,eACd,cACA,YAAiH,CAAC,GAClD;CAChE,MAAM,EAAE,OAAO,YAAY,WAAA,OAAiC;CAE5D,OAAO;EACL,MAAMC,aAAAA;EACN,OAAOC,aAAAA;EACP,aACE;EACF,kBAAkBC,yBAAAA;EAClB,YAAYC,aAAAA;EAGZ,aAAa;EAEb,MAAM,QAAQ,aAAa,QAAQ,QAAQ,UAAU,KAAK;GACxD,MAAM,SAAS,OAAO;GACtB,MAAM,iBAAiB;GAEvB,IAAI;IACF,MAAM,aAAa,iBAAiB,KAAK,MAAM;IAC/C,kBAAkB,QAAQ,cAAc;IACxC,IAAI,gBAAgB,IAAI,MAAM,GAAG;KAC/B,MAAM,SAAS,MAAM,qBAAqB,OAAO,QAAyB,gBAAgB,QAAQ;KAClG,aAAa,WAAW;KACxB,OAAO;IACT;IAEA,IAAI,WAAW,UAAU;KACvB,MAAM,cAAc,mBAAmB,cAAc;KACrD,MAAM,QAAQ,YAAY;KAC1B,MAAM,WACJ,YAAY,WAAW,KAAK,QACxB,oBAAoB,MAAM,GAAG,OAC7B,cAAc,YAAY,OAAO;KACvC,WAAWC,mBAAAA,gBAAgB,QAAQ,gBAAgB,MAAM,UAAU,QAAQ,CAAC;KAC5E,MAAM,UAAU,MAAM,uBAAuB,YAAY,aAAa,QAAQ,aAAa,MAAM;KACjG,aAAa,WAAW;KACxB,MAAM,OAAOC,mBAAAA,wBAAwB,OAAO;KAC5C,MAAM,WAAW,QAAQ,SAAS,SAAU,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAE;KACrE,IAAI,SAAS,WAAW,GAAG,MAAM,oBAAoB,QAAQ,IAAI;KACjE,OAAOC,mBAAAA,sBAAsB,gBAAgB,MAAM,UAAU,MAAM;MACjE;MACA,QAAQ,QAAQ,SAAS,SAAS;KACpC,CAAC;IACH;IAEA,WACEF,mBAAAA,gBACE,QACA,gBACA,MAAM,UACN,qCAAqC,eAAe,MAAM,UAAU,IACtE,CACF;IACA,MAAM,UAAU,MAAM,WAAW,OAAO,eAAe,MAAM,GAAU;IACvE,aAAa,WAAW;IACxB,IAAI,CAAC,QAAQ,IAAI,MAAM,oBAAoB,QAAQ,QAAQ,OAAO;IAClE,OAAOA,mBAAAA,gBAAgB,QAAQ,gBAAgB,MAAM,UAAU,QAAQ,SAAS,KAAA,CAAS;GAC3F,SAAS,OAAO;IAGd,aAAa,QAAQ,MAAMT,kBAAAA,WAAW,YAAY,OAAO;MACtD,mBAAmB;KACpB,GAAI,eAAe,OAAO,KAAA,IAAY,CAAC,IAAI,GAAG,oBAAoB,eAAe,GAAG;IACtF,CAAC;IACD,IAAI,iBAAiB,wBAAwB,MAAM;IACnD,MAAM,oBAAoB,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;GAC1F;EACF;EAEA,GAAG;CACL;AACF"}
@@ -0,0 +1,63 @@
1
+ //#region src/models/taskGraph.ts
2
+ const COMPLETED_STATUS = "completed";
3
+ const DELETED_STATUS = "deleted";
4
+ /** True when a non-empty list has no visible work left to finish. */
5
+ function isTaskListComplete(taskList) {
6
+ const visible = taskList.filter((task) => task.status !== DELETED_STATUS);
7
+ return visible.length > 0 && visible.every((task) => task.status === COMPLETED_STATUS);
8
+ }
9
+ /**
10
+ * Would merging `newBlockedBy` into `taskId`'s dependencies introduce a cycle?
11
+ *
12
+ * Takes the proposed additions explicitly so the reducer can ask the question
13
+ * before mutating anything.
14
+ */
15
+ function detectCycle(taskList, taskId, newBlockedBy) {
16
+ const edges = /* @__PURE__ */ new Map();
17
+ for (const task of taskList) if (task.id === taskId) edges.set(task.id, [.../* @__PURE__ */ new Set([...task.blockedBy ?? [], ...newBlockedBy])]);
18
+ else edges.set(task.id, task.blockedBy ? [...task.blockedBy] : []);
19
+ const visiting = /* @__PURE__ */ new Set();
20
+ const visited = /* @__PURE__ */ new Set();
21
+ const hasCycleFrom = (node) => {
22
+ if (visiting.has(node)) return true;
23
+ if (visited.has(node)) return false;
24
+ visiting.add(node);
25
+ for (const next of edges.get(node) ?? []) if (hasCycleFrom(next)) return true;
26
+ visiting.delete(node);
27
+ visited.add(node);
28
+ return false;
29
+ };
30
+ for (const node of edges.keys()) if (hasCycleFrom(node)) return true;
31
+ return false;
32
+ }
33
+ /** Inverse adjacency: for each task, which tasks list it in their blockedBy. */
34
+ function deriveBlocks(taskList) {
35
+ const blocks = /* @__PURE__ */ new Map();
36
+ for (const task of taskList) for (const dep of task.blockedBy ?? []) {
37
+ const dependents = blocks.get(dep) ?? [];
38
+ dependents.push(task.id);
39
+ blocks.set(dep, dependents);
40
+ }
41
+ return blocks;
42
+ }
43
+ /**
44
+ * Blocking dependencies of a task that are not yet resolved.
45
+ *
46
+ * `completed` clears a dependency; `failed` deliberately does not, so a failed
47
+ * delegation keeps its dependents blocked instead of silently releasing work
48
+ * that was never actually finished.
49
+ */
50
+ function unresolvedBlockers(taskList, task) {
51
+ return (task.blockedBy ?? []).filter((dep) => {
52
+ const blocker = taskList.find((candidate) => candidate.id === dep);
53
+ if (!blocker) return false;
54
+ return blocker.status !== COMPLETED_STATUS && blocker.status !== DELETED_STATUS;
55
+ });
56
+ }
57
+ function isBlocked(taskList, task) {
58
+ return unresolvedBlockers(taskList, task).length > 0;
59
+ }
60
+ //#endregion
61
+ export { unresolvedBlockers as a, isTaskListComplete as i, detectCycle as n, isBlocked as r, deriveBlocks as t };
62
+
63
+ //# sourceMappingURL=taskGraph-BOQvT0-M.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskGraph-BOQvT0-M.mjs","names":[],"sources":["../src/models/taskGraph.ts"],"sourcesContent":["import type { Task } from './task';\n\nconst COMPLETED_STATUS: Task['status'] = 'completed';\nconst DELETED_STATUS: Task['status'] = 'deleted';\n\n/** True when a non-empty list has no visible work left to finish. */\nexport function isTaskListComplete(taskList: readonly Task[]): boolean {\n const visible = taskList.filter((task) => task.status !== DELETED_STATUS);\n return visible.length > 0 && visible.every((task) => task.status === COMPLETED_STATUS);\n}\n\n/**\n * Would merging `newBlockedBy` into `taskId`'s dependencies introduce a cycle?\n *\n * Takes the proposed additions explicitly so the reducer can ask the question\n * before mutating anything.\n */\nexport function detectCycle(taskList: readonly Task[], taskId: number, newBlockedBy: readonly number[]): boolean {\n const edges = new Map<number, number[]>();\n for (const task of taskList) {\n if (task.id === taskId) {\n edges.set(task.id, [...new Set([...(task.blockedBy ?? []), ...newBlockedBy])]);\n } else {\n edges.set(task.id, task.blockedBy ? [...task.blockedBy] : []);\n }\n }\n\n const visiting = new Set<number>();\n const visited = new Set<number>();\n const hasCycleFrom = (node: number): boolean => {\n if (visiting.has(node)) return true;\n if (visited.has(node)) return false;\n visiting.add(node);\n for (const next of edges.get(node) ?? []) {\n if (hasCycleFrom(next)) return true;\n }\n visiting.delete(node);\n visited.add(node);\n return false;\n };\n\n for (const node of edges.keys()) {\n if (hasCycleFrom(node)) return true;\n }\n return false;\n}\n\n/** Inverse adjacency: for each task, which tasks list it in their blockedBy. */\nexport function deriveBlocks(taskList: readonly Task[]): Map<number, number[]> {\n const blocks = new Map<number, number[]>();\n for (const task of taskList) {\n for (const dep of task.blockedBy ?? []) {\n const dependents = blocks.get(dep) ?? [];\n dependents.push(task.id);\n blocks.set(dep, dependents);\n }\n }\n return blocks;\n}\n\n/**\n * Blocking dependencies of a task that are not yet resolved.\n *\n * `completed` clears a dependency; `failed` deliberately does not, so a failed\n * delegation keeps its dependents blocked instead of silently releasing work\n * that was never actually finished.\n */\nexport function unresolvedBlockers(taskList: readonly Task[], task: Task): number[] {\n return (task.blockedBy ?? []).filter((dep) => {\n const blocker = taskList.find((candidate) => candidate.id === dep);\n if (!blocker) return false;\n return blocker.status !== COMPLETED_STATUS && blocker.status !== DELETED_STATUS;\n });\n}\n\nexport function isBlocked(taskList: readonly Task[], task: Task): boolean {\n return unresolvedBlockers(taskList, task).length > 0;\n}\n"],"mappings":";AAEA,MAAM,mBAAmC;AACzC,MAAM,iBAAiC;;AAGvC,SAAgB,mBAAmB,UAAoC;CACrE,MAAM,UAAU,SAAS,QAAQ,SAAS,KAAK,WAAW,cAAc;CACxE,OAAO,QAAQ,SAAS,KAAK,QAAQ,OAAO,SAAS,KAAK,WAAW,gBAAgB;AACvF;;;;;;;AAQA,SAAgB,YAAY,UAA2B,QAAgB,cAA0C;CAC/G,MAAM,wBAAQ,IAAI,IAAsB;CACxC,KAAK,MAAM,QAAQ,UACjB,IAAI,KAAK,OAAO,QACd,MAAM,IAAI,KAAK,IAAI,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAI,KAAK,aAAa,CAAC,GAAI,GAAG,YAAY,CAAC,CAAC,CAAC;MAE7E,MAAM,IAAI,KAAK,IAAI,KAAK,YAAY,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC;CAIhE,MAAM,2BAAW,IAAI,IAAY;CACjC,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,gBAAgB,SAA0B;EAC9C,IAAI,SAAS,IAAI,IAAI,GAAG,OAAO;EAC/B,IAAI,QAAQ,IAAI,IAAI,GAAG,OAAO;EAC9B,SAAS,IAAI,IAAI;EACjB,KAAK,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,CAAC,GACrC,IAAI,aAAa,IAAI,GAAG,OAAO;EAEjC,SAAS,OAAO,IAAI;EACpB,QAAQ,IAAI,IAAI;EAChB,OAAO;CACT;CAEA,KAAK,MAAM,QAAQ,MAAM,KAAK,GAC5B,IAAI,aAAa,IAAI,GAAG,OAAO;CAEjC,OAAO;AACT;;AAGA,SAAgB,aAAa,UAAkD;CAC7E,MAAM,yBAAS,IAAI,IAAsB;CACzC,KAAK,MAAM,QAAQ,UACjB,KAAK,MAAM,OAAO,KAAK,aAAa,CAAC,GAAG;EACtC,MAAM,aAAa,OAAO,IAAI,GAAG,KAAK,CAAC;EACvC,WAAW,KAAK,KAAK,EAAE;EACvB,OAAO,IAAI,KAAK,UAAU;CAC5B;CAEF,OAAO;AACT;;;;;;;;AASA,SAAgB,mBAAmB,UAA2B,MAAsB;CAClF,QAAQ,KAAK,aAAa,CAAC,EAAA,CAAG,QAAQ,QAAQ;EAC5C,MAAM,UAAU,SAAS,MAAM,cAAc,UAAU,OAAO,GAAG;EACjE,IAAI,CAAC,SAAS,OAAO;EACrB,OAAO,QAAQ,WAAW,oBAAoB,QAAQ,WAAW;CACnE,CAAC;AACH;AAEA,SAAgB,UAAU,UAA2B,MAAqB;CACxE,OAAO,mBAAmB,UAAU,IAAI,CAAC,CAAC,SAAS;AACrD"}
@@ -0,0 +1,92 @@
1
+ //#region src/models/taskGraph.ts
2
+ const COMPLETED_STATUS = "completed";
3
+ const DELETED_STATUS = "deleted";
4
+ /** True when a non-empty list has no visible work left to finish. */
5
+ function isTaskListComplete(taskList) {
6
+ const visible = taskList.filter((task) => task.status !== DELETED_STATUS);
7
+ return visible.length > 0 && visible.every((task) => task.status === COMPLETED_STATUS);
8
+ }
9
+ /**
10
+ * Would merging `newBlockedBy` into `taskId`'s dependencies introduce a cycle?
11
+ *
12
+ * Takes the proposed additions explicitly so the reducer can ask the question
13
+ * before mutating anything.
14
+ */
15
+ function detectCycle(taskList, taskId, newBlockedBy) {
16
+ const edges = /* @__PURE__ */ new Map();
17
+ for (const task of taskList) if (task.id === taskId) edges.set(task.id, [.../* @__PURE__ */ new Set([...task.blockedBy ?? [], ...newBlockedBy])]);
18
+ else edges.set(task.id, task.blockedBy ? [...task.blockedBy] : []);
19
+ const visiting = /* @__PURE__ */ new Set();
20
+ const visited = /* @__PURE__ */ new Set();
21
+ const hasCycleFrom = (node) => {
22
+ if (visiting.has(node)) return true;
23
+ if (visited.has(node)) return false;
24
+ visiting.add(node);
25
+ for (const next of edges.get(node) ?? []) if (hasCycleFrom(next)) return true;
26
+ visiting.delete(node);
27
+ visited.add(node);
28
+ return false;
29
+ };
30
+ for (const node of edges.keys()) if (hasCycleFrom(node)) return true;
31
+ return false;
32
+ }
33
+ /** Inverse adjacency: for each task, which tasks list it in their blockedBy. */
34
+ function deriveBlocks(taskList) {
35
+ const blocks = /* @__PURE__ */ new Map();
36
+ for (const task of taskList) for (const dep of task.blockedBy ?? []) {
37
+ const dependents = blocks.get(dep) ?? [];
38
+ dependents.push(task.id);
39
+ blocks.set(dep, dependents);
40
+ }
41
+ return blocks;
42
+ }
43
+ /**
44
+ * Blocking dependencies of a task that are not yet resolved.
45
+ *
46
+ * `completed` clears a dependency; `failed` deliberately does not, so a failed
47
+ * delegation keeps its dependents blocked instead of silently releasing work
48
+ * that was never actually finished.
49
+ */
50
+ function unresolvedBlockers(taskList, task) {
51
+ return (task.blockedBy ?? []).filter((dep) => {
52
+ const blocker = taskList.find((candidate) => candidate.id === dep);
53
+ if (!blocker) return false;
54
+ return blocker.status !== COMPLETED_STATUS && blocker.status !== DELETED_STATUS;
55
+ });
56
+ }
57
+ function isBlocked(taskList, task) {
58
+ return unresolvedBlockers(taskList, task).length > 0;
59
+ }
60
+ //#endregion
61
+ Object.defineProperty(exports, "deriveBlocks", {
62
+ enumerable: true,
63
+ get: function() {
64
+ return deriveBlocks;
65
+ }
66
+ });
67
+ Object.defineProperty(exports, "detectCycle", {
68
+ enumerable: true,
69
+ get: function() {
70
+ return detectCycle;
71
+ }
72
+ });
73
+ Object.defineProperty(exports, "isBlocked", {
74
+ enumerable: true,
75
+ get: function() {
76
+ return isBlocked;
77
+ }
78
+ });
79
+ Object.defineProperty(exports, "isTaskListComplete", {
80
+ enumerable: true,
81
+ get: function() {
82
+ return isTaskListComplete;
83
+ }
84
+ });
85
+ Object.defineProperty(exports, "unresolvedBlockers", {
86
+ enumerable: true,
87
+ get: function() {
88
+ return unresolvedBlockers;
89
+ }
90
+ });
91
+
92
+ //# sourceMappingURL=taskGraph-BskRslrr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskGraph-BskRslrr.cjs","names":[],"sources":["../src/models/taskGraph.ts"],"sourcesContent":["import type { Task } from './task';\n\nconst COMPLETED_STATUS: Task['status'] = 'completed';\nconst DELETED_STATUS: Task['status'] = 'deleted';\n\n/** True when a non-empty list has no visible work left to finish. */\nexport function isTaskListComplete(taskList: readonly Task[]): boolean {\n const visible = taskList.filter((task) => task.status !== DELETED_STATUS);\n return visible.length > 0 && visible.every((task) => task.status === COMPLETED_STATUS);\n}\n\n/**\n * Would merging `newBlockedBy` into `taskId`'s dependencies introduce a cycle?\n *\n * Takes the proposed additions explicitly so the reducer can ask the question\n * before mutating anything.\n */\nexport function detectCycle(taskList: readonly Task[], taskId: number, newBlockedBy: readonly number[]): boolean {\n const edges = new Map<number, number[]>();\n for (const task of taskList) {\n if (task.id === taskId) {\n edges.set(task.id, [...new Set([...(task.blockedBy ?? []), ...newBlockedBy])]);\n } else {\n edges.set(task.id, task.blockedBy ? [...task.blockedBy] : []);\n }\n }\n\n const visiting = new Set<number>();\n const visited = new Set<number>();\n const hasCycleFrom = (node: number): boolean => {\n if (visiting.has(node)) return true;\n if (visited.has(node)) return false;\n visiting.add(node);\n for (const next of edges.get(node) ?? []) {\n if (hasCycleFrom(next)) return true;\n }\n visiting.delete(node);\n visited.add(node);\n return false;\n };\n\n for (const node of edges.keys()) {\n if (hasCycleFrom(node)) return true;\n }\n return false;\n}\n\n/** Inverse adjacency: for each task, which tasks list it in their blockedBy. */\nexport function deriveBlocks(taskList: readonly Task[]): Map<number, number[]> {\n const blocks = new Map<number, number[]>();\n for (const task of taskList) {\n for (const dep of task.blockedBy ?? []) {\n const dependents = blocks.get(dep) ?? [];\n dependents.push(task.id);\n blocks.set(dep, dependents);\n }\n }\n return blocks;\n}\n\n/**\n * Blocking dependencies of a task that are not yet resolved.\n *\n * `completed` clears a dependency; `failed` deliberately does not, so a failed\n * delegation keeps its dependents blocked instead of silently releasing work\n * that was never actually finished.\n */\nexport function unresolvedBlockers(taskList: readonly Task[], task: Task): number[] {\n return (task.blockedBy ?? []).filter((dep) => {\n const blocker = taskList.find((candidate) => candidate.id === dep);\n if (!blocker) return false;\n return blocker.status !== COMPLETED_STATUS && blocker.status !== DELETED_STATUS;\n });\n}\n\nexport function isBlocked(taskList: readonly Task[], task: Task): boolean {\n return unresolvedBlockers(taskList, task).length > 0;\n}\n"],"mappings":";AAEA,MAAM,mBAAmC;AACzC,MAAM,iBAAiC;;AAGvC,SAAgB,mBAAmB,UAAoC;CACrE,MAAM,UAAU,SAAS,QAAQ,SAAS,KAAK,WAAW,cAAc;CACxE,OAAO,QAAQ,SAAS,KAAK,QAAQ,OAAO,SAAS,KAAK,WAAW,gBAAgB;AACvF;;;;;;;AAQA,SAAgB,YAAY,UAA2B,QAAgB,cAA0C;CAC/G,MAAM,wBAAQ,IAAI,IAAsB;CACxC,KAAK,MAAM,QAAQ,UACjB,IAAI,KAAK,OAAO,QACd,MAAM,IAAI,KAAK,IAAI,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAI,KAAK,aAAa,CAAC,GAAI,GAAG,YAAY,CAAC,CAAC,CAAC;MAE7E,MAAM,IAAI,KAAK,IAAI,KAAK,YAAY,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC;CAIhE,MAAM,2BAAW,IAAI,IAAY;CACjC,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,gBAAgB,SAA0B;EAC9C,IAAI,SAAS,IAAI,IAAI,GAAG,OAAO;EAC/B,IAAI,QAAQ,IAAI,IAAI,GAAG,OAAO;EAC9B,SAAS,IAAI,IAAI;EACjB,KAAK,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,CAAC,GACrC,IAAI,aAAa,IAAI,GAAG,OAAO;EAEjC,SAAS,OAAO,IAAI;EACpB,QAAQ,IAAI,IAAI;EAChB,OAAO;CACT;CAEA,KAAK,MAAM,QAAQ,MAAM,KAAK,GAC5B,IAAI,aAAa,IAAI,GAAG,OAAO;CAEjC,OAAO;AACT;;AAGA,SAAgB,aAAa,UAAkD;CAC7E,MAAM,yBAAS,IAAI,IAAsB;CACzC,KAAK,MAAM,QAAQ,UACjB,KAAK,MAAM,OAAO,KAAK,aAAa,CAAC,GAAG;EACtC,MAAM,aAAa,OAAO,IAAI,GAAG,KAAK,CAAC;EACvC,WAAW,KAAK,KAAK,EAAE;EACvB,OAAO,IAAI,KAAK,UAAU;CAC5B;CAEF,OAAO;AACT;;;;;;;;AASA,SAAgB,mBAAmB,UAA2B,MAAsB;CAClF,QAAQ,KAAK,aAAa,CAAC,EAAA,CAAG,QAAQ,QAAQ;EAC5C,MAAM,UAAU,SAAS,MAAM,cAAc,UAAU,OAAO,GAAG;EACjE,IAAI,CAAC,SAAS,OAAO;EACrB,OAAO,QAAQ,WAAW,oBAAoB,QAAQ,WAAW;CACnE,CAAC;AACH;AAEA,SAAgB,UAAU,UAA2B,MAAqB;CACxE,OAAO,mBAAmB,UAAU,IAAI,CAAC,CAAC,SAAS;AACrD"}
@@ -1,5 +1,5 @@
1
- import { Task } from "./types.cjs";
2
- //#region src/store/taskGraph.d.ts
1
+ import { s as Task } from "./task-hLh4BOO7.mjs";
2
+ //#region src/models/taskGraph.d.ts
3
3
  /** True when a non-empty list has no visible work left to finish. */
4
4
  declare function isTaskListComplete(taskList: readonly Task[]): boolean;
5
5
  /**
@@ -21,5 +21,5 @@ declare function deriveBlocks(taskList: readonly Task[]): Map<number, number[]>;
21
21
  declare function unresolvedBlockers(taskList: readonly Task[], task: Task): number[];
22
22
  declare function isBlocked(taskList: readonly Task[], task: Task): boolean;
23
23
  //#endregion
24
- export { deriveBlocks, detectCycle, isBlocked, isTaskListComplete, unresolvedBlockers };
25
- //# sourceMappingURL=taskGraph.d.cts.map
24
+ export { unresolvedBlockers as a, isTaskListComplete as i, detectCycle as n, isBlocked as r, deriveBlocks as t };
25
+ //# sourceMappingURL=taskGraph-YQXCfXTn.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskGraph-YQXCfXTn.d.mts","names":[],"sources":["../src/models/taskGraph.ts"],"mappings":";;;iBAMgB,mBAAmB,mBAAmB;;;;;;;iBAWtC,YAAY,mBAAmB,QAAQ,gBAAgB;;iBA+BvD,aAAa,mBAAmB,SAAS;;;;;;;;iBAmBzC,mBAAmB,mBAAmB,QAAQ,MAAM;iBAQpD,UAAU,mBAAmB,QAAQ,MAAM"}
@@ -0,0 +1,175 @@
1
+ const require_config = require("./config-BPNE_wEU.cjs");
2
+ const require_selectors = require("./selectors-b-69vb4W.cjs");
3
+ const require_format_cli = require("./format.cli-ChQsP1MQ.cjs");
4
+ let _agimon_ai_doompi_ui_theme = require("@agimon-ai/doompi-ui/theme");
5
+ let _earendil_works_pi_tui = require("@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 = require_config.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 = require_selectors.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 = require_selectors.deriveTaskProjection(this.options.getTasks());
104
+ if (projection.visible.length === 0) return [];
105
+ const truncate = (line) => (0, _earendil_works_pi_tui.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 = require_config.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 = require_selectors.selectOverlayLayoutFromProjection(projection, require_config.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 = (0, _agimon_ai_doompi_ui_theme.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", "├─")} ${require_format_cli.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
+ Object.defineProperty(exports, "TaskOverlay", {
163
+ enumerable: true,
164
+ get: function() {
165
+ return TaskOverlay;
166
+ }
167
+ });
168
+ Object.defineProperty(exports, "registerTaskCollapseShortcut", {
169
+ enumerable: true,
170
+ get: function() {
171
+ return registerTaskCollapseShortcut;
172
+ }
173
+ });
174
+
175
+ //# sourceMappingURL=taskOverlay-B5wJHiml.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskOverlay-B5wJHiml.cjs","names":["resolveCollapseKey","visibleTasks","deriveTaskProjection","truncateToWidth","selectOverlayLayoutFromProjection","getMaxWidgetLines","allocateAgentIdentityColor","formatOverlayTaskLine"],"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":";;;;;;AAWA,MAAM,aAAa;AACnB,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;;AAQzB,SAAgB,6BACd,IACA,SACA,gBACA,UACM;CACN,MAAM,MAAMA,eAAAA,mBAAmB;CAC/B,IAAI,QAAA,OAA0B;CAC9B,GAAG,iBAAiB,KAAc;EAChC,aAAa;EACb,SAAS,OAAO,YAAY;GAC1B,IAAI,CAAC,SAAS,KAAK,CAAC,QAAQ,OAAO;GACnC,MAAM,eAAe,OAAO;GAC5B,IAAI,CAAC,SAAS,KAAK,CAAC,QAAQ,aAAa,GAAG;GAC5C,QAAQ,eAAe;EACzB;CACF,CAAC;AACH;;;;;;;;AASA,IAAa,cAAb,MAAyB;CACvB;CACA;CACA,mBAA2B;CAC3B;CACA;CACA,YAAoB;CAEpB,YAAY,SAA6B;EACvC,KAAK,UAAU;CACjB;;CAGA,SAAS,KAA+B;EACtC,IAAI,QAAQ,KAAK,OAAO;EACxB,IAAI,KAAK,SAAS,KAAK,kBAAkB,KAAK,MAAM,UAAU,YAAY,KAAA,CAAS;EACnF,KAAK,kBAAkB;EACvB,KAAK,QAAQ;EACb,KAAK,mBAAmB;EACxB,KAAK,MAAM,KAAA;CACb;CAEA,SAAe;EACb,IAAI,CAAC,KAAK,OAAO;GACf,KAAK,kBAAkB;GACvB;EACF;EACA,MAAM,QAAQC,kBAAAA,aAAa,KAAK,QAAQ,SAAS,CAAC;EAElD,IAAI,MAAM,WAAW,GAAG;GACtB,IAAI,KAAK,kBAAkB;IACzB,KAAK,MAAM,UAAU,YAAY,KAAA,CAAS;IAC1C,KAAK,mBAAmB;IACxB,KAAK,MAAM,KAAA;GACb;GACA,KAAK,kBAAkB;GACvB;EACF;EAEA,IAAI,KAAK,kBAAkB;GACzB,KAAK,kBAAkB,KAAK;GAC5B,KAAK,KAAK,cAAc;GACxB;EACF;EAEA,KAAK,MAAM,UACT,aACC,KAAK,iBAAiB;GACrB,KAAK,MAAM;GACX,OAAO;IACL,SAAS,UAAkB,KAAK,aAAa,KAAK,OAAO,SAAS,cAAc,KAAK;IACrF,kBAAkB,CAElB;GACF;EACF,GACA,EAAE,WAAW,cAAc,CAC7B;EACA,KAAK,mBAAmB;EACxB,KAAK,kBAAkB,KAAK;CAC9B;CAEA,kBAA0B,OAA8B;EACtD,MAAM,uBAAuB,MAAM,MAChC,SAAS,KAAK,WAAW,aAAa,KAAK,YAAY,UAAU,SACpE;EACA,IAAI,KAAK,aAAa,CAAC,KAAK,oBAAoB,CAAC,sBAAsB;GACrE,KAAK,kBAAkB;GACvB;EACF;EACA,IAAI,KAAK,eAAe;EACxB,KAAK,gBAAgB,kBAAkB,KAAK,KAAK,cAAc,GAAG,gBAAgB;EAClF,KAAK,cAAc,QAAQ;CAC7B;CAEA,oBAAkC;EAChC,IAAI,KAAK,eAAe,cAAc,KAAK,aAAa;EACxD,KAAK,gBAAgB,KAAA;CACvB;CAEA,iBAAuB;EACrB,KAAK,YAAY,CAAC,KAAK;EACvB,KAAK,kBAAkB,KAAK,QAAQ,SAAS,CAAC;EAE9C,KAAK,KAAK,cAAc,IAAI;CAC9B;CAEA,eAAwB;EACtB,OAAO,KAAK;CACd;CAEA,aAAqB,OAAc,OAAyB;EAC1D,MAAM,aAAaC,kBAAAA,qBAAqB,KAAK,QAAQ,SAAS,CAAC;EAC/D,IAAI,WAAW,QAAQ,WAAW,GAAG,OAAO,CAAC;EAE7C,MAAM,YAAY,UAAA,GAAyBC,uBAAAA,gBAAAA,CAAgB,MAAM,OAAO,GAAG;EAC3E,MAAM,eAAe,WAAW,gBAAgB,WAAW;EAC3D,MAAM,cAAc,WAAW,gBAAgB,MAAM;EACrD,IAAI,cAAc,GAAG,gBAAgB,IAAI,WAAW,OAAO,UAAU,GAAG,WAAW,OAAO,MAAM;EAChG,IAAI,WAAW,OAAO,SAAS,GAAG,eAAe,MAAM,WAAW,OAAO,OAAO;EAChF,MAAM,UAAU,SAAS,GAAG,MAAM,GAAG,cAAc,WAAW,EAAE,GAAG,MAAM,GAAG,cAAc,WAAW,GAAG;EAExG,IAAI,KAAK,WAAW;GAClB,MAAM,MAAMH,eAAAA,mBAAmB;GAC/B,MAAM,OAAO,QAAA,QAA2B,cAAc,GAAG,IAAI;GAC7D,OAAO,KAAK,mBAAmB,CAAC,SAAS,SAAS,GAAG,MAAM,GAAG,OAAO,IAAI,EAAE,GAAG,MAAM,GAAG,OAAO,IAAI,GAAG,CAAC,CAAC;EACzG;EAEA,MAAM,SAASI,kBAAAA,kCAAkC,YAAYC,eAAAA,kBAAkB,IAAI,CAAC;EACpF,MAAM,iCAAiB,IAAI,IAAmD;EAC9E,MAAM,8BAAc,IAAI,IAA2D;EACnF,KAAK,MAAM,QAAQ,OAAO,SAAS;GACjC,IAAI,KAAK,YAAY,UAAU,WAAW;GAC1C,MAAM,WAAW,KAAK,WAAW,SAAS,KAAK,WAAW;GAC1D,MAAM,SAAA,GAAQC,2BAAAA,2BAAAA,CAA2B,UAAU,cAAc;GACjE,eAAe,IAAI,KAAK;GACxB,YAAY,IAAI,UAAU,KAAK;EACjC;EAEA,MAAM,QAAQ,KAAK,IAAI;EACvB,MAAM,QAAQ,CAAC,OAAO;EACtB,KAAK,MAAM,QAAQ,OAAO,SAAS;GACjC,MAAM,WAAW,KAAK,QAAQ,WAAW,YAAY,IAAI;GACzD,MAAM,WAAW,KAAK,YAAY,SAAS,KAAK,YAAY;GAC5D,MAAM,KACJ,SACE,GAAG,MAAM,GAAG,OAAO,IAAI,EAAE,GAAGC,mBAAAA,sBAC1B,MACA,OACA,WAAW,SACX,UACA,OACA,WAAW,YAAY,IAAI,QAAQ,IAAI,KAAA,CACzC,GACF,CACF;EACF;EAEA,MAAM,SAAS,OAAO,kBAAkB,OAAO;EAC/C,IAAI,WAAW,GAAG;GAChB,MAAM,OAAO,MAAM,SAAS;GAC5B,MAAM,QAAQ,MAAM,KAAK,CAAC,QAAQ,MAAM,IAAI;GAC5C,OAAO,KAAK,mBAAmB,KAAK;EACtC;EAEA,MAAM,QAAkB,CAAC;EACzB,IAAI,OAAO,kBAAkB,GAAG,MAAM,KAAK,GAAG,OAAO,gBAAgB,WAAW;EAChF,IAAI,OAAO,gBAAgB,GAAG,MAAM,KAAK,GAAG,OAAO,cAAc,SAAS;EAC1E,MAAM,UAAU,MAAM,SAAS,IAAI,IAAI,OAAO,SAAS,MAAM,KAAK,IAAI,EAAE,KAAK,IAAI,OAAO;EACxF,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO,IAAI,EAAE,GAAG,MAAM,GAAG,OAAO,OAAO,GAAG,CAAC;EAC3E,OAAO,KAAK,mBAAmB,KAAK;CACtC;;CAGA,mBAA2B,OAA2B;EACpD,IAAI,MAAM,WAAW,GAAG,OAAO;EAC/B,MAAM,KAAK,EAAE;EACb,OAAO;CACT;CAEA,UAAgB;EACd,KAAK,kBAAkB;EACvB,IAAI,KAAK,OAAO,KAAK,MAAM,UAAU,YAAY,KAAA,CAAS;EAC1D,KAAK,mBAAmB;EACxB,KAAK,MAAM,KAAA;EACX,KAAK,QAAQ,KAAA;EACb,KAAK,YAAY;CACnB;AACF"}