@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 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/schemas/worker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/schemas/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * AgentService — Effect wrapper around @anthropic-ai/claude-agent-sdk query()
3
+ *
4
+ * Provides a typed Effect interface for dispatching sub-agents with structured
5
+ * output schemas, tool permissions, and transcript streaming.
6
+ *
7
+ * Backends:
8
+ * - Live: Real Agent SDK calls via dynamic import
9
+ * - Noop: Returns empty results (tests, core commands)
10
+ */
11
+ import { Context, Effect, Layer } from "effect";
12
+ import { AgentError } from "../errors.js";
13
+ interface AgentSdkQueryOptions {
14
+ tools?: string[];
15
+ permissionMode?: string;
16
+ allowDangerouslySkipPermissions?: boolean;
17
+ model?: string;
18
+ maxTurns?: number;
19
+ persistSession?: boolean;
20
+ outputFormat?: {
21
+ type: "json_schema";
22
+ schema: unknown;
23
+ };
24
+ }
25
+ /** Configuration for a single agent run. */
26
+ export interface AgentRunConfig {
27
+ prompt: string;
28
+ options: AgentSdkQueryOptions;
29
+ }
30
+ /** Result from a completed agent run. */
31
+ export interface AgentResult {
32
+ /** Raw text result from the agent */
33
+ text: string;
34
+ /** Parsed structured output, if outputFormat was specified */
35
+ structuredOutput: unknown | null;
36
+ }
37
+ declare const AgentService_base: Context.TagClass<AgentService, "AgentService", {
38
+ /** Run a sub-agent with the given config and optional message callback. */
39
+ readonly run: (config: AgentRunConfig, onMessage?: (msg: unknown) => void) => Effect.Effect<AgentResult, AgentError>;
40
+ }>;
41
+ /**
42
+ * AgentService dispatches sub-agents via the Claude Agent SDK.
43
+ */
44
+ export declare class AgentService extends AgentService_base {
45
+ }
46
+ /**
47
+ * Live implementation using @anthropic-ai/claude-agent-sdk.
48
+ * Dynamic import — agent SDK is an optional peer dependency.
49
+ */
50
+ export declare const AgentServiceLive: Layer.Layer<AgentService, AgentError, never>;
51
+ /**
52
+ * Noop implementation — returns empty results for all agent runs.
53
+ * Used in test layers and core commands where no agent dispatch is needed.
54
+ */
55
+ export declare const AgentServiceNoop: Layer.Layer<AgentService, never, never>;
56
+ export {};
57
+ //# sourceMappingURL=agent-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-service.d.ts","sourceRoot":"","sources":["../../src/services/agent-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAazC,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,aAAa,CAAA;QACnB,MAAM,EAAE,OAAO,CAAA;KAChB,CAAA;CACF;AAED,4CAA4C;AAE5C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,oBAAoB,CAAA;CAC9B;AAED,yCAAyC;AAEzC,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,8DAA8D;IAC9D,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAA;CACjC;;IAQG,2EAA2E;kBAC7D,CACZ,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,KAC/B,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;;AAV/C;;GAEG;AACH,qBAAa,YAAa,SAAQ,iBAS/B;CAAG;AAEN;;;GAGG;AACH,eAAO,MAAM,gBAAgB,8CAgE5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,yCAG3B,CAAA"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * AgentService — Effect wrapper around @anthropic-ai/claude-agent-sdk query()
3
+ *
4
+ * Provides a typed Effect interface for dispatching sub-agents with structured
5
+ * output schemas, tool permissions, and transcript streaming.
6
+ *
7
+ * Backends:
8
+ * - Live: Real Agent SDK calls via dynamic import
9
+ * - Noop: Returns empty results (tests, core commands)
10
+ */
11
+ import { Context, Effect, Layer } from "effect";
12
+ import { AgentError } from "../errors.js";
13
+ /**
14
+ * AgentService dispatches sub-agents via the Claude Agent SDK.
15
+ */
16
+ export class AgentService extends Context.Tag("AgentService")() {
17
+ }
18
+ /**
19
+ * Live implementation using @anthropic-ai/claude-agent-sdk.
20
+ * Dynamic import — agent SDK is an optional peer dependency.
21
+ */
22
+ export const AgentServiceLive = Layer.effect(AgentService, Effect.gen(function* () {
23
+ // Dynamic import of Claude Agent SDK
24
+ const queryFn = yield* Effect.tryPromise({
25
+ try: async () => {
26
+ // @ts-ignore - @anthropic-ai/claude-agent-sdk is an optional peer dependency
27
+ const mod = await import("@anthropic-ai/claude-agent-sdk");
28
+ return mod.query;
29
+ },
30
+ catch: (e) => new AgentError({
31
+ agent: "agent-service",
32
+ reason: `@anthropic-ai/claude-agent-sdk not installed: ${e instanceof Error ? e.message : String(e)}`,
33
+ }),
34
+ });
35
+ return {
36
+ run: (config, onMessage) => Effect.tryPromise({
37
+ try: async () => {
38
+ let text = "";
39
+ let structuredOutput = null;
40
+ let errorMessage = null;
41
+ for await (const message of queryFn({
42
+ prompt: config.prompt,
43
+ options: config.options,
44
+ })) {
45
+ // Forward message to callback for transcript logging
46
+ if (onMessage) {
47
+ onMessage(message);
48
+ }
49
+ const msg = message;
50
+ if (msg.type === "result") {
51
+ if (msg.subtype === "success") {
52
+ text = msg.result ?? "";
53
+ structuredOutput = msg.structured_output ?? null;
54
+ }
55
+ else {
56
+ errorMessage =
57
+ msg.errors?.join(", ") ?? msg.subtype ?? "unknown error";
58
+ }
59
+ }
60
+ }
61
+ if (errorMessage) {
62
+ return Promise.reject(new Error(`Agent SDK error: ${errorMessage}`));
63
+ }
64
+ return { text, structuredOutput };
65
+ },
66
+ catch: (e) => new AgentError({
67
+ agent: "agent-service",
68
+ reason: `Agent SDK call failed: ${e instanceof Error ? e.message : String(e)}`,
69
+ cause: e,
70
+ }),
71
+ }),
72
+ };
73
+ }));
74
+ /**
75
+ * Noop implementation — returns empty results for all agent runs.
76
+ * Used in test layers and core commands where no agent dispatch is needed.
77
+ */
78
+ export const AgentServiceNoop = Layer.succeed(AgentService, {
79
+ run: (_config, _onMessage) => Effect.succeed({ text: "", structuredOutput: null }),
80
+ });
81
+ //# sourceMappingURL=agent-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-service.js","sourceRoot":"","sources":["../../src/services/agent-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"attempt-service.d.ts","sourceRoot":"","sources":["../../src/services/attempt-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEtG,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;;IAK7E,8DAA8D;qBAC7C,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,KACnB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,CAAC;IAEhF,2BAA2B;kBACb,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE7F,mCAAmC;0BACb,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,aAAa,CAAC;IAE1F,8BAA8B;qBACb,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE7F,8CAA8C;6BACrB,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEjF,qEAAqE;sCACnC,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC;;AAxBvH,qBAAa,cAAe,SAAQ,mBA0BjC;CAAG;AAEN,eAAO,MAAM,kBAAkB,wEA8D9B,CAAA"}
1
+ {"version":3,"file":"attempt-service.d.ts","sourceRoot":"","sources":["../../src/services/attempt-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEtG,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;;IAK7E,8DAA8D;qBAC7C,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,cAAc,EACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,KACnB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,eAAe,GAAG,aAAa,CAAC;IAEhF,2BAA2B;kBACb,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE7F,mCAAmC;0BACb,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,aAAa,CAAC;IAE1F,8BAA8B;qBACb,CAAC,EAAE,EAAE,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE7F,8CAA8C;6BACrB,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEjF,qEAAqE;sCACnC,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC;;AAxBvH,qBAAa,cAAe,SAAQ,mBA0BjC;CAAG;AAEN,eAAO,MAAM,kBAAkB,wEA6D9B,CAAA"}
@@ -45,10 +45,7 @@ export const AttemptServiceLive = Layer.effect(AttemptService, Effect.gen(functi
45
45
  }
46
46
  yield* attemptRepo.remove(id);
47
47
  }),
48
- getFailedCount: (taskId) => Effect.gen(function* () {
49
- const attempts = yield* attemptRepo.findByTaskId(taskId);
50
- return attempts.filter(a => a.outcome === "failed").length;
51
- }),
48
+ getFailedCount: (taskId) => attemptRepo.getFailedCountsForTasks([taskId]).pipe(Effect.map(counts => counts.get(taskId) ?? 0)),
52
49
  getFailedCountsForTasks: (taskIds) => attemptRepo.getFailedCountsForTasks(taskIds)
53
50
  };
54
51
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"attempt-service.js","sourceRoot":"","sources":["../../src/services/attempt-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attempt-service.js","sourceRoot":"","sources":["../../src/services/attempt-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAiB,MAAM,cAAc,CAAA;AACtG,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGtD,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EA0B9D;CAAG;AAEN,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAC5C,cAAc,EACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAA;IAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IAEtC,OAAO;QACL,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAC5C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,uBAAuB;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAClE,CAAC;YAED,iCAAiC;YACjC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAA;YACpF,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,oBAAoB,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;YAC3F,CAAC;YAED,OAAO,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;gBAC/B,MAAM;gBACN,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;gBACzB,OAAO;gBACP,MAAM,EAAE,MAAM,IAAI,IAAI;aACvB,CAAC,CAAA;QACJ,CAAC,CAAC;QAEJ,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CACV,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAC7D,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC,CAAC;QAEJ,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC;QAEzD,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CACb,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;YAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;YAC7D,CAAC;YACD,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC/B,CAAC,CAAC;QAEJ,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CACzB,WAAW,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAChD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAC9C;QAEH,uBAAuB,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,uBAAuB,CAAC,OAAO,CAAC;KACnF,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"auto-sync-service.d.ts","sourceRoot":"","sources":["../../src/services/auto-sync-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,gBAAgB,GAAG,UAAU,CAAA;;IAK9E;;;OAGG;gCACyB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAE5D;;;OAGG;oCAC6B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAEhE;;;OAGG;wCACiC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAEpE;;;OAGG;mCAC4B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAE/D;;;OAGG;+BACwB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;;AA/B/D,qBAAa,eAAgB,SAAQ,oBAiClC;CAAG;AAEN,eAAO,MAAM,mBAAmB,iEAgE/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,4CAS/B,CAAA"}
1
+ {"version":3,"file":"auto-sync-service.d.ts","sourceRoot":"","sources":["../../src/services/auto-sync-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAS,KAAK,EAAO,MAAM,QAAQ,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,gBAAgB,GAAG,UAAU,CAAA;;IAK9E;;;OAGG;gCACyB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAE5D;;;OAGG;oCAC6B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAEhE;;;OAGG;wCACiC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAEpE;;;OAGG;mCAC4B,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;IAE/D;;;OAGG;+BACwB,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;;AA/B/D,qBAAa,eAAgB,SAAQ,oBAiClC;CAAG;AAEN,eAAO,MAAM,mBAAmB,iEA2E/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,4CAS/B,CAAA"}
@@ -10,7 +10,7 @@
10
10
  * - Error-resilient: Export errors are logged but never propagate to caller
11
11
  * - Configurable: Controlled via sync_config "auto_sync" setting
12
12
  */
13
- import { Context, Effect, Layer } from "effect";
13
+ import { Context, Effect, Fiber, Layer, Ref } from "effect";
14
14
  import { SqliteClient } from "../db.js";
15
15
  import { SyncService } from "./sync-service.js";
16
16
  import { DatabaseError } from "../errors.js";
@@ -19,6 +19,10 @@ export class AutoSyncService extends Context.Tag("AutoSyncService")() {
19
19
  export const AutoSyncServiceLive = Layer.effect(AutoSyncService, Effect.gen(function* () {
20
20
  const db = yield* SqliteClient;
21
21
  const syncService = yield* SyncService;
22
+ // Track the current export fiber to prevent unbounded accumulation.
23
+ // When a new mutation triggers an export, any in-flight export is interrupted
24
+ // first — only the latest export needs to succeed since it captures all state.
25
+ const currentFiber = yield* Ref.make(null);
22
26
  // Check if auto-sync is enabled
23
27
  const isEnabled = () => Effect.try({
24
28
  try: () => {
@@ -27,28 +31,32 @@ export const AutoSyncServiceLive = Layer.effect(AutoSyncService, Effect.gen(func
27
31
  },
28
32
  catch: (cause) => new DatabaseError({ cause })
29
33
  });
30
- // Run export in background, catching and logging any errors
34
+ // Run export in background, interrupting any previous in-flight export
31
35
  const runInBackground = (exportEffect) => Effect.gen(function* () {
32
36
  const enabled = yield* isEnabled().pipe(Effect.catchAll(() => Effect.succeed(false)));
33
37
  if (!enabled) {
34
38
  return;
35
39
  }
36
- // Fork the export and ignore the fiber - fire and forget
37
- yield* Effect.fork(exportEffect.pipe(Effect.catchAll((error) => Effect.sync(() => {
40
+ // Fork the new export
41
+ const clearRef = Ref.set(currentFiber, null);
42
+ const fiber = yield* Effect.fork(exportEffect.pipe(Effect.catchAll((error) => Effect.sync(() => {
38
43
  // Log error but don't propagate
39
44
  console.error("[auto-sync] Export failed:", error);
40
- }))));
45
+ })), Effect.asVoid,
46
+ // Clear the fiber ref when this export completes or is interrupted
47
+ Effect.ensuring(clearRef)));
48
+ // Atomically swap the previous fiber with the new one, then interrupt the old one.
49
+ // Using Ref.getAndSet ensures no concurrent caller can read a stale fiber.
50
+ const prevFiber = yield* Ref.getAndSet(currentFiber, fiber);
51
+ if (prevFiber !== null) {
52
+ yield* Fiber.interrupt(prevFiber);
53
+ }
41
54
  });
42
55
  return {
43
- // Tasks use the standard export
44
56
  afterTaskMutation: () => runInBackground(syncService.export()),
45
- // TODO: Implement when learning sync is added to SyncService
46
57
  afterLearningMutation: () => runInBackground(syncService.export()),
47
- // TODO: Implement when file-learning sync is added to SyncService
48
58
  afterFileLearningMutation: () => runInBackground(syncService.export()),
49
- // TODO: Implement when attempt sync is added to SyncService
50
59
  afterAttemptMutation: () => runInBackground(syncService.export()),
51
- // For now, just exports tasks - extend when other entity types are supported
52
60
  afterAnyMutation: () => runInBackground(syncService.export())
53
61
  };
54
62
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"auto-sync-service.js","sourceRoot":"","sources":["../../src/services/auto-sync-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-sync-service.js","sourceRoot":"","sources":["../../src/services/auto-sync-service.ts"],"names":[],"mappings":"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"}
@@ -20,12 +20,12 @@ declare const ClaimService_base: Context.TagClass<ClaimService, "ClaimService",
20
20
  * Release a claim on a task.
21
21
  * Only the worker who holds the claim can release it.
22
22
  */
23
- readonly release: (taskId: string, workerId: string) => Effect.Effect<void, ClaimNotFoundError | DatabaseError>;
23
+ readonly release: (taskId: string, workerId: string) => Effect.Effect<void, ClaimNotFoundError | ClaimIdNotFoundError | DatabaseError>;
24
24
  /**
25
25
  * Renew the lease on an existing claim.
26
26
  * Fails if the claim is expired or max renewals exceeded.
27
27
  */
28
- readonly renew: (taskId: string, workerId: string) => Effect.Effect<TaskClaim, ClaimNotFoundError | LeaseExpiredError | MaxRenewalsExceededError | DatabaseError>;
28
+ readonly renew: (taskId: string, workerId: string) => Effect.Effect<TaskClaim, ClaimNotFoundError | ClaimIdNotFoundError | LeaseExpiredError | MaxRenewalsExceededError | DatabaseError>;
29
29
  /**
30
30
  * Get all claims that have expired but are still marked as active.
31
31
  */
@@ -44,6 +44,12 @@ declare const ClaimService_base: Context.TagClass<ClaimService, "ClaimService",
44
44
  * Get the active claim for a task, if any.
45
45
  */
46
46
  readonly getActiveClaim: (taskId: string) => Effect.Effect<TaskClaim | null, DatabaseError>;
47
+ /**
48
+ * Get active claims on tasks that are not in 'active' status.
49
+ * These are orphaned claims left behind when claim release fails
50
+ * after task completion.
51
+ */
52
+ readonly getOrphanedClaims: () => Effect.Effect<readonly TaskClaim[], DatabaseError>;
47
53
  }>;
48
54
  export declare class ClaimService extends ClaimService_base {
49
55
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claim-service.d.ts","sourceRoot":"","sources":["../../src/services/claim-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AAChF,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;;IAWjD;;;OAGG;oBACa,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,oBAAoB,CAAC,EAAE,MAAM,KAC1B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,aAAa,CAAC;IAEtF;;;OAGG;sBACe,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,aAAa,CAAC;IAE5D;;;OAGG;oBACa,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,wBAAwB,GAAG,aAAa,CAAC;IAEhH;;OAEG;yBACkB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,SAAS,EAAE,EAAE,aAAa,CAAC;IAE7E;;;OAGG;qBACc,CACf,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE9D;;;OAGG;8BACuB,CACxB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEzC;;OAEG;6BACsB,CACvB,MAAM,EAAE,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,aAAa,CAAC;;AAzDvD,qBAAa,YAAa,SAAQ,iBA2D/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,kGA6J5B,CAAA"}
1
+ {"version":3,"file":"claim-service.d.ts","sourceRoot":"","sources":["../../src/services/claim-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AAChF,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;;IAWjD;;;OAGG;oBACa,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,oBAAoB,CAAC,EAAE,MAAM,KAC1B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,aAAa,CAAC;IAEtF;;;OAGG;sBACe,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,aAAa,CAAC;IAEnF;;;OAGG;oBACa,CACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,iBAAiB,GAAG,wBAAwB,GAAG,aAAa,CAAC;IAEvI;;OAEG;yBACkB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,SAAS,EAAE,EAAE,aAAa,CAAC;IAE7E;;;OAGG;qBACc,CACf,OAAO,EAAE,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAAC;IAE9D;;;OAGG;8BACuB,CACxB,QAAQ,EAAE,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEzC;;OAEG;6BACsB,CACvB,MAAM,EAAE,MAAM,KACX,MAAM,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,aAAa,CAAC;IAEnD;;;;OAIG;gCACyB,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,SAAS,EAAE,EAAE,aAAa,CAAC;;AAhExF,qBAAa,YAAa,SAAQ,iBAkE/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,kGA8K5B,CAAA"}
@@ -27,12 +27,12 @@ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function*
27
27
  if (!task) {
28
28
  return yield* Effect.fail(new TaskNotFoundError({ id: taskId }));
29
29
  }
30
- // Check if task is already claimed
31
- const existingClaim = yield* claimRepo.findActiveByTaskId(taskId);
32
- if (existingClaim) {
30
+ // Verify task is in a claimable status (not terminal)
31
+ const TERMINAL_STATUSES = ["done", "review", "human_needs_to_review"];
32
+ if (TERMINAL_STATUSES.some(s => s === task.status)) {
33
33
  return yield* Effect.fail(new AlreadyClaimedError({
34
34
  taskId,
35
- claimedByWorkerId: existingClaim.workerId
35
+ claimedByWorkerId: `task in terminal status '${task.status}'`
36
36
  }));
37
37
  }
38
38
  // Get lease duration from config or use provided/default
@@ -40,7 +40,9 @@ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function*
40
40
  const duration = leaseDurationMinutes ?? state.leaseDurationMinutes;
41
41
  const now = new Date();
42
42
  const leaseExpiresAt = new Date(now.getTime() + duration * 60 * 1000);
43
- const claim = yield* claimRepo.insert({
43
+ // Use atomic insert to prevent race condition
44
+ // This single SQL operation checks for existing claims AND inserts atomically
45
+ const result = yield* claimRepo.tryInsertAtomic({
44
46
  taskId,
45
47
  workerId,
46
48
  claimedAt: now,
@@ -48,8 +50,15 @@ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function*
48
50
  renewedCount: 0,
49
51
  status: "active"
50
52
  });
53
+ if (!result.success) {
54
+ // Another worker already has an active claim
55
+ return yield* Effect.fail(new AlreadyClaimedError({
56
+ taskId,
57
+ claimedByWorkerId: result.existingClaim?.workerId ?? "unknown"
58
+ }));
59
+ }
51
60
  yield* Effect.log(`Task ${taskId} claimed by worker ${workerId}, expires at ${leaseExpiresAt.toISOString()}`);
52
- return claim;
61
+ return result.claim;
53
62
  }),
54
63
  release: (taskId, workerId) => Effect.gen(function* () {
55
64
  const claim = yield* claimRepo.findActiveByTaskId(taskId);
@@ -68,6 +77,7 @@ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function*
68
77
  yield* Effect.log(`Task ${taskId} claim released by worker ${workerId}`);
69
78
  }),
70
79
  renew: (taskId, workerId) => Effect.gen(function* () {
80
+ // First fetch the claim to check ownership and max renewals
71
81
  const claim = yield* claimRepo.findActiveByTaskId(taskId);
72
82
  if (!claim) {
73
83
  return yield* Effect.fail(new ClaimNotFoundError({ taskId, workerId }));
@@ -76,15 +86,7 @@ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function*
76
86
  if (claim.workerId !== workerId) {
77
87
  return yield* Effect.fail(new ClaimNotFoundError({ taskId, workerId }));
78
88
  }
79
- // Check if claim has already expired
80
- const now = new Date();
81
- if (claim.leaseExpiresAt < now) {
82
- return yield* Effect.fail(new LeaseExpiredError({
83
- taskId,
84
- expiredAt: claim.leaseExpiresAt.toISOString()
85
- }));
86
- }
87
- // Check max renewals
89
+ // Check max renewals before attempting atomic renewal
88
90
  if (claim.renewedCount >= DEFAULT_MAX_RENEWALS) {
89
91
  return yield* Effect.fail(new MaxRenewalsExceededError({
90
92
  taskId,
@@ -94,15 +96,24 @@ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function*
94
96
  }
95
97
  // Get lease duration from config
96
98
  const state = yield* orchestratorRepo.get();
99
+ const now = new Date();
97
100
  const newLeaseExpiresAt = new Date(now.getTime() + state.leaseDurationMinutes * 60 * 1000);
98
- const updatedClaim = {
99
- ...claim,
100
- leaseExpiresAt: newLeaseExpiresAt,
101
- renewedCount: claim.renewedCount + 1
102
- };
103
- yield* claimRepo.update(updatedClaim);
104
- yield* Effect.log(`Task ${taskId} lease renewed (${updatedClaim.renewedCount}/${DEFAULT_MAX_RENEWALS}), new expiry: ${newLeaseExpiresAt.toISOString()}`);
105
- return updatedClaim;
101
+ // Use atomic renewal to prevent race condition between expiration check and update
102
+ // The renewal only succeeds if the lease hasn't expired at the moment of update
103
+ const result = yield* claimRepo.tryRenewAtomic(claim.id, workerId, newLeaseExpiresAt);
104
+ if (!result.success) {
105
+ if (result.failureReason === "expired") {
106
+ // The lease expired between our initial check and the atomic renewal attempt
107
+ return yield* Effect.fail(new LeaseExpiredError({
108
+ taskId,
109
+ expiredAt: claim.leaseExpiresAt.toISOString()
110
+ }));
111
+ }
112
+ // not_found - claim was released or expired by another process
113
+ return yield* Effect.fail(new ClaimNotFoundError({ taskId, workerId }));
114
+ }
115
+ yield* Effect.log(`Task ${taskId} lease renewed (${result.claim.renewedCount}/${DEFAULT_MAX_RENEWALS}), new expiry: ${newLeaseExpiresAt.toISOString()}`);
116
+ return result.claim;
106
117
  }),
107
118
  getExpired: () => Effect.gen(function* () {
108
119
  const now = new Date();
@@ -128,6 +139,9 @@ export const ClaimServiceLive = Layer.effect(ClaimService, Effect.gen(function*
128
139
  }),
129
140
  getActiveClaim: (taskId) => Effect.gen(function* () {
130
141
  return yield* claimRepo.findActiveByTaskId(taskId);
142
+ }),
143
+ getOrphanedClaims: () => Effect.gen(function* () {
144
+ return yield* claimRepo.findOrphanedClaims();
131
145
  })
132
146
  };
133
147
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"claim-service.js","sourceRoot":"","sources":["../../src/services/claim-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claim-service.js","sourceRoot":"","sources":["../../src/services/claim-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAA;AAChF,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAElB,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,cAAc,CAAA;AAGrB;;;GAGG;AACH,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAE/B,MAAM,OAAO,YAAa,SAAQ,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAkE1D;CAAG;AAEN,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAC1C,YAAY,EACZ,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,cAAc,CAAA;IACtC,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,2BAA2B,CAAA;IAE3D,OAAO;QACL,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,qBAAqB;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;YAClE,CAAC;YAED,sDAAsD;YACtD,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,uBAAuB,CAAU,CAAA;YAC9E,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC;oBAChD,MAAM;oBACN,iBAAiB,EAAE,4BAA4B,IAAI,CAAC,MAAM,GAAG;iBAC9D,CAAC,CAAC,CAAA;YACL,CAAC;YAED,yDAAyD;YACzD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA;YAC3C,MAAM,QAAQ,GAAG,oBAAoB,IAAI,KAAK,CAAC,oBAAoB,CAAA;YAEnE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;YAErE,8CAA8C;YAC9C,8EAA8E;YAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC;gBAC9C,MAAM;gBACN,QAAQ;gBACR,SAAS,EAAE,GAAG;gBACd,cAAc;gBACd,YAAY,EAAE,CAAC;gBACf,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAA;YAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,6CAA6C;gBAC7C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,mBAAmB,CAAC;oBACtB,MAAM;oBACN,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,QAAQ,IAAI,SAAS;iBAC/D,CAAC,CACH,CAAA;YACH,CAAC;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,sBAAsB,QAAQ,gBAAgB,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;YAE7G,OAAO,MAAM,CAAC,KAAM,CAAA;QACtB,CAAC,CAAC;QAEJ,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACzD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,oCAAoC;YACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,kCAAkC;YAClC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBACtB,GAAG,KAAK;gBACR,MAAM,EAAE,UAAU;aACnB,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,6BAA6B,QAAQ,EAAE,CAAC,CAAA;QAC1E,CAAC,CAAC;QAEJ,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,4DAA4D;YAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;YACzD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,oCAAoC;YACpC,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,sDAAsD;YACtD,IAAI,KAAK,CAAC,YAAY,IAAI,oBAAoB,EAAE,CAAC;gBAC/C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,wBAAwB,CAAC;oBAC3B,MAAM;oBACN,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,WAAW,EAAE,oBAAoB;iBAClC,CAAC,CACH,CAAA;YACH,CAAC;YAED,iCAAiC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAA;YAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAChC,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,oBAAoB,GAAG,EAAE,GAAG,IAAI,CACvD,CAAA;YAED,mFAAmF;YACnF,gFAAgF;YAChF,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAA;YAErF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;oBACvC,6EAA6E;oBAC7E,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,IAAI,iBAAiB,CAAC;wBACpB,MAAM;wBACN,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE;qBAC9C,CAAC,CACH,CAAA;gBACH,CAAC;gBACD,+DAA+D;gBAC/D,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;YAED,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,mBAAmB,MAAM,CAAC,KAAM,CAAC,YAAY,IAAI,oBAAoB,kBAAkB,iBAAiB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;YAEzJ,OAAO,MAAM,CAAC,KAAM,CAAA;QACtB,CAAC,CAAC;QAEJ,UAAU,EAAE,GAAG,EAAE,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAC1C,CAAC,CAAC;QAEJ,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAChD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;YAClE,CAAC;YAED,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC;gBACtB,GAAG,KAAK;gBACR,MAAM,EAAE,SAAS;aAClB,CAAC,CAAA;YAEF,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,OAAO,aAAa,KAAK,CAAC,MAAM,oBAAoB,CAAC,CAAA;QAClF,CAAC,CAAC;QAEJ,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;YAC7D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,KAAK,sBAAsB,QAAQ,EAAE,CAAC,CAAA;YACtE,CAAC;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC;QAEJ,cAAc,EAAE,CAAC,MAAM,EAAE,EAAE,CACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC,CAAC;QAEJ,iBAAiB,EAAE,GAAG,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,OAAO,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAA;QAC9C,CAAC,CAAC;KACL,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * CycleScanService — Cycle-Based Issue Discovery
3
+ *
4
+ * Orchestrates sub-agent swarms via AgentService to scan for codebase issues,
5
+ * deduplicates findings against known issues using an LLM-as-judge, and
6
+ * optionally fixes them. Repeats in rounds within each cycle until convergence.
7
+ *
8
+ * Replaces scripts/cycle-scan.ts with proper Effect service patterns.
9
+ */
10
+ import { Context, Effect, Layer } from "effect";
11
+ import type { Finding, CycleConfig, CycleResult, CycleProgressEvent } from "@jamesaphoenix/tx-types";
12
+ import { CycleScanError } from "../errors.js";
13
+ import { AgentService } from "./agent-service.js";
14
+ import { SqliteClient } from "../db.js";
15
+ declare const CycleScanService_base: Context.TagClass<CycleScanService, "CycleScanService", {
16
+ /** Run one or more scan cycles with the given configuration. */
17
+ readonly runCycles: (config: CycleConfig, onProgress?: (event: CycleProgressEvent) => void) => Effect.Effect<CycleResult[], CycleScanError>;
18
+ /** Compute loss from a set of findings using weighted severity formula. */
19
+ readonly computeLoss: (findings: readonly Finding[]) => number;
20
+ }>;
21
+ /**
22
+ * CycleScanService orchestrates cycle-based issue discovery.
23
+ */
24
+ export declare class CycleScanService extends CycleScanService_base {
25
+ }
26
+ /**
27
+ * Live implementation of CycleScanService.
28
+ * Depends on AgentService for sub-agent dispatch and SqliteClient for DB ops.
29
+ */
30
+ export declare const CycleScanServiceLive: Layer.Layer<CycleScanService, never, SqliteClient | AgentService>;
31
+ export {};
32
+ //# sourceMappingURL=cycle-scan-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cycle-scan-service.d.ts","sourceRoot":"","sources":["../../src/services/cycle-scan-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAM/C,OAAO,KAAK,EACV,OAAO,EAEP,WAAW,EACX,WAAW,EACX,kBAAkB,EACnB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAuB,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;;IAiMnC,gEAAgE;wBAC5C,CAClB,MAAM,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,KAC7C,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC;IAEjD,2EAA2E;0BACrD,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,KAAK,MAAM;;AAblE;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,qBAYnC;CAAG;AAEN;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mEAmchC,CAAA"}