@agimon-ai/doompi-task 0.0.1-alpha.8 → 0.0.1-alpha.80

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 (576) hide show
  1. package/README.md +123 -15
  2. package/dist/_virtual/_rolldown/runtime.cjs +23 -1
  3. package/dist/api-contracts.cjs +7 -0
  4. package/dist/api-contracts.d.cts +2 -0
  5. package/dist/api-contracts.d.mts +2 -0
  6. package/dist/api-contracts.mjs +2 -0
  7. package/dist/commands.cjs +4 -2
  8. package/dist/commands.d.cts +2 -14
  9. package/dist/commands.d.mts +2 -14
  10. package/dist/commands.mjs +2 -2
  11. package/dist/config.cjs +19 -2
  12. package/dist/config.d.cts +2 -38
  13. package/dist/config.d.mts +2 -38
  14. package/dist/config.mjs +2 -2
  15. package/dist/delegation-manager.cjs +10 -0
  16. package/dist/delegation-manager.d.cts +3 -0
  17. package/dist/delegation-manager.d.mts +3 -0
  18. package/dist/delegation-manager.mjs +3 -0
  19. package/dist/extensions/mcp.cjs +1866 -0
  20. package/dist/extensions/mcp.cjs.map +1 -0
  21. package/dist/extensions/mcp.d.cts +5 -0
  22. package/dist/extensions/mcp.d.cts.map +1 -0
  23. package/dist/extensions/mcp.d.mts +5 -0
  24. package/dist/extensions/mcp.d.mts.map +1 -0
  25. package/dist/extensions/mcp.mjs +1836 -0
  26. package/dist/extensions/mcp.mjs.map +1 -0
  27. package/dist/extensions/pi.cjs +49 -1
  28. package/dist/extensions/pi.cjs.map +1 -1
  29. package/dist/extensions/pi.d.cts +5 -2
  30. package/dist/extensions/pi.d.cts.map +1 -0
  31. package/dist/extensions/pi.d.mts +5 -2
  32. package/dist/extensions/pi.d.mts.map +1 -0
  33. package/dist/extensions/pi.mjs +44 -1
  34. package/dist/extensions/pi.mjs.map +1 -1
  35. package/dist/extensions/server.cjs +57 -0
  36. package/dist/extensions/server.cjs.map +1 -0
  37. package/dist/extensions/server.d.cts +5 -0
  38. package/dist/extensions/server.d.cts.map +1 -0
  39. package/dist/extensions/server.d.mts +5 -0
  40. package/dist/extensions/server.d.mts.map +1 -0
  41. package/dist/extensions/server.mjs +52 -0
  42. package/dist/extensions/server.mjs.map +1 -0
  43. package/dist/extensions/web.mjs +1013 -0
  44. package/dist/extensions/web.mjs.map +1 -0
  45. package/dist/index.cjs +106 -1
  46. package/dist/index.d.cts +16 -15
  47. package/dist/index.d.mts +16 -15
  48. package/dist/index.mjs +16 -1
  49. package/dist/logSinkTelemetry.cjs +6 -2
  50. package/dist/logSinkTelemetry.d.cts +3 -51
  51. package/dist/logSinkTelemetry.d.mts +3 -51
  52. package/dist/logSinkTelemetry.mjs +3 -2
  53. package/dist/src/constants/promptGuidelines.cjs +26 -0
  54. package/dist/src/constants/promptGuidelines.cjs.map +1 -0
  55. package/dist/src/constants/promptGuidelines.d.cts +13 -0
  56. package/dist/src/constants/promptGuidelines.d.cts.map +1 -0
  57. package/dist/src/constants/promptGuidelines.d.mts +13 -0
  58. package/dist/src/constants/promptGuidelines.d.mts.map +1 -0
  59. package/dist/src/constants/promptGuidelines.mjs +26 -0
  60. package/dist/src/constants/promptGuidelines.mjs.map +1 -0
  61. package/dist/src/constants/task.cjs +6 -0
  62. package/dist/src/constants/task.cjs.map +1 -0
  63. package/dist/src/constants/task.d.cts +4 -0
  64. package/dist/src/constants/task.d.cts.map +1 -0
  65. package/dist/src/constants/task.d.mts +4 -0
  66. package/dist/src/constants/task.d.mts.map +1 -0
  67. package/dist/src/constants/task.mjs +6 -0
  68. package/dist/src/constants/task.mjs.map +1 -0
  69. package/dist/src/extensions/(backend)/channel/_lib/task-graph.cjs +90 -0
  70. package/dist/src/extensions/(backend)/channel/_lib/task-graph.cjs.map +1 -0
  71. package/dist/src/extensions/(backend)/channel/_lib/task-graph.mjs +89 -0
  72. package/dist/src/extensions/(backend)/channel/_lib/task-graph.mjs.map +1 -0
  73. package/dist/src/extensions/(backend)/channel/task-graph.server.cjs +7 -0
  74. package/dist/src/extensions/(backend)/channel/task-graph.server.cjs.map +1 -0
  75. package/dist/src/extensions/(backend)/channel/task-graph.server.mjs +8 -0
  76. package/dist/src/extensions/(backend)/channel/task-graph.server.mjs.map +1 -0
  77. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs +317 -0
  78. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs.map +1 -0
  79. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.cts +39 -0
  80. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.cts.map +1 -0
  81. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.mts +39 -0
  82. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.mts.map +1 -0
  83. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs +317 -0
  84. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs.map +1 -0
  85. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs +95 -0
  86. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs.map +1 -0
  87. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs +95 -0
  88. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs.map +1 -0
  89. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.cjs +30 -0
  90. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.cjs.map +1 -0
  91. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.cts +20 -0
  92. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.cts.map +1 -0
  93. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.mts +20 -0
  94. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.mts.map +1 -0
  95. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.mjs +29 -0
  96. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.mjs.map +1 -0
  97. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.cjs +19 -0
  98. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.cjs.map +1 -0
  99. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.mjs +19 -0
  100. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.mjs.map +1 -0
  101. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.cjs +8 -0
  102. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.cjs.map +1 -0
  103. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.mjs +9 -0
  104. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.mjs.map +1 -0
  105. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.cjs +7 -0
  106. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.cjs.map +1 -0
  107. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.mjs +8 -0
  108. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.mjs.map +1 -0
  109. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.cjs +6 -0
  110. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.cjs.map +1 -0
  111. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.mjs +6 -0
  112. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.mjs.map +1 -0
  113. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs +6 -0
  114. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs.map +1 -0
  115. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs +6 -0
  116. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs.map +1 -0
  117. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.cjs +6 -0
  118. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.cjs.map +1 -0
  119. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.mjs +6 -0
  120. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.mjs.map +1 -0
  121. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.cjs +6 -0
  122. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.cjs.map +1 -0
  123. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.mjs +6 -0
  124. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.mjs.map +1 -0
  125. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs +7 -0
  126. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs.map +1 -0
  127. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs +8 -0
  128. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs.map +1 -0
  129. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs +7 -0
  130. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs.map +1 -0
  131. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs +8 -0
  132. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs.map +1 -0
  133. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs +7 -0
  134. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs.map +1 -0
  135. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs +8 -0
  136. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs.map +1 -0
  137. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.cjs +7 -0
  138. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.cjs.map +1 -0
  139. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.mjs +8 -0
  140. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.mjs.map +1 -0
  141. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.cjs +20 -0
  142. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.cjs.map +1 -0
  143. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.mjs +20 -0
  144. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.mjs.map +1 -0
  145. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.cjs +7 -0
  146. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.cjs.map +1 -0
  147. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.mjs +8 -0
  148. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.mjs.map +1 -0
  149. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +11 -0
  150. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
  151. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +12 -0
  152. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
  153. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +7 -0
  154. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
  155. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +8 -0
  156. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
  157. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.cjs +160 -0
  158. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.cjs.map +1 -0
  159. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.cts +25 -0
  160. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.cts.map +1 -0
  161. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.mts +25 -0
  162. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.mts.map +1 -0
  163. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.mjs +157 -0
  164. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.mjs.map +1 -0
  165. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.cjs +7 -0
  166. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.cjs.map +1 -0
  167. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.mjs +8 -0
  168. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.mjs.map +1 -0
  169. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.cjs +7 -0
  170. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.cjs.map +1 -0
  171. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.mjs +8 -0
  172. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.mjs.map +1 -0
  173. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.cjs +7 -0
  174. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.cjs.map +1 -0
  175. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.mjs +8 -0
  176. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.mjs.map +1 -0
  177. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.cjs +333 -0
  178. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.cjs.map +1 -0
  179. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.cts +61 -0
  180. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.cts.map +1 -0
  181. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.mts +61 -0
  182. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.mts.map +1 -0
  183. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.mjs +322 -0
  184. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.mjs.map +1 -0
  185. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.cjs +9 -0
  186. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.cjs.map +1 -0
  187. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.mjs +9 -0
  188. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.mjs.map +1 -0
  189. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.cjs +149 -0
  190. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.cjs.map +1 -0
  191. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.cts +59 -0
  192. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.cts.map +1 -0
  193. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.mts +59 -0
  194. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.mts.map +1 -0
  195. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.mjs +142 -0
  196. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.mjs.map +1 -0
  197. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.cjs +358 -0
  198. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.cjs.map +1 -0
  199. package/dist/{tui/taskSpace.d.cts → src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts} +12 -12
  200. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts.map +1 -0
  201. package/dist/{tui/taskSpace.d.mts → src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.mts} +12 -12
  202. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.mts.map +1 -0
  203. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.mjs +355 -0
  204. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.mjs.map +1 -0
  205. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.cjs +165 -0
  206. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.cjs.map +1 -0
  207. package/dist/{tui → src/extensions/workspaces/sessions/(frontend)/overlay/_lib}/taskOverlay.d.cts +8 -7
  208. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.cts.map +1 -0
  209. package/dist/{tui → src/extensions/workspaces/sessions/(frontend)/overlay/_lib}/taskOverlay.d.mts +8 -7
  210. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.mts.map +1 -0
  211. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.mjs +164 -0
  212. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.mjs.map +1 -0
  213. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.cjs +13 -0
  214. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.cjs.map +1 -0
  215. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.mjs +13 -0
  216. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.mjs.map +1 -0
  217. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.cjs +7 -0
  218. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.cjs.map +1 -0
  219. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.mjs +8 -0
  220. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.mjs.map +1 -0
  221. package/dist/src/models/task.cjs +29 -0
  222. package/dist/src/models/task.cjs.map +1 -0
  223. package/dist/{store/types.d.cts → src/models/task.d.cts} +52 -31
  224. package/dist/src/models/task.d.cts.map +1 -0
  225. package/dist/{store/types.d.mts → src/models/task.d.mts} +52 -31
  226. package/dist/src/models/task.d.mts.map +1 -0
  227. package/dist/src/models/task.mjs +26 -0
  228. package/dist/src/models/task.mjs.map +1 -0
  229. package/dist/src/models/taskGraph.cjs +67 -0
  230. package/dist/{store → src/models}/taskGraph.cjs.map +1 -1
  231. package/dist/{store → src/models}/taskGraph.d.cts +7 -8
  232. package/dist/src/models/taskGraph.d.cts.map +1 -0
  233. package/dist/{store → src/models}/taskGraph.d.mts +7 -8
  234. package/dist/src/models/taskGraph.d.mts.map +1 -0
  235. package/dist/src/models/taskGraph.mjs +63 -0
  236. package/dist/{store → src/models}/taskGraph.mjs.map +1 -1
  237. package/dist/src/schemas/apiContracts.cjs +51 -0
  238. package/dist/src/schemas/apiContracts.cjs.map +1 -0
  239. package/dist/src/schemas/apiContracts.d.cts +53 -0
  240. package/dist/src/schemas/apiContracts.d.cts.map +1 -0
  241. package/dist/src/schemas/apiContracts.d.mts +53 -0
  242. package/dist/src/schemas/apiContracts.d.mts.map +1 -0
  243. package/dist/src/schemas/apiContracts.mjs +49 -0
  244. package/dist/src/schemas/apiContracts.mjs.map +1 -0
  245. package/dist/src/schemas/task.cjs +130 -0
  246. package/dist/src/schemas/task.cjs.map +1 -0
  247. package/dist/{tool/schema.d.cts → src/schemas/task.d.cts} +46 -29
  248. package/dist/src/schemas/task.d.cts.map +1 -0
  249. package/dist/{tool/schema.d.mts → src/schemas/task.d.mts} +46 -29
  250. package/dist/src/schemas/task.d.mts.map +1 -0
  251. package/dist/src/schemas/task.mjs +117 -0
  252. package/dist/src/schemas/task.mjs.map +1 -0
  253. package/dist/src/services/config/index.cjs +88 -0
  254. package/dist/src/services/config/index.cjs.map +1 -0
  255. package/dist/src/services/config/index.d.cts +42 -0
  256. package/dist/src/services/config/index.d.cts.map +1 -0
  257. package/dist/src/services/config/index.d.mts +42 -0
  258. package/dist/src/services/config/index.d.mts.map +1 -0
  259. package/dist/src/services/config/index.mjs +72 -0
  260. package/dist/src/services/config/index.mjs.map +1 -0
  261. package/dist/src/services/contextContribution/index.cjs +51 -0
  262. package/dist/src/services/contextContribution/index.cjs.map +1 -0
  263. package/dist/src/services/contextContribution/index.mjs +46 -0
  264. package/dist/src/services/contextContribution/index.mjs.map +1 -0
  265. package/dist/src/services/delegation/index.cjs +629 -0
  266. package/dist/src/services/delegation/index.cjs.map +1 -0
  267. package/dist/{delegation/manager.d.cts → src/services/delegation/index.d.cts} +52 -49
  268. package/dist/src/services/delegation/index.d.cts.map +1 -0
  269. package/dist/{delegation/manager.d.mts → src/services/delegation/index.d.mts} +52 -49
  270. package/dist/src/services/delegation/index.d.mts.map +1 -0
  271. package/dist/src/services/delegation/index.mjs +623 -0
  272. package/dist/src/services/delegation/index.mjs.map +1 -0
  273. package/dist/src/services/delegationPlatform/index.cjs +23 -0
  274. package/dist/src/services/delegationPlatform/index.cjs.map +1 -0
  275. package/dist/src/services/delegationPlatform/index.mjs +21 -0
  276. package/dist/src/services/delegationPlatform/index.mjs.map +1 -0
  277. package/dist/src/services/invariants/index.cjs +64 -0
  278. package/dist/src/services/invariants/index.cjs.map +1 -0
  279. package/dist/src/services/invariants/index.d.cts +23 -0
  280. package/dist/src/services/invariants/index.d.cts.map +1 -0
  281. package/dist/src/services/invariants/index.d.mts +23 -0
  282. package/dist/src/services/invariants/index.d.mts.map +1 -0
  283. package/dist/src/services/invariants/index.mjs +62 -0
  284. package/dist/src/services/invariants/index.mjs.map +1 -0
  285. package/dist/src/services/logSinkTelemetry/index.cjs +43 -0
  286. package/dist/src/services/logSinkTelemetry/index.cjs.map +1 -0
  287. package/dist/src/services/logSinkTelemetry/index.d.cts +23 -0
  288. package/dist/src/services/logSinkTelemetry/index.d.cts.map +1 -0
  289. package/dist/src/services/logSinkTelemetry/index.d.mts +23 -0
  290. package/dist/src/services/logSinkTelemetry/index.d.mts.map +1 -0
  291. package/dist/src/services/logSinkTelemetry/index.mjs +41 -0
  292. package/dist/src/services/logSinkTelemetry/index.mjs.map +1 -0
  293. package/dist/src/services/paths/index.cjs +233 -0
  294. package/dist/src/services/paths/index.cjs.map +1 -0
  295. package/dist/src/services/paths/index.d.cts +25 -0
  296. package/dist/src/services/paths/index.d.cts.map +1 -0
  297. package/dist/src/services/paths/index.d.mts +25 -0
  298. package/dist/src/services/paths/index.d.mts.map +1 -0
  299. package/dist/src/services/paths/index.mjs +218 -0
  300. package/dist/src/services/paths/index.mjs.map +1 -0
  301. package/dist/src/services/processLiveness/index.cjs +20 -0
  302. package/dist/src/services/processLiveness/index.cjs.map +1 -0
  303. package/dist/{store/processLiveness.d.cts → src/services/processLiveness/index.d.cts} +3 -4
  304. package/dist/src/services/processLiveness/index.d.cts.map +1 -0
  305. package/dist/{store/processLiveness.d.mts → src/services/processLiveness/index.d.mts} +3 -4
  306. package/dist/src/services/processLiveness/index.d.mts.map +1 -0
  307. package/dist/src/services/processLiveness/index.mjs +20 -0
  308. package/dist/src/services/processLiveness/index.mjs.map +1 -0
  309. package/dist/src/services/reconcile/index.cjs +65 -0
  310. package/dist/src/services/reconcile/index.cjs.map +1 -0
  311. package/dist/{store/reconcile.d.cts → src/services/reconcile/index.d.cts} +8 -9
  312. package/dist/src/services/reconcile/index.d.cts.map +1 -0
  313. package/dist/{store/reconcile.d.mts → src/services/reconcile/index.d.mts} +8 -9
  314. package/dist/src/services/reconcile/index.d.mts.map +1 -0
  315. package/dist/src/services/reconcile/index.mjs +63 -0
  316. package/dist/src/services/reconcile/index.mjs.map +1 -0
  317. package/dist/src/services/reducer/index.cjs +350 -0
  318. package/dist/src/services/reducer/index.cjs.map +1 -0
  319. package/dist/{store/reducer.d.cts → src/services/reducer/index.d.cts} +12 -13
  320. package/dist/src/services/reducer/index.d.cts.map +1 -0
  321. package/dist/{store/reducer.d.mts → src/services/reducer/index.d.mts} +12 -13
  322. package/dist/src/services/reducer/index.d.mts.map +1 -0
  323. package/dist/src/services/reducer/index.mjs +345 -0
  324. package/dist/src/services/reducer/index.mjs.map +1 -0
  325. package/dist/src/services/taskNarration/index.cjs +32 -0
  326. package/dist/src/services/taskNarration/index.cjs.map +1 -0
  327. package/dist/src/services/taskNarration/index.mjs +32 -0
  328. package/dist/src/services/taskNarration/index.mjs.map +1 -0
  329. package/dist/src/services/taskResult/index.cjs +174 -0
  330. package/dist/src/services/taskResult/index.cjs.map +1 -0
  331. package/dist/src/services/taskResult/index.d.cts +50 -0
  332. package/dist/src/services/taskResult/index.d.cts.map +1 -0
  333. package/dist/src/services/taskResult/index.d.mts +50 -0
  334. package/dist/src/services/taskResult/index.d.mts.map +1 -0
  335. package/dist/src/services/taskResult/index.mjs +165 -0
  336. package/dist/src/services/taskResult/index.mjs.map +1 -0
  337. package/dist/src/services/taskStore/index.cjs +216 -0
  338. package/dist/src/services/taskStore/index.cjs.map +1 -0
  339. package/dist/{store/taskStore.d.cts → src/services/taskStore/index.d.cts} +17 -25
  340. package/dist/src/services/taskStore/index.d.cts.map +1 -0
  341. package/dist/{store/taskStore.d.mts → src/services/taskStore/index.d.mts} +17 -25
  342. package/dist/src/services/taskStore/index.d.mts.map +1 -0
  343. package/dist/src/services/taskStore/index.mjs +213 -0
  344. package/dist/src/services/taskStore/index.mjs.map +1 -0
  345. package/dist/src/services/taskTool/index.cjs +106 -0
  346. package/dist/src/services/taskTool/index.cjs.map +1 -0
  347. package/dist/src/services/taskTool/index.mjs +105 -0
  348. package/dist/src/services/taskTool/index.mjs.map +1 -0
  349. package/dist/src/types/delegation.cjs +7 -0
  350. package/dist/src/types/delegation.cjs.map +1 -0
  351. package/dist/src/types/delegation.d.cts +5 -0
  352. package/dist/src/types/delegation.d.cts.map +1 -0
  353. package/dist/src/types/delegation.d.mts +5 -0
  354. package/dist/src/types/delegation.d.mts.map +1 -0
  355. package/dist/src/types/delegation.mjs +7 -0
  356. package/dist/src/types/delegation.mjs.map +1 -0
  357. package/dist/src/types/telemetry.cjs +26 -0
  358. package/dist/src/types/telemetry.cjs.map +1 -0
  359. package/dist/src/types/telemetry.d.cts +35 -0
  360. package/dist/src/types/telemetry.d.cts.map +1 -0
  361. package/dist/src/types/telemetry.d.mts +35 -0
  362. package/dist/src/types/telemetry.d.mts.map +1 -0
  363. package/dist/src/types/telemetry.mjs +26 -0
  364. package/dist/src/types/telemetry.mjs.map +1 -0
  365. package/dist/src/types/webTasks.cjs +7 -0
  366. package/dist/src/types/webTasks.cjs.map +1 -0
  367. package/dist/src/types/webTasks.mjs +7 -0
  368. package/dist/src/types/webTasks.mjs.map +1 -0
  369. package/dist/store-invariants.cjs +5 -0
  370. package/dist/store-invariants.d.cts +2 -0
  371. package/dist/store-invariants.d.mts +2 -0
  372. package/dist/store-invariants.mjs +2 -0
  373. package/dist/store-paths.cjs +14 -0
  374. package/dist/store-paths.d.cts +2 -0
  375. package/dist/store-paths.d.mts +2 -0
  376. package/dist/store-paths.mjs +2 -0
  377. package/dist/store-process-liveness.cjs +3 -0
  378. package/dist/store-process-liveness.d.cts +2 -0
  379. package/dist/store-process-liveness.d.mts +2 -0
  380. package/dist/store-process-liveness.mjs +2 -0
  381. package/dist/store-reconcile.cjs +5 -0
  382. package/dist/store-reconcile.d.cts +2 -0
  383. package/dist/store-reconcile.d.mts +2 -0
  384. package/dist/store-reconcile.mjs +2 -0
  385. package/dist/store-reducer.cjs +8 -0
  386. package/dist/store-reducer.d.cts +2 -0
  387. package/dist/store-reducer.d.mts +2 -0
  388. package/dist/store-reducer.mjs +2 -0
  389. package/dist/store-task-graph.cjs +7 -0
  390. package/dist/store-task-graph.d.cts +2 -0
  391. package/dist/store-task-graph.d.mts +2 -0
  392. package/dist/store-task-graph.mjs +2 -0
  393. package/dist/store-task-store.cjs +3 -0
  394. package/dist/store-task-store.d.cts +2 -0
  395. package/dist/store-task-store.d.mts +2 -0
  396. package/dist/store-task-store.mjs +2 -0
  397. package/dist/store-types.cjs +6 -0
  398. package/dist/store-types.d.cts +2 -0
  399. package/dist/store-types.d.mts +2 -0
  400. package/dist/store-types.mjs +2 -0
  401. package/dist/tool-prompt-guidelines.cjs +3 -0
  402. package/dist/tool-prompt-guidelines.d.cts +2 -0
  403. package/dist/tool-prompt-guidelines.d.mts +2 -0
  404. package/dist/tool-prompt-guidelines.mjs +2 -0
  405. package/dist/tool-response-envelope.cjs +12 -0
  406. package/dist/tool-response-envelope.d.cts +2 -0
  407. package/dist/tool-response-envelope.d.mts +2 -0
  408. package/dist/tool-response-envelope.mjs +2 -0
  409. package/dist/tool-schema.cjs +17 -0
  410. package/dist/tool-schema.d.cts +3 -0
  411. package/dist/tool-schema.d.mts +3 -0
  412. package/dist/tool-schema.mjs +3 -0
  413. package/dist/tool-task-tool.cjs +6 -0
  414. package/dist/tool-task-tool.d.cts +3 -0
  415. package/dist/tool-task-tool.d.mts +3 -0
  416. package/dist/tool-task-tool.mjs +3 -0
  417. package/dist/tui-format.cjs +14 -0
  418. package/dist/tui-format.d.cts +2 -0
  419. package/dist/tui-format.d.mts +2 -0
  420. package/dist/tui-format.mjs +2 -0
  421. package/dist/tui-selectors.cjs +10 -0
  422. package/dist/tui-selectors.d.cts +2 -0
  423. package/dist/tui-selectors.d.mts +2 -0
  424. package/dist/tui-selectors.mjs +2 -0
  425. package/dist/tui-task-overlay.cjs +4 -0
  426. package/dist/tui-task-overlay.d.cts +2 -0
  427. package/dist/tui-task-overlay.d.mts +2 -0
  428. package/dist/tui-task-overlay.mjs +2 -0
  429. package/dist/tui-task-space.cjs +5 -0
  430. package/dist/tui-task-space.d.cts +2 -0
  431. package/dist/tui-task-space.d.mts +2 -0
  432. package/dist/tui-task-space.mjs +2 -0
  433. package/package.json +167 -109
  434. package/src/types/webTasks.ts +24 -0
  435. package/dist/commands.cjs.map +0 -1
  436. package/dist/commands.d.cts.map +0 -1
  437. package/dist/commands.d.mts.map +0 -1
  438. package/dist/commands.mjs.map +0 -1
  439. package/dist/config.cjs.map +0 -1
  440. package/dist/config.d.cts.map +0 -1
  441. package/dist/config.d.mts.map +0 -1
  442. package/dist/config.mjs.map +0 -1
  443. package/dist/delegation/manager.cjs +0 -6
  444. package/dist/delegation/manager.cjs.map +0 -1
  445. package/dist/delegation/manager.d.cts.map +0 -1
  446. package/dist/delegation/manager.d.mts.map +0 -1
  447. package/dist/delegation/manager.mjs +0 -6
  448. package/dist/delegation/manager.mjs.map +0 -1
  449. package/dist/extension.cjs +0 -3
  450. package/dist/extension.cjs.map +0 -1
  451. package/dist/extension.d.cts +0 -12
  452. package/dist/extension.d.cts.map +0 -1
  453. package/dist/extension.d.mts +0 -12
  454. package/dist/extension.d.mts.map +0 -1
  455. package/dist/extension.mjs +0 -3
  456. package/dist/extension.mjs.map +0 -1
  457. package/dist/extensions/doom.cjs +0 -2
  458. package/dist/extensions/doom.cjs.map +0 -1
  459. package/dist/extensions/doom.d.cts +0 -6
  460. package/dist/extensions/doom.d.cts.map +0 -1
  461. package/dist/extensions/doom.d.mts +0 -7
  462. package/dist/extensions/doom.d.mts.map +0 -1
  463. package/dist/extensions/doom.mjs +0 -2
  464. package/dist/extensions/doom.mjs.map +0 -1
  465. package/dist/logSinkTelemetry.cjs.map +0 -1
  466. package/dist/logSinkTelemetry.d.cts.map +0 -1
  467. package/dist/logSinkTelemetry.d.mts.map +0 -1
  468. package/dist/logSinkTelemetry.mjs.map +0 -1
  469. package/dist/store/invariants.cjs +0 -2
  470. package/dist/store/invariants.cjs.map +0 -1
  471. package/dist/store/invariants.d.cts +0 -14
  472. package/dist/store/invariants.d.cts.map +0 -1
  473. package/dist/store/invariants.d.mts +0 -14
  474. package/dist/store/invariants.d.mts.map +0 -1
  475. package/dist/store/invariants.mjs +0 -2
  476. package/dist/store/invariants.mjs.map +0 -1
  477. package/dist/store/paths.cjs +0 -2
  478. package/dist/store/paths.cjs.map +0 -1
  479. package/dist/store/paths.d.cts +0 -23
  480. package/dist/store/paths.d.cts.map +0 -1
  481. package/dist/store/paths.d.mts +0 -23
  482. package/dist/store/paths.d.mts.map +0 -1
  483. package/dist/store/paths.mjs +0 -2
  484. package/dist/store/paths.mjs.map +0 -1
  485. package/dist/store/processLiveness.cjs +0 -2
  486. package/dist/store/processLiveness.cjs.map +0 -1
  487. package/dist/store/processLiveness.d.cts.map +0 -1
  488. package/dist/store/processLiveness.d.mts.map +0 -1
  489. package/dist/store/processLiveness.mjs +0 -2
  490. package/dist/store/processLiveness.mjs.map +0 -1
  491. package/dist/store/reconcile.cjs +0 -2
  492. package/dist/store/reconcile.cjs.map +0 -1
  493. package/dist/store/reconcile.d.cts.map +0 -1
  494. package/dist/store/reconcile.d.mts.map +0 -1
  495. package/dist/store/reconcile.mjs +0 -2
  496. package/dist/store/reconcile.mjs.map +0 -1
  497. package/dist/store/reducer.cjs +0 -3
  498. package/dist/store/reducer.cjs.map +0 -1
  499. package/dist/store/reducer.d.cts.map +0 -1
  500. package/dist/store/reducer.d.mts.map +0 -1
  501. package/dist/store/reducer.mjs +0 -3
  502. package/dist/store/reducer.mjs.map +0 -1
  503. package/dist/store/taskGraph.cjs +0 -2
  504. package/dist/store/taskGraph.d.cts.map +0 -1
  505. package/dist/store/taskGraph.d.mts.map +0 -1
  506. package/dist/store/taskGraph.mjs +0 -2
  507. package/dist/store/taskStore.cjs +0 -2
  508. package/dist/store/taskStore.cjs.map +0 -1
  509. package/dist/store/taskStore.d.cts.map +0 -1
  510. package/dist/store/taskStore.d.mts.map +0 -1
  511. package/dist/store/taskStore.mjs +0 -2
  512. package/dist/store/taskStore.mjs.map +0 -1
  513. package/dist/store/types.cjs +0 -2
  514. package/dist/store/types.cjs.map +0 -1
  515. package/dist/store/types.d.cts.map +0 -1
  516. package/dist/store/types.d.mts.map +0 -1
  517. package/dist/store/types.mjs +0 -2
  518. package/dist/store/types.mjs.map +0 -1
  519. package/dist/tool/promptGuidelines.cjs +0 -2
  520. package/dist/tool/promptGuidelines.cjs.map +0 -1
  521. package/dist/tool/promptGuidelines.d.cts +0 -5
  522. package/dist/tool/promptGuidelines.d.cts.map +0 -1
  523. package/dist/tool/promptGuidelines.d.mts +0 -5
  524. package/dist/tool/promptGuidelines.d.mts.map +0 -1
  525. package/dist/tool/promptGuidelines.mjs +0 -2
  526. package/dist/tool/promptGuidelines.mjs.map +0 -1
  527. package/dist/tool/responseEnvelope.cjs +0 -6
  528. package/dist/tool/responseEnvelope.cjs.map +0 -1
  529. package/dist/tool/responseEnvelope.d.cts +0 -39
  530. package/dist/tool/responseEnvelope.d.cts.map +0 -1
  531. package/dist/tool/responseEnvelope.d.mts +0 -39
  532. package/dist/tool/responseEnvelope.d.mts.map +0 -1
  533. package/dist/tool/responseEnvelope.mjs +0 -6
  534. package/dist/tool/responseEnvelope.mjs.map +0 -1
  535. package/dist/tool/schema.cjs +0 -2
  536. package/dist/tool/schema.cjs.map +0 -1
  537. package/dist/tool/schema.d.cts.map +0 -1
  538. package/dist/tool/schema.d.mts.map +0 -1
  539. package/dist/tool/schema.mjs +0 -2
  540. package/dist/tool/schema.mjs.map +0 -1
  541. package/dist/tool/taskTool.cjs +0 -3
  542. package/dist/tool/taskTool.cjs.map +0 -1
  543. package/dist/tool/taskTool.d.cts +0 -17
  544. package/dist/tool/taskTool.d.cts.map +0 -1
  545. package/dist/tool/taskTool.d.mts +0 -17
  546. package/dist/tool/taskTool.d.mts.map +0 -1
  547. package/dist/tool/taskTool.mjs +0 -3
  548. package/dist/tool/taskTool.mjs.map +0 -1
  549. package/dist/tui/format.cjs +0 -4
  550. package/dist/tui/format.cjs.map +0 -1
  551. package/dist/tui/format.d.cts +0 -62
  552. package/dist/tui/format.d.cts.map +0 -1
  553. package/dist/tui/format.d.mts +0 -62
  554. package/dist/tui/format.d.mts.map +0 -1
  555. package/dist/tui/format.mjs +0 -4
  556. package/dist/tui/format.mjs.map +0 -1
  557. package/dist/tui/selectors.cjs +0 -2
  558. package/dist/tui/selectors.cjs.map +0 -1
  559. package/dist/tui/selectors.d.cts +0 -53
  560. package/dist/tui/selectors.d.cts.map +0 -1
  561. package/dist/tui/selectors.d.mts +0 -53
  562. package/dist/tui/selectors.d.mts.map +0 -1
  563. package/dist/tui/selectors.mjs +0 -2
  564. package/dist/tui/selectors.mjs.map +0 -1
  565. package/dist/tui/taskOverlay.cjs +0 -2
  566. package/dist/tui/taskOverlay.cjs.map +0 -1
  567. package/dist/tui/taskOverlay.d.cts.map +0 -1
  568. package/dist/tui/taskOverlay.d.mts.map +0 -1
  569. package/dist/tui/taskOverlay.mjs +0 -2
  570. package/dist/tui/taskOverlay.mjs.map +0 -1
  571. package/dist/tui/taskSpace.cjs +0 -5
  572. package/dist/tui/taskSpace.cjs.map +0 -1
  573. package/dist/tui/taskSpace.d.cts.map +0 -1
  574. package/dist/tui/taskSpace.d.mts.map +0 -1
  575. package/dist/tui/taskSpace.mjs +0 -5
  576. package/dist/tui/taskSpace.mjs.map +0 -1
@@ -1,11 +1,11 @@
1
- import { InlineAgent } from "@agimon-ai/doompi-extension-contracts/subagent-tool";
2
- //#region src/store/types.d.ts
3
- type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';
4
- declare const DELETED_STATUS: TaskStatus;
5
- type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';
6
- type DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';
1
+ import { InlineAgent } from "@agimon-ai/doompi-core/delegation";
2
+ //#region src/models/task.d.ts
3
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';
4
+ export declare const DELETED_STATUS: TaskStatus;
5
+ export type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';
6
+ export type DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';
7
7
  /** Terminal result of a delegated subagent run, copied off the delegation response. */
8
- interface DelegationResult {
8
+ export interface DelegationResult {
9
9
  status: string;
10
10
  output?: string;
11
11
  outputPath?: string;
@@ -21,7 +21,7 @@ interface DelegationResult {
21
21
  * genuinely-running delegation from one orphaned by a harness crash, since the
22
22
  * child dies with its parent but the file survives.
23
23
  */
24
- interface TaskDelegation {
24
+ export interface TaskDelegation {
25
25
  requestId: string;
26
26
  agent: string;
27
27
  state: DelegationState;
@@ -33,7 +33,7 @@ interface TaskDelegation {
33
33
  endedAt?: string;
34
34
  result?: DelegationResult;
35
35
  }
36
- interface Task {
36
+ export interface Task {
37
37
  id: number;
38
38
  subject: string;
39
39
  description?: string;
@@ -46,15 +46,15 @@ interface Task {
46
46
  updatedAt?: string;
47
47
  delegation?: TaskDelegation;
48
48
  }
49
- declare const STORE_SCHEMA_VERSION = 1;
49
+ export declare const STORE_SCHEMA_VERSION = 1;
50
50
  /** The complete on-disk document. `rev` increments on every committed write. */
51
- interface TaskDocument {
51
+ export interface TaskDocument {
52
52
  version: number;
53
53
  rev: number;
54
54
  nextId: number;
55
55
  tasks: Task[];
56
56
  }
57
- declare function emptyDocument(): TaskDocument;
57
+ export declare function emptyDocument(): TaskDocument;
58
58
  /**
59
59
  * A dependency target inside an upsert item: an existing task id, or the `ref`
60
60
  * of a task created earlier in the same call.
@@ -62,7 +62,7 @@ declare function emptyDocument(): TaskDocument;
62
62
  * Refs must start with a letter (see `REF_PATTERN`), so a ref is structurally
63
63
  * unconfusable with a stringified id and the discrimination is just `typeof`.
64
64
  */
65
- type DepToken = number | string;
65
+ export type DepToken = number | string;
66
66
  /**
67
67
  * One entry of an `upsert` call. No `id` creates a task; an `id` updates one.
68
68
  *
@@ -71,7 +71,7 @@ type DepToken = number | string;
71
71
  * had. A field used against the wrong kind fails that item rather than being
72
72
  * silently ignored.
73
73
  */
74
- interface TaskItemMutation {
74
+ export interface TaskItemMutation {
75
75
  id?: number;
76
76
  ref?: string;
77
77
  subject?: string;
@@ -91,7 +91,7 @@ interface TaskItemMutation {
91
91
  * `message` is unprefixed: the `item[N] failed:` framing belongs to the
92
92
  * formatter, because the Task Space overlay shows this text on its own.
93
93
  */
94
- type UpsertItemOutcome = {
94
+ export type UpsertItemOutcome = {
95
95
  index: number;
96
96
  kind: 'created';
97
97
  id: number;
@@ -118,11 +118,28 @@ type UpsertItemOutcome = {
118
118
  ref?: string;
119
119
  };
120
120
  /** Which tasks an upsert touched, so renderResult names them instead of guessing. */
121
- interface UpsertSummary {
121
+ export interface UpsertSummary {
122
122
  /** Ids of applied entries, in request order. A failed entry contributes nothing. */
123
123
  applied: number[];
124
124
  failed: number;
125
125
  }
126
+ /** One task-to-agent handoff inside a native assignment batch. */
127
+ export interface TaskAssignment {
128
+ id: number;
129
+ agent: string;
130
+ inlineAgent?: InlineAgent;
131
+ instructions?: string;
132
+ relevantFiles?: string[];
133
+ priorFindings?: string;
134
+ model?: string;
135
+ context?: 'fresh' | 'fork';
136
+ }
137
+ /** Which assignment entries started, so renderResult can show one consolidated batch. */
138
+ export interface AssignmentSummary {
139
+ /** Ids of successful entries, in request order. A failed entry contributes nothing. */
140
+ assigned: number[];
141
+ failed: number;
142
+ }
126
143
  /**
127
144
  * Open-shape input bag the reducer accepts. The index signature lets the
128
145
  * runtime pass a TypeBox `Static<typeof TaskParamsSchema>` through without
@@ -131,25 +148,19 @@ interface UpsertSummary {
131
148
  * Per-task fields live on `tasks[]`, not here: a top-level `subject` or
132
149
  * `status` would be ambiguous once one call can carry many tasks.
133
150
  */
134
- interface TaskMutationParams {
151
+ export interface TaskMutationParams {
135
152
  [key: string]: unknown;
136
153
  tasks?: TaskItemMutation[];
154
+ /** `assign` only: independent task-to-agent handoffs dispatched by one tool call. */
155
+ assignments?: TaskAssignment[];
137
156
  /** `list` filter only. To set a status, upsert the task by id. */
138
157
  status?: TaskStatus;
139
- /** `get`, `delete`, `assign` and `cancel` only. */
158
+ /** `get`, `delete`, and `cancel` only. Assign ids live in `assignments[]`. */
140
159
  id?: number;
141
160
  includeDeleted?: boolean;
142
- agent?: string;
143
- inlineAgent?: InlineAgent;
144
- instructions?: string;
145
- /** `assign` only: the context pack the parent hands to the child. */
146
- relevantFiles?: string[];
147
- priorFindings?: string;
148
- model?: string;
149
- context?: 'fresh' | 'fork';
150
161
  }
151
162
  /** Snapshot returned under a tool result's `details` for renderResult. */
152
- interface TaskDetails {
163
+ export interface TaskDetails {
153
164
  action: TaskAction;
154
165
  params: Record<string, unknown>;
155
166
  tasks: Task[];
@@ -157,9 +168,19 @@ interface TaskDetails {
157
168
  rev: number;
158
169
  error?: string;
159
170
  upsert?: UpsertSummary;
171
+ assignment?: AssignmentSummary;
160
172
  }
161
- /** A delegation is "live" while the owning run may still produce a response. */
162
- declare function isDelegationActive(task: Task): boolean;
173
+ /**
174
+ * A delegation is "live" while the owning run may still produce a response.
175
+ *
176
+ * Takes the delegation shape rather than `Task` so the cockpit's `WebTask`,
177
+ * which carries the state as a plain string, answers the question the same way
178
+ * the store does.
179
+ */
180
+ export declare function isDelegationActive(task: {
181
+ delegation?: {
182
+ state?: string;
183
+ };
184
+ }): boolean;
163
185
  //#endregion
164
- export { DELETED_STATUS, DelegationResult, DelegationState, DepToken, STORE_SCHEMA_VERSION, Task, TaskAction, TaskDelegation, TaskDetails, TaskDocument, TaskItemMutation, TaskMutationParams, TaskStatus, UpsertItemOutcome, UpsertSummary, emptyDocument, isDelegationActive };
165
- //# sourceMappingURL=types.d.cts.map
186
+ //# sourceMappingURL=task.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.cts","names":[],"sources":["../../../src/models/task.ts"],"mappings":";;YAUY;qBAEC,gBAAgB;YAEjB;YAEA;;iBAGK;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;iBAUe;EACf;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA,SAAS;;iBAGM;EACf;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;EACA,WAAW;EACX;EACA;EACA,aAAa;;qBAGF;;iBAGI;EACf;EACA;EACA;EACA,OAAO;;wBAGO,iBAAiB;;;;;;;;YAWrB;;;;;;;;;iBAUK;EACf;EACA;EACA;EACA;EACA;EACA,SAAS;EACT,YAAY;EACZ,eAAe;EACf,kBAAkB;EAClB;EACA,WAAW;;;;;;;;;YAUD;EAEN;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;;EAEA;EAAe;EAAiB;EAAY,YAAY;EAAY,UAAU;;EAC9E;EAAe;EAAmB;EAAY,QAAQ;;EACtD;EAAe;EAAgB;EAAiB;EAAa;;;iBAGlD;;EAEf;EACA;;;iBAIe;EACf;EACA;EACA,cAAc;EACd;EACA;EACA;EACA;EACA;;;iBAIe;;EAEf;EACA;;;;;;;;;;iBAWe;GACd;EACD,QAAQ;;EAER,cAAc;;EAEd,SAAS;;EAET;EACA;;;iBAIe;EACf,QAAQ;EACR,QAAQ;EACR,OAAO;EACP;EACA;EACA;EACA,SAAS;EACT,aAAa;;;;;;;;;wBAUC,mBAAmB;EAAQ;IAAe"}
@@ -1,11 +1,11 @@
1
- import { InlineAgent } from "@agimon-ai/doompi-extension-contracts/subagent-tool";
2
- //#region src/store/types.d.ts
3
- type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';
4
- declare const DELETED_STATUS: TaskStatus;
5
- type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';
6
- type DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';
1
+ import { InlineAgent } from "@agimon-ai/doompi-core/delegation";
2
+ //#region src/models/task.d.ts
3
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';
4
+ export declare const DELETED_STATUS: TaskStatus;
5
+ export type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';
6
+ export type DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';
7
7
  /** Terminal result of a delegated subagent run, copied off the delegation response. */
8
- interface DelegationResult {
8
+ export interface DelegationResult {
9
9
  status: string;
10
10
  output?: string;
11
11
  outputPath?: string;
@@ -21,7 +21,7 @@ interface DelegationResult {
21
21
  * genuinely-running delegation from one orphaned by a harness crash, since the
22
22
  * child dies with its parent but the file survives.
23
23
  */
24
- interface TaskDelegation {
24
+ export interface TaskDelegation {
25
25
  requestId: string;
26
26
  agent: string;
27
27
  state: DelegationState;
@@ -33,7 +33,7 @@ interface TaskDelegation {
33
33
  endedAt?: string;
34
34
  result?: DelegationResult;
35
35
  }
36
- interface Task {
36
+ export interface Task {
37
37
  id: number;
38
38
  subject: string;
39
39
  description?: string;
@@ -46,15 +46,15 @@ interface Task {
46
46
  updatedAt?: string;
47
47
  delegation?: TaskDelegation;
48
48
  }
49
- declare const STORE_SCHEMA_VERSION = 1;
49
+ export declare const STORE_SCHEMA_VERSION = 1;
50
50
  /** The complete on-disk document. `rev` increments on every committed write. */
51
- interface TaskDocument {
51
+ export interface TaskDocument {
52
52
  version: number;
53
53
  rev: number;
54
54
  nextId: number;
55
55
  tasks: Task[];
56
56
  }
57
- declare function emptyDocument(): TaskDocument;
57
+ export declare function emptyDocument(): TaskDocument;
58
58
  /**
59
59
  * A dependency target inside an upsert item: an existing task id, or the `ref`
60
60
  * of a task created earlier in the same call.
@@ -62,7 +62,7 @@ declare function emptyDocument(): TaskDocument;
62
62
  * Refs must start with a letter (see `REF_PATTERN`), so a ref is structurally
63
63
  * unconfusable with a stringified id and the discrimination is just `typeof`.
64
64
  */
65
- type DepToken = number | string;
65
+ export type DepToken = number | string;
66
66
  /**
67
67
  * One entry of an `upsert` call. No `id` creates a task; an `id` updates one.
68
68
  *
@@ -71,7 +71,7 @@ type DepToken = number | string;
71
71
  * had. A field used against the wrong kind fails that item rather than being
72
72
  * silently ignored.
73
73
  */
74
- interface TaskItemMutation {
74
+ export interface TaskItemMutation {
75
75
  id?: number;
76
76
  ref?: string;
77
77
  subject?: string;
@@ -91,7 +91,7 @@ interface TaskItemMutation {
91
91
  * `message` is unprefixed: the `item[N] failed:` framing belongs to the
92
92
  * formatter, because the Task Space overlay shows this text on its own.
93
93
  */
94
- type UpsertItemOutcome = {
94
+ export type UpsertItemOutcome = {
95
95
  index: number;
96
96
  kind: 'created';
97
97
  id: number;
@@ -118,11 +118,28 @@ type UpsertItemOutcome = {
118
118
  ref?: string;
119
119
  };
120
120
  /** Which tasks an upsert touched, so renderResult names them instead of guessing. */
121
- interface UpsertSummary {
121
+ export interface UpsertSummary {
122
122
  /** Ids of applied entries, in request order. A failed entry contributes nothing. */
123
123
  applied: number[];
124
124
  failed: number;
125
125
  }
126
+ /** One task-to-agent handoff inside a native assignment batch. */
127
+ export interface TaskAssignment {
128
+ id: number;
129
+ agent: string;
130
+ inlineAgent?: InlineAgent;
131
+ instructions?: string;
132
+ relevantFiles?: string[];
133
+ priorFindings?: string;
134
+ model?: string;
135
+ context?: 'fresh' | 'fork';
136
+ }
137
+ /** Which assignment entries started, so renderResult can show one consolidated batch. */
138
+ export interface AssignmentSummary {
139
+ /** Ids of successful entries, in request order. A failed entry contributes nothing. */
140
+ assigned: number[];
141
+ failed: number;
142
+ }
126
143
  /**
127
144
  * Open-shape input bag the reducer accepts. The index signature lets the
128
145
  * runtime pass a TypeBox `Static<typeof TaskParamsSchema>` through without
@@ -131,25 +148,19 @@ interface UpsertSummary {
131
148
  * Per-task fields live on `tasks[]`, not here: a top-level `subject` or
132
149
  * `status` would be ambiguous once one call can carry many tasks.
133
150
  */
134
- interface TaskMutationParams {
151
+ export interface TaskMutationParams {
135
152
  [key: string]: unknown;
136
153
  tasks?: TaskItemMutation[];
154
+ /** `assign` only: independent task-to-agent handoffs dispatched by one tool call. */
155
+ assignments?: TaskAssignment[];
137
156
  /** `list` filter only. To set a status, upsert the task by id. */
138
157
  status?: TaskStatus;
139
- /** `get`, `delete`, `assign` and `cancel` only. */
158
+ /** `get`, `delete`, and `cancel` only. Assign ids live in `assignments[]`. */
140
159
  id?: number;
141
160
  includeDeleted?: boolean;
142
- agent?: string;
143
- inlineAgent?: InlineAgent;
144
- instructions?: string;
145
- /** `assign` only: the context pack the parent hands to the child. */
146
- relevantFiles?: string[];
147
- priorFindings?: string;
148
- model?: string;
149
- context?: 'fresh' | 'fork';
150
161
  }
151
162
  /** Snapshot returned under a tool result's `details` for renderResult. */
152
- interface TaskDetails {
163
+ export interface TaskDetails {
153
164
  action: TaskAction;
154
165
  params: Record<string, unknown>;
155
166
  tasks: Task[];
@@ -157,9 +168,19 @@ interface TaskDetails {
157
168
  rev: number;
158
169
  error?: string;
159
170
  upsert?: UpsertSummary;
171
+ assignment?: AssignmentSummary;
160
172
  }
161
- /** A delegation is "live" while the owning run may still produce a response. */
162
- declare function isDelegationActive(task: Task): boolean;
173
+ /**
174
+ * A delegation is "live" while the owning run may still produce a response.
175
+ *
176
+ * Takes the delegation shape rather than `Task` so the cockpit's `WebTask`,
177
+ * which carries the state as a plain string, answers the question the same way
178
+ * the store does.
179
+ */
180
+ export declare function isDelegationActive(task: {
181
+ delegation?: {
182
+ state?: string;
183
+ };
184
+ }): boolean;
163
185
  //#endregion
164
- export { DELETED_STATUS, DelegationResult, DelegationState, DepToken, STORE_SCHEMA_VERSION, Task, TaskAction, TaskDelegation, TaskDetails, TaskDocument, TaskItemMutation, TaskMutationParams, TaskStatus, UpsertItemOutcome, UpsertSummary, emptyDocument, isDelegationActive };
165
- //# sourceMappingURL=types.d.mts.map
186
+ //# sourceMappingURL=task.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.mts","names":[],"sources":["../../../src/models/task.ts"],"mappings":";;YAUY;qBAEC,gBAAgB;YAEjB;YAEA;;iBAGK;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;;;;;;;;iBAUe;EACf;EACA;EACA,OAAO;EACP;EACA;EACA;EACA;EACA;EACA;EACA,SAAS;;iBAGM;EACf;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;EACA,WAAW;EACX;EACA;EACA,aAAa;;qBAGF;;iBAGI;EACf;EACA;EACA;EACA,OAAO;;wBAGO,iBAAiB;;;;;;;;YAWrB;;;;;;;;;iBAUK;EACf;EACA;EACA;EACA;EACA;EACA,SAAS;EACT,YAAY;EACZ,eAAe;EACf,kBAAkB;EAClB;EACA,WAAW;;;;;;;;;YAUD;EAEN;EACA;EACA;EACA;EACA,QAAQ;EACR;EACA;;EAEA;EAAe;EAAiB;EAAY,YAAY;EAAY,UAAU;;EAC9E;EAAe;EAAmB;EAAY,QAAQ;;EACtD;EAAe;EAAgB;EAAiB;EAAa;;;iBAGlD;;EAEf;EACA;;;iBAIe;EACf;EACA;EACA,cAAc;EACd;EACA;EACA;EACA;EACA;;;iBAIe;;EAEf;EACA;;;;;;;;;;iBAWe;GACd;EACD,QAAQ;;EAER,cAAc;;EAEd,SAAS;;EAET;EACA;;;iBAIe;EACf,QAAQ;EACR,QAAQ;EACR,OAAO;EACP;EACA;EACA;EACA,SAAS;EACT,aAAa;;;;;;;;;wBAUC,mBAAmB;EAAQ;IAAe"}
@@ -0,0 +1,26 @@
1
+ //#region src/models/task.ts
2
+ const DELETED_STATUS = "deleted";
3
+ const STORE_SCHEMA_VERSION = 1;
4
+ function emptyDocument() {
5
+ return {
6
+ version: 1,
7
+ rev: 0,
8
+ nextId: 1,
9
+ tasks: []
10
+ };
11
+ }
12
+ /**
13
+ * A delegation is "live" while the owning run may still produce a response.
14
+ *
15
+ * Takes the delegation shape rather than `Task` so the cockpit's `WebTask`,
16
+ * which carries the state as a plain string, answers the question the same way
17
+ * the store does.
18
+ */
19
+ function isDelegationActive(task) {
20
+ const state = task.delegation?.state;
21
+ return state === "requested" || state === "running";
22
+ }
23
+ //#endregion
24
+ export { DELETED_STATUS, STORE_SCHEMA_VERSION, emptyDocument, isDelegationActive };
25
+
26
+ //# sourceMappingURL=task.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.mjs","names":[],"sources":["../../../src/models/task.ts"],"sourcesContent":["/**\n * Domain types for the file-backed task store.\n *\n * The on-disk document is the durable source of truth (unlike rpiv-todo, which\n * replayed state from the transcript). Every field here round-trips through\n * JSON, so nothing may hold non-serializable values.\n */\n\nimport type { InlineAgent } from '@agimon-ai/doompi-core/delegation';\n\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'deleted';\n\nexport const DELETED_STATUS: TaskStatus = 'deleted';\n\nexport type TaskAction = 'upsert' | 'list' | 'get' | 'delete' | 'clear' | 'assign' | 'cancel';\n\nexport type DelegationState = 'requested' | 'running' | 'completed' | 'failed' | 'cancelled';\n\n/** Terminal result of a delegated subagent run, copied off the delegation response. */\nexport interface DelegationResult {\n status: string;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n error?: string;\n durationMs?: number;\n toolCount?: number;\n}\n\n/**\n * Delegation bookkeeping attached to a task that was handed to a subagent.\n *\n * `pid` is the harness process that owns the run: it is the only way to tell an\n * genuinely-running delegation from one orphaned by a harness crash, since the\n * child dies with its parent but the file survives.\n */\nexport interface TaskDelegation {\n requestId: string;\n agent: string;\n state: DelegationState;\n sessionId?: string;\n pid?: number;\n runId?: string;\n model?: string;\n startedAt?: string;\n endedAt?: string;\n result?: DelegationResult;\n}\n\nexport interface Task {\n id: number;\n subject: string;\n description?: string;\n activeForm?: string;\n status: TaskStatus;\n blockedBy?: number[];\n owner?: string;\n metadata?: Record<string, unknown>;\n createdAt?: string;\n updatedAt?: string;\n delegation?: TaskDelegation;\n}\n\nexport const STORE_SCHEMA_VERSION = 1;\n\n/** The complete on-disk document. `rev` increments on every committed write. */\nexport interface TaskDocument {\n version: number;\n rev: number;\n nextId: number;\n tasks: Task[];\n}\n\nexport function emptyDocument(): TaskDocument {\n return { version: STORE_SCHEMA_VERSION, rev: 0, nextId: 1, tasks: [] };\n}\n\n/**\n * A dependency target inside an upsert item: an existing task id, or the `ref`\n * of a task created earlier in the same call.\n *\n * Refs must start with a letter (see `REF_PATTERN`), so a ref is structurally\n * unconfusable with a stringified id and the discrimination is just `typeof`.\n */\nexport type DepToken = number | string;\n\n/**\n * One entry of an `upsert` call. No `id` creates a task; an `id` updates one.\n *\n * `blockedBy` (absolute set) is create-only and `addBlockedBy`/`removeBlockedBy`\n * (additive merge) are update-only, matching the split the two former actions\n * had. A field used against the wrong kind fails that item rather than being\n * silently ignored.\n */\nexport interface TaskItemMutation {\n id?: number;\n ref?: string;\n subject?: string;\n description?: string;\n activeForm?: string;\n status?: TaskStatus;\n blockedBy?: DepToken[];\n addBlockedBy?: DepToken[];\n removeBlockedBy?: DepToken[];\n owner?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * What one upsert item did. `index` is its position in the request array, so a\n * model reading a partial result can tell which entries still need resending.\n *\n * `message` is unprefixed: the `item[N] failed:` framing belongs to the\n * formatter, because the Task Space overlay shows this text on its own.\n */\nexport type UpsertItemOutcome =\n | {\n index: number;\n kind: 'created';\n id: number;\n subject: string;\n status: TaskStatus;\n ref?: string;\n blockedBy?: number[];\n }\n | { index: number; kind: 'updated'; id: number; fromStatus: TaskStatus; toStatus: TaskStatus }\n | { index: number; kind: 'unchanged'; id: number; status: TaskStatus }\n | { index: number; kind: 'failed'; message: string; id?: number; ref?: string };\n\n/** Which tasks an upsert touched, so renderResult names them instead of guessing. */\nexport interface UpsertSummary {\n /** Ids of applied entries, in request order. A failed entry contributes nothing. */\n applied: number[];\n failed: number;\n}\n\n/** One task-to-agent handoff inside a native assignment batch. */\nexport interface TaskAssignment {\n id: number;\n agent: string;\n inlineAgent?: InlineAgent;\n instructions?: string;\n relevantFiles?: string[];\n priorFindings?: string;\n model?: string;\n context?: 'fresh' | 'fork';\n}\n\n/** Which assignment entries started, so renderResult can show one consolidated batch. */\nexport interface AssignmentSummary {\n /** Ids of successful entries, in request order. A failed entry contributes nothing. */\n assigned: number[];\n failed: number;\n}\n\n/**\n * Open-shape input bag the reducer accepts. The index signature lets the\n * runtime pass a TypeBox `Static<typeof TaskParamsSchema>` through without\n * casting each field.\n *\n * Per-task fields live on `tasks[]`, not here: a top-level `subject` or\n * `status` would be ambiguous once one call can carry many tasks.\n */\nexport interface TaskMutationParams {\n [key: string]: unknown;\n tasks?: TaskItemMutation[];\n /** `assign` only: independent task-to-agent handoffs dispatched by one tool call. */\n assignments?: TaskAssignment[];\n /** `list` filter only. To set a status, upsert the task by id. */\n status?: TaskStatus;\n /** `get`, `delete`, and `cancel` only. Assign ids live in `assignments[]`. */\n id?: number;\n includeDeleted?: boolean;\n}\n\n/** Snapshot returned under a tool result's `details` for renderResult. */\nexport interface TaskDetails {\n action: TaskAction;\n params: Record<string, unknown>;\n tasks: Task[];\n nextId: number;\n rev: number;\n error?: string;\n upsert?: UpsertSummary;\n assignment?: AssignmentSummary;\n}\n\n/**\n * A delegation is \"live\" while the owning run may still produce a response.\n *\n * Takes the delegation shape rather than `Task` so the cockpit's `WebTask`,\n * which carries the state as a plain string, answers the question the same way\n * the store does.\n */\nexport function isDelegationActive(task: { delegation?: { state?: string } }): boolean {\n const state = task.delegation?.state;\n return state === 'requested' || state === 'running';\n}\n"],"mappings":";AAYA,MAAa,iBAA6B;AAmD1C,MAAa,uBAAuB;AAUpC,SAAgB,gBAA8B;CAC5C,OAAO;EAAE,SAAA;EAA+B,KAAK;EAAG,QAAQ;EAAG,OAAO,CAAC;CAAE;AACvE;;;;;;;;AAuHA,SAAgB,mBAAmB,MAAoD;CACrF,MAAM,QAAQ,KAAK,YAAY;CAC/B,OAAO,UAAU,eAAe,UAAU;AAC5C"}
@@ -0,0 +1,67 @@
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
+ exports.deriveBlocks = deriveBlocks;
62
+ exports.detectCycle = detectCycle;
63
+ exports.isBlocked = isBlocked;
64
+ exports.isTaskListComplete = isTaskListComplete;
65
+ exports.unresolvedBlockers = unresolvedBlockers;
66
+
67
+ //# sourceMappingURL=taskGraph.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskGraph.cjs","names":[],"sources":["../../src/store/taskGraph.ts"],"sourcesContent":["import type { Task } from './types.ts';\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":"mEAEA,MAAM,EAAmC,YACnC,EAAiC,UAGvC,SAAgB,EAAmB,EAAoC,CACrE,IAAM,EAAU,EAAS,OAAQ,GAAS,EAAK,SAAW,CAAc,EACxE,OAAO,EAAQ,OAAS,GAAK,EAAQ,MAAO,GAAS,EAAK,SAAW,CAAgB,CACvF,CAQA,SAAgB,EAAY,EAA2B,EAAgB,EAA0C,CAC/G,IAAM,EAAQ,IAAI,IAClB,IAAK,IAAM,KAAQ,EACb,EAAK,KAAO,EACd,EAAM,IAAI,EAAK,GAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAI,EAAK,WAAa,CAAC,EAAI,GAAG,CAAY,CAAC,CAAC,CAAC,EAE7E,EAAM,IAAI,EAAK,GAAI,EAAK,UAAY,CAAC,GAAG,EAAK,SAAS,EAAI,CAAC,CAAC,EAIhE,IAAM,EAAW,IAAI,IACf,EAAU,IAAI,IACd,EAAgB,GAA0B,CAC9C,GAAI,EAAS,IAAI,CAAI,EAAG,MAAO,GAC/B,GAAI,EAAQ,IAAI,CAAI,EAAG,MAAO,GAC9B,EAAS,IAAI,CAAI,EACjB,IAAK,IAAM,KAAQ,EAAM,IAAI,CAAI,GAAK,CAAC,EACrC,GAAI,EAAa,CAAI,EAAG,MAAO,GAIjC,OAFA,EAAS,OAAO,CAAI,EACpB,EAAQ,IAAI,CAAI,EACT,EACT,EAEA,IAAK,IAAM,KAAQ,EAAM,KAAK,EAC5B,GAAI,EAAa,CAAI,EAAG,MAAO,GAEjC,MAAO,EACT,CAGA,SAAgB,EAAa,EAAkD,CAC7E,IAAM,EAAS,IAAI,IACnB,IAAK,IAAM,KAAQ,EACjB,IAAK,IAAM,KAAO,EAAK,WAAa,CAAC,EAAG,CACtC,IAAM,EAAa,EAAO,IAAI,CAAG,GAAK,CAAC,EACvC,EAAW,KAAK,EAAK,EAAE,EACvB,EAAO,IAAI,EAAK,CAAU,CAC5B,CAEF,OAAO,CACT,CASA,SAAgB,EAAmB,EAA2B,EAAsB,CAClF,OAAQ,EAAK,WAAa,CAAC,EAAA,CAAG,OAAQ,GAAQ,CAC5C,IAAM,EAAU,EAAS,KAAM,GAAc,EAAU,KAAO,CAAG,EAEjE,OADK,EACE,EAAQ,SAAW,GAAoB,EAAQ,SAAW,EAD5C,EAEvB,CAAC,CACH,CAEA,SAAgB,EAAU,EAA2B,EAAqB,CACxE,OAAO,EAAmB,EAAU,CAAI,CAAC,CAAC,OAAS,CACrD"}
1
+ {"version":3,"file":"taskGraph.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,16 +1,16 @@
1
- import { Task } from "./types.cjs";
2
- //#region src/store/taskGraph.d.ts
1
+ import { Task } from "./task.cjs";
2
+ //#region src/models/taskGraph.d.ts
3
3
  /** True when a non-empty list has no visible work left to finish. */
4
- declare function isTaskListComplete(taskList: readonly Task[]): boolean;
4
+ export declare function isTaskListComplete(taskList: readonly Task[]): boolean;
5
5
  /**
6
6
  * Would merging `newBlockedBy` into `taskId`'s dependencies introduce a cycle?
7
7
  *
8
8
  * Takes the proposed additions explicitly so the reducer can ask the question
9
9
  * before mutating anything.
10
10
  */
11
- declare function detectCycle(taskList: readonly Task[], taskId: number, newBlockedBy: readonly number[]): boolean;
11
+ export declare function detectCycle(taskList: readonly Task[], taskId: number, newBlockedBy: readonly number[]): boolean;
12
12
  /** Inverse adjacency: for each task, which tasks list it in their blockedBy. */
13
- declare function deriveBlocks(taskList: readonly Task[]): Map<number, number[]>;
13
+ export declare function deriveBlocks(taskList: readonly Task[]): Map<number, number[]>;
14
14
  /**
15
15
  * Blocking dependencies of a task that are not yet resolved.
16
16
  *
@@ -18,8 +18,7 @@ declare function deriveBlocks(taskList: readonly Task[]): Map<number, number[]>;
18
18
  * delegation keeps its dependents blocked instead of silently releasing work
19
19
  * that was never actually finished.
20
20
  */
21
- declare function unresolvedBlockers(taskList: readonly Task[], task: Task): number[];
22
- declare function isBlocked(taskList: readonly Task[], task: Task): boolean;
21
+ export declare function unresolvedBlockers(taskList: readonly Task[], task: Task): number[];
22
+ export declare function isBlocked(taskList: readonly Task[], task: Task): boolean;
23
23
  //#endregion
24
- export { deriveBlocks, detectCycle, isBlocked, isTaskListComplete, unresolvedBlockers };
25
24
  //# sourceMappingURL=taskGraph.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskGraph.d.cts","names":[],"sources":["../../../src/models/taskGraph.ts"],"mappings":";;;wBAMgB,mBAAmB,mBAAmB;;;;;;;wBAWtC,YAAY,mBAAmB,QAAQ,gBAAgB;;wBA+BvD,aAAa,mBAAmB,SAAS;;;;;;;;wBAmBzC,mBAAmB,mBAAmB,QAAQ,MAAM;wBAQpD,UAAU,mBAAmB,QAAQ,MAAM"}
@@ -1,16 +1,16 @@
1
- import { Task } from "./types.mjs";
2
- //#region src/store/taskGraph.d.ts
1
+ import { Task } from "./task.mjs";
2
+ //#region src/models/taskGraph.d.ts
3
3
  /** True when a non-empty list has no visible work left to finish. */
4
- declare function isTaskListComplete(taskList: readonly Task[]): boolean;
4
+ export declare function isTaskListComplete(taskList: readonly Task[]): boolean;
5
5
  /**
6
6
  * Would merging `newBlockedBy` into `taskId`'s dependencies introduce a cycle?
7
7
  *
8
8
  * Takes the proposed additions explicitly so the reducer can ask the question
9
9
  * before mutating anything.
10
10
  */
11
- declare function detectCycle(taskList: readonly Task[], taskId: number, newBlockedBy: readonly number[]): boolean;
11
+ export declare function detectCycle(taskList: readonly Task[], taskId: number, newBlockedBy: readonly number[]): boolean;
12
12
  /** Inverse adjacency: for each task, which tasks list it in their blockedBy. */
13
- declare function deriveBlocks(taskList: readonly Task[]): Map<number, number[]>;
13
+ export declare function deriveBlocks(taskList: readonly Task[]): Map<number, number[]>;
14
14
  /**
15
15
  * Blocking dependencies of a task that are not yet resolved.
16
16
  *
@@ -18,8 +18,7 @@ declare function deriveBlocks(taskList: readonly Task[]): Map<number, number[]>;
18
18
  * delegation keeps its dependents blocked instead of silently releasing work
19
19
  * that was never actually finished.
20
20
  */
21
- declare function unresolvedBlockers(taskList: readonly Task[], task: Task): number[];
22
- declare function isBlocked(taskList: readonly Task[], task: Task): boolean;
21
+ export declare function unresolvedBlockers(taskList: readonly Task[], task: Task): number[];
22
+ export declare function isBlocked(taskList: readonly Task[], task: Task): boolean;
23
23
  //#endregion
24
- export { deriveBlocks, detectCycle, isBlocked, isTaskListComplete, unresolvedBlockers };
25
24
  //# sourceMappingURL=taskGraph.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskGraph.d.mts","names":[],"sources":["../../../src/models/taskGraph.ts"],"mappings":";;;wBAMgB,mBAAmB,mBAAmB;;;;;;;wBAWtC,YAAY,mBAAmB,QAAQ,gBAAgB;;wBA+BvD,aAAa,mBAAmB,SAAS;;;;;;;;wBAmBzC,mBAAmB,mBAAmB,QAAQ,MAAM;wBAQpD,UAAU,mBAAmB,QAAQ,MAAM"}
@@ -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 { deriveBlocks, detectCycle, isBlocked, isTaskListComplete, unresolvedBlockers };
62
+
63
+ //# sourceMappingURL=taskGraph.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskGraph.mjs","names":[],"sources":["../../src/store/taskGraph.ts"],"sourcesContent":["import type { Task } from './types.ts';\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,EAAmC,YACnC,EAAiC,UAGvC,SAAgB,EAAmB,EAAoC,CACrE,IAAM,EAAU,EAAS,OAAQ,GAAS,EAAK,SAAW,CAAc,EACxE,OAAO,EAAQ,OAAS,GAAK,EAAQ,MAAO,GAAS,EAAK,SAAW,CAAgB,CACvF,CAQA,SAAgB,EAAY,EAA2B,EAAgB,EAA0C,CAC/G,IAAM,EAAQ,IAAI,IAClB,IAAK,IAAM,KAAQ,EACb,EAAK,KAAO,EACd,EAAM,IAAI,EAAK,GAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAI,EAAK,WAAa,CAAC,EAAI,GAAG,CAAY,CAAC,CAAC,CAAC,EAE7E,EAAM,IAAI,EAAK,GAAI,EAAK,UAAY,CAAC,GAAG,EAAK,SAAS,EAAI,CAAC,CAAC,EAIhE,IAAM,EAAW,IAAI,IACf,EAAU,IAAI,IACd,EAAgB,GAA0B,CAC9C,GAAI,EAAS,IAAI,CAAI,EAAG,MAAO,GAC/B,GAAI,EAAQ,IAAI,CAAI,EAAG,MAAO,GAC9B,EAAS,IAAI,CAAI,EACjB,IAAK,IAAM,KAAQ,EAAM,IAAI,CAAI,GAAK,CAAC,EACrC,GAAI,EAAa,CAAI,EAAG,MAAO,GAIjC,OAFA,EAAS,OAAO,CAAI,EACpB,EAAQ,IAAI,CAAI,EACT,EACT,EAEA,IAAK,IAAM,KAAQ,EAAM,KAAK,EAC5B,GAAI,EAAa,CAAI,EAAG,MAAO,GAEjC,MAAO,EACT,CAGA,SAAgB,EAAa,EAAkD,CAC7E,IAAM,EAAS,IAAI,IACnB,IAAK,IAAM,KAAQ,EACjB,IAAK,IAAM,KAAO,EAAK,WAAa,CAAC,EAAG,CACtC,IAAM,EAAa,EAAO,IAAI,CAAG,GAAK,CAAC,EACvC,EAAW,KAAK,EAAK,EAAE,EACvB,EAAO,IAAI,EAAK,CAAU,CAC5B,CAEF,OAAO,CACT,CASA,SAAgB,EAAmB,EAA2B,EAAsB,CAClF,OAAQ,EAAK,WAAa,CAAC,EAAA,CAAG,OAAQ,GAAQ,CAC5C,IAAM,EAAU,EAAS,KAAM,GAAc,EAAU,KAAO,CAAG,EAEjE,OADK,EACE,EAAQ,SAAW,GAAoB,EAAQ,SAAW,EAD5C,EAEvB,CAAC,CACH,CAEA,SAAgB,EAAU,EAA2B,EAAqB,CACxE,OAAO,EAAmB,EAAU,CAAI,CAAC,CAAC,OAAS,CACrD"}
1
+ {"version":3,"file":"taskGraph.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"}