@jamesaphoenix/tx-core 0.8.1 → 0.9.2

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 (517) hide show
  1. package/dist/db.d.ts +6 -6
  2. package/dist/db.d.ts.map +1 -1
  3. package/dist/db.js +29 -2
  4. package/dist/db.js.map +1 -1
  5. package/dist/index.d.ts +8 -3
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +8 -3
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal/cycle-scan-service-impl.d.ts +28 -0
  10. package/dist/internal/cycle-scan-service-impl.d.ts.map +1 -0
  11. package/dist/internal/cycle-scan-service-impl.js +877 -0
  12. package/dist/internal/cycle-scan-service-impl.js.map +1 -0
  13. package/dist/internal/doc-service-impl.d.ts +42 -0
  14. package/dist/internal/doc-service-impl.d.ts.map +1 -0
  15. package/dist/internal/doc-service-impl.js +812 -0
  16. package/dist/internal/doc-service-impl.js.map +1 -0
  17. package/dist/internal/embedding-service-impl.d.ts +202 -0
  18. package/dist/internal/embedding-service-impl.d.ts.map +1 -0
  19. package/dist/internal/embedding-service-impl.js +466 -0
  20. package/dist/internal/embedding-service-impl.js.map +1 -0
  21. package/dist/internal/memory-service-impl.d.ts +49 -0
  22. package/dist/internal/memory-service-impl.d.ts.map +1 -0
  23. package/dist/internal/memory-service-impl.js +1061 -0
  24. package/dist/internal/memory-service-impl.js.map +1 -0
  25. package/dist/internal/spec-trace-service-impl.d.ts +50 -0
  26. package/dist/internal/spec-trace-service-impl.d.ts.map +1 -0
  27. package/dist/internal/spec-trace-service-impl.js +707 -0
  28. package/dist/internal/spec-trace-service-impl.js.map +1 -0
  29. package/dist/internal/sync/service-impl.d.ts +41 -0
  30. package/dist/internal/sync/service-impl.d.ts.map +1 -0
  31. package/dist/{services/sync-service.js → internal/sync/service-impl.js} +954 -499
  32. package/dist/internal/sync/service-impl.js.map +1 -0
  33. package/dist/layer.d.ts +8 -5
  34. package/dist/layer.d.ts.map +1 -1
  35. package/dist/layer.js +22 -10
  36. package/dist/layer.js.map +1 -1
  37. package/dist/mappers/anchor.d.ts.map +1 -1
  38. package/dist/mappers/anchor.js +5 -4
  39. package/dist/mappers/anchor.js.map +1 -1
  40. package/dist/mappers/attempt.d.ts.map +1 -1
  41. package/dist/mappers/attempt.js +2 -1
  42. package/dist/mappers/attempt.js.map +1 -1
  43. package/dist/mappers/candidate.d.ts.map +1 -1
  44. package/dist/mappers/candidate.js +2 -1
  45. package/dist/mappers/candidate.js.map +1 -1
  46. package/dist/mappers/claim.d.ts.map +1 -1
  47. package/dist/mappers/claim.js +2 -1
  48. package/dist/mappers/claim.js.map +1 -1
  49. package/dist/mappers/doc.d.ts.map +1 -1
  50. package/dist/mappers/doc.js +9 -8
  51. package/dist/mappers/doc.js.map +1 -1
  52. package/dist/mappers/edge.d.ts.map +1 -1
  53. package/dist/mappers/edge.js +4 -3
  54. package/dist/mappers/edge.js.map +1 -1
  55. package/dist/mappers/file-learning.d.ts.map +1 -1
  56. package/dist/mappers/file-learning.js +2 -1
  57. package/dist/mappers/file-learning.js.map +1 -1
  58. package/dist/mappers/index.d.ts +1 -0
  59. package/dist/mappers/index.d.ts.map +1 -1
  60. package/dist/mappers/index.js +2 -0
  61. package/dist/mappers/index.js.map +1 -1
  62. package/dist/mappers/learning.d.ts.map +1 -1
  63. package/dist/mappers/learning.js +4 -3
  64. package/dist/mappers/learning.js.map +1 -1
  65. package/dist/mappers/memory.d.ts.map +1 -1
  66. package/dist/mappers/memory.js +7 -6
  67. package/dist/mappers/memory.js.map +1 -1
  68. package/dist/mappers/orchestrator-state.d.ts.map +1 -1
  69. package/dist/mappers/orchestrator-state.js +2 -1
  70. package/dist/mappers/orchestrator-state.js.map +1 -1
  71. package/dist/mappers/pin.d.ts.map +1 -1
  72. package/dist/mappers/pin.js +2 -1
  73. package/dist/mappers/pin.js.map +1 -1
  74. package/dist/mappers/run.d.ts.map +1 -1
  75. package/dist/mappers/run.js +4 -3
  76. package/dist/mappers/run.js.map +1 -1
  77. package/dist/mappers/spec-trace.d.ts +11 -0
  78. package/dist/mappers/spec-trace.d.ts.map +1 -0
  79. package/dist/mappers/spec-trace.js +59 -0
  80. package/dist/mappers/spec-trace.js.map +1 -0
  81. package/dist/mappers/task.d.ts.map +1 -1
  82. package/dist/mappers/task.js +4 -4
  83. package/dist/mappers/task.js.map +1 -1
  84. package/dist/mappers/worker.d.ts.map +1 -1
  85. package/dist/mappers/worker.js +2 -1
  86. package/dist/mappers/worker.js.map +1 -1
  87. package/dist/migrations-embedded.d.ts.map +1 -1
  88. package/dist/migrations-embedded.js +15 -0
  89. package/dist/migrations-embedded.js.map +1 -1
  90. package/dist/repo/anchor-repo.d.ts +2 -2
  91. package/dist/repo/anchor-repo.d.ts.map +1 -1
  92. package/dist/repo/anchor-repo.js +18 -17
  93. package/dist/repo/anchor-repo.js.map +1 -1
  94. package/dist/repo/attempt-repo.d.ts.map +1 -1
  95. package/dist/repo/attempt-repo.js +11 -10
  96. package/dist/repo/attempt-repo.js.map +1 -1
  97. package/dist/repo/candidate-repo.d.ts.map +1 -1
  98. package/dist/repo/candidate-repo.js +8 -7
  99. package/dist/repo/candidate-repo.js.map +1 -1
  100. package/dist/repo/claim-repo.d.ts +4 -4
  101. package/dist/repo/claim-repo.d.ts.map +1 -1
  102. package/dist/repo/claim-repo.js +14 -13
  103. package/dist/repo/claim-repo.js.map +1 -1
  104. package/dist/repo/compaction-repo.d.ts +4 -4
  105. package/dist/repo/compaction-repo.d.ts.map +1 -1
  106. package/dist/repo/compaction-repo.js +7 -6
  107. package/dist/repo/compaction-repo.js.map +1 -1
  108. package/dist/repo/deduplication-repo.d.ts.map +1 -1
  109. package/dist/repo/deduplication-repo.js +80 -57
  110. package/dist/repo/deduplication-repo.js.map +1 -1
  111. package/dist/repo/dep-repo.d.ts.map +1 -1
  112. package/dist/repo/dep-repo.js +90 -88
  113. package/dist/repo/dep-repo.js.map +1 -1
  114. package/dist/repo/doc-repo.d.ts +2 -63
  115. package/dist/repo/doc-repo.d.ts.map +1 -1
  116. package/dist/repo/doc-repo.js +6 -4
  117. package/dist/repo/doc-repo.js.map +1 -1
  118. package/dist/repo/doc-repo.types.d.ts +64 -0
  119. package/dist/repo/doc-repo.types.d.ts.map +1 -0
  120. package/dist/repo/doc-repo.types.js +2 -0
  121. package/dist/repo/doc-repo.types.js.map +1 -0
  122. package/dist/repo/edge-repo.d.ts.map +1 -1
  123. package/dist/repo/edge-repo.js +91 -81
  124. package/dist/repo/edge-repo.js.map +1 -1
  125. package/dist/repo/file-learning-repo.d.ts.map +1 -1
  126. package/dist/repo/file-learning-repo.js +7 -6
  127. package/dist/repo/file-learning-repo.js.map +1 -1
  128. package/dist/repo/guard-repo.d.ts +4 -4
  129. package/dist/repo/guard-repo.d.ts.map +1 -1
  130. package/dist/repo/guard-repo.js +8 -7
  131. package/dist/repo/guard-repo.js.map +1 -1
  132. package/dist/repo/index.d.ts +1 -0
  133. package/dist/repo/index.d.ts.map +1 -1
  134. package/dist/repo/index.js +1 -0
  135. package/dist/repo/index.js.map +1 -1
  136. package/dist/repo/label-repo.d.ts +4 -4
  137. package/dist/repo/label-repo.d.ts.map +1 -1
  138. package/dist/repo/label-repo.js +9 -8
  139. package/dist/repo/label-repo.js.map +1 -1
  140. package/dist/repo/learning-repo.d.ts +2 -2
  141. package/dist/repo/learning-repo.d.ts.map +1 -1
  142. package/dist/repo/learning-repo.js +37 -31
  143. package/dist/repo/learning-repo.js.map +1 -1
  144. package/dist/repo/memory-repo/document.d.ts +4 -0
  145. package/dist/repo/memory-repo/document.d.ts.map +1 -0
  146. package/dist/repo/memory-repo/document.js +205 -0
  147. package/dist/repo/memory-repo/document.js.map +1 -0
  148. package/dist/repo/memory-repo/link.d.ts +4 -0
  149. package/dist/repo/memory-repo/link.d.ts.map +1 -0
  150. package/dist/repo/memory-repo/link.js +124 -0
  151. package/dist/repo/memory-repo/link.js.map +1 -0
  152. package/dist/repo/memory-repo/property.d.ts +4 -0
  153. package/dist/repo/memory-repo/property.d.ts.map +1 -0
  154. package/dist/repo/memory-repo/property.js +56 -0
  155. package/dist/repo/memory-repo/property.js.map +1 -0
  156. package/dist/repo/memory-repo/shared.d.ts +28 -0
  157. package/dist/repo/memory-repo/shared.d.ts.map +1 -0
  158. package/dist/repo/memory-repo/shared.js +63 -0
  159. package/dist/repo/memory-repo/shared.js.map +1 -0
  160. package/dist/repo/memory-repo/source.d.ts +4 -0
  161. package/dist/repo/memory-repo/source.d.ts.map +1 -0
  162. package/dist/repo/memory-repo/source.js +58 -0
  163. package/dist/repo/memory-repo/source.js.map +1 -0
  164. package/dist/repo/memory-repo.d.ts +14 -10
  165. package/dist/repo/memory-repo.d.ts.map +1 -1
  166. package/dist/repo/memory-repo.js +8 -527
  167. package/dist/repo/memory-repo.js.map +1 -1
  168. package/dist/repo/message-repo.d.ts.map +1 -1
  169. package/dist/repo/message-repo.js +9 -8
  170. package/dist/repo/message-repo.js.map +1 -1
  171. package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
  172. package/dist/repo/orchestrator-state-repo.js +2 -1
  173. package/dist/repo/orchestrator-state-repo.js.map +1 -1
  174. package/dist/repo/pin-repo.d.ts.map +1 -1
  175. package/dist/repo/pin-repo.js +5 -4
  176. package/dist/repo/pin-repo.js.map +1 -1
  177. package/dist/repo/run-repo.d.ts.map +1 -1
  178. package/dist/repo/run-repo.js +11 -10
  179. package/dist/repo/run-repo.js.map +1 -1
  180. package/dist/repo/spec-trace-repo.d.ts +9 -0
  181. package/dist/repo/spec-trace-repo.d.ts.map +1 -0
  182. package/dist/repo/spec-trace-repo.filter.d.ts +3 -0
  183. package/dist/repo/spec-trace-repo.filter.d.ts.map +1 -0
  184. package/dist/repo/spec-trace-repo.filter.js +13 -0
  185. package/dist/repo/spec-trace-repo.filter.js.map +1 -0
  186. package/dist/repo/spec-trace-repo.js +323 -0
  187. package/dist/repo/spec-trace-repo.js.map +1 -0
  188. package/dist/repo/spec-trace-repo.types.d.ts +60 -0
  189. package/dist/repo/spec-trace-repo.types.d.ts.map +1 -0
  190. package/dist/repo/spec-trace-repo.types.js +2 -0
  191. package/dist/repo/spec-trace-repo.types.js.map +1 -0
  192. package/dist/repo/task-repo/factory.d.ts +4 -0
  193. package/dist/repo/task-repo/factory.d.ts.map +1 -0
  194. package/dist/repo/task-repo/factory.js +7 -0
  195. package/dist/repo/task-repo/factory.js.map +1 -0
  196. package/dist/repo/task-repo/read.d.ts +6 -0
  197. package/dist/repo/task-repo/read.d.ts.map +1 -0
  198. package/dist/repo/task-repo/read.js +332 -0
  199. package/dist/repo/task-repo/read.js.map +1 -0
  200. package/dist/repo/task-repo/shared.d.ts +10 -0
  201. package/dist/repo/task-repo/shared.d.ts.map +1 -0
  202. package/dist/repo/task-repo/shared.js +29 -0
  203. package/dist/repo/task-repo/shared.js.map +1 -0
  204. package/dist/repo/task-repo/write.d.ts +6 -0
  205. package/dist/repo/task-repo/write.d.ts.map +1 -0
  206. package/dist/repo/task-repo/write.js +182 -0
  207. package/dist/repo/task-repo/write.js.map +1 -0
  208. package/dist/repo/task-repo.d.ts +5 -4
  209. package/dist/repo/task-repo.d.ts.map +1 -1
  210. package/dist/repo/task-repo.js +2 -520
  211. package/dist/repo/task-repo.js.map +1 -1
  212. package/dist/repo/tracked-project-repo.d.ts.map +1 -1
  213. package/dist/repo/tracked-project-repo.js +6 -5
  214. package/dist/repo/tracked-project-repo.js.map +1 -1
  215. package/dist/repo/worker-repo.d.ts.map +1 -1
  216. package/dist/repo/worker-repo.js +60 -47
  217. package/dist/repo/worker-repo.js.map +1 -1
  218. package/dist/schemas/index.d.ts +4 -2
  219. package/dist/schemas/index.d.ts.map +1 -1
  220. package/dist/schemas/index.js +2 -1
  221. package/dist/schemas/index.js.map +1 -1
  222. package/dist/schemas/sync-events.d.ts +25 -0
  223. package/dist/schemas/sync-events.d.ts.map +1 -0
  224. package/dist/schemas/sync-events.js +23 -0
  225. package/dist/schemas/sync-events.js.map +1 -0
  226. package/dist/schemas/sync.d.ts +20 -10
  227. package/dist/schemas/sync.d.ts.map +1 -1
  228. package/dist/schemas/sync.js +10 -4
  229. package/dist/schemas/sync.js.map +1 -1
  230. package/dist/services/agent-service.d.ts +4 -4
  231. package/dist/services/agent-service.d.ts.map +1 -1
  232. package/dist/services/agent-service.js.map +1 -1
  233. package/dist/services/anchor/anchor-service-core-ops.d.ts +125 -0
  234. package/dist/services/anchor/anchor-service-core-ops.d.ts.map +1 -0
  235. package/dist/services/anchor/anchor-service-core-ops.js +41 -0
  236. package/dist/services/anchor/anchor-service-core-ops.js.map +1 -0
  237. package/dist/services/anchor/anchor-service-deps.d.ts +10 -0
  238. package/dist/services/anchor/anchor-service-deps.d.ts.map +1 -0
  239. package/dist/services/anchor/anchor-service-deps.js +2 -0
  240. package/dist/services/anchor/anchor-service-deps.js.map +1 -0
  241. package/dist/services/anchor/anchor-service-ops.d.ts +296 -0
  242. package/dist/services/anchor/anchor-service-ops.d.ts.map +1 -0
  243. package/dist/services/anchor/anchor-service-ops.js +9 -0
  244. package/dist/services/anchor/anchor-service-ops.js.map +1 -0
  245. package/dist/services/anchor/anchor-service-state-ops.d.ts +116 -0
  246. package/dist/services/anchor/anchor-service-state-ops.d.ts.map +1 -0
  247. package/dist/services/anchor/anchor-service-state-ops.js +150 -0
  248. package/dist/services/anchor/anchor-service-state-ops.js.map +1 -0
  249. package/dist/services/anchor/anchor-service-validation.d.ts +7 -0
  250. package/dist/services/anchor/anchor-service-validation.d.ts.map +1 -0
  251. package/dist/services/anchor/anchor-service-validation.js +114 -0
  252. package/dist/services/anchor/anchor-service-validation.js.map +1 -0
  253. package/dist/services/anchor/anchor-service-verification-ops.d.ts +71 -0
  254. package/dist/services/anchor/anchor-service-verification-ops.d.ts.map +1 -0
  255. package/dist/services/anchor/anchor-service-verification-ops.js +169 -0
  256. package/dist/services/anchor/anchor-service-verification-ops.js.map +1 -0
  257. package/dist/services/anchor/anchor-verification-batch.d.ts +12 -0
  258. package/dist/services/anchor/anchor-verification-batch.d.ts.map +1 -0
  259. package/dist/services/anchor/anchor-verification-batch.js +109 -0
  260. package/dist/services/anchor/anchor-verification-batch.js.map +1 -0
  261. package/dist/services/anchor/anchor-verification-single.d.ts +7 -0
  262. package/dist/services/anchor/anchor-verification-single.d.ts.map +1 -0
  263. package/dist/services/anchor/anchor-verification-single.js +407 -0
  264. package/dist/services/anchor/anchor-verification-single.js.map +1 -0
  265. package/dist/services/anchor/anchor-verification-utils.d.ts +19 -0
  266. package/dist/services/anchor/anchor-verification-utils.d.ts.map +1 -0
  267. package/dist/services/anchor/anchor-verification-utils.js +107 -0
  268. package/dist/services/anchor/anchor-verification-utils.js.map +1 -0
  269. package/dist/services/anchor-service.d.ts +12 -90
  270. package/dist/services/anchor-service.d.ts.map +1 -1
  271. package/dist/services/anchor-service.js +5 -530
  272. package/dist/services/anchor-service.js.map +1 -1
  273. package/dist/services/anchor-verification.d.ts +9 -60
  274. package/dist/services/anchor-verification.d.ts.map +1 -1
  275. package/dist/services/anchor-verification.js +5 -796
  276. package/dist/services/anchor-verification.js.map +1 -1
  277. package/dist/services/ast-grep-service/patterns.d.ts +90 -0
  278. package/dist/services/ast-grep-service/patterns.d.ts.map +1 -0
  279. package/dist/services/ast-grep-service/patterns.js +261 -0
  280. package/dist/services/ast-grep-service/patterns.js.map +1 -0
  281. package/dist/services/ast-grep-service.d.ts +2 -13
  282. package/dist/services/ast-grep-service.d.ts.map +1 -1
  283. package/dist/services/ast-grep-service.js +3 -261
  284. package/dist/services/ast-grep-service.js.map +1 -1
  285. package/dist/services/auto-sync-service.d.ts +3 -3
  286. package/dist/services/auto-sync-service.d.ts.map +1 -1
  287. package/dist/services/auto-sync-service.js +12 -13
  288. package/dist/services/auto-sync-service.js.map +1 -1
  289. package/dist/services/compaction-service.d.ts +6 -6
  290. package/dist/services/compaction-service.d.ts.map +1 -1
  291. package/dist/services/compaction-service.js +11 -7
  292. package/dist/services/compaction-service.js.map +1 -1
  293. package/dist/services/cycle-scan-service.d.ts +1 -27
  294. package/dist/services/cycle-scan-service.d.ts.map +1 -1
  295. package/dist/services/cycle-scan-service.js +1 -876
  296. package/dist/services/cycle-scan-service.js.map +1 -1
  297. package/dist/services/daemon-service/process.d.ts +93 -0
  298. package/dist/services/daemon-service/process.d.ts.map +1 -0
  299. package/dist/services/daemon-service/process.js +325 -0
  300. package/dist/services/daemon-service/process.js.map +1 -0
  301. package/dist/services/daemon-service/templates.d.ts +88 -0
  302. package/dist/services/daemon-service/templates.d.ts.map +1 -0
  303. package/dist/services/daemon-service/templates.js +119 -0
  304. package/dist/services/daemon-service/templates.js.map +1 -0
  305. package/dist/services/daemon-service.d.ts +8 -160
  306. package/dist/services/daemon-service.d.ts.map +1 -1
  307. package/dist/services/daemon-service.js +4 -440
  308. package/dist/services/daemon-service.js.map +1 -1
  309. package/dist/services/doc-service.d.ts +1 -41
  310. package/dist/services/doc-service.d.ts.map +1 -1
  311. package/dist/services/doc-service.js +1 -780
  312. package/dist/services/doc-service.js.map +1 -1
  313. package/dist/services/edge-service.d.ts +6 -6
  314. package/dist/services/edge-service.d.ts.map +1 -1
  315. package/dist/services/edge-service.js.map +1 -1
  316. package/dist/services/embedding-service.d.ts +1 -201
  317. package/dist/services/embedding-service.d.ts.map +1 -1
  318. package/dist/services/embedding-service.js +1 -465
  319. package/dist/services/embedding-service.js.map +1 -1
  320. package/dist/services/feedback-tracker.d.ts +2 -2
  321. package/dist/services/feedback-tracker.d.ts.map +1 -1
  322. package/dist/services/feedback-tracker.js.map +1 -1
  323. package/dist/services/file-watcher-service/shared.d.ts +76 -0
  324. package/dist/services/file-watcher-service/shared.d.ts.map +1 -0
  325. package/dist/services/file-watcher-service/shared.js +43 -0
  326. package/dist/services/file-watcher-service/shared.js.map +1 -0
  327. package/dist/services/file-watcher-service.d.ts +2 -42
  328. package/dist/services/file-watcher-service.d.ts.map +1 -1
  329. package/dist/services/file-watcher-service.js +1 -46
  330. package/dist/services/file-watcher-service.js.map +1 -1
  331. package/dist/services/graph-expansion/from-files.d.ts +14 -0
  332. package/dist/services/graph-expansion/from-files.d.ts.map +1 -0
  333. package/dist/services/graph-expansion/from-files.js +187 -0
  334. package/dist/services/graph-expansion/from-files.js.map +1 -0
  335. package/dist/services/graph-expansion/live.d.ts +11 -0
  336. package/dist/services/graph-expansion/live.d.ts.map +1 -0
  337. package/dist/services/graph-expansion/live.js +263 -0
  338. package/dist/services/graph-expansion/live.js.map +1 -0
  339. package/dist/services/graph-expansion.d.ts +17 -20
  340. package/dist/services/graph-expansion.d.ts.map +1 -1
  341. package/dist/services/graph-expansion.js +2 -439
  342. package/dist/services/graph-expansion.js.map +1 -1
  343. package/dist/services/guard-service.d.ts +2 -2
  344. package/dist/services/guard-service.d.ts.map +1 -1
  345. package/dist/services/guard-service.js.map +1 -1
  346. package/dist/services/index.d.ts +3 -1
  347. package/dist/services/index.d.ts.map +1 -1
  348. package/dist/services/index.js +3 -1
  349. package/dist/services/index.js.map +1 -1
  350. package/dist/services/learning-service.d.ts +4 -4
  351. package/dist/services/learning-service.d.ts.map +1 -1
  352. package/dist/services/learning-service.js.map +1 -1
  353. package/dist/services/llm-service.d.ts +4 -4
  354. package/dist/services/llm-service.d.ts.map +1 -1
  355. package/dist/services/llm-service.js.map +1 -1
  356. package/dist/services/memory-retriever-service.d.ts.map +1 -1
  357. package/dist/services/memory-retriever-service.js.map +1 -1
  358. package/dist/services/memory-service.d.ts +1 -48
  359. package/dist/services/memory-service.d.ts.map +1 -1
  360. package/dist/services/memory-service.js +1 -1060
  361. package/dist/services/memory-service.js.map +1 -1
  362. package/dist/services/migration-service.d.ts +6 -6
  363. package/dist/services/migration-service.d.ts.map +1 -1
  364. package/dist/services/migration-service.js +6 -2
  365. package/dist/services/migration-service.js.map +1 -1
  366. package/dist/services/orchestrator-service.d.ts +2 -2
  367. package/dist/services/orchestrator-service.d.ts.map +1 -1
  368. package/dist/services/orchestrator-service.js.map +1 -1
  369. package/dist/services/pin-service.d.ts.map +1 -1
  370. package/dist/services/pin-service.js +21 -28
  371. package/dist/services/pin-service.js.map +1 -1
  372. package/dist/services/promotion-service.d.ts +4 -4
  373. package/dist/services/promotion-service.d.ts.map +1 -1
  374. package/dist/services/promotion-service.js.map +1 -1
  375. package/dist/services/query-expansion-service.d.ts +2 -2
  376. package/dist/services/query-expansion-service.d.ts.map +1 -1
  377. package/dist/services/query-expansion-service.js.map +1 -1
  378. package/dist/services/reflect-service.d.ts +6 -6
  379. package/dist/services/reflect-service.d.ts.map +1 -1
  380. package/dist/services/reflect-service.js.map +1 -1
  381. package/dist/services/reranker-service.d.ts +2 -2
  382. package/dist/services/reranker-service.d.ts.map +1 -1
  383. package/dist/services/reranker-service.js.map +1 -1
  384. package/dist/services/retriever-scoring.d.ts +52 -0
  385. package/dist/services/retriever-scoring.d.ts.map +1 -0
  386. package/dist/services/retriever-scoring.js +146 -0
  387. package/dist/services/retriever-scoring.js.map +1 -0
  388. package/dist/services/retriever-service.d.ts.map +1 -1
  389. package/dist/services/retriever-service.js +1 -191
  390. package/dist/services/retriever-service.js.map +1 -1
  391. package/dist/services/run-heartbeat-service.d.ts +10 -10
  392. package/dist/services/run-heartbeat-service.d.ts.map +1 -1
  393. package/dist/services/run-heartbeat-service.js.map +1 -1
  394. package/dist/services/score-service.d.ts +2 -2
  395. package/dist/services/score-service.d.ts.map +1 -1
  396. package/dist/services/score-service.js.map +1 -1
  397. package/dist/services/spec-trace-service.d.ts +2 -0
  398. package/dist/services/spec-trace-service.d.ts.map +1 -0
  399. package/dist/services/spec-trace-service.js +2 -0
  400. package/dist/services/spec-trace-service.js.map +1 -0
  401. package/dist/services/stream-service.d.ts +31 -0
  402. package/dist/services/stream-service.d.ts.map +1 -0
  403. package/dist/services/stream-service.js +162 -0
  404. package/dist/services/stream-service.js.map +1 -0
  405. package/dist/services/swarm-verification/shared.d.ts +71 -0
  406. package/dist/services/swarm-verification/shared.d.ts.map +1 -0
  407. package/dist/services/swarm-verification/shared.js +108 -0
  408. package/dist/services/swarm-verification/shared.js.map +1 -0
  409. package/dist/services/swarm-verification.d.ts +4 -68
  410. package/dist/services/swarm-verification.d.ts.map +1 -1
  411. package/dist/services/swarm-verification.js +2 -122
  412. package/dist/services/swarm-verification.js.map +1 -1
  413. package/dist/services/sync/converters.d.ts +63 -0
  414. package/dist/services/sync/converters.d.ts.map +1 -0
  415. package/dist/services/sync/converters.js +253 -0
  416. package/dist/services/sync/converters.js.map +1 -0
  417. package/dist/services/sync/entity-export.d.ts +22 -0
  418. package/dist/services/sync/entity-export.d.ts.map +1 -0
  419. package/dist/services/sync/entity-export.js +15 -0
  420. package/dist/services/sync/entity-export.js.map +1 -0
  421. package/dist/services/sync/entity-import.d.ts +22 -0
  422. package/dist/services/sync/entity-import.d.ts.map +1 -0
  423. package/dist/services/sync/entity-import.js +15 -0
  424. package/dist/services/sync/entity-import.js.map +1 -0
  425. package/dist/services/sync/file-utils.d.ts +23 -0
  426. package/dist/services/sync/file-utils.d.ts.map +1 -0
  427. package/dist/services/sync/file-utils.js +97 -0
  428. package/dist/services/sync/file-utils.js.map +1 -0
  429. package/dist/services/sync/index.d.ts +3 -0
  430. package/dist/services/sync/index.d.ts.map +1 -0
  431. package/dist/services/sync/index.js +2 -0
  432. package/dist/services/sync/index.js.map +1 -0
  433. package/dist/services/sync/service.d.ts +2 -0
  434. package/dist/services/sync/service.d.ts.map +1 -0
  435. package/dist/services/sync/service.js +2 -0
  436. package/dist/services/sync/service.js.map +1 -0
  437. package/dist/services/sync/sync-helpers.d.ts +54 -0
  438. package/dist/services/sync/sync-helpers.d.ts.map +1 -0
  439. package/dist/services/sync/sync-helpers.js +245 -0
  440. package/dist/services/sync/sync-helpers.js.map +1 -0
  441. package/dist/services/sync/types.d.ts +104 -0
  442. package/dist/services/sync/types.d.ts.map +1 -0
  443. package/dist/services/sync/types.js +5 -0
  444. package/dist/services/sync/types.js.map +1 -0
  445. package/dist/services/task-service/internals.d.ts +36 -0
  446. package/dist/services/task-service/internals.d.ts.map +1 -0
  447. package/dist/services/task-service/internals.js +270 -0
  448. package/dist/services/task-service/internals.js.map +1 -0
  449. package/dist/services/task-service.d.ts +2 -1
  450. package/dist/services/task-service.d.ts.map +1 -1
  451. package/dist/services/task-service.js +28 -236
  452. package/dist/services/task-service.js.map +1 -1
  453. package/dist/services/tracing-service.d.ts +2 -2
  454. package/dist/services/tracing-service.d.ts.map +1 -1
  455. package/dist/services/tracing-service.js.map +1 -1
  456. package/dist/services/transcript-adapter.d.ts +6 -6
  457. package/dist/services/transcript-adapter.d.ts.map +1 -1
  458. package/dist/services/transcript-adapter.js +3 -8
  459. package/dist/services/transcript-adapter.js.map +1 -1
  460. package/dist/services/validation-service.d.ts +8 -8
  461. package/dist/services/validation-service.d.ts.map +1 -1
  462. package/dist/services/validation-service.js.map +1 -1
  463. package/dist/services/verify-service.d.ts +2 -2
  464. package/dist/services/verify-service.d.ts.map +1 -1
  465. package/dist/services/verify-service.js.map +1 -1
  466. package/dist/services/worker-process/runtime.d.ts +51 -0
  467. package/dist/services/worker-process/runtime.d.ts.map +1 -0
  468. package/dist/services/worker-process/runtime.js +150 -0
  469. package/dist/services/worker-process/runtime.js.map +1 -0
  470. package/dist/services/worker-process.d.ts +3 -18
  471. package/dist/services/worker-process.d.ts.map +1 -1
  472. package/dist/services/worker-process.js +3 -173
  473. package/dist/services/worker-process.js.map +1 -1
  474. package/dist/services/worker-service.d.ts +6 -6
  475. package/dist/services/worker-service.d.ts.map +1 -1
  476. package/dist/services/worker-service.js.map +1 -1
  477. package/dist/utils/db-result.d.ts +14 -0
  478. package/dist/utils/db-result.d.ts.map +1 -0
  479. package/dist/utils/db-result.js +37 -0
  480. package/dist/utils/db-result.js.map +1 -0
  481. package/dist/utils/doc-renderer.d.ts +10 -10
  482. package/dist/utils/doc-renderer.d.ts.map +1 -1
  483. package/dist/utils/doc-renderer.js.map +1 -1
  484. package/dist/utils/ears-validator.d.ts +2 -2
  485. package/dist/utils/ears-validator.d.ts.map +1 -1
  486. package/dist/utils/ears-validator.js.map +1 -1
  487. package/dist/utils/file-path.d.ts +27 -0
  488. package/dist/utils/file-path.d.ts.map +1 -0
  489. package/dist/utils/file-path.js +77 -0
  490. package/dist/utils/file-path.js.map +1 -0
  491. package/dist/utils/glob.d.ts +2 -11
  492. package/dist/utils/glob.d.ts.map +1 -1
  493. package/dist/utils/glob.js +22 -13
  494. package/dist/utils/glob.js.map +1 -1
  495. package/dist/utils/spec-discovery.d.ts +34 -0
  496. package/dist/utils/spec-discovery.d.ts.map +1 -0
  497. package/dist/utils/spec-discovery.js +344 -0
  498. package/dist/utils/spec-discovery.js.map +1 -0
  499. package/dist/utils/toml-config.d.ts +7 -2
  500. package/dist/utils/toml-config.d.ts.map +1 -1
  501. package/dist/utils/toml-config.js +106 -2
  502. package/dist/utils/toml-config.js.map +1 -1
  503. package/dist/utils/ulid.d.ts +8 -0
  504. package/dist/utils/ulid.d.ts.map +1 -0
  505. package/dist/utils/ulid.js +30 -0
  506. package/dist/utils/ulid.js.map +1 -0
  507. package/dist/worker/hooks.d.ts +10 -10
  508. package/dist/worker/hooks.d.ts.map +1 -1
  509. package/dist/worker/run-worker.d.ts.map +1 -1
  510. package/dist/worker/run-worker.js.map +1 -1
  511. package/migrations/033_sync_events.sql +33 -0
  512. package/migrations/034_spec_test_traceability.sql +51 -0
  513. package/migrations/035_anchor_schema_repair.sql +82 -0
  514. package/package.json +4 -3
  515. package/dist/services/sync-service.d.ts +0 -247
  516. package/dist/services/sync-service.d.ts.map +0 -1
  517. package/dist/services/sync-service.js.map +0 -1
@@ -0,0 +1,270 @@
1
+ import { Effect } from "effect";
2
+ import { GuardExceededError } from "../../errors.js";
3
+ import { isValidTaskId } from "@jamesaphoenix/tx-types";
4
+ /**
5
+ * Max recursion depth for destructive operations that must find ALL descendants.
6
+ * Bounded to avoid unbounded CTE recursion in SQLite while being deep enough
7
+ * for any realistic task hierarchy (display default is 10).
8
+ */
9
+ export const CASCADE_MAX_DEPTH = 1000;
10
+ const GATE_PIN_PREFIX = "gate.";
11
+ const isRecord = (value) => value !== null && typeof value === "object";
12
+ const parseGateLinkedTaskId = (content) => {
13
+ try {
14
+ const parsed = JSON.parse(content);
15
+ if (!isRecord(parsed))
16
+ return null;
17
+ const taskId = parsed.taskId;
18
+ if (typeof taskId !== "string" || !isValidTaskId(taskId))
19
+ return null;
20
+ return taskId;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ };
26
+ export const listGateTaskLinks = (pinRepo) => Effect.gen(function* () {
27
+ const pins = yield* pinRepo.findAll();
28
+ const taskLinks = new Map();
29
+ for (const pin of pins) {
30
+ if (!pin.id.startsWith(GATE_PIN_PREFIX))
31
+ continue;
32
+ const taskId = parseGateLinkedTaskId(pin.content);
33
+ if (!taskId)
34
+ continue;
35
+ const linkedPins = taskLinks.get(taskId) ?? [];
36
+ linkedPins.push(pin.id);
37
+ taskLinks.set(taskId, linkedPins);
38
+ }
39
+ return taskLinks;
40
+ });
41
+ /**
42
+ * Check guards before task creation. Returns advisory warnings (empty array if none).
43
+ * Advisory mode logs warnings to stderr and returns them for metadata injection;
44
+ * enforce mode fails with GuardExceededError.
45
+ */
46
+ export const checkGuards = (guardRepo, config, parentId) => Effect.gen(function* () {
47
+ const warnings = [];
48
+ // Defensive: if config.guard is undefined (malformed config), skip guard checks
49
+ if (!config?.guard)
50
+ return warnings;
51
+ // Resolve effective guard: DB row takes precedence, fall back to config defaults
52
+ const dbGuard = yield* guardRepo.findByScope("global");
53
+ const globalGuard = dbGuard
54
+ ? { maxPending: dbGuard.maxPending, maxChildren: dbGuard.maxChildren, maxDepth: dbGuard.maxDepth, enforce: dbGuard.enforce }
55
+ : (config.guard.maxPending !== null || config.guard.maxChildren !== null || config.guard.maxDepth !== null)
56
+ ? { maxPending: config.guard.maxPending, maxChildren: config.guard.maxChildren, maxDepth: config.guard.maxDepth, enforce: config.guard.mode === "enforce" }
57
+ : null;
58
+ if (globalGuard) {
59
+ // DB row's enforce setting takes precedence; config only applies when no DB row exists
60
+ const enforce = globalGuard.enforce;
61
+ // Check max_pending
62
+ if (globalGuard.maxPending !== null) {
63
+ const pending = yield* guardRepo.countPending();
64
+ if (pending >= globalGuard.maxPending) {
65
+ const msg = `${pending}/${globalGuard.maxPending} pending tasks (global limit)`;
66
+ if (enforce) {
67
+ return yield* Effect.fail(new GuardExceededError({
68
+ scope: "global", metric: "max_pending", current: pending, limit: globalGuard.maxPending,
69
+ }));
70
+ }
71
+ console.error(`\u26A0 Guard warning: ${msg}`);
72
+ warnings.push(msg);
73
+ }
74
+ }
75
+ // Check max_depth (only relevant when creating under a parent)
76
+ if (globalGuard.maxDepth !== null && parentId) {
77
+ const depth = yield* guardRepo.getMaxDepth(parentId);
78
+ const newDepth = depth + 1;
79
+ if (newDepth > globalGuard.maxDepth) {
80
+ const msg = `depth ${newDepth}/${globalGuard.maxDepth} (global limit)`;
81
+ if (enforce) {
82
+ return yield* Effect.fail(new GuardExceededError({
83
+ scope: "global", metric: "max_depth", current: newDepth, limit: globalGuard.maxDepth,
84
+ }));
85
+ }
86
+ console.error(`\u26A0 Guard warning: ${msg}`);
87
+ warnings.push(msg);
88
+ }
89
+ }
90
+ // Check max_children (only relevant when creating under a parent)
91
+ if (globalGuard.maxChildren !== null && parentId) {
92
+ const children = yield* guardRepo.countChildrenOf(parentId);
93
+ if (children >= globalGuard.maxChildren) {
94
+ const msg = `${children}/${globalGuard.maxChildren} children of ${parentId} (global limit)`;
95
+ if (enforce) {
96
+ return yield* Effect.fail(new GuardExceededError({
97
+ scope: "global", metric: "max_children", current: children, limit: globalGuard.maxChildren,
98
+ }));
99
+ }
100
+ console.error(`\u26A0 Guard warning: ${msg}`);
101
+ warnings.push(msg);
102
+ }
103
+ }
104
+ }
105
+ // Check parent-specific guard (independent of global guard)
106
+ if (parentId) {
107
+ const parentGuard = yield* guardRepo.findByScope(`parent:${parentId}`);
108
+ if (parentGuard?.maxChildren !== null && parentGuard?.maxChildren !== undefined) {
109
+ const children = yield* guardRepo.countChildrenOf(parentId);
110
+ const parentEnforce = parentGuard.enforce;
111
+ if (children >= parentGuard.maxChildren) {
112
+ const msg = `${children}/${parentGuard.maxChildren} children of ${parentId} (parent scope)`;
113
+ if (parentEnforce) {
114
+ return yield* Effect.fail(new GuardExceededError({
115
+ scope: `parent:${parentId}`, metric: "max_children", current: children, limit: parentGuard.maxChildren,
116
+ }));
117
+ }
118
+ console.error(`\u26A0 Guard warning: ${msg}`);
119
+ warnings.push(msg);
120
+ }
121
+ }
122
+ }
123
+ return warnings;
124
+ });
125
+ const isWorkableStatus = (status) => ["backlog", "ready", "planning", "active"].includes(status);
126
+ export const enrichWithDeps = (deps, task) => Effect.gen(function* () {
127
+ const blockerIds = yield* deps.depRepo.getBlockerIds(task.id);
128
+ const blockingIds = yield* deps.depRepo.getBlockingIds(task.id);
129
+ const childIds = yield* deps.taskRepo.getChildIds(task.id);
130
+ const directContextMap = yield* deps.taskRepo.getGroupContextForMany([task.id]);
131
+ const effectiveContextMap = yield* deps.taskRepo.resolveEffectiveGroupContextForMany([task.id]);
132
+ let isReady = isWorkableStatus(task.status);
133
+ if (isReady && blockerIds.length > 0) {
134
+ const blockers = yield* deps.taskRepo.findByIds(blockerIds);
135
+ isReady = blockers.every(b => b.status === "done");
136
+ }
137
+ const effective = effectiveContextMap.get(task.id);
138
+ return {
139
+ ...task,
140
+ blockedBy: blockerIds,
141
+ blocks: blockingIds,
142
+ children: childIds,
143
+ isReady,
144
+ groupContext: directContextMap.get(task.id) ?? null,
145
+ effectiveGroupContext: effective?.context ?? null,
146
+ effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
147
+ };
148
+ });
149
+ export const enrichWithDepsBatch = (deps, tasks) => Effect.gen(function* () {
150
+ if (tasks.length === 0)
151
+ return [];
152
+ const taskIds = tasks.map(t => t.id);
153
+ // Batch fetch all dependency info (3 queries total instead of 3N)
154
+ const blockerIdsMap = yield* deps.depRepo.getBlockerIdsForMany(taskIds);
155
+ const blockingIdsMap = yield* deps.depRepo.getBlockingIdsForMany(taskIds);
156
+ const childIdsMap = yield* deps.taskRepo.getChildIdsForMany(taskIds);
157
+ const directContextMap = yield* deps.taskRepo.getGroupContextForMany(taskIds);
158
+ const effectiveContextMap = yield* deps.taskRepo.resolveEffectiveGroupContextForMany(taskIds);
159
+ // Collect all unique blocker IDs to fetch their status
160
+ const allBlockerIds = new Set();
161
+ for (const blockerIds of blockerIdsMap.values()) {
162
+ for (const id of blockerIds) {
163
+ allBlockerIds.add(id);
164
+ }
165
+ }
166
+ // Fetch all blocker tasks to check their status (1 query instead of N)
167
+ const blockerTasks = allBlockerIds.size > 0
168
+ ? yield* deps.taskRepo.findByIds([...allBlockerIds])
169
+ : [];
170
+ const blockerStatusMap = new Map();
171
+ for (const t of blockerTasks) {
172
+ blockerStatusMap.set(t.id, t.status);
173
+ }
174
+ // Build TaskWithDeps for each task
175
+ const results = [];
176
+ for (const task of tasks) {
177
+ const blockerIds = blockerIdsMap.get(task.id) ?? [];
178
+ const blockingIds = blockingIdsMap.get(task.id) ?? [];
179
+ const childIds = childIdsMap.get(task.id) ?? [];
180
+ // Compute isReady
181
+ let isReady = isWorkableStatus(task.status);
182
+ if (isReady && blockerIds.length > 0) {
183
+ isReady = blockerIds.every(bid => blockerStatusMap.get(bid) === "done");
184
+ }
185
+ const effective = effectiveContextMap.get(task.id);
186
+ results.push({
187
+ ...task,
188
+ blockedBy: blockerIds,
189
+ blocks: blockingIds,
190
+ children: childIds,
191
+ isReady,
192
+ groupContext: directContextMap.get(task.id) ?? null,
193
+ effectiveGroupContext: effective?.context ?? null,
194
+ effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
195
+ });
196
+ }
197
+ return results;
198
+ });
199
+ /**
200
+ * Auto-complete parent task when all children are done.
201
+ * Optimized to use batch queries instead of N+1 recursive queries.
202
+ */
203
+ export const autoCompleteParent = (taskRepo, parentId, now, options) => Effect.gen(function* () {
204
+ // 1. Get all ancestors in one query (recursive CTE)
205
+ const ancestors = yield* taskRepo.getAncestorChain(parentId);
206
+ if (ancestors.length === 0)
207
+ return;
208
+ // Filter out already-done ancestors (nothing to auto-complete)
209
+ const pendingAncestors = ancestors.filter(a => a.status !== "done");
210
+ if (pendingAncestors.length === 0)
211
+ return;
212
+ // 2. Batch get all children for all pending ancestors (1 query)
213
+ const ancestorIds = pendingAncestors.map(a => a.id);
214
+ const childIdsMap = yield* taskRepo.getChildIdsForMany(ancestorIds);
215
+ // 3. Collect all unique child IDs and batch fetch them (1 query)
216
+ const allChildIds = new Set();
217
+ for (const childIds of childIdsMap.values()) {
218
+ for (const id of childIds) {
219
+ allChildIds.add(id);
220
+ }
221
+ }
222
+ const childTasks = allChildIds.size > 0
223
+ ? yield* taskRepo.findByIds([...allChildIds])
224
+ : [];
225
+ // Build status map for quick lookups
226
+ const childStatusMap = new Map();
227
+ for (const child of childTasks) {
228
+ childStatusMap.set(child.id, child.status);
229
+ }
230
+ // 4. Process ancestors in order (parent -> grandparent -> ...)
231
+ // Track which ones should be auto-completed
232
+ const toComplete = [];
233
+ const nowCompletedIds = new Set();
234
+ const blockedTaskIds = options?.blockedTaskIds;
235
+ for (const ancestor of pendingAncestors) {
236
+ if (blockedTaskIds?.has(ancestor.id)) {
237
+ break;
238
+ }
239
+ const childIds = childIdsMap.get(ancestor.id) ?? [];
240
+ if (childIds.length === 0)
241
+ continue;
242
+ // Check if all children are done
243
+ // Include children we're about to mark as done in this pass
244
+ const allChildrenDone = childIds.every(childId => {
245
+ if (nowCompletedIds.has(childId))
246
+ return true;
247
+ return childStatusMap.get(childId) === "done";
248
+ });
249
+ if (allChildrenDone) {
250
+ // Mark for completion
251
+ toComplete.push({
252
+ ...ancestor,
253
+ status: "done",
254
+ updatedAt: now,
255
+ completedAt: now
256
+ });
257
+ // Track so parent levels can see this ancestor is now done
258
+ nowCompletedIds.add(ancestor.id);
259
+ }
260
+ else {
261
+ // If this ancestor can't be completed, neither can its ancestors
262
+ break;
263
+ }
264
+ }
265
+ // 5. Batch update all auto-completed ancestors (1 transaction)
266
+ if (toComplete.length > 0) {
267
+ yield* taskRepo.updateMany(toComplete);
268
+ }
269
+ });
270
+ //# sourceMappingURL=internals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internals.js","sourceRoot":"","sources":["../../../src/services/task-service/internals.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { Context, Effect, Layer } from "effect";
2
2
  import { TaskRepository } from "../repo/task-repo.js";
3
3
  import { DependencyRepository } from "../repo/dep-repo.js";
4
4
  import { GuardRepository } from "../repo/guard-repo.js";
5
+ import { PinRepository } from "../repo/pin-repo.js";
5
6
  import { TaskNotFoundError, ValidationError, DatabaseError, GuardExceededError, StaleDataError, HasChildrenError } from "../errors.js";
6
7
  import type { Task, TaskId, TaskStatus, TaskWithDeps, TaskFilter, CreateTaskInput, UpdateTaskInput } from "@jamesaphoenix/tx-types";
7
8
  declare const TaskService_base: Context.TagClass<TaskService, "TaskService", {
@@ -24,6 +25,6 @@ declare const TaskService_base: Context.TagClass<TaskService, "TaskService", {
24
25
  }>;
25
26
  export declare class TaskService extends TaskService_base {
26
27
  }
27
- export declare const TaskServiceLive: Layer.Layer<TaskService, never, TaskRepository | DependencyRepository | GuardRepository>;
28
+ export declare const TaskServiceLive: Layer.Layer<TaskService, never, TaskRepository | DependencyRepository | GuardRepository | PinRepository>;
28
29
  export {};
29
30
  //# sourceMappingURL=task-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-service.d.ts","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAItI,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAoB,MAAM,yBAAyB,CAAA;;qBAKhI,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,GAAG,kBAAkB,CAAC;kBACxG,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAAC;0BAC9D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,CAAC;+BACzE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;qBAC3F,CACf,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,KACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;8BACpE,CACxB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,CAAC;gCACzD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,CAAC;0BACpF,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;qBAClI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAC;mBAC5H,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;2BAC9D,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;oBACrF,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AArBjF,qBAAa,WAAY,SAAQ,gBAuB9B;CAAG;AAuIN,eAAO,MAAM,eAAe,0FAqf3B,CAAA"}
1
+ {"version":3,"file":"task-service.d.ts","sourceRoot":"","sources":["../../src/services/task-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAKtI,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAoB,MAAM,yBAAyB,CAAA;;qBAKhI,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,GAAG,kBAAkB,CAAC;kBACxG,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAAC;0BAC9D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,CAAC;+BACzE,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;qBAC3F,CACf,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,eAAe,EACtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,KACpC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;8BACpE,CACxB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,CAAC;gCACzD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,iBAAiB,GAAG,aAAa,CAAC;0BACpF,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,GAAG,cAAc,CAAC;qBAClI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,aAAa,CAAC;mBAC5H,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;2BAC9D,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;oBACrF,CAAC,MAAM,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AArBjF,qBAAa,WAAY,SAAQ,gBAuB9B;CAAG;AA2BN,eAAO,MAAM,eAAe,0GAwW3B,CAAA"}
@@ -2,10 +2,12 @@ import { Context, Effect, Layer } from "effect";
2
2
  import { TaskRepository } from "../repo/task-repo.js";
3
3
  import { DependencyRepository } from "../repo/dep-repo.js";
4
4
  import { GuardRepository } from "../repo/guard-repo.js";
5
- import { TaskNotFoundError, ValidationError, DatabaseError, GuardExceededError, HasChildrenError } from "../errors.js";
5
+ import { PinRepository } from "../repo/pin-repo.js";
6
+ import { TaskNotFoundError, ValidationError, DatabaseError, HasChildrenError } from "../errors.js";
6
7
  import { generateTaskId, isUniqueConstraintError } from "../id.js";
7
8
  import { isValidTransition, isValidStatus } from "../mappers/task.js";
8
9
  import { readTxConfig } from "../utils/toml-config.js";
10
+ import { CASCADE_MAX_DEPTH, autoCompleteParent, checkGuards, enrichWithDeps, enrichWithDepsBatch, listGateTaskLinks } from "./task-service/internals.js";
9
11
  export class TaskService extends Context.Tag("TaskService")() {
10
12
  }
11
13
  /**
@@ -21,241 +23,13 @@ const trimVisible = (s) => s.replace(/^[\s\p{Cf}]+|[\s\p{Cf}]+$/gu, "");
21
23
  /** Strips null bytes (\0) which cause C API truncation, JSON issues, and terminal corruption. */
22
24
  const stripNullBytes = (s) => s.replace(/\0/g, "");
23
25
  const isValidAssigneeType = (assigneeType) => assigneeType === undefined || assigneeType === null || assigneeType === "human" || assigneeType === "agent";
24
- /** Max recursion depth for destructive operations that must find ALL descendants.
25
- * Bounded to avoid unbounded CTE recursion in SQLite while being deep enough
26
- * for any realistic task hierarchy (display default is 10). */
27
- const CASCADE_MAX_DEPTH = 1000;
28
26
  const GROUP_CONTEXT_MAX_CHARS = 20_000;
29
- /**
30
- * Check guards before task creation. Returns advisory warnings (empty array if none).
31
- * Advisory mode logs warnings to stderr and returns them for metadata injection;
32
- * enforce mode fails with GuardExceededError.
33
- */
34
- const checkGuards = (guardRepo, config, parentId) => Effect.gen(function* () {
35
- const warnings = [];
36
- // Defensive: if config.guard is undefined (malformed config), skip guard checks
37
- if (!config?.guard)
38
- return warnings;
39
- // Resolve effective guard: DB row takes precedence, fall back to config defaults
40
- const dbGuard = yield* guardRepo.findByScope("global");
41
- const globalGuard = dbGuard
42
- ? { maxPending: dbGuard.maxPending, maxChildren: dbGuard.maxChildren, maxDepth: dbGuard.maxDepth, enforce: dbGuard.enforce }
43
- : (config.guard.maxPending !== null || config.guard.maxChildren !== null || config.guard.maxDepth !== null)
44
- ? { maxPending: config.guard.maxPending, maxChildren: config.guard.maxChildren, maxDepth: config.guard.maxDepth, enforce: config.guard.mode === "enforce" }
45
- : null;
46
- if (globalGuard) {
47
- // DB row's enforce setting takes precedence; config only applies when no DB row exists
48
- const enforce = globalGuard.enforce;
49
- // Check max_pending
50
- if (globalGuard.maxPending !== null) {
51
- const pending = yield* guardRepo.countPending();
52
- if (pending >= globalGuard.maxPending) {
53
- const msg = `${pending}/${globalGuard.maxPending} pending tasks (global limit)`;
54
- if (enforce) {
55
- return yield* Effect.fail(new GuardExceededError({
56
- scope: "global", metric: "max_pending", current: pending, limit: globalGuard.maxPending,
57
- }));
58
- }
59
- console.error(`\u26A0 Guard warning: ${msg}`);
60
- warnings.push(msg);
61
- }
62
- }
63
- // Check max_depth (only relevant when creating under a parent)
64
- if (globalGuard.maxDepth !== null && parentId) {
65
- const depth = yield* guardRepo.getMaxDepth(parentId);
66
- const newDepth = depth + 1;
67
- if (newDepth > globalGuard.maxDepth) {
68
- const msg = `depth ${newDepth}/${globalGuard.maxDepth} (global limit)`;
69
- if (enforce) {
70
- return yield* Effect.fail(new GuardExceededError({
71
- scope: "global", metric: "max_depth", current: newDepth, limit: globalGuard.maxDepth,
72
- }));
73
- }
74
- console.error(`\u26A0 Guard warning: ${msg}`);
75
- warnings.push(msg);
76
- }
77
- }
78
- // Check max_children (only relevant when creating under a parent)
79
- if (globalGuard.maxChildren !== null && parentId) {
80
- const children = yield* guardRepo.countChildrenOf(parentId);
81
- if (children >= globalGuard.maxChildren) {
82
- const msg = `${children}/${globalGuard.maxChildren} children of ${parentId} (global limit)`;
83
- if (enforce) {
84
- return yield* Effect.fail(new GuardExceededError({
85
- scope: "global", metric: "max_children", current: children, limit: globalGuard.maxChildren,
86
- }));
87
- }
88
- console.error(`\u26A0 Guard warning: ${msg}`);
89
- warnings.push(msg);
90
- }
91
- }
92
- }
93
- // Check parent-specific guard (independent of global guard)
94
- if (parentId) {
95
- const parentGuard = yield* guardRepo.findByScope(`parent:${parentId}`);
96
- if (parentGuard?.maxChildren !== null && parentGuard?.maxChildren !== undefined) {
97
- const children = yield* guardRepo.countChildrenOf(parentId);
98
- const parentEnforce = parentGuard.enforce;
99
- if (children >= parentGuard.maxChildren) {
100
- const msg = `${children}/${parentGuard.maxChildren} children of ${parentId} (parent scope)`;
101
- if (parentEnforce) {
102
- return yield* Effect.fail(new GuardExceededError({
103
- scope: `parent:${parentId}`, metric: "max_children", current: children, limit: parentGuard.maxChildren,
104
- }));
105
- }
106
- console.error(`\u26A0 Guard warning: ${msg}`);
107
- warnings.push(msg);
108
- }
109
- }
110
- }
111
- return warnings;
112
- });
113
27
  export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* () {
114
28
  const taskRepo = yield* TaskRepository;
115
29
  const depRepo = yield* DependencyRepository;
116
30
  const guardRepo = yield* GuardRepository;
31
+ const pinRepo = yield* PinRepository;
117
32
  const config = readTxConfig();
118
- const enrichWithDeps = (task) => Effect.gen(function* () {
119
- const blockerIds = yield* depRepo.getBlockerIds(task.id);
120
- const blockingIds = yield* depRepo.getBlockingIds(task.id);
121
- const childIds = yield* taskRepo.getChildIds(task.id);
122
- const directContextMap = yield* taskRepo.getGroupContextForMany([task.id]);
123
- const effectiveContextMap = yield* taskRepo.resolveEffectiveGroupContextForMany([task.id]);
124
- let isReady = ["backlog", "ready", "planning", "active"].includes(task.status);
125
- if (isReady && blockerIds.length > 0) {
126
- const blockers = yield* taskRepo.findByIds(blockerIds);
127
- isReady = blockers.every(b => b.status === "done");
128
- }
129
- const effective = effectiveContextMap.get(task.id);
130
- return {
131
- ...task,
132
- blockedBy: blockerIds,
133
- blocks: blockingIds,
134
- children: childIds,
135
- isReady,
136
- groupContext: directContextMap.get(task.id) ?? null,
137
- effectiveGroupContext: effective?.context ?? null,
138
- effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
139
- };
140
- });
141
- // Batch version of enrichWithDeps - avoids N+1 queries
142
- const enrichWithDepsBatch = (tasks) => Effect.gen(function* () {
143
- if (tasks.length === 0)
144
- return [];
145
- const taskIds = tasks.map(t => t.id);
146
- // Batch fetch all dependency info (3 queries total instead of 3N)
147
- const blockerIdsMap = yield* depRepo.getBlockerIdsForMany(taskIds);
148
- const blockingIdsMap = yield* depRepo.getBlockingIdsForMany(taskIds);
149
- const childIdsMap = yield* taskRepo.getChildIdsForMany(taskIds);
150
- const directContextMap = yield* taskRepo.getGroupContextForMany(taskIds);
151
- const effectiveContextMap = yield* taskRepo.resolveEffectiveGroupContextForMany(taskIds);
152
- // Collect all unique blocker IDs to fetch their status
153
- const allBlockerIds = new Set();
154
- for (const blockerIds of blockerIdsMap.values()) {
155
- for (const id of blockerIds) {
156
- allBlockerIds.add(id);
157
- }
158
- }
159
- // Fetch all blocker tasks to check their status (1 query instead of N)
160
- const blockerTasks = allBlockerIds.size > 0
161
- ? yield* taskRepo.findByIds([...allBlockerIds])
162
- : [];
163
- const blockerStatusMap = new Map();
164
- for (const t of blockerTasks) {
165
- blockerStatusMap.set(t.id, t.status);
166
- }
167
- // Build TaskWithDeps for each task
168
- const results = [];
169
- for (const task of tasks) {
170
- const blockerIds = blockerIdsMap.get(task.id) ?? [];
171
- const blockingIds = blockingIdsMap.get(task.id) ?? [];
172
- const childIds = childIdsMap.get(task.id) ?? [];
173
- // Compute isReady
174
- let isReady = ["backlog", "ready", "planning", "active"].includes(task.status);
175
- if (isReady && blockerIds.length > 0) {
176
- isReady = blockerIds.every(bid => blockerStatusMap.get(bid) === "done");
177
- }
178
- const effective = effectiveContextMap.get(task.id);
179
- results.push({
180
- ...task,
181
- blockedBy: blockerIds,
182
- blocks: blockingIds,
183
- children: childIds,
184
- isReady,
185
- groupContext: directContextMap.get(task.id) ?? null,
186
- effectiveGroupContext: effective?.context ?? null,
187
- effectiveGroupContextSourceTaskId: effective?.sourceTaskId ?? null
188
- });
189
- }
190
- return results;
191
- });
192
- // Auto-complete parent task when all children are done
193
- // Optimized to use batch queries instead of N+1 recursive queries
194
- // Old implementation: 3-4 queries per hierarchy level (40+ for deep trees)
195
- // New implementation: 3 queries total + 1 batch update
196
- const autoCompleteParent = (parentId, now) => Effect.gen(function* () {
197
- // 1. Get all ancestors in one query (recursive CTE)
198
- const ancestors = yield* taskRepo.getAncestorChain(parentId);
199
- if (ancestors.length === 0)
200
- return;
201
- // Filter out already-done ancestors (nothing to auto-complete)
202
- const pendingAncestors = ancestors.filter(a => a.status !== "done");
203
- if (pendingAncestors.length === 0)
204
- return;
205
- // 2. Batch get all children for all pending ancestors (1 query)
206
- const ancestorIds = pendingAncestors.map(a => a.id);
207
- const childIdsMap = yield* taskRepo.getChildIdsForMany(ancestorIds);
208
- // 3. Collect all unique child IDs and batch fetch them (1 query)
209
- const allChildIds = new Set();
210
- for (const childIds of childIdsMap.values()) {
211
- for (const id of childIds) {
212
- allChildIds.add(id);
213
- }
214
- }
215
- const childTasks = allChildIds.size > 0
216
- ? yield* taskRepo.findByIds([...allChildIds])
217
- : [];
218
- // Build status map for quick lookups
219
- const childStatusMap = new Map();
220
- for (const child of childTasks) {
221
- childStatusMap.set(child.id, child.status);
222
- }
223
- // 4. Process ancestors in order (parent -> grandparent -> ...)
224
- // Track which ones should be auto-completed
225
- const toComplete = [];
226
- const nowCompletedIds = new Set();
227
- for (const ancestor of pendingAncestors) {
228
- const childIds = childIdsMap.get(ancestor.id) ?? [];
229
- if (childIds.length === 0)
230
- continue;
231
- // Check if all children are done
232
- // Include children we're about to mark as done in this pass
233
- const allChildrenDone = childIds.every(childId => {
234
- if (nowCompletedIds.has(childId))
235
- return true;
236
- return childStatusMap.get(childId) === "done";
237
- });
238
- if (allChildrenDone) {
239
- // Mark for completion
240
- toComplete.push({
241
- ...ancestor,
242
- status: "done",
243
- updatedAt: now,
244
- completedAt: now
245
- });
246
- // Track so parent levels can see this ancestor is now done
247
- nowCompletedIds.add(ancestor.id);
248
- }
249
- else {
250
- // If this ancestor can't be completed, neither can its ancestors
251
- break;
252
- }
253
- }
254
- // 5. Batch update all auto-completed ancestors (1 transaction)
255
- if (toComplete.length > 0) {
256
- yield* taskRepo.updateMany(toComplete);
257
- }
258
- });
259
33
  return {
260
34
  create: (input) => Effect.gen(function* () {
261
35
  const title = stripNullBytes(input.title);
@@ -333,13 +107,13 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
333
107
  if (!task) {
334
108
  return yield* Effect.fail(new TaskNotFoundError({ id }));
335
109
  }
336
- return yield* enrichWithDeps(task);
110
+ return yield* enrichWithDeps({ taskRepo, depRepo }, task);
337
111
  }),
338
112
  getWithDepsBatch: (ids) => Effect.gen(function* () {
339
113
  if (ids.length === 0)
340
114
  return [];
341
115
  const tasks = yield* taskRepo.findByIds(ids);
342
- return yield* enrichWithDepsBatch(tasks);
116
+ return yield* enrichWithDepsBatch({ taskRepo, depRepo }, tasks);
343
117
  }),
344
118
  update: (id, input, options) => Effect.gen(function* () {
345
119
  const existing = yield* taskRepo.findById(id);
@@ -392,6 +166,12 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
392
166
  const now = new Date();
393
167
  const actor = options?.actor ?? "agent";
394
168
  const isDone = input.status === "done" && existing.status !== "done";
169
+ const shouldBlockAgentDoneForPinnedTasks = isDone &&
170
+ actor === "agent" &&
171
+ config.pins.blockAgentDoneWhenTaskIdPresent;
172
+ const linkedGatePins = shouldBlockAgentDoneForPinnedTasks
173
+ ? yield* listGateTaskLinks(pinRepo)
174
+ : new Map();
395
175
  if (isDone && actor === "agent") {
396
176
  const childIds = yield* taskRepo.getChildIds(id);
397
177
  if (childIds.length > 0) {
@@ -406,6 +186,14 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
406
186
  }
407
187
  }
408
188
  }
189
+ if (shouldBlockAgentDoneForPinnedTasks) {
190
+ const blockingGateIds = linkedGatePins.get(id);
191
+ if (blockingGateIds && blockingGateIds.length > 0) {
192
+ return yield* Effect.fail(new ValidationError({
193
+ reason: `Agent cannot mark task ${id} done because it is linked by gate pin(s): ${blockingGateIds.join(", ")}`
194
+ }));
195
+ }
196
+ }
409
197
  const assigneeTypeChanged = input.assigneeType !== undefined && input.assigneeType !== existing.assigneeType;
410
198
  const assigneeIdChanged = input.assigneeId !== undefined && input.assigneeId !== existing.assigneeId;
411
199
  let nextAssigneeType = input.assigneeType !== undefined ? input.assigneeType : existing.assigneeType;
@@ -438,7 +226,11 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
438
226
  yield* taskRepo.update(updated, existing.updatedAt);
439
227
  // Auto-complete parent if all children are done
440
228
  if (isDone && updated.parentId) {
441
- yield* autoCompleteParent(updated.parentId, now);
229
+ yield* autoCompleteParent(taskRepo, updated.parentId, now, {
230
+ blockedTaskIds: shouldBlockAgentDoneForPinnedTasks
231
+ ? new Set(linkedGatePins.keys())
232
+ : undefined
233
+ });
442
234
  }
443
235
  return updated;
444
236
  }),
@@ -460,7 +252,7 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
460
252
  if (!task) {
461
253
  return yield* Effect.fail(new TaskNotFoundError({ id }));
462
254
  }
463
- return yield* enrichWithDeps(task);
255
+ return yield* enrichWithDeps({ taskRepo, depRepo }, task);
464
256
  }),
465
257
  clearGroupContext: (id) => Effect.gen(function* () {
466
258
  yield* taskRepo.clearGroupContext(id);
@@ -468,7 +260,7 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
468
260
  if (!task) {
469
261
  return yield* Effect.fail(new TaskNotFoundError({ id }));
470
262
  }
471
- return yield* enrichWithDeps(task);
263
+ return yield* enrichWithDeps({ taskRepo, depRepo }, task);
472
264
  }),
473
265
  forceStatus: (id, status) => Effect.gen(function* () {
474
266
  const existing = yield* taskRepo.findById(id);
@@ -523,7 +315,7 @@ export const TaskServiceLive = Layer.effect(TaskService, Effect.gen(function* ()
523
315
  list: (filter) => taskRepo.findAll(filter),
524
316
  listWithDeps: (filter) => Effect.gen(function* () {
525
317
  const tasks = yield* taskRepo.findAll(filter);
526
- return yield* enrichWithDepsBatch(tasks);
318
+ return yield* enrichWithDepsBatch({ taskRepo, depRepo }, tasks);
527
319
  }),
528
320
  count: (filter) => taskRepo.count(filter)
529
321
  };