@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,35 @@
1
+ /**
2
+ * Worker mappers - convert database rows to domain objects
3
+ */
4
+ /**
5
+ * Valid worker statuses.
6
+ */
7
+ export const WORKER_STATUSES = ["starting", "idle", "busy", "stopping", "dead"];
8
+ /**
9
+ * Check if a string is a valid WorkerStatus.
10
+ */
11
+ export const isValidWorkerStatus = (s) => {
12
+ return WORKER_STATUSES.includes(s);
13
+ };
14
+ /**
15
+ * Convert a database row to a Worker domain object.
16
+ * Throws if status is invalid.
17
+ */
18
+ export const rowToWorker = (row) => {
19
+ if (!isValidWorkerStatus(row.status)) {
20
+ throw new Error(`Invalid worker status: ${row.status}`);
21
+ }
22
+ return {
23
+ id: row.id,
24
+ name: row.name,
25
+ hostname: row.hostname,
26
+ pid: row.pid,
27
+ status: row.status,
28
+ registeredAt: new Date(row.registered_at),
29
+ lastHeartbeatAt: new Date(row.last_heartbeat_at),
30
+ currentTaskId: row.current_task_id,
31
+ capabilities: JSON.parse(row.capabilities || "[]"),
32
+ metadata: JSON.parse(row.metadata || "{}")
33
+ };
34
+ };
35
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/mappers/worker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAU,CAAA;AAExF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAS,EAAqB,EAAE;IAClE,OAAQ,eAAqC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAc,EAAU,EAAE;IACpD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACzC,eAAe,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAChD,aAAa,EAAE,GAAG,CAAC,eAAe;QAClC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;QAClD,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC;KAC3C,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,52 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import type { Anchor, CreateAnchorInput, UpdateAnchorInput, AnchorStatus, InvalidationLog, InvalidationSource } from "@jamesaphoenix/tx-types";
5
+ /** Input for logging an invalidation event */
6
+ export interface LogInvalidationInput {
7
+ readonly anchorId: number;
8
+ readonly oldStatus: AnchorStatus;
9
+ readonly newStatus: AnchorStatus;
10
+ readonly reason: string;
11
+ readonly detectedBy: InvalidationSource;
12
+ readonly oldContentHash?: string | null;
13
+ readonly newContentHash?: string | null;
14
+ readonly similarityScore?: number | null;
15
+ }
16
+ declare const AnchorRepository_base: Context.TagClass<AnchorRepository, "AnchorRepository", {
17
+ readonly create: (input: CreateAnchorInput) => Effect.Effect<Anchor, DatabaseError>;
18
+ readonly findById: (id: number) => Effect.Effect<Anchor | null, DatabaseError>;
19
+ readonly findByLearningId: (learningId: number) => Effect.Effect<readonly Anchor[], DatabaseError>;
20
+ readonly findByFilePath: (filePath: string) => Effect.Effect<readonly Anchor[], DatabaseError>;
21
+ readonly update: (id: number, input: UpdateAnchorInput) => Effect.Effect<Anchor | null, DatabaseError>;
22
+ readonly delete: (id: number) => Effect.Effect<boolean, DatabaseError>;
23
+ readonly findDrifted: () => Effect.Effect<readonly Anchor[], DatabaseError>;
24
+ readonly findInvalid: () => Effect.Effect<readonly Anchor[], DatabaseError>;
25
+ readonly updateStatus: (id: number, status: AnchorStatus) => Effect.Effect<boolean, DatabaseError>;
26
+ readonly updateVerifiedAt: (id: number) => Effect.Effect<boolean, DatabaseError>;
27
+ /** Find all anchors */
28
+ readonly findAll: () => Effect.Effect<readonly Anchor[], DatabaseError>;
29
+ /** Find all valid anchors (for verification) */
30
+ readonly findAllValid: () => Effect.Effect<readonly Anchor[], DatabaseError>;
31
+ /** Set pinned status */
32
+ readonly setPinned: (id: number, pinned: boolean) => Effect.Effect<boolean, DatabaseError>;
33
+ /** Delete old invalid anchors */
34
+ readonly deleteOldInvalid: (olderThanDays: number) => Effect.Effect<number, DatabaseError>;
35
+ /** Log an invalidation event */
36
+ readonly logInvalidation: (input: LogInvalidationInput) => Effect.Effect<InvalidationLog, DatabaseError>;
37
+ /** Get invalidation logs for an anchor */
38
+ readonly getInvalidationLogs: (anchorId?: number) => Effect.Effect<readonly InvalidationLog[], DatabaseError>;
39
+ /** Get anchor status summary */
40
+ readonly getStatusSummary: () => Effect.Effect<{
41
+ valid: number;
42
+ drifted: number;
43
+ invalid: number;
44
+ pinned: number;
45
+ total: number;
46
+ }, DatabaseError>;
47
+ }>;
48
+ export declare class AnchorRepository extends AnchorRepository_base {
49
+ }
50
+ export declare const AnchorRepositoryLive: Layer.Layer<AnchorRepository, never, SqliteClient>;
51
+ export {};
52
+ //# sourceMappingURL=anchor-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-repo.d.ts","sourceRoot":"","sources":["../../src/repo/anchor-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import { rowToAnchor, rowToInvalidationLog } from "../mappers/anchor.js";
5
+ export class AnchorRepository extends Context.Tag("AnchorRepository")() {
6
+ }
7
+ export const AnchorRepositoryLive = Layer.effect(AnchorRepository, Effect.gen(function* () {
8
+ const db = yield* SqliteClient;
9
+ return {
10
+ create: (input) => Effect.try({
11
+ try: () => {
12
+ const result = db.prepare(`INSERT INTO learning_anchors
13
+ (learning_id, anchor_type, anchor_value, file_path, symbol_fqname, line_start, line_end, content_hash, content_preview)
14
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(input.learningId, input.anchorType, input.anchorValue, input.filePath, input.symbolFqname ?? null, input.lineStart ?? null, input.lineEnd ?? null, input.contentHash ?? null, input.contentPreview ?? null);
15
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(result.lastInsertRowid);
16
+ return rowToAnchor(row);
17
+ },
18
+ catch: (cause) => new DatabaseError({ cause })
19
+ }),
20
+ findById: (id) => Effect.try({
21
+ try: () => {
22
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(id);
23
+ return row ? rowToAnchor(row) : null;
24
+ },
25
+ catch: (cause) => new DatabaseError({ cause })
26
+ }),
27
+ findByLearningId: (learningId) => Effect.try({
28
+ try: () => {
29
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE learning_id = ? ORDER BY created_at ASC").all(learningId);
30
+ return rows.map(rowToAnchor);
31
+ },
32
+ catch: (cause) => new DatabaseError({ cause })
33
+ }),
34
+ findByFilePath: (filePath) => Effect.try({
35
+ try: () => {
36
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE file_path = ? ORDER BY created_at ASC").all(filePath);
37
+ return rows.map(rowToAnchor);
38
+ },
39
+ catch: (cause) => new DatabaseError({ cause })
40
+ }),
41
+ update: (id, input) => Effect.try({
42
+ try: () => {
43
+ const updates = [];
44
+ const values = [];
45
+ if (input.anchorValue !== undefined) {
46
+ updates.push("anchor_value = ?");
47
+ values.push(input.anchorValue);
48
+ }
49
+ if (input.filePath !== undefined) {
50
+ updates.push("file_path = ?");
51
+ values.push(input.filePath);
52
+ }
53
+ if (input.symbolFqname !== undefined) {
54
+ updates.push("symbol_fqname = ?");
55
+ values.push(input.symbolFqname);
56
+ }
57
+ if (input.lineStart !== undefined) {
58
+ updates.push("line_start = ?");
59
+ values.push(input.lineStart);
60
+ }
61
+ if (input.lineEnd !== undefined) {
62
+ updates.push("line_end = ?");
63
+ values.push(input.lineEnd);
64
+ }
65
+ if (input.contentHash !== undefined) {
66
+ updates.push("content_hash = ?");
67
+ values.push(input.contentHash);
68
+ }
69
+ if (input.contentPreview !== undefined) {
70
+ updates.push("content_preview = ?");
71
+ values.push(input.contentPreview);
72
+ }
73
+ if (input.status !== undefined) {
74
+ updates.push("status = ?");
75
+ values.push(input.status);
76
+ }
77
+ if (input.verifiedAt !== undefined) {
78
+ updates.push("verified_at = ?");
79
+ values.push(input.verifiedAt ? input.verifiedAt.toISOString() : null);
80
+ }
81
+ if (updates.length === 0) {
82
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(id);
83
+ return row ? rowToAnchor(row) : null;
84
+ }
85
+ values.push(id);
86
+ const result = db.prepare(`UPDATE learning_anchors SET ${updates.join(", ")} WHERE id = ?`).run(...values);
87
+ if (result.changes === 0) {
88
+ return null;
89
+ }
90
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(id);
91
+ return rowToAnchor(row);
92
+ },
93
+ catch: (cause) => new DatabaseError({ cause })
94
+ }),
95
+ delete: (id) => Effect.try({
96
+ try: () => {
97
+ const result = db.prepare("DELETE FROM learning_anchors WHERE id = ?").run(id);
98
+ return result.changes > 0;
99
+ },
100
+ catch: (cause) => new DatabaseError({ cause })
101
+ }),
102
+ findDrifted: () => Effect.try({
103
+ try: () => {
104
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE status = 'drifted' ORDER BY created_at ASC").all();
105
+ return rows.map(rowToAnchor);
106
+ },
107
+ catch: (cause) => new DatabaseError({ cause })
108
+ }),
109
+ findInvalid: () => Effect.try({
110
+ try: () => {
111
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE status = 'invalid' ORDER BY created_at ASC").all();
112
+ return rows.map(rowToAnchor);
113
+ },
114
+ catch: (cause) => new DatabaseError({ cause })
115
+ }),
116
+ updateStatus: (id, status) => Effect.try({
117
+ try: () => {
118
+ const result = db.prepare("UPDATE learning_anchors SET status = ? WHERE id = ?").run(status, id);
119
+ return result.changes > 0;
120
+ },
121
+ catch: (cause) => new DatabaseError({ cause })
122
+ }),
123
+ updateVerifiedAt: (id) => Effect.try({
124
+ try: () => {
125
+ const result = db.prepare("UPDATE learning_anchors SET verified_at = datetime('now') WHERE id = ?").run(id);
126
+ return result.changes > 0;
127
+ },
128
+ catch: (cause) => new DatabaseError({ cause })
129
+ }),
130
+ findAll: () => Effect.try({
131
+ try: () => {
132
+ const rows = db.prepare("SELECT * FROM learning_anchors ORDER BY created_at DESC").all();
133
+ return rows.map(rowToAnchor);
134
+ },
135
+ catch: (cause) => new DatabaseError({ cause })
136
+ }),
137
+ findAllValid: () => Effect.try({
138
+ try: () => {
139
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE status = 'valid' ORDER BY created_at DESC").all();
140
+ return rows.map(rowToAnchor);
141
+ },
142
+ catch: (cause) => new DatabaseError({ cause })
143
+ }),
144
+ setPinned: (id, pinned) => Effect.try({
145
+ try: () => {
146
+ const result = db.prepare("UPDATE learning_anchors SET pinned = ? WHERE id = ?").run(pinned ? 1 : 0, id);
147
+ return result.changes > 0;
148
+ },
149
+ catch: (cause) => new DatabaseError({ cause })
150
+ }),
151
+ deleteOldInvalid: (olderThanDays) => Effect.try({
152
+ try: () => {
153
+ const result = db.prepare(`DELETE FROM learning_anchors
154
+ WHERE status = 'invalid'
155
+ AND created_at < datetime('now', '-' || ? || ' days')`).run(olderThanDays);
156
+ return result.changes;
157
+ },
158
+ catch: (cause) => new DatabaseError({ cause })
159
+ }),
160
+ logInvalidation: (input) => Effect.try({
161
+ try: () => {
162
+ const result = db.prepare(`INSERT INTO invalidation_log
163
+ (anchor_id, old_status, new_status, reason, detected_by, old_content_hash, new_content_hash, similarity_score)
164
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(input.anchorId, input.oldStatus, input.newStatus, input.reason, input.detectedBy, input.oldContentHash ?? null, input.newContentHash ?? null, input.similarityScore ?? null);
165
+ const row = db.prepare("SELECT * FROM invalidation_log WHERE id = ?").get(result.lastInsertRowid);
166
+ return rowToInvalidationLog(row);
167
+ },
168
+ catch: (cause) => new DatabaseError({ cause })
169
+ }),
170
+ getInvalidationLogs: (anchorId) => Effect.try({
171
+ try: () => {
172
+ if (anchorId !== undefined) {
173
+ const rows = db.prepare("SELECT * FROM invalidation_log WHERE anchor_id = ? ORDER BY invalidated_at DESC, id DESC").all(anchorId);
174
+ return rows.map(rowToInvalidationLog);
175
+ }
176
+ const rows = db.prepare("SELECT * FROM invalidation_log ORDER BY invalidated_at DESC, id DESC LIMIT 100").all();
177
+ return rows.map(rowToInvalidationLog);
178
+ },
179
+ catch: (cause) => new DatabaseError({ cause })
180
+ }),
181
+ getStatusSummary: () => Effect.try({
182
+ try: () => {
183
+ const result = db.prepare(`
184
+ SELECT
185
+ COUNT(*) as total,
186
+ SUM(CASE WHEN status = 'valid' THEN 1 ELSE 0 END) as valid,
187
+ SUM(CASE WHEN status = 'drifted' THEN 1 ELSE 0 END) as drifted,
188
+ SUM(CASE WHEN status = 'invalid' THEN 1 ELSE 0 END) as invalid,
189
+ SUM(CASE WHEN pinned = 1 THEN 1 ELSE 0 END) as pinned
190
+ FROM learning_anchors
191
+ `).get();
192
+ return {
193
+ total: result.total ?? 0,
194
+ valid: result.valid ?? 0,
195
+ drifted: result.drifted ?? 0,
196
+ invalid: result.invalid ?? 0,
197
+ pinned: result.pinned ?? 0
198
+ };
199
+ },
200
+ catch: (cause) => new DatabaseError({ cause })
201
+ })
202
+ };
203
+ }));
204
+ //# sourceMappingURL=anchor-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-repo.js","sourceRoot":"","sources":["../../src/repo/anchor-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import type { Attempt, AttemptId, CreateAttemptInput } from "@jamesaphoenix/tx-types";
5
+ declare const AttemptRepository_base: Context.TagClass<AttemptRepository, "AttemptRepository", {
6
+ /** Insert a new attempt record */
7
+ readonly insert: (input: CreateAttemptInput) => Effect.Effect<Attempt, DatabaseError>;
8
+ /** Find an attempt by ID */
9
+ readonly findById: (id: AttemptId) => Effect.Effect<Attempt | null, DatabaseError>;
10
+ /** Find all attempts */
11
+ readonly findAll: () => Effect.Effect<readonly Attempt[], DatabaseError>;
12
+ /** Find all attempts for a task */
13
+ readonly findByTaskId: (taskId: string) => Effect.Effect<readonly Attempt[], DatabaseError>;
14
+ /** Count attempts, optionally filtered by task */
15
+ readonly count: (taskId?: string) => Effect.Effect<number, DatabaseError>;
16
+ /** Remove an attempt by ID */
17
+ readonly remove: (id: AttemptId) => Effect.Effect<void, DatabaseError>;
18
+ /** Get failed attempt counts for multiple tasks in a single query */
19
+ readonly getFailedCountsForTasks: (taskIds: readonly string[]) => Effect.Effect<Map<string, number>, DatabaseError>;
20
+ }>;
21
+ export declare class AttemptRepository extends AttemptRepository_base {
22
+ }
23
+ export declare const AttemptRepositoryLive: Layer.Layer<AttemptRepository, never, SqliteClient>;
24
+ export {};
25
+ //# sourceMappingURL=attempt-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-repo.d.ts","sourceRoot":"","sources":["../../src/repo/attempt-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAc,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;;IAK7F,kCAAkC;qBACjB,CAAC,KAAK,EAAE,kBAAkB,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;IAErF,4BAA4B;uBACT,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,aAAa,CAAC;IAElF,wBAAwB;sBACN,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,aAAa,CAAC;IAExE,mCAAmC;2BACZ,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,aAAa,CAAC;IAE3F,kDAAkD;oBAClC,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEzE,8BAA8B;qBACb,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;IAEtE,qEAAqE;sCACnC,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC;;AAtBvH,qBAAa,iBAAkB,SAAQ,sBAwBpC;CAAG;AAEN,eAAO,MAAM,qBAAqB,qDAuGjC,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import { rowToAttempt } from "../mappers/attempt.js";
5
+ export class AttemptRepository extends Context.Tag("AttemptRepository")() {
6
+ }
7
+ export const AttemptRepositoryLive = Layer.effect(AttemptRepository, Effect.gen(function* () {
8
+ const db = yield* SqliteClient;
9
+ return {
10
+ insert: (input) => Effect.try({
11
+ try: () => {
12
+ const now = new Date().toISOString();
13
+ const result = db.prepare(`INSERT INTO attempts (task_id, approach, outcome, reason, created_at)
14
+ VALUES (?, ?, ?, ?, ?)`).run(input.taskId, input.approach, input.outcome, input.reason ?? null, now);
15
+ // Fetch the inserted row
16
+ const row = db.prepare("SELECT * FROM attempts WHERE id = ?").get(result.lastInsertRowid);
17
+ return rowToAttempt(row);
18
+ },
19
+ catch: (cause) => new DatabaseError({ cause })
20
+ }),
21
+ findById: (id) => Effect.try({
22
+ try: () => {
23
+ const row = db.prepare("SELECT * FROM attempts WHERE id = ?").get(id);
24
+ return row ? rowToAttempt(row) : null;
25
+ },
26
+ catch: (cause) => new DatabaseError({ cause })
27
+ }),
28
+ findAll: () => Effect.try({
29
+ try: () => {
30
+ const rows = db.prepare("SELECT * FROM attempts ORDER BY created_at ASC").all();
31
+ return rows.map(rowToAttempt);
32
+ },
33
+ catch: (cause) => new DatabaseError({ cause })
34
+ }),
35
+ findByTaskId: (taskId) => Effect.try({
36
+ try: () => {
37
+ const rows = db.prepare("SELECT * FROM attempts WHERE task_id = ? ORDER BY created_at DESC").all(taskId);
38
+ return rows.map(rowToAttempt);
39
+ },
40
+ catch: (cause) => new DatabaseError({ cause })
41
+ }),
42
+ count: (taskId) => Effect.try({
43
+ try: () => {
44
+ if (taskId) {
45
+ const result = db.prepare("SELECT COUNT(*) as cnt FROM attempts WHERE task_id = ?").get(taskId);
46
+ return result.cnt;
47
+ }
48
+ const result = db.prepare("SELECT COUNT(*) as cnt FROM attempts").get();
49
+ return result.cnt;
50
+ },
51
+ catch: (cause) => new DatabaseError({ cause })
52
+ }),
53
+ remove: (id) => Effect.try({
54
+ try: () => {
55
+ db.prepare("DELETE FROM attempts WHERE id = ?").run(id);
56
+ },
57
+ catch: (cause) => new DatabaseError({ cause })
58
+ }),
59
+ getFailedCountsForTasks: (taskIds) => Effect.try({
60
+ try: () => {
61
+ if (taskIds.length === 0) {
62
+ return new Map();
63
+ }
64
+ const placeholders = taskIds.map(() => "?").join(", ");
65
+ const rows = db.prepare(`SELECT task_id, COUNT(*) as cnt FROM attempts
66
+ WHERE task_id IN (${placeholders}) AND outcome = 'failed'
67
+ GROUP BY task_id`).all(...taskIds);
68
+ const result = new Map();
69
+ for (const row of rows) {
70
+ result.set(row.task_id, row.cnt);
71
+ }
72
+ return result;
73
+ },
74
+ catch: (cause) => new DatabaseError({ cause })
75
+ })
76
+ };
77
+ }));
78
+ //# sourceMappingURL=attempt-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt-repo.js","sourceRoot":"","sources":["../../src/repo/attempt-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import type { LearningCandidate, CreateCandidateInput, UpdateCandidateInput, CandidateFilter, CandidateStatus } from "@jamesaphoenix/tx-types";
5
+ declare const CandidateRepository_base: Context.TagClass<CandidateRepository, "CandidateRepository", {
6
+ readonly insert: (input: CreateCandidateInput) => Effect.Effect<LearningCandidate, DatabaseError>;
7
+ readonly findById: (id: number) => Effect.Effect<LearningCandidate | null, DatabaseError>;
8
+ readonly findByFilter: (filter: CandidateFilter) => Effect.Effect<readonly LearningCandidate[], DatabaseError>;
9
+ readonly update: (id: number, input: UpdateCandidateInput) => Effect.Effect<LearningCandidate | null, DatabaseError>;
10
+ readonly updateStatus: (id: number, status: CandidateStatus) => Effect.Effect<LearningCandidate | null, DatabaseError>;
11
+ }>;
12
+ export declare class CandidateRepository extends CandidateRepository_base {
13
+ }
14
+ export declare const CandidateRepositoryLive: Layer.Layer<CandidateRepository, never, SqliteClient>;
15
+ export {};
16
+ //# sourceMappingURL=candidate-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-repo.d.ts","sourceRoot":"","sources":["../../src/repo/candidate-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EACV,iBAAiB,EAEjB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,eAAe,EAChB,MAAM,yBAAyB,CAAA;;qBAKX,CAAC,KAAK,EAAE,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;uBAC9E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,EAAE,aAAa,CAAC;2BAClE,CAAC,MAAM,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,iBAAiB,EAAE,EAAE,aAAa,CAAC;qBAC7F,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,KAAK,MAAM,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,EAAE,aAAa,CAAC;2BAC7F,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,EAAE,aAAa,CAAC;;AAP1H,qBAAa,mBAAoB,SAAQ,wBAStC;CAAG;AAEN,eAAO,MAAM,uBAAuB,uDA6LnC,CAAA"}
@@ -0,0 +1,143 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import { rowToCandidate } from "../mappers/candidate.js";
5
+ export class CandidateRepository extends Context.Tag("CandidateRepository")() {
6
+ }
7
+ export const CandidateRepositoryLive = Layer.effect(CandidateRepository, Effect.gen(function* () {
8
+ const db = yield* SqliteClient;
9
+ return {
10
+ insert: (input) => Effect.try({
11
+ try: () => {
12
+ const now = new Date().toISOString();
13
+ const result = db.prepare(`INSERT INTO learning_candidates
14
+ (content, confidence, category, source_file, source_run_id, source_task_id, extracted_at, status)
15
+ VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')`).run(input.content, input.confidence, input.category ?? null, input.sourceFile, input.sourceRunId ?? null, input.sourceTaskId ?? null, now);
16
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(result.lastInsertRowid);
17
+ return rowToCandidate(row);
18
+ },
19
+ catch: (cause) => new DatabaseError({ cause })
20
+ }),
21
+ findById: (id) => Effect.try({
22
+ try: () => {
23
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
24
+ return row ? rowToCandidate(row) : null;
25
+ },
26
+ catch: (cause) => new DatabaseError({ cause })
27
+ }),
28
+ findByFilter: (filter) => Effect.try({
29
+ try: () => {
30
+ const conditions = [];
31
+ const values = [];
32
+ // Status filter (supports single or array)
33
+ if (filter.status !== undefined) {
34
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
35
+ if (statuses.length > 0) {
36
+ conditions.push(`status IN (${statuses.map(() => "?").join(", ")})`);
37
+ values.push(...statuses);
38
+ }
39
+ }
40
+ // Confidence filter (supports single or array)
41
+ if (filter.confidence !== undefined) {
42
+ const confidences = Array.isArray(filter.confidence) ? filter.confidence : [filter.confidence];
43
+ if (confidences.length > 0) {
44
+ conditions.push(`confidence IN (${confidences.map(() => "?").join(", ")})`);
45
+ values.push(...confidences);
46
+ }
47
+ }
48
+ // Category filter (supports single or array)
49
+ if (filter.category !== undefined) {
50
+ const categories = Array.isArray(filter.category) ? filter.category : [filter.category];
51
+ if (categories.length > 0) {
52
+ conditions.push(`category IN (${categories.map(() => "?").join(", ")})`);
53
+ values.push(...categories);
54
+ }
55
+ }
56
+ // Source file filter
57
+ if (filter.sourceFile !== undefined) {
58
+ conditions.push("source_file = ?");
59
+ values.push(filter.sourceFile);
60
+ }
61
+ // Source run ID filter
62
+ if (filter.sourceRunId !== undefined) {
63
+ conditions.push("source_run_id = ?");
64
+ values.push(filter.sourceRunId);
65
+ }
66
+ // Source task ID filter
67
+ if (filter.sourceTaskId !== undefined) {
68
+ conditions.push("source_task_id = ?");
69
+ values.push(filter.sourceTaskId);
70
+ }
71
+ // Build query
72
+ let sql = "SELECT * FROM learning_candidates";
73
+ if (conditions.length > 0) {
74
+ sql += ` WHERE ${conditions.join(" AND ")}`;
75
+ }
76
+ sql += " ORDER BY extracted_at DESC";
77
+ // Limit and offset
78
+ if (filter.limit !== undefined) {
79
+ sql += " LIMIT ?";
80
+ values.push(filter.limit);
81
+ if (filter.offset !== undefined) {
82
+ sql += " OFFSET ?";
83
+ values.push(filter.offset);
84
+ }
85
+ }
86
+ const rows = db.prepare(sql).all(...values);
87
+ return rows.map(rowToCandidate);
88
+ },
89
+ catch: (cause) => new DatabaseError({ cause })
90
+ }),
91
+ update: (id, input) => Effect.try({
92
+ try: () => {
93
+ const updates = [];
94
+ const values = [];
95
+ if (input.status !== undefined) {
96
+ updates.push("status = ?");
97
+ values.push(input.status);
98
+ }
99
+ if (input.reviewedAt !== undefined) {
100
+ updates.push("reviewed_at = ?");
101
+ values.push(input.reviewedAt.toISOString());
102
+ }
103
+ if (input.reviewedBy !== undefined) {
104
+ updates.push("reviewed_by = ?");
105
+ values.push(input.reviewedBy);
106
+ }
107
+ if (input.promotedLearningId !== undefined) {
108
+ updates.push("promoted_learning_id = ?");
109
+ values.push(input.promotedLearningId);
110
+ }
111
+ if (input.rejectionReason !== undefined) {
112
+ updates.push("rejection_reason = ?");
113
+ values.push(input.rejectionReason);
114
+ }
115
+ if (updates.length === 0) {
116
+ // No updates, just return the current row
117
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
118
+ return row ? rowToCandidate(row) : null;
119
+ }
120
+ values.push(id);
121
+ const result = db.prepare(`UPDATE learning_candidates SET ${updates.join(", ")} WHERE id = ?`).run(...values);
122
+ if (result.changes === 0) {
123
+ return null;
124
+ }
125
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
126
+ return rowToCandidate(row);
127
+ },
128
+ catch: (cause) => new DatabaseError({ cause })
129
+ }),
130
+ updateStatus: (id, status) => Effect.try({
131
+ try: () => {
132
+ const result = db.prepare("UPDATE learning_candidates SET status = ? WHERE id = ?").run(status, id);
133
+ if (result.changes === 0) {
134
+ return null;
135
+ }
136
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
137
+ return rowToCandidate(row);
138
+ },
139
+ catch: (cause) => new DatabaseError({ cause })
140
+ })
141
+ };
142
+ }));
143
+ //# sourceMappingURL=candidate-repo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-repo.js","sourceRoot":"","sources":["../../src/repo/candidate-repo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import type { TaskClaim } from "../schemas/worker.js";
5
+ declare const ClaimRepository_base: Context.TagClass<ClaimRepository, "ClaimRepository", {
6
+ readonly insert: (claim: Omit<TaskClaim, "id">) => Effect.Effect<TaskClaim, DatabaseError>;
7
+ readonly update: (claim: TaskClaim) => Effect.Effect<void, DatabaseError>;
8
+ readonly findById: (id: number) => Effect.Effect<TaskClaim | null, DatabaseError>;
9
+ readonly findActiveByTaskId: (taskId: string) => Effect.Effect<TaskClaim | null, DatabaseError>;
10
+ readonly findExpired: (now: Date) => Effect.Effect<readonly TaskClaim[], DatabaseError>;
11
+ readonly releaseAllByWorkerId: (workerId: string) => Effect.Effect<number, DatabaseError>;
12
+ }>;
13
+ export declare class ClaimRepository extends ClaimRepository_base {
14
+ }
15
+ export declare const ClaimRepositoryLive: Layer.Layer<ClaimRepository, never, SqliteClient>;
16
+ export {};
17
+ //# sourceMappingURL=claim-repo.d.ts.map