@agimon-ai/doompi-task 0.0.1-alpha.6 → 0.0.1-alpha.64

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 (401) hide show
  1. package/README.md +112 -15
  2. package/dist/adapters/node/delegationPlatform.cjs +2 -0
  3. package/dist/adapters/node/delegationPlatform.cjs.map +1 -0
  4. package/dist/adapters/node/delegationPlatform.mjs +2 -0
  5. package/dist/adapters/node/delegationPlatform.mjs.map +1 -0
  6. package/dist/adapters/pi/extension.cjs +3 -0
  7. package/dist/adapters/pi/extension.cjs.map +1 -0
  8. package/dist/adapters/pi/extension.d.cts +10 -0
  9. package/dist/adapters/pi/extension.d.cts.map +1 -0
  10. package/dist/adapters/pi/extension.d.mts +10 -0
  11. package/dist/adapters/pi/extension.d.mts.map +1 -0
  12. package/dist/adapters/pi/extension.mjs +3 -0
  13. package/dist/adapters/pi/extension.mjs.map +1 -0
  14. package/dist/adapters/store/paths.cjs +2 -0
  15. package/dist/adapters/store/paths.cjs.map +1 -0
  16. package/dist/adapters/store/paths.d.cts +25 -0
  17. package/dist/adapters/store/paths.d.cts.map +1 -0
  18. package/dist/adapters/store/paths.d.mts +25 -0
  19. package/dist/adapters/store/paths.d.mts.map +1 -0
  20. package/dist/adapters/store/paths.mjs +2 -0
  21. package/dist/adapters/store/paths.mjs.map +1 -0
  22. package/dist/adapters/store/taskStore.cjs +2 -0
  23. package/dist/adapters/store/taskStore.cjs.map +1 -0
  24. package/dist/adapters/store/taskStore.d.cts +86 -0
  25. package/dist/adapters/store/taskStore.d.cts.map +1 -0
  26. package/dist/adapters/store/taskStore.d.mts +86 -0
  27. package/dist/adapters/store/taskStore.d.mts.map +1 -0
  28. package/dist/adapters/store/taskStore.mjs +2 -0
  29. package/dist/adapters/store/taskStore.mjs.map +1 -0
  30. package/dist/adapters/telemetry/logSinkTelemetry.cjs +2 -0
  31. package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +1 -0
  32. package/dist/adapters/telemetry/logSinkTelemetry.d.cts +23 -0
  33. package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -0
  34. package/dist/adapters/telemetry/logSinkTelemetry.d.mts +23 -0
  35. package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -0
  36. package/dist/adapters/telemetry/logSinkTelemetry.mjs +2 -0
  37. package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +1 -0
  38. package/dist/adapters/webTasksChannel.cjs +2 -0
  39. package/dist/adapters/webTasksChannel.cjs.map +1 -0
  40. package/dist/adapters/webTasksChannel.d.cts +19 -0
  41. package/dist/adapters/webTasksChannel.d.cts.map +1 -0
  42. package/dist/adapters/webTasksChannel.d.mts +19 -0
  43. package/dist/adapters/webTasksChannel.d.mts.map +1 -0
  44. package/dist/adapters/webTasksChannel.mjs +2 -0
  45. package/dist/adapters/webTasksChannel.mjs.map +1 -0
  46. package/dist/commands/index.cjs +2 -0
  47. package/dist/commands/index.cjs.map +1 -0
  48. package/dist/commands/index.d.cts +13 -0
  49. package/dist/commands/index.d.cts.map +1 -0
  50. package/dist/commands/index.d.mts +13 -0
  51. package/dist/commands/index.d.mts.map +1 -0
  52. package/dist/commands/index.mjs +2 -0
  53. package/dist/commands/index.mjs.map +1 -0
  54. package/dist/commands/task/promptGuidelines.cjs +2 -0
  55. package/dist/commands/task/promptGuidelines.cjs.map +1 -0
  56. package/dist/commands/task/promptGuidelines.d.cts +13 -0
  57. package/dist/commands/task/promptGuidelines.d.cts.map +1 -0
  58. package/dist/commands/task/promptGuidelines.d.mts +13 -0
  59. package/dist/commands/task/promptGuidelines.d.mts.map +1 -0
  60. package/dist/commands/task/promptGuidelines.mjs +2 -0
  61. package/dist/commands/task/promptGuidelines.mjs.map +1 -0
  62. package/dist/commands/task/responseEnvelope.cjs +7 -0
  63. package/dist/commands/task/responseEnvelope.cjs.map +1 -0
  64. package/dist/commands/task/responseEnvelope.d.cts +50 -0
  65. package/dist/commands/task/responseEnvelope.d.cts.map +1 -0
  66. package/dist/commands/task/responseEnvelope.d.mts +50 -0
  67. package/dist/commands/task/responseEnvelope.d.mts.map +1 -0
  68. package/dist/commands/task/responseEnvelope.mjs +7 -0
  69. package/dist/commands/task/responseEnvelope.mjs.map +1 -0
  70. package/dist/commands/task/taskTool.cjs +3 -0
  71. package/dist/commands/task/taskTool.cjs.map +1 -0
  72. package/dist/commands/task/taskTool.d.cts +20 -0
  73. package/dist/commands/task/taskTool.d.cts.map +1 -0
  74. package/dist/commands/task/taskTool.d.mts +20 -0
  75. package/dist/commands/task/taskTool.d.mts.map +1 -0
  76. package/dist/commands/task/taskTool.mjs +3 -0
  77. package/dist/commands/task/taskTool.mjs.map +1 -0
  78. package/dist/commands.cjs +1 -2
  79. package/dist/commands.d.cts +2 -14
  80. package/dist/commands.d.mts +2 -14
  81. package/dist/commands.mjs +1 -2
  82. package/dist/config.cjs +1 -2
  83. package/dist/config.d.cts +2 -38
  84. package/dist/config.d.mts +2 -38
  85. package/dist/config.mjs +1 -2
  86. package/dist/delegation/manager.cjs +1 -6
  87. package/dist/delegation/manager.d.cts +3 -189
  88. package/dist/delegation/manager.d.mts +3 -189
  89. package/dist/delegation/manager.mjs +1 -6
  90. package/dist/extension.cjs +1 -3
  91. package/dist/extension.d.cts +2 -12
  92. package/dist/extension.d.mts +2 -12
  93. package/dist/extension.mjs +1 -3
  94. package/dist/extensions/pi.cjs +1 -2
  95. package/dist/extensions/pi.d.cts +1 -1
  96. package/dist/extensions/pi.d.mts +1 -1
  97. package/dist/extensions/pi.mjs +1 -2
  98. package/dist/index.cjs +1 -1
  99. package/dist/index.d.cts +15 -14
  100. package/dist/index.d.mts +15 -14
  101. package/dist/index.mjs +1 -1
  102. package/dist/logSinkTelemetry.cjs +1 -2
  103. package/dist/logSinkTelemetry.d.cts +3 -51
  104. package/dist/logSinkTelemetry.d.mts +3 -51
  105. package/dist/logSinkTelemetry.mjs +1 -2
  106. package/dist/schemas/task.cjs +2 -0
  107. package/dist/schemas/task.cjs.map +1 -0
  108. package/dist/schemas/task.d.cts +102 -0
  109. package/dist/schemas/task.d.cts.map +1 -0
  110. package/dist/schemas/task.d.mts +102 -0
  111. package/dist/schemas/task.d.mts.map +1 -0
  112. package/dist/schemas/task.mjs +2 -0
  113. package/dist/schemas/task.mjs.map +1 -0
  114. package/dist/services/contextContribution.cjs +3 -0
  115. package/dist/services/contextContribution.cjs.map +1 -0
  116. package/dist/services/contextContribution.mjs +3 -0
  117. package/dist/services/contextContribution.mjs.map +1 -0
  118. package/dist/services/delegation/manager.cjs +6 -0
  119. package/dist/services/delegation/manager.cjs.map +1 -0
  120. package/dist/services/delegation/manager.d.cts +193 -0
  121. package/dist/services/delegation/manager.d.cts.map +1 -0
  122. package/dist/services/delegation/manager.d.mts +193 -0
  123. package/dist/services/delegation/manager.d.mts.map +1 -0
  124. package/dist/services/delegation/manager.mjs +6 -0
  125. package/dist/services/delegation/manager.mjs.map +1 -0
  126. package/dist/services/narration/taskNarration.cjs +2 -0
  127. package/dist/services/narration/taskNarration.cjs.map +1 -0
  128. package/dist/services/narration/taskNarration.mjs +2 -0
  129. package/dist/services/narration/taskNarration.mjs.map +1 -0
  130. package/dist/services/store/invariants.cjs +2 -0
  131. package/dist/services/store/invariants.cjs.map +1 -0
  132. package/dist/services/store/invariants.d.cts +23 -0
  133. package/dist/services/store/invariants.d.cts.map +1 -0
  134. package/dist/services/store/invariants.d.mts +23 -0
  135. package/dist/services/store/invariants.d.mts.map +1 -0
  136. package/dist/services/store/invariants.mjs +2 -0
  137. package/dist/services/store/invariants.mjs.map +1 -0
  138. package/dist/services/store/processLiveness.cjs +2 -0
  139. package/dist/services/store/processLiveness.cjs.map +1 -0
  140. package/dist/services/store/processLiveness.d.cts +11 -0
  141. package/dist/services/store/processLiveness.d.cts.map +1 -0
  142. package/dist/services/store/processLiveness.d.mts +11 -0
  143. package/dist/services/store/processLiveness.d.mts.map +1 -0
  144. package/dist/services/store/processLiveness.mjs +2 -0
  145. package/dist/services/store/processLiveness.mjs.map +1 -0
  146. package/dist/services/store/reconcile.cjs +2 -0
  147. package/dist/services/store/reconcile.cjs.map +1 -0
  148. package/dist/services/store/reconcile.d.cts +33 -0
  149. package/dist/services/store/reconcile.d.cts.map +1 -0
  150. package/dist/services/store/reconcile.d.mts +33 -0
  151. package/dist/services/store/reconcile.d.mts.map +1 -0
  152. package/dist/services/store/reconcile.mjs +2 -0
  153. package/dist/services/store/reconcile.mjs.map +1 -0
  154. package/dist/services/store/reducer.cjs +3 -0
  155. package/dist/services/store/reducer.cjs.map +1 -0
  156. package/dist/services/store/reducer.d.cts +71 -0
  157. package/dist/services/store/reducer.d.cts.map +1 -0
  158. package/dist/services/store/reducer.d.mts +71 -0
  159. package/dist/services/store/reducer.d.mts.map +1 -0
  160. package/dist/services/store/reducer.mjs +3 -0
  161. package/dist/services/store/reducer.mjs.map +1 -0
  162. package/dist/services/store/taskGraph.cjs +2 -0
  163. package/dist/services/store/taskGraph.cjs.map +1 -0
  164. package/dist/services/store/taskGraph.d.cts +24 -0
  165. package/dist/services/store/taskGraph.d.cts.map +1 -0
  166. package/dist/services/store/taskGraph.d.mts +24 -0
  167. package/dist/services/store/taskGraph.d.mts.map +1 -0
  168. package/dist/services/store/taskGraph.mjs +2 -0
  169. package/dist/services/store/taskGraph.mjs.map +1 -0
  170. package/dist/services/store/types.cjs +2 -0
  171. package/dist/services/store/types.cjs.map +1 -0
  172. package/dist/services/store/types.d.cts +176 -0
  173. package/dist/services/store/types.d.cts.map +1 -0
  174. package/dist/services/store/types.d.mts +176 -0
  175. package/dist/services/store/types.d.mts.map +1 -0
  176. package/dist/services/store/types.mjs +2 -0
  177. package/dist/services/store/types.mjs.map +1 -0
  178. package/dist/store/invariants.cjs +1 -2
  179. package/dist/store/invariants.d.cts +2 -14
  180. package/dist/store/invariants.d.mts +2 -14
  181. package/dist/store/invariants.mjs +1 -2
  182. package/dist/store/paths.cjs +1 -2
  183. package/dist/store/paths.d.cts +2 -23
  184. package/dist/store/paths.d.mts +2 -23
  185. package/dist/store/paths.mjs +1 -2
  186. package/dist/store/processLiveness.cjs +1 -2
  187. package/dist/store/processLiveness.d.cts +2 -12
  188. package/dist/store/processLiveness.d.mts +2 -12
  189. package/dist/store/processLiveness.mjs +1 -2
  190. package/dist/store/reconcile.cjs +1 -2
  191. package/dist/store/reconcile.d.cts +2 -34
  192. package/dist/store/reconcile.d.mts +2 -34
  193. package/dist/store/reconcile.mjs +1 -2
  194. package/dist/store/reducer.cjs +1 -3
  195. package/dist/store/reducer.d.cts +2 -72
  196. package/dist/store/reducer.d.mts +2 -72
  197. package/dist/store/reducer.mjs +1 -3
  198. package/dist/store/taskGraph.cjs +1 -2
  199. package/dist/store/taskGraph.d.cts +2 -25
  200. package/dist/store/taskGraph.d.mts +2 -25
  201. package/dist/store/taskGraph.mjs +1 -2
  202. package/dist/store/taskStore.cjs +1 -2
  203. package/dist/store/taskStore.d.cts +2 -77
  204. package/dist/store/taskStore.d.mts +2 -77
  205. package/dist/store/taskStore.mjs +1 -2
  206. package/dist/store/types.cjs +1 -2
  207. package/dist/store/types.d.cts +2 -165
  208. package/dist/store/types.d.mts +2 -165
  209. package/dist/store/types.mjs +1 -2
  210. package/dist/tool/promptGuidelines.cjs +1 -2
  211. package/dist/tool/promptGuidelines.d.cts +2 -5
  212. package/dist/tool/promptGuidelines.d.mts +2 -5
  213. package/dist/tool/promptGuidelines.mjs +1 -2
  214. package/dist/tool/responseEnvelope.cjs +1 -6
  215. package/dist/tool/responseEnvelope.d.cts +2 -39
  216. package/dist/tool/responseEnvelope.d.mts +2 -39
  217. package/dist/tool/responseEnvelope.mjs +1 -6
  218. package/dist/tool/schema.cjs +1 -2
  219. package/dist/tool/schema.d.cts +2 -86
  220. package/dist/tool/schema.d.mts +2 -86
  221. package/dist/tool/schema.mjs +1 -2
  222. package/dist/tool/taskTool.cjs +1 -3
  223. package/dist/tool/taskTool.d.cts +3 -17
  224. package/dist/tool/taskTool.d.mts +3 -17
  225. package/dist/tool/taskTool.mjs +1 -3
  226. package/dist/tui/format.cjs +1 -4
  227. package/dist/tui/format.d.cts +19 -20
  228. package/dist/tui/format.d.cts.map +1 -1
  229. package/dist/tui/format.d.mts +19 -20
  230. package/dist/tui/format.d.mts.map +1 -1
  231. package/dist/tui/format.mjs +1 -4
  232. package/dist/tui/format2.cjs +4 -0
  233. package/dist/tui/format2.cjs.map +1 -0
  234. package/dist/tui/format2.d.cts +2 -0
  235. package/dist/tui/format2.d.mts +2 -0
  236. package/dist/tui/format2.mjs +4 -0
  237. package/dist/tui/format2.mjs.map +1 -0
  238. package/dist/tui/selectors.cjs +1 -2
  239. package/dist/tui/selectors.d.cts +20 -14
  240. package/dist/tui/selectors.d.cts.map +1 -1
  241. package/dist/tui/selectors.d.mts +20 -14
  242. package/dist/tui/selectors.d.mts.map +1 -1
  243. package/dist/tui/selectors.mjs +1 -2
  244. package/dist/tui/selectors2.cjs +2 -0
  245. package/dist/tui/selectors2.cjs.map +1 -0
  246. package/dist/tui/selectors2.d.cts +2 -0
  247. package/dist/tui/selectors2.d.mts +2 -0
  248. package/dist/tui/selectors2.mjs +2 -0
  249. package/dist/tui/selectors2.mjs.map +1 -0
  250. package/dist/tui/taskOverlay.cjs +1 -2
  251. package/dist/tui/taskOverlay.d.cts +4 -5
  252. package/dist/tui/taskOverlay.d.cts.map +1 -1
  253. package/dist/tui/taskOverlay.d.mts +4 -5
  254. package/dist/tui/taskOverlay.d.mts.map +1 -1
  255. package/dist/tui/taskOverlay.mjs +1 -2
  256. package/dist/tui/taskOverlay2.cjs +2 -0
  257. package/dist/tui/taskOverlay2.cjs.map +1 -0
  258. package/dist/tui/taskOverlay2.d.cts +2 -0
  259. package/dist/tui/taskOverlay2.d.mts +2 -0
  260. package/dist/tui/taskOverlay2.mjs +2 -0
  261. package/dist/tui/taskOverlay2.mjs.map +1 -0
  262. package/dist/tui/taskSpace.cjs +1 -5
  263. package/dist/tui/taskSpace.d.cts +8 -9
  264. package/dist/tui/taskSpace.d.cts.map +1 -1
  265. package/dist/tui/taskSpace.d.mts +8 -9
  266. package/dist/tui/taskSpace.d.mts.map +1 -1
  267. package/dist/tui/taskSpace.mjs +1 -5
  268. package/dist/tui/taskSpace2.cjs +5 -0
  269. package/dist/tui/taskSpace2.cjs.map +1 -0
  270. package/dist/tui/taskSpace2.d.cts +2 -0
  271. package/dist/tui/taskSpace2.d.mts +2 -0
  272. package/dist/tui/taskSpace2.mjs +5 -0
  273. package/dist/tui/taskSpace2.mjs.map +1 -0
  274. package/dist/types/config.cjs +2 -0
  275. package/dist/types/config.cjs.map +1 -0
  276. package/dist/types/config.d.cts +42 -0
  277. package/dist/types/config.d.cts.map +1 -0
  278. package/dist/types/config.d.mts +42 -0
  279. package/dist/types/config.d.mts.map +1 -0
  280. package/dist/types/config.mjs +2 -0
  281. package/dist/types/config.mjs.map +1 -0
  282. package/dist/types/delegation.cjs +2 -0
  283. package/dist/types/delegation.cjs.map +1 -0
  284. package/dist/types/delegation.d.cts +5 -0
  285. package/dist/types/delegation.d.cts.map +1 -0
  286. package/dist/types/delegation.d.mts +5 -0
  287. package/dist/types/delegation.d.mts.map +1 -0
  288. package/dist/types/delegation.mjs +2 -0
  289. package/dist/types/delegation.mjs.map +1 -0
  290. package/dist/types/telemetry.cjs +2 -0
  291. package/dist/types/telemetry.cjs.map +1 -0
  292. package/dist/types/telemetry.d.cts +35 -0
  293. package/dist/types/telemetry.d.cts.map +1 -0
  294. package/dist/types/telemetry.d.mts +35 -0
  295. package/dist/types/telemetry.d.mts.map +1 -0
  296. package/dist/types/telemetry.mjs +2 -0
  297. package/dist/types/telemetry.mjs.map +1 -0
  298. package/dist/types/webTasks.cjs +2 -0
  299. package/dist/types/webTasks.cjs.map +1 -0
  300. package/dist/types/webTasks.mjs +2 -0
  301. package/dist/types/webTasks.mjs.map +1 -0
  302. package/dist/webHub.cjs +1 -0
  303. package/dist/webHub.d.cts +2 -0
  304. package/dist/webHub.d.mts +2 -0
  305. package/dist/webHub.mjs +1 -0
  306. package/package.json +62 -21
  307. package/src/exports/webClient.ts +1 -0
  308. package/src/types/webTasks.ts +24 -0
  309. package/src/web/components/TaskDetailDialog.tsx +250 -0
  310. package/src/web/components/TaskToolMessage.tsx +119 -0
  311. package/src/web/components/TasksActivitySection.tsx +201 -0
  312. package/src/web/index.ts +15 -0
  313. package/src/web/lib/taskToolFormat.ts +330 -0
  314. package/src/web/stores/tasksStore.ts +113 -0
  315. package/src/web/tsconfig.json +23 -0
  316. package/dist/commands.cjs.map +0 -1
  317. package/dist/commands.d.cts.map +0 -1
  318. package/dist/commands.d.mts.map +0 -1
  319. package/dist/commands.mjs.map +0 -1
  320. package/dist/config.cjs.map +0 -1
  321. package/dist/config.d.cts.map +0 -1
  322. package/dist/config.d.mts.map +0 -1
  323. package/dist/config.mjs.map +0 -1
  324. package/dist/delegation/manager.cjs.map +0 -1
  325. package/dist/delegation/manager.d.cts.map +0 -1
  326. package/dist/delegation/manager.d.mts.map +0 -1
  327. package/dist/delegation/manager.mjs.map +0 -1
  328. package/dist/extension.cjs.map +0 -1
  329. package/dist/extension.d.cts.map +0 -1
  330. package/dist/extension.d.mts.map +0 -1
  331. package/dist/extension.mjs.map +0 -1
  332. package/dist/extensions/doom.cjs +0 -2
  333. package/dist/extensions/doom.cjs.map +0 -1
  334. package/dist/extensions/doom.d.cts +0 -6
  335. package/dist/extensions/doom.d.cts.map +0 -1
  336. package/dist/extensions/doom.d.mts +0 -7
  337. package/dist/extensions/doom.d.mts.map +0 -1
  338. package/dist/extensions/doom.mjs +0 -2
  339. package/dist/extensions/doom.mjs.map +0 -1
  340. package/dist/extensions/pi.cjs.map +0 -1
  341. package/dist/extensions/pi.mjs.map +0 -1
  342. package/dist/logSinkTelemetry.cjs.map +0 -1
  343. package/dist/logSinkTelemetry.d.cts.map +0 -1
  344. package/dist/logSinkTelemetry.d.mts.map +0 -1
  345. package/dist/logSinkTelemetry.mjs.map +0 -1
  346. package/dist/store/invariants.cjs.map +0 -1
  347. package/dist/store/invariants.d.cts.map +0 -1
  348. package/dist/store/invariants.d.mts.map +0 -1
  349. package/dist/store/invariants.mjs.map +0 -1
  350. package/dist/store/paths.cjs.map +0 -1
  351. package/dist/store/paths.d.cts.map +0 -1
  352. package/dist/store/paths.d.mts.map +0 -1
  353. package/dist/store/paths.mjs.map +0 -1
  354. package/dist/store/processLiveness.cjs.map +0 -1
  355. package/dist/store/processLiveness.d.cts.map +0 -1
  356. package/dist/store/processLiveness.d.mts.map +0 -1
  357. package/dist/store/processLiveness.mjs.map +0 -1
  358. package/dist/store/reconcile.cjs.map +0 -1
  359. package/dist/store/reconcile.d.cts.map +0 -1
  360. package/dist/store/reconcile.d.mts.map +0 -1
  361. package/dist/store/reconcile.mjs.map +0 -1
  362. package/dist/store/reducer.cjs.map +0 -1
  363. package/dist/store/reducer.d.cts.map +0 -1
  364. package/dist/store/reducer.d.mts.map +0 -1
  365. package/dist/store/reducer.mjs.map +0 -1
  366. package/dist/store/taskGraph.cjs.map +0 -1
  367. package/dist/store/taskGraph.d.cts.map +0 -1
  368. package/dist/store/taskGraph.d.mts.map +0 -1
  369. package/dist/store/taskGraph.mjs.map +0 -1
  370. package/dist/store/taskStore.cjs.map +0 -1
  371. package/dist/store/taskStore.d.cts.map +0 -1
  372. package/dist/store/taskStore.d.mts.map +0 -1
  373. package/dist/store/taskStore.mjs.map +0 -1
  374. package/dist/store/types.cjs.map +0 -1
  375. package/dist/store/types.d.cts.map +0 -1
  376. package/dist/store/types.d.mts.map +0 -1
  377. package/dist/store/types.mjs.map +0 -1
  378. package/dist/tool/promptGuidelines.cjs.map +0 -1
  379. package/dist/tool/promptGuidelines.d.cts.map +0 -1
  380. package/dist/tool/promptGuidelines.d.mts.map +0 -1
  381. package/dist/tool/promptGuidelines.mjs.map +0 -1
  382. package/dist/tool/responseEnvelope.cjs.map +0 -1
  383. package/dist/tool/responseEnvelope.d.cts.map +0 -1
  384. package/dist/tool/responseEnvelope.d.mts.map +0 -1
  385. package/dist/tool/responseEnvelope.mjs.map +0 -1
  386. package/dist/tool/schema.cjs.map +0 -1
  387. package/dist/tool/schema.d.cts.map +0 -1
  388. package/dist/tool/schema.d.mts.map +0 -1
  389. package/dist/tool/schema.mjs.map +0 -1
  390. package/dist/tool/taskTool.cjs.map +0 -1
  391. package/dist/tool/taskTool.d.cts.map +0 -1
  392. package/dist/tool/taskTool.d.mts.map +0 -1
  393. package/dist/tool/taskTool.mjs.map +0 -1
  394. package/dist/tui/format.cjs.map +0 -1
  395. package/dist/tui/format.mjs.map +0 -1
  396. package/dist/tui/selectors.cjs.map +0 -1
  397. package/dist/tui/selectors.mjs.map +0 -1
  398. package/dist/tui/taskOverlay.cjs.map +0 -1
  399. package/dist/tui/taskOverlay.mjs.map +0 -1
  400. package/dist/tui/taskSpace.cjs.map +0 -1
  401. package/dist/tui/taskSpace.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
- import { Task } from "../store/types.cjs";
1
+ import { Task } from "../services/store/types.cjs";
2
2
  //#region src/tui/selectors.d.ts
3
- interface TaskCounts {
3
+ export interface TaskCounts {
4
4
  total: number;
5
5
  completed: number;
6
6
  inProgress: number;
@@ -8,46 +8,52 @@ interface TaskCounts {
8
8
  failed: number;
9
9
  blocked: number;
10
10
  }
11
- interface TaskGroups {
11
+ export interface TaskGroups {
12
12
  inProgress: Task[];
13
13
  blocked: Task[];
14
14
  pending: Task[];
15
15
  completed: Task[];
16
16
  failed: Task[];
17
17
  }
18
- interface TaskProjection {
18
+ export interface TaskProjection {
19
19
  visible: Task[];
20
20
  counts: TaskCounts;
21
21
  groups: TaskGroups;
22
22
  showIds: boolean;
23
23
  hasActiveWork: boolean;
24
24
  }
25
- declare function visibleTasks(tasks: readonly Task[]): Task[];
25
+ export declare function visibleTasks(tasks: readonly Task[]): Task[];
26
26
  /**
27
27
  * Derive all overlay-facing state in O(tasks + dependency edges).
28
28
  *
29
29
  * The id index replaces one full task-list scan per dependency, while the
30
30
  * ordered pass keeps group ordering identical to the source document.
31
31
  */
32
- declare function deriveTaskProjection(tasks: readonly Task[]): TaskProjection;
33
- declare function countTasks(tasks: readonly Task[]): TaskCounts;
32
+ export declare function deriveTaskProjection(tasks: readonly Task[]): TaskProjection;
33
+ export declare function countTasks(tasks: readonly Task[]): TaskCounts;
34
34
  /**
35
35
  * Group tasks for display.
36
36
  *
37
37
  * Blocked tasks split out of `pending` because a reader scanning the overlay
38
38
  * needs to know at a glance what is actually actionable right now.
39
39
  */
40
- declare function groupTasks(tasks: readonly Task[]): TaskGroups;
40
+ export declare function groupTasks(tasks: readonly Task[]): TaskGroups;
41
41
  /** Ids are only worth the visual noise once dependencies are in play. */
42
- declare function shouldShowIds(tasks: readonly Task[]): boolean;
43
- declare function hasActiveWork(tasks: readonly Task[]): boolean;
44
- interface OverlayLayout {
42
+ export declare function shouldShowIds(tasks: readonly Task[]): boolean;
43
+ export declare function hasActiveWork(tasks: readonly Task[]): boolean;
44
+ export interface OverlayLayout {
45
45
  visible: Task[];
46
46
  hiddenCompleted: number;
47
47
  truncatedTail: number;
48
48
  }
49
- declare function selectOverlayLayoutFromProjection(projection: TaskProjection, budget: number): OverlayLayout;
50
- declare function selectOverlayLayout(tasks: readonly Task[], budget: number): OverlayLayout;
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;
51
58
  //#endregion
52
- export { OverlayLayout, TaskCounts, TaskGroups, TaskProjection, countTasks, deriveTaskProjection, groupTasks, hasActiveWork, selectOverlayLayout, selectOverlayLayoutFromProjection, shouldShowIds, visibleTasks };
53
59
  //# sourceMappingURL=selectors.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.d.cts","names":[],"sources":["../../src/tui/selectors.ts"],"mappings":";;UAEiB;EACf;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf,YAAY;EACZ,SAAS;EACT,SAAS;EACT,WAAW;EACX,QAAQ;;UAGO;EACf,SAAS;EACT,QAAQ;EACR,QAAQ;EACR;EACA;;iBAGc,aAAa,gBAAgB,SAAS;;;;;;;iBA6BtC,qBAAqB,gBAAgB,SAAS;iBA2C9C,WAAW,gBAAgB,SAAS;;;;;;;iBAUpC,WAAW,gBAAgB,SAAS;;iBAKpC,cAAc,gBAAgB;iBAI9B,cAAc,gBAAgB;UAI7B;EACf,SAAS;EACT;EACA;;iBAyCc,kCAAkC,YAAY,gBAAgB,iBAAiB;iBAI/E,oBAAoB,gBAAgB,QAAQ,iBAAiB"}
1
+ {"version":3,"file":"selectors.d.cts","names":[],"sources":["../../src/tui/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"}
@@ -1,6 +1,6 @@
1
- import { Task } from "../store/types.mjs";
1
+ import { Task } from "../services/store/types.mjs";
2
2
  //#region src/tui/selectors.d.ts
3
- interface TaskCounts {
3
+ export interface TaskCounts {
4
4
  total: number;
5
5
  completed: number;
6
6
  inProgress: number;
@@ -8,46 +8,52 @@ interface TaskCounts {
8
8
  failed: number;
9
9
  blocked: number;
10
10
  }
11
- interface TaskGroups {
11
+ export interface TaskGroups {
12
12
  inProgress: Task[];
13
13
  blocked: Task[];
14
14
  pending: Task[];
15
15
  completed: Task[];
16
16
  failed: Task[];
17
17
  }
18
- interface TaskProjection {
18
+ export interface TaskProjection {
19
19
  visible: Task[];
20
20
  counts: TaskCounts;
21
21
  groups: TaskGroups;
22
22
  showIds: boolean;
23
23
  hasActiveWork: boolean;
24
24
  }
25
- declare function visibleTasks(tasks: readonly Task[]): Task[];
25
+ export declare function visibleTasks(tasks: readonly Task[]): Task[];
26
26
  /**
27
27
  * Derive all overlay-facing state in O(tasks + dependency edges).
28
28
  *
29
29
  * The id index replaces one full task-list scan per dependency, while the
30
30
  * ordered pass keeps group ordering identical to the source document.
31
31
  */
32
- declare function deriveTaskProjection(tasks: readonly Task[]): TaskProjection;
33
- declare function countTasks(tasks: readonly Task[]): TaskCounts;
32
+ export declare function deriveTaskProjection(tasks: readonly Task[]): TaskProjection;
33
+ export declare function countTasks(tasks: readonly Task[]): TaskCounts;
34
34
  /**
35
35
  * Group tasks for display.
36
36
  *
37
37
  * Blocked tasks split out of `pending` because a reader scanning the overlay
38
38
  * needs to know at a glance what is actually actionable right now.
39
39
  */
40
- declare function groupTasks(tasks: readonly Task[]): TaskGroups;
40
+ export declare function groupTasks(tasks: readonly Task[]): TaskGroups;
41
41
  /** Ids are only worth the visual noise once dependencies are in play. */
42
- declare function shouldShowIds(tasks: readonly Task[]): boolean;
43
- declare function hasActiveWork(tasks: readonly Task[]): boolean;
44
- interface OverlayLayout {
42
+ export declare function shouldShowIds(tasks: readonly Task[]): boolean;
43
+ export declare function hasActiveWork(tasks: readonly Task[]): boolean;
44
+ export interface OverlayLayout {
45
45
  visible: Task[];
46
46
  hiddenCompleted: number;
47
47
  truncatedTail: number;
48
48
  }
49
- declare function selectOverlayLayoutFromProjection(projection: TaskProjection, budget: number): OverlayLayout;
50
- declare function selectOverlayLayout(tasks: readonly Task[], budget: number): OverlayLayout;
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;
51
58
  //#endregion
52
- export { OverlayLayout, TaskCounts, TaskGroups, TaskProjection, countTasks, deriveTaskProjection, groupTasks, hasActiveWork, selectOverlayLayout, selectOverlayLayoutFromProjection, shouldShowIds, visibleTasks };
53
59
  //# sourceMappingURL=selectors.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selectors.d.mts","names":[],"sources":["../../src/tui/selectors.ts"],"mappings":";;UAEiB;EACf;EACA;EACA;EACA;EACA;EACA;;UAGe;EACf,YAAY;EACZ,SAAS;EACT,SAAS;EACT,WAAW;EACX,QAAQ;;UAGO;EACf,SAAS;EACT,QAAQ;EACR,QAAQ;EACR;EACA;;iBAGc,aAAa,gBAAgB,SAAS;;;;;;;iBA6BtC,qBAAqB,gBAAgB,SAAS;iBA2C9C,WAAW,gBAAgB,SAAS;;;;;;;iBAUpC,WAAW,gBAAgB,SAAS;;iBAKpC,cAAc,gBAAgB;iBAI9B,cAAc,gBAAgB;UAI7B;EACf,SAAS;EACT;EACA;;iBAyCc,kCAAkC,YAAY,gBAAgB,iBAAiB;iBAI/E,oBAAoB,gBAAgB,QAAQ,iBAAiB"}
1
+ {"version":3,"file":"selectors.d.mts","names":[],"sources":["../../src/tui/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"}
@@ -1,2 +1 @@
1
- function e(e){return e.filter(e=>e.status!==`deleted`)}function t(e){let t=new Map;for(let n of e)t.has(n.id)||t.set(n.id,n.status);return t}function n(e,t){return e.blockedBy?.some(e=>{let n=t.get(e);return n!==void 0&&n!==`completed`&&n!==`deleted`})??!1}function r(e){let r=t(e),i=[],a={total:0,completed:0,inProgress:0,pending:0,failed:0,blocked:0},o={inProgress:[],blocked:[],pending:[],completed:[],failed:[]},s=!1;for(let t of e)if(t.status!==`deleted`)switch(i.push(t),a.total+=1,s||=!!t.blockedBy?.length,t.status){case`in_progress`:a.inProgress+=1,o.inProgress.push(t);break;case`pending`:a.pending+=1,n(t,r)?(a.blocked+=1,o.blocked.push(t)):o.pending.push(t);break;case`failed`:a.failed+=1,o.failed.push(t);break;case`completed`:a.completed+=1,o.completed.push(t)}return{visible:i,counts:a,groups:o,showIds:s,hasActiveWork:a.inProgress>0}}function i(e){return r(e).counts}function a(e){return r(e).groups}function o(e){return e.some(e=>e.status!==`deleted`&&!!e.blockedBy?.length)}function s(e){return e.some(e=>e.status===`in_progress`)}function c(e,t){let n=[...e.inProgress,...e.failed,...e.blocked,...e.pending],r=[...n,...e.completed];if(t<=0)return{visible:[],hiddenCompleted:e.completed.length,truncatedTail:n.length};if(r.length<=t)return{visible:r,hiddenCompleted:0,truncatedTail:0};if(n.length<=t){let r=t-n.length,i=e.completed.slice(0,r);return{visible:[...n,...i],hiddenCompleted:e.completed.length-i.length,truncatedTail:0}}return{visible:n.slice(0,t),hiddenCompleted:e.completed.length,truncatedTail:n.length-t}}function l(e,t){return c(e.groups,t)}function u(e,t){return l(r(e),t)}export{i as countTasks,r as deriveTaskProjection,a as groupTasks,s as hasActiveWork,u as selectOverlayLayout,l as selectOverlayLayoutFromProjection,o as shouldShowIds,e as visibleTasks};
2
- //# sourceMappingURL=selectors.mjs.map
1
+ import{countTasks as e,deriveTaskProjection as t,groupTasks as n,hasActiveWork as r,selectOverlayLayout as i,selectOverlayLayoutFromProjection as a,shouldShowIds as o,visibleTasks as s}from"./selectors2.mjs";export{e as countTasks,t as deriveTaskProjection,n as groupTasks,r as hasActiveWork,i as selectOverlayLayout,a as selectOverlayLayoutFromProjection,o as shouldShowIds,s as visibleTasks};
@@ -0,0 +1,2 @@
1
+ const e=require("../services/store/invariants.cjs");function t(t){return e.canonicalizeTasks(t).filter(e=>e.status!==`deleted`)}function n(e){return new Map(e.map(e=>[e.id,e.status]))}function r(e,t){return e.blockedBy?.some(e=>{let n=t.get(e);return n!==void 0&&n!==`completed`&&n!==`deleted`})??!1}function i(t){let i=e.canonicalizeTasks(t),a=n(i),o=[],s={total:0,completed:0,inProgress:0,pending:0,failed:0,blocked:0},c={inProgress:[],blocked:[],pending:[],completed:[],failed:[]},l=!1;for(let e of i)if(e.status!==`deleted`)switch(o.push(e),s.total+=1,l||=!!e.blockedBy?.length,e.status){case`in_progress`:s.inProgress+=1,c.inProgress.push(e);break;case`pending`:s.pending+=1,r(e,a)?(s.blocked+=1,c.blocked.push(e)):c.pending.push(e);break;case`failed`:s.failed+=1,c.failed.push(e);break;case`completed`:s.completed+=1,c.completed.push(e)}return{visible:o,counts:s,groups:c,showIds:l,hasActiveWork:s.inProgress>0}}function a(e){return i(e).counts}function o(e){return i(e).groups}function s(e){return e.some(e=>e.status!==`deleted`&&!!e.blockedBy?.length)}function c(e){return e.some(e=>e.status===`in_progress`)}function l(e,t){let{groups:n,visible:r}=e,i=[...n.inProgress,...n.failed,...n.blocked,...n.pending];if(t<=0)return{visible:[],hiddenCompleted:n.completed.length,truncatedTail:i.length};if(r.length<=t)return{visible:r,hiddenCompleted:0,truncatedTail:0};if(i.length<=t){let e=t-i.length,a=n.completed.slice(0,e),o=new Set([...i,...a]);return{visible:r.filter(e=>o.has(e)),hiddenCompleted:n.completed.length-a.length,truncatedTail:0}}let a=new Set(i.slice(0,t));return{visible:r.filter(e=>a.has(e)),hiddenCompleted:n.completed.length,truncatedTail:i.length-t}}function u(e,t){return l(i(e),t)}exports.countTasks=a,exports.deriveTaskProjection=i,exports.groupTasks=o,exports.hasActiveWork=c,exports.selectOverlayLayout=u,exports.selectOverlayLayoutFromProjection=l,exports.shouldShowIds=s,exports.visibleTasks=t;
2
+ //# sourceMappingURL=selectors2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors2.cjs","names":["canonicalizeTasks"],"sources":["../../src/tui/selectors.ts"],"sourcesContent":["import { canonicalizeTasks } from '../services/store/invariants.ts';\nimport type { Task } from '../services/store/types.ts';\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":"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"}
@@ -0,0 +1,2 @@
1
+ import { OverlayLayout, TaskCounts, TaskGroups, TaskProjection, countTasks, deriveTaskProjection, groupTasks, hasActiveWork, selectOverlayLayout, selectOverlayLayoutFromProjection, shouldShowIds, visibleTasks } from "./selectors.cjs";
2
+ export { OverlayLayout, TaskCounts, TaskGroups, TaskProjection, countTasks, deriveTaskProjection, groupTasks, hasActiveWork, selectOverlayLayout, selectOverlayLayoutFromProjection, shouldShowIds, visibleTasks };
@@ -0,0 +1,2 @@
1
+ import { OverlayLayout, TaskCounts, TaskGroups, TaskProjection, countTasks, deriveTaskProjection, groupTasks, hasActiveWork, selectOverlayLayout, selectOverlayLayoutFromProjection, shouldShowIds, visibleTasks } from "./selectors.mjs";
2
+ export { OverlayLayout, TaskCounts, TaskGroups, TaskProjection, countTasks, deriveTaskProjection, groupTasks, hasActiveWork, selectOverlayLayout, selectOverlayLayoutFromProjection, shouldShowIds, visibleTasks };
@@ -0,0 +1,2 @@
1
+ import{canonicalizeTasks as e}from"../services/store/invariants.mjs";function t(t){return e(t).filter(e=>e.status!==`deleted`)}function n(e){return new Map(e.map(e=>[e.id,e.status]))}function r(e,t){return e.blockedBy?.some(e=>{let n=t.get(e);return n!==void 0&&n!==`completed`&&n!==`deleted`})??!1}function i(t){let i=e(t),a=n(i),o=[],s={total:0,completed:0,inProgress:0,pending:0,failed:0,blocked:0},c={inProgress:[],blocked:[],pending:[],completed:[],failed:[]},l=!1;for(let e of i)if(e.status!==`deleted`)switch(o.push(e),s.total+=1,l||=!!e.blockedBy?.length,e.status){case`in_progress`:s.inProgress+=1,c.inProgress.push(e);break;case`pending`:s.pending+=1,r(e,a)?(s.blocked+=1,c.blocked.push(e)):c.pending.push(e);break;case`failed`:s.failed+=1,c.failed.push(e);break;case`completed`:s.completed+=1,c.completed.push(e)}return{visible:o,counts:s,groups:c,showIds:l,hasActiveWork:s.inProgress>0}}function a(e){return i(e).counts}function o(e){return i(e).groups}function s(e){return e.some(e=>e.status!==`deleted`&&!!e.blockedBy?.length)}function c(e){return e.some(e=>e.status===`in_progress`)}function l(e,t){let{groups:n,visible:r}=e,i=[...n.inProgress,...n.failed,...n.blocked,...n.pending];if(t<=0)return{visible:[],hiddenCompleted:n.completed.length,truncatedTail:i.length};if(r.length<=t)return{visible:r,hiddenCompleted:0,truncatedTail:0};if(i.length<=t){let e=t-i.length,a=n.completed.slice(0,e),o=new Set([...i,...a]);return{visible:r.filter(e=>o.has(e)),hiddenCompleted:n.completed.length-a.length,truncatedTail:0}}let a=new Set(i.slice(0,t));return{visible:r.filter(e=>a.has(e)),hiddenCompleted:n.completed.length,truncatedTail:i.length-t}}function u(e,t){return l(i(e),t)}export{a as countTasks,i as deriveTaskProjection,o as groupTasks,c as hasActiveWork,u as selectOverlayLayout,l as selectOverlayLayoutFromProjection,s as shouldShowIds,t as visibleTasks};
2
+ //# sourceMappingURL=selectors2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors2.mjs","names":[],"sources":["../../src/tui/selectors.ts"],"sourcesContent":["import { canonicalizeTasks } from '../services/store/invariants.ts';\nimport type { Task } from '../services/store/types.ts';\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":"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"}
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../config.cjs"),t=require("./format.cjs"),n=require("./selectors.cjs");let r=require("@earendil-works/pi-tui");const i=`doom-tasks`;var a=class{options;uiCtx;widgetRegistered=!1;tui;progressTimer;collapsed=!1;constructor(e){this.options=e}setUICtx(e){e!==this.uiCtx&&(this.uiCtx&&this.widgetRegistered&&this.uiCtx.setWidget(i,void 0),this.stopProgressTimer(),this.uiCtx=e,this.widgetRegistered=!1,this.tui=void 0)}update(){if(!this.uiCtx){this.stopProgressTimer();return}let e=n.visibleTasks(this.options.getTasks());if(e.length===0){this.widgetRegistered&&(this.uiCtx.setWidget(i,void 0),this.widgetRegistered=!1,this.tui=void 0),this.stopProgressTimer();return}if(this.widgetRegistered){this.syncProgressTimer(e),this.tui?.requestRender();return}this.uiCtx.setWidget(i,(e,t)=>(this.tui=e,{render:e=>this.renderWidget(this.uiCtx?.theme??t,e),invalidate:()=>{}}),{placement:`aboveEditor`}),this.widgetRegistered=!0,this.syncProgressTimer(e)}syncProgressTimer(e){let t=e.some(e=>e.status!==`deleted`&&e.delegation?.state===`running`);if(this.collapsed||!this.widgetRegistered||!t){this.stopProgressTimer();return}this.progressTimer||(this.progressTimer=setInterval(()=>this.tui?.requestRender(),1e3),this.progressTimer.unref?.())}stopProgressTimer(){this.progressTimer&&clearInterval(this.progressTimer),this.progressTimer=void 0}toggleCollapse(){this.collapsed=!this.collapsed,this.syncProgressTimer(this.options.getTasks()),this.tui?.requestRender(!0)}isRegistered(){return this.widgetRegistered}renderWidget(i,a){let o=n.deriveTaskProjection(this.options.getTasks());if(o.visible.length===0)return[];let s=e=>(0,r.truncateToWidth)(e,a,`…`),c=o.hasActiveWork?`accent`:`dim`,l=o.hasActiveWork?`●`:`○`,u=`Tasks (${o.counts.completed}/${o.counts.total})`;o.counts.failed>0&&(u+=` · ${o.counts.failed} failed`);let d=s(`${i.fg(c,l)} ${i.fg(c,u)}`);if(this.collapsed){let t=e.resolveCollapseKey(),n=t===`off`?`collapsed`:`${t} to expand`;return this.withTrailingSpacer([d,s(`${i.fg(`dim`,`└─`)} ${i.fg(`dim`,n)}`)])}let f=n.selectOverlayLayoutFromProjection(o,e.getMaxWidgetLines()-1),p=[d];for(let e of f.visible){let n=this.options.delegation.progressFor(e);p.push(s(`${i.fg(`dim`,`├─`)} ${t.formatOverlayTaskLine(e,i,o.showIds,n)}`))}let m=f.hiddenCompleted+f.truncatedTail;if(m===0){let e=p.length-1;return p[e]=p[e].replace(`├─`,`└─`),this.withTrailingSpacer(p)}let h=[];f.hiddenCompleted>0&&h.push(`${f.hiddenCompleted} completed`),f.truncatedTail>0&&h.push(`${f.truncatedTail} pending`);let g=h.length>0?`+${m} more (${h.join(`, `)})`:`+${m} more`;return p.push(s(`${i.fg(`dim`,`└─`)} ${i.fg(`dim`,g)}`)),this.withTrailingSpacer(p)}withTrailingSpacer(e){return e.length===0||e.push(``),e}dispose(){this.stopProgressTimer(),this.uiCtx&&this.uiCtx.setWidget(i,void 0),this.widgetRegistered=!1,this.tui=void 0,this.uiCtx=void 0,this.collapsed=!1}};exports.TaskOverlay=a;
2
- //# sourceMappingURL=taskOverlay.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./taskOverlay2.cjs");exports.TaskOverlay=e.TaskOverlay;
@@ -1,8 +1,8 @@
1
- import { Task } from "../store/types.cjs";
2
- import { DelegationManager } from "../delegation/manager.cjs";
1
+ import { Task } from "../services/store/types.cjs";
2
+ import { DelegationManager } from "../services/delegation/manager.cjs";
3
3
  import { ExtensionUIContext } from "@earendil-works/pi-coding-agent";
4
4
  //#region src/tui/taskOverlay.d.ts
5
- interface TaskOverlayOptions {
5
+ export interface TaskOverlayOptions {
6
6
  getTasks: () => readonly Task[];
7
7
  delegation: DelegationManager;
8
8
  }
@@ -13,7 +13,7 @@ interface TaskOverlayOptions {
13
13
  * auto-hides when there is nothing to show so an idle session keeps a clean
14
14
  * prompt.
15
15
  */
16
- declare class TaskOverlay {
16
+ export declare class TaskOverlay {
17
17
  private readonly options;
18
18
  private uiCtx;
19
19
  private widgetRegistered;
@@ -34,5 +34,4 @@ declare class TaskOverlay {
34
34
  dispose(): void;
35
35
  }
36
36
  //#endregion
37
- export { TaskOverlay, TaskOverlayOptions };
38
37
  //# sourceMappingURL=taskOverlay.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskOverlay.d.cts","names":[],"sources":["../../src/tui/taskOverlay.ts"],"mappings":";;;;UAYiB;EACf,yBAAyB;EACzB,YAAY;;;;;;;;;cAUD;mBACM;UACT;UACA;UACA;UACA;UACA;EAEI,YAAA,SAAS;;EAKrB,SAAS,KAAK;EASd;UAwCQ;UAaA;EAKR;EAOA;UAIQ;;UA0CA;EAMR"}
1
+ {"version":3,"file":"taskOverlay.d.cts","names":[],"sources":["../../src/tui/taskOverlay.ts"],"mappings":";;;;iBAaiB;EACf,yBAAyB;EACzB,YAAY;;;;;;;;;qBAUD;mBACM;UACT;UACA;UACA;UACA;UACA;EAER,YAAY,SAAS;;EAKrB,SAAS,KAAK;EASd;UAwCQ;UAaA;EAKR;EAOA;UAIQ;;UA+DA;EAMR"}
@@ -1,8 +1,8 @@
1
- import { Task } from "../store/types.mjs";
2
- import { DelegationManager } from "../delegation/manager.mjs";
1
+ import { Task } from "../services/store/types.mjs";
2
+ import { DelegationManager } from "../services/delegation/manager.mjs";
3
3
  import { ExtensionUIContext } from "@earendil-works/pi-coding-agent";
4
4
  //#region src/tui/taskOverlay.d.ts
5
- interface TaskOverlayOptions {
5
+ export interface TaskOverlayOptions {
6
6
  getTasks: () => readonly Task[];
7
7
  delegation: DelegationManager;
8
8
  }
@@ -13,7 +13,7 @@ interface TaskOverlayOptions {
13
13
  * auto-hides when there is nothing to show so an idle session keeps a clean
14
14
  * prompt.
15
15
  */
16
- declare class TaskOverlay {
16
+ export declare class TaskOverlay {
17
17
  private readonly options;
18
18
  private uiCtx;
19
19
  private widgetRegistered;
@@ -34,5 +34,4 @@ declare class TaskOverlay {
34
34
  dispose(): void;
35
35
  }
36
36
  //#endregion
37
- export { TaskOverlay, TaskOverlayOptions };
38
37
  //# sourceMappingURL=taskOverlay.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskOverlay.d.mts","names":[],"sources":["../../src/tui/taskOverlay.ts"],"mappings":";;;;UAYiB;EACf,yBAAyB;EACzB,YAAY;;;;;;;;;cAUD;mBACM;UACT;UACA;UACA;UACA;UACA;EAEI,YAAA,SAAS;;EAKrB,SAAS,KAAK;EASd;UAwCQ;UAaA;EAKR;EAOA;UAIQ;;UA0CA;EAMR"}
1
+ {"version":3,"file":"taskOverlay.d.mts","names":[],"sources":["../../src/tui/taskOverlay.ts"],"mappings":";;;;iBAaiB;EACf,yBAAyB;EACzB,YAAY;;;;;;;;;qBAUD;mBACM;UACT;UACA;UACA;UACA;UACA;EAER,YAAY,SAAS;;EAKrB,SAAS,KAAK;EASd;UAwCQ;UAaA;EAKR;EAOA;UAIQ;;UA+DA;EAMR"}
@@ -1,2 +1 @@
1
- import{getMaxWidgetLines as e,resolveCollapseKey as t}from"../config.mjs";import{formatOverlayTaskLine as n}from"./format.mjs";import{deriveTaskProjection as r,selectOverlayLayoutFromProjection as i,visibleTasks as a}from"./selectors.mjs";import{truncateToWidth as o}from"@earendil-works/pi-tui";const s=`doom-tasks`;var c=class{options;uiCtx;widgetRegistered=!1;tui;progressTimer;collapsed=!1;constructor(e){this.options=e}setUICtx(e){e!==this.uiCtx&&(this.uiCtx&&this.widgetRegistered&&this.uiCtx.setWidget(s,void 0),this.stopProgressTimer(),this.uiCtx=e,this.widgetRegistered=!1,this.tui=void 0)}update(){if(!this.uiCtx){this.stopProgressTimer();return}let e=a(this.options.getTasks());if(e.length===0){this.widgetRegistered&&(this.uiCtx.setWidget(s,void 0),this.widgetRegistered=!1,this.tui=void 0),this.stopProgressTimer();return}if(this.widgetRegistered){this.syncProgressTimer(e),this.tui?.requestRender();return}this.uiCtx.setWidget(s,(e,t)=>(this.tui=e,{render:e=>this.renderWidget(this.uiCtx?.theme??t,e),invalidate:()=>{}}),{placement:`aboveEditor`}),this.widgetRegistered=!0,this.syncProgressTimer(e)}syncProgressTimer(e){let t=e.some(e=>e.status!==`deleted`&&e.delegation?.state===`running`);if(this.collapsed||!this.widgetRegistered||!t){this.stopProgressTimer();return}this.progressTimer||(this.progressTimer=setInterval(()=>this.tui?.requestRender(),1e3),this.progressTimer.unref?.())}stopProgressTimer(){this.progressTimer&&clearInterval(this.progressTimer),this.progressTimer=void 0}toggleCollapse(){this.collapsed=!this.collapsed,this.syncProgressTimer(this.options.getTasks()),this.tui?.requestRender(!0)}isRegistered(){return this.widgetRegistered}renderWidget(a,s){let c=r(this.options.getTasks());if(c.visible.length===0)return[];let l=e=>o(e,s,`…`),u=c.hasActiveWork?`accent`:`dim`,d=c.hasActiveWork?`●`:`○`,f=`Tasks (${c.counts.completed}/${c.counts.total})`;c.counts.failed>0&&(f+=` · ${c.counts.failed} failed`);let p=l(`${a.fg(u,d)} ${a.fg(u,f)}`);if(this.collapsed){let e=t(),n=e===`off`?`collapsed`:`${e} to expand`;return this.withTrailingSpacer([p,l(`${a.fg(`dim`,`└─`)} ${a.fg(`dim`,n)}`)])}let m=i(c,e()-1),h=[p];for(let e of m.visible){let t=this.options.delegation.progressFor(e);h.push(l(`${a.fg(`dim`,`├─`)} ${n(e,a,c.showIds,t)}`))}let g=m.hiddenCompleted+m.truncatedTail;if(g===0){let e=h.length-1;return h[e]=h[e].replace(`├─`,`└─`),this.withTrailingSpacer(h)}let _=[];m.hiddenCompleted>0&&_.push(`${m.hiddenCompleted} completed`),m.truncatedTail>0&&_.push(`${m.truncatedTail} pending`);let v=_.length>0?`+${g} more (${_.join(`, `)})`:`+${g} more`;return h.push(l(`${a.fg(`dim`,`└─`)} ${a.fg(`dim`,v)}`)),this.withTrailingSpacer(h)}withTrailingSpacer(e){return e.length===0||e.push(``),e}dispose(){this.stopProgressTimer(),this.uiCtx&&this.uiCtx.setWidget(s,void 0),this.widgetRegistered=!1,this.tui=void 0,this.uiCtx=void 0,this.collapsed=!1}};export{c as TaskOverlay};
2
- //# sourceMappingURL=taskOverlay.mjs.map
1
+ import{TaskOverlay as e}from"./taskOverlay2.mjs";export{e as TaskOverlay};
@@ -0,0 +1,2 @@
1
+ const e=require("./format2.cjs"),t=require("./selectors2.cjs"),n=require("../types/config.cjs");let r=require("@earendil-works/pi-tui"),i=require("@agimon-ai/doompi-ui/theme");const a=`doom-tasks`;var o=class{options;uiCtx;widgetRegistered=!1;tui;progressTimer;collapsed=!1;constructor(e){this.options=e}setUICtx(e){e!==this.uiCtx&&(this.uiCtx&&this.widgetRegistered&&this.uiCtx.setWidget(a,void 0),this.stopProgressTimer(),this.uiCtx=e,this.widgetRegistered=!1,this.tui=void 0)}update(){if(!this.uiCtx){this.stopProgressTimer();return}let e=t.visibleTasks(this.options.getTasks());if(e.length===0){this.widgetRegistered&&(this.uiCtx.setWidget(a,void 0),this.widgetRegistered=!1,this.tui=void 0),this.stopProgressTimer();return}if(this.widgetRegistered){this.syncProgressTimer(e),this.tui?.requestRender();return}this.uiCtx.setWidget(a,(e,t)=>(this.tui=e,{render:e=>this.renderWidget(this.uiCtx?.theme??t,e),invalidate:()=>{}}),{placement:`aboveEditor`}),this.widgetRegistered=!0,this.syncProgressTimer(e)}syncProgressTimer(e){let t=e.some(e=>e.status!==`deleted`&&e.delegation?.state===`running`);if(this.collapsed||!this.widgetRegistered||!t){this.stopProgressTimer();return}this.progressTimer||(this.progressTimer=setInterval(()=>this.tui?.requestRender(),1e3),this.progressTimer.unref?.())}stopProgressTimer(){this.progressTimer&&clearInterval(this.progressTimer),this.progressTimer=void 0}toggleCollapse(){this.collapsed=!this.collapsed,this.syncProgressTimer(this.options.getTasks()),this.tui?.requestRender(!0)}isRegistered(){return this.widgetRegistered}renderWidget(a,o){let s=t.deriveTaskProjection(this.options.getTasks());if(s.visible.length===0)return[];let c=e=>(0,r.truncateToWidth)(e,o,`…`),l=s.hasActiveWork?`accent`:`dim`,u=s.hasActiveWork?`●`:`○`,d=`Tasks (${s.counts.completed}/${s.counts.total})`;s.counts.failed>0&&(d+=` · ${s.counts.failed} failed`);let f=c(`${a.fg(l,u)} ${a.fg(l,d)}`);if(this.collapsed){let e=n.resolveCollapseKey(),t=e===`off`?`collapsed`:`${e} to expand`;return this.withTrailingSpacer([f,c(`${a.fg(`dim`,`└─`)} ${a.fg(`dim`,t)}`)])}let p=t.selectOverlayLayoutFromProjection(s,n.getMaxWidgetLines()-1),m=new Set,h=new Map;for(let e of p.visible){if(e.delegation?.state!==`running`)continue;let t=e.delegation.runId??e.delegation.requestId,n=(0,i.allocateAgentIdentityColor)(t,m);m.add(n),h.set(t,n)}let g=Date.now(),_=[f];for(let t of p.visible){let n=this.options.delegation.progressFor(t),r=t.delegation?.runId??t.delegation?.requestId;_.push(c(`${a.fg(`dim`,`├─`)} ${e.formatOverlayTaskLine(t,a,s.showIds,n,g,r?h.get(r):void 0)}`))}let v=p.hiddenCompleted+p.truncatedTail;if(v===0){let e=_.length-1;return _[e]=_[e].replace(`├─`,`└─`),this.withTrailingSpacer(_)}let y=[];p.hiddenCompleted>0&&y.push(`${p.hiddenCompleted} completed`),p.truncatedTail>0&&y.push(`${p.truncatedTail} pending`);let b=y.length>0?`+${v} more (${y.join(`, `)})`:`+${v} more`;return _.push(c(`${a.fg(`dim`,`└─`)} ${a.fg(`dim`,b)}`)),this.withTrailingSpacer(_)}withTrailingSpacer(e){return e.length===0||e.push(``),e}dispose(){this.stopProgressTimer(),this.uiCtx&&this.uiCtx.setWidget(a,void 0),this.widgetRegistered=!1,this.tui=void 0,this.uiCtx=void 0,this.collapsed=!1}};exports.TaskOverlay=o;
2
+ //# sourceMappingURL=taskOverlay2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskOverlay2.cjs","names":["visibleTasks","deriveTaskProjection","truncateToWidth","resolveCollapseKey","selectOverlayLayoutFromProjection","getMaxWidgetLines","allocateAgentIdentityColor","formatOverlayTaskLine"],"sources":["../../src/tui/taskOverlay.ts"],"sourcesContent":["import { allocateAgentIdentityColor } from '@agimon-ai/doompi-ui/theme';\nimport type { ExtensionUIContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { type TUI, truncateToWidth } from '@earendil-works/pi-tui';\nimport type { DelegationManager } from '../services/delegation/manager.ts';\nimport type { Task } from '../services/store/types.ts';\nimport { COLLAPSE_KEY_OFF, getMaxWidgetLines, resolveCollapseKey } from '../types/config.ts';\nimport { formatOverlayTaskLine } from './format.ts';\nimport { deriveTaskProjection, selectOverlayLayoutFromProjection, visibleTasks } from './selectors.ts';\n\nconst WIDGET_KEY = 'doom-tasks';\nconst OVERLAY_HEADING = 'Tasks';\nconst PROGRESS_TICK_MS = 1000;\n\nexport interface TaskOverlayOptions {\n getTasks: () => readonly Task[];\n delegation: DelegationManager;\n}\n\n/**\n * Persistent widget listing tasks above the editor.\n *\n * Registered once per UI context and refreshed with `requestRender()`; it\n * auto-hides when there is nothing to show so an idle session keeps a clean\n * prompt.\n */\nexport class TaskOverlay {\n private readonly options: TaskOverlayOptions;\n private uiCtx: ExtensionUIContext | undefined;\n private widgetRegistered = false;\n private tui: TUI | undefined;\n private progressTimer: NodeJS.Timeout | undefined;\n private collapsed = false;\n\n constructor(options: TaskOverlayOptions) {\n this.options = options;\n }\n\n /** Identity-compare so repeated session_start handlers stay idempotent. */\n setUICtx(ctx: ExtensionUIContext): void {\n if (ctx === this.uiCtx) return;\n if (this.uiCtx && this.widgetRegistered) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.stopProgressTimer();\n this.uiCtx = ctx;\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n\n update(): void {\n if (!this.uiCtx) {\n this.stopProgressTimer();\n return;\n }\n const tasks = visibleTasks(this.options.getTasks());\n\n if (tasks.length === 0) {\n if (this.widgetRegistered) {\n this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n this.stopProgressTimer();\n return;\n }\n\n if (this.widgetRegistered) {\n this.syncProgressTimer(tasks);\n this.tui?.requestRender();\n return;\n }\n\n this.uiCtx.setWidget(\n WIDGET_KEY,\n (tui, factoryTheme) => {\n this.tui = tui;\n return {\n render: (width: number) => this.renderWidget(this.uiCtx?.theme ?? factoryTheme, width),\n invalidate: () => {\n // Nothing is cached: the next render reads the live theme and store.\n },\n };\n },\n { placement: 'aboveEditor' },\n );\n this.widgetRegistered = true;\n this.syncProgressTimer(tasks);\n }\n\n private syncProgressTimer(tasks: readonly Task[]): void {\n const hasRunningDelegation = tasks.some(\n (task) => task.status !== 'deleted' && task.delegation?.state === 'running',\n );\n if (this.collapsed || !this.widgetRegistered || !hasRunningDelegation) {\n this.stopProgressTimer();\n return;\n }\n if (this.progressTimer) return;\n this.progressTimer = setInterval(() => this.tui?.requestRender(), PROGRESS_TICK_MS);\n this.progressTimer.unref?.();\n }\n\n private stopProgressTimer(): void {\n if (this.progressTimer) clearInterval(this.progressTimer);\n this.progressTimer = undefined;\n }\n\n toggleCollapse(): void {\n this.collapsed = !this.collapsed;\n this.syncProgressTimer(this.options.getTasks());\n // Forced redraw: collapsing changes the widget height, not just its content.\n this.tui?.requestRender(true);\n }\n\n isRegistered(): boolean {\n return this.widgetRegistered;\n }\n\n private renderWidget(theme: Theme, width: number): string[] {\n const projection = deriveTaskProjection(this.options.getTasks());\n if (projection.visible.length === 0) return [];\n\n const truncate = (line: string): string => truncateToWidth(line, width, '…');\n const headingColor = projection.hasActiveWork ? 'accent' : 'dim';\n const headingIcon = projection.hasActiveWork ? '●' : '○';\n let headingText = `${OVERLAY_HEADING} (${projection.counts.completed}/${projection.counts.total})`;\n if (projection.counts.failed > 0) headingText += ` · ${projection.counts.failed} failed`;\n const heading = truncate(`${theme.fg(headingColor, headingIcon)} ${theme.fg(headingColor, headingText)}`);\n\n if (this.collapsed) {\n const key = resolveCollapseKey();\n const hint = key === COLLAPSE_KEY_OFF ? 'collapsed' : `${key} to expand`;\n return this.withTrailingSpacer([heading, truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', hint)}`)]);\n }\n\n const layout = selectOverlayLayoutFromProjection(projection, getMaxWidgetLines() - 1);\n const occupiedColors = new Set<ReturnType<typeof allocateAgentIdentityColor>>();\n const agentColors = new Map<string, ReturnType<typeof allocateAgentIdentityColor>>();\n for (const task of layout.visible) {\n if (task.delegation?.state !== 'running') continue;\n const identity = task.delegation.runId ?? task.delegation.requestId;\n const color = allocateAgentIdentityColor(identity, occupiedColors);\n occupiedColors.add(color);\n agentColors.set(identity, color);\n }\n\n const nowMs = Date.now();\n const lines = [heading];\n for (const task of layout.visible) {\n const progress = this.options.delegation.progressFor(task);\n const identity = task.delegation?.runId ?? task.delegation?.requestId;\n lines.push(\n truncate(\n `${theme.fg('dim', '├─')} ${formatOverlayTaskLine(\n task,\n theme,\n projection.showIds,\n progress,\n nowMs,\n identity ? agentColors.get(identity) : undefined,\n )}`,\n ),\n );\n }\n\n const hidden = layout.hiddenCompleted + layout.truncatedTail;\n if (hidden === 0) {\n const last = lines.length - 1;\n lines[last] = lines[last].replace('├─', '└─');\n return this.withTrailingSpacer(lines);\n }\n\n const parts: string[] = [];\n if (layout.hiddenCompleted > 0) parts.push(`${layout.hiddenCompleted} completed`);\n if (layout.truncatedTail > 0) parts.push(`${layout.truncatedTail} pending`);\n const summary = parts.length > 0 ? `+${hidden} more (${parts.join(', ')})` : `+${hidden} more`;\n lines.push(truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', summary)}`));\n return this.withTrailingSpacer(lines);\n }\n\n /** Pi adds a spacer above the widget but none below, which glues the last row to the input box. */\n private withTrailingSpacer(lines: string[]): string[] {\n if (lines.length === 0) return lines;\n lines.push('');\n return lines;\n }\n\n dispose(): void {\n this.stopProgressTimer();\n if (this.uiCtx) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n this.uiCtx = undefined;\n this.collapsed = false;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { TaskOverlay, TaskOverlayOptions } from "./taskOverlay.cjs";
2
+ export { TaskOverlay, TaskOverlayOptions };
@@ -0,0 +1,2 @@
1
+ import { TaskOverlay, TaskOverlayOptions } from "./taskOverlay.mjs";
2
+ export { TaskOverlay, TaskOverlayOptions };
@@ -0,0 +1,2 @@
1
+ import{formatOverlayTaskLine as e}from"./format2.mjs";import{deriveTaskProjection as t,selectOverlayLayoutFromProjection as n,visibleTasks as r}from"./selectors2.mjs";import{getMaxWidgetLines as i,resolveCollapseKey as a}from"../types/config.mjs";import{truncateToWidth as o}from"@earendil-works/pi-tui";import{allocateAgentIdentityColor as s}from"@agimon-ai/doompi-ui/theme";const c=`doom-tasks`;var l=class{options;uiCtx;widgetRegistered=!1;tui;progressTimer;collapsed=!1;constructor(e){this.options=e}setUICtx(e){e!==this.uiCtx&&(this.uiCtx&&this.widgetRegistered&&this.uiCtx.setWidget(c,void 0),this.stopProgressTimer(),this.uiCtx=e,this.widgetRegistered=!1,this.tui=void 0)}update(){if(!this.uiCtx){this.stopProgressTimer();return}let e=r(this.options.getTasks());if(e.length===0){this.widgetRegistered&&(this.uiCtx.setWidget(c,void 0),this.widgetRegistered=!1,this.tui=void 0),this.stopProgressTimer();return}if(this.widgetRegistered){this.syncProgressTimer(e),this.tui?.requestRender();return}this.uiCtx.setWidget(c,(e,t)=>(this.tui=e,{render:e=>this.renderWidget(this.uiCtx?.theme??t,e),invalidate:()=>{}}),{placement:`aboveEditor`}),this.widgetRegistered=!0,this.syncProgressTimer(e)}syncProgressTimer(e){let t=e.some(e=>e.status!==`deleted`&&e.delegation?.state===`running`);if(this.collapsed||!this.widgetRegistered||!t){this.stopProgressTimer();return}this.progressTimer||(this.progressTimer=setInterval(()=>this.tui?.requestRender(),1e3),this.progressTimer.unref?.())}stopProgressTimer(){this.progressTimer&&clearInterval(this.progressTimer),this.progressTimer=void 0}toggleCollapse(){this.collapsed=!this.collapsed,this.syncProgressTimer(this.options.getTasks()),this.tui?.requestRender(!0)}isRegistered(){return this.widgetRegistered}renderWidget(r,c){let l=t(this.options.getTasks());if(l.visible.length===0)return[];let u=e=>o(e,c,`…`),d=l.hasActiveWork?`accent`:`dim`,f=l.hasActiveWork?`●`:`○`,p=`Tasks (${l.counts.completed}/${l.counts.total})`;l.counts.failed>0&&(p+=` · ${l.counts.failed} failed`);let m=u(`${r.fg(d,f)} ${r.fg(d,p)}`);if(this.collapsed){let e=a(),t=e===`off`?`collapsed`:`${e} to expand`;return this.withTrailingSpacer([m,u(`${r.fg(`dim`,`└─`)} ${r.fg(`dim`,t)}`)])}let h=n(l,i()-1),g=new Set,_=new Map;for(let e of h.visible){if(e.delegation?.state!==`running`)continue;let t=e.delegation.runId??e.delegation.requestId,n=s(t,g);g.add(n),_.set(t,n)}let v=Date.now(),y=[m];for(let t of h.visible){let n=this.options.delegation.progressFor(t),i=t.delegation?.runId??t.delegation?.requestId;y.push(u(`${r.fg(`dim`,`├─`)} ${e(t,r,l.showIds,n,v,i?_.get(i):void 0)}`))}let b=h.hiddenCompleted+h.truncatedTail;if(b===0){let e=y.length-1;return y[e]=y[e].replace(`├─`,`└─`),this.withTrailingSpacer(y)}let x=[];h.hiddenCompleted>0&&x.push(`${h.hiddenCompleted} completed`),h.truncatedTail>0&&x.push(`${h.truncatedTail} pending`);let S=x.length>0?`+${b} more (${x.join(`, `)})`:`+${b} more`;return y.push(u(`${r.fg(`dim`,`└─`)} ${r.fg(`dim`,S)}`)),this.withTrailingSpacer(y)}withTrailingSpacer(e){return e.length===0||e.push(``),e}dispose(){this.stopProgressTimer(),this.uiCtx&&this.uiCtx.setWidget(c,void 0),this.widgetRegistered=!1,this.tui=void 0,this.uiCtx=void 0,this.collapsed=!1}};export{l as TaskOverlay};
2
+ //# sourceMappingURL=taskOverlay2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskOverlay2.mjs","names":[],"sources":["../../src/tui/taskOverlay.ts"],"sourcesContent":["import { allocateAgentIdentityColor } from '@agimon-ai/doompi-ui/theme';\nimport type { ExtensionUIContext, Theme } from '@earendil-works/pi-coding-agent';\nimport { type TUI, truncateToWidth } from '@earendil-works/pi-tui';\nimport type { DelegationManager } from '../services/delegation/manager.ts';\nimport type { Task } from '../services/store/types.ts';\nimport { COLLAPSE_KEY_OFF, getMaxWidgetLines, resolveCollapseKey } from '../types/config.ts';\nimport { formatOverlayTaskLine } from './format.ts';\nimport { deriveTaskProjection, selectOverlayLayoutFromProjection, visibleTasks } from './selectors.ts';\n\nconst WIDGET_KEY = 'doom-tasks';\nconst OVERLAY_HEADING = 'Tasks';\nconst PROGRESS_TICK_MS = 1000;\n\nexport interface TaskOverlayOptions {\n getTasks: () => readonly Task[];\n delegation: DelegationManager;\n}\n\n/**\n * Persistent widget listing tasks above the editor.\n *\n * Registered once per UI context and refreshed with `requestRender()`; it\n * auto-hides when there is nothing to show so an idle session keeps a clean\n * prompt.\n */\nexport class TaskOverlay {\n private readonly options: TaskOverlayOptions;\n private uiCtx: ExtensionUIContext | undefined;\n private widgetRegistered = false;\n private tui: TUI | undefined;\n private progressTimer: NodeJS.Timeout | undefined;\n private collapsed = false;\n\n constructor(options: TaskOverlayOptions) {\n this.options = options;\n }\n\n /** Identity-compare so repeated session_start handlers stay idempotent. */\n setUICtx(ctx: ExtensionUIContext): void {\n if (ctx === this.uiCtx) return;\n if (this.uiCtx && this.widgetRegistered) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.stopProgressTimer();\n this.uiCtx = ctx;\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n\n update(): void {\n if (!this.uiCtx) {\n this.stopProgressTimer();\n return;\n }\n const tasks = visibleTasks(this.options.getTasks());\n\n if (tasks.length === 0) {\n if (this.widgetRegistered) {\n this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n }\n this.stopProgressTimer();\n return;\n }\n\n if (this.widgetRegistered) {\n this.syncProgressTimer(tasks);\n this.tui?.requestRender();\n return;\n }\n\n this.uiCtx.setWidget(\n WIDGET_KEY,\n (tui, factoryTheme) => {\n this.tui = tui;\n return {\n render: (width: number) => this.renderWidget(this.uiCtx?.theme ?? factoryTheme, width),\n invalidate: () => {\n // Nothing is cached: the next render reads the live theme and store.\n },\n };\n },\n { placement: 'aboveEditor' },\n );\n this.widgetRegistered = true;\n this.syncProgressTimer(tasks);\n }\n\n private syncProgressTimer(tasks: readonly Task[]): void {\n const hasRunningDelegation = tasks.some(\n (task) => task.status !== 'deleted' && task.delegation?.state === 'running',\n );\n if (this.collapsed || !this.widgetRegistered || !hasRunningDelegation) {\n this.stopProgressTimer();\n return;\n }\n if (this.progressTimer) return;\n this.progressTimer = setInterval(() => this.tui?.requestRender(), PROGRESS_TICK_MS);\n this.progressTimer.unref?.();\n }\n\n private stopProgressTimer(): void {\n if (this.progressTimer) clearInterval(this.progressTimer);\n this.progressTimer = undefined;\n }\n\n toggleCollapse(): void {\n this.collapsed = !this.collapsed;\n this.syncProgressTimer(this.options.getTasks());\n // Forced redraw: collapsing changes the widget height, not just its content.\n this.tui?.requestRender(true);\n }\n\n isRegistered(): boolean {\n return this.widgetRegistered;\n }\n\n private renderWidget(theme: Theme, width: number): string[] {\n const projection = deriveTaskProjection(this.options.getTasks());\n if (projection.visible.length === 0) return [];\n\n const truncate = (line: string): string => truncateToWidth(line, width, '…');\n const headingColor = projection.hasActiveWork ? 'accent' : 'dim';\n const headingIcon = projection.hasActiveWork ? '●' : '○';\n let headingText = `${OVERLAY_HEADING} (${projection.counts.completed}/${projection.counts.total})`;\n if (projection.counts.failed > 0) headingText += ` · ${projection.counts.failed} failed`;\n const heading = truncate(`${theme.fg(headingColor, headingIcon)} ${theme.fg(headingColor, headingText)}`);\n\n if (this.collapsed) {\n const key = resolveCollapseKey();\n const hint = key === COLLAPSE_KEY_OFF ? 'collapsed' : `${key} to expand`;\n return this.withTrailingSpacer([heading, truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', hint)}`)]);\n }\n\n const layout = selectOverlayLayoutFromProjection(projection, getMaxWidgetLines() - 1);\n const occupiedColors = new Set<ReturnType<typeof allocateAgentIdentityColor>>();\n const agentColors = new Map<string, ReturnType<typeof allocateAgentIdentityColor>>();\n for (const task of layout.visible) {\n if (task.delegation?.state !== 'running') continue;\n const identity = task.delegation.runId ?? task.delegation.requestId;\n const color = allocateAgentIdentityColor(identity, occupiedColors);\n occupiedColors.add(color);\n agentColors.set(identity, color);\n }\n\n const nowMs = Date.now();\n const lines = [heading];\n for (const task of layout.visible) {\n const progress = this.options.delegation.progressFor(task);\n const identity = task.delegation?.runId ?? task.delegation?.requestId;\n lines.push(\n truncate(\n `${theme.fg('dim', '├─')} ${formatOverlayTaskLine(\n task,\n theme,\n projection.showIds,\n progress,\n nowMs,\n identity ? agentColors.get(identity) : undefined,\n )}`,\n ),\n );\n }\n\n const hidden = layout.hiddenCompleted + layout.truncatedTail;\n if (hidden === 0) {\n const last = lines.length - 1;\n lines[last] = lines[last].replace('├─', '└─');\n return this.withTrailingSpacer(lines);\n }\n\n const parts: string[] = [];\n if (layout.hiddenCompleted > 0) parts.push(`${layout.hiddenCompleted} completed`);\n if (layout.truncatedTail > 0) parts.push(`${layout.truncatedTail} pending`);\n const summary = parts.length > 0 ? `+${hidden} more (${parts.join(', ')})` : `+${hidden} more`;\n lines.push(truncate(`${theme.fg('dim', '└─')} ${theme.fg('dim', summary)}`));\n return this.withTrailingSpacer(lines);\n }\n\n /** Pi adds a spacer above the widget but none below, which glues the last row to the input box. */\n private withTrailingSpacer(lines: string[]): string[] {\n if (lines.length === 0) return lines;\n lines.push('');\n return lines;\n }\n\n dispose(): void {\n this.stopProgressTimer();\n if (this.uiCtx) this.uiCtx.setWidget(WIDGET_KEY, undefined);\n this.widgetRegistered = false;\n this.tui = undefined;\n this.uiCtx = undefined;\n this.collapsed = false;\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../store/taskGraph.cjs"),t=require("../tool/schema.cjs"),n=require("../store/reducer.cjs"),r=require("./format.cjs"),i=require("./selectors.cjs");let a=require("@earendil-works/pi-tui"),o=require("node:os"),s=require("@agimon-ai/doompi-ui/components/doomOverlay");const c=s.DOOM_FULLSCREEN_UI_OPTIONS.overlayOptions;function l(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<32||n===127)return!0}return!1}function u(e,t){let n=(0,o.homedir)(),r=n&&e.startsWith(n)?`~${e.slice(n.length)}`:e;if((0,a.visibleWidth)(r)<=t)return r;let i=r.split(`/`),s=i.pop()??r;for(;i.length>0;){let e=`${i[i.length-1]}/${s}`;if((0,a.visibleWidth)(`…/${e}`)>t)break;s=e,i.pop()}return(0,a.truncateToWidth)(`…/${s}`,t,``)}const d=`none`,f=[[`↑↓`,`select`],[`enter`,`edit subject`],[`s`,`status`],[`esc`,`close`]];function p(e,t){let n=(0,a.truncateToWidth)(e,Math.max(0,t),`…`);return n+` `.repeat(Math.max(0,t-(0,a.visibleWidth)(n)))}function m(e,t,n){let r=(0,a.visibleWidth)(t),i=Math.max(0,n-r-1);return p(e,i)+` `.repeat(Math.max(1,n-i-r))+p(t,r)}function h(e,t){if(t<=0)return[];let n=[],r=``;for(let i of e.split(/\s+/).filter(Boolean))r.length===0?r=i:r.length+1+i.length<=t?r+=` ${i}`:(n.push(r),r=i);return r.length>0&&n.push(r),n}var g=class extends s.DoomOverlay{options;done;unwatch;mode=`browse`;selected=0;statusIndex=0;draft=``;notice;bodyHeight=1;constructor(e,t,n,r){super(e,t),this.options=n,this.done=r,this.unwatch=n.store.onExternalChange(()=>this.tui.requestRender())}tasks(){return i.visibleTasks(this.options.store.snapshot.tasks)}selectedTask(){let e=this.tasks();if(e.length!==0)return e[Math.min(this.selected,e.length-1)]}move(e){let t=this.tasks();t.length!==0&&(this.selected=Math.max(0,Math.min(t.length-1,this.selected+e)),this.tui.requestRender())}commit(e){this.options.store.mutate(t=>{let r=n.applyTaskMutation(t,`upsert`,{tasks:[e]});return n.isCommittingOp(r.op)?{document:r.document,value:r.op}:{value:r.op}}).then(e=>{let t=n.singleItemOutcome(e.value);this.notice=t?.kind===`failed`?t.message:void 0,this.tui.requestRender()}).catch(e=>{this.notice=e instanceof Error?e.message:String(e),this.tui.requestRender()})}handleStatusInput(e){let n=this.selectedTask();(0,a.matchesKey)(e,`up`)?this.statusIndex=Math.max(0,this.statusIndex-1):(0,a.matchesKey)(e,`down`)?this.statusIndex=Math.min(t.TASK_STATUSES.length-1,this.statusIndex+1):e===`s`?this.statusIndex=(this.statusIndex+1)%t.TASK_STATUSES.length:e===`\r`||e===`
2
- `?(this.mode=`browse`,n&&this.commit({id:n.id,status:t.TASK_STATUSES[this.statusIndex]})):(0,a.matchesKey)(e,`escape`)&&(this.mode=`browse`),this.tui.requestRender()}handleSubjectInput(e){let t=this.selectedTask();e===`\r`||e===`
3
- `?(this.mode=`browse`,t&&this.commit({id:t.id,subject:this.draft})):(0,a.matchesKey)(e,`escape`)?this.mode=`browse`:e===``?this.draft=this.draft.slice(0,-1):l(e)||(this.draft+=e),this.tui.requestRender()}handleInput(e){if(this.mode===`status`)return this.handleStatusInput(e);if(this.mode===`subject`)return this.handleSubjectInput(e);if((0,a.matchesKey)(e,`escape`)||(0,a.matchesKey)(e,`ctrl+c`)){this.done(void 0);return}if((0,a.matchesKey)(e,`up`))return this.move(-1);if((0,a.matchesKey)(e,`down`))return this.move(1);let n=this.selectedTask();if(n){if(e===`s`){this.mode=`status`,this.statusIndex=Math.max(0,t.TASK_STATUSES.indexOf(n.status)),this.tui.requestRender();return}(e===`\r`||e===`
4
- `)&&(this.mode=`subject`,this.draft=n.subject,this.tui.requestRender())}}badge(e,t,n=`text`){return this.theme.bg(t,this.theme.fg(n,` ${e} `))}hintLine(e){return e.map(([e,t])=>`${this.badge(e,`selectedBg`)}${this.theme.fg(`dim`,` ${t}`)}`).join(this.theme.fg(`dim`,` `))}listLines(n){let i=this.tasks(),o=this.theme.bold(`TASKS`),s=Math.max(0,n-(0,a.visibleWidth)(`TASKS`)-2),c=[`${o} ${this.theme.fg(`dim`,u(this.options.store.storePath,s))}`,``];if(i.length===0)return c.push(this.theme.fg(`dim`,t.MSG_NO_TASKS)),c;let l=Math.max(1,Math.floor((this.bodyHeight-c.length)/2)),f=Math.max(0,Math.min(this.selected-l+1,Math.max(0,i.length-l)));for(let[t,a]of i.slice(f,f+l).entries()){let o=f+t===Math.min(this.selected,i.length-1),s=o?this.theme.fg(`accent`,`›`):` `,l=o?this.theme.bold(a.subject):a.subject,u=r.overlayStatusGlyph(a.status,this.theme),m=a.owner??a.delegation?.agent??d,h=a.status===`pending`&&e.isBlocked(this.options.store.snapshot.tasks,a)?this.theme.fg(`warning`,`blocked by ${(a.blockedBy??[]).map(e=>`#${e}`).join(`, `)}`):this.theme.fg(`dim`,r.STATUS_LABEL[a.status]),g=`${s} ${u} ${this.theme.fg(`dim`,`#${a.id}`)} ${l}`,_=`${` `.repeat(6)}${this.badge(m,`userMessageBg`,`muted`)} ${h}`,v=o?`selectedBg`:`userMessageBg`;for(let e of[g,_])c.push(this.theme.bg(v,p(e,n)))}return c}statusLines(e,n){if(this.mode!==`status`){let t=r.overlayStatusGlyph(e.status,this.theme);return[this.theme.fg(`dim`,`STATUS`),`${t} ${r.STATUS_LABEL[e.status]}`]}let i=[this.theme.fg(`dim`,`STATUS s cycles · enter commits`)];for(let[r,a]of t.TASK_STATUSES.entries()){let t=r===this.statusIndex,o=t?this.theme.fg(`accent`,`▸`):` `,s=t?this.theme.bold(this.theme.fg(`accent`,a)):this.theme.fg(`muted`,a),c=a===e.status?this.theme.fg(`dim`,`current`):``,l=m(` ${o} ${s}`,c,n);i.push(this.theme.bg(t?`selectedBg`:`userMessageBg`,l))}return i}subjectField(e,t){let n=this.mode===`subject`,r=n?`${this.draft}█`:e.subject;return[this.theme.fg(`dim`,n?`SUBJECT enter commits · esc cancels`:`SUBJECT`),this.theme.bg(n?`selectedBg`:`userMessageBg`,p(` ${r}`,t))]}detailLines(e){let t=this.selectedTask();if(!t)return[this.theme.fg(`dim`,`No task selected`)];let n=this.mode===`subject`||this.mode===`status`?this.badge(`EDIT`,`toolSuccessBg`,`warning`):``,r=[m(this.theme.bold(this.theme.fg(`accent`,`TASK #${t.id}`)),n,e),``];r.push(...this.subjectField(t,e)),r.push(``,...this.statusLines(t,e),``),t.activeForm&&r.push(this.theme.fg(`dim`,`ACTIVE FORM`),t.activeForm,``);let i=t.owner??t.delegation?.agent??d,a=t.delegation?.runId?this.theme.fg(`success`,`delegated run ${t.delegation.runId}`):``;return r.push(this.theme.fg(`dim`,`OWNER`),a?`${i} ${this.theme.fg(`dim`,`·`)} ${a}`:i,``),r.push(this.theme.fg(`dim`,`BLOCKED BY`),t.blockedBy?.length?t.blockedBy.map(e=>`#${e}`).join(` · `):d),t.description&&r.push(``,this.theme.fg(`dim`,`DESCRIPTION`),...h(t.description,e)),this.notice&&r.push(``,this.theme.fg(`error`,this.notice)),r}headerSummary(){let e=i.countTasks(this.options.store.snapshot.tasks),t=[`${e.completed}/${e.total} completed`];return e.inProgress>0&&t.push(`${e.inProgress} in progress`),e.blocked>0&&t.push(`${e.blocked} blocked`),e.failed>0&&t.push(`${e.failed} failed`),t.join(` · `)}getChrome(){return{title:`TASK SPACE`,accent:s.DOOM_OVERLAY_ACCENT,breadcrumb:`SPC › t › t / tasks`,headerRight:`${this.headerSummary()} · esc close`,footer:this.hintLine(f)}}renderBody(e,t){if(this.bodyHeight=t,e<48)return this.renderStacked(e,t);let n=Math.max(18,Math.floor((e-1)*.3333333333333333)),r=Math.max(1,e-n-1),i=Math.max(1,n-1),o=Math.max(1,r-1),s=this.listLines(i),c=this.detailLines(o),l=this.theme.fg(`borderMuted`,`│`);return Array.from({length:t},(t,n)=>{let r=`${p(s[n]??``,i)} ${l} ${p(c[n]??``,o)}`;return(0,a.truncateToWidth)(r,e,`…`)})}renderStacked(e,t){let n=Math.max(1,Math.floor((t-1)/2)),r=Math.max(0,t-n-1);this.bodyHeight=n;let i=this.listLines(e),a=this.detailLines(e);return[...i.slice(0,n),...Array.from({length:Math.max(0,n-i.length)},()=>``),this.theme.fg(`borderMuted`,`─`.repeat(e)),...a.slice(0,r)]}dispose(){this.unwatch()}};async function _(e,t){await e.ui.custom((e,n,r,i)=>new g(e,n,t,i),s.DOOM_FULLSCREEN_UI_OPTIONS)}exports.TASK_SPACE_OVERLAY_OPTIONS=c,exports.TaskSpaceComponent=g,exports.openTaskSpace=_;
5
- //# sourceMappingURL=taskSpace.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./taskSpace2.cjs");exports.TASK_SPACE_OVERLAY_OPTIONS=e.TASK_SPACE_OVERLAY_OPTIONS,exports.TaskSpaceComponent=e.TaskSpaceComponent,exports.openTaskSpace=e.openTaskSpace;
@@ -1,14 +1,14 @@
1
- import { TaskStore } from "../store/taskStore.cjs";
1
+ import { TaskStore } from "../adapters/store/taskStore.cjs";
2
2
  import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
3
3
  import { DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "@agimon-ai/doompi-ui/components/doomOverlay";
4
4
  //#region src/tui/taskSpace.d.ts
5
- declare const TASK_SPACE_OVERLAY_OPTIONS: {
6
- readonly anchor: "top-left";
7
- readonly width: "100%";
8
- readonly maxHeight: "100%";
5
+ export declare const TASK_SPACE_OVERLAY_OPTIONS: {
6
+ readonly anchor: 'top-left';
7
+ readonly width: '100%';
8
+ readonly maxHeight: '100%';
9
9
  readonly margin: 0;
10
10
  };
11
- interface TaskSpaceOptions {
11
+ export interface TaskSpaceOptions {
12
12
  store: TaskStore;
13
13
  }
14
14
  /**
@@ -17,7 +17,7 @@ interface TaskSpaceOptions {
17
17
  * Rendering is pure: `render(width)` reads the live store and returns lines with
18
18
  * no side effects, so the fidelity job can capture it and unit tests can assert on it.
19
19
  */
20
- declare class TaskSpaceComponent extends DoomOverlay {
20
+ export declare class TaskSpaceComponent extends DoomOverlay {
21
21
  private readonly options;
22
22
  private readonly done;
23
23
  private readonly unwatch;
@@ -55,7 +55,6 @@ declare class TaskSpaceComponent extends DoomOverlay {
55
55
  private renderStacked;
56
56
  dispose(): void;
57
57
  }
58
- declare function openTaskSpace(ctx: ExtensionContext, options: TaskSpaceOptions): Promise<void>;
58
+ export declare function openTaskSpace(ctx: ExtensionContext, options: TaskSpaceOptions): Promise<void>;
59
59
  //#endregion
60
- export { TASK_SPACE_OVERLAY_OPTIONS, TaskSpaceComponent, TaskSpaceOptions, openTaskSpace };
61
60
  //# sourceMappingURL=taskSpace.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskSpace.d.cts","names":[],"sources":["../../src/tui/taskSpace.ts"],"mappings":";;;;cAgCa;;;;;;UAEI;EACf,OAAO;;;;;;;;cA+GI,2BAA2B;mBACrB;mBACA;mBACA;UAET;UACA;UACA;UACA;UACA;UACA;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,SAAS,kBAAkB,OAAO;UAOzE;UAIA;UAMA;;UAQA;UAwBA;UAYA;EAWR,YAAY;;;;;;UA+BJ;;UAKA;UAMA;UAsCA;;UAoBA;UASA;UA2BA;YASE,aAAa;YAUb,WAAW,eAAe;UAoB5B;EAcR;;iBAKoB,cAAc,KAAK,kBAAkB,SAAS,mBAAmB"}
1
+ {"version":3,"file":"taskSpace.d.cts","names":[],"sources":["../../src/tui/taskSpace.ts"],"mappings":";;;;qBAiCa;;;;;;iBAEI;EACf,OAAO;;;;;;;;qBA8GI,2BAA2B;mBACrB;mBACA;mBACA;UAET;UACA;UACA;UACA;UACA;UACA;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,SAAS,kBAAkB,OAAO;UAOzE;UAIA;UAMA;;UAQA;UAwBA;UAYA;EAWR,YAAY;;;;;;UA2CJ;;UAKA;UAMA;UAsCA;;UAoBA;UASA;UA2BA;YASE,aAAa;YAUb,WAAW,eAAe;UAoB5B;EAcR;;wBAKoB,cAAc,KAAK,kBAAkB,SAAS,mBAAmB"}
@@ -1,14 +1,14 @@
1
- import { TaskStore } from "../store/taskStore.mjs";
1
+ import { TaskStore } from "../adapters/store/taskStore.mjs";
2
2
  import { DoomOverlay, DoomOverlayChrome, DoomOverlayTui } from "@agimon-ai/doompi-ui/components/doomOverlay";
3
3
  import { ExtensionContext, Theme } from "@earendil-works/pi-coding-agent";
4
4
  //#region src/tui/taskSpace.d.ts
5
- declare const TASK_SPACE_OVERLAY_OPTIONS: {
6
- readonly anchor: "top-left";
7
- readonly width: "100%";
8
- readonly maxHeight: "100%";
5
+ export declare const TASK_SPACE_OVERLAY_OPTIONS: {
6
+ readonly anchor: 'top-left';
7
+ readonly width: '100%';
8
+ readonly maxHeight: '100%';
9
9
  readonly margin: 0;
10
10
  };
11
- interface TaskSpaceOptions {
11
+ export interface TaskSpaceOptions {
12
12
  store: TaskStore;
13
13
  }
14
14
  /**
@@ -17,7 +17,7 @@ interface TaskSpaceOptions {
17
17
  * Rendering is pure: `render(width)` reads the live store and returns lines with
18
18
  * no side effects, so the fidelity job can capture it and unit tests can assert on it.
19
19
  */
20
- declare class TaskSpaceComponent extends DoomOverlay {
20
+ export declare class TaskSpaceComponent extends DoomOverlay {
21
21
  private readonly options;
22
22
  private readonly done;
23
23
  private readonly unwatch;
@@ -55,7 +55,6 @@ declare class TaskSpaceComponent extends DoomOverlay {
55
55
  private renderStacked;
56
56
  dispose(): void;
57
57
  }
58
- declare function openTaskSpace(ctx: ExtensionContext, options: TaskSpaceOptions): Promise<void>;
58
+ export declare function openTaskSpace(ctx: ExtensionContext, options: TaskSpaceOptions): Promise<void>;
59
59
  //#endregion
60
- export { TASK_SPACE_OVERLAY_OPTIONS, TaskSpaceComponent, TaskSpaceOptions, openTaskSpace };
61
60
  //# sourceMappingURL=taskSpace.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"taskSpace.d.mts","names":[],"sources":["../../src/tui/taskSpace.ts"],"mappings":";;;;cAgCa;;;;;;UAEI;EACf,OAAO;;;;;;;;cA+GI,2BAA2B;mBACrB;mBACA;mBACA;UAET;UACA;UACA;UACA;UACA;UACA;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,SAAS,kBAAkB,OAAO;UAOzE;UAIA;UAMA;;UAQA;UAwBA;UAYA;EAWR,YAAY;;;;;;UA+BJ;;UAKA;UAMA;UAsCA;;UAoBA;UASA;UA2BA;YASE,aAAa;YAUb,WAAW,eAAe;UAoB5B;EAcR;;iBAKoB,cAAc,KAAK,kBAAkB,SAAS,mBAAmB"}
1
+ {"version":3,"file":"taskSpace.d.mts","names":[],"sources":["../../src/tui/taskSpace.ts"],"mappings":";;;;qBAiCa;;;;;;iBAEI;EACf,OAAO;;;;;;;;qBA8GI,2BAA2B;mBACrB;mBACA;mBACA;UAET;UACA;UACA;UACA;UACA;UACA;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,SAAS,kBAAkB,OAAO;UAOzE;UAIA;UAMA;;UAQA;UAwBA;UAYA;EAWR,YAAY;;;;;;UA2CJ;;UAKA;UAMA;UAsCA;;UAoBA;UASA;UA2BA;YASE,aAAa;YAUb,WAAW,eAAe;UAoB5B;EAcR;;wBAKoB,cAAc,KAAK,kBAAkB,SAAS,mBAAmB"}
@@ -1,5 +1 @@
1
- import{isBlocked as e}from"../store/taskGraph.mjs";import{MSG_NO_TASKS as t,TASK_STATUSES as n}from"../tool/schema.mjs";import{applyTaskMutation as r,isCommittingOp as i,singleItemOutcome as a}from"../store/reducer.mjs";import{STATUS_LABEL as o,overlayStatusGlyph as s}from"./format.mjs";import{countTasks as c,visibleTasks as l}from"./selectors.mjs";import{matchesKey as u,truncateToWidth as d,visibleWidth as f}from"@earendil-works/pi-tui";import{homedir as p}from"node:os";import{DOOM_FULLSCREEN_UI_OPTIONS as m,DOOM_OVERLAY_ACCENT as h,DoomOverlay as g}from"@agimon-ai/doompi-ui/components/doomOverlay";const _=m.overlayOptions;function v(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<32||n===127)return!0}return!1}function y(e,t){let n=p(),r=n&&e.startsWith(n)?`~${e.slice(n.length)}`:e;if(f(r)<=t)return r;let i=r.split(`/`),a=i.pop()??r;for(;i.length>0;){let e=`${i[i.length-1]}/${a}`;if(f(`…/${e}`)>t)break;a=e,i.pop()}return d(`…/${a}`,t,``)}const b=`none`,x=[[`↑↓`,`select`],[`enter`,`edit subject`],[`s`,`status`],[`esc`,`close`]];function S(e,t){let n=d(e,Math.max(0,t),`…`);return n+` `.repeat(Math.max(0,t-f(n)))}function C(e,t,n){let r=f(t),i=Math.max(0,n-r-1);return S(e,i)+` `.repeat(Math.max(1,n-i-r))+S(t,r)}function w(e,t){if(t<=0)return[];let n=[],r=``;for(let i of e.split(/\s+/).filter(Boolean))r.length===0?r=i:r.length+1+i.length<=t?r+=` ${i}`:(n.push(r),r=i);return r.length>0&&n.push(r),n}var T=class extends g{options;done;unwatch;mode=`browse`;selected=0;statusIndex=0;draft=``;notice;bodyHeight=1;constructor(e,t,n,r){super(e,t),this.options=n,this.done=r,this.unwatch=n.store.onExternalChange(()=>this.tui.requestRender())}tasks(){return l(this.options.store.snapshot.tasks)}selectedTask(){let e=this.tasks();if(e.length!==0)return e[Math.min(this.selected,e.length-1)]}move(e){let t=this.tasks();t.length!==0&&(this.selected=Math.max(0,Math.min(t.length-1,this.selected+e)),this.tui.requestRender())}commit(e){this.options.store.mutate(t=>{let n=r(t,`upsert`,{tasks:[e]});return i(n.op)?{document:n.document,value:n.op}:{value:n.op}}).then(e=>{let t=a(e.value);this.notice=t?.kind===`failed`?t.message:void 0,this.tui.requestRender()}).catch(e=>{this.notice=e instanceof Error?e.message:String(e),this.tui.requestRender()})}handleStatusInput(e){let t=this.selectedTask();u(e,`up`)?this.statusIndex=Math.max(0,this.statusIndex-1):u(e,`down`)?this.statusIndex=Math.min(n.length-1,this.statusIndex+1):e===`s`?this.statusIndex=(this.statusIndex+1)%n.length:e===`\r`||e===`
2
- `?(this.mode=`browse`,t&&this.commit({id:t.id,status:n[this.statusIndex]})):u(e,`escape`)&&(this.mode=`browse`),this.tui.requestRender()}handleSubjectInput(e){let t=this.selectedTask();e===`\r`||e===`
3
- `?(this.mode=`browse`,t&&this.commit({id:t.id,subject:this.draft})):u(e,`escape`)?this.mode=`browse`:e===``?this.draft=this.draft.slice(0,-1):v(e)||(this.draft+=e),this.tui.requestRender()}handleInput(e){if(this.mode===`status`)return this.handleStatusInput(e);if(this.mode===`subject`)return this.handleSubjectInput(e);if(u(e,`escape`)||u(e,`ctrl+c`)){this.done(void 0);return}if(u(e,`up`))return this.move(-1);if(u(e,`down`))return this.move(1);let t=this.selectedTask();if(t){if(e===`s`){this.mode=`status`,this.statusIndex=Math.max(0,n.indexOf(t.status)),this.tui.requestRender();return}(e===`\r`||e===`
4
- `)&&(this.mode=`subject`,this.draft=t.subject,this.tui.requestRender())}}badge(e,t,n=`text`){return this.theme.bg(t,this.theme.fg(n,` ${e} `))}hintLine(e){return e.map(([e,t])=>`${this.badge(e,`selectedBg`)}${this.theme.fg(`dim`,` ${t}`)}`).join(this.theme.fg(`dim`,` `))}listLines(n){let r=this.tasks(),i=this.theme.bold(`TASKS`),a=Math.max(0,n-f(`TASKS`)-2),c=[`${i} ${this.theme.fg(`dim`,y(this.options.store.storePath,a))}`,``];if(r.length===0)return c.push(this.theme.fg(`dim`,t)),c;let l=Math.max(1,Math.floor((this.bodyHeight-c.length)/2)),u=Math.max(0,Math.min(this.selected-l+1,Math.max(0,r.length-l)));for(let[t,i]of r.slice(u,u+l).entries()){let a=u+t===Math.min(this.selected,r.length-1),l=a?this.theme.fg(`accent`,`›`):` `,d=a?this.theme.bold(i.subject):i.subject,f=s(i.status,this.theme),p=i.owner??i.delegation?.agent??b,m=i.status===`pending`&&e(this.options.store.snapshot.tasks,i)?this.theme.fg(`warning`,`blocked by ${(i.blockedBy??[]).map(e=>`#${e}`).join(`, `)}`):this.theme.fg(`dim`,o[i.status]),h=`${l} ${f} ${this.theme.fg(`dim`,`#${i.id}`)} ${d}`,g=`${` `.repeat(6)}${this.badge(p,`userMessageBg`,`muted`)} ${m}`,_=a?`selectedBg`:`userMessageBg`;for(let e of[h,g])c.push(this.theme.bg(_,S(e,n)))}return c}statusLines(e,t){if(this.mode!==`status`){let t=s(e.status,this.theme);return[this.theme.fg(`dim`,`STATUS`),`${t} ${o[e.status]}`]}let r=[this.theme.fg(`dim`,`STATUS s cycles · enter commits`)];for(let[i,a]of n.entries()){let n=i===this.statusIndex,o=n?this.theme.fg(`accent`,`▸`):` `,s=n?this.theme.bold(this.theme.fg(`accent`,a)):this.theme.fg(`muted`,a),c=a===e.status?this.theme.fg(`dim`,`current`):``,l=C(` ${o} ${s}`,c,t);r.push(this.theme.bg(n?`selectedBg`:`userMessageBg`,l))}return r}subjectField(e,t){let n=this.mode===`subject`,r=n?`${this.draft}█`:e.subject;return[this.theme.fg(`dim`,n?`SUBJECT enter commits · esc cancels`:`SUBJECT`),this.theme.bg(n?`selectedBg`:`userMessageBg`,S(` ${r}`,t))]}detailLines(e){let t=this.selectedTask();if(!t)return[this.theme.fg(`dim`,`No task selected`)];let n=this.mode===`subject`||this.mode===`status`?this.badge(`EDIT`,`toolSuccessBg`,`warning`):``,r=[C(this.theme.bold(this.theme.fg(`accent`,`TASK #${t.id}`)),n,e),``];r.push(...this.subjectField(t,e)),r.push(``,...this.statusLines(t,e),``),t.activeForm&&r.push(this.theme.fg(`dim`,`ACTIVE FORM`),t.activeForm,``);let i=t.owner??t.delegation?.agent??b,a=t.delegation?.runId?this.theme.fg(`success`,`delegated run ${t.delegation.runId}`):``;return r.push(this.theme.fg(`dim`,`OWNER`),a?`${i} ${this.theme.fg(`dim`,`·`)} ${a}`:i,``),r.push(this.theme.fg(`dim`,`BLOCKED BY`),t.blockedBy?.length?t.blockedBy.map(e=>`#${e}`).join(` · `):b),t.description&&r.push(``,this.theme.fg(`dim`,`DESCRIPTION`),...w(t.description,e)),this.notice&&r.push(``,this.theme.fg(`error`,this.notice)),r}headerSummary(){let e=c(this.options.store.snapshot.tasks),t=[`${e.completed}/${e.total} completed`];return e.inProgress>0&&t.push(`${e.inProgress} in progress`),e.blocked>0&&t.push(`${e.blocked} blocked`),e.failed>0&&t.push(`${e.failed} failed`),t.join(` · `)}getChrome(){return{title:`TASK SPACE`,accent:h,breadcrumb:`SPC › t › t / tasks`,headerRight:`${this.headerSummary()} · esc close`,footer:this.hintLine(x)}}renderBody(e,t){if(this.bodyHeight=t,e<48)return this.renderStacked(e,t);let n=Math.max(18,Math.floor((e-1)*.3333333333333333)),r=Math.max(1,e-n-1),i=Math.max(1,n-1),a=Math.max(1,r-1),o=this.listLines(i),s=this.detailLines(a),c=this.theme.fg(`borderMuted`,`│`);return Array.from({length:t},(t,n)=>{let r=`${S(o[n]??``,i)} ${c} ${S(s[n]??``,a)}`;return d(r,e,`…`)})}renderStacked(e,t){let n=Math.max(1,Math.floor((t-1)/2)),r=Math.max(0,t-n-1);this.bodyHeight=n;let i=this.listLines(e),a=this.detailLines(e);return[...i.slice(0,n),...Array.from({length:Math.max(0,n-i.length)},()=>``),this.theme.fg(`borderMuted`,`─`.repeat(e)),...a.slice(0,r)]}dispose(){this.unwatch()}};async function E(e,t){await e.ui.custom((e,n,r,i)=>new T(e,n,t,i),m)}export{_ as TASK_SPACE_OVERLAY_OPTIONS,T as TaskSpaceComponent,E as openTaskSpace};
5
- //# sourceMappingURL=taskSpace.mjs.map
1
+ import{TASK_SPACE_OVERLAY_OPTIONS as e,TaskSpaceComponent as t,openTaskSpace as n}from"./taskSpace2.mjs";export{e as TASK_SPACE_OVERLAY_OPTIONS,t as TaskSpaceComponent,n as openTaskSpace};
@@ -0,0 +1,5 @@
1
+ const e=require("../schemas/task.cjs"),t=require("../services/store/taskGraph.cjs"),n=require("../services/store/reducer.cjs"),r=require("./format2.cjs"),i=require("./selectors2.cjs");let a=require("node:os"),o=require("@agimon-ai/doompi-ui/components/doomOverlay"),s=require("@agimon-ai/doompi-ui/rendering"),c=require("@earendil-works/pi-tui");const l=o.DOOM_FULLSCREEN_UI_OPTIONS.overlayOptions;function u(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<32||n===127)return!0}return!1}function d(e,t){let n=(0,a.homedir)(),r=n&&e.startsWith(n)?`~${e.slice(n.length)}`:e;if((0,c.visibleWidth)(r)<=t)return r;let i=r.split(`/`),o=i.pop()??r;for(;i.length>0;){let e=`${i[i.length-1]}/${o}`;if((0,c.visibleWidth)(`…/${e}`)>t)break;o=e,i.pop()}return(0,c.truncateToWidth)(`…/${o}`,t,``)}const f=`none`,p=[[`↑↓`,`select`],[`enter`,`edit subject`],[`s`,`status`],[`esc`,`close`]];function m(e,t){return(0,s.fitStyledLine)(e,t,`…`)}function h(e,t,n){let r=(0,c.visibleWidth)(t),i=Math.max(0,n-r-1);return m(e,i)+` `.repeat(Math.max(1,n-i-r))+m(t,r)}function g(e,t){if(t<=0)return[];let n=[],r=``;for(let i of e.split(/\s+/).filter(Boolean))r.length===0?r=i:r.length+1+i.length<=t?r+=` ${i}`:(n.push(r),r=i);return r.length>0&&n.push(r),n}var _=class extends o.DoomOverlay{options;done;unwatch;mode=`browse`;selected=0;statusIndex=0;draft=``;notice;bodyHeight=1;constructor(e,t,n,r){super(e,t),this.options=n,this.done=r,this.unwatch=n.store.onExternalChange(()=>this.tui.requestRender())}tasks(){return i.visibleTasks(this.options.store.snapshot.tasks)}selectedTask(){let e=this.tasks();if(e.length!==0)return e[Math.min(this.selected,e.length-1)]}move(e){let t=this.tasks();t.length!==0&&(this.selected=Math.max(0,Math.min(t.length-1,this.selected+e)),this.tui.requestRender())}commit(e){this.options.store.mutate(t=>{let r=n.applyTaskMutation(t,`upsert`,{tasks:[e]});return n.isCommittingOp(r.op)?{document:r.document,value:r.op}:{value:r.op}}).then(e=>{let t=n.singleItemOutcome(e.value);this.notice=t?.kind===`failed`?t.message:void 0,this.tui.requestRender()}).catch(e=>{this.notice=e instanceof Error?e.message:String(e),this.tui.requestRender()})}handleStatusInput(t){let n=this.selectedTask();(0,c.matchesKey)(t,`up`)?this.statusIndex=Math.max(0,this.statusIndex-1):(0,c.matchesKey)(t,`down`)?this.statusIndex=Math.min(e.TASK_STATUSES.length-1,this.statusIndex+1):t===`s`?this.statusIndex=(this.statusIndex+1)%e.TASK_STATUSES.length:t===`\r`||t===`
2
+ `?(this.mode=`browse`,n&&this.commit({id:n.id,status:e.TASK_STATUSES[this.statusIndex]})):(0,c.matchesKey)(t,`escape`)&&(this.mode=`browse`),this.tui.requestRender()}handleSubjectInput(e){let t=this.selectedTask();e===`\r`||e===`
3
+ `?(this.mode=`browse`,t&&this.commit({id:t.id,subject:this.draft})):(0,c.matchesKey)(e,`escape`)?this.mode=`browse`:e===``?this.draft=this.draft.slice(0,-1):u(e)||(this.draft+=e),this.tui.requestRender()}handleInput(t){if(this.mode===`status`){this.handleStatusInput(t);return}if(this.mode===`subject`){this.handleSubjectInput(t);return}if((0,c.matchesKey)(t,`escape`)||(0,c.matchesKey)(t,`ctrl+c`)){this.done(void 0);return}if((0,c.matchesKey)(t,`up`)){this.move(-1);return}if((0,c.matchesKey)(t,`down`)){this.move(1);return}let n=this.selectedTask();if(n){if(t===`s`){this.mode=`status`,this.statusIndex=Math.max(0,e.TASK_STATUSES.indexOf(n.status)),this.tui.requestRender();return}(t===`\r`||t===`
4
+ `)&&(this.mode=`subject`,this.draft=n.subject,this.tui.requestRender())}}badge(e,t,n=`text`){return this.theme.bg(t,this.theme.fg(n,` ${e} `))}hintLine(e){return e.map(([e,t])=>`${this.badge(e,`selectedBg`)}${this.theme.fg(`dim`,` ${t}`)}`).join(this.theme.fg(`dim`,` `))}listLines(n){let i=this.tasks(),a=this.theme.bold(`TASKS`),o=Math.max(0,n-(0,c.visibleWidth)(`TASKS`)-2),s=[`${a} ${this.theme.fg(`dim`,d(this.options.store.storePath,o))}`,``];if(i.length===0)return s.push(this.theme.fg(`dim`,e.MSG_NO_TASKS)),s;let l=Math.max(1,Math.floor((this.bodyHeight-s.length)/2)),u=Math.max(0,Math.min(this.selected-l+1,Math.max(0,i.length-l)));for(let[e,a]of i.slice(u,u+l).entries()){let o=u+e===Math.min(this.selected,i.length-1),c=o?this.theme.fg(`accent`,`›`):` `,l=o?this.theme.bold(a.subject):a.subject,d=r.overlayStatusGlyph(a.status,this.theme),p=a.owner??a.delegation?.agent??f,h=a.status===`pending`&&t.isBlocked(this.options.store.snapshot.tasks,a)?this.theme.fg(`warning`,`blocked by ${(a.blockedBy??[]).map(e=>`#${e}`).join(`, `)}`):this.theme.fg(`dim`,r.STATUS_LABEL[a.status]),g=`${c} ${d} ${this.theme.fg(`dim`,`#${a.id}`)} ${l}`,_=`${` `.repeat(6)}${this.badge(p,`userMessageBg`,`muted`)} ${h}`,v=o?`selectedBg`:`userMessageBg`;for(let e of[g,_])s.push(this.theme.bg(v,m(e,n)))}return s}statusLines(t,n){if(this.mode!==`status`){let e=r.overlayStatusGlyph(t.status,this.theme);return[this.theme.fg(`dim`,`STATUS`),`${e} ${r.STATUS_LABEL[t.status]}`]}let i=[this.theme.fg(`dim`,`STATUS s cycles · enter commits`)];for(let[r,a]of e.TASK_STATUSES.entries()){let e=r===this.statusIndex,o=e?this.theme.fg(`accent`,`▸`):` `,s=e?this.theme.bold(this.theme.fg(`accent`,a)):this.theme.fg(`muted`,a),c=a===t.status?this.theme.fg(`dim`,`current`):``,l=h(` ${o} ${s}`,c,n);i.push(this.theme.bg(e?`selectedBg`:`userMessageBg`,l))}return i}subjectField(e,t){let n=this.mode===`subject`,r=n?`${this.draft}█`:e.subject;return[this.theme.fg(`dim`,n?`SUBJECT enter commits · esc cancels`:`SUBJECT`),this.theme.bg(n?`selectedBg`:`userMessageBg`,m(` ${r}`,t))]}detailLines(e){let t=this.selectedTask();if(!t)return[this.theme.fg(`dim`,`No task selected`)];let n=this.mode===`subject`||this.mode===`status`?this.badge(`EDIT`,`toolSuccessBg`,`warning`):``,r=[h(this.theme.bold(this.theme.fg(`accent`,`TASK #${t.id}`)),n,e),``];r.push(...this.subjectField(t,e)),r.push(``,...this.statusLines(t,e),``),t.activeForm&&r.push(this.theme.fg(`dim`,`ACTIVE FORM`),t.activeForm,``);let i=t.owner??t.delegation?.agent??f,a=t.delegation?.runId?this.theme.fg(`success`,`delegated run ${t.delegation.runId}`):``;return r.push(this.theme.fg(`dim`,`OWNER`),a?`${i} ${this.theme.fg(`dim`,`·`)} ${a}`:i,``),r.push(this.theme.fg(`dim`,`BLOCKED BY`),t.blockedBy?.length?t.blockedBy.map(e=>`#${e}`).join(` · `):f),t.description&&r.push(``,this.theme.fg(`dim`,`DESCRIPTION`),...g(t.description,e)),this.notice&&r.push(``,this.theme.fg(`error`,this.notice)),r}headerSummary(){let e=i.countTasks(this.options.store.snapshot.tasks),t=[`${e.completed}/${e.total} completed`];return e.inProgress>0&&t.push(`${e.inProgress} in progress`),e.blocked>0&&t.push(`${e.blocked} blocked`),e.failed>0&&t.push(`${e.failed} failed`),t.join(` · `)}getChrome(){return{title:`TASK SPACE`,accent:o.DOOM_OVERLAY_ACCENT,breadcrumb:`SPC › t › t / tasks`,headerRight:`${this.headerSummary()} · esc close`,footer:this.hintLine(p)}}renderBody(e,t){if(this.bodyHeight=t,e<48)return this.renderStacked(e,t);let n=Math.max(18,Math.floor((e-1)*.3333333333333333)),r=Math.max(1,e-n-1),i=Math.max(1,n-1),a=Math.max(1,r-1),o=this.listLines(i),s=this.detailLines(a),l=this.theme.fg(`borderMuted`,`│`);return Array.from({length:t},(t,n)=>{let r=`${m(o[n]??``,i)} ${l} ${m(s[n]??``,a)}`;return(0,c.truncateToWidth)(r,e,`…`)})}renderStacked(e,t){let n=Math.max(1,Math.floor((t-1)/2)),r=Math.max(0,t-n-1);this.bodyHeight=n;let i=this.listLines(e),a=this.detailLines(e);return[...i.slice(0,n),...Array.from({length:Math.max(0,n-i.length)},()=>``),this.theme.fg(`borderMuted`,`─`.repeat(e)),...a.slice(0,r)]}dispose(){this.unwatch()}};async function v(e,t){await e.ui.custom((e,n,r,i)=>new _(e,n,t,i),o.DOOM_FULLSCREEN_UI_OPTIONS)}exports.TASK_SPACE_OVERLAY_OPTIONS=l,exports.TaskSpaceComponent=_,exports.openTaskSpace=v;
5
+ //# sourceMappingURL=taskSpace2.cjs.map