@agimon-ai/doompi-task 0.0.1-alpha.75 → 0.0.1-alpha.76

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 (420) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  2. package/dist/api-contracts.cjs +7 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +2 -0
  6. package/dist/commands.cjs +4 -0
  7. package/dist/commands.d.cts +2 -0
  8. package/dist/commands.d.mts +2 -0
  9. package/dist/commands.mjs +2 -0
  10. package/dist/config.cjs +19 -0
  11. package/dist/config.d.cts +2 -0
  12. package/dist/config.d.mts +2 -0
  13. package/dist/config.mjs +2 -0
  14. package/dist/delegation-manager.cjs +10 -0
  15. package/dist/delegation-manager.d.cts +3 -0
  16. package/dist/delegation-manager.d.mts +3 -0
  17. package/dist/delegation-manager.mjs +3 -0
  18. package/dist/extensions/pi.cjs +50 -0
  19. package/dist/extensions/pi.cjs.map +1 -0
  20. package/dist/extensions/pi.d.cts +5 -0
  21. package/dist/extensions/pi.d.cts.map +1 -0
  22. package/dist/extensions/pi.d.mts +5 -0
  23. package/dist/extensions/pi.d.mts.map +1 -0
  24. package/dist/extensions/pi.mjs +45 -0
  25. package/dist/extensions/pi.mjs.map +1 -0
  26. package/dist/extensions/server.cjs +57 -0
  27. package/dist/extensions/server.cjs.map +1 -0
  28. package/dist/extensions/server.d.cts +5 -0
  29. package/dist/extensions/server.d.cts.map +1 -0
  30. package/dist/extensions/server.d.mts +5 -0
  31. package/dist/extensions/server.d.mts.map +1 -0
  32. package/dist/extensions/server.mjs +52 -0
  33. package/dist/extensions/server.mjs.map +1 -0
  34. package/dist/extensions/web.mjs +1013 -0
  35. package/dist/extensions/web.mjs.map +1 -0
  36. package/dist/index.cjs +106 -0
  37. package/dist/index.d.cts +16 -0
  38. package/dist/index.d.mts +16 -0
  39. package/dist/index.mjs +16 -0
  40. package/dist/logSinkTelemetry.cjs +6 -0
  41. package/dist/logSinkTelemetry.d.cts +3 -0
  42. package/dist/logSinkTelemetry.d.mts +3 -0
  43. package/dist/logSinkTelemetry.mjs +3 -0
  44. package/dist/src/constants/promptGuidelines.cjs +26 -0
  45. package/dist/src/constants/promptGuidelines.cjs.map +1 -0
  46. package/dist/src/constants/promptGuidelines.d.cts +13 -0
  47. package/dist/src/constants/promptGuidelines.d.cts.map +1 -0
  48. package/dist/src/constants/promptGuidelines.d.mts +13 -0
  49. package/dist/src/constants/promptGuidelines.d.mts.map +1 -0
  50. package/dist/src/constants/promptGuidelines.mjs +26 -0
  51. package/dist/src/constants/promptGuidelines.mjs.map +1 -0
  52. package/dist/src/constants/task.cjs +6 -0
  53. package/dist/src/constants/task.cjs.map +1 -0
  54. package/dist/src/constants/task.d.cts +4 -0
  55. package/dist/src/constants/task.d.cts.map +1 -0
  56. package/dist/src/constants/task.d.mts +4 -0
  57. package/dist/src/constants/task.d.mts.map +1 -0
  58. package/dist/src/constants/task.mjs +6 -0
  59. package/dist/src/constants/task.mjs.map +1 -0
  60. package/dist/src/extensions/(backend)/channel/_lib/task-graph.cjs +90 -0
  61. package/dist/src/extensions/(backend)/channel/_lib/task-graph.cjs.map +1 -0
  62. package/dist/src/extensions/(backend)/channel/_lib/task-graph.mjs +89 -0
  63. package/dist/src/extensions/(backend)/channel/_lib/task-graph.mjs.map +1 -0
  64. package/dist/src/extensions/(backend)/channel/task-graph.server.cjs +7 -0
  65. package/dist/src/extensions/(backend)/channel/task-graph.server.cjs.map +1 -0
  66. package/dist/src/extensions/(backend)/channel/task-graph.server.mjs +8 -0
  67. package/dist/src/extensions/(backend)/channel/task-graph.server.mjs.map +1 -0
  68. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs +317 -0
  69. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.cjs.map +1 -0
  70. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.cts +39 -0
  71. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.cts.map +1 -0
  72. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.mts +39 -0
  73. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.d.mts.map +1 -0
  74. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs +317 -0
  75. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.cli.mjs.map +1 -0
  76. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs +95 -0
  77. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.cjs.map +1 -0
  78. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs +95 -0
  79. package/dist/src/extensions/workspaces/sessions/(backend)/_lib/root.server.mjs.map +1 -0
  80. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.cjs +30 -0
  81. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.cjs.map +1 -0
  82. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.cts +20 -0
  83. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.cts.map +1 -0
  84. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.mts +20 -0
  85. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.d.mts.map +1 -0
  86. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.mjs +29 -0
  87. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.cli.mjs.map +1 -0
  88. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.cjs +19 -0
  89. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.cjs.map +1 -0
  90. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.mjs +19 -0
  91. package/dist/src/extensions/workspaces/sessions/(backend)/command/_lib/tasks.server.mjs.map +1 -0
  92. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.cjs +8 -0
  93. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.cjs.map +1 -0
  94. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.mjs +9 -0
  95. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.cli.mjs.map +1 -0
  96. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.cjs +7 -0
  97. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.cjs.map +1 -0
  98. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.mjs +8 -0
  99. package/dist/src/extensions/workspaces/sessions/(backend)/command/tasks.server.mjs.map +1 -0
  100. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.cjs +6 -0
  101. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.cjs.map +1 -0
  102. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.mjs +6 -0
  103. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-compact.cli.mjs.map +1 -0
  104. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs +6 -0
  105. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.cjs.map +1 -0
  106. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs +6 -0
  107. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-start.cli.mjs.map +1 -0
  108. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.cjs +6 -0
  109. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.cjs.map +1 -0
  110. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.mjs +6 -0
  111. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/session-tree.cli.mjs.map +1 -0
  112. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.cjs +6 -0
  113. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.cjs.map +1 -0
  114. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.mjs +6 -0
  115. package/dist/src/extensions/workspaces/sessions/(backend)/hook/_lib/tool-execution-end.cli.mjs.map +1 -0
  116. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs +7 -0
  117. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.cjs.map +1 -0
  118. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs +8 -0
  119. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-compact.cli.mjs.map +1 -0
  120. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs +7 -0
  121. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs.map +1 -0
  122. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs +8 -0
  123. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs.map +1 -0
  124. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs +7 -0
  125. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.cjs.map +1 -0
  126. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs +8 -0
  127. package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-tree.cli.mjs.map +1 -0
  128. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.cjs +7 -0
  129. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.cjs.map +1 -0
  130. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.mjs +8 -0
  131. package/dist/src/extensions/workspaces/sessions/(backend)/hook/tool-execution-end.cli.mjs.map +1 -0
  132. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.cjs +20 -0
  133. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.cjs.map +1 -0
  134. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.mjs +20 -0
  135. package/dist/src/extensions/workspaces/sessions/(backend)/resource/_lib/task-board.server.mjs.map +1 -0
  136. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.cjs +7 -0
  137. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.cjs.map +1 -0
  138. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.mjs +8 -0
  139. package/dist/src/extensions/workspaces/sessions/(backend)/resource/task-board.server.mjs.map +1 -0
  140. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +11 -0
  141. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
  142. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +12 -0
  143. package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
  144. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +7 -0
  145. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
  146. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +8 -0
  147. package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
  148. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.cjs +160 -0
  149. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.cjs.map +1 -0
  150. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.cts +25 -0
  151. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.cts.map +1 -0
  152. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.mts +25 -0
  153. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.d.mts.map +1 -0
  154. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.mjs +157 -0
  155. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.cli.mjs.map +1 -0
  156. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.cjs +109 -0
  157. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.cjs.map +1 -0
  158. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.mjs +107 -0
  159. package/dist/src/extensions/workspaces/sessions/(backend)/tool/_lib/task.server.mjs.map +1 -0
  160. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.cjs +7 -0
  161. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.cjs.map +1 -0
  162. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.mjs +8 -0
  163. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.cli.mjs.map +1 -0
  164. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.cjs +7 -0
  165. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.cjs.map +1 -0
  166. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.mjs +8 -0
  167. package/dist/src/extensions/workspaces/sessions/(backend)/tool/task.server.mjs.map +1 -0
  168. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.cjs +333 -0
  169. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.cjs.map +1 -0
  170. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.cts +61 -0
  171. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.cts.map +1 -0
  172. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.mts +61 -0
  173. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.d.mts.map +1 -0
  174. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.mjs +322 -0
  175. package/dist/src/extensions/workspaces/sessions/(frontend)/_shared/format.cli.mjs.map +1 -0
  176. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.cjs +9 -0
  177. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.cjs.map +1 -0
  178. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.mjs +9 -0
  179. package/dist/src/extensions/workspaces/sessions/(frontend)/message/doom-task-notify.cli.mjs.map +1 -0
  180. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.cjs +149 -0
  181. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.cjs.map +1 -0
  182. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.cts +59 -0
  183. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.cts.map +1 -0
  184. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.mts +59 -0
  185. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.mts.map +1 -0
  186. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.mjs +142 -0
  187. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.mjs.map +1 -0
  188. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.cjs +358 -0
  189. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.cjs.map +1 -0
  190. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts +61 -0
  191. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.cts.map +1 -0
  192. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.mts +61 -0
  193. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.d.mts.map +1 -0
  194. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.mjs +355 -0
  195. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.mjs.map +1 -0
  196. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.cjs +165 -0
  197. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.cjs.map +1 -0
  198. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.cts +39 -0
  199. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.cts.map +1 -0
  200. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.mts +39 -0
  201. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.d.mts.map +1 -0
  202. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.mjs +164 -0
  203. package/dist/src/extensions/workspaces/sessions/(frontend)/overlay/_lib/taskOverlay.mjs.map +1 -0
  204. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.cjs +13 -0
  205. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.cjs.map +1 -0
  206. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.mjs +13 -0
  207. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/_lib/task.cli.mjs.map +1 -0
  208. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.cjs +7 -0
  209. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.cjs.map +1 -0
  210. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.mjs +8 -0
  211. package/dist/src/extensions/workspaces/sessions/(frontend)/tool/task.cli.mjs.map +1 -0
  212. package/dist/src/models/task.cjs +29 -0
  213. package/dist/src/models/task.cjs.map +1 -0
  214. package/dist/src/models/task.d.cts +186 -0
  215. package/dist/src/models/task.d.cts.map +1 -0
  216. package/dist/src/models/task.d.mts +186 -0
  217. package/dist/src/models/task.d.mts.map +1 -0
  218. package/dist/src/models/task.mjs +26 -0
  219. package/dist/src/models/task.mjs.map +1 -0
  220. package/dist/src/models/taskGraph.cjs +67 -0
  221. package/dist/src/models/taskGraph.cjs.map +1 -0
  222. package/dist/src/models/taskGraph.d.cts +24 -0
  223. package/dist/src/models/taskGraph.d.cts.map +1 -0
  224. package/dist/src/models/taskGraph.d.mts +24 -0
  225. package/dist/src/models/taskGraph.d.mts.map +1 -0
  226. package/dist/src/models/taskGraph.mjs +63 -0
  227. package/dist/src/models/taskGraph.mjs.map +1 -0
  228. package/dist/src/schemas/apiContracts.cjs +51 -0
  229. package/dist/src/schemas/apiContracts.cjs.map +1 -0
  230. package/dist/src/schemas/apiContracts.d.cts +53 -0
  231. package/dist/src/schemas/apiContracts.d.cts.map +1 -0
  232. package/dist/src/schemas/apiContracts.d.mts +53 -0
  233. package/dist/src/schemas/apiContracts.d.mts.map +1 -0
  234. package/dist/src/schemas/apiContracts.mjs +49 -0
  235. package/dist/src/schemas/apiContracts.mjs.map +1 -0
  236. package/dist/src/schemas/task.cjs +130 -0
  237. package/dist/src/schemas/task.cjs.map +1 -0
  238. package/dist/src/schemas/task.d.cts +103 -0
  239. package/dist/src/schemas/task.d.cts.map +1 -0
  240. package/dist/src/schemas/task.d.mts +103 -0
  241. package/dist/src/schemas/task.d.mts.map +1 -0
  242. package/dist/src/schemas/task.mjs +117 -0
  243. package/dist/src/schemas/task.mjs.map +1 -0
  244. package/dist/src/services/config/index.cjs +88 -0
  245. package/dist/src/services/config/index.cjs.map +1 -0
  246. package/dist/src/services/config/index.d.cts +42 -0
  247. package/dist/src/services/config/index.d.cts.map +1 -0
  248. package/dist/src/services/config/index.d.mts +42 -0
  249. package/dist/src/services/config/index.d.mts.map +1 -0
  250. package/dist/src/services/config/index.mjs +72 -0
  251. package/dist/src/services/config/index.mjs.map +1 -0
  252. package/dist/src/services/contextContribution/index.cjs +51 -0
  253. package/dist/src/services/contextContribution/index.cjs.map +1 -0
  254. package/dist/src/services/contextContribution/index.mjs +46 -0
  255. package/dist/src/services/contextContribution/index.mjs.map +1 -0
  256. package/dist/src/services/delegation/index.cjs +629 -0
  257. package/dist/src/services/delegation/index.cjs.map +1 -0
  258. package/dist/src/services/delegation/index.d.cts +192 -0
  259. package/dist/src/services/delegation/index.d.cts.map +1 -0
  260. package/dist/src/services/delegation/index.d.mts +192 -0
  261. package/dist/src/services/delegation/index.d.mts.map +1 -0
  262. package/dist/src/services/delegation/index.mjs +623 -0
  263. package/dist/src/services/delegation/index.mjs.map +1 -0
  264. package/dist/src/services/delegationPlatform/index.cjs +23 -0
  265. package/dist/src/services/delegationPlatform/index.cjs.map +1 -0
  266. package/dist/src/services/delegationPlatform/index.mjs +21 -0
  267. package/dist/src/services/delegationPlatform/index.mjs.map +1 -0
  268. package/dist/src/services/invariants/index.cjs +64 -0
  269. package/dist/src/services/invariants/index.cjs.map +1 -0
  270. package/dist/src/services/invariants/index.d.cts +23 -0
  271. package/dist/src/services/invariants/index.d.cts.map +1 -0
  272. package/dist/src/services/invariants/index.d.mts +23 -0
  273. package/dist/src/services/invariants/index.d.mts.map +1 -0
  274. package/dist/src/services/invariants/index.mjs +62 -0
  275. package/dist/src/services/invariants/index.mjs.map +1 -0
  276. package/dist/src/services/logSinkTelemetry/index.cjs +43 -0
  277. package/dist/src/services/logSinkTelemetry/index.cjs.map +1 -0
  278. package/dist/src/services/logSinkTelemetry/index.d.cts +23 -0
  279. package/dist/src/services/logSinkTelemetry/index.d.cts.map +1 -0
  280. package/dist/src/services/logSinkTelemetry/index.d.mts +23 -0
  281. package/dist/src/services/logSinkTelemetry/index.d.mts.map +1 -0
  282. package/dist/src/services/logSinkTelemetry/index.mjs +41 -0
  283. package/dist/src/services/logSinkTelemetry/index.mjs.map +1 -0
  284. package/dist/src/services/paths/index.cjs +233 -0
  285. package/dist/src/services/paths/index.cjs.map +1 -0
  286. package/dist/src/services/paths/index.d.cts +25 -0
  287. package/dist/src/services/paths/index.d.cts.map +1 -0
  288. package/dist/src/services/paths/index.d.mts +25 -0
  289. package/dist/src/services/paths/index.d.mts.map +1 -0
  290. package/dist/src/services/paths/index.mjs +218 -0
  291. package/dist/src/services/paths/index.mjs.map +1 -0
  292. package/dist/src/services/processLiveness/index.cjs +20 -0
  293. package/dist/src/services/processLiveness/index.cjs.map +1 -0
  294. package/dist/src/services/processLiveness/index.d.cts +11 -0
  295. package/dist/src/services/processLiveness/index.d.cts.map +1 -0
  296. package/dist/src/services/processLiveness/index.d.mts +11 -0
  297. package/dist/src/services/processLiveness/index.d.mts.map +1 -0
  298. package/dist/src/services/processLiveness/index.mjs +20 -0
  299. package/dist/src/services/processLiveness/index.mjs.map +1 -0
  300. package/dist/src/services/reconcile/index.cjs +65 -0
  301. package/dist/src/services/reconcile/index.cjs.map +1 -0
  302. package/dist/src/services/reconcile/index.d.cts +33 -0
  303. package/dist/src/services/reconcile/index.d.cts.map +1 -0
  304. package/dist/src/services/reconcile/index.d.mts +33 -0
  305. package/dist/src/services/reconcile/index.d.mts.map +1 -0
  306. package/dist/src/services/reconcile/index.mjs +63 -0
  307. package/dist/src/services/reconcile/index.mjs.map +1 -0
  308. package/dist/src/services/reducer/index.cjs +350 -0
  309. package/dist/src/services/reducer/index.cjs.map +1 -0
  310. package/dist/src/services/reducer/index.d.cts +71 -0
  311. package/dist/src/services/reducer/index.d.cts.map +1 -0
  312. package/dist/src/services/reducer/index.d.mts +71 -0
  313. package/dist/src/services/reducer/index.d.mts.map +1 -0
  314. package/dist/src/services/reducer/index.mjs +345 -0
  315. package/dist/src/services/reducer/index.mjs.map +1 -0
  316. package/dist/src/services/taskNarration/index.cjs +32 -0
  317. package/dist/src/services/taskNarration/index.cjs.map +1 -0
  318. package/dist/src/services/taskNarration/index.mjs +32 -0
  319. package/dist/src/services/taskNarration/index.mjs.map +1 -0
  320. package/dist/src/services/taskResult/index.cjs +174 -0
  321. package/dist/src/services/taskResult/index.cjs.map +1 -0
  322. package/dist/src/services/taskResult/index.d.cts +50 -0
  323. package/dist/src/services/taskResult/index.d.cts.map +1 -0
  324. package/dist/src/services/taskResult/index.d.mts +50 -0
  325. package/dist/src/services/taskResult/index.d.mts.map +1 -0
  326. package/dist/src/services/taskResult/index.mjs +165 -0
  327. package/dist/src/services/taskResult/index.mjs.map +1 -0
  328. package/dist/src/services/taskStore/index.cjs +216 -0
  329. package/dist/src/services/taskStore/index.cjs.map +1 -0
  330. package/dist/src/services/taskStore/index.d.cts +69 -0
  331. package/dist/src/services/taskStore/index.d.cts.map +1 -0
  332. package/dist/src/services/taskStore/index.d.mts +69 -0
  333. package/dist/src/services/taskStore/index.d.mts.map +1 -0
  334. package/dist/src/services/taskStore/index.mjs +213 -0
  335. package/dist/src/services/taskStore/index.mjs.map +1 -0
  336. package/dist/src/types/delegation.cjs +7 -0
  337. package/dist/src/types/delegation.cjs.map +1 -0
  338. package/dist/src/types/delegation.d.cts +5 -0
  339. package/dist/src/types/delegation.d.cts.map +1 -0
  340. package/dist/src/types/delegation.d.mts +5 -0
  341. package/dist/src/types/delegation.d.mts.map +1 -0
  342. package/dist/src/types/delegation.mjs +7 -0
  343. package/dist/src/types/delegation.mjs.map +1 -0
  344. package/dist/src/types/telemetry.cjs +26 -0
  345. package/dist/src/types/telemetry.cjs.map +1 -0
  346. package/dist/src/types/telemetry.d.cts +35 -0
  347. package/dist/src/types/telemetry.d.cts.map +1 -0
  348. package/dist/src/types/telemetry.d.mts +35 -0
  349. package/dist/src/types/telemetry.d.mts.map +1 -0
  350. package/dist/src/types/telemetry.mjs +26 -0
  351. package/dist/src/types/telemetry.mjs.map +1 -0
  352. package/dist/src/types/webTasks.cjs +7 -0
  353. package/dist/src/types/webTasks.cjs.map +1 -0
  354. package/dist/src/types/webTasks.mjs +7 -0
  355. package/dist/src/types/webTasks.mjs.map +1 -0
  356. package/dist/store-invariants.cjs +5 -0
  357. package/dist/store-invariants.d.cts +2 -0
  358. package/dist/store-invariants.d.mts +2 -0
  359. package/dist/store-invariants.mjs +2 -0
  360. package/dist/store-paths.cjs +14 -0
  361. package/dist/store-paths.d.cts +2 -0
  362. package/dist/store-paths.d.mts +2 -0
  363. package/dist/store-paths.mjs +2 -0
  364. package/dist/store-process-liveness.cjs +3 -0
  365. package/dist/store-process-liveness.d.cts +2 -0
  366. package/dist/store-process-liveness.d.mts +2 -0
  367. package/dist/store-process-liveness.mjs +2 -0
  368. package/dist/store-reconcile.cjs +5 -0
  369. package/dist/store-reconcile.d.cts +2 -0
  370. package/dist/store-reconcile.d.mts +2 -0
  371. package/dist/store-reconcile.mjs +2 -0
  372. package/dist/store-reducer.cjs +8 -0
  373. package/dist/store-reducer.d.cts +2 -0
  374. package/dist/store-reducer.d.mts +2 -0
  375. package/dist/store-reducer.mjs +2 -0
  376. package/dist/store-task-graph.cjs +7 -0
  377. package/dist/store-task-graph.d.cts +2 -0
  378. package/dist/store-task-graph.d.mts +2 -0
  379. package/dist/store-task-graph.mjs +2 -0
  380. package/dist/store-task-store.cjs +3 -0
  381. package/dist/store-task-store.d.cts +2 -0
  382. package/dist/store-task-store.d.mts +2 -0
  383. package/dist/store-task-store.mjs +2 -0
  384. package/dist/store-types.cjs +6 -0
  385. package/dist/store-types.d.cts +2 -0
  386. package/dist/store-types.d.mts +2 -0
  387. package/dist/store-types.mjs +2 -0
  388. package/dist/tool-prompt-guidelines.cjs +3 -0
  389. package/dist/tool-prompt-guidelines.d.cts +2 -0
  390. package/dist/tool-prompt-guidelines.d.mts +2 -0
  391. package/dist/tool-prompt-guidelines.mjs +2 -0
  392. package/dist/tool-response-envelope.cjs +12 -0
  393. package/dist/tool-response-envelope.d.cts +2 -0
  394. package/dist/tool-response-envelope.d.mts +2 -0
  395. package/dist/tool-response-envelope.mjs +2 -0
  396. package/dist/tool-schema.cjs +17 -0
  397. package/dist/tool-schema.d.cts +3 -0
  398. package/dist/tool-schema.d.mts +3 -0
  399. package/dist/tool-schema.mjs +3 -0
  400. package/dist/tool-task-tool.cjs +6 -0
  401. package/dist/tool-task-tool.d.cts +3 -0
  402. package/dist/tool-task-tool.d.mts +3 -0
  403. package/dist/tool-task-tool.mjs +3 -0
  404. package/dist/tui-format.cjs +14 -0
  405. package/dist/tui-format.d.cts +2 -0
  406. package/dist/tui-format.d.mts +2 -0
  407. package/dist/tui-format.mjs +2 -0
  408. package/dist/tui-selectors.cjs +10 -0
  409. package/dist/tui-selectors.d.cts +2 -0
  410. package/dist/tui-selectors.d.mts +2 -0
  411. package/dist/tui-selectors.mjs +2 -0
  412. package/dist/tui-task-overlay.cjs +4 -0
  413. package/dist/tui-task-overlay.d.cts +2 -0
  414. package/dist/tui-task-overlay.d.mts +2 -0
  415. package/dist/tui-task-overlay.mjs +2 -0
  416. package/dist/tui-task-space.cjs +5 -0
  417. package/dist/tui-task-space.d.cts +2 -0
  418. package/dist/tui-task-space.d.mts +2 -0
  419. package/dist/tui-task-space.mjs +2 -0
  420. package/package.json +6 -6
@@ -0,0 +1,59 @@
1
+ import { Task } from "../../../../../../models/task.cjs";
2
+ //#region src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.ts
3
+ export interface TaskCounts {
4
+ total: number;
5
+ completed: number;
6
+ inProgress: number;
7
+ pending: number;
8
+ failed: number;
9
+ blocked: number;
10
+ }
11
+ export interface TaskGroups {
12
+ inProgress: Task[];
13
+ blocked: Task[];
14
+ pending: Task[];
15
+ completed: Task[];
16
+ failed: Task[];
17
+ }
18
+ export interface TaskProjection {
19
+ visible: Task[];
20
+ counts: TaskCounts;
21
+ groups: TaskGroups;
22
+ showIds: boolean;
23
+ hasActiveWork: boolean;
24
+ }
25
+ export declare function visibleTasks(tasks: readonly Task[]): Task[];
26
+ /**
27
+ * Derive all overlay-facing state in O(tasks + dependency edges).
28
+ *
29
+ * The id index replaces one full task-list scan per dependency, while the
30
+ * ordered pass keeps group ordering identical to the source document.
31
+ */
32
+ export declare function deriveTaskProjection(tasks: readonly Task[]): TaskProjection;
33
+ export declare function countTasks(tasks: readonly Task[]): TaskCounts;
34
+ /**
35
+ * Group tasks for display.
36
+ *
37
+ * Blocked tasks split out of `pending` because a reader scanning the overlay
38
+ * needs to know at a glance what is actually actionable right now.
39
+ */
40
+ export declare function groupTasks(tasks: readonly Task[]): TaskGroups;
41
+ /** Ids are only worth the visual noise once dependencies are in play. */
42
+ export declare function shouldShowIds(tasks: readonly Task[]): boolean;
43
+ export declare function hasActiveWork(tasks: readonly Task[]): boolean;
44
+ export interface OverlayLayout {
45
+ visible: Task[];
46
+ hiddenCompleted: number;
47
+ truncatedTail: number;
48
+ }
49
+ /**
50
+ * Choose which rows fit the overlay budget.
51
+ *
52
+ * Active work wins limited space: in-progress first, then failed, blocked, and
53
+ * pending. Selected rows are always returned in source order, however, so a
54
+ * status update does not reshuffle an otherwise unchanged overlay.
55
+ */
56
+ export declare function selectOverlayLayoutFromProjection(projection: TaskProjection, budget: number): OverlayLayout;
57
+ export declare function selectOverlayLayout(tasks: readonly Task[], budget: number): OverlayLayout;
58
+ //#endregion
59
+ //# sourceMappingURL=selectors.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.d.cts","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.ts"],"mappings":";;iBAGiB;EACf;EACA;EACA;EACA;EACA;EACA;;iBAGe;EACf,YAAY;EACZ,SAAS;EACT,SAAS;EACT,WAAW;EACX,QAAQ;;iBAGO;EACf,SAAS;EACT,QAAQ;EACR,QAAQ;EACR;EACA;;wBAGc,aAAa,gBAAgB,SAAS;;;;;;;wBAuBtC,qBAAqB,gBAAgB,SAAS;wBA4C9C,WAAW,gBAAgB,SAAS;;;;;;;wBAUpC,WAAW,gBAAgB,SAAS;;wBAKpC,cAAc,gBAAgB;wBAI9B,cAAc,gBAAgB;iBAI7B;EACf,SAAS;EACT;EACA;;;;;;;;;wBAUc,kCAAkC,YAAY,gBAAgB,iBAAiB;wBAiC/E,oBAAoB,gBAAgB,QAAQ,iBAAiB"}
@@ -0,0 +1,59 @@
1
+ import { Task } from "../../../../../../models/task.mjs";
2
+ //#region src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.d.ts
3
+ export interface TaskCounts {
4
+ total: number;
5
+ completed: number;
6
+ inProgress: number;
7
+ pending: number;
8
+ failed: number;
9
+ blocked: number;
10
+ }
11
+ export interface TaskGroups {
12
+ inProgress: Task[];
13
+ blocked: Task[];
14
+ pending: Task[];
15
+ completed: Task[];
16
+ failed: Task[];
17
+ }
18
+ export interface TaskProjection {
19
+ visible: Task[];
20
+ counts: TaskCounts;
21
+ groups: TaskGroups;
22
+ showIds: boolean;
23
+ hasActiveWork: boolean;
24
+ }
25
+ export declare function visibleTasks(tasks: readonly Task[]): Task[];
26
+ /**
27
+ * Derive all overlay-facing state in O(tasks + dependency edges).
28
+ *
29
+ * The id index replaces one full task-list scan per dependency, while the
30
+ * ordered pass keeps group ordering identical to the source document.
31
+ */
32
+ export declare function deriveTaskProjection(tasks: readonly Task[]): TaskProjection;
33
+ export declare function countTasks(tasks: readonly Task[]): TaskCounts;
34
+ /**
35
+ * Group tasks for display.
36
+ *
37
+ * Blocked tasks split out of `pending` because a reader scanning the overlay
38
+ * needs to know at a glance what is actually actionable right now.
39
+ */
40
+ export declare function groupTasks(tasks: readonly Task[]): TaskGroups;
41
+ /** Ids are only worth the visual noise once dependencies are in play. */
42
+ export declare function shouldShowIds(tasks: readonly Task[]): boolean;
43
+ export declare function hasActiveWork(tasks: readonly Task[]): boolean;
44
+ export interface OverlayLayout {
45
+ visible: Task[];
46
+ hiddenCompleted: number;
47
+ truncatedTail: number;
48
+ }
49
+ /**
50
+ * Choose which rows fit the overlay budget.
51
+ *
52
+ * Active work wins limited space: in-progress first, then failed, blocked, and
53
+ * pending. Selected rows are always returned in source order, however, so a
54
+ * status update does not reshuffle an otherwise unchanged overlay.
55
+ */
56
+ export declare function selectOverlayLayoutFromProjection(projection: TaskProjection, budget: number): OverlayLayout;
57
+ export declare function selectOverlayLayout(tasks: readonly Task[], budget: number): OverlayLayout;
58
+ //#endregion
59
+ //# sourceMappingURL=selectors.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.d.mts","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.ts"],"mappings":";;iBAGiB;EACf;EACA;EACA;EACA;EACA;EACA;;iBAGe;EACf,YAAY;EACZ,SAAS;EACT,SAAS;EACT,WAAW;EACX,QAAQ;;iBAGO;EACf,SAAS;EACT,QAAQ;EACR,QAAQ;EACR;EACA;;wBAGc,aAAa,gBAAgB,SAAS;;;;;;;wBAuBtC,qBAAqB,gBAAgB,SAAS;wBA4C9C,WAAW,gBAAgB,SAAS;;;;;;;wBAUpC,WAAW,gBAAgB,SAAS;;wBAKpC,cAAc,gBAAgB;wBAI9B,cAAc,gBAAgB;iBAI7B;EACf,SAAS;EACT;EACA;;;;;;;;;wBAUc,kCAAkC,YAAY,gBAAgB,iBAAiB;wBAiC/E,oBAAoB,gBAAgB,QAAQ,iBAAiB"}
@@ -0,0 +1,142 @@
1
+ import { canonicalizeTasks } from "../../../../../../services/invariants/index.mjs";
2
+ //#region src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.ts
3
+ function visibleTasks(tasks) {
4
+ return canonicalizeTasks(tasks).filter((task) => task.status !== "deleted");
5
+ }
6
+ function indexStatuses(tasks) {
7
+ return new Map(tasks.map((task) => [task.id, task.status]));
8
+ }
9
+ function hasUnresolvedBlocker(task, statuses) {
10
+ return task.blockedBy?.some((id) => {
11
+ const status = statuses.get(id);
12
+ return status !== void 0 && status !== "completed" && status !== "deleted";
13
+ }) ?? false;
14
+ }
15
+ /**
16
+ * Derive all overlay-facing state in O(tasks + dependency edges).
17
+ *
18
+ * The id index replaces one full task-list scan per dependency, while the
19
+ * ordered pass keeps group ordering identical to the source document.
20
+ */
21
+ function deriveTaskProjection(tasks) {
22
+ const canonical = canonicalizeTasks(tasks);
23
+ const statuses = indexStatuses(canonical);
24
+ const visible = [];
25
+ const counts = {
26
+ total: 0,
27
+ completed: 0,
28
+ inProgress: 0,
29
+ pending: 0,
30
+ failed: 0,
31
+ blocked: 0
32
+ };
33
+ const groups = {
34
+ inProgress: [],
35
+ blocked: [],
36
+ pending: [],
37
+ completed: [],
38
+ failed: []
39
+ };
40
+ let showIds = false;
41
+ for (const task of canonical) {
42
+ if (task.status === "deleted") continue;
43
+ visible.push(task);
44
+ counts.total += 1;
45
+ showIds ||= Boolean(task.blockedBy?.length);
46
+ switch (task.status) {
47
+ case "in_progress":
48
+ counts.inProgress += 1;
49
+ groups.inProgress.push(task);
50
+ break;
51
+ case "pending":
52
+ counts.pending += 1;
53
+ if (hasUnresolvedBlocker(task, statuses)) {
54
+ counts.blocked += 1;
55
+ groups.blocked.push(task);
56
+ } else groups.pending.push(task);
57
+ break;
58
+ case "failed":
59
+ counts.failed += 1;
60
+ groups.failed.push(task);
61
+ break;
62
+ case "completed":
63
+ counts.completed += 1;
64
+ groups.completed.push(task);
65
+ }
66
+ }
67
+ return {
68
+ visible,
69
+ counts,
70
+ groups,
71
+ showIds,
72
+ hasActiveWork: counts.inProgress > 0
73
+ };
74
+ }
75
+ function countTasks(tasks) {
76
+ return deriveTaskProjection(tasks).counts;
77
+ }
78
+ /**
79
+ * Group tasks for display.
80
+ *
81
+ * Blocked tasks split out of `pending` because a reader scanning the overlay
82
+ * needs to know at a glance what is actually actionable right now.
83
+ */
84
+ function groupTasks(tasks) {
85
+ return deriveTaskProjection(tasks).groups;
86
+ }
87
+ /** Ids are only worth the visual noise once dependencies are in play. */
88
+ function shouldShowIds(tasks) {
89
+ return tasks.some((task) => task.status !== "deleted" && Boolean(task.blockedBy?.length));
90
+ }
91
+ function hasActiveWork(tasks) {
92
+ return tasks.some((task) => task.status === "in_progress");
93
+ }
94
+ /**
95
+ * Choose which rows fit the overlay budget.
96
+ *
97
+ * Active work wins limited space: in-progress first, then failed, blocked, and
98
+ * pending. Selected rows are always returned in source order, however, so a
99
+ * status update does not reshuffle an otherwise unchanged overlay.
100
+ */
101
+ function selectOverlayLayoutFromProjection(projection, budget) {
102
+ const { groups, visible: sourceOrder } = projection;
103
+ const active = [
104
+ ...groups.inProgress,
105
+ ...groups.failed,
106
+ ...groups.blocked,
107
+ ...groups.pending
108
+ ];
109
+ if (budget <= 0) return {
110
+ visible: [],
111
+ hiddenCompleted: groups.completed.length,
112
+ truncatedTail: active.length
113
+ };
114
+ if (sourceOrder.length <= budget) return {
115
+ visible: sourceOrder,
116
+ hiddenCompleted: 0,
117
+ truncatedTail: 0
118
+ };
119
+ if (active.length <= budget) {
120
+ const remaining = budget - active.length;
121
+ const shownCompleted = groups.completed.slice(0, remaining);
122
+ const selected = /* @__PURE__ */ new Set([...active, ...shownCompleted]);
123
+ return {
124
+ visible: sourceOrder.filter((task) => selected.has(task)),
125
+ hiddenCompleted: groups.completed.length - shownCompleted.length,
126
+ truncatedTail: 0
127
+ };
128
+ }
129
+ const selected = new Set(active.slice(0, budget));
130
+ return {
131
+ visible: sourceOrder.filter((task) => selected.has(task)),
132
+ hiddenCompleted: groups.completed.length,
133
+ truncatedTail: active.length - budget
134
+ };
135
+ }
136
+ function selectOverlayLayout(tasks, budget) {
137
+ return selectOverlayLayoutFromProjection(deriveTaskProjection(tasks), budget);
138
+ }
139
+ //#endregion
140
+ export { countTasks, deriveTaskProjection, groupTasks, hasActiveWork, selectOverlayLayout, selectOverlayLayoutFromProjection, shouldShowIds, visibleTasks };
141
+
142
+ //# sourceMappingURL=selectors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.mjs","names":[],"sources":["../../../../../../../../src/extensions/workspaces/sessions/(frontend)/overlay/_lib/selectors.ts"],"sourcesContent":["import type { Task } from '../../../../../../models/task';\nimport { canonicalizeTasks } from '../../../../../../services/invariants';\n\nexport interface TaskCounts {\n total: number;\n completed: number;\n inProgress: number;\n pending: number;\n failed: number;\n blocked: number;\n}\n\nexport interface TaskGroups {\n inProgress: Task[];\n blocked: Task[];\n pending: Task[];\n completed: Task[];\n failed: Task[];\n}\n\nexport interface TaskProjection {\n visible: Task[];\n counts: TaskCounts;\n groups: TaskGroups;\n showIds: boolean;\n hasActiveWork: boolean;\n}\n\nexport function visibleTasks(tasks: readonly Task[]): Task[] {\n return canonicalizeTasks(tasks).filter((task) => task.status !== 'deleted');\n}\n\nfunction indexStatuses(tasks: readonly Task[]): Map<number, Task['status']> {\n return new Map(tasks.map((task) => [task.id, task.status]));\n}\n\nfunction hasUnresolvedBlocker(task: Task, statuses: ReadonlyMap<number, Task['status']>): boolean {\n return (\n task.blockedBy?.some((id) => {\n const status = statuses.get(id);\n return status !== undefined && status !== 'completed' && status !== 'deleted';\n }) ?? false\n );\n}\n\n/**\n * Derive all overlay-facing state in O(tasks + dependency edges).\n *\n * The id index replaces one full task-list scan per dependency, while the\n * ordered pass keeps group ordering identical to the source document.\n */\nexport function deriveTaskProjection(tasks: readonly Task[]): TaskProjection {\n const canonical = canonicalizeTasks(tasks);\n const statuses = indexStatuses(canonical);\n const visible: Task[] = [];\n const counts: TaskCounts = { total: 0, completed: 0, inProgress: 0, pending: 0, failed: 0, blocked: 0 };\n const groups: TaskGroups = { inProgress: [], blocked: [], pending: [], completed: [], failed: [] };\n let showIds = false;\n\n for (const task of canonical) {\n if (task.status === 'deleted') continue;\n\n visible.push(task);\n counts.total += 1;\n showIds ||= Boolean(task.blockedBy?.length);\n\n switch (task.status) {\n case 'in_progress':\n counts.inProgress += 1;\n groups.inProgress.push(task);\n break;\n case 'pending': {\n counts.pending += 1;\n if (hasUnresolvedBlocker(task, statuses)) {\n counts.blocked += 1;\n groups.blocked.push(task);\n } else {\n groups.pending.push(task);\n }\n break;\n }\n case 'failed':\n counts.failed += 1;\n groups.failed.push(task);\n break;\n case 'completed':\n counts.completed += 1;\n groups.completed.push(task);\n break;\n }\n }\n\n return { visible, counts, groups, showIds, hasActiveWork: counts.inProgress > 0 };\n}\n\nexport function countTasks(tasks: readonly Task[]): TaskCounts {\n return deriveTaskProjection(tasks).counts;\n}\n\n/**\n * Group tasks for display.\n *\n * Blocked tasks split out of `pending` because a reader scanning the overlay\n * needs to know at a glance what is actually actionable right now.\n */\nexport function groupTasks(tasks: readonly Task[]): TaskGroups {\n return deriveTaskProjection(tasks).groups;\n}\n\n/** Ids are only worth the visual noise once dependencies are in play. */\nexport function shouldShowIds(tasks: readonly Task[]): boolean {\n return tasks.some((task) => task.status !== 'deleted' && Boolean(task.blockedBy?.length));\n}\n\nexport function hasActiveWork(tasks: readonly Task[]): boolean {\n return tasks.some((task) => task.status === 'in_progress');\n}\n\nexport interface OverlayLayout {\n visible: Task[];\n hiddenCompleted: number;\n truncatedTail: number;\n}\n\n/**\n * Choose which rows fit the overlay budget.\n *\n * Active work wins limited space: in-progress first, then failed, blocked, and\n * pending. Selected rows are always returned in source order, however, so a\n * status update does not reshuffle an otherwise unchanged overlay.\n */\nexport function selectOverlayLayoutFromProjection(projection: TaskProjection, budget: number): OverlayLayout {\n const { groups, visible: sourceOrder } = projection;\n const active = [...groups.inProgress, ...groups.failed, ...groups.blocked, ...groups.pending];\n if (budget <= 0) {\n return {\n visible: [],\n hiddenCompleted: groups.completed.length,\n truncatedTail: active.length,\n };\n }\n if (sourceOrder.length <= budget) {\n return { visible: sourceOrder, hiddenCompleted: 0, truncatedTail: 0 };\n }\n\n if (active.length <= budget) {\n const remaining = budget - active.length;\n const shownCompleted = groups.completed.slice(0, remaining);\n const selected = new Set([...active, ...shownCompleted]);\n return {\n visible: sourceOrder.filter((task) => selected.has(task)),\n hiddenCompleted: groups.completed.length - shownCompleted.length,\n truncatedTail: 0,\n };\n }\n\n const selected = new Set(active.slice(0, budget));\n return {\n visible: sourceOrder.filter((task) => selected.has(task)),\n hiddenCompleted: groups.completed.length,\n truncatedTail: active.length - budget,\n };\n}\n\nexport function selectOverlayLayout(tasks: readonly Task[], budget: number): OverlayLayout {\n return selectOverlayLayoutFromProjection(deriveTaskProjection(tasks), budget);\n}\n"],"mappings":";;AA4BA,SAAgB,aAAa,OAAgC;CAC3D,OAAO,kBAAkB,KAAK,CAAC,CAAC,QAAQ,SAAS,KAAK,WAAW,SAAS;AAC5E;AAEA,SAAS,cAAc,OAAqD;CAC1E,OAAO,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC;AAC5D;AAEA,SAAS,qBAAqB,MAAY,UAAwD;CAChG,OACE,KAAK,WAAW,MAAM,OAAO;EAC3B,MAAM,SAAS,SAAS,IAAI,EAAE;EAC9B,OAAO,WAAW,KAAA,KAAa,WAAW,eAAe,WAAW;CACtE,CAAC,KAAK;AAEV;;;;;;;AAQA,SAAgB,qBAAqB,OAAwC;CAC3E,MAAM,YAAY,kBAAkB,KAAK;CACzC,MAAM,WAAW,cAAc,SAAS;CACxC,MAAM,UAAkB,CAAC;CACzB,MAAM,SAAqB;EAAE,OAAO;EAAG,WAAW;EAAG,YAAY;EAAG,SAAS;EAAG,QAAQ;EAAG,SAAS;CAAE;CACtG,MAAM,SAAqB;EAAE,YAAY,CAAC;EAAG,SAAS,CAAC;EAAG,SAAS,CAAC;EAAG,WAAW,CAAC;EAAG,QAAQ,CAAC;CAAE;CACjG,IAAI,UAAU;CAEd,KAAK,MAAM,QAAQ,WAAW;EAC5B,IAAI,KAAK,WAAW,WAAW;EAE/B,QAAQ,KAAK,IAAI;EACjB,OAAO,SAAS;EAChB,YAAY,QAAQ,KAAK,WAAW,MAAM;EAE1C,QAAQ,KAAK,QAAb;GACE,KAAK;IACH,OAAO,cAAc;IACrB,OAAO,WAAW,KAAK,IAAI;IAC3B;GACF,KAAK;IACH,OAAO,WAAW;IAClB,IAAI,qBAAqB,MAAM,QAAQ,GAAG;KACxC,OAAO,WAAW;KAClB,OAAO,QAAQ,KAAK,IAAI;IAC1B,OACE,OAAO,QAAQ,KAAK,IAAI;IAE1B;GAEF,KAAK;IACH,OAAO,UAAU;IACjB,OAAO,OAAO,KAAK,IAAI;IACvB;GACF,KAAK;IACH,OAAO,aAAa;IACpB,OAAO,UAAU,KAAK,IAAI;EAE9B;CACF;CAEA,OAAO;EAAE;EAAS;EAAQ;EAAQ;EAAS,eAAe,OAAO,aAAa;CAAE;AAClF;AAEA,SAAgB,WAAW,OAAoC;CAC7D,OAAO,qBAAqB,KAAK,CAAC,CAAC;AACrC;;;;;;;AAQA,SAAgB,WAAW,OAAoC;CAC7D,OAAO,qBAAqB,KAAK,CAAC,CAAC;AACrC;;AAGA,SAAgB,cAAc,OAAiC;CAC7D,OAAO,MAAM,MAAM,SAAS,KAAK,WAAW,aAAa,QAAQ,KAAK,WAAW,MAAM,CAAC;AAC1F;AAEA,SAAgB,cAAc,OAAiC;CAC7D,OAAO,MAAM,MAAM,SAAS,KAAK,WAAW,aAAa;AAC3D;;;;;;;;AAeA,SAAgB,kCAAkC,YAA4B,QAA+B;CAC3G,MAAM,EAAE,QAAQ,SAAS,gBAAgB;CACzC,MAAM,SAAS;EAAC,GAAG,OAAO;EAAY,GAAG,OAAO;EAAQ,GAAG,OAAO;EAAS,GAAG,OAAO;CAAO;CAC5F,IAAI,UAAU,GACZ,OAAO;EACL,SAAS,CAAC;EACV,iBAAiB,OAAO,UAAU;EAClC,eAAe,OAAO;CACxB;CAEF,IAAI,YAAY,UAAU,QACxB,OAAO;EAAE,SAAS;EAAa,iBAAiB;EAAG,eAAe;CAAE;CAGtE,IAAI,OAAO,UAAU,QAAQ;EAC3B,MAAM,YAAY,SAAS,OAAO;EAClC,MAAM,iBAAiB,OAAO,UAAU,MAAM,GAAG,SAAS;EAC1D,MAAM,2BAAW,IAAI,IAAI,CAAC,GAAG,QAAQ,GAAG,cAAc,CAAC;EACvD,OAAO;GACL,SAAS,YAAY,QAAQ,SAAS,SAAS,IAAI,IAAI,CAAC;GACxD,iBAAiB,OAAO,UAAU,SAAS,eAAe;GAC1D,eAAe;EACjB;CACF;CAEA,MAAM,WAAW,IAAI,IAAI,OAAO,MAAM,GAAG,MAAM,CAAC;CAChD,OAAO;EACL,SAAS,YAAY,QAAQ,SAAS,SAAS,IAAI,IAAI,CAAC;EACxD,iBAAiB,OAAO,UAAU;EAClC,eAAe,OAAO,SAAS;CACjC;AACF;AAEA,SAAgB,oBAAoB,OAAwB,QAA+B;CACzF,OAAO,kCAAkC,qBAAqB,KAAK,GAAG,MAAM;AAC9E"}
@@ -0,0 +1,358 @@
1
+ const require_taskGraph = require("../../../../../../models/taskGraph.cjs");
2
+ const require_format_cli = require("../../_shared/format.cli.cjs");
3
+ const require_selectors = require("./selectors.cjs");
4
+ const require_task = require("../../../../../../schemas/task.cjs");
5
+ const require_index = require("../../../../../../services/reducer/index.cjs");
6
+ let _earendil_works_pi_tui = require("@earendil-works/pi-tui");
7
+ let node_os = require("node:os");
8
+ let _agimon_ai_doompi_ui_doom_overlay = require("@agimon-ai/doompi-ui/doom-overlay");
9
+ let _agimon_ai_doompi_ui_rendering = require("@agimon-ai/doompi-ui/rendering");
10
+ //#region src/extensions/workspaces/sessions/(frontend)/overlay/_lib/task-space.cli.ts
11
+ /**
12
+ * Task Space: the `SPC t l` overlay.
13
+ *
14
+ * The task list and detail pane render from plain values so the whole surface
15
+ * can be asserted as text without a live terminal.
16
+ *
17
+ * The overlay reads the store on every render rather than caching rows, so an
18
+ * external write by a delegated child shows up without closing the overlay.
19
+ *
20
+ * Every commit it makes is a single-entry `upsert` that carries the selected
21
+ * task's id. That id is what keeps creating a task a tool-only path: an entry
22
+ * without one would create rather than be rejected.
23
+ */
24
+ const TASK_SPACE_OVERLAY_OPTIONS = _agimon_ai_doompi_ui_doom_overlay.DOOM_FULLSCREEN_UI_OPTIONS.overlayOptions;
25
+ const KEY_BACKSPACE = "";
26
+ const KEY_ENTER = "\r";
27
+ const KEY_NEWLINE = "\n";
28
+ const FIRST_PRINTABLE_CODE_POINT = 32;
29
+ const DELETE_CODE_POINT = 127;
30
+ /**
31
+ * Keystrokes that carry no text: escape sequences, control keys, delete.
32
+ * Indexed rather than iterated so surrogate pairs stay intact; both halves sit
33
+ * far above the control range, so no emoji is ever mistaken for one.
34
+ */
35
+ function isControlInput(data) {
36
+ for (let index = 0; index < data.length; index++) {
37
+ const code = data.charCodeAt(index);
38
+ if (code < FIRST_PRINTABLE_CODE_POINT || code === DELETE_CODE_POINT) return true;
39
+ }
40
+ return false;
41
+ }
42
+ /**
43
+ * Store path for the list heading: home collapses to `~`, and an over-long path
44
+ * loses leading segments rather than its tail, because the file name identifies
45
+ * the store while `/var/folders/...` does not.
46
+ */
47
+ function storeLabel(storePath, width) {
48
+ const home = (0, node_os.homedir)();
49
+ const abbreviated = home && storePath.startsWith(home) ? `~${storePath.slice(home.length)}` : storePath;
50
+ if ((0, _earendil_works_pi_tui.visibleWidth)(abbreviated) <= width) return abbreviated;
51
+ const segments = abbreviated.split("/");
52
+ let tail = segments.pop() ?? abbreviated;
53
+ while (segments.length > 0) {
54
+ const candidate = `${segments[segments.length - 1]}/${tail}`;
55
+ if ((0, _earendil_works_pi_tui.visibleWidth)(`…/${candidate}`) > width) break;
56
+ tail = candidate;
57
+ segments.pop();
58
+ }
59
+ return (0, _earendil_works_pi_tui.truncateToWidth)(`…/${tail}`, width, "");
60
+ }
61
+ /** Each task occupies a heading row and a metadata row beneath it. */
62
+ const ROWS_PER_TASK = 2;
63
+ /** Hanging indent for the metadata row: clears marker, glyph and id. */
64
+ const META_INDENT = 6;
65
+ const MIN_WIDTH = 48;
66
+ /** A third for the list, two thirds for the task being read or edited. */
67
+ const LIST_PANE_RATIO = 1 / 3;
68
+ /** One blank column each side of the pane divider so neither column touches it. */
69
+ const PANE_GUTTER = 1;
70
+ const MIN_PANE_WIDTH = 18;
71
+ const SELECTION_MARKER = "›";
72
+ const CURRENT_MARKER = "▸";
73
+ const CURSOR_BLOCK = "█";
74
+ const ELLIPSIS = "…";
75
+ const NO_VALUE = "none";
76
+ const TITLE = "TASK SPACE";
77
+ const BREADCRUMB = "SPC › t › t / tasks";
78
+ /** Key/label pairs rendered as capped keys, matching the mockup's footer. */
79
+ const LIST_HINTS = [
80
+ ["↑↓", "select"],
81
+ ["enter", "edit subject"],
82
+ ["s", "status"],
83
+ ["esc", "close"]
84
+ ];
85
+ const LIST_HEADER_RIGHT = "esc close";
86
+ const STATUS_HINT = "STATUS s cycles · enter commits";
87
+ const SUBJECT_HINT = "SUBJECT enter commits · esc cancels";
88
+ function fitRow(text, width) {
89
+ return (0, _agimon_ai_doompi_ui_rendering.fitStyledLine)(text, width, ELLIPSIS);
90
+ }
91
+ function rightAligned(left, right, width) {
92
+ const rightWidth = (0, _earendil_works_pi_tui.visibleWidth)(right);
93
+ const leftWidth = Math.max(0, width - rightWidth - 1);
94
+ return fitRow(left, leftWidth) + " ".repeat(Math.max(1, width - leftWidth - rightWidth)) + fitRow(right, rightWidth);
95
+ }
96
+ function wrap(text, width) {
97
+ if (width <= 0) return [];
98
+ const lines = [];
99
+ let current = "";
100
+ for (const word of text.split(/\s+/).filter(Boolean)) if (current.length === 0) current = word;
101
+ else if (current.length + 1 + word.length <= width) current += ` ${word}`;
102
+ else {
103
+ lines.push(current);
104
+ current = word;
105
+ }
106
+ if (current.length > 0) lines.push(current);
107
+ return lines;
108
+ }
109
+ /**
110
+ * Task Space overlay component.
111
+ *
112
+ * Rendering is pure: `render(width)` reads the live store and returns lines with
113
+ * no side effects, so the fidelity job can capture it and unit tests can assert on it.
114
+ */
115
+ var TaskSpaceComponent = class extends _agimon_ai_doompi_ui_doom_overlay.DoomOverlay {
116
+ options;
117
+ done;
118
+ unwatch;
119
+ mode = "browse";
120
+ selected = 0;
121
+ statusIndex = 0;
122
+ draft = "";
123
+ notice;
124
+ bodyHeight = 1;
125
+ constructor(tui, theme, options, done) {
126
+ super(tui, theme);
127
+ this.options = options;
128
+ this.done = done;
129
+ this.unwatch = options.store.onExternalChange(() => this.tui.requestRender());
130
+ }
131
+ tasks() {
132
+ return require_selectors.visibleTasks(this.options.store.snapshot.tasks);
133
+ }
134
+ selectedTask() {
135
+ const tasks = this.tasks();
136
+ if (tasks.length === 0) return void 0;
137
+ return tasks[Math.min(this.selected, tasks.length - 1)];
138
+ }
139
+ move(delta) {
140
+ const tasks = this.tasks();
141
+ if (tasks.length === 0) return;
142
+ this.selected = Math.max(0, Math.min(tasks.length - 1, this.selected + delta));
143
+ this.tui.requestRender();
144
+ }
145
+ /** Commits through the same reducer the task tool uses, so both paths share every invariant. */
146
+ commit(item) {
147
+ this.options.store.mutate((document) => {
148
+ const result = require_index.applyTaskMutation(document, "upsert", { tasks: [item] });
149
+ if (!require_index.isCommittingOp(result.op)) return { value: result.op };
150
+ return {
151
+ document: result.document,
152
+ value: result.op
153
+ };
154
+ }).then((outcome) => {
155
+ const single = require_index.singleItemOutcome(outcome.value);
156
+ this.notice = single?.kind === "failed" ? single.message : void 0;
157
+ this.tui.requestRender();
158
+ }).catch((error) => {
159
+ this.notice = error instanceof Error ? error.message : String(error);
160
+ this.tui.requestRender();
161
+ });
162
+ }
163
+ handleStatusInput(data) {
164
+ const task = this.selectedTask();
165
+ if ((0, _earendil_works_pi_tui.matchesKey)(data, "up")) this.statusIndex = Math.max(0, this.statusIndex - 1);
166
+ else if ((0, _earendil_works_pi_tui.matchesKey)(data, "down")) this.statusIndex = Math.min(require_task.TASK_STATUSES.length - 1, this.statusIndex + 1);
167
+ else if (data === "s") this.statusIndex = (this.statusIndex + 1) % require_task.TASK_STATUSES.length;
168
+ else if (data === KEY_ENTER || data === KEY_NEWLINE) {
169
+ this.mode = "browse";
170
+ if (task) this.commit({
171
+ id: task.id,
172
+ status: require_task.TASK_STATUSES[this.statusIndex]
173
+ });
174
+ } else if ((0, _earendil_works_pi_tui.matchesKey)(data, "escape")) this.mode = "browse";
175
+ this.tui.requestRender();
176
+ }
177
+ handleSubjectInput(data) {
178
+ const task = this.selectedTask();
179
+ if (data === KEY_ENTER || data === KEY_NEWLINE) {
180
+ this.mode = "browse";
181
+ if (task) this.commit({
182
+ id: task.id,
183
+ subject: this.draft
184
+ });
185
+ } else if ((0, _earendil_works_pi_tui.matchesKey)(data, "escape")) this.mode = "browse";
186
+ else if (data === KEY_BACKSPACE) this.draft = this.draft.slice(0, -1);
187
+ else if (!isControlInput(data)) this.draft += data;
188
+ this.tui.requestRender();
189
+ }
190
+ handleInput(data) {
191
+ if (this.mode === "status") {
192
+ this.handleStatusInput(data);
193
+ return;
194
+ }
195
+ if (this.mode === "subject") {
196
+ this.handleSubjectInput(data);
197
+ return;
198
+ }
199
+ if ((0, _earendil_works_pi_tui.matchesKey)(data, "escape") || (0, _earendil_works_pi_tui.matchesKey)(data, "ctrl+c")) {
200
+ this.done(void 0);
201
+ return;
202
+ }
203
+ if ((0, _earendil_works_pi_tui.matchesKey)(data, "up")) {
204
+ this.move(-1);
205
+ return;
206
+ }
207
+ if ((0, _earendil_works_pi_tui.matchesKey)(data, "down")) {
208
+ this.move(1);
209
+ return;
210
+ }
211
+ const task = this.selectedTask();
212
+ if (!task) return;
213
+ if (data === "s") {
214
+ this.mode = "status";
215
+ this.statusIndex = Math.max(0, require_task.TASK_STATUSES.indexOf(task.status));
216
+ this.tui.requestRender();
217
+ return;
218
+ }
219
+ if (data === KEY_ENTER || data === KEY_NEWLINE) {
220
+ this.mode = "subject";
221
+ this.draft = task.subject;
222
+ this.tui.requestRender();
223
+ }
224
+ }
225
+ /**
226
+ * A padded, background-filled chip. Foreground is applied inside the fill so
227
+ * the colour closes with it, rather than a reset stripping the background
228
+ * partway through the label.
229
+ */
230
+ badge(text, background, colour = "text") {
231
+ return this.theme.bg(background, this.theme.fg(colour, ` ${text} `));
232
+ }
233
+ /** Footer hints as capped keys: `[ enter ] edit subject`, per the mockup. */
234
+ hintLine(hints) {
235
+ return hints.map(([key, label]) => `${this.badge(key, "selectedBg")}${this.theme.fg("dim", ` ${label}`)}`).join(this.theme.fg("dim", " "));
236
+ }
237
+ listLines(width) {
238
+ const tasks = this.tasks();
239
+ const label = this.theme.bold("TASKS");
240
+ const pathWidth = Math.max(0, width - (0, _earendil_works_pi_tui.visibleWidth)("TASKS") - 2);
241
+ const lines = [`${label} ${this.theme.fg("dim", storeLabel(this.options.store.storePath, pathWidth))}`, ""];
242
+ if (tasks.length === 0) {
243
+ lines.push(this.theme.fg("dim", require_task.MSG_NO_TASKS));
244
+ return lines;
245
+ }
246
+ const budget = Math.max(1, Math.floor((this.bodyHeight - lines.length) / ROWS_PER_TASK));
247
+ const start = Math.max(0, Math.min(this.selected - budget + 1, Math.max(0, tasks.length - budget)));
248
+ for (const [offset, task] of tasks.slice(start, start + budget).entries()) {
249
+ const active = start + offset === Math.min(this.selected, tasks.length - 1);
250
+ const marker = active ? this.theme.fg("accent", SELECTION_MARKER) : " ";
251
+ const subject = active ? this.theme.bold(task.subject) : task.subject;
252
+ const glyph = require_format_cli.overlayStatusGlyph(task.status, this.theme);
253
+ const owner = task.owner ?? task.delegation?.agent ?? NO_VALUE;
254
+ const state = task.status === "pending" && require_taskGraph.isBlocked(this.options.store.snapshot.tasks, task) ? this.theme.fg("warning", `blocked by ${(task.blockedBy ?? []).map((id) => `#${id}`).join(", ")}`) : this.theme.fg("dim", require_format_cli.STATUS_LABEL[task.status]);
255
+ const heading = `${marker} ${glyph} ${this.theme.fg("dim", `#${task.id}`)} ${subject}`;
256
+ const meta = `${" ".repeat(META_INDENT)}${this.badge(owner, "userMessageBg", "muted")} ${state}`;
257
+ const background = active ? "selectedBg" : "userMessageBg";
258
+ for (const row of [heading, meta]) lines.push(this.theme.bg(background, fitRow(row, width)));
259
+ }
260
+ return lines;
261
+ }
262
+ statusLines(task, width) {
263
+ if (this.mode !== "status") {
264
+ const glyph = require_format_cli.overlayStatusGlyph(task.status, this.theme);
265
+ return [this.theme.fg("dim", "STATUS"), `${glyph} ${require_format_cli.STATUS_LABEL[task.status]}`];
266
+ }
267
+ const lines = [this.theme.fg("dim", STATUS_HINT)];
268
+ for (const [index, status] of require_task.TASK_STATUSES.entries()) {
269
+ const selected = index === this.statusIndex;
270
+ const marker = selected ? this.theme.fg("accent", CURRENT_MARKER) : " ";
271
+ const label = selected ? this.theme.bold(this.theme.fg("accent", status)) : this.theme.fg("muted", status);
272
+ const current = status === task.status ? this.theme.fg("dim", "current") : "";
273
+ const row = rightAligned(` ${marker} ${label}`, current, width);
274
+ lines.push(this.theme.bg(selected ? "selectedBg" : "userMessageBg", row));
275
+ }
276
+ return lines;
277
+ }
278
+ /** The subject as an input: a filled field with a caret, as in the mockup. */
279
+ subjectField(task, width) {
280
+ const editing = this.mode === "subject";
281
+ const value = editing ? `${this.draft}${CURSOR_BLOCK}` : task.subject;
282
+ return [this.theme.fg("dim", editing ? SUBJECT_HINT : "SUBJECT"), this.theme.bg(editing ? "selectedBg" : "userMessageBg", fitRow(` ${value}`, width))];
283
+ }
284
+ detailLines(width) {
285
+ const task = this.selectedTask();
286
+ if (!task) return [this.theme.fg("dim", "No task selected")];
287
+ const badge = this.mode === "subject" || this.mode === "status" ? this.badge("EDIT", "toolSuccessBg", "warning") : "";
288
+ const lines = [rightAligned(this.theme.bold(this.theme.fg("accent", `TASK #${task.id}`)), badge, width), ""];
289
+ lines.push(...this.subjectField(task, width));
290
+ lines.push("", ...this.statusLines(task, width), "");
291
+ if (task.activeForm) lines.push(this.theme.fg("dim", "ACTIVE FORM"), task.activeForm, "");
292
+ const owner = task.owner ?? task.delegation?.agent ?? NO_VALUE;
293
+ const delegated = task.delegation?.runId ? this.theme.fg("success", `delegated run ${task.delegation.runId}`) : "";
294
+ lines.push(this.theme.fg("dim", "OWNER"), delegated ? `${owner} ${this.theme.fg("dim", "·")} ${delegated}` : owner, "");
295
+ lines.push(this.theme.fg("dim", "BLOCKED BY"), task.blockedBy?.length ? task.blockedBy.map((id) => `#${id}`).join(" · ") : NO_VALUE);
296
+ if (task.description) lines.push("", this.theme.fg("dim", "DESCRIPTION"), ...wrap(task.description, width));
297
+ if (this.notice) lines.push("", this.theme.fg("error", this.notice));
298
+ return lines;
299
+ }
300
+ headerSummary() {
301
+ const counts = require_selectors.countTasks(this.options.store.snapshot.tasks);
302
+ const summary = [`${counts.completed}/${counts.total} completed`];
303
+ if (counts.inProgress > 0) summary.push(`${counts.inProgress} in progress`);
304
+ if (counts.blocked > 0) summary.push(`${counts.blocked} blocked`);
305
+ if (counts.failed > 0) summary.push(`${counts.failed} failed`);
306
+ return summary.join(" · ");
307
+ }
308
+ getChrome() {
309
+ return {
310
+ title: TITLE,
311
+ accent: _agimon_ai_doompi_ui_doom_overlay.DOOM_OVERLAY_ACCENT,
312
+ breadcrumb: BREADCRUMB,
313
+ headerRight: `${this.headerSummary()} · ${LIST_HEADER_RIGHT}`,
314
+ footer: this.hintLine(LIST_HINTS)
315
+ };
316
+ }
317
+ renderBody(width, height) {
318
+ this.bodyHeight = height;
319
+ if (width < MIN_WIDTH) return this.renderStacked(width, height);
320
+ const leftWidth = Math.max(MIN_PANE_WIDTH, Math.floor((width - 1) * LIST_PANE_RATIO));
321
+ const rightWidth = Math.max(1, width - leftWidth - 1);
322
+ const leftContent = Math.max(1, leftWidth - PANE_GUTTER);
323
+ const rightContent = Math.max(1, rightWidth - PANE_GUTTER);
324
+ const left = this.listLines(leftContent);
325
+ const right = this.detailLines(rightContent);
326
+ const divider = this.theme.fg("borderMuted", "│");
327
+ return Array.from({ length: height }, (_, index) => {
328
+ const row = `${fitRow(left[index] ?? "", leftContent)} ${divider} ${fitRow(right[index] ?? "", rightContent)}`;
329
+ return (0, _earendil_works_pi_tui.truncateToWidth)(row, width, ELLIPSIS);
330
+ });
331
+ }
332
+ renderStacked(width, height) {
333
+ const topHeight = Math.max(1, Math.floor((height - 1) / 2));
334
+ const bottomHeight = Math.max(0, height - topHeight - 1);
335
+ this.bodyHeight = topHeight;
336
+ const top = this.listLines(width);
337
+ const bottom = this.detailLines(width);
338
+ return [
339
+ ...top.slice(0, topHeight),
340
+ ...Array.from({ length: Math.max(0, topHeight - top.length) }, () => ""),
341
+ this.theme.fg("borderMuted", "─".repeat(width)),
342
+ ...bottom.slice(0, bottomHeight)
343
+ ];
344
+ }
345
+ dispose() {
346
+ this.unwatch();
347
+ }
348
+ };
349
+ async function openTaskSpace(ctx, options) {
350
+ await ctx.ui.custom((tui, theme, _keybindings, done) => new TaskSpaceComponent(tui, theme, options, done), _agimon_ai_doompi_ui_doom_overlay.DOOM_FULLSCREEN_UI_OPTIONS);
351
+ }
352
+ //#endregion
353
+ exports.TASK_SPACE_OVERLAY_OPTIONS = TASK_SPACE_OVERLAY_OPTIONS;
354
+ exports.TaskSpaceComponent = TaskSpaceComponent;
355
+ exports.default = openTaskSpace;
356
+ exports.openTaskSpace = openTaskSpace;
357
+
358
+ //# sourceMappingURL=task-space.cli.cjs.map