@jamesaphoenix/tx-core 0.4.2 → 0.4.3

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 (330) 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 +102 -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/anchor.d.ts +15 -1
  23. package/dist/mappers/anchor.d.ts.map +1 -1
  24. package/dist/mappers/anchor.js +95 -28
  25. package/dist/mappers/anchor.js.map +1 -1
  26. package/dist/mappers/attempt.d.ts +3 -1
  27. package/dist/mappers/attempt.d.ts.map +1 -1
  28. package/dist/mappers/attempt.js +23 -9
  29. package/dist/mappers/attempt.js.map +1 -1
  30. package/dist/mappers/candidate.d.ts +3 -1
  31. package/dist/mappers/candidate.d.ts.map +1 -1
  32. package/dist/mappers/candidate.js +46 -16
  33. package/dist/mappers/candidate.js.map +1 -1
  34. package/dist/mappers/claim.d.ts +1 -1
  35. package/dist/mappers/claim.d.ts.map +1 -1
  36. package/dist/mappers/claim.js +11 -4
  37. package/dist/mappers/claim.js.map +1 -1
  38. package/dist/mappers/deduplication.d.ts +13 -1
  39. package/dist/mappers/deduplication.d.ts.map +1 -1
  40. package/dist/mappers/deduplication.js +22 -3
  41. package/dist/mappers/deduplication.js.map +1 -1
  42. package/dist/mappers/doc.d.ts +24 -0
  43. package/dist/mappers/doc.d.ts.map +1 -0
  44. package/dist/mappers/doc.js +161 -0
  45. package/dist/mappers/doc.js.map +1 -0
  46. package/dist/mappers/edge.d.ts +10 -1
  47. package/dist/mappers/edge.d.ts.map +1 -1
  48. package/dist/mappers/edge.js +74 -12
  49. package/dist/mappers/edge.js.map +1 -1
  50. package/dist/mappers/file-learning.d.ts.map +1 -1
  51. package/dist/mappers/file-learning.js +2 -1
  52. package/dist/mappers/file-learning.js.map +1 -1
  53. package/dist/mappers/index.d.ts +6 -7
  54. package/dist/mappers/index.d.ts.map +1 -1
  55. package/dist/mappers/index.js +10 -12
  56. package/dist/mappers/index.js.map +1 -1
  57. package/dist/mappers/learning.d.ts +9 -1
  58. package/dist/mappers/learning.d.ts.map +1 -1
  59. package/dist/mappers/learning.js +94 -14
  60. package/dist/mappers/learning.js.map +1 -1
  61. package/dist/mappers/orchestrator-state.d.ts +1 -1
  62. package/dist/mappers/orchestrator-state.d.ts.map +1 -1
  63. package/dist/mappers/orchestrator-state.js +31 -5
  64. package/dist/mappers/orchestrator-state.js.map +1 -1
  65. package/dist/mappers/parse-date.d.ts +11 -0
  66. package/dist/mappers/parse-date.d.ts.map +1 -0
  67. package/dist/mappers/parse-date.js +18 -0
  68. package/dist/mappers/parse-date.js.map +1 -0
  69. package/dist/mappers/run.d.ts +14 -4
  70. package/dist/mappers/run.d.ts.map +1 -1
  71. package/dist/mappers/run.js +49 -18
  72. package/dist/mappers/run.js.map +1 -1
  73. package/dist/mappers/task.d.ts +5 -1
  74. package/dist/mappers/task.d.ts.map +1 -1
  75. package/dist/mappers/task.js +66 -16
  76. package/dist/mappers/task.js.map +1 -1
  77. package/dist/mappers/tracked-project.d.ts +3 -1
  78. package/dist/mappers/tracked-project.d.ts.map +1 -1
  79. package/dist/mappers/tracked-project.js +23 -9
  80. package/dist/mappers/tracked-project.js.map +1 -1
  81. package/dist/mappers/worker.d.ts +1 -1
  82. package/dist/mappers/worker.d.ts.map +1 -1
  83. package/dist/mappers/worker.js +44 -6
  84. package/dist/mappers/worker.js.map +1 -1
  85. package/dist/repo/anchor-repo.d.ts +2 -2
  86. package/dist/repo/anchor-repo.d.ts.map +1 -1
  87. package/dist/repo/anchor-repo.js +46 -5
  88. package/dist/repo/anchor-repo.js.map +1 -1
  89. package/dist/repo/attempt-repo.d.ts +2 -2
  90. package/dist/repo/attempt-repo.d.ts.map +1 -1
  91. package/dist/repo/attempt-repo.js +16 -6
  92. package/dist/repo/attempt-repo.js.map +1 -1
  93. package/dist/repo/candidate-repo.d.ts.map +1 -1
  94. package/dist/repo/candidate-repo.js +22 -1
  95. package/dist/repo/candidate-repo.js.map +1 -1
  96. package/dist/repo/claim-repo.d.ts +46 -2
  97. package/dist/repo/claim-repo.d.ts.map +1 -1
  98. package/dist/repo/claim-repo.js +113 -6
  99. package/dist/repo/claim-repo.js.map +1 -1
  100. package/dist/repo/compaction-repo.d.ts +41 -0
  101. package/dist/repo/compaction-repo.d.ts.map +1 -0
  102. package/dist/repo/compaction-repo.js +84 -0
  103. package/dist/repo/compaction-repo.js.map +1 -0
  104. package/dist/repo/deduplication-repo.d.ts +9 -1
  105. package/dist/repo/deduplication-repo.d.ts.map +1 -1
  106. package/dist/repo/deduplication-repo.js +46 -9
  107. package/dist/repo/deduplication-repo.js.map +1 -1
  108. package/dist/repo/dep-repo.d.ts +27 -3
  109. package/dist/repo/dep-repo.d.ts.map +1 -1
  110. package/dist/repo/dep-repo.js +166 -39
  111. package/dist/repo/dep-repo.js.map +1 -1
  112. package/dist/repo/doc-repo.d.ts +59 -0
  113. package/dist/repo/doc-repo.d.ts.map +1 -0
  114. package/dist/repo/doc-repo.js +276 -0
  115. package/dist/repo/doc-repo.js.map +1 -0
  116. package/dist/repo/edge-repo.d.ts +1 -1
  117. package/dist/repo/edge-repo.d.ts.map +1 -1
  118. package/dist/repo/edge-repo.js +65 -34
  119. package/dist/repo/edge-repo.js.map +1 -1
  120. package/dist/repo/file-learning-repo.d.ts +3 -3
  121. package/dist/repo/file-learning-repo.d.ts.map +1 -1
  122. package/dist/repo/file-learning-repo.js +19 -8
  123. package/dist/repo/file-learning-repo.js.map +1 -1
  124. package/dist/repo/index.d.ts +4 -6
  125. package/dist/repo/index.d.ts.map +1 -1
  126. package/dist/repo/index.js +3 -5
  127. package/dist/repo/index.js.map +1 -1
  128. package/dist/repo/learning-repo.d.ts +10 -3
  129. package/dist/repo/learning-repo.d.ts.map +1 -1
  130. package/dist/repo/learning-repo.js +68 -11
  131. package/dist/repo/learning-repo.js.map +1 -1
  132. package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
  133. package/dist/repo/orchestrator-state-repo.js +8 -1
  134. package/dist/repo/orchestrator-state-repo.js.map +1 -1
  135. package/dist/repo/run-repo.d.ts +3 -3
  136. package/dist/repo/run-repo.d.ts.map +1 -1
  137. package/dist/repo/run-repo.js +40 -19
  138. package/dist/repo/run-repo.js.map +1 -1
  139. package/dist/repo/task-repo.d.ts +14 -3
  140. package/dist/repo/task-repo.d.ts.map +1 -1
  141. package/dist/repo/task-repo.js +194 -20
  142. package/dist/repo/task-repo.js.map +1 -1
  143. package/dist/repo/tracked-project-repo.d.ts.map +1 -1
  144. package/dist/repo/tracked-project-repo.js +15 -1
  145. package/dist/repo/tracked-project-repo.js.map +1 -1
  146. package/dist/repo/worker-repo.d.ts +3 -2
  147. package/dist/repo/worker-repo.d.ts.map +1 -1
  148. package/dist/repo/worker-repo.js +54 -8
  149. package/dist/repo/worker-repo.js.map +1 -1
  150. package/dist/schemas/sync.js +2 -2
  151. package/dist/schemas/sync.js.map +1 -1
  152. package/dist/schemas/worker.d.ts +1 -0
  153. package/dist/schemas/worker.d.ts.map +1 -1
  154. package/dist/schemas/worker.js +1 -0
  155. package/dist/schemas/worker.js.map +1 -1
  156. package/dist/services/agent-service.d.ts +57 -0
  157. package/dist/services/agent-service.d.ts.map +1 -0
  158. package/dist/services/agent-service.js +81 -0
  159. package/dist/services/agent-service.js.map +1 -0
  160. package/dist/services/anchor-service.js +1 -1
  161. package/dist/services/anchor-service.js.map +1 -1
  162. package/dist/services/anchor-verification.d.ts +8 -0
  163. package/dist/services/anchor-verification.d.ts.map +1 -1
  164. package/dist/services/anchor-verification.js +237 -37
  165. package/dist/services/anchor-verification.js.map +1 -1
  166. package/dist/services/ast-grep-service.d.ts.map +1 -1
  167. package/dist/services/ast-grep-service.js +93 -22
  168. package/dist/services/ast-grep-service.js.map +1 -1
  169. package/dist/services/attempt-service.d.ts.map +1 -1
  170. package/dist/services/attempt-service.js +1 -4
  171. package/dist/services/attempt-service.js.map +1 -1
  172. package/dist/services/auto-sync-service.d.ts +1 -1
  173. package/dist/services/auto-sync-service.d.ts.map +1 -1
  174. package/dist/services/auto-sync-service.js +18 -10
  175. package/dist/services/auto-sync-service.js.map +1 -1
  176. package/dist/services/claim-service.d.ts +8 -2
  177. package/dist/services/claim-service.d.ts.map +1 -1
  178. package/dist/services/claim-service.js +37 -23
  179. package/dist/services/claim-service.js.map +1 -1
  180. package/dist/services/compaction-service.d.ts +105 -0
  181. package/dist/services/compaction-service.d.ts.map +1 -0
  182. package/dist/services/compaction-service.js +369 -0
  183. package/dist/services/compaction-service.js.map +1 -0
  184. package/dist/services/cycle-scan-service.d.ts +32 -0
  185. package/dist/services/cycle-scan-service.d.ts.map +1 -0
  186. package/dist/services/cycle-scan-service.js +542 -0
  187. package/dist/services/cycle-scan-service.js.map +1 -0
  188. package/dist/services/daemon-service.d.ts +40 -2
  189. package/dist/services/daemon-service.d.ts.map +1 -1
  190. package/dist/services/daemon-service.js +199 -52
  191. package/dist/services/daemon-service.js.map +1 -1
  192. package/dist/services/deduplication-service.d.ts +8 -4
  193. package/dist/services/deduplication-service.d.ts.map +1 -1
  194. package/dist/services/deduplication-service.js +79 -25
  195. package/dist/services/deduplication-service.js.map +1 -1
  196. package/dist/services/dep-service.d.ts +2 -2
  197. package/dist/services/dep-service.d.ts.map +1 -1
  198. package/dist/services/dep-service.js +9 -5
  199. package/dist/services/dep-service.js.map +1 -1
  200. package/dist/services/diversifier-service.d.ts +2 -1
  201. package/dist/services/diversifier-service.d.ts.map +1 -1
  202. package/dist/services/diversifier-service.js +37 -43
  203. package/dist/services/diversifier-service.js.map +1 -1
  204. package/dist/services/doc-service.d.ts +49 -0
  205. package/dist/services/doc-service.d.ts.map +1 -0
  206. package/dist/services/doc-service.js +605 -0
  207. package/dist/services/doc-service.js.map +1 -0
  208. package/dist/services/edge-service.js +2 -2
  209. package/dist/services/edge-service.js.map +1 -1
  210. package/dist/services/embedding-service.d.ts +66 -2
  211. package/dist/services/embedding-service.d.ts.map +1 -1
  212. package/dist/services/embedding-service.js +138 -24
  213. package/dist/services/embedding-service.js.map +1 -1
  214. package/dist/services/file-learning-service.d.ts.map +1 -1
  215. package/dist/services/file-learning-service.js +8 -7
  216. package/dist/services/file-learning-service.js.map +1 -1
  217. package/dist/services/file-watcher-service.d.ts.map +1 -1
  218. package/dist/services/file-watcher-service.js +58 -11
  219. package/dist/services/file-watcher-service.js.map +1 -1
  220. package/dist/services/graph-expansion.d.ts +3 -0
  221. package/dist/services/graph-expansion.d.ts.map +1 -1
  222. package/dist/services/graph-expansion.js +28 -7
  223. package/dist/services/graph-expansion.js.map +1 -1
  224. package/dist/services/hierarchy-service.d.ts +1 -1
  225. package/dist/services/hierarchy-service.d.ts.map +1 -1
  226. package/dist/services/hierarchy-service.js +50 -32
  227. package/dist/services/hierarchy-service.js.map +1 -1
  228. package/dist/services/index.d.ts +13 -15
  229. package/dist/services/index.d.ts.map +1 -1
  230. package/dist/services/index.js +13 -15
  231. package/dist/services/index.js.map +1 -1
  232. package/dist/services/learning-service.d.ts +4 -4
  233. package/dist/services/learning-service.d.ts.map +1 -1
  234. package/dist/services/learning-service.js +75 -42
  235. package/dist/services/learning-service.js.map +1 -1
  236. package/dist/services/llm-service.d.ts +62 -0
  237. package/dist/services/llm-service.d.ts.map +1 -0
  238. package/dist/services/llm-service.js +172 -0
  239. package/dist/services/llm-service.js.map +1 -0
  240. package/dist/services/migration-service.d.ts +1 -1
  241. package/dist/services/migration-service.d.ts.map +1 -1
  242. package/dist/services/migration-service.js +18 -7
  243. package/dist/services/migration-service.js.map +1 -1
  244. package/dist/services/orchestrator-service.d.ts +4 -3
  245. package/dist/services/orchestrator-service.d.ts.map +1 -1
  246. package/dist/services/orchestrator-service.js +67 -29
  247. package/dist/services/orchestrator-service.js.map +1 -1
  248. package/dist/services/promotion-service.d.ts +1 -1
  249. package/dist/services/promotion-service.js +1 -1
  250. package/dist/services/promotion-service.js.map +1 -1
  251. package/dist/services/query-expansion-service.d.ts +30 -9
  252. package/dist/services/query-expansion-service.d.ts.map +1 -1
  253. package/dist/services/query-expansion-service.js +54 -63
  254. package/dist/services/query-expansion-service.js.map +1 -1
  255. package/dist/services/ready-service.d.ts +21 -1
  256. package/dist/services/ready-service.d.ts.map +1 -1
  257. package/dist/services/ready-service.js +44 -21
  258. package/dist/services/ready-service.js.map +1 -1
  259. package/dist/services/retriever-service.d.ts +10 -10
  260. package/dist/services/retriever-service.d.ts.map +1 -1
  261. package/dist/services/retriever-service.js +53 -161
  262. package/dist/services/retriever-service.js.map +1 -1
  263. package/dist/services/swarm-verification.d.ts +2 -2
  264. package/dist/services/swarm-verification.d.ts.map +1 -1
  265. package/dist/services/swarm-verification.js +12 -6
  266. package/dist/services/swarm-verification.js.map +1 -1
  267. package/dist/services/sync-service.d.ts +17 -4
  268. package/dist/services/sync-service.d.ts.map +1 -1
  269. package/dist/services/sync-service.js +378 -114
  270. package/dist/services/sync-service.js.map +1 -1
  271. package/dist/services/task-service.d.ts +6 -4
  272. package/dist/services/task-service.d.ts.map +1 -1
  273. package/dist/services/task-service.js +162 -33
  274. package/dist/services/task-service.js.map +1 -1
  275. package/dist/services/tracing-service.d.ts +55 -0
  276. package/dist/services/tracing-service.d.ts.map +1 -0
  277. package/dist/services/tracing-service.js +99 -0
  278. package/dist/services/tracing-service.js.map +1 -0
  279. package/dist/services/transcript-adapter.d.ts +99 -0
  280. package/dist/services/transcript-adapter.d.ts.map +1 -0
  281. package/dist/services/transcript-adapter.js +283 -0
  282. package/dist/services/transcript-adapter.js.map +1 -0
  283. package/dist/services/validation-service.d.ts +85 -0
  284. package/dist/services/validation-service.d.ts.map +1 -0
  285. package/dist/services/validation-service.js +289 -0
  286. package/dist/services/validation-service.js.map +1 -0
  287. package/dist/services/worker-process.d.ts +23 -4
  288. package/dist/services/worker-process.d.ts.map +1 -1
  289. package/dist/services/worker-process.js +159 -70
  290. package/dist/services/worker-process.js.map +1 -1
  291. package/dist/services/worker-service.d.ts.map +1 -1
  292. package/dist/services/worker-service.js +7 -12
  293. package/dist/services/worker-service.js.map +1 -1
  294. package/dist/sync/claude-task-writer.d.ts +49 -0
  295. package/dist/sync/claude-task-writer.d.ts.map +1 -0
  296. package/dist/sync/claude-task-writer.js +135 -0
  297. package/dist/sync/claude-task-writer.js.map +1 -0
  298. package/dist/utils/doc-hash.d.ts +10 -0
  299. package/dist/utils/doc-hash.d.ts.map +1 -0
  300. package/dist/utils/doc-hash.js +14 -0
  301. package/dist/utils/doc-hash.js.map +1 -0
  302. package/dist/utils/doc-renderer.d.ts +44 -0
  303. package/dist/utils/doc-renderer.d.ts.map +1 -0
  304. package/dist/utils/doc-renderer.js +202 -0
  305. package/dist/utils/doc-renderer.js.map +1 -0
  306. package/dist/utils/math.d.ts +5 -1
  307. package/dist/utils/math.d.ts.map +1 -1
  308. package/dist/utils/math.js +12 -4
  309. package/dist/utils/math.js.map +1 -1
  310. package/dist/utils/sql.d.ts +9 -0
  311. package/dist/utils/sql.d.ts.map +1 -0
  312. package/dist/utils/sql.js +9 -0
  313. package/dist/utils/sql.js.map +1 -0
  314. package/dist/utils/toml-config.d.ts +22 -0
  315. package/dist/utils/toml-config.d.ts.map +1 -0
  316. package/dist/utils/toml-config.js +75 -0
  317. package/dist/utils/toml-config.js.map +1 -0
  318. package/dist/worker/hooks.d.ts +102 -0
  319. package/dist/worker/hooks.d.ts.map +1 -0
  320. package/dist/worker/hooks.js +11 -0
  321. package/dist/worker/hooks.js.map +1 -0
  322. package/dist/worker/index.d.ts +9 -0
  323. package/dist/worker/index.d.ts.map +1 -0
  324. package/dist/worker/index.js +8 -0
  325. package/dist/worker/index.js.map +1 -0
  326. package/dist/worker/run-worker.d.ts +33 -0
  327. package/dist/worker/run-worker.d.ts.map +1 -0
  328. package/dist/worker/run-worker.js +265 -0
  329. package/dist/worker/run-worker.js.map +1 -0
  330. package/package.json +14 -12
@@ -0,0 +1,289 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ import { MIGRATIONS, getLatestVersion } from "./migration-service.js";
5
+ import { TASK_STATUSES } from "@jamesaphoenix/tx-types";
6
+ /**
7
+ * ValidationService performs pre-flight database checks.
8
+ * Follows Effect-TS patterns per DD-002.
9
+ */
10
+ export class ValidationService extends Context.Tag("ValidationService")() {
11
+ }
12
+ export const ValidationServiceLive = Layer.effect(ValidationService, Effect.gen(function* () {
13
+ const db = yield* SqliteClient;
14
+ const checkIntegrity = () => Effect.try({
15
+ try: () => {
16
+ const rows = db.prepare("PRAGMA integrity_check").all();
17
+ const issues = [];
18
+ for (const row of rows) {
19
+ if (row.integrity_check !== "ok") {
20
+ issues.push({
21
+ check: "integrity",
22
+ severity: "error",
23
+ message: row.integrity_check
24
+ });
25
+ }
26
+ }
27
+ return {
28
+ name: "Database Integrity",
29
+ passed: issues.length === 0,
30
+ issues,
31
+ fixable: false
32
+ };
33
+ },
34
+ catch: (cause) => new DatabaseError({ cause })
35
+ });
36
+ const checkSchemaVersion = () => Effect.try({
37
+ try: () => {
38
+ const issues = [];
39
+ const latestVersion = getLatestVersion();
40
+ // Get current schema version
41
+ let currentVersion = 0;
42
+ try {
43
+ const row = db.prepare("SELECT MAX(version) as version FROM schema_version").get();
44
+ currentVersion = row?.version ?? 0;
45
+ }
46
+ catch {
47
+ // Table doesn't exist
48
+ issues.push({
49
+ check: "schema_version",
50
+ severity: "error",
51
+ message: "schema_version table does not exist"
52
+ });
53
+ return {
54
+ name: "Schema Version",
55
+ passed: false,
56
+ issues,
57
+ fixable: true
58
+ };
59
+ }
60
+ if (currentVersion < latestVersion) {
61
+ issues.push({
62
+ check: "schema_version",
63
+ severity: "warning",
64
+ message: `Schema is outdated: current=${currentVersion}, latest=${latestVersion}`,
65
+ details: {
66
+ currentVersion,
67
+ latestVersion,
68
+ pendingMigrations: MIGRATIONS.filter(m => m.version > currentVersion).length
69
+ }
70
+ });
71
+ }
72
+ if (currentVersion > latestVersion) {
73
+ issues.push({
74
+ check: "schema_version",
75
+ severity: "error",
76
+ message: `Schema version is ahead of known migrations: current=${currentVersion}, latest=${latestVersion}`,
77
+ details: { currentVersion, latestVersion }
78
+ });
79
+ }
80
+ return {
81
+ name: "Schema Version",
82
+ passed: issues.filter(i => i.severity === "error").length === 0,
83
+ issues,
84
+ fixable: currentVersion < latestVersion
85
+ };
86
+ },
87
+ catch: (cause) => new DatabaseError({ cause })
88
+ });
89
+ const checkForeignKeys = () => Effect.try({
90
+ try: () => {
91
+ const issues = [];
92
+ // Check if foreign keys are enabled
93
+ const fkEnabled = db.prepare("PRAGMA foreign_keys").get();
94
+ if (!fkEnabled || fkEnabled.foreign_keys !== 1) {
95
+ issues.push({
96
+ check: "foreign_keys",
97
+ severity: "warning",
98
+ message: "Foreign keys are not enabled"
99
+ });
100
+ }
101
+ // Run foreign key check
102
+ const violations = db.prepare("PRAGMA foreign_key_check").all();
103
+ for (const violation of violations) {
104
+ issues.push({
105
+ check: "foreign_keys",
106
+ severity: "error",
107
+ message: `Foreign key violation in ${violation.table} row ${violation.rowid} referencing ${violation.parent}`,
108
+ details: violation
109
+ });
110
+ }
111
+ return {
112
+ name: "Foreign Key Constraints",
113
+ passed: violations.length === 0,
114
+ issues,
115
+ fixable: false
116
+ };
117
+ },
118
+ catch: (cause) => new DatabaseError({ cause })
119
+ });
120
+ const checkOrphanedDependencies = (fix = false) => Effect.try({
121
+ try: () => {
122
+ const issues = [];
123
+ let fixed = 0;
124
+ // Find dependencies where blocker or blocked task doesn't exist
125
+ // This shouldn't happen with ON DELETE CASCADE, but can occur from manual edits or corruption
126
+ const orphanedBlockers = db.prepare(`
127
+ SELECT td.id, td.blocker_id, td.blocked_id
128
+ FROM task_dependencies td
129
+ LEFT JOIN tasks t ON t.id = td.blocker_id
130
+ WHERE t.id IS NULL
131
+ `).all();
132
+ const orphanedBlocked = db.prepare(`
133
+ SELECT td.id, td.blocker_id, td.blocked_id
134
+ FROM task_dependencies td
135
+ LEFT JOIN tasks t ON t.id = td.blocked_id
136
+ WHERE t.id IS NULL
137
+ `).all();
138
+ for (const row of orphanedBlockers) {
139
+ issues.push({
140
+ check: "orphaned_dependencies",
141
+ severity: "error",
142
+ message: `Dependency ${row.id} references non-existent blocker task ${row.blocker_id}`,
143
+ details: row
144
+ });
145
+ }
146
+ for (const row of orphanedBlocked) {
147
+ issues.push({
148
+ check: "orphaned_dependencies",
149
+ severity: "error",
150
+ message: `Dependency ${row.id} references non-existent blocked task ${row.blocked_id}`,
151
+ details: row
152
+ });
153
+ }
154
+ if (fix && issues.length > 0) {
155
+ // Delete orphaned dependencies
156
+ const orphanedIds = [...orphanedBlockers, ...orphanedBlocked].map(r => r.id);
157
+ const uniqueIds = [...new Set(orphanedIds)];
158
+ if (uniqueIds.length > 0) {
159
+ const result = db.prepare(`
160
+ DELETE FROM task_dependencies
161
+ WHERE id IN (${uniqueIds.map(() => "?").join(",")})
162
+ `).run(...uniqueIds);
163
+ fixed = result.changes;
164
+ }
165
+ }
166
+ return {
167
+ name: "Orphaned Dependencies",
168
+ passed: issues.length === 0,
169
+ issues,
170
+ fixable: true,
171
+ fixed: fix ? fixed : undefined
172
+ };
173
+ },
174
+ catch: (cause) => new DatabaseError({ cause })
175
+ });
176
+ const checkInvalidStatuses = (fix = false) => Effect.try({
177
+ try: () => {
178
+ const issues = [];
179
+ let fixed = 0;
180
+ // Find tasks with invalid status values
181
+ const validStatuses = TASK_STATUSES;
182
+ const placeholders = validStatuses.map(() => "?").join(",");
183
+ const invalidTasks = db.prepare(`
184
+ SELECT id, status FROM tasks WHERE status NOT IN (${placeholders})
185
+ `).all(...validStatuses);
186
+ for (const task of invalidTasks) {
187
+ issues.push({
188
+ check: "invalid_status",
189
+ severity: "error",
190
+ message: `Task ${task.id} has invalid status '${task.status}'`,
191
+ details: { id: task.id, status: task.status, validStatuses }
192
+ });
193
+ }
194
+ if (fix && issues.length > 0) {
195
+ // Reset invalid statuses to 'backlog' (safe default)
196
+ const result = db.prepare(`
197
+ UPDATE tasks SET status = 'backlog', updated_at = datetime('now')
198
+ WHERE status NOT IN (${placeholders})
199
+ `).run(...validStatuses);
200
+ fixed = result.changes;
201
+ }
202
+ return {
203
+ name: "Task Status Values",
204
+ passed: issues.length === 0,
205
+ issues,
206
+ fixable: true,
207
+ fixed: fix ? fixed : undefined
208
+ };
209
+ },
210
+ catch: (cause) => new DatabaseError({ cause })
211
+ });
212
+ const checkMissingParentRefs = (fix = false) => Effect.try({
213
+ try: () => {
214
+ const issues = [];
215
+ let fixed = 0;
216
+ // Find tasks referencing non-existent parents
217
+ const orphanedChildren = db.prepare(`
218
+ SELECT t.id, t.parent_id
219
+ FROM tasks t
220
+ LEFT JOIN tasks p ON p.id = t.parent_id
221
+ WHERE t.parent_id IS NOT NULL AND p.id IS NULL
222
+ `).all();
223
+ for (const task of orphanedChildren) {
224
+ issues.push({
225
+ check: "missing_parent_refs",
226
+ severity: "error",
227
+ message: `Task ${task.id} references non-existent parent ${task.parent_id}`,
228
+ details: { id: task.id, parentId: task.parent_id }
229
+ });
230
+ }
231
+ if (fix && issues.length > 0) {
232
+ // Clear orphaned parent references
233
+ const result = db.prepare(`
234
+ UPDATE tasks SET parent_id = NULL, updated_at = datetime('now')
235
+ WHERE parent_id IS NOT NULL
236
+ AND parent_id NOT IN (SELECT id FROM tasks)
237
+ `).run();
238
+ fixed = result.changes;
239
+ }
240
+ return {
241
+ name: "Missing Parent References",
242
+ passed: issues.length === 0,
243
+ issues,
244
+ fixable: true,
245
+ fixed: fix ? fixed : undefined
246
+ };
247
+ },
248
+ catch: (cause) => new DatabaseError({ cause })
249
+ });
250
+ const validate = (options) => Effect.gen(function* () {
251
+ const fix = options?.fix ?? false;
252
+ // Run all checks
253
+ const checks = [];
254
+ checks.push(yield* checkIntegrity());
255
+ checks.push(yield* checkSchemaVersion());
256
+ checks.push(yield* checkForeignKeys());
257
+ checks.push(yield* checkOrphanedDependencies(fix));
258
+ checks.push(yield* checkInvalidStatuses(fix));
259
+ checks.push(yield* checkMissingParentRefs(fix));
260
+ // Count issues by severity
261
+ const issueCount = { error: 0, warning: 0, info: 0 };
262
+ let fixedCount = 0;
263
+ for (const check of checks) {
264
+ for (const issue of check.issues) {
265
+ issueCount[issue.severity]++;
266
+ }
267
+ if (check.fixed !== undefined) {
268
+ fixedCount += check.fixed;
269
+ }
270
+ }
271
+ const valid = issueCount.error === 0;
272
+ return {
273
+ valid,
274
+ checks,
275
+ issueCount,
276
+ fixedCount
277
+ };
278
+ });
279
+ return {
280
+ validate,
281
+ checkIntegrity,
282
+ checkSchemaVersion,
283
+ checkForeignKeys,
284
+ checkOrphanedDependencies,
285
+ checkInvalidStatuses,
286
+ checkMissingParentRefs
287
+ };
288
+ }));
289
+ //# sourceMappingURL=validation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-service.js","sourceRoot":"","sources":["../../src/services/validation-service.ts"],"names":[],"mappings":"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"}
@@ -2,14 +2,31 @@
2
2
  * WorkerProcess - PRD-018
3
3
  *
4
4
  * Implements the worker process with heartbeat fiber, lease renewal,
5
- * Claude subprocess management, and graceful shutdown handling.
5
+ * agent subprocess management, and graceful shutdown handling.
6
6
  * Uses Effect-TS patterns per DD-002.
7
7
  */
8
8
  import { Effect } from "effect";
9
+ import { type ChildProcess } from "child_process";
9
10
  import { WorkerService } from "./worker-service.js";
10
11
  import { ClaimService } from "./claim-service.js";
11
12
  import { ReadyService } from "./ready-service.js";
12
13
  import { TaskService } from "./task-service.js";
14
+ import { AttemptService } from "./attempt-service.js";
15
+ /**
16
+ * Timeout in milliseconds to wait after SIGTERM before escalating to SIGKILL.
17
+ * If the agent subprocess doesn't exit within this window, it will be forcefully killed.
18
+ */
19
+ export declare const SIGKILL_ESCALATION_TIMEOUT_MS = 5000;
20
+ /**
21
+ * Kill a child process with SIGTERM, escalating to SIGKILL after a timeout.
22
+ *
23
+ * If the process ignores SIGTERM (e.g., traps the signal), it would become orphaned.
24
+ * This function ensures cleanup by sending SIGKILL after SIGKILL_ESCALATION_TIMEOUT_MS.
25
+ *
26
+ * Uses setTimeout with .unref() so the escalation timer doesn't keep the event loop alive
27
+ * during graceful shutdown.
28
+ */
29
+ export declare const killWithEscalation: (proc: ChildProcess) => void;
13
30
  /**
14
31
  * Configuration for the worker process.
15
32
  */
@@ -20,9 +37,11 @@ export interface WorkerProcessConfig {
20
37
  readonly capabilities: readonly string[];
21
38
  /** Heartbeat interval in seconds. Should match orchestrator config. */
22
39
  readonly heartbeatIntervalSeconds: number;
23
- /** How often to renew the lease (in seconds). Should be < lease duration. */
40
+ /** Lease duration in minutes. Should match orchestrator config. Defaults to 30. */
41
+ readonly leaseDurationMinutes?: number;
42
+ /** How often to renew the lease (in seconds). Should be < lease duration. Defaults to 1/3 of leaseDurationMinutes. */
24
43
  readonly leaseRenewalIntervalSeconds?: number;
25
- /** Working directory for Claude subprocess. Defaults to process.cwd() */
44
+ /** Working directory for agent subprocess. Defaults to process.cwd() */
26
45
  readonly workingDirectory?: string;
27
46
  }
28
47
  /**
@@ -37,5 +56,5 @@ export interface WorkerProcessConfig {
37
56
  * @param config Worker process configuration
38
57
  * @returns Effect that runs until shutdown is requested
39
58
  */
40
- export declare const runWorkerProcess: (config: WorkerProcessConfig) => Effect.Effect<void, import("../errors.js").TaskNotFoundError | import("../errors.js").ValidationError | import("../errors.js").DatabaseError | import("../errors.js").RegistrationError | import("../errors.js").WorkerNotFoundError, TaskService | ReadyService | WorkerService | ClaimService>;
59
+ export declare const runWorkerProcess: (config: WorkerProcessConfig) => Effect.Effect<void, import("../errors.js").DatabaseError | import("../errors.js").TaskNotFoundError | import("../errors.js").StaleDataError | import("../errors.js").ValidationError | import("../errors.js").RegistrationError | import("../errors.js").WorkerNotFoundError, TaskService | ReadyService | AttemptService | ClaimService | WorkerService>;
41
60
  //# sourceMappingURL=worker-process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-process.d.ts","sourceRoot":"","sources":["../../src/services/worker-process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAwB,MAAM,QAAQ,CAAA;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,uEAAuE;IACvE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAA;IACzC,6EAA6E;IAC7E,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAA;IAC7C,yEAAyE;IACzE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAmBD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,mBAAmB,qSAwLxD,CAAA"}
1
+ {"version":3,"file":"worker-process.d.ts","sourceRoot":"","sources":["../../src/services/worker-process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAkC,MAAM,QAAQ,CAAA;AAC/D,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,eAAe,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AASrD;;;GAGG;AACH,eAAO,MAAM,6BAA6B,OAAQ,CAAA;AAElD;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,YAAY,KAAG,IAoBvD,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,uEAAuE;IACvE,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAA;IACzC,mFAAmF;IACnF,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC,sHAAsH;IACtH,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,CAAA;IAC7C,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CACnC;AAoCD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,mBAAmB,8VAkPxD,CAAA"}