@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,617 @@
1
+ /**
2
+ * AnchorVerificationService - Periodic anchor verification for PRD-017
3
+ *
4
+ * Verifies anchors by checking actual file system state:
5
+ * - glob: Check if glob pattern still matches files
6
+ * - hash: Compute content hash and compare
7
+ * - symbol: Grep-based check for symbol presence
8
+ * - line_range: Verify file exists and has enough lines
9
+ *
10
+ * Updates anchor status (valid/drifted/invalid) and logs all changes
11
+ * to invalidation_log via AnchorRepository.
12
+ *
13
+ * @see docs/prd/PRD-017-invalidation-maintenance.md
14
+ * @see docs/design/DD-017-invalidation-maintenance.md
15
+ */
16
+ import { Config, Context, Effect, Layer } from "effect";
17
+ import * as fs from "node:fs/promises";
18
+ import * as crypto from "node:crypto";
19
+ import * as path from "node:path";
20
+ import { AnchorRepository } from "../repo/anchor-repo.js";
21
+ import { matchesGlob } from "../utils/glob.js";
22
+ // =============================================================================
23
+ // Service Definition
24
+ // =============================================================================
25
+ export class AnchorVerificationService extends Context.Tag("AnchorVerificationService")() {
26
+ }
27
+ // =============================================================================
28
+ // Configuration
29
+ // =============================================================================
30
+ /** Default anchor cache TTL in seconds (1 hour) */
31
+ export const DEFAULT_ANCHOR_CACHE_TTL = 3600;
32
+ /**
33
+ * Get the anchor cache TTL from TX_ANCHOR_CACHE_TTL env var.
34
+ * Used by lazy verification to determine staleness.
35
+ *
36
+ * @returns Effect yielding TTL in seconds (default: 3600)
37
+ */
38
+ export const getAnchorTTL = () => Config.number("TX_ANCHOR_CACHE_TTL").pipe(Config.withDefault(DEFAULT_ANCHOR_CACHE_TTL), Effect.catchAll(() => Effect.succeed(DEFAULT_ANCHOR_CACHE_TTL)));
39
+ /**
40
+ * Check if an anchor is stale based on its verified_at timestamp and TTL.
41
+ * An anchor is stale if:
42
+ * - verified_at is null (never verified), or
43
+ * - verified_at is older than (now - TTL)
44
+ *
45
+ * @param anchor - The anchor to check
46
+ * @param ttlSeconds - TTL in seconds (from getAnchorTTL)
47
+ * @returns true if anchor is stale and needs verification
48
+ */
49
+ export const isStale = (anchor, ttlSeconds) => {
50
+ if (!anchor.verifiedAt) {
51
+ return true; // Never verified = stale
52
+ }
53
+ const verifiedAtMs = anchor.verifiedAt.getTime();
54
+ const ttlMs = ttlSeconds * 1000;
55
+ const cutoffMs = Date.now() - ttlMs;
56
+ return verifiedAtMs < cutoffMs;
57
+ };
58
+ // =============================================================================
59
+ // Utility Functions
60
+ // =============================================================================
61
+ /** Compute SHA256 hash of content */
62
+ const computeContentHash = (content) => crypto.createHash("sha256").update(content).digest("hex");
63
+ /** Check if file exists */
64
+ const fileExists = (filePath) => Effect.tryPromise({
65
+ try: async () => {
66
+ await fs.access(filePath);
67
+ return true;
68
+ },
69
+ catch: () => false
70
+ }).pipe(Effect.catchAll(() => Effect.succeed(false)));
71
+ /** Read file content */
72
+ const readFile = (filePath) => Effect.tryPromise({
73
+ try: async () => {
74
+ const content = await fs.readFile(filePath, "utf-8");
75
+ return content;
76
+ },
77
+ catch: () => null
78
+ }).pipe(Effect.catchAll(() => Effect.succeed(null)));
79
+ /** Read specific line range from file */
80
+ const readLineRange = (filePath, lineStart, lineEnd) => Effect.gen(function* () {
81
+ const content = yield* readFile(filePath);
82
+ if (!content)
83
+ return null;
84
+ const lines = content.split("\n");
85
+ if (lineStart > lines.length)
86
+ return null;
87
+ const end = Math.min(lineEnd, lines.length);
88
+ return lines.slice(lineStart - 1, end).join("\n");
89
+ });
90
+ /** Count lines in file */
91
+ const countLines = (filePath) => Effect.gen(function* () {
92
+ const content = yield* readFile(filePath);
93
+ if (!content)
94
+ return 0;
95
+ return content.split("\n").length;
96
+ });
97
+ /** Check if a symbol exists in file (grep-based) */
98
+ const symbolExistsInFile = (filePath, symbolName) => Effect.gen(function* () {
99
+ const content = yield* readFile(filePath);
100
+ if (!content)
101
+ return false;
102
+ // Extract just the symbol name from FQName (e.g., "file.ts::ClassName" -> "ClassName")
103
+ const simpleName = symbolName.includes("::")
104
+ ? symbolName.split("::").pop() ?? symbolName
105
+ : symbolName;
106
+ // Check for common patterns: function, class, const, export, interface, type
107
+ const patterns = [
108
+ new RegExp(`\\b(function|const|let|var)\\s+${simpleName}\\b`),
109
+ new RegExp(`\\bclass\\s+${simpleName}\\b`),
110
+ new RegExp(`\\binterface\\s+${simpleName}\\b`),
111
+ new RegExp(`\\btype\\s+${simpleName}\\b`),
112
+ new RegExp(`\\bexport\\s+(default\\s+)?(function|class|const|let|var|interface|type)\\s+${simpleName}\\b`),
113
+ new RegExp(`\\bexport\\s+\\{[^}]*\\b${simpleName}\\b[^}]*\\}`) // export { Symbol }
114
+ ];
115
+ return patterns.some(p => p.test(content));
116
+ });
117
+ // =============================================================================
118
+ // Self-Healing Utilities (PRD-017)
119
+ // =============================================================================
120
+ /** Default threshold for self-healing (80% similarity) */
121
+ const SELF_HEAL_THRESHOLD = 0.8;
122
+ /** Maximum content preview length */
123
+ const MAX_PREVIEW_LENGTH = 500;
124
+ /**
125
+ * Tokenize text for Jaccard similarity computation.
126
+ * Extracts words/identifiers, lowercased, filtering short tokens.
127
+ */
128
+ const tokenize = (text) => {
129
+ return new Set(text
130
+ .toLowerCase()
131
+ .replace(/[^\w\s]/g, " ")
132
+ .split(/\s+/)
133
+ .filter(t => t.length > 2));
134
+ };
135
+ /**
136
+ * Compute Jaccard similarity between two sets of tokens.
137
+ * Returns value between 0 (completely different) and 1 (identical).
138
+ */
139
+ const jaccardSimilarity = (a, b) => {
140
+ if (a.size === 0 && b.size === 0)
141
+ return 1;
142
+ if (a.size === 0 || b.size === 0)
143
+ return 0;
144
+ const intersection = new Set([...a].filter(x => b.has(x)));
145
+ const union = new Set([...a, ...b]);
146
+ return union.size === 0 ? 0 : intersection.size / union.size;
147
+ };
148
+ /**
149
+ * Compute Jaccard similarity between two text strings.
150
+ */
151
+ const computeSimilarity = (oldContent, newContent) => {
152
+ const oldTokens = tokenize(oldContent);
153
+ const newTokens = tokenize(newContent);
154
+ return jaccardSimilarity(oldTokens, newTokens);
155
+ };
156
+ /**
157
+ * Create a content preview (truncated content for storage/comparison).
158
+ */
159
+ const createContentPreview = (content) => {
160
+ if (content.length <= MAX_PREVIEW_LENGTH)
161
+ return content;
162
+ return content.slice(0, MAX_PREVIEW_LENGTH);
163
+ };
164
+ /**
165
+ * Try to self-heal a drifted anchor by comparing content similarity.
166
+ * If the new content is similar enough (>= 0.8 Jaccard), update the anchor
167
+ * with the new hash and preview.
168
+ */
169
+ const trySelfHeal = (anchor, newContent, newHash, anchorRepo) => Effect.gen(function* () {
170
+ // If no content preview stored, we can't compare - can't self-heal
171
+ if (!anchor.contentPreview) {
172
+ return { healed: false, similarity: 0 };
173
+ }
174
+ // Compute similarity between old preview and new content
175
+ const similarity = computeSimilarity(anchor.contentPreview, newContent);
176
+ // If similarity is above threshold, self-heal
177
+ if (similarity >= SELF_HEAL_THRESHOLD) {
178
+ const newPreview = createContentPreview(newContent);
179
+ // Update anchor with new hash and preview
180
+ yield* anchorRepo.update(anchor.id, {
181
+ contentHash: newHash,
182
+ contentPreview: newPreview,
183
+ verifiedAt: new Date()
184
+ });
185
+ return {
186
+ healed: true,
187
+ similarity,
188
+ newHash,
189
+ newPreview
190
+ };
191
+ }
192
+ // Similarity too low - can't self-heal
193
+ return { healed: false, similarity };
194
+ });
195
+ // =============================================================================
196
+ // Service Implementation
197
+ // =============================================================================
198
+ export const AnchorVerificationServiceLive = Layer.effect(AnchorVerificationService, Effect.gen(function* () {
199
+ const anchorRepo = yield* AnchorRepository;
200
+ /**
201
+ * Verify a single anchor against the actual file system.
202
+ */
203
+ const verifyAnchor = (anchor, detectedBy, baseDir) => Effect.gen(function* () {
204
+ const oldStatus = anchor.status;
205
+ // Skip pinned anchors
206
+ if (anchor.pinned) {
207
+ return {
208
+ anchorId: anchor.id,
209
+ previousStatus: oldStatus,
210
+ newStatus: oldStatus,
211
+ action: "unchanged"
212
+ };
213
+ }
214
+ // Resolve full file path
215
+ const fullPath = path.isAbsolute(anchor.filePath)
216
+ ? anchor.filePath
217
+ : path.join(baseDir, anchor.filePath);
218
+ // Step 1: Check if file exists
219
+ const exists = yield* fileExists(fullPath);
220
+ if (!exists) {
221
+ // File deleted - mark as invalid
222
+ yield* anchorRepo.updateStatus(anchor.id, "invalid");
223
+ yield* anchorRepo.logInvalidation({
224
+ anchorId: anchor.id,
225
+ oldStatus,
226
+ newStatus: "invalid",
227
+ reason: "file_deleted",
228
+ detectedBy
229
+ });
230
+ return {
231
+ anchorId: anchor.id,
232
+ previousStatus: oldStatus,
233
+ newStatus: "invalid",
234
+ action: "invalidated",
235
+ reason: "file_deleted"
236
+ };
237
+ }
238
+ // Step 2: Type-specific verification
239
+ switch (anchor.anchorType) {
240
+ case "glob": {
241
+ // For glob anchors, the file exists and matches - valid
242
+ yield* anchorRepo.updateVerifiedAt(anchor.id);
243
+ return {
244
+ anchorId: anchor.id,
245
+ previousStatus: oldStatus,
246
+ newStatus: oldStatus,
247
+ action: "unchanged"
248
+ };
249
+ }
250
+ case "hash": {
251
+ // Check content hash
252
+ if (!anchor.lineStart || !anchor.lineEnd) {
253
+ // No line range specified, read whole file
254
+ const content = yield* readFile(fullPath);
255
+ if (!content) {
256
+ yield* anchorRepo.updateStatus(anchor.id, "invalid");
257
+ yield* anchorRepo.logInvalidation({
258
+ anchorId: anchor.id,
259
+ oldStatus,
260
+ newStatus: "invalid",
261
+ reason: "content_read_failed",
262
+ detectedBy
263
+ });
264
+ return {
265
+ anchorId: anchor.id,
266
+ previousStatus: oldStatus,
267
+ newStatus: "invalid",
268
+ action: "invalidated",
269
+ reason: "content_read_failed"
270
+ };
271
+ }
272
+ const newHash = computeContentHash(content);
273
+ if (anchor.contentHash && newHash === anchor.contentHash) {
274
+ yield* anchorRepo.updateVerifiedAt(anchor.id);
275
+ return {
276
+ anchorId: anchor.id,
277
+ previousStatus: oldStatus,
278
+ newStatus: oldStatus,
279
+ action: "unchanged"
280
+ };
281
+ }
282
+ // Hash mismatch - try self-healing if we have content preview
283
+ const healResult = yield* trySelfHeal(anchor, content, newHash, anchorRepo);
284
+ if (healResult.healed) {
285
+ // Successfully self-healed
286
+ yield* anchorRepo.logInvalidation({
287
+ anchorId: anchor.id,
288
+ oldStatus,
289
+ newStatus: "valid",
290
+ reason: "self_healed",
291
+ detectedBy,
292
+ oldContentHash: anchor.contentHash,
293
+ newContentHash: newHash,
294
+ similarityScore: healResult.similarity
295
+ });
296
+ return {
297
+ anchorId: anchor.id,
298
+ previousStatus: oldStatus,
299
+ newStatus: "valid",
300
+ action: "self_healed",
301
+ reason: "content_similar",
302
+ similarity: healResult.similarity,
303
+ oldContentHash: anchor.contentHash,
304
+ newContentHash: newHash
305
+ };
306
+ }
307
+ // Could not self-heal - mark as drifted
308
+ yield* anchorRepo.updateStatus(anchor.id, "drifted");
309
+ yield* anchorRepo.logInvalidation({
310
+ anchorId: anchor.id,
311
+ oldStatus,
312
+ newStatus: "drifted",
313
+ reason: "hash_mismatch",
314
+ detectedBy,
315
+ oldContentHash: anchor.contentHash,
316
+ newContentHash: newHash,
317
+ similarityScore: healResult.similarity
318
+ });
319
+ return {
320
+ anchorId: anchor.id,
321
+ previousStatus: oldStatus,
322
+ newStatus: "drifted",
323
+ action: "drifted",
324
+ reason: "hash_mismatch",
325
+ similarity: healResult.similarity,
326
+ oldContentHash: anchor.contentHash,
327
+ newContentHash: newHash
328
+ };
329
+ }
330
+ // Read line range
331
+ const content = yield* readLineRange(fullPath, anchor.lineStart, anchor.lineEnd);
332
+ if (!content) {
333
+ yield* anchorRepo.updateStatus(anchor.id, "invalid");
334
+ yield* anchorRepo.logInvalidation({
335
+ anchorId: anchor.id,
336
+ oldStatus,
337
+ newStatus: "invalid",
338
+ reason: "line_range_invalid",
339
+ detectedBy
340
+ });
341
+ return {
342
+ anchorId: anchor.id,
343
+ previousStatus: oldStatus,
344
+ newStatus: "invalid",
345
+ action: "invalidated",
346
+ reason: "line_range_invalid"
347
+ };
348
+ }
349
+ const newHash = computeContentHash(content);
350
+ if (anchor.contentHash && newHash === anchor.contentHash) {
351
+ yield* anchorRepo.updateVerifiedAt(anchor.id);
352
+ return {
353
+ anchorId: anchor.id,
354
+ previousStatus: oldStatus,
355
+ newStatus: oldStatus,
356
+ action: "unchanged"
357
+ };
358
+ }
359
+ // Hash mismatch - try self-healing if we have content preview
360
+ const healResult = yield* trySelfHeal(anchor, content, newHash, anchorRepo);
361
+ if (healResult.healed) {
362
+ // Successfully self-healed
363
+ yield* anchorRepo.logInvalidation({
364
+ anchorId: anchor.id,
365
+ oldStatus,
366
+ newStatus: "valid",
367
+ reason: "self_healed",
368
+ detectedBy,
369
+ oldContentHash: anchor.contentHash,
370
+ newContentHash: newHash,
371
+ similarityScore: healResult.similarity
372
+ });
373
+ return {
374
+ anchorId: anchor.id,
375
+ previousStatus: oldStatus,
376
+ newStatus: "valid",
377
+ action: "self_healed",
378
+ reason: "content_similar",
379
+ similarity: healResult.similarity,
380
+ oldContentHash: anchor.contentHash,
381
+ newContentHash: newHash
382
+ };
383
+ }
384
+ // Could not self-heal - mark as drifted
385
+ yield* anchorRepo.updateStatus(anchor.id, "drifted");
386
+ yield* anchorRepo.logInvalidation({
387
+ anchorId: anchor.id,
388
+ oldStatus,
389
+ newStatus: "drifted",
390
+ reason: "hash_mismatch",
391
+ detectedBy,
392
+ oldContentHash: anchor.contentHash,
393
+ newContentHash: newHash,
394
+ similarityScore: healResult.similarity
395
+ });
396
+ return {
397
+ anchorId: anchor.id,
398
+ previousStatus: oldStatus,
399
+ newStatus: "drifted",
400
+ action: "drifted",
401
+ reason: "hash_mismatch",
402
+ similarity: healResult.similarity,
403
+ oldContentHash: anchor.contentHash,
404
+ newContentHash: newHash
405
+ };
406
+ }
407
+ case "symbol": {
408
+ // Check if symbol exists in file
409
+ const symbolName = anchor.symbolFqname ?? anchor.anchorValue;
410
+ const symbolExists = yield* symbolExistsInFile(fullPath, symbolName);
411
+ if (symbolExists) {
412
+ yield* anchorRepo.updateVerifiedAt(anchor.id);
413
+ return {
414
+ anchorId: anchor.id,
415
+ previousStatus: oldStatus,
416
+ newStatus: oldStatus,
417
+ action: "unchanged"
418
+ };
419
+ }
420
+ // Symbol not found - mark as invalid
421
+ yield* anchorRepo.updateStatus(anchor.id, "invalid");
422
+ yield* anchorRepo.logInvalidation({
423
+ anchorId: anchor.id,
424
+ oldStatus,
425
+ newStatus: "invalid",
426
+ reason: "symbol_missing",
427
+ detectedBy
428
+ });
429
+ return {
430
+ anchorId: anchor.id,
431
+ previousStatus: oldStatus,
432
+ newStatus: "invalid",
433
+ action: "invalidated",
434
+ reason: "symbol_missing"
435
+ };
436
+ }
437
+ case "line_range": {
438
+ // Check if file has enough lines
439
+ const lineCount = yield* countLines(fullPath);
440
+ const requiredLines = anchor.lineEnd ?? anchor.lineStart ?? 1;
441
+ if (lineCount >= requiredLines) {
442
+ yield* anchorRepo.updateVerifiedAt(anchor.id);
443
+ return {
444
+ anchorId: anchor.id,
445
+ previousStatus: oldStatus,
446
+ newStatus: oldStatus,
447
+ action: "unchanged"
448
+ };
449
+ }
450
+ // Not enough lines - mark as drifted (file changed but still exists)
451
+ yield* anchorRepo.updateStatus(anchor.id, "drifted");
452
+ yield* anchorRepo.logInvalidation({
453
+ anchorId: anchor.id,
454
+ oldStatus,
455
+ newStatus: "drifted",
456
+ reason: `line_count_insufficient (have ${lineCount}, need ${requiredLines})`,
457
+ detectedBy
458
+ });
459
+ return {
460
+ anchorId: anchor.id,
461
+ previousStatus: oldStatus,
462
+ newStatus: "drifted",
463
+ action: "drifted",
464
+ reason: `line_count_insufficient`
465
+ };
466
+ }
467
+ default:
468
+ // Unknown anchor type - keep as is
469
+ yield* anchorRepo.updateVerifiedAt(anchor.id);
470
+ return {
471
+ anchorId: anchor.id,
472
+ previousStatus: oldStatus,
473
+ newStatus: oldStatus,
474
+ action: "unchanged"
475
+ };
476
+ }
477
+ });
478
+ /**
479
+ * Aggregate verification results into summary
480
+ */
481
+ const aggregateResults = (results, errors, startTime) => {
482
+ let unchanged = 0;
483
+ let selfHealed = 0;
484
+ let drifted = 0;
485
+ let invalid = 0;
486
+ for (const result of results) {
487
+ switch (result.action) {
488
+ case "unchanged":
489
+ unchanged++;
490
+ break;
491
+ case "self_healed":
492
+ selfHealed++;
493
+ break;
494
+ case "drifted":
495
+ drifted++;
496
+ break;
497
+ case "invalidated":
498
+ invalid++;
499
+ break;
500
+ }
501
+ }
502
+ return {
503
+ total: results.length + errors,
504
+ unchanged,
505
+ selfHealed,
506
+ drifted,
507
+ invalid,
508
+ errors,
509
+ duration: Date.now() - startTime
510
+ };
511
+ };
512
+ return {
513
+ verify: (anchorId, options = {}) => Effect.gen(function* () {
514
+ const anchor = yield* anchorRepo.findById(anchorId);
515
+ if (!anchor) {
516
+ // Return unchanged result for non-existent anchor
517
+ return {
518
+ anchorId,
519
+ previousStatus: "valid",
520
+ newStatus: "valid",
521
+ action: "unchanged",
522
+ reason: "anchor_not_found"
523
+ };
524
+ }
525
+ const detectedBy = options.detectedBy ?? "lazy";
526
+ const baseDir = options.baseDir ?? process.cwd();
527
+ return yield* verifyAnchor(anchor, detectedBy, baseDir);
528
+ }),
529
+ verifyAll: (options = {}) => Effect.gen(function* () {
530
+ const startTime = Date.now();
531
+ const detectedBy = options.detectedBy ?? "periodic";
532
+ const baseDir = options.baseDir ?? process.cwd();
533
+ const skipPinned = options.skipPinned ?? true;
534
+ const anchors = yield* anchorRepo.findAllValid();
535
+ const results = [];
536
+ let errors = 0;
537
+ for (const anchor of anchors) {
538
+ if (skipPinned && anchor.pinned) {
539
+ results.push({
540
+ anchorId: anchor.id,
541
+ previousStatus: anchor.status,
542
+ newStatus: anchor.status,
543
+ action: "unchanged"
544
+ });
545
+ continue;
546
+ }
547
+ const result = yield* verifyAnchor(anchor, detectedBy, baseDir).pipe(Effect.catchAll(() => {
548
+ errors++;
549
+ return Effect.succeed(null);
550
+ }));
551
+ if (result) {
552
+ results.push(result);
553
+ }
554
+ }
555
+ return aggregateResults(results, errors, startTime);
556
+ }),
557
+ verifyFile: (filePath, options = {}) => Effect.gen(function* () {
558
+ const startTime = Date.now();
559
+ const detectedBy = options.detectedBy ?? "manual";
560
+ const baseDir = options.baseDir ?? process.cwd();
561
+ const skipPinned = options.skipPinned ?? true;
562
+ const anchors = yield* anchorRepo.findByFilePath(filePath);
563
+ const results = [];
564
+ let errors = 0;
565
+ for (const anchor of anchors) {
566
+ if (skipPinned && anchor.pinned) {
567
+ results.push({
568
+ anchorId: anchor.id,
569
+ previousStatus: anchor.status,
570
+ newStatus: anchor.status,
571
+ action: "unchanged"
572
+ });
573
+ continue;
574
+ }
575
+ const result = yield* verifyAnchor(anchor, detectedBy, baseDir).pipe(Effect.catchAll(() => {
576
+ errors++;
577
+ return Effect.succeed(null);
578
+ }));
579
+ if (result) {
580
+ results.push(result);
581
+ }
582
+ }
583
+ return aggregateResults(results, errors, startTime);
584
+ }),
585
+ verifyGlob: (globPattern, options = {}) => Effect.gen(function* () {
586
+ const startTime = Date.now();
587
+ const detectedBy = options.detectedBy ?? "manual";
588
+ const baseDir = options.baseDir ?? process.cwd();
589
+ const skipPinned = options.skipPinned ?? true;
590
+ // Get all anchors and filter by glob pattern
591
+ const allAnchors = yield* anchorRepo.findAll();
592
+ const matchingAnchors = allAnchors.filter(a => matchesGlob(a.filePath, globPattern));
593
+ const results = [];
594
+ let errors = 0;
595
+ for (const anchor of matchingAnchors) {
596
+ if (skipPinned && anchor.pinned) {
597
+ results.push({
598
+ anchorId: anchor.id,
599
+ previousStatus: anchor.status,
600
+ newStatus: anchor.status,
601
+ action: "unchanged"
602
+ });
603
+ continue;
604
+ }
605
+ const result = yield* verifyAnchor(anchor, detectedBy, baseDir).pipe(Effect.catchAll(() => {
606
+ errors++;
607
+ return Effect.succeed(null);
608
+ }));
609
+ if (result) {
610
+ results.push(result);
611
+ }
612
+ }
613
+ return aggregateResults(results, errors, startTime);
614
+ })
615
+ };
616
+ }));
617
+ //# sourceMappingURL=anchor-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-verification.js","sourceRoot":"","sources":["../../src/services/anchor-verification.ts"],"names":[],"mappings":"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"}