@jamesaphoenix/tx-core 0.4.4 → 0.5.0

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 (199) hide show
  1. package/dist/db.d.ts +4 -9
  2. package/dist/db.d.ts.map +1 -1
  3. package/dist/db.js +6 -80
  4. package/dist/db.js.map +1 -1
  5. package/dist/errors.d.ts +67 -10
  6. package/dist/errors.d.ts.map +1 -1
  7. package/dist/errors.js +44 -10
  8. package/dist/errors.js.map +1 -1
  9. package/dist/index.d.ts +12 -7
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +22 -28
  12. package/dist/index.js.map +1 -1
  13. package/dist/layer.d.ts +22 -10
  14. package/dist/layer.d.ts.map +1 -1
  15. package/dist/layer.js +97 -39
  16. package/dist/layer.js.map +1 -1
  17. package/dist/mappers/anchor.d.ts +28 -0
  18. package/dist/mappers/anchor.d.ts.map +1 -0
  19. package/dist/mappers/anchor.js +105 -0
  20. package/dist/mappers/anchor.js.map +1 -0
  21. package/dist/mappers/candidate.d.ts +25 -0
  22. package/dist/mappers/candidate.d.ts.map +1 -0
  23. package/dist/mappers/candidate.js +83 -0
  24. package/dist/mappers/candidate.js.map +1 -0
  25. package/dist/mappers/doc.d.ts +2 -4
  26. package/dist/mappers/doc.d.ts.map +1 -1
  27. package/dist/mappers/doc.js +7 -4
  28. package/dist/mappers/doc.js.map +1 -1
  29. package/dist/mappers/edge.d.ts +19 -0
  30. package/dist/mappers/edge.d.ts.map +1 -0
  31. package/dist/mappers/edge.js +81 -0
  32. package/dist/mappers/edge.js.map +1 -0
  33. package/dist/mappers/index.d.ts +7 -3
  34. package/dist/mappers/index.d.ts.map +1 -1
  35. package/dist/mappers/index.js +14 -6
  36. package/dist/mappers/index.js.map +1 -1
  37. package/dist/mappers/message.d.ts +15 -0
  38. package/dist/mappers/message.d.ts.map +1 -0
  39. package/dist/mappers/message.js +58 -0
  40. package/dist/mappers/message.js.map +1 -0
  41. package/dist/repo/anchor-repo.d.ts +52 -0
  42. package/dist/repo/anchor-repo.d.ts.map +1 -0
  43. package/dist/repo/anchor-repo.js +245 -0
  44. package/dist/repo/anchor-repo.js.map +1 -0
  45. package/dist/repo/candidate-repo.d.ts +16 -0
  46. package/dist/repo/candidate-repo.d.ts.map +1 -0
  47. package/dist/repo/candidate-repo.js +164 -0
  48. package/dist/repo/candidate-repo.js.map +1 -0
  49. package/dist/repo/compaction-repo.d.ts +41 -0
  50. package/dist/repo/compaction-repo.d.ts.map +1 -0
  51. package/dist/repo/compaction-repo.js +84 -0
  52. package/dist/repo/compaction-repo.js.map +1 -0
  53. package/dist/repo/doc-repo.d.ts +68 -51
  54. package/dist/repo/doc-repo.d.ts.map +1 -1
  55. package/dist/repo/doc-repo.js +120 -54
  56. package/dist/repo/doc-repo.js.map +1 -1
  57. package/dist/repo/edge-repo.d.ts +26 -0
  58. package/dist/repo/edge-repo.d.ts.map +1 -0
  59. package/dist/repo/edge-repo.js +258 -0
  60. package/dist/repo/edge-repo.js.map +1 -0
  61. package/dist/repo/index.d.ts +8 -3
  62. package/dist/repo/index.d.ts.map +1 -1
  63. package/dist/repo/index.js +7 -2
  64. package/dist/repo/index.js.map +1 -1
  65. package/dist/repo/message-repo.d.ts +55 -0
  66. package/dist/repo/message-repo.d.ts.map +1 -0
  67. package/dist/repo/message-repo.js +132 -0
  68. package/dist/repo/message-repo.js.map +1 -0
  69. package/dist/services/agent-service.d.ts +18 -23
  70. package/dist/services/agent-service.d.ts.map +1 -1
  71. package/dist/services/agent-service.js +9 -0
  72. package/dist/services/agent-service.js.map +1 -1
  73. package/dist/services/anchor-service.d.ts +147 -0
  74. package/dist/services/anchor-service.d.ts.map +1 -0
  75. package/dist/services/anchor-service.js +540 -0
  76. package/dist/services/anchor-service.js.map +1 -0
  77. package/dist/services/anchor-verification.d.ts +102 -0
  78. package/dist/services/anchor-verification.d.ts.map +1 -0
  79. package/dist/services/anchor-verification.js +817 -0
  80. package/dist/services/anchor-verification.js.map +1 -0
  81. package/dist/services/ast-grep-service.d.ts +58 -0
  82. package/dist/services/ast-grep-service.d.ts.map +1 -0
  83. package/dist/services/ast-grep-service.js +427 -0
  84. package/dist/services/ast-grep-service.js.map +1 -0
  85. package/dist/services/attempt-service.d.ts.map +1 -1
  86. package/dist/services/attempt-service.js +4 -1
  87. package/dist/services/attempt-service.js.map +1 -1
  88. package/dist/services/auto-sync-service.d.ts.map +1 -1
  89. package/dist/services/auto-sync-service.js +7 -7
  90. package/dist/services/auto-sync-service.js.map +1 -1
  91. package/dist/services/candidate-extractor-service.d.ts +44 -0
  92. package/dist/services/candidate-extractor-service.d.ts.map +1 -0
  93. package/dist/services/candidate-extractor-service.js +175 -0
  94. package/dist/services/candidate-extractor-service.js.map +1 -0
  95. package/dist/services/claim-service.d.ts.map +1 -1
  96. package/dist/services/claim-service.js +0 -8
  97. package/dist/services/claim-service.js.map +1 -1
  98. package/dist/services/compaction-service.d.ts +105 -0
  99. package/dist/services/compaction-service.d.ts.map +1 -0
  100. package/dist/services/compaction-service.js +281 -0
  101. package/dist/services/compaction-service.js.map +1 -0
  102. package/dist/services/cycle-scan-service.d.ts +1 -5
  103. package/dist/services/cycle-scan-service.d.ts.map +1 -1
  104. package/dist/services/cycle-scan-service.js +49 -19
  105. package/dist/services/cycle-scan-service.js.map +1 -1
  106. package/dist/services/daemon-service.d.ts +2 -8
  107. package/dist/services/daemon-service.d.ts.map +1 -1
  108. package/dist/services/daemon-service.js +21 -35
  109. package/dist/services/daemon-service.js.map +1 -1
  110. package/dist/services/doc-service.d.ts +25 -32
  111. package/dist/services/doc-service.d.ts.map +1 -1
  112. package/dist/services/doc-service.js +206 -190
  113. package/dist/services/doc-service.js.map +1 -1
  114. package/dist/services/edge-service.d.ts +78 -0
  115. package/dist/services/edge-service.d.ts.map +1 -0
  116. package/dist/services/edge-service.js +158 -0
  117. package/dist/services/edge-service.js.map +1 -0
  118. package/dist/services/embedding-service.d.ts +2 -2
  119. package/dist/services/embedding-service.d.ts.map +1 -1
  120. package/dist/services/embedding-service.js +7 -13
  121. package/dist/services/embedding-service.js.map +1 -1
  122. package/dist/services/feedback-tracker.d.ts +64 -0
  123. package/dist/services/feedback-tracker.d.ts.map +1 -0
  124. package/dist/services/feedback-tracker.js +110 -0
  125. package/dist/services/feedback-tracker.js.map +1 -0
  126. package/dist/services/file-watcher-service.d.ts.map +1 -1
  127. package/dist/services/file-watcher-service.js +1 -3
  128. package/dist/services/file-watcher-service.js.map +1 -1
  129. package/dist/services/graph-expansion.d.ts +158 -0
  130. package/dist/services/graph-expansion.d.ts.map +1 -0
  131. package/dist/services/graph-expansion.js +487 -0
  132. package/dist/services/graph-expansion.js.map +1 -0
  133. package/dist/services/index.d.ts +19 -8
  134. package/dist/services/index.d.ts.map +1 -1
  135. package/dist/services/index.js +18 -7
  136. package/dist/services/index.js.map +1 -1
  137. package/dist/services/learning-service.d.ts.map +1 -1
  138. package/dist/services/learning-service.js +22 -14
  139. package/dist/services/learning-service.js.map +1 -1
  140. package/dist/services/llm-service.d.ts +61 -39
  141. package/dist/services/llm-service.d.ts.map +1 -1
  142. package/dist/services/llm-service.js +199 -113
  143. package/dist/services/llm-service.js.map +1 -1
  144. package/dist/services/message-service.d.ts +57 -0
  145. package/dist/services/message-service.d.ts.map +1 -0
  146. package/dist/services/message-service.js +78 -0
  147. package/dist/services/message-service.js.map +1 -0
  148. package/dist/services/orchestrator-service.d.ts.map +1 -1
  149. package/dist/services/orchestrator-service.js +19 -20
  150. package/dist/services/orchestrator-service.js.map +1 -1
  151. package/dist/services/promotion-service.d.ts +67 -0
  152. package/dist/services/promotion-service.d.ts.map +1 -0
  153. package/dist/services/promotion-service.js +151 -0
  154. package/dist/services/promotion-service.js.map +1 -0
  155. package/dist/services/query-expansion-service.d.ts +7 -22
  156. package/dist/services/query-expansion-service.d.ts.map +1 -1
  157. package/dist/services/query-expansion-service.js +41 -75
  158. package/dist/services/query-expansion-service.js.map +1 -1
  159. package/dist/services/retriever-service.d.ts +8 -5
  160. package/dist/services/retriever-service.d.ts.map +1 -1
  161. package/dist/services/retriever-service.js +150 -15
  162. package/dist/services/retriever-service.js.map +1 -1
  163. package/dist/services/swarm-verification.d.ts +104 -0
  164. package/dist/services/swarm-verification.d.ts.map +1 -0
  165. package/dist/services/swarm-verification.js +406 -0
  166. package/dist/services/swarm-verification.js.map +1 -0
  167. package/dist/services/sync-service.d.ts.map +1 -1
  168. package/dist/services/sync-service.js +8 -9
  169. package/dist/services/sync-service.js.map +1 -1
  170. package/dist/services/task-service.d.ts.map +1 -1
  171. package/dist/services/task-service.js +3 -8
  172. package/dist/services/task-service.js.map +1 -1
  173. package/dist/services/tracing-service.js +6 -6
  174. package/dist/services/tracing-service.js.map +1 -1
  175. package/dist/services/transcript-adapter.d.ts.map +1 -1
  176. package/dist/services/transcript-adapter.js +1 -1
  177. package/dist/services/transcript-adapter.js.map +1 -1
  178. package/dist/services/worker-process.d.ts.map +1 -1
  179. package/dist/services/worker-process.js +8 -30
  180. package/dist/services/worker-process.js.map +1 -1
  181. package/dist/utils/doc-hash.d.ts +0 -4
  182. package/dist/utils/doc-hash.d.ts.map +1 -1
  183. package/dist/utils/doc-hash.js.map +1 -1
  184. package/dist/utils/doc-renderer.d.ts +31 -26
  185. package/dist/utils/doc-renderer.d.ts.map +1 -1
  186. package/dist/utils/doc-renderer.js +0 -7
  187. package/dist/utils/doc-renderer.js.map +1 -1
  188. package/dist/utils/llm-json.d.ts +17 -0
  189. package/dist/utils/llm-json.d.ts.map +1 -0
  190. package/dist/utils/llm-json.js +51 -0
  191. package/dist/utils/llm-json.js.map +1 -0
  192. package/dist/utils/toml-config.d.ts +10 -16
  193. package/dist/utils/toml-config.d.ts.map +1 -1
  194. package/dist/utils/toml-config.js +3 -1
  195. package/dist/utils/toml-config.js.map +1 -1
  196. package/dist/worker/run-worker.d.ts.map +1 -1
  197. package/dist/worker/run-worker.js +2 -7
  198. package/dist/worker/run-worker.js.map +1 -1
  199. package/package.json +9 -8
@@ -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: (limit?: number) => Effect.Effect<readonly Anchor[], DatabaseError>;
29
+ /** Find all valid anchors (for verification) */
30
+ readonly findAllValid: (limit?: number) => 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,245 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError, EntityFetchError, UnexpectedRowCountError } from "../errors.js";
4
+ import { rowToAnchor, rowToInvalidationLog } from "../mappers/anchor.js";
5
+ import { DEFAULT_QUERY_LIMIT } from "../utils/sql.js";
6
+ export class AnchorRepository extends Context.Tag("AnchorRepository")() {
7
+ }
8
+ export const AnchorRepositoryLive = Layer.effect(AnchorRepository, Effect.gen(function* () {
9
+ const db = yield* SqliteClient;
10
+ return {
11
+ create: (input) => Effect.try({
12
+ try: () => {
13
+ const result = db.prepare(`INSERT INTO learning_anchors
14
+ (learning_id, anchor_type, anchor_value, file_path, symbol_fqname, line_start, line_end, content_hash, content_preview)
15
+ 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);
16
+ // Verify exactly one row was inserted
17
+ if (result.changes !== 1) {
18
+ throw new UnexpectedRowCountError({
19
+ operation: "anchor insert",
20
+ expected: 1,
21
+ actual: result.changes
22
+ });
23
+ }
24
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(result.lastInsertRowid);
25
+ // Verify the inserted row can be fetched
26
+ if (!row) {
27
+ throw new EntityFetchError({
28
+ entity: "anchor",
29
+ id: result.lastInsertRowid,
30
+ operation: "insert"
31
+ });
32
+ }
33
+ return rowToAnchor(row);
34
+ },
35
+ catch: (cause) => new DatabaseError({ cause })
36
+ }),
37
+ findById: (id) => Effect.try({
38
+ try: () => {
39
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(id);
40
+ return row ? rowToAnchor(row) : null;
41
+ },
42
+ catch: (cause) => new DatabaseError({ cause })
43
+ }),
44
+ findByLearningId: (learningId) => Effect.try({
45
+ try: () => {
46
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE learning_id = ? ORDER BY created_at ASC").all(learningId);
47
+ return rows.map(rowToAnchor);
48
+ },
49
+ catch: (cause) => new DatabaseError({ cause })
50
+ }),
51
+ findByFilePath: (filePath) => Effect.try({
52
+ try: () => {
53
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE file_path = ? ORDER BY created_at ASC").all(filePath);
54
+ return rows.map(rowToAnchor);
55
+ },
56
+ catch: (cause) => new DatabaseError({ cause })
57
+ }),
58
+ update: (id, input) => Effect.try({
59
+ try: () => {
60
+ const updates = [];
61
+ const values = [];
62
+ if (input.anchorValue !== undefined) {
63
+ updates.push("anchor_value = ?");
64
+ values.push(input.anchorValue);
65
+ }
66
+ if (input.filePath !== undefined) {
67
+ updates.push("file_path = ?");
68
+ values.push(input.filePath);
69
+ }
70
+ if (input.symbolFqname !== undefined) {
71
+ updates.push("symbol_fqname = ?");
72
+ values.push(input.symbolFqname);
73
+ }
74
+ if (input.lineStart !== undefined) {
75
+ updates.push("line_start = ?");
76
+ values.push(input.lineStart);
77
+ }
78
+ if (input.lineEnd !== undefined) {
79
+ updates.push("line_end = ?");
80
+ values.push(input.lineEnd);
81
+ }
82
+ if (input.contentHash !== undefined) {
83
+ updates.push("content_hash = ?");
84
+ values.push(input.contentHash);
85
+ }
86
+ if (input.contentPreview !== undefined) {
87
+ updates.push("content_preview = ?");
88
+ values.push(input.contentPreview);
89
+ }
90
+ if (input.status !== undefined) {
91
+ updates.push("status = ?");
92
+ values.push(input.status);
93
+ }
94
+ if (input.verifiedAt !== undefined) {
95
+ updates.push("verified_at = ?");
96
+ values.push(input.verifiedAt ? input.verifiedAt.toISOString() : null);
97
+ }
98
+ if (updates.length === 0) {
99
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(id);
100
+ return row ? rowToAnchor(row) : null;
101
+ }
102
+ values.push(id);
103
+ const result = db.prepare(`UPDATE learning_anchors SET ${updates.join(", ")} WHERE id = ?`).run(...values);
104
+ if (result.changes === 0) {
105
+ return null;
106
+ }
107
+ // Verify the updated row can be fetched
108
+ const row = db.prepare("SELECT * FROM learning_anchors WHERE id = ?").get(id);
109
+ if (!row) {
110
+ throw new EntityFetchError({
111
+ entity: "anchor",
112
+ id,
113
+ operation: "update"
114
+ });
115
+ }
116
+ return rowToAnchor(row);
117
+ },
118
+ catch: (cause) => new DatabaseError({ cause })
119
+ }),
120
+ delete: (id) => Effect.try({
121
+ try: () => {
122
+ const result = db.prepare("DELETE FROM learning_anchors WHERE id = ?").run(id);
123
+ return result.changes > 0;
124
+ },
125
+ catch: (cause) => new DatabaseError({ cause })
126
+ }),
127
+ findDrifted: () => Effect.try({
128
+ try: () => {
129
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE status = 'drifted' ORDER BY created_at ASC").all();
130
+ return rows.map(rowToAnchor);
131
+ },
132
+ catch: (cause) => new DatabaseError({ cause })
133
+ }),
134
+ findInvalid: () => Effect.try({
135
+ try: () => {
136
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE status = 'invalid' ORDER BY created_at ASC").all();
137
+ return rows.map(rowToAnchor);
138
+ },
139
+ catch: (cause) => new DatabaseError({ cause })
140
+ }),
141
+ updateStatus: (id, status) => Effect.try({
142
+ try: () => {
143
+ const result = db.prepare("UPDATE learning_anchors SET status = ? WHERE id = ?").run(status, id);
144
+ return result.changes > 0;
145
+ },
146
+ catch: (cause) => new DatabaseError({ cause })
147
+ }),
148
+ updateVerifiedAt: (id) => Effect.try({
149
+ try: () => {
150
+ const result = db.prepare("UPDATE learning_anchors SET verified_at = datetime('now') WHERE id = ?").run(id);
151
+ return result.changes > 0;
152
+ },
153
+ catch: (cause) => new DatabaseError({ cause })
154
+ }),
155
+ findAll: (limit) => Effect.try({
156
+ try: () => {
157
+ const rows = db.prepare("SELECT * FROM learning_anchors ORDER BY created_at DESC LIMIT ?").all(limit ?? DEFAULT_QUERY_LIMIT);
158
+ return rows.map(rowToAnchor);
159
+ },
160
+ catch: (cause) => new DatabaseError({ cause })
161
+ }),
162
+ findAllValid: (limit) => Effect.try({
163
+ try: () => {
164
+ const rows = db.prepare("SELECT * FROM learning_anchors WHERE status = 'valid' ORDER BY created_at DESC LIMIT ?").all(limit ?? DEFAULT_QUERY_LIMIT);
165
+ return rows.map(rowToAnchor);
166
+ },
167
+ catch: (cause) => new DatabaseError({ cause })
168
+ }),
169
+ setPinned: (id, pinned) => Effect.try({
170
+ try: () => {
171
+ const result = db.prepare("UPDATE learning_anchors SET pinned = ? WHERE id = ?").run(pinned ? 1 : 0, id);
172
+ return result.changes > 0;
173
+ },
174
+ catch: (cause) => new DatabaseError({ cause })
175
+ }),
176
+ deleteOldInvalid: (olderThanDays) => Effect.try({
177
+ try: () => {
178
+ const result = db.prepare(`DELETE FROM learning_anchors
179
+ WHERE status = 'invalid'
180
+ AND created_at < datetime('now', '-' || ? || ' days')`).run(olderThanDays);
181
+ return result.changes;
182
+ },
183
+ catch: (cause) => new DatabaseError({ cause })
184
+ }),
185
+ logInvalidation: (input) => Effect.try({
186
+ try: () => {
187
+ const result = db.prepare(`INSERT INTO invalidation_log
188
+ (anchor_id, old_status, new_status, reason, detected_by, old_content_hash, new_content_hash, similarity_score)
189
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(input.anchorId, input.oldStatus, input.newStatus, input.reason, input.detectedBy, input.oldContentHash ?? null, input.newContentHash ?? null, input.similarityScore ?? null);
190
+ // Verify exactly one row was inserted
191
+ if (result.changes !== 1) {
192
+ throw new UnexpectedRowCountError({
193
+ operation: "invalidation log insert",
194
+ expected: 1,
195
+ actual: result.changes
196
+ });
197
+ }
198
+ const row = db.prepare("SELECT * FROM invalidation_log WHERE id = ?").get(result.lastInsertRowid);
199
+ // Verify the inserted row can be fetched
200
+ if (!row) {
201
+ throw new EntityFetchError({
202
+ entity: "invalidation_log",
203
+ id: result.lastInsertRowid,
204
+ operation: "insert"
205
+ });
206
+ }
207
+ return rowToInvalidationLog(row);
208
+ },
209
+ catch: (cause) => new DatabaseError({ cause })
210
+ }),
211
+ getInvalidationLogs: (anchorId) => Effect.try({
212
+ try: () => {
213
+ if (anchorId !== undefined) {
214
+ const rows = db.prepare("SELECT * FROM invalidation_log WHERE anchor_id = ? ORDER BY invalidated_at DESC, id DESC").all(anchorId);
215
+ return rows.map(rowToInvalidationLog);
216
+ }
217
+ const rows = db.prepare("SELECT * FROM invalidation_log ORDER BY invalidated_at DESC, id DESC LIMIT 100").all();
218
+ return rows.map(rowToInvalidationLog);
219
+ },
220
+ catch: (cause) => new DatabaseError({ cause })
221
+ }),
222
+ getStatusSummary: () => Effect.try({
223
+ try: () => {
224
+ const result = db.prepare(`
225
+ SELECT
226
+ COUNT(*) as total,
227
+ SUM(CASE WHEN status = 'valid' THEN 1 ELSE 0 END) as valid,
228
+ SUM(CASE WHEN status = 'drifted' THEN 1 ELSE 0 END) as drifted,
229
+ SUM(CASE WHEN status = 'invalid' THEN 1 ELSE 0 END) as invalid,
230
+ SUM(CASE WHEN pinned = 1 THEN 1 ELSE 0 END) as pinned
231
+ FROM learning_anchors
232
+ `).get();
233
+ return {
234
+ total: result.total ?? 0,
235
+ valid: result.valid ?? 0,
236
+ drifted: result.drifted ?? 0,
237
+ invalid: result.invalid ?? 0,
238
+ pinned: result.pinned ?? 0
239
+ };
240
+ },
241
+ catch: (cause) => new DatabaseError({ cause })
242
+ })
243
+ };
244
+ }));
245
+ //# 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,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,EAAoB,MAAM,cAAc,CAAA;AAE9D,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,uDAkNnC,CAAA"}
@@ -0,0 +1,164 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError, EntityFetchError } 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
+ if (!row) {
18
+ throw new EntityFetchError({
19
+ entity: "learning_candidate",
20
+ id: result.lastInsertRowid,
21
+ operation: "insert"
22
+ });
23
+ }
24
+ return rowToCandidate(row);
25
+ },
26
+ catch: (cause) => new DatabaseError({ cause })
27
+ }),
28
+ findById: (id) => Effect.try({
29
+ try: () => {
30
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
31
+ return row ? rowToCandidate(row) : null;
32
+ },
33
+ catch: (cause) => new DatabaseError({ cause })
34
+ }),
35
+ findByFilter: (filter) => Effect.try({
36
+ try: () => {
37
+ const conditions = [];
38
+ const values = [];
39
+ // Status filter (supports single or array)
40
+ if (filter.status !== undefined) {
41
+ const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
42
+ if (statuses.length > 0) {
43
+ conditions.push(`status IN (${statuses.map(() => "?").join(", ")})`);
44
+ values.push(...statuses);
45
+ }
46
+ }
47
+ // Confidence filter (supports single or array)
48
+ if (filter.confidence !== undefined) {
49
+ const confidences = Array.isArray(filter.confidence) ? filter.confidence : [filter.confidence];
50
+ if (confidences.length > 0) {
51
+ conditions.push(`confidence IN (${confidences.map(() => "?").join(", ")})`);
52
+ values.push(...confidences);
53
+ }
54
+ }
55
+ // Category filter (supports single or array)
56
+ if (filter.category !== undefined) {
57
+ const categories = Array.isArray(filter.category) ? filter.category : [filter.category];
58
+ if (categories.length > 0) {
59
+ conditions.push(`category IN (${categories.map(() => "?").join(", ")})`);
60
+ values.push(...categories);
61
+ }
62
+ }
63
+ // Source file filter
64
+ if (filter.sourceFile !== undefined) {
65
+ conditions.push("source_file = ?");
66
+ values.push(filter.sourceFile);
67
+ }
68
+ // Source run ID filter
69
+ if (filter.sourceRunId !== undefined) {
70
+ conditions.push("source_run_id = ?");
71
+ values.push(filter.sourceRunId);
72
+ }
73
+ // Source task ID filter
74
+ if (filter.sourceTaskId !== undefined) {
75
+ conditions.push("source_task_id = ?");
76
+ values.push(filter.sourceTaskId);
77
+ }
78
+ // Build query
79
+ let sql = "SELECT * FROM learning_candidates";
80
+ if (conditions.length > 0) {
81
+ sql += ` WHERE ${conditions.join(" AND ")}`;
82
+ }
83
+ sql += " ORDER BY extracted_at DESC";
84
+ // Limit and offset
85
+ if (filter.limit !== undefined) {
86
+ sql += " LIMIT ?";
87
+ values.push(filter.limit);
88
+ if (filter.offset !== undefined) {
89
+ sql += " OFFSET ?";
90
+ values.push(filter.offset);
91
+ }
92
+ }
93
+ const rows = db.prepare(sql).all(...values);
94
+ return rows.map(rowToCandidate);
95
+ },
96
+ catch: (cause) => new DatabaseError({ cause })
97
+ }),
98
+ update: (id, input) => Effect.try({
99
+ try: () => {
100
+ const updates = [];
101
+ const values = [];
102
+ if (input.status !== undefined) {
103
+ updates.push("status = ?");
104
+ values.push(input.status);
105
+ }
106
+ if (input.reviewedAt !== undefined) {
107
+ updates.push("reviewed_at = ?");
108
+ values.push(input.reviewedAt.toISOString());
109
+ }
110
+ if (input.reviewedBy !== undefined) {
111
+ updates.push("reviewed_by = ?");
112
+ values.push(input.reviewedBy);
113
+ }
114
+ if (input.promotedLearningId !== undefined) {
115
+ updates.push("promoted_learning_id = ?");
116
+ values.push(input.promotedLearningId);
117
+ }
118
+ if (input.rejectionReason !== undefined) {
119
+ updates.push("rejection_reason = ?");
120
+ values.push(input.rejectionReason);
121
+ }
122
+ if (updates.length === 0) {
123
+ // No updates, just return the current row
124
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
125
+ return row ? rowToCandidate(row) : null;
126
+ }
127
+ values.push(id);
128
+ const result = db.prepare(`UPDATE learning_candidates SET ${updates.join(", ")} WHERE id = ?`).run(...values);
129
+ if (result.changes === 0) {
130
+ return null;
131
+ }
132
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
133
+ if (!row) {
134
+ throw new EntityFetchError({
135
+ entity: "learning_candidate",
136
+ id,
137
+ operation: "update"
138
+ });
139
+ }
140
+ return rowToCandidate(row);
141
+ },
142
+ catch: (cause) => new DatabaseError({ cause })
143
+ }),
144
+ updateStatus: (id, status) => Effect.try({
145
+ try: () => {
146
+ const result = db.prepare("UPDATE learning_candidates SET status = ? WHERE id = ?").run(status, id);
147
+ if (result.changes === 0) {
148
+ return null;
149
+ }
150
+ const row = db.prepare("SELECT * FROM learning_candidates WHERE id = ?").get(id);
151
+ if (!row) {
152
+ throw new EntityFetchError({
153
+ entity: "learning_candidate",
154
+ id,
155
+ operation: "update"
156
+ });
157
+ }
158
+ return rowToCandidate(row);
159
+ },
160
+ catch: (cause) => new DatabaseError({ cause })
161
+ })
162
+ };
163
+ }));
164
+ //# 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,41 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ /**
5
+ * Compaction log entry from database.
6
+ */
7
+ export interface CompactionLogEntry {
8
+ readonly id: number;
9
+ readonly compactedAt: Date;
10
+ readonly taskCount: number;
11
+ readonly summary: string;
12
+ readonly taskIds: readonly string[];
13
+ readonly learningsExportedTo: string | null;
14
+ readonly learnings: string | null;
15
+ }
16
+ /**
17
+ * Input for creating a new compaction log entry.
18
+ */
19
+ export interface CreateCompactionLogInput {
20
+ readonly taskCount: number;
21
+ readonly summary: string;
22
+ readonly taskIds: readonly string[];
23
+ readonly learningsExportedTo?: string | null;
24
+ readonly learnings: string;
25
+ }
26
+ declare const CompactionRepository_base: Context.TagClass<CompactionRepository, "CompactionRepository", {
27
+ readonly insert: (input: CreateCompactionLogInput) => Effect.Effect<CompactionLogEntry, DatabaseError>;
28
+ readonly findById: (id: number) => Effect.Effect<CompactionLogEntry | null, DatabaseError>;
29
+ readonly findAll: () => Effect.Effect<readonly CompactionLogEntry[], DatabaseError>;
30
+ readonly findRecent: (limit: number) => Effect.Effect<readonly CompactionLogEntry[], DatabaseError>;
31
+ readonly count: () => Effect.Effect<number, DatabaseError>;
32
+ }>;
33
+ /**
34
+ * Repository for compaction_log table operations.
35
+ * Handles storage of compaction history and summaries.
36
+ */
37
+ export declare class CompactionRepository extends CompactionRepository_base {
38
+ }
39
+ export declare const CompactionRepositoryLive: Layer.Layer<CompactionRepository, never, SqliteClient>;
40
+ export {};
41
+ //# sourceMappingURL=compaction-repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compaction-repo.d.ts","sourceRoot":"","sources":["../../src/repo/compaction-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,EAAoB,MAAM,cAAc,CAAA;AAE9D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;;qBA+CoB,CAAC,KAAK,EAAE,wBAAwB,KAAK,MAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,aAAa,CAAC;uBACnF,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,kBAAkB,GAAG,IAAI,EAAE,aAAa,CAAC;sBACxE,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,kBAAkB,EAAE,EAAE,aAAa,CAAC;yBAC9D,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,kBAAkB,EAAE,EAAE,aAAa,CAAC;oBACnF,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AAX9D;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,yBASvC;CAAG;AAEN,eAAO,MAAM,wBAAwB,wDA2EpC,CAAA"}