@agimon-ai/doompi-task 0.0.1-alpha.7 → 0.0.1-alpha.71

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 (439) hide show
  1. package/README.md +114 -15
  2. package/dist/api-contracts.cjs +1 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +1 -0
  6. package/dist/commands.cjs +1 -2
  7. package/dist/commands.d.cts +2 -14
  8. package/dist/commands.d.mts +2 -14
  9. package/dist/commands.mjs +1 -2
  10. package/dist/config.cjs +1 -2
  11. package/dist/config.d.cts +2 -38
  12. package/dist/config.d.mts +2 -38
  13. package/dist/config.mjs +1 -2
  14. package/dist/constants/promptGuidelines.cjs +2 -0
  15. package/dist/constants/promptGuidelines.cjs.map +1 -0
  16. package/dist/constants/promptGuidelines.d.cts +13 -0
  17. package/dist/constants/promptGuidelines.d.cts.map +1 -0
  18. package/dist/constants/promptGuidelines.d.mts +13 -0
  19. package/dist/constants/promptGuidelines.d.mts.map +1 -0
  20. package/dist/constants/promptGuidelines.mjs +2 -0
  21. package/dist/constants/promptGuidelines.mjs.map +1 -0
  22. package/dist/constants/task.cjs +2 -0
  23. package/dist/constants/task.cjs.map +1 -0
  24. package/dist/constants/task.d.cts +4 -0
  25. package/dist/constants/task.d.cts.map +1 -0
  26. package/dist/constants/task.d.mts +4 -0
  27. package/dist/constants/task.d.mts.map +1 -0
  28. package/dist/constants/task.mjs +2 -0
  29. package/dist/constants/task.mjs.map +1 -0
  30. package/dist/controllers/tasksCommand.cjs +2 -0
  31. package/dist/controllers/tasksCommand.cjs.map +1 -0
  32. package/dist/controllers/tasksCommand.d.cts +15 -0
  33. package/dist/controllers/tasksCommand.d.cts.map +1 -0
  34. package/dist/controllers/tasksCommand.d.mts +15 -0
  35. package/dist/controllers/tasksCommand.d.mts.map +1 -0
  36. package/dist/controllers/tasksCommand.mjs +2 -0
  37. package/dist/controllers/tasksCommand.mjs.map +1 -0
  38. package/dist/controllers/webTasksChannel.cjs +2 -0
  39. package/dist/controllers/webTasksChannel.cjs.map +1 -0
  40. package/dist/controllers/webTasksChannel.mjs +2 -0
  41. package/dist/controllers/webTasksChannel.mjs.map +1 -0
  42. package/dist/delegation-manager.cjs +1 -0
  43. package/dist/delegation-manager.d.cts +3 -0
  44. package/dist/delegation-manager.d.mts +3 -0
  45. package/dist/delegation-manager.mjs +1 -0
  46. package/dist/extensions/pi.cjs +2 -1
  47. package/dist/extensions/pi.cjs.map +1 -1
  48. package/dist/extensions/pi.d.cts +6 -2
  49. package/dist/extensions/pi.d.cts.map +1 -0
  50. package/dist/extensions/pi.d.mts +6 -2
  51. package/dist/extensions/pi.d.mts.map +1 -0
  52. package/dist/extensions/pi.mjs +2 -1
  53. package/dist/extensions/pi.mjs.map +1 -1
  54. package/dist/extensions/server.cjs +2 -0
  55. package/dist/extensions/server.cjs.map +1 -0
  56. package/dist/extensions/server.d.cts +5 -0
  57. package/dist/extensions/server.d.cts.map +1 -0
  58. package/dist/extensions/server.d.mts +5 -0
  59. package/dist/extensions/server.d.mts.map +1 -0
  60. package/dist/extensions/server.mjs +2 -0
  61. package/dist/extensions/server.mjs.map +1 -0
  62. package/dist/index.cjs +1 -1
  63. package/dist/index.d.cts +15 -14
  64. package/dist/index.d.mts +15 -14
  65. package/dist/index.mjs +1 -1
  66. package/dist/logSinkTelemetry.cjs +1 -2
  67. package/dist/logSinkTelemetry.d.cts +3 -51
  68. package/dist/logSinkTelemetry.d.mts +3 -51
  69. package/dist/logSinkTelemetry.mjs +1 -2
  70. package/dist/models/task.cjs +2 -0
  71. package/dist/models/task.cjs.map +1 -0
  72. package/dist/{store/types.d.cts → models/task.d.cts} +41 -30
  73. package/dist/models/task.d.cts.map +1 -0
  74. package/dist/{store/types.d.mts → models/task.d.mts} +41 -30
  75. package/dist/models/task.d.mts.map +1 -0
  76. package/dist/{store/types.mjs → models/task.mjs} +1 -1
  77. package/dist/models/task.mjs.map +1 -0
  78. package/dist/models/taskGraph.cjs +2 -0
  79. package/dist/models/taskGraph.cjs.map +1 -0
  80. package/dist/{store → models}/taskGraph.d.cts +7 -8
  81. package/dist/models/taskGraph.d.cts.map +1 -0
  82. package/dist/{store → models}/taskGraph.d.mts +7 -8
  83. package/dist/models/taskGraph.d.mts.map +1 -0
  84. package/dist/models/taskGraph.mjs.map +1 -0
  85. package/dist/schemas/apiContracts.cjs +2 -0
  86. package/dist/schemas/apiContracts.cjs.map +1 -0
  87. package/dist/schemas/apiContracts.d.cts +53 -0
  88. package/dist/schemas/apiContracts.d.cts.map +1 -0
  89. package/dist/schemas/apiContracts.d.mts +53 -0
  90. package/dist/schemas/apiContracts.d.mts.map +1 -0
  91. package/dist/schemas/apiContracts.mjs +2 -0
  92. package/dist/schemas/apiContracts.mjs.map +1 -0
  93. package/dist/schemas/task.cjs +2 -0
  94. package/dist/schemas/task.cjs.map +1 -0
  95. package/dist/{tool/schema.d.cts → schemas/task.d.cts} +46 -29
  96. package/dist/schemas/task.d.cts.map +1 -0
  97. package/dist/{tool/schema.d.mts → schemas/task.d.mts} +46 -29
  98. package/dist/schemas/task.d.mts.map +1 -0
  99. package/dist/schemas/task.mjs +2 -0
  100. package/dist/schemas/task.mjs.map +1 -0
  101. package/dist/services/config/index.cjs +2 -0
  102. package/dist/services/config/index.cjs.map +1 -0
  103. package/dist/services/config/index.d.cts +42 -0
  104. package/dist/services/config/index.d.cts.map +1 -0
  105. package/dist/services/config/index.d.mts +42 -0
  106. package/dist/services/config/index.d.mts.map +1 -0
  107. package/dist/services/config/index.mjs +2 -0
  108. package/dist/services/config/index.mjs.map +1 -0
  109. package/dist/services/contextContribution/index.cjs +3 -0
  110. package/dist/services/contextContribution/index.cjs.map +1 -0
  111. package/dist/services/contextContribution/index.mjs +3 -0
  112. package/dist/services/contextContribution/index.mjs.map +1 -0
  113. package/dist/services/delegation/index.cjs +6 -0
  114. package/dist/services/delegation/index.cjs.map +1 -0
  115. package/dist/{delegation/manager.d.cts → services/delegation/index.d.cts} +52 -49
  116. package/dist/services/delegation/index.d.cts.map +1 -0
  117. package/dist/{delegation/manager.d.mts → services/delegation/index.d.mts} +52 -49
  118. package/dist/services/delegation/index.d.mts.map +1 -0
  119. package/dist/services/delegation/index.mjs +6 -0
  120. package/dist/services/delegation/index.mjs.map +1 -0
  121. package/dist/services/delegationPlatform/index.cjs +2 -0
  122. package/dist/services/delegationPlatform/index.cjs.map +1 -0
  123. package/dist/services/delegationPlatform/index.mjs +2 -0
  124. package/dist/services/delegationPlatform/index.mjs.map +1 -0
  125. package/dist/services/invariants/index.cjs +2 -0
  126. package/dist/services/invariants/index.cjs.map +1 -0
  127. package/dist/services/invariants/index.d.cts +23 -0
  128. package/dist/services/invariants/index.d.cts.map +1 -0
  129. package/dist/services/invariants/index.d.mts +23 -0
  130. package/dist/services/invariants/index.d.mts.map +1 -0
  131. package/dist/services/invariants/index.mjs +2 -0
  132. package/dist/services/invariants/index.mjs.map +1 -0
  133. package/dist/services/logSinkTelemetry/index.cjs +2 -0
  134. package/dist/services/logSinkTelemetry/index.cjs.map +1 -0
  135. package/dist/services/logSinkTelemetry/index.d.cts +23 -0
  136. package/dist/services/logSinkTelemetry/index.d.cts.map +1 -0
  137. package/dist/services/logSinkTelemetry/index.d.mts +23 -0
  138. package/dist/services/logSinkTelemetry/index.d.mts.map +1 -0
  139. package/dist/services/logSinkTelemetry/index.mjs +2 -0
  140. package/dist/services/logSinkTelemetry/index.mjs.map +1 -0
  141. package/dist/services/paths/index.cjs +2 -0
  142. package/dist/services/paths/index.cjs.map +1 -0
  143. package/dist/services/paths/index.d.cts +25 -0
  144. package/dist/services/paths/index.d.cts.map +1 -0
  145. package/dist/services/paths/index.d.mts +25 -0
  146. package/dist/services/paths/index.d.mts.map +1 -0
  147. package/dist/services/paths/index.mjs +2 -0
  148. package/dist/services/paths/index.mjs.map +1 -0
  149. package/dist/services/processLiveness/index.cjs +2 -0
  150. package/dist/services/processLiveness/index.cjs.map +1 -0
  151. package/dist/{store/processLiveness.d.cts → services/processLiveness/index.d.cts} +3 -4
  152. package/dist/services/processLiveness/index.d.cts.map +1 -0
  153. package/dist/{store/processLiveness.d.mts → services/processLiveness/index.d.mts} +3 -4
  154. package/dist/services/processLiveness/index.d.mts.map +1 -0
  155. package/dist/{store/processLiveness.mjs → services/processLiveness/index.mjs} +1 -1
  156. package/dist/services/processLiveness/index.mjs.map +1 -0
  157. package/dist/services/reconcile/index.cjs +2 -0
  158. package/dist/services/reconcile/index.cjs.map +1 -0
  159. package/dist/{store/reconcile.d.cts → services/reconcile/index.d.cts} +8 -9
  160. package/dist/services/reconcile/index.d.cts.map +1 -0
  161. package/dist/{store/reconcile.d.mts → services/reconcile/index.d.mts} +8 -9
  162. package/dist/services/reconcile/index.d.mts.map +1 -0
  163. package/dist/services/reconcile/index.mjs +2 -0
  164. package/dist/services/reconcile/index.mjs.map +1 -0
  165. package/dist/services/reducer/index.cjs +3 -0
  166. package/dist/services/reducer/index.cjs.map +1 -0
  167. package/dist/{store/reducer.d.cts → services/reducer/index.d.cts} +12 -13
  168. package/dist/services/reducer/index.d.cts.map +1 -0
  169. package/dist/{store/reducer.d.mts → services/reducer/index.d.mts} +12 -13
  170. package/dist/services/reducer/index.d.mts.map +1 -0
  171. package/dist/services/reducer/index.mjs +3 -0
  172. package/dist/services/reducer/index.mjs.map +1 -0
  173. package/dist/services/taskNarration/index.cjs +2 -0
  174. package/dist/services/taskNarration/index.cjs.map +1 -0
  175. package/dist/services/taskNarration/index.mjs +2 -0
  176. package/dist/services/taskNarration/index.mjs.map +1 -0
  177. package/dist/services/taskResult/index.cjs +7 -0
  178. package/dist/services/taskResult/index.cjs.map +1 -0
  179. package/dist/services/taskResult/index.d.cts +50 -0
  180. package/dist/services/taskResult/index.d.cts.map +1 -0
  181. package/dist/services/taskResult/index.d.mts +50 -0
  182. package/dist/services/taskResult/index.d.mts.map +1 -0
  183. package/dist/services/taskResult/index.mjs +7 -0
  184. package/dist/services/taskResult/index.mjs.map +1 -0
  185. package/dist/services/taskStore/index.cjs +2 -0
  186. package/dist/services/taskStore/index.cjs.map +1 -0
  187. package/dist/{store/taskStore.d.cts → services/taskStore/index.d.cts} +17 -25
  188. package/dist/services/taskStore/index.d.cts.map +1 -0
  189. package/dist/{store/taskStore.d.mts → services/taskStore/index.d.mts} +17 -25
  190. package/dist/services/taskStore/index.d.mts.map +1 -0
  191. package/dist/services/taskStore/index.mjs +2 -0
  192. package/dist/services/taskStore/index.mjs.map +1 -0
  193. package/dist/store-invariants.cjs +1 -0
  194. package/dist/store-invariants.d.cts +2 -0
  195. package/dist/store-invariants.d.mts +2 -0
  196. package/dist/store-invariants.mjs +1 -0
  197. package/dist/store-paths.cjs +1 -0
  198. package/dist/store-paths.d.cts +2 -0
  199. package/dist/store-paths.d.mts +2 -0
  200. package/dist/store-paths.mjs +1 -0
  201. package/dist/store-process-liveness.cjs +1 -0
  202. package/dist/store-process-liveness.d.cts +2 -0
  203. package/dist/store-process-liveness.d.mts +2 -0
  204. package/dist/store-process-liveness.mjs +1 -0
  205. package/dist/store-reconcile.cjs +1 -0
  206. package/dist/store-reconcile.d.cts +2 -0
  207. package/dist/store-reconcile.d.mts +2 -0
  208. package/dist/store-reconcile.mjs +1 -0
  209. package/dist/store-reducer.cjs +1 -0
  210. package/dist/store-reducer.d.cts +2 -0
  211. package/dist/store-reducer.d.mts +2 -0
  212. package/dist/store-reducer.mjs +1 -0
  213. package/dist/store-task-graph.cjs +1 -0
  214. package/dist/store-task-graph.d.cts +2 -0
  215. package/dist/store-task-graph.d.mts +2 -0
  216. package/dist/store-task-graph.mjs +1 -0
  217. package/dist/store-task-store.cjs +1 -0
  218. package/dist/store-task-store.d.cts +2 -0
  219. package/dist/store-task-store.d.mts +2 -0
  220. package/dist/store-task-store.mjs +1 -0
  221. package/dist/store-types.cjs +1 -0
  222. package/dist/store-types.d.cts +2 -0
  223. package/dist/store-types.d.mts +2 -0
  224. package/dist/store-types.mjs +1 -0
  225. package/dist/tool-prompt-guidelines.cjs +1 -0
  226. package/dist/tool-prompt-guidelines.d.cts +2 -0
  227. package/dist/tool-prompt-guidelines.d.mts +2 -0
  228. package/dist/tool-prompt-guidelines.mjs +1 -0
  229. package/dist/tool-response-envelope.cjs +1 -0
  230. package/dist/tool-response-envelope.d.cts +2 -0
  231. package/dist/tool-response-envelope.d.mts +2 -0
  232. package/dist/tool-response-envelope.mjs +1 -0
  233. package/dist/tool-schema.cjs +1 -0
  234. package/dist/tool-schema.d.cts +3 -0
  235. package/dist/tool-schema.d.mts +3 -0
  236. package/dist/tool-schema.mjs +1 -0
  237. package/dist/tool-task-tool.cjs +1 -0
  238. package/dist/tool-task-tool.d.cts +3 -0
  239. package/dist/tool-task-tool.d.mts +3 -0
  240. package/dist/tool-task-tool.mjs +1 -0
  241. package/dist/tools/task.cjs +3 -0
  242. package/dist/tools/task.cjs.map +1 -0
  243. package/dist/tools/task.d.cts +22 -0
  244. package/dist/tools/task.d.cts.map +1 -0
  245. package/dist/tools/task.d.mts +22 -0
  246. package/dist/tools/task.d.mts.map +1 -0
  247. package/dist/tools/task.mjs +3 -0
  248. package/dist/tools/task.mjs.map +1 -0
  249. package/dist/tui/format.cjs +3 -3
  250. package/dist/tui/format.cjs.map +1 -1
  251. package/dist/tui/format.d.cts +19 -20
  252. package/dist/tui/format.d.cts.map +1 -1
  253. package/dist/tui/format.d.mts +19 -20
  254. package/dist/tui/format.d.mts.map +1 -1
  255. package/dist/tui/format.mjs +3 -3
  256. package/dist/tui/format.mjs.map +1 -1
  257. package/dist/tui/selectors.cjs +1 -1
  258. package/dist/tui/selectors.cjs.map +1 -1
  259. package/dist/tui/selectors.d.cts +20 -14
  260. package/dist/tui/selectors.d.cts.map +1 -1
  261. package/dist/tui/selectors.d.mts +20 -14
  262. package/dist/tui/selectors.d.mts.map +1 -1
  263. package/dist/tui/selectors.mjs +1 -1
  264. package/dist/tui/selectors.mjs.map +1 -1
  265. package/dist/tui/taskOverlay.cjs +1 -1
  266. package/dist/tui/taskOverlay.cjs.map +1 -1
  267. package/dist/tui/taskOverlay.d.cts +4 -5
  268. package/dist/tui/taskOverlay.d.cts.map +1 -1
  269. package/dist/tui/taskOverlay.d.mts +4 -5
  270. package/dist/tui/taskOverlay.d.mts.map +1 -1
  271. package/dist/tui/taskOverlay.mjs +1 -1
  272. package/dist/tui/taskOverlay.mjs.map +1 -1
  273. package/dist/tui/taskSpace.cjs +3 -3
  274. package/dist/tui/taskSpace.cjs.map +1 -1
  275. package/dist/tui/taskSpace.d.cts +9 -10
  276. package/dist/tui/taskSpace.d.cts.map +1 -1
  277. package/dist/tui/taskSpace.d.mts +9 -10
  278. package/dist/tui/taskSpace.d.mts.map +1 -1
  279. package/dist/tui/taskSpace.mjs +3 -3
  280. package/dist/tui/taskSpace.mjs.map +1 -1
  281. package/dist/tui-format.cjs +1 -0
  282. package/dist/tui-format.d.cts +2 -0
  283. package/dist/tui-format.d.mts +2 -0
  284. package/dist/tui-format.mjs +1 -0
  285. package/dist/tui-selectors.cjs +1 -0
  286. package/dist/tui-selectors.d.cts +2 -0
  287. package/dist/tui-selectors.d.mts +2 -0
  288. package/dist/tui-selectors.mjs +1 -0
  289. package/dist/tui-task-overlay.cjs +1 -0
  290. package/dist/tui-task-overlay.d.cts +2 -0
  291. package/dist/tui-task-overlay.d.mts +2 -0
  292. package/dist/tui-task-overlay.mjs +1 -0
  293. package/dist/tui-task-space.cjs +1 -0
  294. package/dist/tui-task-space.d.cts +2 -0
  295. package/dist/tui-task-space.d.mts +2 -0
  296. package/dist/tui-task-space.mjs +1 -0
  297. package/dist/types/delegation.cjs +2 -0
  298. package/dist/types/delegation.cjs.map +1 -0
  299. package/dist/types/delegation.d.cts +5 -0
  300. package/dist/types/delegation.d.cts.map +1 -0
  301. package/dist/types/delegation.d.mts +5 -0
  302. package/dist/types/delegation.d.mts.map +1 -0
  303. package/dist/types/delegation.mjs +2 -0
  304. package/dist/types/delegation.mjs.map +1 -0
  305. package/dist/types/telemetry.cjs +2 -0
  306. package/dist/types/telemetry.cjs.map +1 -0
  307. package/dist/types/telemetry.d.cts +35 -0
  308. package/dist/types/telemetry.d.cts.map +1 -0
  309. package/dist/types/telemetry.d.mts +35 -0
  310. package/dist/types/telemetry.d.mts.map +1 -0
  311. package/dist/types/telemetry.mjs +2 -0
  312. package/dist/types/telemetry.mjs.map +1 -0
  313. package/dist/types/webTasks.cjs +2 -0
  314. package/dist/types/webTasks.cjs.map +1 -0
  315. package/dist/types/webTasks.mjs +2 -0
  316. package/dist/types/webTasks.mjs.map +1 -0
  317. package/package.json +158 -109
  318. package/src/extensions/web.ts +18 -0
  319. package/src/types/webTasks.ts +24 -0
  320. package/src/web/components/TaskDetailDialog.tsx +251 -0
  321. package/src/web/components/TaskToolMessage.tsx +120 -0
  322. package/src/web/components/TasksActivitySection.tsx +200 -0
  323. package/src/web/lib/taskToolFormat.ts +330 -0
  324. package/src/web/stores/tasksStore.ts +114 -0
  325. package/src/web/tsconfig.json +23 -0
  326. package/dist/commands.cjs.map +0 -1
  327. package/dist/commands.d.cts.map +0 -1
  328. package/dist/commands.d.mts.map +0 -1
  329. package/dist/commands.mjs.map +0 -1
  330. package/dist/config.cjs.map +0 -1
  331. package/dist/config.d.cts.map +0 -1
  332. package/dist/config.d.mts.map +0 -1
  333. package/dist/config.mjs.map +0 -1
  334. package/dist/delegation/manager.cjs +0 -6
  335. package/dist/delegation/manager.cjs.map +0 -1
  336. package/dist/delegation/manager.d.cts.map +0 -1
  337. package/dist/delegation/manager.d.mts.map +0 -1
  338. package/dist/delegation/manager.mjs +0 -6
  339. package/dist/delegation/manager.mjs.map +0 -1
  340. package/dist/extension.cjs +0 -3
  341. package/dist/extension.cjs.map +0 -1
  342. package/dist/extension.d.cts +0 -12
  343. package/dist/extension.d.cts.map +0 -1
  344. package/dist/extension.d.mts +0 -12
  345. package/dist/extension.d.mts.map +0 -1
  346. package/dist/extension.mjs +0 -3
  347. package/dist/extension.mjs.map +0 -1
  348. package/dist/extensions/doom.cjs +0 -2
  349. package/dist/extensions/doom.cjs.map +0 -1
  350. package/dist/extensions/doom.d.cts +0 -6
  351. package/dist/extensions/doom.d.cts.map +0 -1
  352. package/dist/extensions/doom.d.mts +0 -7
  353. package/dist/extensions/doom.d.mts.map +0 -1
  354. package/dist/extensions/doom.mjs +0 -2
  355. package/dist/extensions/doom.mjs.map +0 -1
  356. package/dist/logSinkTelemetry.cjs.map +0 -1
  357. package/dist/logSinkTelemetry.d.cts.map +0 -1
  358. package/dist/logSinkTelemetry.d.mts.map +0 -1
  359. package/dist/logSinkTelemetry.mjs.map +0 -1
  360. package/dist/store/invariants.cjs +0 -2
  361. package/dist/store/invariants.cjs.map +0 -1
  362. package/dist/store/invariants.d.cts +0 -14
  363. package/dist/store/invariants.d.cts.map +0 -1
  364. package/dist/store/invariants.d.mts +0 -14
  365. package/dist/store/invariants.d.mts.map +0 -1
  366. package/dist/store/invariants.mjs +0 -2
  367. package/dist/store/invariants.mjs.map +0 -1
  368. package/dist/store/paths.cjs +0 -2
  369. package/dist/store/paths.cjs.map +0 -1
  370. package/dist/store/paths.d.cts +0 -23
  371. package/dist/store/paths.d.cts.map +0 -1
  372. package/dist/store/paths.d.mts +0 -23
  373. package/dist/store/paths.d.mts.map +0 -1
  374. package/dist/store/paths.mjs +0 -2
  375. package/dist/store/paths.mjs.map +0 -1
  376. package/dist/store/processLiveness.cjs +0 -2
  377. package/dist/store/processLiveness.cjs.map +0 -1
  378. package/dist/store/processLiveness.d.cts.map +0 -1
  379. package/dist/store/processLiveness.d.mts.map +0 -1
  380. package/dist/store/processLiveness.mjs.map +0 -1
  381. package/dist/store/reconcile.cjs +0 -2
  382. package/dist/store/reconcile.cjs.map +0 -1
  383. package/dist/store/reconcile.d.cts.map +0 -1
  384. package/dist/store/reconcile.d.mts.map +0 -1
  385. package/dist/store/reconcile.mjs +0 -2
  386. package/dist/store/reconcile.mjs.map +0 -1
  387. package/dist/store/reducer.cjs +0 -3
  388. package/dist/store/reducer.cjs.map +0 -1
  389. package/dist/store/reducer.d.cts.map +0 -1
  390. package/dist/store/reducer.d.mts.map +0 -1
  391. package/dist/store/reducer.mjs +0 -3
  392. package/dist/store/reducer.mjs.map +0 -1
  393. package/dist/store/taskGraph.cjs +0 -2
  394. package/dist/store/taskGraph.cjs.map +0 -1
  395. package/dist/store/taskGraph.d.cts.map +0 -1
  396. package/dist/store/taskGraph.d.mts.map +0 -1
  397. package/dist/store/taskGraph.mjs.map +0 -1
  398. package/dist/store/taskStore.cjs +0 -2
  399. package/dist/store/taskStore.cjs.map +0 -1
  400. package/dist/store/taskStore.d.cts.map +0 -1
  401. package/dist/store/taskStore.d.mts.map +0 -1
  402. package/dist/store/taskStore.mjs +0 -2
  403. package/dist/store/taskStore.mjs.map +0 -1
  404. package/dist/store/types.cjs +0 -2
  405. package/dist/store/types.cjs.map +0 -1
  406. package/dist/store/types.d.cts.map +0 -1
  407. package/dist/store/types.d.mts.map +0 -1
  408. package/dist/store/types.mjs.map +0 -1
  409. package/dist/tool/promptGuidelines.cjs +0 -2
  410. package/dist/tool/promptGuidelines.cjs.map +0 -1
  411. package/dist/tool/promptGuidelines.d.cts +0 -5
  412. package/dist/tool/promptGuidelines.d.cts.map +0 -1
  413. package/dist/tool/promptGuidelines.d.mts +0 -5
  414. package/dist/tool/promptGuidelines.d.mts.map +0 -1
  415. package/dist/tool/promptGuidelines.mjs +0 -2
  416. package/dist/tool/promptGuidelines.mjs.map +0 -1
  417. package/dist/tool/responseEnvelope.cjs +0 -6
  418. package/dist/tool/responseEnvelope.cjs.map +0 -1
  419. package/dist/tool/responseEnvelope.d.cts +0 -39
  420. package/dist/tool/responseEnvelope.d.cts.map +0 -1
  421. package/dist/tool/responseEnvelope.d.mts +0 -39
  422. package/dist/tool/responseEnvelope.d.mts.map +0 -1
  423. package/dist/tool/responseEnvelope.mjs +0 -6
  424. package/dist/tool/responseEnvelope.mjs.map +0 -1
  425. package/dist/tool/schema.cjs +0 -2
  426. package/dist/tool/schema.cjs.map +0 -1
  427. package/dist/tool/schema.d.cts.map +0 -1
  428. package/dist/tool/schema.d.mts.map +0 -1
  429. package/dist/tool/schema.mjs +0 -2
  430. package/dist/tool/schema.mjs.map +0 -1
  431. package/dist/tool/taskTool.cjs +0 -3
  432. package/dist/tool/taskTool.cjs.map +0 -1
  433. package/dist/tool/taskTool.d.cts +0 -17
  434. package/dist/tool/taskTool.d.cts.map +0 -1
  435. package/dist/tool/taskTool.d.mts +0 -17
  436. package/dist/tool/taskTool.d.mts.map +0 -1
  437. package/dist/tool/taskTool.mjs +0 -3
  438. package/dist/tool/taskTool.mjs.map +0 -1
  439. /package/dist/{store → models}/taskGraph.mjs +0 -0
@@ -0,0 +1,251 @@
1
+ import type { SessionFrameSender } from '@agimon-ai/doompi-core/web';
2
+ import {
3
+ Button,
4
+ Dialog,
5
+ DialogBody,
6
+ DialogContent,
7
+ DialogFooter,
8
+ DialogHeader,
9
+ DialogTitle,
10
+ Input,
11
+ Select,
12
+ SelectContent,
13
+ SelectItem,
14
+ SelectTrigger,
15
+ SelectValue,
16
+ Textarea,
17
+ } from '@agimon-ai/doompi-web-components';
18
+ import { type ReactNode, useState } from 'react';
19
+
20
+ import type { WebTask, WebTaskStatus } from '../../types/webTasks';
21
+ import { requestTaskEdit, requestTaskMessage, taskEditDraft, type TaskEditDraft } from '../stores/tasksStore';
22
+
23
+ /** How the one task dialog is opened: reading it, changing it, or steering its run. */
24
+ export type TaskDialogMode = 'view' | 'edit' | 'message';
25
+
26
+ const STATUS_CHOICES: readonly WebTaskStatus[] = ['pending', 'in_progress', 'completed', 'failed'];
27
+ const DESCRIPTION_ROWS = 5;
28
+ const MESSAGE_ROWS = 4;
29
+
30
+ function FieldLabel({ children }: { children: string }) {
31
+ return <span className="text-2xs font-bold tracking-widest text-doom-faint">{children}</span>;
32
+ }
33
+
34
+ function Field({ label, children }: { label: string; children: ReactNode }) {
35
+ return (
36
+ <div className="flex flex-col gap-1.5">
37
+ <FieldLabel>{label}</FieldLabel>
38
+ {children}
39
+ </div>
40
+ );
41
+ }
42
+
43
+ function ReadOnlyValue({ value, testId }: { value: string; testId: string }) {
44
+ return (
45
+ <span data-testid={testId} className="whitespace-pre-wrap break-words text-sm leading-relaxed text-doom-dim">
46
+ {value}
47
+ </span>
48
+ );
49
+ }
50
+
51
+ function TaskFacts({ task }: { task: WebTask }) {
52
+ return (
53
+ <div className="flex flex-wrap gap-5">
54
+ <Field label="STATUS">
55
+ <ReadOnlyValue testId="task-detail-status" value={task.status.replace('_', ' ')} />
56
+ </Field>
57
+ {task.activeForm ? (
58
+ <Field label="ACTIVE FORM">
59
+ <ReadOnlyValue testId="task-detail-active-form" value={task.activeForm} />
60
+ </Field>
61
+ ) : null}
62
+ {task.owner ? (
63
+ <Field label="OWNER">
64
+ <ReadOnlyValue testId="task-detail-owner" value={task.owner} />
65
+ </Field>
66
+ ) : null}
67
+ {task.delegation?.agent ? (
68
+ <Field label="DELEGATED TO">
69
+ <ReadOnlyValue
70
+ testId="task-detail-agent"
71
+ value={
72
+ task.delegation.state ? `${task.delegation.agent} · ${task.delegation.state}` : task.delegation.agent
73
+ }
74
+ />
75
+ </Field>
76
+ ) : null}
77
+ {task.blockedBy.length > 0 ? (
78
+ <Field label="BLOCKED BY">
79
+ <ReadOnlyValue testId="task-detail-blocked-by" value={task.blockedBy.map((id) => `#${id}`).join(', ')} />
80
+ </Field>
81
+ ) : null}
82
+ {task.updatedAt ? (
83
+ <Field label="UPDATED">
84
+ <ReadOnlyValue testId="task-detail-updated" value={task.updatedAt} />
85
+ </Field>
86
+ ) : null}
87
+ </div>
88
+ );
89
+ }
90
+
91
+ /**
92
+ * One task, read first and changed second. Every change leaves as a prompt the
93
+ * session can see, so the agent remains the only writer of task state.
94
+ */
95
+ export function TaskDetailDialog({
96
+ task,
97
+ sessionId,
98
+ mode: initialMode,
99
+ send,
100
+ onClose,
101
+ }: {
102
+ task: WebTask;
103
+ sessionId: string;
104
+ mode: TaskDialogMode;
105
+ send: SessionFrameSender;
106
+ onClose: () => void;
107
+ }) {
108
+ const [mode, setMode] = useState<TaskDialogMode>(initialMode);
109
+ const [draft, setDraft] = useState<TaskEditDraft>(() => taskEditDraft(task));
110
+ const [message, setMessage] = useState('');
111
+ const agent = task.delegation?.agent;
112
+
113
+ const submitEdit = (): void => {
114
+ if (requestTaskEdit(send, sessionId, task, draft)) onClose();
115
+ };
116
+ const submitMessage = (): void => {
117
+ if (!message.trim() || !agent) return;
118
+ requestTaskMessage(send, sessionId, task.id, agent, message);
119
+ onClose();
120
+ };
121
+
122
+ return (
123
+ <Dialog
124
+ open
125
+ onOpenChange={(open) => {
126
+ if (!open) onClose();
127
+ }}
128
+ >
129
+ <DialogContent width="lg" data-testid="task-detail-dialog" data-mode={mode} aria-describedby={undefined}>
130
+ <DialogHeader>
131
+ <div className="flex min-w-0 flex-col items-start gap-1 sm:flex-row sm:items-center sm:gap-2.5">
132
+ <span className="text-2xs text-doom-faint">task #{task.id}</span>
133
+ <DialogTitle data-testid="task-detail-title" className="max-w-full break-words">
134
+ {task.subject}
135
+ </DialogTitle>
136
+ </div>
137
+ </DialogHeader>
138
+ <DialogBody>
139
+ {mode === 'view' ? (
140
+ <>
141
+ <Field label="DESCRIPTION">
142
+ <ReadOnlyValue
143
+ testId="task-detail-description"
144
+ value={task.description ?? 'no description on this task'}
145
+ />
146
+ </Field>
147
+ <TaskFacts task={task} />
148
+ <DialogFooter>
149
+ <span className="min-w-0 flex-1" />
150
+ {agent ? (
151
+ <Button
152
+ variant="outline"
153
+ size="xs"
154
+ data-testid="task-detail-open-message"
155
+ onClick={() => setMode('message')}
156
+ >
157
+ message agent
158
+ </Button>
159
+ ) : null}
160
+ <Button variant="primary" size="xs" data-testid="task-detail-open-edit" onClick={() => setMode('edit')}>
161
+ edit
162
+ </Button>
163
+ </DialogFooter>
164
+ </>
165
+ ) : null}
166
+
167
+ {mode === 'edit' ? (
168
+ <>
169
+ <Field label="SUBJECT">
170
+ <Input
171
+ data-testid="task-detail-subject-input"
172
+ autoFocus
173
+ value={draft.subject}
174
+ onChange={(event) => setDraft({ ...draft, subject: event.target.value })}
175
+ />
176
+ </Field>
177
+ <Field label="DESCRIPTION">
178
+ <Textarea
179
+ data-testid="task-detail-description-input"
180
+ rows={DESCRIPTION_ROWS}
181
+ value={draft.description}
182
+ placeholder="what this task covers"
183
+ onChange={(event) => setDraft({ ...draft, description: event.target.value })}
184
+ />
185
+ </Field>
186
+ <Field label="STATUS">
187
+ <Select
188
+ value={draft.status}
189
+ onValueChange={(value) => setDraft({ ...draft, status: value as WebTaskStatus })}
190
+ >
191
+ <SelectTrigger
192
+ data-testid="task-detail-status-input"
193
+ className="h-7 w-full min-w-0 text-xs sm:min-w-[200px]"
194
+ >
195
+ <SelectValue />
196
+ </SelectTrigger>
197
+ <SelectContent>
198
+ {STATUS_CHOICES.map((status) => (
199
+ <SelectItem key={status} value={status}>
200
+ {status.replace('_', ' ')}
201
+ </SelectItem>
202
+ ))}
203
+ </SelectContent>
204
+ </Select>
205
+ </Field>
206
+ <DialogFooter className="flex-wrap sm:flex-nowrap">
207
+ <span className="w-full text-2xs text-doom-faint sm:w-auto">
208
+ saved as one prompt naming only the fields you changed
209
+ </span>
210
+ <span className="min-w-0 flex-1" />
211
+ <Button variant="outline" size="xs" data-testid="task-detail-cancel" onClick={onClose}>
212
+ cancel
213
+ </Button>
214
+ <Button variant="primary" size="xs" data-testid="task-detail-save" onClick={submitEdit}>
215
+ save
216
+ </Button>
217
+ </DialogFooter>
218
+ </>
219
+ ) : null}
220
+
221
+ {mode === 'message' && agent ? (
222
+ <>
223
+ <Field label={`MESSAGE TO ${agent.toUpperCase()}`}>
224
+ <Textarea
225
+ data-testid="task-detail-message-input"
226
+ autoFocus
227
+ rows={MESSAGE_ROWS}
228
+ value={message}
229
+ placeholder="guidance for the run working on this task"
230
+ onChange={(event) => setMessage(event.target.value)}
231
+ />
232
+ </Field>
233
+ <DialogFooter className="flex-wrap sm:flex-nowrap">
234
+ <span className="w-full text-2xs text-doom-faint sm:w-auto">
235
+ steers the run, it does not edit the task
236
+ </span>
237
+ <span className="min-w-0 flex-1" />
238
+ <Button variant="outline" size="xs" data-testid="task-detail-cancel" onClick={onClose}>
239
+ cancel
240
+ </Button>
241
+ <Button variant="primary" size="xs" data-testid="task-detail-send" onClick={submitMessage}>
242
+ send
243
+ </Button>
244
+ </DialogFooter>
245
+ </>
246
+ ) : null}
247
+ </DialogBody>
248
+ </DialogContent>
249
+ </Dialog>
250
+ );
251
+ }
@@ -0,0 +1,120 @@
1
+ import type { ToolMessageRenderProps } from '@agimon-ai/doompi-core/web';
2
+ import {
3
+ MessageItem,
4
+ MessageItemBody,
5
+ MessageItemHeader,
6
+ MessageItemStatus,
7
+ type StatusTone,
8
+ toolTone,
9
+ } from '@agimon-ai/doompi-web-components';
10
+
11
+ import {
12
+ STATUS_LABEL,
13
+ type TaskResultTone,
14
+ type TaskRow,
15
+ type TaskStatus,
16
+ taskCallView,
17
+ taskResultView,
18
+ } from '../lib/taskToolFormat';
19
+
20
+ const STATUS_TONE: Record<TaskStatus, string> = {
21
+ pending: 'text-doom-dim',
22
+ in_progress: 'text-doom-yellow',
23
+ completed: 'text-doom-green',
24
+ failed: 'text-doom-red',
25
+ deleted: 'text-doom-faint',
26
+ };
27
+
28
+ const RESULT_TONE: Record<TaskResultTone, StatusTone> = {
29
+ running: 'running',
30
+ ok: 'ok',
31
+ error: 'error',
32
+ warning: 'running',
33
+ };
34
+
35
+ /** One task row: status glyph, id, subject and chips on the left, the status label flushed right. */
36
+ function TaskRowLine({ row }: { row: TaskRow }) {
37
+ return (
38
+ <li data-testid="tool-result-task-row" data-task-id={row.id} className="flex items-baseline gap-2">
39
+ <span className={`shrink-0 ${STATUS_TONE[row.status]}`}>{row.glyph}</span>
40
+ <span className="shrink-0 text-doom-faint">#{row.id}</span>
41
+ <span
42
+ className={`min-w-0 flex-1 truncate ${row.closed ? 'text-doom-faint line-through' : row.status === 'in_progress' ? 'text-doom-blue' : 'text-doom-text'}`}
43
+ >
44
+ {row.subject}
45
+ {row.agent ? <span className="text-doom-faint"> [{row.agent}]</span> : null}
46
+ {row.activeForm ? <span className="text-doom-faint"> ({row.activeForm})</span> : null}
47
+ {row.blockedBy.length > 0 ? (
48
+ <span className="text-doom-faint"> ⛓ {row.blockedBy.map((id) => `#${id}`).join(',')}</span>
49
+ ) : null}
50
+ </span>
51
+ <span className={`shrink-0 ${STATUS_TONE[row.status]}`}>{STATUS_LABEL[row.status]}</span>
52
+ </li>
53
+ );
54
+ }
55
+
56
+ /**
57
+ * The task tool's timeline item: `glyph action subject` with the assignee or
58
+ * list filter in the header, as renderTaskCall shows it; the rows the action
59
+ * touched, then the batch or list summary, in the body, as renderTaskResult
60
+ * lays it out.
61
+ */
62
+ export function TaskToolMessage({ args, result, output, running, isError }: ToolMessageRenderProps) {
63
+ const call = taskCallView(args);
64
+ const collapsed = taskResultView({ details: result?.details, output, expanded: false, isPartial: running, isError });
65
+ const full = taskResultView({ details: result?.details, output, expanded: true, isPartial: running, isError });
66
+ const hidden = full.rows.length - collapsed.rows.length + (full.errorLines.length - collapsed.errorLines.length);
67
+ return (
68
+ <MessageItem tone={toolTone({ running, isError })} expandable={hidden > 0}>
69
+ {({ expanded }) => {
70
+ const view = expanded ? full : collapsed;
71
+ const empty = view.rows.length === 0 && view.errorLines.length === 0 && view.status === null;
72
+ return (
73
+ <>
74
+ <MessageItemHeader title="task">
75
+ <span data-testid="tool-call-task" className="flex min-w-0 flex-1 items-center gap-1.5">
76
+ <span className="shrink-0 text-doom-text">
77
+ {call.glyph} {call.action}
78
+ </span>
79
+ {call.subject ? (
80
+ <span
81
+ className={`min-w-0 truncate ${call.subjectTone === 'accent' ? 'text-doom-blue' : 'text-doom-dim'}`}
82
+ >
83
+ {call.subject}
84
+ </span>
85
+ ) : null}
86
+ {call.detail ? <span className="shrink-0 text-doom-faint">{call.detail}</span> : null}
87
+ </span>
88
+ </MessageItemHeader>
89
+ {empty ? null : (
90
+ <MessageItemBody data-testid="tool-result-task" className="flex flex-col gap-1">
91
+ {view.rows.length > 0 ? (
92
+ <ul className="flex flex-col gap-0.5">
93
+ {view.rows.map((row) => (
94
+ <TaskRowLine key={row.id} row={row} />
95
+ ))}
96
+ </ul>
97
+ ) : null}
98
+ {view.errorLines.length > 0 ? (
99
+ <pre className="whitespace-pre-wrap break-words font-mono text-doom-dim">
100
+ {view.errorLines.join('\n')}
101
+ </pre>
102
+ ) : null}
103
+ {!expanded && hidden > 0 ? <MessageItemStatus expands>{hidden} more</MessageItemStatus> : null}
104
+ {view.status ? (
105
+ <MessageItemStatus
106
+ data-testid="tool-result-task-status"
107
+ tone={RESULT_TONE[view.status.tone]}
108
+ glyph={view.status.glyph}
109
+ >
110
+ {view.status.text}
111
+ </MessageItemStatus>
112
+ ) : null}
113
+ </MessageItemBody>
114
+ )}
115
+ </>
116
+ );
117
+ }}
118
+ </MessageItem>
119
+ );
120
+ }
@@ -0,0 +1,200 @@
1
+ import type { WebPluginSlotProps } from '@agimon-ai/doompi-core/web';
2
+ import {
3
+ Button,
4
+ ChevronDownIcon,
5
+ ChevronRightIcon,
6
+ Dot,
7
+ DropdownMenu,
8
+ DropdownMenuContent,
9
+ DropdownMenuItem,
10
+ DropdownMenuTrigger,
11
+ EditIcon,
12
+ KebabIcon,
13
+ MessageIcon,
14
+ TrashIcon,
15
+ type DotTone,
16
+ } from '@agimon-ai/doompi-web-components';
17
+ import { useStore } from '@tanstack/react-store';
18
+ import { useState } from 'react';
19
+
20
+ import type { WebTask } from '../../types/webTasks';
21
+ import { requestTaskRemoval, tasks } from '../stores/tasksStore';
22
+ import { TaskDetailDialog, type TaskDialogMode } from './TaskDetailDialog';
23
+
24
+ const STATUS_TONE: Readonly<Record<WebTask['status'], DotTone>> = {
25
+ pending: 'muted',
26
+ in_progress: 'yellow',
27
+ completed: 'green',
28
+ failed: 'red',
29
+ deleted: 'muted',
30
+ };
31
+
32
+ interface DialogState {
33
+ taskId: number;
34
+ mode: TaskDialogMode;
35
+ }
36
+
37
+ function TaskRow({
38
+ task,
39
+ sessionId,
40
+ sendSessionFrame,
41
+ openDialog,
42
+ }: {
43
+ task: WebTask;
44
+ sessionId: string;
45
+ sendSessionFrame: WebPluginSlotProps['sendSessionFrame'];
46
+ openDialog: (mode: TaskDialogMode) => void;
47
+ }) {
48
+ const detail = task.status === 'in_progress' ? task.activeForm : task.description;
49
+ const agent = task.delegation?.agent;
50
+ return (
51
+ <div
52
+ data-testid={`activity-task-${task.id}`}
53
+ data-task-status={task.status}
54
+ className="flex flex-col gap-1 rounded-md px-1 py-1"
55
+ >
56
+ <div className="grid min-w-0 grid-cols-[auto_minmax(0,1fr)_auto_auto] items-center gap-x-1.5">
57
+ <Dot tone={STATUS_TONE[task.status]} pulse={task.status === 'in_progress'} />
58
+ <button
59
+ type="button"
60
+ data-testid={`activity-task-title-${task.id}`}
61
+ title={task.subject}
62
+ onClick={() => openDialog('view')}
63
+ className={`min-w-0 truncate text-left text-xs font-bold hover:underline ${task.status === 'failed' ? 'text-doom-red' : task.status === 'completed' ? 'text-doom-dim' : 'text-doom-hi'}`}
64
+ >
65
+ <span className="text-doom-faint">#{task.id}</span> {task.subject}
66
+ </button>
67
+ <span className="shrink-0 text-2xs text-doom-faint">{task.status.replace('_', ' ')}</span>
68
+ {task.status !== 'completed' && task.status !== 'deleted' ? (
69
+ <DropdownMenu>
70
+ <DropdownMenuTrigger asChild>
71
+ <Button
72
+ variant="ghost"
73
+ size="icon"
74
+ data-testid={`activity-task-menu-${task.id}`}
75
+ aria-label={`task #${task.id} actions`}
76
+ title={`task #${task.id} actions`}
77
+ className="self-center shrink-0 text-doom-faint hover:bg-doom-deep hover:text-doom-hi data-[state=open]:bg-doom-deep data-[state=open]:text-doom-hi"
78
+ >
79
+ <KebabIcon className="h-3 w-3" />
80
+ </Button>
81
+ </DropdownMenuTrigger>
82
+ <DropdownMenuContent data-testid={`activity-task-menu-list-${task.id}`}>
83
+ <DropdownMenuItem data-testid={`activity-task-edit-${task.id}`} onSelect={() => openDialog('edit')}>
84
+ <EditIcon className="h-3 w-3" />
85
+ Edit
86
+ </DropdownMenuItem>
87
+ {agent ? (
88
+ <DropdownMenuItem
89
+ data-testid={`activity-task-message-${task.id}`}
90
+ onSelect={() => openDialog('message')}
91
+ >
92
+ <MessageIcon className="h-3 w-3" />
93
+ Message agent
94
+ </DropdownMenuItem>
95
+ ) : null}
96
+ <DropdownMenuItem
97
+ variant="destructive"
98
+ data-testid={`activity-task-remove-${task.id}`}
99
+ onSelect={() => requestTaskRemoval(sendSessionFrame, sessionId, task.id)}
100
+ >
101
+ <TrashIcon className="h-3 w-3" />
102
+ Remove
103
+ </DropdownMenuItem>
104
+ </DropdownMenuContent>
105
+ </DropdownMenu>
106
+ ) : null}
107
+ </div>
108
+ {detail || agent || task.blockedBy.length > 0 ? (
109
+ <span className="truncate pl-3 text-2xs text-doom-faint">
110
+ {agent ? `[${agent}] ` : ''}
111
+ {detail ?? ''}
112
+ {task.blockedBy.length > 0 ? ` · blocked by ${task.blockedBy.map((id) => `#${id}`).join(', ')}` : ''}
113
+ </span>
114
+ ) : null}
115
+ </div>
116
+ );
117
+ }
118
+
119
+ /** Session task graph in the activity dock. Empty graphs have no cockpit presence. */
120
+ export function TasksActivitySection({ sessionId, sendSessionFrame }: WebPluginSlotProps) {
121
+ const sessionTasks = useStore(tasks.store, (state) => tasks.select(state, sessionId).tasks);
122
+ const [historyOpen, setHistoryOpen] = useState(false);
123
+ const [dialog, setDialog] = useState<DialogState>();
124
+ if (sessionId === null || sessionTasks.length === 0) return null;
125
+
126
+ const active = sessionTasks.filter((task) => task.status === 'pending' || task.status === 'in_progress');
127
+ const history = sessionTasks.filter((task) => task.status === 'completed' || task.status === 'failed');
128
+ const dialogTask = dialog ? sessionTasks.find((task) => task.id === dialog.taskId) : undefined;
129
+ return (
130
+ <section data-testid="activity-tasks" className="flex flex-col gap-2 border-b border-doom-border-soft px-3 py-3">
131
+ <div className="flex items-center gap-2 px-1">
132
+ <span
133
+ aria-hidden
134
+ className={
135
+ active.length > 0 ? 'animate-pulse text-sm font-bold text-doom-yellow' : 'text-sm font-bold text-doom-faint'
136
+ }
137
+ >
138
+ #
139
+ </span>
140
+ <span className="flex-1 text-sm font-bold text-doom-text">tasks</span>
141
+ <span className="text-2xs text-doom-faint">{active.length} active</span>
142
+ </div>
143
+ {active.length > 0 ? (
144
+ <div className="flex flex-col gap-0.5">
145
+ {active.map((task) => (
146
+ <TaskRow
147
+ key={task.id}
148
+ task={task}
149
+ sessionId={sessionId}
150
+ sendSessionFrame={sendSessionFrame}
151
+ openDialog={(mode) => setDialog({ taskId: task.id, mode })}
152
+ />
153
+ ))}
154
+ </div>
155
+ ) : null}
156
+ {history.length > 0 ? (
157
+ <div className="flex flex-col gap-0.5">
158
+ <Button
159
+ variant="ghost"
160
+ size="xs"
161
+ aria-expanded={historyOpen}
162
+ onClick={() => setHistoryOpen((open) => !open)}
163
+ className="justify-start gap-1.5 rounded-md px-1 py-0.5 hover:bg-doom-panel"
164
+ >
165
+ {historyOpen ? (
166
+ <ChevronDownIcon className="h-2.5 w-2.5 text-doom-faint" />
167
+ ) : (
168
+ <ChevronRightIcon className="h-2.5 w-2.5 text-doom-faint" />
169
+ )}
170
+ <span className="text-xs font-bold text-doom-dim">session</span>
171
+ <span className="text-2xs text-doom-faint">{history.length}</span>
172
+ </Button>
173
+ {historyOpen ? (
174
+ <div className="flex flex-col gap-0.5 pl-2">
175
+ {history.map((task) => (
176
+ <TaskRow
177
+ key={task.id}
178
+ task={task}
179
+ sessionId={sessionId}
180
+ sendSessionFrame={sendSessionFrame}
181
+ openDialog={(mode) => setDialog({ taskId: task.id, mode })}
182
+ />
183
+ ))}
184
+ </div>
185
+ ) : null}
186
+ </div>
187
+ ) : null}
188
+ {dialog && dialogTask ? (
189
+ <TaskDetailDialog
190
+ key={`${dialogTask.id}-${dialog.mode}`}
191
+ task={dialogTask}
192
+ sessionId={sessionId}
193
+ mode={dialog.mode}
194
+ send={sendSessionFrame}
195
+ onClose={() => setDialog(undefined)}
196
+ />
197
+ ) : null}
198
+ </section>
199
+ );
200
+ }