bikky 0.3.1 → 0.3.2

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 (329) hide show
  1. package/README.md +79 -26
  2. package/dist/cli.d.ts +1 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +7 -1
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +22 -3
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +61 -6
  9. package/dist/config.js.map +1 -1
  10. package/dist/config.test.js +17 -9
  11. package/dist/config.test.js.map +1 -1
  12. package/dist/daemon/capture-policy.d.ts +95 -0
  13. package/dist/daemon/capture-policy.d.ts.map +1 -0
  14. package/dist/daemon/capture-policy.js +139 -0
  15. package/dist/daemon/capture-policy.js.map +1 -0
  16. package/dist/daemon/capture-policy.test.d.ts +2 -0
  17. package/dist/daemon/capture-policy.test.d.ts.map +1 -0
  18. package/dist/daemon/capture-policy.test.js +46 -0
  19. package/dist/daemon/capture-policy.test.js.map +1 -0
  20. package/dist/daemon/consolidation.d.ts.map +1 -1
  21. package/dist/daemon/consolidation.js +84 -98
  22. package/dist/daemon/consolidation.js.map +1 -1
  23. package/dist/daemon/episode-summary.d.ts +77 -0
  24. package/dist/daemon/episode-summary.d.ts.map +1 -0
  25. package/dist/daemon/episode-summary.js +239 -0
  26. package/dist/daemon/episode-summary.js.map +1 -0
  27. package/dist/daemon/episode-summary.test.d.ts +2 -0
  28. package/dist/daemon/episode-summary.test.d.ts.map +1 -0
  29. package/dist/daemon/episode-summary.test.js +101 -0
  30. package/dist/daemon/episode-summary.test.js.map +1 -0
  31. package/dist/daemon/extraction.d.ts +25 -0
  32. package/dist/daemon/extraction.d.ts.map +1 -1
  33. package/dist/daemon/extraction.js +244 -124
  34. package/dist/daemon/extraction.js.map +1 -1
  35. package/dist/daemon/extraction.test.d.ts +2 -0
  36. package/dist/daemon/extraction.test.d.ts.map +1 -0
  37. package/dist/daemon/extraction.test.js +106 -0
  38. package/dist/daemon/extraction.test.js.map +1 -0
  39. package/dist/daemon/loop.d.ts.map +1 -1
  40. package/dist/daemon/loop.js +8 -6
  41. package/dist/daemon/loop.js.map +1 -1
  42. package/dist/daemon/qdrant.d.ts +59 -8
  43. package/dist/daemon/qdrant.d.ts.map +1 -1
  44. package/dist/daemon/qdrant.js +74 -23
  45. package/dist/daemon/qdrant.js.map +1 -1
  46. package/dist/daemon/qdrant.test.js +2 -2
  47. package/dist/daemon/qdrant.test.js.map +1 -1
  48. package/dist/daemon/relations.d.ts +6 -1
  49. package/dist/daemon/relations.d.ts.map +1 -1
  50. package/dist/daemon/relations.js +44 -63
  51. package/dist/daemon/relations.js.map +1 -1
  52. package/dist/daemon/session-index.d.ts +60 -0
  53. package/dist/daemon/session-index.d.ts.map +1 -0
  54. package/dist/daemon/session-index.js +136 -0
  55. package/dist/daemon/session-index.js.map +1 -0
  56. package/dist/daemon/session-index.test.d.ts +2 -0
  57. package/dist/daemon/session-index.test.d.ts.map +1 -0
  58. package/dist/daemon/session-index.test.js +54 -0
  59. package/dist/daemon/session-index.test.js.map +1 -0
  60. package/dist/daemon/session-summary.d.ts +69 -0
  61. package/dist/daemon/session-summary.d.ts.map +1 -0
  62. package/dist/daemon/session-summary.js +200 -0
  63. package/dist/daemon/session-summary.js.map +1 -0
  64. package/dist/daemon/session-summary.test.d.ts +2 -0
  65. package/dist/daemon/session-summary.test.d.ts.map +1 -0
  66. package/dist/daemon/session-summary.test.js +160 -0
  67. package/dist/daemon/session-summary.test.js.map +1 -0
  68. package/dist/daemon/staleness.test.d.ts +7 -0
  69. package/dist/daemon/staleness.test.d.ts.map +1 -0
  70. package/dist/daemon/staleness.test.js +128 -0
  71. package/dist/daemon/staleness.test.js.map +1 -0
  72. package/dist/daemon/workstream-summary.d.ts +68 -0
  73. package/dist/daemon/workstream-summary.d.ts.map +1 -0
  74. package/dist/daemon/workstream-summary.js +253 -0
  75. package/dist/daemon/workstream-summary.js.map +1 -0
  76. package/dist/daemon/workstream-summary.test.d.ts +2 -0
  77. package/dist/daemon/workstream-summary.test.d.ts.map +1 -0
  78. package/dist/daemon/workstream-summary.test.js +86 -0
  79. package/dist/daemon/workstream-summary.test.js.map +1 -0
  80. package/dist/lib/qdrant-client.d.ts +6 -1
  81. package/dist/lib/qdrant-client.d.ts.map +1 -1
  82. package/dist/lib/qdrant-client.js +3 -4
  83. package/dist/lib/qdrant-client.js.map +1 -1
  84. package/dist/lib/qdrant-client.test.js +21 -2
  85. package/dist/lib/qdrant-client.test.js.map +1 -1
  86. package/dist/lifecycle.test.d.ts +8 -0
  87. package/dist/lifecycle.test.d.ts.map +1 -0
  88. package/dist/lifecycle.test.js +74 -0
  89. package/dist/lifecycle.test.js.map +1 -0
  90. package/dist/llm/embedding/index.d.ts +42 -0
  91. package/dist/llm/embedding/index.d.ts.map +1 -0
  92. package/dist/llm/embedding/index.js +78 -0
  93. package/dist/llm/embedding/index.js.map +1 -0
  94. package/dist/llm/embedding/index.test.d.ts +8 -0
  95. package/dist/llm/embedding/index.test.d.ts.map +1 -0
  96. package/dist/llm/embedding/index.test.js +100 -0
  97. package/dist/llm/embedding/index.test.js.map +1 -0
  98. package/dist/llm/embedding/providers/bedrock.d.ts +16 -0
  99. package/dist/llm/embedding/providers/bedrock.d.ts.map +1 -0
  100. package/dist/llm/embedding/providers/bedrock.js +90 -0
  101. package/dist/llm/embedding/providers/bedrock.js.map +1 -0
  102. package/dist/llm/embedding/providers/bedrock.test.d.ts +2 -0
  103. package/dist/llm/embedding/providers/bedrock.test.d.ts.map +1 -0
  104. package/dist/llm/embedding/providers/bedrock.test.js +24 -0
  105. package/dist/llm/embedding/providers/bedrock.test.js.map +1 -0
  106. package/dist/llm/embedding/providers/index.d.ts +9 -0
  107. package/dist/llm/embedding/providers/index.d.ts.map +1 -0
  108. package/dist/llm/embedding/providers/index.js +9 -0
  109. package/dist/llm/embedding/providers/index.js.map +1 -0
  110. package/dist/llm/embedding/providers/ollama.d.ts +6 -0
  111. package/dist/llm/embedding/providers/ollama.d.ts.map +1 -0
  112. package/dist/llm/embedding/providers/ollama.js +39 -0
  113. package/dist/llm/embedding/providers/ollama.js.map +1 -0
  114. package/dist/llm/embedding/providers/ollama.test.d.ts +2 -0
  115. package/dist/llm/embedding/providers/ollama.test.d.ts.map +1 -0
  116. package/dist/llm/embedding/providers/ollama.test.js +54 -0
  117. package/dist/llm/embedding/providers/ollama.test.js.map +1 -0
  118. package/dist/llm/embedding/providers/openai.d.ts +6 -0
  119. package/dist/llm/embedding/providers/openai.d.ts.map +1 -0
  120. package/dist/llm/embedding/providers/openai.js +44 -0
  121. package/dist/llm/embedding/providers/openai.js.map +1 -0
  122. package/dist/llm/embedding/providers/openai.test.d.ts +2 -0
  123. package/dist/llm/embedding/providers/openai.test.d.ts.map +1 -0
  124. package/dist/llm/embedding/providers/openai.test.js +48 -0
  125. package/dist/llm/embedding/providers/openai.test.js.map +1 -0
  126. package/dist/llm/embedding/providers/portkey.d.ts +15 -0
  127. package/dist/llm/embedding/providers/portkey.d.ts.map +1 -0
  128. package/dist/llm/embedding/providers/portkey.js +58 -0
  129. package/dist/llm/embedding/providers/portkey.js.map +1 -0
  130. package/dist/llm/embedding/providers/portkey.test.d.ts +2 -0
  131. package/dist/llm/embedding/providers/portkey.test.d.ts.map +1 -0
  132. package/dist/llm/embedding/providers/portkey.test.js +56 -0
  133. package/dist/llm/embedding/providers/portkey.test.js.map +1 -0
  134. package/dist/llm/embedding/registry.d.ts +14 -0
  135. package/dist/llm/embedding/registry.d.ts.map +1 -0
  136. package/dist/llm/embedding/registry.js +27 -0
  137. package/dist/llm/embedding/registry.js.map +1 -0
  138. package/dist/llm/embedding/registry.test.d.ts +7 -0
  139. package/dist/llm/embedding/registry.test.d.ts.map +1 -0
  140. package/dist/llm/embedding/registry.test.js +68 -0
  141. package/dist/llm/embedding/registry.test.js.map +1 -0
  142. package/dist/llm/embedding/types.d.ts +55 -0
  143. package/dist/llm/embedding/types.d.ts.map +1 -0
  144. package/dist/llm/embedding/types.js +12 -0
  145. package/dist/llm/embedding/types.js.map +1 -0
  146. package/dist/llm/errors.d.ts +95 -0
  147. package/dist/llm/errors.d.ts.map +1 -0
  148. package/dist/llm/errors.js +164 -0
  149. package/dist/llm/errors.js.map +1 -0
  150. package/dist/llm/errors.test.d.ts +2 -0
  151. package/dist/llm/errors.test.d.ts.map +1 -0
  152. package/dist/llm/errors.test.js +103 -0
  153. package/dist/llm/errors.test.js.map +1 -0
  154. package/dist/llm/fetch.d.ts +39 -0
  155. package/dist/llm/fetch.d.ts.map +1 -0
  156. package/dist/llm/fetch.js +52 -0
  157. package/dist/llm/fetch.js.map +1 -0
  158. package/dist/llm/index.d.ts +6 -3
  159. package/dist/llm/index.d.ts.map +1 -1
  160. package/dist/llm/index.js +2 -2
  161. package/dist/llm/index.js.map +1 -1
  162. package/dist/llm/inference/index.d.ts +39 -0
  163. package/dist/llm/inference/index.d.ts.map +1 -0
  164. package/dist/llm/inference/index.js +118 -0
  165. package/dist/llm/inference/index.js.map +1 -0
  166. package/dist/llm/inference/index.test.d.ts +6 -0
  167. package/dist/llm/inference/index.test.d.ts.map +1 -0
  168. package/dist/llm/inference/index.test.js +109 -0
  169. package/dist/llm/inference/index.test.js.map +1 -0
  170. package/dist/llm/inference/providers/bedrock.d.ts +18 -0
  171. package/dist/llm/inference/providers/bedrock.d.ts.map +1 -0
  172. package/dist/llm/inference/providers/bedrock.js +105 -0
  173. package/dist/llm/inference/providers/bedrock.js.map +1 -0
  174. package/dist/llm/inference/providers/bedrock.test.d.ts +2 -0
  175. package/dist/llm/inference/providers/bedrock.test.d.ts.map +1 -0
  176. package/dist/llm/inference/providers/bedrock.test.js +21 -0
  177. package/dist/llm/inference/providers/bedrock.test.js.map +1 -0
  178. package/dist/llm/inference/providers/index.d.ts +10 -0
  179. package/dist/llm/inference/providers/index.d.ts.map +1 -0
  180. package/dist/llm/inference/providers/index.js +10 -0
  181. package/dist/llm/inference/providers/index.js.map +1 -0
  182. package/dist/llm/inference/providers/ollama.d.ts +8 -0
  183. package/dist/llm/inference/providers/ollama.d.ts.map +1 -0
  184. package/dist/llm/inference/providers/ollama.js +63 -0
  185. package/dist/llm/inference/providers/ollama.js.map +1 -0
  186. package/dist/llm/inference/providers/ollama.test.d.ts +2 -0
  187. package/dist/llm/inference/providers/ollama.test.d.ts.map +1 -0
  188. package/dist/llm/inference/providers/ollama.test.js +57 -0
  189. package/dist/llm/inference/providers/ollama.test.js.map +1 -0
  190. package/dist/llm/inference/providers/openai.d.ts +11 -0
  191. package/dist/llm/inference/providers/openai.d.ts.map +1 -0
  192. package/dist/llm/inference/providers/openai.js +73 -0
  193. package/dist/llm/inference/providers/openai.js.map +1 -0
  194. package/dist/llm/inference/providers/openai.test.d.ts +2 -0
  195. package/dist/llm/inference/providers/openai.test.d.ts.map +1 -0
  196. package/dist/llm/inference/providers/openai.test.js +46 -0
  197. package/dist/llm/inference/providers/openai.test.js.map +1 -0
  198. package/dist/llm/inference/providers/portkey.d.ts +13 -0
  199. package/dist/llm/inference/providers/portkey.d.ts.map +1 -0
  200. package/dist/llm/inference/providers/portkey.js +80 -0
  201. package/dist/llm/inference/providers/portkey.js.map +1 -0
  202. package/dist/llm/inference/providers/portkey.test.d.ts +2 -0
  203. package/dist/llm/inference/providers/portkey.test.d.ts.map +1 -0
  204. package/dist/llm/inference/providers/portkey.test.js +48 -0
  205. package/dist/llm/inference/providers/portkey.test.js.map +1 -0
  206. package/dist/llm/inference/registry.d.ts +15 -0
  207. package/dist/llm/inference/registry.d.ts.map +1 -0
  208. package/dist/llm/inference/registry.js +28 -0
  209. package/dist/llm/inference/registry.js.map +1 -0
  210. package/dist/llm/inference/registry.test.d.ts +6 -0
  211. package/dist/llm/inference/registry.test.d.ts.map +1 -0
  212. package/dist/llm/inference/registry.test.js +63 -0
  213. package/dist/llm/inference/registry.test.js.map +1 -0
  214. package/dist/llm/inference/types.d.ts +84 -0
  215. package/dist/llm/inference/types.d.ts.map +1 -0
  216. package/dist/llm/inference/types.js +9 -0
  217. package/dist/llm/inference/types.js.map +1 -0
  218. package/dist/llm/telemetry.d.ts +25 -0
  219. package/dist/llm/telemetry.d.ts.map +1 -0
  220. package/dist/llm/telemetry.js +43 -0
  221. package/dist/llm/telemetry.js.map +1 -0
  222. package/dist/llm/telemetry.test.d.ts +5 -0
  223. package/dist/llm/telemetry.test.d.ts.map +1 -0
  224. package/dist/llm/telemetry.test.js +89 -0
  225. package/dist/llm/telemetry.test.js.map +1 -0
  226. package/dist/llm/types.d.ts +4 -37
  227. package/dist/llm/types.d.ts.map +1 -1
  228. package/dist/llm/types.js +4 -1
  229. package/dist/llm/types.js.map +1 -1
  230. package/dist/logger.d.ts +18 -3
  231. package/dist/logger.d.ts.map +1 -1
  232. package/dist/logger.js +102 -20
  233. package/dist/logger.js.map +1 -1
  234. package/dist/logger.test.d.ts +5 -0
  235. package/dist/logger.test.d.ts.map +1 -0
  236. package/dist/logger.test.js +103 -0
  237. package/dist/logger.test.js.map +1 -0
  238. package/dist/mcp/api.d.ts +15 -1
  239. package/dist/mcp/api.d.ts.map +1 -1
  240. package/dist/mcp/api.js +44 -19
  241. package/dist/mcp/api.js.map +1 -1
  242. package/dist/mcp/api.test.d.ts +6 -0
  243. package/dist/mcp/api.test.d.ts.map +1 -0
  244. package/dist/mcp/api.test.js +130 -0
  245. package/dist/mcp/api.test.js.map +1 -0
  246. package/dist/mcp/helpers.d.ts +1 -0
  247. package/dist/mcp/helpers.d.ts.map +1 -1
  248. package/dist/mcp/helpers.js +62 -6
  249. package/dist/mcp/helpers.js.map +1 -1
  250. package/dist/mcp/helpers.test.js +71 -10
  251. package/dist/mcp/helpers.test.js.map +1 -1
  252. package/dist/mcp/index.d.ts +7 -1
  253. package/dist/mcp/index.d.ts.map +1 -1
  254. package/dist/mcp/index.js +38 -20
  255. package/dist/mcp/index.js.map +1 -1
  256. package/dist/mcp/taxonomy.d.ts +237 -31
  257. package/dist/mcp/taxonomy.d.ts.map +1 -1
  258. package/dist/mcp/taxonomy.js +533 -171
  259. package/dist/mcp/taxonomy.js.map +1 -1
  260. package/dist/mcp/taxonomy.test.d.ts +1 -1
  261. package/dist/mcp/taxonomy.test.js +141 -302
  262. package/dist/mcp/taxonomy.test.js.map +1 -1
  263. package/dist/mcp/tools.d.ts +1 -1
  264. package/dist/mcp/tools.d.ts.map +1 -1
  265. package/dist/mcp/tools.integration.itest.d.ts +23 -0
  266. package/dist/mcp/tools.integration.itest.d.ts.map +1 -0
  267. package/dist/mcp/tools.integration.itest.js +172 -0
  268. package/dist/mcp/tools.integration.itest.js.map +1 -0
  269. package/dist/mcp/tools.js +338 -302
  270. package/dist/mcp/tools.js.map +1 -1
  271. package/dist/mcp/tools.test.d.ts +16 -0
  272. package/dist/mcp/tools.test.d.ts.map +1 -0
  273. package/dist/mcp/tools.test.js +472 -0
  274. package/dist/mcp/tools.test.js.map +1 -0
  275. package/dist/mcp/types.d.ts +63 -8
  276. package/dist/mcp/types.d.ts.map +1 -1
  277. package/dist/prompts/brief.d.ts +19 -0
  278. package/dist/prompts/brief.d.ts.map +1 -0
  279. package/dist/prompts/brief.js +67 -0
  280. package/dist/prompts/brief.js.map +1 -0
  281. package/dist/prompts/contradiction.d.ts +24 -0
  282. package/dist/prompts/contradiction.d.ts.map +1 -0
  283. package/dist/prompts/contradiction.js +73 -0
  284. package/dist/prompts/contradiction.js.map +1 -0
  285. package/dist/prompts/distill.d.ts +21 -0
  286. package/dist/prompts/distill.d.ts.map +1 -0
  287. package/dist/prompts/distill.js +74 -0
  288. package/dist/prompts/distill.js.map +1 -0
  289. package/dist/prompts/extraction.d.ts +14 -0
  290. package/dist/prompts/extraction.d.ts.map +1 -0
  291. package/dist/prompts/extraction.js +87 -0
  292. package/dist/prompts/extraction.js.map +1 -0
  293. package/dist/prompts/index.d.ts +50 -0
  294. package/dist/prompts/index.d.ts.map +1 -0
  295. package/dist/prompts/index.js +102 -0
  296. package/dist/prompts/index.js.map +1 -0
  297. package/dist/prompts/prompts.test.d.ts +8 -0
  298. package/dist/prompts/prompts.test.d.ts.map +1 -0
  299. package/dist/prompts/prompts.test.js +140 -0
  300. package/dist/prompts/prompts.test.js.map +1 -0
  301. package/dist/prompts/relations.d.ts +17 -0
  302. package/dist/prompts/relations.d.ts.map +1 -0
  303. package/dist/prompts/relations.js +72 -0
  304. package/dist/prompts/relations.js.map +1 -0
  305. package/dist/render.d.ts +41 -0
  306. package/dist/render.d.ts.map +1 -0
  307. package/dist/render.js +173 -0
  308. package/dist/render.js.map +1 -0
  309. package/dist/render.test.d.ts +8 -0
  310. package/dist/render.test.d.ts.map +1 -0
  311. package/dist/render.test.js +212 -0
  312. package/dist/render.test.js.map +1 -0
  313. package/package.json +9 -2
  314. package/dist/llm/embedding.d.ts +0 -13
  315. package/dist/llm/embedding.d.ts.map +0 -1
  316. package/dist/llm/embedding.js +0 -127
  317. package/dist/llm/embedding.js.map +0 -1
  318. package/dist/llm/embedding.test.d.ts +0 -8
  319. package/dist/llm/embedding.test.d.ts.map +0 -1
  320. package/dist/llm/embedding.test.js +0 -117
  321. package/dist/llm/embedding.test.js.map +0 -1
  322. package/dist/llm/inference.d.ts +0 -12
  323. package/dist/llm/inference.d.ts.map +0 -1
  324. package/dist/llm/inference.js +0 -146
  325. package/dist/llm/inference.js.map +0 -1
  326. package/dist/llm/inference.test.d.ts +0 -8
  327. package/dist/llm/inference.test.d.ts.map +0 -1
  328. package/dist/llm/inference.test.js +0 -117
  329. package/dist/llm/inference.test.js.map +0 -1
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Shared error hierarchy for LLM (inference) and embedding providers.
3
+ *
4
+ * Models the same shape as `src/lib/qdrant-client.ts` so callers can branch on
5
+ * type instead of string-matching log messages. Inference providers catch these
6
+ * internally and degrade to `null` for the fallback chain (see
7
+ * `src/llm/inference/index.ts`); embedding providers re-throw them so callers
8
+ * can surface a meaningful reason.
9
+ */
10
+ export type LlmErrorClass = "auth" | "rate_limit" | "bad_request" | "transient" | "timeout" | "unknown";
11
+ export interface LlmErrorDetails {
12
+ /** Provider name, e.g. "openai", "portkey". */
13
+ provider: string;
14
+ /** Model id, when known. */
15
+ model?: string;
16
+ /** HTTP status code, when the failure was an HTTP response. */
17
+ status?: number;
18
+ /** Truncated response body, when available. */
19
+ body?: string;
20
+ /** Retry-After header value (seconds) for rate-limit responses. */
21
+ retryAfterMs?: number;
22
+ /** Underlying cause, when this wraps another error. */
23
+ cause?: unknown;
24
+ }
25
+ /**
26
+ * Base class for all LLM/embedding HTTP failures. Subclasses set `kind` so that
27
+ * `instanceof` and `kind === "..."` both work.
28
+ */
29
+ export declare class LlmHttpError extends Error {
30
+ readonly kind: LlmErrorClass;
31
+ readonly provider: string;
32
+ readonly model?: string;
33
+ readonly status?: number;
34
+ readonly body?: string;
35
+ readonly retryAfterMs?: number;
36
+ constructor(kind: LlmErrorClass, message: string, details: LlmErrorDetails);
37
+ }
38
+ export declare class LlmAuthError extends LlmHttpError {
39
+ constructor(details: LlmErrorDetails);
40
+ }
41
+ export declare class LlmBadRequestError extends LlmHttpError {
42
+ constructor(details: LlmErrorDetails);
43
+ }
44
+ export declare class LlmRateLimitError extends LlmHttpError {
45
+ constructor(details: LlmErrorDetails);
46
+ }
47
+ export declare class LlmTransientError extends LlmHttpError {
48
+ constructor(details: LlmErrorDetails);
49
+ }
50
+ export declare class LlmTimeoutError extends LlmHttpError {
51
+ constructor(details: LlmErrorDetails);
52
+ }
53
+ export declare class LlmUnknownError extends LlmHttpError {
54
+ constructor(details: LlmErrorDetails);
55
+ }
56
+ /** Convenience: vector-dimension mismatch — config says X, model returned Y. */
57
+ export declare class EmbeddingDimensionMismatchError extends Error {
58
+ readonly provider: string;
59
+ readonly model: string;
60
+ readonly expected: number;
61
+ readonly actual: number;
62
+ constructor(provider: string, model: string, expected: number, actual: number);
63
+ }
64
+ /**
65
+ * Map an HTTP status code to a typed error class.
66
+ * Mirrors the classification in `src/lib/qdrant-client.ts:classifyStatus`.
67
+ */
68
+ export declare function classifyHttpStatus(status: number): LlmErrorClass;
69
+ /** Build the right error subclass for an HTTP failure. */
70
+ export declare function makeHttpError(status: number, details: Omit<LlmErrorDetails, "status">): LlmHttpError;
71
+ /**
72
+ * Map a thrown fetch error (network/abort) to a typed error.
73
+ *
74
+ * - DOMException `name === "TimeoutError"` (from AbortSignal.timeout) → LlmTimeoutError
75
+ * - Anything else (DNS, ECONNRESET, etc.) → LlmTransientError
76
+ */
77
+ export declare function classifyFetchError(err: unknown, details: Omit<LlmErrorDetails, "status">): LlmHttpError;
78
+ /**
79
+ * Parse a Retry-After header (seconds or HTTP date) into milliseconds, capped
80
+ * at 60s to avoid runaway sleeps.
81
+ */
82
+ export declare function parseRetryAfterMs(header: string | null): number | undefined;
83
+ /**
84
+ * Sleep with exponential backoff + jitter, optionally honouring a server-sent
85
+ * Retry-After hint. Mirrors `src/lib/qdrant-client.ts` semantics.
86
+ */
87
+ export declare function backoffDelayMs(opts: {
88
+ attempt: number;
89
+ baseMs: number;
90
+ capMs: number;
91
+ retryAfterMs?: number;
92
+ }): number;
93
+ /** True when an error class is worth retrying. */
94
+ export declare function isRetryable(kind: LlmErrorClass): boolean;
95
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/llm/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,YAAY,GACZ,aAAa,GACb,WAAW,GACX,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,aAAa,CAAC;IACpC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,YAAY,CAAC,EAAE,MAAM,CAAC;gBAE1B,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;CAc3E;AAED,qBAAa,YAAa,SAAQ,YAAY;gBAChC,OAAO,EAAE,eAAe;CAGrC;AAED,qBAAa,kBAAmB,SAAQ,YAAY;gBACtC,OAAO,EAAE,eAAe;CAGrC;AAED,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,EAAE,eAAe;CAGrC;AAED,qBAAa,iBAAkB,SAAQ,YAAY;gBACrC,OAAO,EAAE,eAAe;CAGrC;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,eAAe;CAGrC;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,OAAO,EAAE,eAAe;CAGrC;AAED,gFAAgF;AAChF,qBAAa,+BAAgC,SAAQ,KAAK;IACxD,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBACnB,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAW9E;AASD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAQhE;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,YAAY,CASpG;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,GAAG,YAAY,CAKvG;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAY3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,CAKT;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAExD"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Shared error hierarchy for LLM (inference) and embedding providers.
3
+ *
4
+ * Models the same shape as `src/lib/qdrant-client.ts` so callers can branch on
5
+ * type instead of string-matching log messages. Inference providers catch these
6
+ * internally and degrade to `null` for the fallback chain (see
7
+ * `src/llm/inference/index.ts`); embedding providers re-throw them so callers
8
+ * can surface a meaningful reason.
9
+ */
10
+ /**
11
+ * Base class for all LLM/embedding HTTP failures. Subclasses set `kind` so that
12
+ * `instanceof` and `kind === "..."` both work.
13
+ */
14
+ export class LlmHttpError extends Error {
15
+ kind;
16
+ provider;
17
+ model;
18
+ status;
19
+ body;
20
+ retryAfterMs;
21
+ constructor(kind, message, details) {
22
+ super(message);
23
+ this.name = new.target.name;
24
+ this.kind = kind;
25
+ this.provider = details.provider;
26
+ this.model = details.model;
27
+ this.status = details.status;
28
+ this.body = details.body;
29
+ this.retryAfterMs = details.retryAfterMs;
30
+ if (details.cause !== undefined) {
31
+ // Preserve the underlying cause for stack-trace inspection.
32
+ this.cause = details.cause;
33
+ }
34
+ }
35
+ }
36
+ export class LlmAuthError extends LlmHttpError {
37
+ constructor(details) {
38
+ super("auth", buildMessage(details), details);
39
+ }
40
+ }
41
+ export class LlmBadRequestError extends LlmHttpError {
42
+ constructor(details) {
43
+ super("bad_request", buildMessage(details), details);
44
+ }
45
+ }
46
+ export class LlmRateLimitError extends LlmHttpError {
47
+ constructor(details) {
48
+ super("rate_limit", buildMessage(details), details);
49
+ }
50
+ }
51
+ export class LlmTransientError extends LlmHttpError {
52
+ constructor(details) {
53
+ super("transient", buildMessage(details), details);
54
+ }
55
+ }
56
+ export class LlmTimeoutError extends LlmHttpError {
57
+ constructor(details) {
58
+ super("timeout", buildMessage({ ...details, body: details.body ?? "request timed out" }), details);
59
+ }
60
+ }
61
+ export class LlmUnknownError extends LlmHttpError {
62
+ constructor(details) {
63
+ super("unknown", buildMessage(details), details);
64
+ }
65
+ }
66
+ /** Convenience: vector-dimension mismatch — config says X, model returned Y. */
67
+ export class EmbeddingDimensionMismatchError extends Error {
68
+ provider;
69
+ model;
70
+ expected;
71
+ actual;
72
+ constructor(provider, model, expected, actual) {
73
+ super(`Embedding dimension mismatch [${provider}/${model}]: config.embedding.dimensions=${expected} but the model returned ${actual}. ` +
74
+ `Update embedding.dimensions in ~/.bikky/config.json (or via configure_credentials) and re-create the Qdrant collection.`);
75
+ this.name = "EmbeddingDimensionMismatchError";
76
+ this.provider = provider;
77
+ this.model = model;
78
+ this.expected = expected;
79
+ this.actual = actual;
80
+ }
81
+ }
82
+ function buildMessage(d) {
83
+ const target = d.model ? `${d.provider}/${d.model}` : d.provider;
84
+ const statusPart = d.status !== undefined ? ` (${d.status})` : "";
85
+ const bodyPart = d.body ? `: ${d.body.slice(0, 200)}` : "";
86
+ return `[${target}]${statusPart}${bodyPart}`;
87
+ }
88
+ /**
89
+ * Map an HTTP status code to a typed error class.
90
+ * Mirrors the classification in `src/lib/qdrant-client.ts:classifyStatus`.
91
+ */
92
+ export function classifyHttpStatus(status) {
93
+ if (status === 401 || status === 403)
94
+ return "auth";
95
+ if (status === 429)
96
+ return "rate_limit";
97
+ if (status === 400 || status === 422)
98
+ return "bad_request";
99
+ if (status === 408 || status === 425 || status >= 500)
100
+ return "transient";
101
+ if (status >= 200 && status < 300)
102
+ return "unknown"; // never used — caller must check ok
103
+ if (status >= 400)
104
+ return "bad_request";
105
+ return "unknown";
106
+ }
107
+ /** Build the right error subclass for an HTTP failure. */
108
+ export function makeHttpError(status, details) {
109
+ const full = { ...details, status };
110
+ switch (classifyHttpStatus(status)) {
111
+ case "auth": return new LlmAuthError(full);
112
+ case "rate_limit": return new LlmRateLimitError(full);
113
+ case "bad_request": return new LlmBadRequestError(full);
114
+ case "transient": return new LlmTransientError(full);
115
+ default: return new LlmUnknownError(full);
116
+ }
117
+ }
118
+ /**
119
+ * Map a thrown fetch error (network/abort) to a typed error.
120
+ *
121
+ * - DOMException `name === "TimeoutError"` (from AbortSignal.timeout) → LlmTimeoutError
122
+ * - Anything else (DNS, ECONNRESET, etc.) → LlmTransientError
123
+ */
124
+ export function classifyFetchError(err, details) {
125
+ const e = err;
126
+ const isAbort = e?.name === "TimeoutError" || e?.name === "AbortError";
127
+ const ctx = { ...details, cause: err, body: e?.message };
128
+ return isAbort ? new LlmTimeoutError(ctx) : new LlmTransientError(ctx);
129
+ }
130
+ /**
131
+ * Parse a Retry-After header (seconds or HTTP date) into milliseconds, capped
132
+ * at 60s to avoid runaway sleeps.
133
+ */
134
+ export function parseRetryAfterMs(header) {
135
+ if (!header)
136
+ return undefined;
137
+ const seconds = Number(header);
138
+ if (Number.isFinite(seconds) && seconds >= 0) {
139
+ return Math.min(seconds, 60) * 1000;
140
+ }
141
+ const dateMs = Date.parse(header);
142
+ if (!Number.isNaN(dateMs)) {
143
+ const delta = dateMs - Date.now();
144
+ if (delta > 0)
145
+ return Math.min(delta, 60_000);
146
+ }
147
+ return undefined;
148
+ }
149
+ /**
150
+ * Sleep with exponential backoff + jitter, optionally honouring a server-sent
151
+ * Retry-After hint. Mirrors `src/lib/qdrant-client.ts` semantics.
152
+ */
153
+ export function backoffDelayMs(opts) {
154
+ if (opts.retryAfterMs !== undefined)
155
+ return Math.min(opts.retryAfterMs, opts.capMs);
156
+ const exp = Math.min(opts.capMs, opts.baseMs * 2 ** opts.attempt);
157
+ // Full jitter: random in [0, exp).
158
+ return Math.floor(Math.random() * exp);
159
+ }
160
+ /** True when an error class is worth retrying. */
161
+ export function isRetryable(kind) {
162
+ return kind === "transient" || kind === "rate_limit" || kind === "timeout";
163
+ }
164
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/llm/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAyBH;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,IAAI,CAAgB;IACpB,QAAQ,CAAS;IACjB,KAAK,CAAU;IACf,MAAM,CAAU;IAChB,IAAI,CAAU;IACd,YAAY,CAAU;IAEtC,YAAY,IAAmB,EAAE,OAAe,EAAE,OAAwB;QACxE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,4DAA4D;YAC3D,IAA4B,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QACtD,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,YAAY;IAC5C,YAAY,OAAwB;QAClC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAClD,YAAY,OAAwB;QAClC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,YAAY,OAAwB;QAClC,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,YAAY;IACjD,YAAY,OAAwB;QAClC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAwB;QAClC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,mBAAmB,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACrG,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC/C,YAAY,OAAwB;QAClC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IACxC,QAAQ,CAAS;IACjB,KAAK,CAAS;IACd,QAAQ,CAAS;IACjB,MAAM,CAAS;IAC/B,YAAY,QAAgB,EAAE,KAAa,EAAE,QAAgB,EAAE,MAAc;QAC3E,KAAK,CACH,iCAAiC,QAAQ,IAAI,KAAK,kCAAkC,QAAQ,2BAA2B,MAAM,IAAI;YACjI,yHAAyH,CAC1H,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,SAAS,YAAY,CAAC,CAAkB;IACtC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjE,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,OAAO,IAAI,MAAM,IAAI,UAAU,GAAG,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,MAAM,CAAC;IACpD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,YAAY,CAAC;IACxC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,aAAa,CAAC;IAC3D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,WAAW,CAAC;IAC1E,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC,CAAC,oCAAoC;IACzF,IAAI,MAAM,IAAI,GAAG;QAAE,OAAO,aAAa,CAAC;IACxC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAwC;IACpF,MAAM,IAAI,GAAoB,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;IACrD,QAAQ,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,CAAC,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,YAAY,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,aAAa,CAAC,CAAC,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACxD,KAAK,WAAW,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY,EAAE,OAAwC;IACvF,MAAM,CAAC,GAAG,GAA0C,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,KAAK,cAAc,IAAI,CAAC,EAAE,IAAI,KAAK,YAAY,CAAC;IACvE,MAAM,GAAG,GAAoB,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;IAC1E,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACtC,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAK9B;IACC,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,mCAAmC;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,WAAW,CAAC,IAAmB;IAC7C,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,SAAS,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/llm/errors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,103 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { classifyHttpStatus, makeHttpError, classifyFetchError, parseRetryAfterMs, backoffDelayMs, isRetryable, LlmAuthError, LlmRateLimitError, LlmBadRequestError, LlmTransientError, LlmTimeoutError, LlmUnknownError, EmbeddingDimensionMismatchError, } from "./errors.js";
4
+ describe("classifyHttpStatus", () => {
5
+ it("maps 401/403 → auth, 429 → rate_limit, 400/422 → bad_request, 5xx → transient", () => {
6
+ assert.equal(classifyHttpStatus(401), "auth");
7
+ assert.equal(classifyHttpStatus(403), "auth");
8
+ assert.equal(classifyHttpStatus(429), "rate_limit");
9
+ assert.equal(classifyHttpStatus(400), "bad_request");
10
+ assert.equal(classifyHttpStatus(422), "bad_request");
11
+ assert.equal(classifyHttpStatus(404), "bad_request");
12
+ assert.equal(classifyHttpStatus(500), "transient");
13
+ assert.equal(classifyHttpStatus(503), "transient");
14
+ assert.equal(classifyHttpStatus(408), "transient");
15
+ });
16
+ });
17
+ describe("makeHttpError", () => {
18
+ it("returns the right subclass for each status", () => {
19
+ assert.ok(makeHttpError(401, { provider: "openai" }) instanceof LlmAuthError);
20
+ assert.ok(makeHttpError(429, { provider: "openai" }) instanceof LlmRateLimitError);
21
+ assert.ok(makeHttpError(404, { provider: "openai" }) instanceof LlmBadRequestError);
22
+ assert.ok(makeHttpError(503, { provider: "openai" }) instanceof LlmTransientError);
23
+ assert.ok(makeHttpError(301, { provider: "openai" }) instanceof LlmUnknownError);
24
+ });
25
+ it("formats message as [provider/model] (status): body", () => {
26
+ const err = makeHttpError(404, {
27
+ provider: "ollama",
28
+ model: "qwen3-embedding:0.6b",
29
+ body: "model not found",
30
+ });
31
+ assert.match(err.message, /\[ollama\/qwen3-embedding:0\.6b\] \(404\): model not found/);
32
+ });
33
+ it("preserves provider, status, body, kind", () => {
34
+ const err = makeHttpError(429, { provider: "p", body: "slow down", retryAfterMs: 1000 });
35
+ assert.equal(err.kind, "rate_limit");
36
+ assert.equal(err.status, 429);
37
+ assert.equal(err.provider, "p");
38
+ assert.equal(err.retryAfterMs, 1000);
39
+ });
40
+ });
41
+ describe("parseRetryAfterMs", () => {
42
+ it("parses integer seconds", () => {
43
+ assert.equal(parseRetryAfterMs("5"), 5_000);
44
+ });
45
+ it("caps at 60s", () => {
46
+ assert.equal(parseRetryAfterMs("9999"), 60_000);
47
+ });
48
+ it("returns undefined for null / invalid input", () => {
49
+ assert.equal(parseRetryAfterMs(null), undefined);
50
+ assert.equal(parseRetryAfterMs("abc"), undefined);
51
+ });
52
+ });
53
+ describe("backoffDelayMs", () => {
54
+ it("respects cap with full jitter", () => {
55
+ for (let attempt = 0; attempt < 5; attempt++) {
56
+ const d = backoffDelayMs({ attempt, baseMs: 100, capMs: 2_000 });
57
+ assert.ok(d >= 0 && d <= 2_000, `attempt ${attempt} produced ${d}`);
58
+ }
59
+ });
60
+ it("honours retryAfterMs (capped)", () => {
61
+ assert.equal(backoffDelayMs({ attempt: 0, baseMs: 100, capMs: 2_000, retryAfterMs: 5_000 }), 2_000);
62
+ assert.equal(backoffDelayMs({ attempt: 0, baseMs: 100, capMs: 10_000, retryAfterMs: 500 }), 500);
63
+ });
64
+ });
65
+ describe("isRetryable", () => {
66
+ it("retries timeout / rate_limit / transient", () => {
67
+ assert.ok(isRetryable("timeout"));
68
+ assert.ok(isRetryable("rate_limit"));
69
+ assert.ok(isRetryable("transient"));
70
+ });
71
+ it("does NOT retry auth / bad_request / unknown", () => {
72
+ assert.equal(isRetryable("auth"), false);
73
+ assert.equal(isRetryable("bad_request"), false);
74
+ assert.equal(isRetryable("unknown"), false);
75
+ });
76
+ });
77
+ describe("classifyFetchError", () => {
78
+ it("maps TimeoutError → LlmTimeoutError", () => {
79
+ const e = new Error("timeout");
80
+ e.name = "TimeoutError";
81
+ assert.ok(classifyFetchError(e, { provider: "p" }) instanceof LlmTimeoutError);
82
+ });
83
+ it("maps AbortError → LlmTimeoutError", () => {
84
+ const e = new Error("aborted");
85
+ e.name = "AbortError";
86
+ assert.ok(classifyFetchError(e, { provider: "p" }) instanceof LlmTimeoutError);
87
+ });
88
+ it("maps generic network error → LlmTransientError", () => {
89
+ const e = new TypeError("fetch failed");
90
+ assert.ok(classifyFetchError(e, { provider: "p" }) instanceof LlmTransientError);
91
+ });
92
+ });
93
+ describe("EmbeddingDimensionMismatchError", () => {
94
+ it("includes provider, model, expected, actual", () => {
95
+ const e = new EmbeddingDimensionMismatchError("openai", "text-embedding-3-small", 1536, 768);
96
+ assert.equal(e.provider, "openai");
97
+ assert.equal(e.expected, 1536);
98
+ assert.equal(e.actual, 768);
99
+ assert.match(e.message, /1536/);
100
+ assert.match(e.message, /768/);
101
+ });
102
+ });
103
+ //# sourceMappingURL=errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/llm/errors.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Resilient JSON fetch helper for LLM and embedding providers.
3
+ *
4
+ * Adds three things to plain `fetch()`:
5
+ * 1. Per-request timeout (AbortSignal.timeout)
6
+ * 2. Retry on transient HTTP failures (5xx, 408, 425), rate-limits (429,
7
+ * honouring Retry-After), and network errors
8
+ * 3. Typed error classification — see `./errors.ts`
9
+ *
10
+ * Mirrors the patterns used by `src/lib/qdrant-client.ts` so callers can rely
11
+ * on a single error hierarchy across LLM, embedding, and Qdrant.
12
+ */
13
+ import { LlmHttpError } from "./errors.js";
14
+ export interface ResilientFetchOptions {
15
+ /** Endpoint URL. */
16
+ url: string;
17
+ /** Standard `fetch` init (method, headers, body, …). `signal` is overridden. */
18
+ init: RequestInit;
19
+ /** Per-attempt timeout in milliseconds. */
20
+ timeoutMs: number;
21
+ /** Max retry attempts for transient failures (excluding the first try). */
22
+ retries: number;
23
+ /** Base backoff in milliseconds. */
24
+ baseDelayMs: number;
25
+ /** Maximum backoff cap in milliseconds. */
26
+ capDelayMs: number;
27
+ /** Provider name (for typed errors). */
28
+ provider: string;
29
+ /** Model id, when known. */
30
+ model?: string;
31
+ }
32
+ /**
33
+ * POST-with-retry wrapper. Returns a successful Response (caller still parses
34
+ * the body). Throws a typed `LlmHttpError` on terminal failure.
35
+ */
36
+ export declare function resilientFetch(opts: ResilientFetchOptions): Promise<Response>;
37
+ /** Re-export the LlmHttpError type guard for callers that want to branch. */
38
+ export { LlmHttpError };
39
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/llm/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,YAAY,EAMb,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,qBAAqB;IACpC,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,IAAI,EAAE,WAAW,CAAC;IAClB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAgCnF;AAED,6EAA6E;AAC7E,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Resilient JSON fetch helper for LLM and embedding providers.
3
+ *
4
+ * Adds three things to plain `fetch()`:
5
+ * 1. Per-request timeout (AbortSignal.timeout)
6
+ * 2. Retry on transient HTTP failures (5xx, 408, 425), rate-limits (429,
7
+ * honouring Retry-After), and network errors
8
+ * 3. Typed error classification — see `./errors.ts`
9
+ *
10
+ * Mirrors the patterns used by `src/lib/qdrant-client.ts` so callers can rely
11
+ * on a single error hierarchy across LLM, embedding, and Qdrant.
12
+ */
13
+ import { LlmHttpError, classifyFetchError, isRetryable, makeHttpError, parseRetryAfterMs, backoffDelayMs, } from "./errors.js";
14
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
15
+ /**
16
+ * POST-with-retry wrapper. Returns a successful Response (caller still parses
17
+ * the body). Throws a typed `LlmHttpError` on terminal failure.
18
+ */
19
+ export async function resilientFetch(opts) {
20
+ const { url, init, timeoutMs, retries, baseDelayMs, capDelayMs, provider, model } = opts;
21
+ let attempt = 0;
22
+ for (;;) {
23
+ let resp;
24
+ try {
25
+ resp = await fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
26
+ }
27
+ catch (e) {
28
+ const err = classifyFetchError(e, { provider, model });
29
+ if (isRetryable(err.kind) && attempt < retries) {
30
+ await sleep(backoffDelayMs({ attempt, baseMs: baseDelayMs, capMs: capDelayMs }));
31
+ attempt++;
32
+ continue;
33
+ }
34
+ throw err;
35
+ }
36
+ if (resp.ok)
37
+ return resp;
38
+ // Non-2xx — read body once for diagnostics.
39
+ const body = await resp.text().catch(() => "");
40
+ const retryAfterMs = parseRetryAfterMs(resp.headers.get("retry-after"));
41
+ const err = makeHttpError(resp.status, { provider, model, body, retryAfterMs });
42
+ if (isRetryable(err.kind) && attempt < retries) {
43
+ await sleep(backoffDelayMs({ attempt, baseMs: baseDelayMs, capMs: capDelayMs, retryAfterMs }));
44
+ attempt++;
45
+ continue;
46
+ }
47
+ throw err;
48
+ }
49
+ }
50
+ /** Re-export the LlmHttpError type guard for callers that want to branch. */
51
+ export { LlmHttpError };
52
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/llm/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,GACf,MAAM,aAAa,CAAC;AAqBrB,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAA2B;IAC9D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACzF,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,SAAS,CAAC;QACR,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;gBAC/C,MAAM,KAAK,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBACjF,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAEzB,4CAA4C;QAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;QAEhF,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;YAC/C,MAAM,KAAK,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;YAC/F,OAAO,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1,4 +1,7 @@
1
- export type { EmbeddingProviderConfig, InferenceProviderConfig, ChatCompletionOpts, ResponseFormat, LogFn } from "./types.js";
2
- export { initEmbedding, embed, getEmbeddingConfig, getEmbeddingDimensions } from "./embedding.js";
3
- export { initLLM, chatCompletion } from "./inference.js";
1
+ export type { LogFn } from "./types.js";
2
+ export type { ResolvedEmbeddingConfig, EmbeddingProvider, InitEmbeddingInput } from "./embedding/index.js";
3
+ export { initEmbedding, embed, getEmbeddingConfig, getEmbeddingDimensions, registerEmbeddingProvider, getEmbeddingProvider, listEmbeddingProviders, } from "./embedding/index.js";
4
+ export type { ResolvedInferenceConfig, InferenceProvider, ChatCompletionOpts, InitLLMInput, } from "./inference/index.js";
5
+ export type { ResponseFormat, JsonSchemaSpec } from "./inference/types.js";
6
+ export { initLLM, chatCompletion, getInferenceConfig, registerInferenceProvider, getInferenceProvider, listInferenceProviders, } from "./inference/index.js";
4
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC9H,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,YAAY,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EACL,aAAa,EACb,KAAK,EACL,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
package/dist/llm/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { initEmbedding, embed, getEmbeddingConfig, getEmbeddingDimensions } from "./embedding.js";
2
- export { initLLM, chatCompletion } from "./inference.js";
1
+ export { initEmbedding, embed, getEmbeddingConfig, getEmbeddingDimensions, registerEmbeddingProvider, getEmbeddingProvider, listEmbeddingProviders, } from "./embedding/index.js";
2
+ export { initLLM, chatCompletion, getInferenceConfig, registerInferenceProvider, getInferenceProvider, listInferenceProviders, } from "./inference/index.js";
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,KAAK,EACL,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Public API for the inference (chat completion) layer.
3
+ *
4
+ * Importing this module registers all bundled providers via the side-effect
5
+ * barrel, so callers only need to call `initLLM(...)` and `chatCompletion(...)`.
6
+ *
7
+ * Failure contract: provider `chat()` returns `null` on any failure (auth,
8
+ * rate-limit, transient, timeout). The reason is recorded internally; callers
9
+ * that need to surface it to the user can call `getLastInferenceError()`. The
10
+ * fallback chain in `chatCompletion()` retries the secondary provider once,
11
+ * then logs a consolidated error covering both attempts.
12
+ */
13
+ import "./providers/index.js";
14
+ import { getInferenceProvider, listInferenceProviders, registerInferenceProvider } from "./registry.js";
15
+ import type { ChatCompletionOpts, InferenceProvider, InitLLMInput, LogFn, ResolvedInferenceConfig } from "./types.js";
16
+ import { LlmHttpError } from "../errors.js";
17
+ export declare function initLLM(opts: {
18
+ config: InitLLMInput;
19
+ logger?: LogFn;
20
+ }): ResolvedInferenceConfig;
21
+ export declare function getInferenceConfig(): ResolvedInferenceConfig;
22
+ /**
23
+ * The most-recent classified error from the inference layer, or null if the
24
+ * last call succeeded. Used by MCP tools to surface a meaningful reason when
25
+ * `chatCompletion()` returns null.
26
+ */
27
+ export declare function getLastInferenceError(): LlmHttpError | null;
28
+ /**
29
+ * Internal hook used by providers to record the typed reason for a `null`
30
+ * return. Exported so providers in `./providers/*` can reach it; not part of
31
+ * the public API.
32
+ */
33
+ export declare function _recordInferenceError(err: LlmHttpError | null): void;
34
+ export declare function chatCompletion(opts: ChatCompletionOpts): Promise<string | null>;
35
+ /** Test-only reset. */
36
+ export declare function _resetInference(): void;
37
+ export { registerInferenceProvider, getInferenceProvider, listInferenceProviders, };
38
+ export type { InferenceProvider, ChatCompletionOpts, ResolvedInferenceConfig, InitLLMInput, };
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/llm/inference/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,sBAAsB,CAAC;AAE9B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,KAAK,EACL,uBAAuB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAU5C,wBAAgB,OAAO,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,uBAAuB,CAgB/F;AAED,wBAAgB,kBAAkB,IAAI,uBAAuB,CAG5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,GAAG,IAAI,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAEpE;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqCrF;AAED,uBAAuB;AACvB,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAkBD,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,GACvB,CAAC;AACF,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,YAAY,GACb,CAAC"}