@jamesaphoenix/tx-core 0.4.2 → 0.4.4

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 (336) hide show
  1. package/README.md +480 -0
  2. package/dist/db.d.ts +28 -14
  3. package/dist/db.d.ts.map +1 -1
  4. package/dist/db.js +108 -14
  5. package/dist/db.js.map +1 -1
  6. package/dist/errors.d.ts +178 -34
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +119 -26
  9. package/dist/errors.js.map +1 -1
  10. package/dist/id.d.ts +10 -0
  11. package/dist/id.d.ts.map +1 -1
  12. package/dist/id.js +17 -1
  13. package/dist/id.js.map +1 -1
  14. package/dist/index.d.ts +15 -7
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +62 -8
  17. package/dist/index.js.map +1 -1
  18. package/dist/layer.d.ts +23 -14
  19. package/dist/layer.d.ts.map +1 -1
  20. package/dist/layer.js +75 -76
  21. package/dist/layer.js.map +1 -1
  22. package/dist/mappers/attempt.d.ts +3 -1
  23. package/dist/mappers/attempt.d.ts.map +1 -1
  24. package/dist/mappers/attempt.js +23 -9
  25. package/dist/mappers/attempt.js.map +1 -1
  26. package/dist/mappers/claim.d.ts +1 -1
  27. package/dist/mappers/claim.d.ts.map +1 -1
  28. package/dist/mappers/claim.js +11 -4
  29. package/dist/mappers/claim.js.map +1 -1
  30. package/dist/mappers/deduplication.d.ts +13 -1
  31. package/dist/mappers/deduplication.d.ts.map +1 -1
  32. package/dist/mappers/deduplication.js +22 -3
  33. package/dist/mappers/deduplication.js.map +1 -1
  34. package/dist/mappers/doc.d.ts +24 -0
  35. package/dist/mappers/doc.d.ts.map +1 -0
  36. package/dist/mappers/doc.js +161 -0
  37. package/dist/mappers/doc.js.map +1 -0
  38. package/dist/mappers/file-learning.d.ts.map +1 -1
  39. package/dist/mappers/file-learning.js +2 -1
  40. package/dist/mappers/file-learning.js.map +1 -1
  41. package/dist/mappers/index.d.ts +6 -7
  42. package/dist/mappers/index.d.ts.map +1 -1
  43. package/dist/mappers/index.js +10 -12
  44. package/dist/mappers/index.js.map +1 -1
  45. package/dist/mappers/learning.d.ts +9 -1
  46. package/dist/mappers/learning.d.ts.map +1 -1
  47. package/dist/mappers/learning.js +94 -14
  48. package/dist/mappers/learning.js.map +1 -1
  49. package/dist/mappers/orchestrator-state.d.ts +1 -1
  50. package/dist/mappers/orchestrator-state.d.ts.map +1 -1
  51. package/dist/mappers/orchestrator-state.js +31 -5
  52. package/dist/mappers/orchestrator-state.js.map +1 -1
  53. package/dist/mappers/parse-date.d.ts +11 -0
  54. package/dist/mappers/parse-date.d.ts.map +1 -0
  55. package/dist/mappers/parse-date.js +18 -0
  56. package/dist/mappers/parse-date.js.map +1 -0
  57. package/dist/mappers/run.d.ts +14 -4
  58. package/dist/mappers/run.d.ts.map +1 -1
  59. package/dist/mappers/run.js +49 -18
  60. package/dist/mappers/run.js.map +1 -1
  61. package/dist/mappers/task.d.ts +5 -1
  62. package/dist/mappers/task.d.ts.map +1 -1
  63. package/dist/mappers/task.js +66 -16
  64. package/dist/mappers/task.js.map +1 -1
  65. package/dist/mappers/tracked-project.d.ts +3 -1
  66. package/dist/mappers/tracked-project.d.ts.map +1 -1
  67. package/dist/mappers/tracked-project.js +23 -9
  68. package/dist/mappers/tracked-project.js.map +1 -1
  69. package/dist/mappers/worker.d.ts +1 -1
  70. package/dist/mappers/worker.d.ts.map +1 -1
  71. package/dist/mappers/worker.js +44 -6
  72. package/dist/mappers/worker.js.map +1 -1
  73. package/dist/repo/attempt-repo.d.ts +2 -2
  74. package/dist/repo/attempt-repo.d.ts.map +1 -1
  75. package/dist/repo/attempt-repo.js +16 -6
  76. package/dist/repo/attempt-repo.js.map +1 -1
  77. package/dist/repo/claim-repo.d.ts +46 -2
  78. package/dist/repo/claim-repo.d.ts.map +1 -1
  79. package/dist/repo/claim-repo.js +113 -6
  80. package/dist/repo/claim-repo.js.map +1 -1
  81. package/dist/repo/deduplication-repo.d.ts +9 -1
  82. package/dist/repo/deduplication-repo.d.ts.map +1 -1
  83. package/dist/repo/deduplication-repo.js +46 -9
  84. package/dist/repo/deduplication-repo.js.map +1 -1
  85. package/dist/repo/dep-repo.d.ts +27 -3
  86. package/dist/repo/dep-repo.d.ts.map +1 -1
  87. package/dist/repo/dep-repo.js +166 -39
  88. package/dist/repo/dep-repo.js.map +1 -1
  89. package/dist/repo/doc-repo.d.ts +59 -0
  90. package/dist/repo/doc-repo.d.ts.map +1 -0
  91. package/dist/repo/doc-repo.js +276 -0
  92. package/dist/repo/doc-repo.js.map +1 -0
  93. package/dist/repo/file-learning-repo.d.ts +3 -3
  94. package/dist/repo/file-learning-repo.d.ts.map +1 -1
  95. package/dist/repo/file-learning-repo.js +19 -8
  96. package/dist/repo/file-learning-repo.js.map +1 -1
  97. package/dist/repo/index.d.ts +4 -6
  98. package/dist/repo/index.d.ts.map +1 -1
  99. package/dist/repo/index.js +3 -5
  100. package/dist/repo/index.js.map +1 -1
  101. package/dist/repo/learning-repo.d.ts +10 -3
  102. package/dist/repo/learning-repo.d.ts.map +1 -1
  103. package/dist/repo/learning-repo.js +68 -11
  104. package/dist/repo/learning-repo.js.map +1 -1
  105. package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
  106. package/dist/repo/orchestrator-state-repo.js +8 -1
  107. package/dist/repo/orchestrator-state-repo.js.map +1 -1
  108. package/dist/repo/run-repo.d.ts +3 -3
  109. package/dist/repo/run-repo.d.ts.map +1 -1
  110. package/dist/repo/run-repo.js +40 -19
  111. package/dist/repo/run-repo.js.map +1 -1
  112. package/dist/repo/task-repo.d.ts +14 -3
  113. package/dist/repo/task-repo.d.ts.map +1 -1
  114. package/dist/repo/task-repo.js +194 -20
  115. package/dist/repo/task-repo.js.map +1 -1
  116. package/dist/repo/tracked-project-repo.d.ts.map +1 -1
  117. package/dist/repo/tracked-project-repo.js +15 -1
  118. package/dist/repo/tracked-project-repo.js.map +1 -1
  119. package/dist/repo/worker-repo.d.ts +3 -2
  120. package/dist/repo/worker-repo.d.ts.map +1 -1
  121. package/dist/repo/worker-repo.js +54 -8
  122. package/dist/repo/worker-repo.js.map +1 -1
  123. package/dist/schemas/sync.js +2 -2
  124. package/dist/schemas/sync.js.map +1 -1
  125. package/dist/schemas/worker.d.ts +1 -0
  126. package/dist/schemas/worker.d.ts.map +1 -1
  127. package/dist/schemas/worker.js +1 -0
  128. package/dist/schemas/worker.js.map +1 -1
  129. package/dist/services/agent-service.d.ts +57 -0
  130. package/dist/services/agent-service.d.ts.map +1 -0
  131. package/dist/services/agent-service.js +81 -0
  132. package/dist/services/agent-service.js.map +1 -0
  133. package/dist/services/attempt-service.d.ts.map +1 -1
  134. package/dist/services/attempt-service.js +1 -4
  135. package/dist/services/attempt-service.js.map +1 -1
  136. package/dist/services/auto-sync-service.d.ts.map +1 -1
  137. package/dist/services/auto-sync-service.js +18 -10
  138. package/dist/services/auto-sync-service.js.map +1 -1
  139. package/dist/services/claim-service.d.ts +8 -2
  140. package/dist/services/claim-service.d.ts.map +1 -1
  141. package/dist/services/claim-service.js +37 -23
  142. package/dist/services/claim-service.js.map +1 -1
  143. package/dist/services/cycle-scan-service.d.ts +32 -0
  144. package/dist/services/cycle-scan-service.d.ts.map +1 -0
  145. package/dist/services/cycle-scan-service.js +546 -0
  146. package/dist/services/cycle-scan-service.js.map +1 -0
  147. package/dist/services/daemon-service.d.ts +40 -2
  148. package/dist/services/daemon-service.d.ts.map +1 -1
  149. package/dist/services/daemon-service.js +199 -52
  150. package/dist/services/daemon-service.js.map +1 -1
  151. package/dist/services/deduplication-service.d.ts +8 -4
  152. package/dist/services/deduplication-service.d.ts.map +1 -1
  153. package/dist/services/deduplication-service.js +79 -25
  154. package/dist/services/deduplication-service.js.map +1 -1
  155. package/dist/services/dep-service.d.ts +2 -2
  156. package/dist/services/dep-service.d.ts.map +1 -1
  157. package/dist/services/dep-service.js +9 -5
  158. package/dist/services/dep-service.js.map +1 -1
  159. package/dist/services/diversifier-service.d.ts +2 -1
  160. package/dist/services/diversifier-service.d.ts.map +1 -1
  161. package/dist/services/diversifier-service.js +37 -43
  162. package/dist/services/diversifier-service.js.map +1 -1
  163. package/dist/services/doc-service.d.ts +49 -0
  164. package/dist/services/doc-service.d.ts.map +1 -0
  165. package/dist/services/doc-service.js +605 -0
  166. package/dist/services/doc-service.js.map +1 -0
  167. package/dist/services/embedding-service.d.ts +66 -2
  168. package/dist/services/embedding-service.d.ts.map +1 -1
  169. package/dist/services/embedding-service.js +138 -24
  170. package/dist/services/embedding-service.js.map +1 -1
  171. package/dist/services/file-learning-service.d.ts.map +1 -1
  172. package/dist/services/file-learning-service.js +8 -7
  173. package/dist/services/file-learning-service.js.map +1 -1
  174. package/dist/services/file-watcher-service.d.ts.map +1 -1
  175. package/dist/services/file-watcher-service.js +58 -11
  176. package/dist/services/file-watcher-service.js.map +1 -1
  177. package/dist/services/hierarchy-service.d.ts +1 -1
  178. package/dist/services/hierarchy-service.d.ts.map +1 -1
  179. package/dist/services/hierarchy-service.js +50 -32
  180. package/dist/services/hierarchy-service.js.map +1 -1
  181. package/dist/services/index.d.ts +13 -15
  182. package/dist/services/index.d.ts.map +1 -1
  183. package/dist/services/index.js +13 -15
  184. package/dist/services/index.js.map +1 -1
  185. package/dist/services/learning-service.d.ts +3 -3
  186. package/dist/services/learning-service.d.ts.map +1 -1
  187. package/dist/services/learning-service.js +75 -42
  188. package/dist/services/learning-service.js.map +1 -1
  189. package/dist/services/llm-service.d.ts +62 -0
  190. package/dist/services/llm-service.d.ts.map +1 -0
  191. package/dist/services/llm-service.js +172 -0
  192. package/dist/services/llm-service.js.map +1 -0
  193. package/dist/services/migration-service.d.ts +1 -1
  194. package/dist/services/migration-service.d.ts.map +1 -1
  195. package/dist/services/migration-service.js +18 -7
  196. package/dist/services/migration-service.js.map +1 -1
  197. package/dist/services/orchestrator-service.d.ts +4 -3
  198. package/dist/services/orchestrator-service.d.ts.map +1 -1
  199. package/dist/services/orchestrator-service.js +66 -27
  200. package/dist/services/orchestrator-service.js.map +1 -1
  201. package/dist/services/query-expansion-service.d.ts +30 -9
  202. package/dist/services/query-expansion-service.d.ts.map +1 -1
  203. package/dist/services/query-expansion-service.js +54 -63
  204. package/dist/services/query-expansion-service.js.map +1 -1
  205. package/dist/services/ready-service.d.ts +21 -1
  206. package/dist/services/ready-service.d.ts.map +1 -1
  207. package/dist/services/ready-service.js +44 -21
  208. package/dist/services/ready-service.js.map +1 -1
  209. package/dist/services/retriever-service.d.ts +10 -10
  210. package/dist/services/retriever-service.d.ts.map +1 -1
  211. package/dist/services/retriever-service.js +53 -161
  212. package/dist/services/retriever-service.js.map +1 -1
  213. package/dist/services/sync-service.d.ts +17 -4
  214. package/dist/services/sync-service.d.ts.map +1 -1
  215. package/dist/services/sync-service.js +381 -116
  216. package/dist/services/sync-service.js.map +1 -1
  217. package/dist/services/task-service.d.ts +6 -4
  218. package/dist/services/task-service.d.ts.map +1 -1
  219. package/dist/services/task-service.js +165 -35
  220. package/dist/services/task-service.js.map +1 -1
  221. package/dist/services/tracing-service.d.ts +55 -0
  222. package/dist/services/tracing-service.d.ts.map +1 -0
  223. package/dist/services/tracing-service.js +99 -0
  224. package/dist/services/tracing-service.js.map +1 -0
  225. package/dist/services/transcript-adapter.d.ts +99 -0
  226. package/dist/services/transcript-adapter.d.ts.map +1 -0
  227. package/dist/services/transcript-adapter.js +283 -0
  228. package/dist/services/transcript-adapter.js.map +1 -0
  229. package/dist/services/validation-service.d.ts +85 -0
  230. package/dist/services/validation-service.d.ts.map +1 -0
  231. package/dist/services/validation-service.js +289 -0
  232. package/dist/services/validation-service.js.map +1 -0
  233. package/dist/services/worker-process.d.ts +23 -4
  234. package/dist/services/worker-process.d.ts.map +1 -1
  235. package/dist/services/worker-process.js +168 -72
  236. package/dist/services/worker-process.js.map +1 -1
  237. package/dist/services/worker-service.d.ts.map +1 -1
  238. package/dist/services/worker-service.js +7 -12
  239. package/dist/services/worker-service.js.map +1 -1
  240. package/dist/sync/claude-task-writer.d.ts +49 -0
  241. package/dist/sync/claude-task-writer.d.ts.map +1 -0
  242. package/dist/sync/claude-task-writer.js +135 -0
  243. package/dist/sync/claude-task-writer.js.map +1 -0
  244. package/dist/utils/doc-hash.d.ts +10 -0
  245. package/dist/utils/doc-hash.d.ts.map +1 -0
  246. package/dist/utils/doc-hash.js +14 -0
  247. package/dist/utils/doc-hash.js.map +1 -0
  248. package/dist/utils/doc-renderer.d.ts +44 -0
  249. package/dist/utils/doc-renderer.d.ts.map +1 -0
  250. package/dist/utils/doc-renderer.js +202 -0
  251. package/dist/utils/doc-renderer.js.map +1 -0
  252. package/dist/utils/math.d.ts +5 -1
  253. package/dist/utils/math.d.ts.map +1 -1
  254. package/dist/utils/math.js +12 -4
  255. package/dist/utils/math.js.map +1 -1
  256. package/dist/utils/sql.d.ts +9 -0
  257. package/dist/utils/sql.d.ts.map +1 -0
  258. package/dist/utils/sql.js +9 -0
  259. package/dist/utils/sql.js.map +1 -0
  260. package/dist/utils/toml-config.d.ts +22 -0
  261. package/dist/utils/toml-config.d.ts.map +1 -0
  262. package/dist/utils/toml-config.js +75 -0
  263. package/dist/utils/toml-config.js.map +1 -0
  264. package/dist/worker/hooks.d.ts +102 -0
  265. package/dist/worker/hooks.d.ts.map +1 -0
  266. package/dist/worker/hooks.js +11 -0
  267. package/dist/worker/hooks.js.map +1 -0
  268. package/dist/worker/index.d.ts +9 -0
  269. package/dist/worker/index.d.ts.map +1 -0
  270. package/dist/worker/index.js +8 -0
  271. package/dist/worker/index.js.map +1 -0
  272. package/dist/worker/run-worker.d.ts +33 -0
  273. package/dist/worker/run-worker.d.ts.map +1 -0
  274. package/dist/worker/run-worker.js +265 -0
  275. package/dist/worker/run-worker.js.map +1 -0
  276. package/package.json +14 -12
  277. package/dist/mappers/anchor.d.ts +0 -14
  278. package/dist/mappers/anchor.d.ts.map +0 -1
  279. package/dist/mappers/anchor.js +0 -38
  280. package/dist/mappers/anchor.js.map +0 -1
  281. package/dist/mappers/candidate.d.ts +0 -23
  282. package/dist/mappers/candidate.d.ts.map +0 -1
  283. package/dist/mappers/candidate.js +0 -53
  284. package/dist/mappers/candidate.js.map +0 -1
  285. package/dist/mappers/edge.d.ts +0 -10
  286. package/dist/mappers/edge.d.ts.map +0 -1
  287. package/dist/mappers/edge.js +0 -19
  288. package/dist/mappers/edge.js.map +0 -1
  289. package/dist/repo/anchor-repo.d.ts +0 -52
  290. package/dist/repo/anchor-repo.d.ts.map +0 -1
  291. package/dist/repo/anchor-repo.js +0 -204
  292. package/dist/repo/anchor-repo.js.map +0 -1
  293. package/dist/repo/candidate-repo.d.ts +0 -16
  294. package/dist/repo/candidate-repo.d.ts.map +0 -1
  295. package/dist/repo/candidate-repo.js +0 -143
  296. package/dist/repo/candidate-repo.js.map +0 -1
  297. package/dist/repo/edge-repo.d.ts +0 -26
  298. package/dist/repo/edge-repo.d.ts.map +0 -1
  299. package/dist/repo/edge-repo.js +0 -227
  300. package/dist/repo/edge-repo.js.map +0 -1
  301. package/dist/services/anchor-service.d.ts +0 -147
  302. package/dist/services/anchor-service.d.ts.map +0 -1
  303. package/dist/services/anchor-service.js +0 -540
  304. package/dist/services/anchor-service.js.map +0 -1
  305. package/dist/services/anchor-verification.d.ts +0 -94
  306. package/dist/services/anchor-verification.d.ts.map +0 -1
  307. package/dist/services/anchor-verification.js +0 -617
  308. package/dist/services/anchor-verification.js.map +0 -1
  309. package/dist/services/ast-grep-service.d.ts +0 -58
  310. package/dist/services/ast-grep-service.d.ts.map +0 -1
  311. package/dist/services/ast-grep-service.js +0 -356
  312. package/dist/services/ast-grep-service.js.map +0 -1
  313. package/dist/services/candidate-extractor-service.d.ts +0 -56
  314. package/dist/services/candidate-extractor-service.d.ts.map +0 -1
  315. package/dist/services/candidate-extractor-service.js +0 -365
  316. package/dist/services/candidate-extractor-service.js.map +0 -1
  317. package/dist/services/edge-service.d.ts +0 -78
  318. package/dist/services/edge-service.d.ts.map +0 -1
  319. package/dist/services/edge-service.js +0 -158
  320. package/dist/services/edge-service.js.map +0 -1
  321. package/dist/services/feedback-tracker.d.ts +0 -64
  322. package/dist/services/feedback-tracker.d.ts.map +0 -1
  323. package/dist/services/feedback-tracker.js +0 -110
  324. package/dist/services/feedback-tracker.js.map +0 -1
  325. package/dist/services/graph-expansion.d.ts +0 -155
  326. package/dist/services/graph-expansion.d.ts.map +0 -1
  327. package/dist/services/graph-expansion.js +0 -466
  328. package/dist/services/graph-expansion.js.map +0 -1
  329. package/dist/services/promotion-service.d.ts +0 -67
  330. package/dist/services/promotion-service.d.ts.map +0 -1
  331. package/dist/services/promotion-service.js +0 -151
  332. package/dist/services/promotion-service.js.map +0 -1
  333. package/dist/services/swarm-verification.d.ts +0 -104
  334. package/dist/services/swarm-verification.d.ts.map +0 -1
  335. package/dist/services/swarm-verification.js +0 -400
  336. package/dist/services/swarm-verification.js.map +0 -1
@@ -1,617 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"anchor-verification.js","sourceRoot":"","sources":["../../src/services/anchor-verification.ts"],"names":[],"mappings":"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"}