@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,4 +1,5 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
+ import { LlmService } from "./llm-service.js";
2
3
  declare const QueryExpansionUnavailableError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
3
4
  readonly _tag: "QueryExpansionUnavailableError";
4
5
  } & Readonly<A>;
@@ -13,6 +14,14 @@ export declare class QueryExpansionUnavailableError extends QueryExpansionUnavai
13
14
  /**
14
15
  * Result of query expansion.
15
16
  */
17
+ export declare const QueryExpansionResultSchema: {
18
+ /** Original query */
19
+ original: string;
20
+ /** Expanded queries (includes original plus alternatives) */
21
+ expanded: readonly string[];
22
+ /** Whether expansion was performed (false if using noop) */
23
+ wasExpanded: boolean;
24
+ };
16
25
  export interface QueryExpansionResult {
17
26
  /** Original query */
18
27
  readonly original: string;
@@ -21,6 +30,10 @@ export interface QueryExpansionResult {
21
30
  /** Whether expansion was performed (false if using noop) */
22
31
  readonly wasExpanded: boolean;
23
32
  }
33
+ /** Maximum number of expanded queries (excluding original) to prevent unbounded generation */
34
+ export declare const MAX_EXPANSION_QUERIES = 5;
35
+ /** Maximum character length for any single expanded query */
36
+ export declare const MAX_QUERY_LENGTH = 200;
24
37
  declare const QueryExpansionService_base: Context.TagClass<QueryExpansionService, "QueryExpansionService", {
25
38
  /** Expand a search query into multiple alternative phrasings */
26
39
  readonly expand: (query: string) => Effect.Effect<QueryExpansionResult, QueryExpansionUnavailableError>;
@@ -31,25 +44,33 @@ declare const QueryExpansionService_base: Context.TagClass<QueryExpansionService
31
44
  * QueryExpansionService uses an LLM to generate alternative phrasings of search queries.
32
45
  * This improves recall by searching for semantically equivalent but differently worded queries.
33
46
  *
34
- * Design: Following DD-006 patterns for LLM integration.
35
- * The service gracefully degrades when ANTHROPIC_API_KEY is not set.
47
+ * Design: Following DD-006 patterns for LLM integration, DD-022 for centralized LLM service.
48
+ * The service gracefully degrades when no LLM backend is available.
36
49
  */
37
50
  export declare class QueryExpansionService extends QueryExpansionService_base {
38
51
  }
52
+ /**
53
+ * Validate and limit expanded query alternatives.
54
+ * Filters out empty, overly long, duplicate, and non-string entries,
55
+ * then caps the total number of expansions.
56
+ *
57
+ * @returns Array with original query first, followed by up to MAX_EXPANSION_QUERIES alternatives
58
+ */
59
+ export declare const validateExpansions: (query: string, alternatives: unknown[]) => string[];
39
60
  /**
40
61
  * Noop implementation - returns original query only.
41
- * Used when ANTHROPIC_API_KEY is not set or LLM features are disabled.
62
+ * Used when no LLM backend is available or LLM features are disabled.
42
63
  */
43
64
  export declare const QueryExpansionServiceNoop: Layer.Layer<QueryExpansionService, never, never>;
44
65
  /**
45
- * Live implementation using Anthropic Claude API.
46
- * Lazy-loads the SDK and caches the client.
66
+ * Live implementation using centralized LlmService (DD-022).
67
+ * Delegates all LLM calls to LlmService instead of calling Anthropic SDK directly.
47
68
  */
48
- export declare const QueryExpansionServiceLive: Layer.Layer<QueryExpansionService, QueryExpansionUnavailableError, never>;
69
+ export declare const QueryExpansionServiceLive: Layer.Layer<QueryExpansionService, never, LlmService>;
49
70
  /**
50
- * Auto-detecting layer that uses Live if ANTHROPIC_API_KEY is set, Noop otherwise.
51
- * This allows graceful degradation when the API key is not configured.
71
+ * Auto-detecting layer that uses Live if LlmService is available, Noop otherwise.
72
+ * This allows graceful degradation when no LLM backend is configured.
52
73
  */
53
- export declare const QueryExpansionServiceAuto: Layer.Layer<QueryExpansionService, QueryExpansionUnavailableError, never>;
74
+ export declare const QueryExpansionServiceAuto: Layer.Layer<QueryExpansionService, never, LlmService>;
54
75
  export {};
55
76
  //# sourceMappingURL=query-expansion-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-expansion-service.d.ts","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAkB,MAAM,QAAQ,CAAA;;;;AAG/D;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,oCAAmD;IACrG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,CAAC;IACA,IAAI,OAAO,WAEV;CACF;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,qBAAqB;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B;;IA2BG,gEAAgE;qBAC/C,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;IACvG,4CAA4C;0BACtB,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;AAbtD;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,0BAQxC;CAAG;AAyDN;;;GAGG;AACH,eAAO,MAAM,yBAAyB,kDAUrC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,2EAmFrC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,2EAUrC,CAAA"}
1
+ {"version":3,"file":"query-expansion-service.d.ts","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;;;;AAE7C;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,oCAAmD;IACrG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB,CAAC;IACA,IAAI,OAAO,WAEV;CACF;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B;IACrC,qBAAqB;cACL,MAAM;IACtB,6DAA6D;cAC7C,SAAS,MAAM,EAAE;IACjC,4DAA4D;iBACtC,OAAO;CAC9B,CAAA;AAGD,MAAM,WAAW,oBAAoB;IACnC,qBAAqB;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B;AAED,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB,IAAI,CAAA;AAEtC,6DAA6D;AAC7D,eAAO,MAAM,gBAAgB,MAAM,CAAA;;IAY/B,gEAAgE;qBAC/C,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,8BAA8B,CAAC;IACvG,4CAA4C;0BACtB,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;AAbtD;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,0BAQxC;CAAG;AAyDN;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,MAAM,EACb,cAAc,OAAO,EAAE,KACtB,MAAM,EAYR,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,kDAUrC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,uDAwCrC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,yBAAyB,uDAMrC,CAAA"}
@@ -1,5 +1,6 @@
1
- import { Context, Effect, Layer, Config, Option } from "effect";
1
+ import { Context, Effect, Layer } from "effect";
2
2
  import { Data } from "effect";
3
+ import { LlmService } from "./llm-service.js";
3
4
  /**
4
5
  * Error indicating query expansion is unavailable.
5
6
  */
@@ -8,12 +9,27 @@ export class QueryExpansionUnavailableError extends Data.TaggedError("QueryExpan
8
9
  return `Query expansion unavailable: ${this.reason}`;
9
10
  }
10
11
  }
12
+ /**
13
+ * Result of query expansion.
14
+ */
15
+ export const QueryExpansionResultSchema = {
16
+ /** Original query */
17
+ original: "",
18
+ /** Expanded queries (includes original plus alternatives) */
19
+ expanded: [],
20
+ /** Whether expansion was performed (false if using noop) */
21
+ wasExpanded: false
22
+ };
23
+ /** Maximum number of expanded queries (excluding original) to prevent unbounded generation */
24
+ export const MAX_EXPANSION_QUERIES = 5;
25
+ /** Maximum character length for any single expanded query */
26
+ export const MAX_QUERY_LENGTH = 200;
11
27
  /**
12
28
  * QueryExpansionService uses an LLM to generate alternative phrasings of search queries.
13
29
  * This improves recall by searching for semantically equivalent but differently worded queries.
14
30
  *
15
- * Design: Following DD-006 patterns for LLM integration.
16
- * The service gracefully degrades when ANTHROPIC_API_KEY is not set.
31
+ * Design: Following DD-006 patterns for LLM integration, DD-022 for centralized LLM service.
32
+ * The service gracefully degrades when no LLM backend is available.
17
33
  */
18
34
  export class QueryExpansionService extends Context.Tag("QueryExpansionService")() {
19
35
  }
@@ -78,9 +94,26 @@ const parseLlmJson = (raw) => {
78
94
  }
79
95
  return null;
80
96
  };
97
+ /**
98
+ * Validate and limit expanded query alternatives.
99
+ * Filters out empty, overly long, duplicate, and non-string entries,
100
+ * then caps the total number of expansions.
101
+ *
102
+ * @returns Array with original query first, followed by up to MAX_EXPANSION_QUERIES alternatives
103
+ */
104
+ export const validateExpansions = (query, alternatives) => {
105
+ const uniqueAlternatives = [...new Set(alternatives
106
+ .filter((alt) => typeof alt === "string" && alt.trim().length > 0)
107
+ .map(alt => alt.trim())
108
+ .filter(alt => alt.length <= MAX_QUERY_LENGTH))];
109
+ return [query, ...uniqueAlternatives
110
+ .filter(alt => alt.toLowerCase() !== query.toLowerCase())
111
+ .slice(0, MAX_EXPANSION_QUERIES)
112
+ ];
113
+ };
81
114
  /**
82
115
  * Noop implementation - returns original query only.
83
- * Used when ANTHROPIC_API_KEY is not set or LLM features are disabled.
116
+ * Used when no LLM backend is available or LLM features are disabled.
84
117
  */
85
118
  export const QueryExpansionServiceNoop = Layer.succeed(QueryExpansionService, {
86
119
  expand: (query) => Effect.succeed({
@@ -91,84 +124,42 @@ export const QueryExpansionServiceNoop = Layer.succeed(QueryExpansionService, {
91
124
  isAvailable: () => Effect.succeed(false)
92
125
  });
93
126
  /**
94
- * Live implementation using Anthropic Claude API.
95
- * Lazy-loads the SDK and caches the client.
127
+ * Live implementation using centralized LlmService (DD-022).
128
+ * Delegates all LLM calls to LlmService instead of calling Anthropic SDK directly.
96
129
  */
97
130
  export const QueryExpansionServiceLive = Layer.effect(QueryExpansionService, Effect.gen(function* () {
98
- // Read API key from environment
99
- const apiKey = yield* Config.string("ANTHROPIC_API_KEY").pipe(Effect.mapError(() => new QueryExpansionUnavailableError({
100
- reason: "ANTHROPIC_API_KEY environment variable is not set"
101
- })));
102
- // Lazy-load client
103
- let client = null;
104
- const ensureClient = Effect.gen(function* () {
105
- if (client)
106
- return client;
107
- // Dynamic import of Anthropic SDK (optional peer dependency)
108
- const Anthropic = yield* Effect.tryPromise({
109
- try: async () => {
110
- // @ts-expect-error - @anthropic-ai/sdk is an optional peer dependency
111
- const mod = await import("@anthropic-ai/sdk");
112
- return mod.default;
113
- },
114
- catch: () => new QueryExpansionUnavailableError({
115
- reason: "@anthropic-ai/sdk is not installed"
116
- })
117
- });
118
- client = new Anthropic({ apiKey });
119
- return client;
120
- });
131
+ const llm = yield* LlmService;
121
132
  return {
122
133
  expand: (query) => Effect.gen(function* () {
123
- const anthropic = yield* ensureClient;
124
- const response = yield* Effect.tryPromise({
125
- try: () => anthropic.messages.create({
126
- model: "claude-haiku-4-20250514",
127
- max_tokens: 256,
128
- messages: [{
129
- role: "user",
130
- content: EXPANSION_PROMPT + JSON.stringify(query)
131
- }]
132
- }),
133
- catch: (e) => new QueryExpansionUnavailableError({
134
- reason: `API call failed: ${String(e)}`
135
- })
136
- });
137
- // Extract text from response
138
- const textContent = response.content.find(c => c.type === "text");
139
- if (!textContent || !textContent.text) {
134
+ const text = yield* llm.complete(EXPANSION_PROMPT + JSON.stringify(query), { model: "claude-haiku-4-5-20251001", maxTokens: 256 }).pipe(Effect.mapError((e) => new QueryExpansionUnavailableError({
135
+ reason: e.reason
136
+ })));
137
+ if (!text) {
140
138
  return { original: query, expanded: [query], wasExpanded: false };
141
139
  }
142
140
  // Parse the JSON array of expanded queries
143
- const alternatives = parseLlmJson(textContent.text);
141
+ const alternatives = parseLlmJson(text);
144
142
  if (!alternatives || !Array.isArray(alternatives)) {
145
143
  return { original: query, expanded: [query], wasExpanded: false };
146
144
  }
147
- // Filter out empty strings and duplicates
148
- const uniqueAlternatives = [...new Set(alternatives
149
- .filter((alt) => typeof alt === "string" && alt.trim().length > 0)
150
- .map(alt => alt.trim()))];
151
- // Always include original query first
152
- const expanded = [query, ...uniqueAlternatives.filter(alt => alt.toLowerCase() !== query.toLowerCase())];
145
+ // Validate and limit expansion results
146
+ const expanded = validateExpansions(query, alternatives);
153
147
  return {
154
148
  original: query,
155
149
  expanded,
156
- wasExpanded: true
150
+ wasExpanded: expanded.length > 1
157
151
  };
158
152
  }),
159
- isAvailable: () => Effect.succeed(true)
153
+ isAvailable: () => llm.isAvailable()
160
154
  };
161
155
  }));
162
156
  /**
163
- * Auto-detecting layer that uses Live if ANTHROPIC_API_KEY is set, Noop otherwise.
164
- * This allows graceful degradation when the API key is not configured.
157
+ * Auto-detecting layer that uses Live if LlmService is available, Noop otherwise.
158
+ * This allows graceful degradation when no LLM backend is configured.
165
159
  */
166
160
  export const QueryExpansionServiceAuto = Layer.unwrapEffect(Effect.gen(function* () {
167
- // Check if API key is available
168
- const apiKey = yield* Config.string("ANTHROPIC_API_KEY").pipe(Effect.option);
169
- if (Option.isSome(apiKey) && apiKey.value.trim().length > 0) {
170
- return QueryExpansionServiceLive;
171
- }
172
- return QueryExpansionServiceNoop;
161
+ const llm = yield* LlmService;
162
+ const available = yield* llm.isAvailable();
163
+ return available ? QueryExpansionServiceLive : QueryExpansionServiceNoop;
173
164
  }));
174
165
  //# sourceMappingURL=query-expansion-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-expansion-service.js","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-expansion-service.js","sourceRoot":"","sources":["../../src/services/query-expansion-service.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,29 @@ import { TaskRepository } from "../repo/task-repo.js";
3
3
  import { DependencyRepository } from "../repo/dep-repo.js";
4
4
  import { DatabaseError } from "../errors.js";
5
5
  import type { Task, TaskId, TaskWithDeps } from "@jamesaphoenix/tx-types";
6
+ /**
7
+ * Result of checking whether a task is ready to be worked on.
8
+ * Replaces silent `false` with an explicit reason for not-ready states.
9
+ */
10
+ export type ReadyCheckResult = {
11
+ readonly _tag: "Ready";
12
+ } | {
13
+ readonly _tag: "TaskNotFound";
14
+ readonly id: TaskId;
15
+ } | {
16
+ readonly _tag: "WrongStatus";
17
+ readonly id: TaskId;
18
+ readonly status: string;
19
+ } | {
20
+ readonly _tag: "Blocked";
21
+ readonly id: TaskId;
22
+ readonly pendingBlockerIds: readonly string[];
23
+ };
24
+ /** Helper to check if a ReadyCheckResult indicates the task is ready. */
25
+ export declare const isReadyResult: (result: ReadyCheckResult) => boolean;
6
26
  declare const ReadyService_base: Context.TagClass<ReadyService, "ReadyService", {
7
27
  readonly getReady: (limit?: number) => Effect.Effect<readonly TaskWithDeps[], DatabaseError>;
8
- readonly isReady: (id: TaskId) => Effect.Effect<boolean, DatabaseError>;
28
+ readonly isReady: (id: TaskId) => Effect.Effect<ReadyCheckResult, DatabaseError>;
9
29
  readonly getBlockers: (id: TaskId) => Effect.Effect<readonly Task[], DatabaseError>;
10
30
  readonly getBlocking: (id: TaskId) => Effect.Effect<readonly Task[], DatabaseError>;
11
31
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"ready-service.d.ts","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;;uBAKlD,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;sBAC1E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;0BACjD,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;0BAC7D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;;AANvF,qBAAa,YAAa,SAAQ,iBAQ/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,yEA2E5B,CAAA"}
1
+ {"version":3,"file":"ready-service.d.ts","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEzE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAA;AAEpG,yEAAyE;AACzE,eAAO,MAAM,aAAa,GAAI,QAAQ,gBAAgB,KAAG,OAAkC,CAAA;;uBAKpE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;sBAC1E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC;0BAC1D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;0BAC7D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;;AANvF,qBAAa,YAAa,SAAQ,iBAQ/B;CAAG;AAEN,eAAO,MAAM,gBAAgB,yEAqG5B,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
2
  import { TaskRepository } from "../repo/task-repo.js";
3
3
  import { DependencyRepository } from "../repo/dep-repo.js";
4
+ /** Helper to check if a ReadyCheckResult indicates the task is ready. */
5
+ export const isReadyResult = (result) => result._tag === "Ready";
4
6
  export class ReadyService extends Context.Tag("ReadyService")() {
5
7
  }
6
8
  export const ReadyServiceLive = Layer.effect(ReadyService, Effect.gen(function* () {
@@ -8,26 +10,41 @@ export const ReadyServiceLive = Layer.effect(ReadyService, Effect.gen(function*
8
10
  const depRepo = yield* DependencyRepository;
9
11
  return {
10
12
  getReady: (limit = 100) => Effect.gen(function* () {
13
+ // 1. Single query: get all candidate tasks (excluding actively claimed)
14
+ // The excludeClaimed filter prevents the thundering herd problem where
15
+ // multiple workers all see the same tasks and race to claim them.
11
16
  const candidates = yield* taskRepo.findAll({
12
- status: ["backlog", "ready", "planning"]
17
+ status: ["backlog", "ready", "planning"],
18
+ excludeClaimed: true
13
19
  });
20
+ if (candidates.length === 0) {
21
+ return [];
22
+ }
23
+ const candidateIds = candidates.map(t => t.id);
24
+ // 2-4. Batch queries: get all dependency info in 3 queries instead of 3*N
25
+ const blockerIdsMap = yield* depRepo.getBlockerIdsForMany(candidateIds);
26
+ const blockingIdsMap = yield* depRepo.getBlockingIdsForMany(candidateIds);
27
+ const childIdsMap = yield* taskRepo.getChildIdsForMany(candidateIds);
28
+ // 5. Single query: get all unique blocker tasks to check their status
29
+ const allBlockerIds = new Set();
30
+ for (const blockerIds of blockerIdsMap.values()) {
31
+ for (const id of blockerIds) {
32
+ allBlockerIds.add(id);
33
+ }
34
+ }
35
+ const blockerTasks = allBlockerIds.size > 0
36
+ ? yield* taskRepo.findByIds([...allBlockerIds])
37
+ : [];
38
+ const blockerStatusMap = new Map(blockerTasks.map(t => [t.id, t.status]));
39
+ // Process in memory (no more queries)
14
40
  const ready = [];
15
41
  for (const task of candidates) {
16
- const blockerIds = yield* depRepo.getBlockerIds(task.id);
17
- const blockingIds = yield* depRepo.getBlockingIds(task.id);
18
- const childIds = yield* taskRepo.getChildIds(task.id);
19
- if (blockerIds.length === 0) {
20
- ready.push({
21
- ...task,
22
- blockedBy: [],
23
- blocks: blockingIds,
24
- children: childIds,
25
- isReady: true
26
- });
27
- continue;
28
- }
29
- const blockers = yield* taskRepo.findByIds(blockerIds);
30
- const allDone = blockers.every(b => b.status === "done");
42
+ const blockerIds = blockerIdsMap.get(task.id) ?? [];
43
+ const blockingIds = blockingIdsMap.get(task.id) ?? [];
44
+ const childIds = childIdsMap.get(task.id) ?? [];
45
+ // Check if all blockers are done
46
+ const allDone = blockerIds.length === 0 ||
47
+ blockerIds.every(id => blockerStatusMap.get(id) === "done");
31
48
  if (allDone) {
32
49
  ready.push({
33
50
  ...task,
@@ -44,14 +61,20 @@ export const ReadyServiceLive = Layer.effect(ReadyService, Effect.gen(function*
44
61
  isReady: (id) => Effect.gen(function* () {
45
62
  const task = yield* taskRepo.findById(id);
46
63
  if (!task)
47
- return false;
48
- if (!["backlog", "ready", "planning"].includes(task.status))
49
- return false;
64
+ return { _tag: "TaskNotFound", id };
65
+ if (!["backlog", "ready", "planning"].includes(task.status)) {
66
+ return { _tag: "WrongStatus", id, status: task.status };
67
+ }
50
68
  const blockerIds = yield* depRepo.getBlockerIds(id);
51
69
  if (blockerIds.length === 0)
52
- return true;
70
+ return { _tag: "Ready" };
53
71
  const blockers = yield* taskRepo.findByIds(blockerIds);
54
- return blockers.every(b => b.status === "done");
72
+ const pendingBlockerIds = blockers
73
+ .filter(b => b.status !== "done")
74
+ .map(b => b.id);
75
+ if (pendingBlockerIds.length === 0)
76
+ return { _tag: "Ready" };
77
+ return { _tag: "Blocked", id, pendingBlockerIds };
55
78
  }),
56
79
  getBlockers: (id) => Effect.gen(function* () {
57
80
  const blockerIds = yield* depRepo.getBlockerIds(id);
@@ -1 +1 @@
1
- {"version":3,"file":"ready-service.js","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ready-service.js","sourceRoot":"","sources":["../../src/services/ready-service.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,15 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
2
  import { LearningRepository } from "../repo/learning-repo.js";
3
3
  import { EmbeddingService } from "./embedding-service.js";
4
- import { QueryExpansionService } from "./query-expansion-service.js";
5
4
  import { RerankerService } from "./reranker-service.js";
6
- import { RetrievalError, DatabaseError } from "../errors.js";
5
+ import { RetrievalError, DatabaseError, EmbeddingDimensionMismatchError } from "../errors.js";
7
6
  import type { LearningWithScore, RetrievalOptions } from "@jamesaphoenix/tx-types";
8
7
  declare const RetrieverService_base: Context.TagClass<RetrieverService, "RetrieverService", {
9
8
  /**
10
9
  * Search for learnings matching a query.
11
10
  * Returns scored results sorted by relevance (highest first).
12
11
  */
13
- readonly search: (query: string, options?: RetrievalOptions) => Effect.Effect<readonly LearningWithScore[], RetrievalError | DatabaseError>;
12
+ readonly search: (query: string, options?: RetrievalOptions) => Effect.Effect<readonly LearningWithScore[], RetrievalError | DatabaseError | EmbeddingDimensionMismatchError>;
14
13
  /** Check if retrieval functionality is available */
15
14
  readonly isAvailable: () => Effect.Effect<boolean>;
16
15
  }>;
@@ -30,20 +29,21 @@ export declare class RetrieverService extends RetrieverService_base {
30
29
  export declare const RetrieverServiceNoop: Layer.Layer<RetrieverService, never, never>;
31
30
  /**
32
31
  * Live implementation with BM25 + vector + RRF pipeline.
33
- * Uses the default hybrid search with:
34
- * - Query expansion via LLM
32
+ * Simplified pipeline:
35
33
  * - BM25 full-text search
36
34
  * - Vector similarity (when embeddings available)
37
35
  * - RRF fusion
38
- * - Optional LLM re-ranking
36
+ * - Optional LLM re-ranking (local model)
37
+ * - Optional MMR diversification
39
38
  * - Recency/outcome/frequency boosts
40
39
  */
41
- export declare const RetrieverServiceLive: Layer.Layer<RetrieverService, DatabaseError, LearningRepository | EmbeddingService | QueryExpansionService | RerankerService>;
40
+ export declare const RetrieverServiceLive: Layer.Layer<RetrieverService, DatabaseError, LearningRepository | EmbeddingService | RerankerService>;
42
41
  /**
43
42
  * Auto-detecting layer that always uses Live since BM25 is always available.
44
- * The Live implementation gracefully degrades vector search when embeddings
45
- * are unavailable, so Auto just delegates to Live.
43
+ * The Live implementation gracefully degrades:
44
+ * - Vector search skips when EmbeddingService unavailable
45
+ * - Reranking skips when RerankerService unavailable
46
46
  */
47
- export declare const RetrieverServiceAuto: Layer.Layer<RetrieverService, DatabaseError, LearningRepository | EmbeddingService | QueryExpansionService | RerankerService>;
47
+ export declare const RetrieverServiceAuto: Layer.Layer<RetrieverService, DatabaseError, LearningRepository | EmbeddingService | RerankerService>;
48
48
  export {};
49
49
  //# sourceMappingURL=retriever-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retriever-service.d.ts","sourceRoot":"","sources":["../../src/services/retriever-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,QAAQ,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAmB,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,KAAK,EAAY,iBAAiB,EAAc,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;;IA+BpG;;;OAGG;qBACc,CACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,KACvB,MAAM,CAAC,MAAM,CAAC,SAAS,iBAAiB,EAAE,EAAE,cAAc,GAAG,aAAa,CAAC;IAChF,oDAAoD;0BAC9B,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;AAnBtD;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,qBAcnC;CAAG;AAwNN;;;GAGG;AACH,eAAO,MAAM,oBAAoB,6CAMhC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,+HAmQhC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,+HAAuB,CAAA"}
1
+ {"version":3,"file":"retriever-service.d.ts","sourceRoot":"","sources":["../../src/services/retriever-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAU,MAAM,QAAQ,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAmB,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAA;AAC7F,OAAO,KAAK,EAAY,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;;IAiCxF;;;OAGG;qBACc,CACf,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,KACvB,MAAM,CAAC,MAAM,CAAC,SAAS,iBAAiB,EAAE,EAAE,cAAc,GAAG,aAAa,GAAG,+BAA+B,CAAC;IAClH,oDAAoD;0BAC9B,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;;AAnBtD;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,qBAcnC;CAAG;AA0NN;;;GAGG;AACH,eAAO,MAAM,oBAAoB,6CAMhC,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,uGA4HhC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,uGAKhC,CAAA"}