@jamesaphoenix/tx-core 0.4.1

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 (289) hide show
  1. package/dist/db.d.ts +42 -0
  2. package/dist/db.d.ts.map +1 -0
  3. package/dist/db.js +46 -0
  4. package/dist/db.js.map +1 -0
  5. package/dist/errors.d.ts +231 -0
  6. package/dist/errors.d.ts.map +1 -0
  7. package/dist/errors.js +139 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/id.d.ts +6 -0
  10. package/dist/id.d.ts.map +1 -0
  11. package/dist/id.js +21 -0
  12. package/dist/id.js.map +1 -0
  13. package/dist/index.d.ts +25 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +56 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/layer.d.ts +50 -0
  18. package/dist/layer.d.ts.map +1 -0
  19. package/dist/layer.js +155 -0
  20. package/dist/layer.js.map +1 -0
  21. package/dist/mappers/anchor.d.ts +14 -0
  22. package/dist/mappers/anchor.d.ts.map +1 -0
  23. package/dist/mappers/anchor.js +38 -0
  24. package/dist/mappers/anchor.js.map +1 -0
  25. package/dist/mappers/attempt.d.ts +15 -0
  26. package/dist/mappers/attempt.d.ts.map +1 -0
  27. package/dist/mappers/attempt.js +23 -0
  28. package/dist/mappers/attempt.js.map +1 -0
  29. package/dist/mappers/candidate.d.ts +23 -0
  30. package/dist/mappers/candidate.d.ts.map +1 -0
  31. package/dist/mappers/candidate.js +53 -0
  32. package/dist/mappers/candidate.js.map +1 -0
  33. package/dist/mappers/claim.d.ts +30 -0
  34. package/dist/mappers/claim.d.ts.map +1 -0
  35. package/dist/mappers/claim.js +32 -0
  36. package/dist/mappers/claim.js.map +1 -0
  37. package/dist/mappers/deduplication.d.ts +39 -0
  38. package/dist/mappers/deduplication.d.ts.map +1 -0
  39. package/dist/mappers/deduplication.js +53 -0
  40. package/dist/mappers/deduplication.js.map +1 -0
  41. package/dist/mappers/edge.d.ts +10 -0
  42. package/dist/mappers/edge.d.ts.map +1 -0
  43. package/dist/mappers/edge.js +19 -0
  44. package/dist/mappers/edge.js.map +1 -0
  45. package/dist/mappers/file-learning.d.ts +14 -0
  46. package/dist/mappers/file-learning.d.ts.map +1 -0
  47. package/dist/mappers/file-learning.js +75 -0
  48. package/dist/mappers/file-learning.js.map +1 -0
  49. package/dist/mappers/index.d.ts +17 -0
  50. package/dist/mappers/index.d.ts.map +1 -0
  51. package/dist/mappers/index.js +30 -0
  52. package/dist/mappers/index.js.map +1 -0
  53. package/dist/mappers/learning.d.ts +19 -0
  54. package/dist/mappers/learning.d.ts.map +1 -0
  55. package/dist/mappers/learning.js +41 -0
  56. package/dist/mappers/learning.js.map +1 -0
  57. package/dist/mappers/orchestrator-state.d.ts +33 -0
  58. package/dist/mappers/orchestrator-state.d.ts.map +1 -0
  59. package/dist/mappers/orchestrator-state.js +34 -0
  60. package/dist/mappers/orchestrator-state.js.map +1 -0
  61. package/dist/mappers/run.d.ts +32 -0
  62. package/dist/mappers/run.d.ts.map +1 -0
  63. package/dist/mappers/run.js +64 -0
  64. package/dist/mappers/run.js.map +1 -0
  65. package/dist/mappers/task.d.ts +23 -0
  66. package/dist/mappers/task.d.ts.map +1 -0
  67. package/dist/mappers/task.js +54 -0
  68. package/dist/mappers/task.js.map +1 -0
  69. package/dist/mappers/tracked-project.d.ts +15 -0
  70. package/dist/mappers/tracked-project.d.ts.map +1 -0
  71. package/dist/mappers/tracked-project.js +23 -0
  72. package/dist/mappers/tracked-project.js.map +1 -0
  73. package/dist/mappers/worker.d.ts +33 -0
  74. package/dist/mappers/worker.d.ts.map +1 -0
  75. package/dist/mappers/worker.js +35 -0
  76. package/dist/mappers/worker.js.map +1 -0
  77. package/dist/repo/anchor-repo.d.ts +52 -0
  78. package/dist/repo/anchor-repo.d.ts.map +1 -0
  79. package/dist/repo/anchor-repo.js +204 -0
  80. package/dist/repo/anchor-repo.js.map +1 -0
  81. package/dist/repo/attempt-repo.d.ts +25 -0
  82. package/dist/repo/attempt-repo.d.ts.map +1 -0
  83. package/dist/repo/attempt-repo.js +78 -0
  84. package/dist/repo/attempt-repo.js.map +1 -0
  85. package/dist/repo/candidate-repo.d.ts +16 -0
  86. package/dist/repo/candidate-repo.d.ts.map +1 -0
  87. package/dist/repo/candidate-repo.js +143 -0
  88. package/dist/repo/candidate-repo.js.map +1 -0
  89. package/dist/repo/claim-repo.d.ts +17 -0
  90. package/dist/repo/claim-repo.d.ts.map +1 -0
  91. package/dist/repo/claim-repo.js +62 -0
  92. package/dist/repo/claim-repo.js.map +1 -0
  93. package/dist/repo/deduplication-repo.d.ts +37 -0
  94. package/dist/repo/deduplication-repo.d.ts.map +1 -0
  95. package/dist/repo/deduplication-repo.js +133 -0
  96. package/dist/repo/deduplication-repo.js.map +1 -0
  97. package/dist/repo/dep-repo.d.ts +19 -0
  98. package/dist/repo/dep-repo.d.ts.map +1 -0
  99. package/dist/repo/dep-repo.js +104 -0
  100. package/dist/repo/dep-repo.js.map +1 -0
  101. package/dist/repo/edge-repo.d.ts +26 -0
  102. package/dist/repo/edge-repo.d.ts.map +1 -0
  103. package/dist/repo/edge-repo.js +227 -0
  104. package/dist/repo/edge-repo.js.map +1 -0
  105. package/dist/repo/file-learning-repo.d.ts +17 -0
  106. package/dist/repo/file-learning-repo.d.ts.map +1 -0
  107. package/dist/repo/file-learning-repo.js +60 -0
  108. package/dist/repo/file-learning-repo.js.map +1 -0
  109. package/dist/repo/index.d.ts +18 -0
  110. package/dist/repo/index.d.ts.map +1 -0
  111. package/dist/repo/index.js +18 -0
  112. package/dist/repo/index.js.map +1 -0
  113. package/dist/repo/learning-repo.d.ts +31 -0
  114. package/dist/repo/learning-repo.d.ts.map +1 -0
  115. package/dist/repo/learning-repo.js +165 -0
  116. package/dist/repo/learning-repo.js.map +1 -0
  117. package/dist/repo/orchestrator-state-repo.d.ts +27 -0
  118. package/dist/repo/orchestrator-state-repo.d.ts.map +1 -0
  119. package/dist/repo/orchestrator-state-repo.js +96 -0
  120. package/dist/repo/orchestrator-state-repo.js.map +1 -0
  121. package/dist/repo/run-repo.d.ts +31 -0
  122. package/dist/repo/run-repo.d.ts.map +1 -0
  123. package/dist/repo/run-repo.js +132 -0
  124. package/dist/repo/run-repo.js.map +1 -0
  125. package/dist/repo/task-repo.d.ts +21 -0
  126. package/dist/repo/task-repo.d.ts.map +1 -0
  127. package/dist/repo/task-repo.js +169 -0
  128. package/dist/repo/task-repo.js.map +1 -0
  129. package/dist/repo/tracked-project-repo.d.ts +16 -0
  130. package/dist/repo/tracked-project-repo.d.ts.map +1 -0
  131. package/dist/repo/tracked-project-repo.js +54 -0
  132. package/dist/repo/tracked-project-repo.js.map +1 -0
  133. package/dist/repo/worker-repo.d.ts +19 -0
  134. package/dist/repo/worker-repo.d.ts.map +1 -0
  135. package/dist/repo/worker-repo.js +72 -0
  136. package/dist/repo/worker-repo.js.map +1 -0
  137. package/dist/schemas/index.d.ts +8 -0
  138. package/dist/schemas/index.d.ts.map +1 -0
  139. package/dist/schemas/index.js +7 -0
  140. package/dist/schemas/index.js.map +1 -0
  141. package/dist/schemas/sync.d.ts +296 -0
  142. package/dist/schemas/sync.d.ts.map +1 -0
  143. package/dist/schemas/sync.js +146 -0
  144. package/dist/schemas/sync.js.map +1 -0
  145. package/dist/schemas/worker.d.ts +77 -0
  146. package/dist/schemas/worker.d.ts.map +1 -0
  147. package/dist/schemas/worker.js +80 -0
  148. package/dist/schemas/worker.js.map +1 -0
  149. package/dist/services/anchor-service.d.ts +147 -0
  150. package/dist/services/anchor-service.d.ts.map +1 -0
  151. package/dist/services/anchor-service.js +540 -0
  152. package/dist/services/anchor-service.js.map +1 -0
  153. package/dist/services/anchor-verification.d.ts +94 -0
  154. package/dist/services/anchor-verification.d.ts.map +1 -0
  155. package/dist/services/anchor-verification.js +617 -0
  156. package/dist/services/anchor-verification.js.map +1 -0
  157. package/dist/services/ast-grep-service.d.ts +58 -0
  158. package/dist/services/ast-grep-service.d.ts.map +1 -0
  159. package/dist/services/ast-grep-service.js +356 -0
  160. package/dist/services/ast-grep-service.js.map +1 -0
  161. package/dist/services/attempt-service.d.ts +24 -0
  162. package/dist/services/attempt-service.d.ts.map +1 -0
  163. package/dist/services/attempt-service.js +55 -0
  164. package/dist/services/attempt-service.js.map +1 -0
  165. package/dist/services/auto-sync-service.d.ts +56 -0
  166. package/dist/services/auto-sync-service.d.ts.map +1 -0
  167. package/dist/services/auto-sync-service.js +66 -0
  168. package/dist/services/auto-sync-service.js.map +1 -0
  169. package/dist/services/candidate-extractor-service.d.ts +56 -0
  170. package/dist/services/candidate-extractor-service.d.ts.map +1 -0
  171. package/dist/services/candidate-extractor-service.js +365 -0
  172. package/dist/services/candidate-extractor-service.js.map +1 -0
  173. package/dist/services/claim-service.d.ts +52 -0
  174. package/dist/services/claim-service.d.ts.map +1 -0
  175. package/dist/services/claim-service.js +134 -0
  176. package/dist/services/claim-service.js.map +1 -0
  177. package/dist/services/daemon-service.d.ts +214 -0
  178. package/dist/services/daemon-service.d.ts.map +1 -0
  179. package/dist/services/daemon-service.js +522 -0
  180. package/dist/services/daemon-service.js.map +1 -0
  181. package/dist/services/deduplication-service.d.ts +67 -0
  182. package/dist/services/deduplication-service.d.ts.map +1 -0
  183. package/dist/services/deduplication-service.js +145 -0
  184. package/dist/services/deduplication-service.js.map +1 -0
  185. package/dist/services/dep-service.d.ts +14 -0
  186. package/dist/services/dep-service.d.ts.map +1 -0
  187. package/dist/services/dep-service.js +34 -0
  188. package/dist/services/dep-service.js.map +1 -0
  189. package/dist/services/diversifier-service.d.ts +46 -0
  190. package/dist/services/diversifier-service.d.ts.map +1 -0
  191. package/dist/services/diversifier-service.js +197 -0
  192. package/dist/services/diversifier-service.js.map +1 -0
  193. package/dist/services/edge-service.d.ts +78 -0
  194. package/dist/services/edge-service.d.ts.map +1 -0
  195. package/dist/services/edge-service.js +158 -0
  196. package/dist/services/edge-service.js.map +1 -0
  197. package/dist/services/embedding-service.d.ts +138 -0
  198. package/dist/services/embedding-service.d.ts.map +1 -0
  199. package/dist/services/embedding-service.js +318 -0
  200. package/dist/services/embedding-service.js.map +1 -0
  201. package/dist/services/feedback-tracker.d.ts +64 -0
  202. package/dist/services/feedback-tracker.d.ts.map +1 -0
  203. package/dist/services/feedback-tracker.js +110 -0
  204. package/dist/services/feedback-tracker.js.map +1 -0
  205. package/dist/services/file-learning-service.d.ts +17 -0
  206. package/dist/services/file-learning-service.d.ts.map +1 -0
  207. package/dist/services/file-learning-service.js +41 -0
  208. package/dist/services/file-learning-service.js.map +1 -0
  209. package/dist/services/file-watcher-service.d.ts +141 -0
  210. package/dist/services/file-watcher-service.d.ts.map +1 -0
  211. package/dist/services/file-watcher-service.js +278 -0
  212. package/dist/services/file-watcher-service.js.map +1 -0
  213. package/dist/services/graph-expansion.d.ts +155 -0
  214. package/dist/services/graph-expansion.d.ts.map +1 -0
  215. package/dist/services/graph-expansion.js +466 -0
  216. package/dist/services/graph-expansion.js.map +1 -0
  217. package/dist/services/hierarchy-service.d.ts +16 -0
  218. package/dist/services/hierarchy-service.d.ts.map +1 -0
  219. package/dist/services/hierarchy-service.js +66 -0
  220. package/dist/services/hierarchy-service.js.map +1 -0
  221. package/dist/services/index.d.ts +36 -0
  222. package/dist/services/index.d.ts.map +1 -0
  223. package/dist/services/index.js +36 -0
  224. package/dist/services/index.js.map +1 -0
  225. package/dist/services/learning-service.d.ts +39 -0
  226. package/dist/services/learning-service.d.ts.map +1 -0
  227. package/dist/services/learning-service.js +151 -0
  228. package/dist/services/learning-service.js.map +1 -0
  229. package/dist/services/migration-service.d.ts +67 -0
  230. package/dist/services/migration-service.d.ts.map +1 -0
  231. package/dist/services/migration-service.js +144 -0
  232. package/dist/services/migration-service.js.map +1 -0
  233. package/dist/services/orchestrator-service.d.ts +52 -0
  234. package/dist/services/orchestrator-service.d.ts.map +1 -0
  235. package/dist/services/orchestrator-service.js +203 -0
  236. package/dist/services/orchestrator-service.js.map +1 -0
  237. package/dist/services/promotion-service.d.ts +67 -0
  238. package/dist/services/promotion-service.d.ts.map +1 -0
  239. package/dist/services/promotion-service.js +151 -0
  240. package/dist/services/promotion-service.js.map +1 -0
  241. package/dist/services/query-expansion-service.d.ts +55 -0
  242. package/dist/services/query-expansion-service.d.ts.map +1 -0
  243. package/dist/services/query-expansion-service.js +174 -0
  244. package/dist/services/query-expansion-service.js.map +1 -0
  245. package/dist/services/ready-service.d.ts +16 -0
  246. package/dist/services/ready-service.d.ts.map +1 -0
  247. package/dist/services/ready-service.js +70 -0
  248. package/dist/services/ready-service.js.map +1 -0
  249. package/dist/services/reranker-service.d.ts +51 -0
  250. package/dist/services/reranker-service.d.ts.map +1 -0
  251. package/dist/services/reranker-service.js +128 -0
  252. package/dist/services/reranker-service.js.map +1 -0
  253. package/dist/services/retriever-service.d.ts +49 -0
  254. package/dist/services/retriever-service.d.ts.map +1 -0
  255. package/dist/services/retriever-service.js +419 -0
  256. package/dist/services/retriever-service.js.map +1 -0
  257. package/dist/services/score-service.d.ts +43 -0
  258. package/dist/services/score-service.d.ts.map +1 -0
  259. package/dist/services/score-service.js +82 -0
  260. package/dist/services/score-service.js.map +1 -0
  261. package/dist/services/swarm-verification.d.ts +104 -0
  262. package/dist/services/swarm-verification.d.ts.map +1 -0
  263. package/dist/services/swarm-verification.js +400 -0
  264. package/dist/services/swarm-verification.js.map +1 -0
  265. package/dist/services/sync-service.d.ts +115 -0
  266. package/dist/services/sync-service.d.ts.map +1 -0
  267. package/dist/services/sync-service.js +350 -0
  268. package/dist/services/sync-service.js.map +1 -0
  269. package/dist/services/task-service.d.ts +22 -0
  270. package/dist/services/task-service.d.ts.map +1 -0
  271. package/dist/services/task-service.js +221 -0
  272. package/dist/services/task-service.js.map +1 -0
  273. package/dist/services/worker-process.d.ts +41 -0
  274. package/dist/services/worker-process.d.ts.map +1 -0
  275. package/dist/services/worker-process.js +280 -0
  276. package/dist/services/worker-process.js.map +1 -0
  277. package/dist/services/worker-service.d.ts +74 -0
  278. package/dist/services/worker-service.d.ts.map +1 -0
  279. package/dist/services/worker-service.js +148 -0
  280. package/dist/services/worker-service.js.map +1 -0
  281. package/dist/utils/glob.d.ts +15 -0
  282. package/dist/utils/glob.d.ts.map +1 -0
  283. package/dist/utils/glob.js +27 -0
  284. package/dist/utils/glob.js.map +1 -0
  285. package/dist/utils/math.d.ts +6 -0
  286. package/dist/utils/math.d.ts.map +1 -0
  287. package/dist/utils/math.js +21 -0
  288. package/dist/utils/math.js.map +1 -0
  289. package/package.json +72 -0
@@ -0,0 +1,104 @@
1
+ /**
2
+ * SwarmVerificationService - Bulk invalidation with concurrent verification agents
3
+ *
4
+ * For large batches of anchors, spawns up to 4 concurrent verification agents.
5
+ * Coordinates via job queue pattern using Effect's concurrency primitives.
6
+ * Aggregates results with majority vote for edge cases.
7
+ * Tracks swarm metrics for observability.
8
+ *
9
+ * @see docs/prd/PRD-017-invalidation-maintenance.md - IM-004: Bulk invalidation via agent swarm
10
+ */
11
+ import { Context, Effect, Layer } from "effect";
12
+ import { AnchorVerificationService, type VerificationResult, type VerifyOptions } from "./anchor-verification.js";
13
+ import { AnchorRepository } from "../repo/anchor-repo.js";
14
+ import { DatabaseError } from "../errors.js";
15
+ import type { AnchorStatus } from "@jamesaphoenix/tx-types";
16
+ /** A batch of anchor IDs to verify */
17
+ export interface VerificationBatch {
18
+ readonly batchId: number;
19
+ readonly anchorIds: readonly number[];
20
+ }
21
+ /** Result of a single agent's verification of a batch */
22
+ export interface BatchResult {
23
+ readonly batchId: number;
24
+ readonly results: readonly VerificationResult[];
25
+ readonly duration: number;
26
+ readonly errors: number;
27
+ }
28
+ /** Swarm verification metrics */
29
+ export interface SwarmMetrics {
30
+ readonly totalAnchors: number;
31
+ readonly totalBatches: number;
32
+ readonly agentsUsed: number;
33
+ readonly duration: number;
34
+ /** Time spent per agent (for load balancing analysis) */
35
+ readonly agentDurations: readonly number[];
36
+ /** Counts by action type */
37
+ readonly unchanged: number;
38
+ readonly selfHealed: number;
39
+ readonly drifted: number;
40
+ readonly invalid: number;
41
+ readonly errors: number;
42
+ /** Edge cases requiring human review (tie votes) */
43
+ readonly needsReview: number;
44
+ }
45
+ /** Complete swarm verification result */
46
+ export interface SwarmVerificationResult {
47
+ readonly metrics: SwarmMetrics;
48
+ readonly results: readonly VerificationResult[];
49
+ /** Anchor IDs that require human review due to tie votes */
50
+ readonly reviewRequired: readonly number[];
51
+ }
52
+ /** Options for swarm verification */
53
+ export interface SwarmVerifyOptions extends VerifyOptions {
54
+ /** Batch size per agent (default: 10) */
55
+ readonly batchSize?: number;
56
+ /** Max concurrent agents (default: 4) */
57
+ readonly maxConcurrent?: number;
58
+ /** Force swarm even for small batches */
59
+ readonly forceSwarm?: boolean;
60
+ }
61
+ /** Majority vote result for an anchor */
62
+ export interface VoteResult {
63
+ readonly anchorId: number;
64
+ readonly votes: Map<AnchorStatus | "error", number>;
65
+ readonly consensus: AnchorStatus | null;
66
+ readonly needsReview: boolean;
67
+ }
68
+ declare const SwarmVerificationService_base: Context.TagClass<SwarmVerificationService, "SwarmVerificationService", {
69
+ /**
70
+ * Verify anchors using concurrent agents.
71
+ * Automatically partitions into batches and spawns agents.
72
+ */
73
+ readonly verifyAnchors: (anchorIds: readonly number[], options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
74
+ /**
75
+ * Verify all valid anchors using swarm.
76
+ */
77
+ readonly verifyAll: (options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
78
+ /**
79
+ * Verify anchors for files matching glob pattern using swarm.
80
+ */
81
+ readonly verifyGlob: (globPattern: string, options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
82
+ /**
83
+ * Verify anchors affected by a list of changed files.
84
+ * Typically called from git hooks after large commits.
85
+ */
86
+ readonly verifyChangedFiles: (filePaths: readonly string[], options?: SwarmVerifyOptions) => Effect.Effect<SwarmVerificationResult, DatabaseError>;
87
+ }>;
88
+ export declare class SwarmVerificationService extends SwarmVerificationService_base {
89
+ }
90
+ /**
91
+ * Calculate majority vote for conflicting results on the same anchor.
92
+ * Used when multiple agents verify the same anchor (edge cases).
93
+ *
94
+ * Rules (per PRD-017):
95
+ * - If 3/4 agents say valid, it's valid
96
+ * - Tie = mark for human review
97
+ *
98
+ * Exported for use in LLM-assisted verification scenarios where multiple
99
+ * agents may verify the same anchor for edge cases.
100
+ */
101
+ export declare const calculateMajorityVote: (results: readonly VerificationResult[]) => VoteResult;
102
+ export declare const SwarmVerificationServiceLive: Layer.Layer<SwarmVerificationService, never, AnchorRepository | AnchorVerificationService>;
103
+ export {};
104
+ //# sourceMappingURL=swarm-verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm-verification.d.ts","sourceRoot":"","sources":["../../src/services/swarm-verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,400 @@
1
+ /**
2
+ * SwarmVerificationService - Bulk invalidation with concurrent verification agents
3
+ *
4
+ * For large batches of anchors, spawns up to 4 concurrent verification agents.
5
+ * Coordinates via job queue pattern using Effect's concurrency primitives.
6
+ * Aggregates results with majority vote for edge cases.
7
+ * Tracks swarm metrics for observability.
8
+ *
9
+ * @see docs/prd/PRD-017-invalidation-maintenance.md - IM-004: Bulk invalidation via agent swarm
10
+ */
11
+ import { Context, Effect, Layer, Queue, Fiber, Ref } from "effect";
12
+ import { AnchorVerificationService } from "./anchor-verification.js";
13
+ import { AnchorRepository } from "../repo/anchor-repo.js";
14
+ import { matchesGlob } from "../utils/glob.js";
15
+ // =============================================================================
16
+ // Configuration Constants
17
+ // =============================================================================
18
+ /** Default batch size per agent (PRD-017: batches of 10) */
19
+ const DEFAULT_BATCH_SIZE = 10;
20
+ /** Maximum concurrent agents (PRD-017: up to 4) */
21
+ const MAX_CONCURRENT_AGENTS = 4;
22
+ /** Minimum batch size to trigger swarm (sequential is fine for small batches) */
23
+ const SWARM_THRESHOLD = 20;
24
+ // =============================================================================
25
+ // Service Definition
26
+ // =============================================================================
27
+ export class SwarmVerificationService extends Context.Tag("SwarmVerificationService")() {
28
+ }
29
+ // =============================================================================
30
+ // Utility Functions
31
+ // =============================================================================
32
+ /**
33
+ * Partition anchor IDs into batches.
34
+ */
35
+ const partitionIntoBatches = (anchorIds, batchSize) => {
36
+ const batches = [];
37
+ for (let i = 0; i < anchorIds.length; i += batchSize) {
38
+ batches.push({
39
+ batchId: batches.length,
40
+ anchorIds: anchorIds.slice(i, i + batchSize)
41
+ });
42
+ }
43
+ return batches;
44
+ };
45
+ /**
46
+ * Calculate majority vote for conflicting results on the same anchor.
47
+ * Used when multiple agents verify the same anchor (edge cases).
48
+ *
49
+ * Rules (per PRD-017):
50
+ * - If 3/4 agents say valid, it's valid
51
+ * - Tie = mark for human review
52
+ *
53
+ * Exported for use in LLM-assisted verification scenarios where multiple
54
+ * agents may verify the same anchor for edge cases.
55
+ */
56
+ export const calculateMajorityVote = (results) => {
57
+ const anchorId = results[0].anchorId;
58
+ const votes = new Map();
59
+ for (const result of results) {
60
+ const status = result.newStatus;
61
+ votes.set(status, (votes.get(status) ?? 0) + 1);
62
+ }
63
+ // Find the status with most votes
64
+ let maxVotes = 0;
65
+ let consensus = null;
66
+ let tieCount = 0;
67
+ for (const [status, count] of votes) {
68
+ if (status === "error")
69
+ continue; // Don't count errors in consensus
70
+ if (count > maxVotes) {
71
+ maxVotes = count;
72
+ consensus = status;
73
+ tieCount = 1;
74
+ }
75
+ else if (count === maxVotes) {
76
+ tieCount++;
77
+ }
78
+ }
79
+ // Tie = needs human review
80
+ const needsReview = tieCount > 1;
81
+ return {
82
+ anchorId,
83
+ votes,
84
+ consensus: needsReview ? null : consensus,
85
+ needsReview
86
+ };
87
+ };
88
+ /**
89
+ * Aggregate batch results into final metrics.
90
+ */
91
+ const aggregateResults = (batchResults, startTime, agentCount) => {
92
+ let unchanged = 0;
93
+ let selfHealed = 0;
94
+ let drifted = 0;
95
+ let invalid = 0;
96
+ let errors = 0;
97
+ const allResults = [];
98
+ const agentDurations = [];
99
+ for (const batch of batchResults) {
100
+ agentDurations.push(batch.duration);
101
+ errors += batch.errors;
102
+ for (const result of batch.results) {
103
+ allResults.push(result);
104
+ switch (result.action) {
105
+ case "unchanged":
106
+ unchanged++;
107
+ break;
108
+ case "self_healed":
109
+ selfHealed++;
110
+ break;
111
+ case "drifted":
112
+ drifted++;
113
+ break;
114
+ case "invalidated":
115
+ invalid++;
116
+ break;
117
+ }
118
+ }
119
+ }
120
+ return {
121
+ metrics: {
122
+ totalAnchors: allResults.length + errors,
123
+ totalBatches: batchResults.length,
124
+ agentsUsed: agentCount,
125
+ duration: Date.now() - startTime,
126
+ agentDurations,
127
+ unchanged,
128
+ selfHealed,
129
+ drifted,
130
+ invalid,
131
+ errors
132
+ },
133
+ results: allResults
134
+ };
135
+ };
136
+ // =============================================================================
137
+ // Service Implementation
138
+ // =============================================================================
139
+ export const SwarmVerificationServiceLive = Layer.effect(SwarmVerificationService, Effect.gen(function* () {
140
+ const anchorVerification = yield* AnchorVerificationService;
141
+ const anchorRepo = yield* AnchorRepository;
142
+ /**
143
+ * Process a single batch of anchors using the verification service.
144
+ */
145
+ const processB = (batch, options) => Effect.gen(function* () {
146
+ const startTime = Date.now();
147
+ const results = [];
148
+ let errors = 0;
149
+ // Process each anchor in the batch
150
+ for (const anchorId of batch.anchorIds) {
151
+ const result = yield* anchorVerification.verify(anchorId, options).pipe(Effect.catchAll(() => {
152
+ errors++;
153
+ return Effect.succeed(null);
154
+ }));
155
+ if (result) {
156
+ results.push(result);
157
+ }
158
+ }
159
+ return {
160
+ batchId: batch.batchId,
161
+ results,
162
+ duration: Date.now() - startTime,
163
+ errors
164
+ };
165
+ });
166
+ /**
167
+ * Run swarm verification with concurrent agents.
168
+ */
169
+ const runSwarm = (anchorIds, options) => Effect.gen(function* () {
170
+ const startTime = Date.now();
171
+ const batchSize = options.batchSize ?? DEFAULT_BATCH_SIZE;
172
+ const maxConcurrent = options.maxConcurrent ?? MAX_CONCURRENT_AGENTS;
173
+ // Partition into batches
174
+ const batches = partitionIntoBatches(anchorIds, batchSize);
175
+ if (batches.length === 0) {
176
+ return {
177
+ metrics: {
178
+ totalAnchors: 0,
179
+ totalBatches: 0,
180
+ agentsUsed: 0,
181
+ duration: 0,
182
+ agentDurations: [],
183
+ unchanged: 0,
184
+ selfHealed: 0,
185
+ drifted: 0,
186
+ invalid: 0,
187
+ errors: 0,
188
+ needsReview: 0
189
+ },
190
+ results: [],
191
+ reviewRequired: []
192
+ };
193
+ }
194
+ // Determine actual concurrency (don't spawn more agents than batches)
195
+ const agentCount = Math.min(batches.length, maxConcurrent);
196
+ // Create a queue for job distribution
197
+ const queue = yield* Queue.bounded(batches.length);
198
+ // Enqueue all batches
199
+ for (const batch of batches) {
200
+ yield* Queue.offer(queue, batch);
201
+ }
202
+ // Counter to track active work
203
+ const completedBatches = yield* Ref.make([]);
204
+ // Worker function: continuously pull batches from queue
205
+ const worker = (_workerId) => Effect.gen(function* () {
206
+ while (true) {
207
+ // Try to take a batch (non-blocking)
208
+ const maybeBatch = yield* Queue.poll(queue);
209
+ if (maybeBatch._tag === "None") {
210
+ // No more batches, worker done
211
+ break;
212
+ }
213
+ const batch = maybeBatch.value;
214
+ const result = yield* processB(batch, options);
215
+ // Record result
216
+ yield* Ref.update(completedBatches, (results) => [...results, result]);
217
+ }
218
+ });
219
+ // Spawn agents as fibers
220
+ const fibers = [];
221
+ for (let i = 0; i < agentCount; i++) {
222
+ const fiber = yield* Effect.fork(worker(i));
223
+ fibers.push(fiber);
224
+ }
225
+ // Wait for all agents to complete
226
+ for (const fiber of fibers) {
227
+ yield* Fiber.join(fiber);
228
+ }
229
+ // Shutdown queue
230
+ yield* Queue.shutdown(queue);
231
+ // Get all batch results
232
+ const batchResults = yield* Ref.get(completedBatches);
233
+ // Aggregate results
234
+ const { metrics, results } = aggregateResults(batchResults, startTime, agentCount);
235
+ // For now, we don't have multi-agent verification of the same anchor,
236
+ // so no majority voting needed. reviewRequired is empty.
237
+ // This would be used if we added LLM-assisted verification where
238
+ // multiple agents verify the same anchor for edge cases.
239
+ const reviewRequired = [];
240
+ return {
241
+ metrics: {
242
+ ...metrics,
243
+ needsReview: reviewRequired.length
244
+ },
245
+ results,
246
+ reviewRequired
247
+ };
248
+ });
249
+ /**
250
+ * Simple sequential verification for small batches.
251
+ */
252
+ const runSequential = (anchorIds, options) => Effect.gen(function* () {
253
+ // Handle empty input
254
+ if (anchorIds.length === 0) {
255
+ return {
256
+ metrics: {
257
+ totalAnchors: 0,
258
+ totalBatches: 0,
259
+ agentsUsed: 0,
260
+ duration: 0,
261
+ agentDurations: [],
262
+ unchanged: 0,
263
+ selfHealed: 0,
264
+ drifted: 0,
265
+ invalid: 0,
266
+ errors: 0,
267
+ needsReview: 0
268
+ },
269
+ results: [],
270
+ reviewRequired: []
271
+ };
272
+ }
273
+ const startTime = Date.now();
274
+ const results = [];
275
+ let errors = 0;
276
+ let unchanged = 0;
277
+ let selfHealed = 0;
278
+ let drifted = 0;
279
+ let invalid = 0;
280
+ for (const anchorId of anchorIds) {
281
+ const result = yield* anchorVerification.verify(anchorId, options).pipe(Effect.catchAll(() => {
282
+ errors++;
283
+ return Effect.succeed(null);
284
+ }));
285
+ if (result) {
286
+ results.push(result);
287
+ switch (result.action) {
288
+ case "unchanged":
289
+ unchanged++;
290
+ break;
291
+ case "self_healed":
292
+ selfHealed++;
293
+ break;
294
+ case "drifted":
295
+ drifted++;
296
+ break;
297
+ case "invalidated":
298
+ invalid++;
299
+ break;
300
+ }
301
+ }
302
+ }
303
+ return {
304
+ metrics: {
305
+ totalAnchors: results.length + errors,
306
+ totalBatches: 1,
307
+ agentsUsed: 1,
308
+ duration: Date.now() - startTime,
309
+ agentDurations: [Date.now() - startTime],
310
+ unchanged,
311
+ selfHealed,
312
+ drifted,
313
+ invalid,
314
+ errors,
315
+ needsReview: 0
316
+ },
317
+ results,
318
+ reviewRequired: []
319
+ };
320
+ });
321
+ return {
322
+ verifyAnchors: (anchorIds, options = {}) => Effect.gen(function* () {
323
+ // Use swarm for large batches, sequential for small ones
324
+ const useSwarm = options.forceSwarm || anchorIds.length >= SWARM_THRESHOLD;
325
+ if (useSwarm) {
326
+ return yield* runSwarm(anchorIds, options);
327
+ }
328
+ else {
329
+ return yield* runSequential(anchorIds, options);
330
+ }
331
+ }),
332
+ verifyAll: (options = {}) => Effect.gen(function* () {
333
+ const anchors = yield* anchorRepo.findAllValid();
334
+ const anchorIds = anchors
335
+ .filter((a) => !options.skipPinned || !a.pinned)
336
+ .map((a) => a.id);
337
+ const useSwarm = options.forceSwarm || anchorIds.length >= SWARM_THRESHOLD;
338
+ if (useSwarm) {
339
+ return yield* runSwarm(anchorIds, {
340
+ ...options,
341
+ detectedBy: options.detectedBy ?? "periodic"
342
+ });
343
+ }
344
+ else {
345
+ return yield* runSequential(anchorIds, {
346
+ ...options,
347
+ detectedBy: options.detectedBy ?? "periodic"
348
+ });
349
+ }
350
+ }),
351
+ verifyGlob: (globPattern, options = {}) => Effect.gen(function* () {
352
+ const allAnchors = yield* anchorRepo.findAll();
353
+ const matchingIds = allAnchors
354
+ .filter((a) => matchesGlob(a.filePath, globPattern))
355
+ .filter((a) => !options.skipPinned || !a.pinned)
356
+ .map((a) => a.id);
357
+ const useSwarm = options.forceSwarm || matchingIds.length >= SWARM_THRESHOLD;
358
+ if (useSwarm) {
359
+ return yield* runSwarm(matchingIds, {
360
+ ...options,
361
+ detectedBy: options.detectedBy ?? "manual"
362
+ });
363
+ }
364
+ else {
365
+ return yield* runSequential(matchingIds, {
366
+ ...options,
367
+ detectedBy: options.detectedBy ?? "manual"
368
+ });
369
+ }
370
+ }),
371
+ verifyChangedFiles: (filePaths, options = {}) => Effect.gen(function* () {
372
+ // Find anchors for all changed files
373
+ const anchorIdSet = new Set();
374
+ for (const filePath of filePaths) {
375
+ const anchors = yield* anchorRepo.findByFilePath(filePath);
376
+ for (const anchor of anchors) {
377
+ if (!options.skipPinned || !anchor.pinned) {
378
+ anchorIdSet.add(anchor.id);
379
+ }
380
+ }
381
+ }
382
+ const anchorIds = Array.from(anchorIdSet);
383
+ // Git hook context typically means large changes, use swarm
384
+ const useSwarm = options.forceSwarm || anchorIds.length >= SWARM_THRESHOLD;
385
+ if (useSwarm) {
386
+ return yield* runSwarm(anchorIds, {
387
+ ...options,
388
+ detectedBy: options.detectedBy ?? "git_hook"
389
+ });
390
+ }
391
+ else {
392
+ return yield* runSequential(anchorIds, {
393
+ ...options,
394
+ detectedBy: options.detectedBy ?? "git_hook"
395
+ });
396
+ }
397
+ })
398
+ };
399
+ }));
400
+ //# sourceMappingURL=swarm-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swarm-verification.js","sourceRoot":"","sources":["../../src/services/swarm-verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { DatabaseError, ValidationError } from "../errors.js";
3
+ import { SqliteClient } from "../db.js";
4
+ import { TaskService } from "./task-service.js";
5
+ import { TaskRepository } from "../repo/task-repo.js";
6
+ import { DependencyRepository } from "../repo/dep-repo.js";
7
+ /**
8
+ * Result of an export operation.
9
+ */
10
+ export interface ExportResult {
11
+ readonly opCount: number;
12
+ readonly path: string;
13
+ }
14
+ /**
15
+ * Result of an import operation.
16
+ */
17
+ export interface ImportResult {
18
+ readonly imported: number;
19
+ readonly skipped: number;
20
+ readonly conflicts: number;
21
+ }
22
+ /**
23
+ * Status of the sync system.
24
+ */
25
+ export interface SyncStatus {
26
+ readonly dbTaskCount: number;
27
+ readonly jsonlOpCount: number;
28
+ readonly lastExport: Date | null;
29
+ readonly lastImport: Date | null;
30
+ readonly isDirty: boolean;
31
+ readonly autoSyncEnabled: boolean;
32
+ }
33
+ /**
34
+ * Result of a compact operation.
35
+ */
36
+ export interface CompactResult {
37
+ readonly before: number;
38
+ readonly after: number;
39
+ }
40
+ /**
41
+ * Options for export operations.
42
+ */
43
+ export interface ExportOptions {
44
+ readonly learnings?: boolean;
45
+ readonly fileLearnings?: boolean;
46
+ readonly attempts?: boolean;
47
+ }
48
+ /**
49
+ * Result of an exportAll operation.
50
+ */
51
+ export interface ExportAllResult {
52
+ readonly tasks: ExportResult;
53
+ readonly learnings?: ExportResult;
54
+ readonly fileLearnings?: ExportResult;
55
+ readonly attempts?: ExportResult;
56
+ }
57
+ /**
58
+ * Result of an importAll operation.
59
+ */
60
+ export interface ImportAllResult {
61
+ readonly tasks: ImportResult;
62
+ readonly learnings?: ImportResult;
63
+ readonly fileLearnings?: ImportResult;
64
+ readonly attempts?: ImportResult;
65
+ }
66
+ declare const SyncService_base: Context.TagClass<SyncService, "SyncService", {
67
+ /**
68
+ * Export all tasks and dependencies to JSONL file.
69
+ * @param path Optional path (default: .tx/tasks.jsonl)
70
+ */
71
+ readonly export: (path?: string) => Effect.Effect<ExportResult, DatabaseError>;
72
+ /**
73
+ * Import tasks and dependencies from JSONL file.
74
+ * Uses timestamp-based conflict resolution (later wins).
75
+ * @param path Optional path (default: .tx/tasks.jsonl)
76
+ */
77
+ readonly import: (path?: string) => Effect.Effect<ImportResult, ValidationError | DatabaseError>;
78
+ /**
79
+ * Get current sync status.
80
+ */
81
+ readonly status: () => Effect.Effect<SyncStatus, DatabaseError>;
82
+ /**
83
+ * Enable auto-sync mode.
84
+ */
85
+ readonly enableAutoSync: () => Effect.Effect<void, DatabaseError>;
86
+ /**
87
+ * Disable auto-sync mode.
88
+ */
89
+ readonly disableAutoSync: () => Effect.Effect<void, DatabaseError>;
90
+ /**
91
+ * Check if auto-sync is enabled.
92
+ */
93
+ readonly isAutoSyncEnabled: () => Effect.Effect<boolean, DatabaseError>;
94
+ /**
95
+ * Compact the JSONL file by deduplicating operations.
96
+ */
97
+ readonly compact: (path?: string) => Effect.Effect<CompactResult, DatabaseError | ValidationError>;
98
+ /**
99
+ * Set last export timestamp in config.
100
+ */
101
+ readonly setLastExport: (timestamp: Date) => Effect.Effect<void, DatabaseError>;
102
+ /**
103
+ * Set last import timestamp in config.
104
+ */
105
+ readonly setLastImport: (timestamp: Date) => Effect.Effect<void, DatabaseError>;
106
+ }>;
107
+ /**
108
+ * SyncService provides JSONL-based export/import for git-tracked task syncing.
109
+ * See DD-009 for full specification.
110
+ */
111
+ export declare class SyncService extends SyncService_base {
112
+ }
113
+ export declare const SyncServiceLive: Layer.Layer<SyncService, never, SqliteClient | TaskRepository | DependencyRepository | TaskService>;
114
+ export {};
115
+ //# sourceMappingURL=sync-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-service.d.ts","sourceRoot":"","sources":["../../src/services/sync-service.ts"],"names":[],"mappings":"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"}