@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,707 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { resolve } from "node:path";
3
+ import { XMLParser, XMLValidator } from "fast-xml-parser";
4
+ import { SpecTraceRepository } from "../repo/spec-trace-repo.js";
5
+ import { DocService } from "../services/doc-service.js";
6
+ import { ValidationError } from "../errors.js";
7
+ import { defaultSpecTestPatterns, discoverSpecTests } from "../utils/spec-discovery.js";
8
+ import { readTxConfig } from "../utils/toml-config.js";
9
+ import { toNormalizedRelativePath } from "../utils/file-path.js";
10
+ const MAX_RUN_DETAILS_LENGTH = 20_000;
11
+ export const SPEC_BATCH_MAX_BYTES = 5 * 1024 * 1024;
12
+ export const SPEC_BATCH_MAX_RECORDS = 50_000;
13
+ const normalizeDetails = (value) => {
14
+ if (typeof value !== "string")
15
+ return null;
16
+ if (value.length <= MAX_RUN_DETAILS_LENGTH)
17
+ return value;
18
+ return value.slice(0, MAX_RUN_DETAILS_LENGTH);
19
+ };
20
+ const extractTestNameFromCanonicalId = (testId) => {
21
+ const splitAt = testId.lastIndexOf("::");
22
+ if (splitAt < 0)
23
+ return null;
24
+ const name = testId.slice(splitAt + 2).trim();
25
+ return name.length > 0 ? name : null;
26
+ };
27
+ const toCanonicalTestId = (testFile, testName) => {
28
+ const name = testName && testName.trim().length > 0 ? testName.trim() : "manual";
29
+ return `${testFile}::${name}`;
30
+ };
31
+ const resolveSignoffScope = (filter) => {
32
+ const doc = filter?.doc?.trim();
33
+ const subsystem = filter?.subsystem?.trim();
34
+ if (doc && subsystem)
35
+ return null;
36
+ if (doc)
37
+ return { scopeType: "doc", scopeValue: doc };
38
+ if (subsystem)
39
+ return { scopeType: "subsystem", scopeValue: subsystem };
40
+ return { scopeType: "global", scopeValue: null };
41
+ };
42
+ const classifyInvariants = (params) => {
43
+ const { invariants, testsByInvariant, latestRunBySpecTestId } = params;
44
+ let covered = 0;
45
+ let uncovered = 0;
46
+ let passing = 0;
47
+ let failing = 0;
48
+ let untested = 0;
49
+ for (const invariant of invariants) {
50
+ const tests = testsByInvariant.get(invariant.id) ?? [];
51
+ if (tests.length === 0) {
52
+ uncovered += 1;
53
+ continue;
54
+ }
55
+ covered += 1;
56
+ const hasFailure = tests.some((test) => {
57
+ const latest = latestRunBySpecTestId.get(test.id);
58
+ return latest ? !latest.passed : false;
59
+ });
60
+ if (hasFailure) {
61
+ failing += 1;
62
+ continue;
63
+ }
64
+ const allPassed = tests.every((test) => {
65
+ const latest = latestRunBySpecTestId.get(test.id);
66
+ return latest ? latest.passed : false;
67
+ });
68
+ if (allPassed) {
69
+ passing += 1;
70
+ }
71
+ else {
72
+ untested += 1;
73
+ }
74
+ }
75
+ const total = invariants.length;
76
+ const fciRaw = total === 0 ? 0 : (passing / total) * 100;
77
+ return {
78
+ total,
79
+ covered,
80
+ uncovered,
81
+ passing,
82
+ failing,
83
+ untested,
84
+ fciRaw,
85
+ };
86
+ };
87
+ export class SpecTraceService extends Context.Tag("SpecTraceService")() {
88
+ }
89
+ export const SpecTraceServiceLive = Layer.effect(SpecTraceService, Effect.gen(function* () {
90
+ const repo = yield* SpecTraceRepository;
91
+ const docService = yield* DocService;
92
+ const resolveLinksForTestId = (testId) => Effect.gen(function* () {
93
+ const direct = yield* repo.findSpecTestsByTestId(testId);
94
+ if (direct.length > 0)
95
+ return direct;
96
+ const testName = extractTestNameFromCanonicalId(testId);
97
+ if (!testName)
98
+ return [];
99
+ const byName = yield* repo.findSpecTestsByTestName(testName);
100
+ // Only accept fallback when unambiguous.
101
+ return byName.length === 1 ? byName : [];
102
+ });
103
+ const computeFci = (filter) => Effect.gen(function* () {
104
+ const invariants = yield* repo.listActiveInvariants(filter);
105
+ const tests = yield* repo.findSpecTestsByInvariantIds(invariants.map((i) => i.id));
106
+ const testsByInvariant = new Map();
107
+ for (const test of tests) {
108
+ const current = testsByInvariant.get(test.invariantId) ?? [];
109
+ current.push(test);
110
+ testsByInvariant.set(test.invariantId, current);
111
+ }
112
+ const latestRuns = yield* repo.findLatestRunsBySpecTestIds(tests.map((t) => t.id));
113
+ const rollup = classifyInvariants({
114
+ invariants,
115
+ testsByInvariant,
116
+ latestRunBySpecTestId: latestRuns,
117
+ });
118
+ const fci = Number(rollup.fciRaw.toFixed(2));
119
+ let phase = fci < 100 ? "BUILD" : "HARDEN";
120
+ if (fci === 100) {
121
+ const signoffScope = resolveSignoffScope(filter);
122
+ if (signoffScope) {
123
+ const signoff = yield* repo.findSignoff(signoffScope.scopeType, signoffScope.scopeValue);
124
+ if (signoff) {
125
+ phase = "COMPLETE";
126
+ }
127
+ }
128
+ }
129
+ return {
130
+ total: rollup.total,
131
+ covered: rollup.covered,
132
+ uncovered: rollup.uncovered,
133
+ passing: rollup.passing,
134
+ failing: rollup.failing,
135
+ untested: rollup.untested,
136
+ fci,
137
+ phase,
138
+ };
139
+ });
140
+ return {
141
+ discover: (options) => Effect.gen(function* () {
142
+ const rootDir = resolve(options?.rootDir ?? process.cwd());
143
+ const config = readTxConfig(rootDir);
144
+ const patterns = options?.patterns ?? config.spec.testPatterns ?? defaultSpecTestPatterns();
145
+ if (patterns.length === 0) {
146
+ return yield* Effect.fail(new ValidationError({
147
+ reason: "No spec test patterns configured. Set [spec].test_patterns in .tx/config.toml",
148
+ }));
149
+ }
150
+ yield* docService.syncInvariants(options?.doc).pipe(Effect.catchTag("DocNotFoundError", (error) => Effect.fail(new ValidationError({
151
+ reason: `Document '${error.name}' not found while syncing invariants`,
152
+ }))));
153
+ const discovered = yield* Effect.tryPromise({
154
+ try: () => discoverSpecTests(rootDir, patterns),
155
+ catch: (cause) => new ValidationError({ reason: `Discovery failed: ${String(cause)}` }),
156
+ });
157
+ const activeInvariants = yield* repo.listActiveInvariants(options?.doc ? { doc: options.doc } : undefined);
158
+ const activeInvariantIds = activeInvariants.map((i) => i.id);
159
+ const activeSet = new Set(activeInvariantIds);
160
+ const validRows = discovered.discovered.filter((row) => activeSet.has(row.invariantId));
161
+ const persisted = yield* repo.syncDiscoveredSpecTests({
162
+ rows: validRows,
163
+ invariantIds: activeInvariantIds,
164
+ });
165
+ let tagLinks = 0;
166
+ let commentLinks = 0;
167
+ let manifestLinks = 0;
168
+ for (const row of validRows) {
169
+ if (row.discovery === "tag")
170
+ tagLinks += 1;
171
+ if (row.discovery === "comment")
172
+ commentLinks += 1;
173
+ if (row.discovery === "manifest")
174
+ manifestLinks += 1;
175
+ }
176
+ return {
177
+ scannedFiles: discovered.scannedFiles,
178
+ discoveredLinks: validRows.length,
179
+ upserted: persisted.upserted,
180
+ tagLinks,
181
+ commentLinks,
182
+ manifestLinks,
183
+ };
184
+ }),
185
+ link: (invariantId, testFile, testName, framework) => Effect.gen(function* () {
186
+ const rootDir = resolve(process.cwd());
187
+ const normalizedFile = toNormalizedRelativePath(rootDir, testFile);
188
+ const normalizedName = testName && testName.trim().length > 0 ? testName.trim() : null;
189
+ const testId = toCanonicalTestId(normalizedFile, normalizedName);
190
+ return yield* repo.upsertSpecTest({
191
+ invariantId,
192
+ testId,
193
+ testFile: normalizedFile,
194
+ testName: normalizedName,
195
+ framework: framework ?? null,
196
+ discovery: "manual",
197
+ });
198
+ }),
199
+ unlink: (invariantId, testId) => repo.deleteSpecTest(invariantId, testId),
200
+ testsForInvariant: (invariantId) => repo.findSpecTestsByInvariant(invariantId),
201
+ invariantsForTest: (testId) => Effect.gen(function* () {
202
+ const rows = yield* repo.findSpecTestsByTestId(testId);
203
+ return rows.map((row) => row.invariantId);
204
+ }),
205
+ uncoveredInvariants: (filter) => repo.listUncoveredInvariants(filter),
206
+ recordRun: (testId, passed, options) => Effect.gen(function* () {
207
+ const links = yield* resolveLinksForTestId(testId);
208
+ if (links.length === 0) {
209
+ return yield* Effect.fail(new ValidationError({
210
+ reason: `No spec test mapping found for testId '${testId}'`,
211
+ }));
212
+ }
213
+ const inserted = yield* repo.insertRunsBatch(links.map((link) => ({
214
+ specTestId: link.id,
215
+ passed,
216
+ durationMs: options?.durationMs,
217
+ details: normalizeDetails(options?.details),
218
+ runAt: options?.runAt,
219
+ })));
220
+ return {
221
+ received: 1,
222
+ recorded: inserted.length,
223
+ unmatched: [],
224
+ };
225
+ }),
226
+ recordBatchRun: (results, options) => Effect.gen(function* () {
227
+ if (results.length === 0) {
228
+ return {
229
+ received: 0,
230
+ recorded: 0,
231
+ unmatched: [],
232
+ };
233
+ }
234
+ const uniqueTestIds = [...new Set(results.map((row) => row.testId))];
235
+ const byTestId = yield* repo.findSpecTestsByTestIds(uniqueTestIds);
236
+ const byNameCache = new Map();
237
+ const unmatched = new Set();
238
+ const inserts = [];
239
+ for (const row of results) {
240
+ let links = byTestId.get(row.testId) ?? [];
241
+ if (links.length === 0) {
242
+ const testName = extractTestNameFromCanonicalId(row.testId);
243
+ if (testName) {
244
+ let cached = byNameCache.get(testName);
245
+ if (!cached) {
246
+ cached = yield* repo.findSpecTestsByTestName(testName);
247
+ byNameCache.set(testName, cached);
248
+ }
249
+ if (cached.length === 1) {
250
+ links = cached;
251
+ }
252
+ }
253
+ }
254
+ if (links.length === 0) {
255
+ unmatched.add(row.testId);
256
+ continue;
257
+ }
258
+ for (const link of links) {
259
+ inserts.push({
260
+ specTestId: link.id,
261
+ passed: row.passed,
262
+ durationMs: row.durationMs ?? null,
263
+ details: normalizeDetails(row.details ?? null),
264
+ runAt: options?.runAt,
265
+ });
266
+ }
267
+ }
268
+ const inserted = yield* repo.insertRunsBatch(inserts);
269
+ return {
270
+ received: results.length,
271
+ recorded: inserted.length,
272
+ unmatched: [...unmatched],
273
+ };
274
+ }),
275
+ fci: (filter) => computeFci(filter),
276
+ matrix: (filter) => Effect.gen(function* () {
277
+ const invariants = yield* repo.listActiveInvariants(filter);
278
+ const tests = yield* repo.findSpecTestsByInvariantIds(invariants.map((i) => i.id));
279
+ const latestRuns = yield* repo.findLatestRunsBySpecTestIds(tests.map((t) => t.id));
280
+ const testsByInvariant = new Map();
281
+ for (const test of tests) {
282
+ const latest = latestRuns.get(test.id);
283
+ const row = {
284
+ specTestId: test.id,
285
+ testId: test.testId,
286
+ testFile: test.testFile,
287
+ testName: test.testName,
288
+ framework: test.framework,
289
+ discovery: test.discovery,
290
+ latestRun: {
291
+ passed: latest ? latest.passed : null,
292
+ runAt: latest ? latest.runAt : null,
293
+ },
294
+ };
295
+ const current = testsByInvariant.get(test.invariantId) ?? [];
296
+ current.push(row);
297
+ testsByInvariant.set(test.invariantId, current);
298
+ }
299
+ const out = invariants.map((invariant) => ({
300
+ invariantId: invariant.id,
301
+ rule: invariant.rule,
302
+ subsystem: invariant.subsystem,
303
+ tests: (testsByInvariant.get(invariant.id) ?? []).sort((a, b) => a.testId.localeCompare(b.testId)),
304
+ }));
305
+ return out;
306
+ }),
307
+ complete: (filter, signedOffBy, notes) => Effect.gen(function* () {
308
+ const normalizedBy = signedOffBy.trim();
309
+ if (normalizedBy.length === 0) {
310
+ return yield* Effect.fail(new ValidationError({ reason: "signedOffBy is required" }));
311
+ }
312
+ const scope = resolveSignoffScope(filter);
313
+ if (!scope) {
314
+ return yield* Effect.fail(new ValidationError({
315
+ reason: "Sign-off scope must be global, --doc, or --subsystem (not both)",
316
+ }));
317
+ }
318
+ const result = yield* computeFci(filter);
319
+ if (result.phase !== "HARDEN") {
320
+ return yield* Effect.fail(new ValidationError({
321
+ reason: `Cannot complete scope while phase is ${result.phase} (must be HARDEN with FCI 100)`,
322
+ }));
323
+ }
324
+ return yield* repo.upsertSignoff(scope.scopeType, scope.scopeValue, normalizedBy, notes ?? null);
325
+ }),
326
+ status: (filter) => Effect.gen(function* () {
327
+ const fci = yield* computeFci(filter);
328
+ return {
329
+ phase: fci.phase,
330
+ fci: fci.fci,
331
+ gaps: fci.uncovered,
332
+ total: fci.total,
333
+ };
334
+ }),
335
+ };
336
+ }));
337
+ const parseGenericBatch = (value) => {
338
+ if (!Array.isArray(value)) {
339
+ throw new ValidationError({ reason: "Generic batch input must be an array" });
340
+ }
341
+ const out = [];
342
+ for (const item of value) {
343
+ if (typeof item !== "object" || item === null)
344
+ continue;
345
+ const row = item;
346
+ if (typeof row.testId !== "string" || row.testId.trim().length === 0)
347
+ continue;
348
+ if (typeof row.passed !== "boolean")
349
+ continue;
350
+ const durationMs = typeof row.durationMs === "number" && Number.isFinite(row.durationMs)
351
+ ? Math.max(0, Math.trunc(row.durationMs))
352
+ : undefined;
353
+ const details = typeof row.details === "string" ? row.details : undefined;
354
+ out.push({
355
+ testId: row.testId,
356
+ passed: row.passed,
357
+ durationMs,
358
+ details,
359
+ });
360
+ }
361
+ return out;
362
+ };
363
+ const parseVitestBatch = (value) => {
364
+ const out = [];
365
+ if (typeof value !== "object" || value === null) {
366
+ return out;
367
+ }
368
+ const obj = value;
369
+ if (Array.isArray(obj.testResults)) {
370
+ for (const fileEntry of obj.testResults) {
371
+ if (typeof fileEntry !== "object" || fileEntry === null)
372
+ continue;
373
+ const fileObj = fileEntry;
374
+ const fileName = typeof fileObj.name === "string" ? fileObj.name.replace(/\\/g, "/") : "vitest";
375
+ if (!Array.isArray(fileObj.assertionResults))
376
+ continue;
377
+ for (const assertion of fileObj.assertionResults) {
378
+ if (typeof assertion !== "object" || assertion === null)
379
+ continue;
380
+ const a = assertion;
381
+ const testName = typeof a.fullName === "string" && a.fullName.length > 0
382
+ ? a.fullName
383
+ : typeof a.title === "string"
384
+ ? a.title
385
+ : "vitest";
386
+ const status = typeof a.status === "string" ? a.status : "failed";
387
+ if (status !== "passed" && status !== "pass" && status !== "failed" && status !== "fail") {
388
+ continue;
389
+ }
390
+ const details = Array.isArray(a.failureMessages)
391
+ ? a.failureMessages.filter((x) => typeof x === "string").join("\n")
392
+ : undefined;
393
+ out.push({
394
+ testId: `${fileName}::${testName}`,
395
+ passed: status === "passed" || status === "pass",
396
+ durationMs: typeof a.duration === "number" ? Math.max(0, Math.trunc(a.duration)) : undefined,
397
+ details,
398
+ });
399
+ }
400
+ }
401
+ }
402
+ if (Array.isArray(obj.files)) {
403
+ const collectTasks = (prefixFile, tasks) => {
404
+ if (!Array.isArray(tasks))
405
+ return;
406
+ for (const task of tasks) {
407
+ if (typeof task !== "object" || task === null)
408
+ continue;
409
+ const t = task;
410
+ const result = typeof t.result === "object" && t.result !== null
411
+ ? t.result
412
+ : null;
413
+ if (typeof t.name === "string" && result && typeof result.state === "string") {
414
+ if (result.state !== "pass" && result.state !== "fail") {
415
+ collectTasks(prefixFile, t.tasks);
416
+ continue;
417
+ }
418
+ const errors = Array.isArray(result.errors)
419
+ ? result.errors.map((e) => String(e)).join("\n")
420
+ : undefined;
421
+ out.push({
422
+ testId: `${prefixFile}::${t.name}`,
423
+ passed: result.state === "pass",
424
+ durationMs: typeof result.duration === "number" ? Math.max(0, Math.trunc(result.duration)) : undefined,
425
+ details: errors,
426
+ });
427
+ }
428
+ collectTasks(prefixFile, t.tasks);
429
+ }
430
+ };
431
+ for (const fileEntry of obj.files) {
432
+ if (typeof fileEntry !== "object" || fileEntry === null)
433
+ continue;
434
+ const fileObj = fileEntry;
435
+ const fileName = typeof fileObj.filepath === "string"
436
+ ? fileObj.filepath.replace(/\\/g, "/")
437
+ : typeof fileObj.name === "string"
438
+ ? fileObj.name.replace(/\\/g, "/")
439
+ : "vitest";
440
+ collectTasks(fileName, fileObj.tasks);
441
+ }
442
+ }
443
+ return out;
444
+ };
445
+ const parsePytestBatch = (value) => {
446
+ const out = [];
447
+ if (typeof value !== "object" || value === null)
448
+ return out;
449
+ const obj = value;
450
+ if (!Array.isArray(obj.tests))
451
+ return out;
452
+ for (const entry of obj.tests) {
453
+ if (typeof entry !== "object" || entry === null)
454
+ continue;
455
+ const test = entry;
456
+ if (typeof test.nodeid !== "string" || test.nodeid.length === 0)
457
+ continue;
458
+ const outcome = typeof test.outcome === "string" ? test.outcome : "failed";
459
+ if (outcome !== "passed" && outcome !== "failed" && outcome !== "error") {
460
+ continue;
461
+ }
462
+ const call = (typeof test.call === "object" && test.call !== null)
463
+ ? test.call
464
+ : null;
465
+ out.push({
466
+ testId: test.nodeid,
467
+ passed: outcome === "passed",
468
+ durationMs: call && typeof call.duration === "number"
469
+ ? Math.max(0, Math.trunc(call.duration * 1000))
470
+ : undefined,
471
+ details: typeof test.longrepr === "string" ? test.longrepr : undefined,
472
+ });
473
+ }
474
+ return out;
475
+ };
476
+ const getXmlNodeText = (node) => {
477
+ if (typeof node === "string") {
478
+ const text = node.trim();
479
+ return text.length > 0 ? text : undefined;
480
+ }
481
+ if (typeof node !== "object" || node === null)
482
+ return undefined;
483
+ const obj = node;
484
+ const parts = [];
485
+ if (typeof obj["@_message"] === "string" && obj["@_message"].trim().length > 0) {
486
+ parts.push(obj["@_message"].trim());
487
+ }
488
+ if (typeof obj["#text"] === "string" && obj["#text"].trim().length > 0) {
489
+ parts.push(obj["#text"].trim());
490
+ }
491
+ if (typeof obj["__cdata"] === "string" && obj["__cdata"].trim().length > 0) {
492
+ parts.push(obj["__cdata"].trim());
493
+ }
494
+ return parts.length > 0 ? parts.join("\n") : undefined;
495
+ };
496
+ const getXmlNodeTexts = (node) => {
497
+ if (Array.isArray(node)) {
498
+ return node.flatMap((entry) => getXmlNodeTexts(entry));
499
+ }
500
+ const text = getXmlNodeText(node);
501
+ return text ? [text] : [];
502
+ };
503
+ const normalizeJunitFilePath = (value) => value
504
+ .trim()
505
+ .replace(/\\/g, "/")
506
+ .replace(/\/+/g, "/")
507
+ .replace(/^\.\//, "");
508
+ const parseJunitDurationMs = (value) => {
509
+ if (typeof value === "number" && Number.isFinite(value)) {
510
+ return Math.max(0, Math.trunc(value * 1000));
511
+ }
512
+ if (typeof value !== "string")
513
+ return undefined;
514
+ const trimmed = value.trim();
515
+ if (trimmed.length === 0)
516
+ return undefined;
517
+ const normalized = trimmed.includes(",") && !trimmed.includes(".")
518
+ ? trimmed.replace(",", ".")
519
+ : trimmed;
520
+ const seconds = Number.parseFloat(normalized);
521
+ if (!Number.isFinite(seconds))
522
+ return undefined;
523
+ return Math.max(0, Math.trunc(seconds * 1000));
524
+ };
525
+ const isSkippedJunitCase = (testcase) => {
526
+ if (testcase.skipped !== undefined)
527
+ return true;
528
+ const status = typeof testcase["@_status"] === "string"
529
+ ? testcase["@_status"].trim().toLowerCase()
530
+ : null;
531
+ if (status === "skip" || status === "skipped")
532
+ return true;
533
+ const result = typeof testcase["@_result"] === "string"
534
+ ? testcase["@_result"].trim().toLowerCase()
535
+ : null;
536
+ return result === "skip" || result === "skipped";
537
+ };
538
+ const collectJunitSuites = (node, out) => {
539
+ if (Array.isArray(node)) {
540
+ for (const entry of node) {
541
+ collectJunitSuites(entry, out);
542
+ }
543
+ return;
544
+ }
545
+ if (typeof node !== "object" || node === null)
546
+ return;
547
+ const suite = node;
548
+ out.push(suite);
549
+ if (suite.testsuite !== undefined) {
550
+ collectJunitSuites(suite.testsuite, out);
551
+ }
552
+ };
553
+ const parseJunitBatch = (rawXml) => {
554
+ const validation = XMLValidator.validate(rawXml);
555
+ if (validation !== true) {
556
+ const reason = typeof validation.err?.msg === "string"
557
+ ? validation.err.msg
558
+ : "Malformed XML payload";
559
+ throw new ValidationError({ reason: `Invalid JUnit XML input: ${reason}` });
560
+ }
561
+ let parsed;
562
+ try {
563
+ const parser = new XMLParser({
564
+ ignoreAttributes: false,
565
+ attributeNamePrefix: "@_",
566
+ isArray: (name) => name === "testsuite" || name === "testcase",
567
+ });
568
+ parsed = parser.parse(rawXml);
569
+ }
570
+ catch (error) {
571
+ throw new ValidationError({ reason: `Invalid JUnit XML input: ${String(error)}` });
572
+ }
573
+ if (typeof parsed !== "object" || parsed === null) {
574
+ throw new ValidationError({ reason: "Invalid JUnit XML input: expected XML object root" });
575
+ }
576
+ const root = parsed;
577
+ const suites = [];
578
+ const testsuitesRoot = root.testsuites;
579
+ if (typeof testsuitesRoot === "object" && testsuitesRoot !== null) {
580
+ const testsuitesNode = testsuitesRoot.testsuite;
581
+ if (testsuitesNode !== undefined) {
582
+ collectJunitSuites(testsuitesNode, suites);
583
+ }
584
+ }
585
+ if (root.testsuite !== undefined) {
586
+ collectJunitSuites(root.testsuite, suites);
587
+ }
588
+ const out = [];
589
+ for (const suite of suites) {
590
+ const suiteFile = typeof suite["@_file"] === "string" && suite["@_file"].trim().length > 0
591
+ ? normalizeJunitFilePath(suite["@_file"])
592
+ : null;
593
+ const testcases = Array.isArray(suite.testcase)
594
+ ? suite.testcase
595
+ : suite.testcase !== undefined && suite.testcase !== null
596
+ ? [suite.testcase]
597
+ : [];
598
+ for (const testcaseNode of testcases) {
599
+ if (typeof testcaseNode !== "object" || testcaseNode === null)
600
+ continue;
601
+ const testcase = testcaseNode;
602
+ const testName = typeof testcase["@_name"] === "string"
603
+ ? testcase["@_name"].trim()
604
+ : "";
605
+ if (testName.length === 0)
606
+ continue;
607
+ if (isSkippedJunitCase(testcase))
608
+ continue;
609
+ const className = typeof testcase["@_classname"] === "string" && testcase["@_classname"].trim().length > 0
610
+ ? testcase["@_classname"].trim()
611
+ : null;
612
+ const testcaseFile = typeof testcase["@_file"] === "string" && testcase["@_file"].trim().length > 0
613
+ ? normalizeJunitFilePath(testcase["@_file"])
614
+ : null;
615
+ const rawTestFile = testcaseFile ?? suiteFile ?? className ?? "junit";
616
+ const testFile = rawTestFile.includes("/")
617
+ ? normalizeJunitFilePath(rawTestFile)
618
+ : rawTestFile;
619
+ const failed = testcase.failure !== undefined || testcase.error !== undefined;
620
+ const durationMs = parseJunitDurationMs(testcase["@_time"]);
621
+ let details;
622
+ if (failed) {
623
+ const detailsChunks = [
624
+ ...getXmlNodeTexts(testcase.failure),
625
+ ...getXmlNodeTexts(testcase.error),
626
+ ];
627
+ details = detailsChunks.length > 0 ? detailsChunks.join("\n\n") : undefined;
628
+ }
629
+ out.push({
630
+ testId: `${testFile}::${testName}`,
631
+ passed: !failed,
632
+ durationMs,
633
+ details,
634
+ });
635
+ }
636
+ }
637
+ return out;
638
+ };
639
+ const parseGoBatch = (rawText) => {
640
+ const outputs = new Map();
641
+ const final = new Map();
642
+ for (const line of rawText.split(/\r?\n/)) {
643
+ const trimmed = line.trim();
644
+ if (trimmed.length === 0)
645
+ continue;
646
+ let parsed;
647
+ try {
648
+ parsed = JSON.parse(trimmed);
649
+ }
650
+ catch {
651
+ continue;
652
+ }
653
+ if (typeof parsed !== "object" || parsed === null)
654
+ continue;
655
+ const row = parsed;
656
+ if (typeof row.Test !== "string" || row.Test.length === 0)
657
+ continue;
658
+ const pkg = typeof row.Package === "string" && row.Package.length > 0
659
+ ? row.Package
660
+ : "go";
661
+ const testId = `${pkg}::${row.Test}`;
662
+ if (row.Action === "output" && typeof row.Output === "string") {
663
+ const current = outputs.get(testId) ?? [];
664
+ current.push(row.Output.trimEnd());
665
+ outputs.set(testId, current);
666
+ continue;
667
+ }
668
+ if (row.Action === "pass" || row.Action === "fail") {
669
+ final.set(testId, {
670
+ testId,
671
+ passed: row.Action === "pass",
672
+ durationMs: typeof row.Elapsed === "number"
673
+ ? Math.max(0, Math.trunc(row.Elapsed * 1000))
674
+ : undefined,
675
+ details: row.Action === "fail"
676
+ ? (outputs.get(testId)?.filter((s) => s.length > 0).join("\n") || undefined)
677
+ : undefined,
678
+ });
679
+ }
680
+ }
681
+ return [...final.values()];
682
+ };
683
+ /** Parse framework-native batch payloads into generic run records. */
684
+ export const parseBatchRunInput = (raw, source) => {
685
+ if (Buffer.byteLength(raw, "utf8") > SPEC_BATCH_MAX_BYTES) {
686
+ throw new ValidationError({ reason: `Raw batch payload exceeds ${SPEC_BATCH_MAX_BYTES} bytes` });
687
+ }
688
+ if (source === "go")
689
+ return parseGoBatch(raw);
690
+ if (source === "junit")
691
+ return parseJunitBatch(raw);
692
+ let parsed;
693
+ try {
694
+ parsed = JSON.parse(raw);
695
+ }
696
+ catch (error) {
697
+ throw new ValidationError({ reason: `Invalid JSON input: ${String(error)}` });
698
+ }
699
+ if (source === "generic")
700
+ return parseGenericBatch(parsed);
701
+ if (source === "vitest")
702
+ return parseVitestBatch(parsed);
703
+ if (source === "pytest")
704
+ return parsePytestBatch(parsed);
705
+ return [];
706
+ };
707
+ //# sourceMappingURL=spec-trace-service-impl.js.map