@stoneforge/quarry 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +160 -0
  3. package/dist/api/index.d.ts +8 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +8 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/quarry-api.d.ts +268 -0
  8. package/dist/api/quarry-api.d.ts.map +1 -0
  9. package/dist/api/quarry-api.js +3905 -0
  10. package/dist/api/quarry-api.js.map +1 -0
  11. package/dist/api/types.d.ts +1359 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +204 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/bin/sf.d.ts +3 -0
  16. package/dist/bin/sf.d.ts.map +1 -0
  17. package/dist/bin/sf.js +9 -0
  18. package/dist/bin/sf.js.map +1 -0
  19. package/dist/cli/commands/admin.d.ts +11 -0
  20. package/dist/cli/commands/admin.d.ts.map +1 -0
  21. package/dist/cli/commands/admin.js +465 -0
  22. package/dist/cli/commands/admin.js.map +1 -0
  23. package/dist/cli/commands/alias.d.ts +8 -0
  24. package/dist/cli/commands/alias.d.ts.map +1 -0
  25. package/dist/cli/commands/alias.js +70 -0
  26. package/dist/cli/commands/alias.js.map +1 -0
  27. package/dist/cli/commands/channel.d.ts +13 -0
  28. package/dist/cli/commands/channel.d.ts.map +1 -0
  29. package/dist/cli/commands/channel.js +680 -0
  30. package/dist/cli/commands/channel.js.map +1 -0
  31. package/dist/cli/commands/completion.d.ts +8 -0
  32. package/dist/cli/commands/completion.d.ts.map +1 -0
  33. package/dist/cli/commands/completion.js +87 -0
  34. package/dist/cli/commands/completion.js.map +1 -0
  35. package/dist/cli/commands/config.d.ts +12 -0
  36. package/dist/cli/commands/config.d.ts.map +1 -0
  37. package/dist/cli/commands/config.js +242 -0
  38. package/dist/cli/commands/config.js.map +1 -0
  39. package/dist/cli/commands/crud.d.ts +64 -0
  40. package/dist/cli/commands/crud.d.ts.map +1 -0
  41. package/dist/cli/commands/crud.js +805 -0
  42. package/dist/cli/commands/crud.js.map +1 -0
  43. package/dist/cli/commands/dep.d.ts +16 -0
  44. package/dist/cli/commands/dep.d.ts.map +1 -0
  45. package/dist/cli/commands/dep.js +499 -0
  46. package/dist/cli/commands/dep.js.map +1 -0
  47. package/dist/cli/commands/document.d.ts +12 -0
  48. package/dist/cli/commands/document.d.ts.map +1 -0
  49. package/dist/cli/commands/document.js +1039 -0
  50. package/dist/cli/commands/document.js.map +1 -0
  51. package/dist/cli/commands/embeddings.d.ts +12 -0
  52. package/dist/cli/commands/embeddings.d.ts.map +1 -0
  53. package/dist/cli/commands/embeddings.js +273 -0
  54. package/dist/cli/commands/embeddings.js.map +1 -0
  55. package/dist/cli/commands/entity.d.ts +16 -0
  56. package/dist/cli/commands/entity.d.ts.map +1 -0
  57. package/dist/cli/commands/entity.js +522 -0
  58. package/dist/cli/commands/entity.js.map +1 -0
  59. package/dist/cli/commands/gc.d.ts +10 -0
  60. package/dist/cli/commands/gc.d.ts.map +1 -0
  61. package/dist/cli/commands/gc.js +257 -0
  62. package/dist/cli/commands/gc.js.map +1 -0
  63. package/dist/cli/commands/help.d.ts +11 -0
  64. package/dist/cli/commands/help.d.ts.map +1 -0
  65. package/dist/cli/commands/help.js +169 -0
  66. package/dist/cli/commands/help.js.map +1 -0
  67. package/dist/cli/commands/history.d.ts +9 -0
  68. package/dist/cli/commands/history.d.ts.map +1 -0
  69. package/dist/cli/commands/history.js +160 -0
  70. package/dist/cli/commands/history.js.map +1 -0
  71. package/dist/cli/commands/identity.d.ts +18 -0
  72. package/dist/cli/commands/identity.d.ts.map +1 -0
  73. package/dist/cli/commands/identity.js +698 -0
  74. package/dist/cli/commands/identity.js.map +1 -0
  75. package/dist/cli/commands/inbox.d.ts +20 -0
  76. package/dist/cli/commands/inbox.d.ts.map +1 -0
  77. package/dist/cli/commands/inbox.js +493 -0
  78. package/dist/cli/commands/inbox.js.map +1 -0
  79. package/dist/cli/commands/init.d.ts +20 -0
  80. package/dist/cli/commands/init.d.ts.map +1 -0
  81. package/dist/cli/commands/init.js +144 -0
  82. package/dist/cli/commands/init.js.map +1 -0
  83. package/dist/cli/commands/install.d.ts +9 -0
  84. package/dist/cli/commands/install.d.ts.map +1 -0
  85. package/dist/cli/commands/install.js +200 -0
  86. package/dist/cli/commands/install.js.map +1 -0
  87. package/dist/cli/commands/library.d.ts +12 -0
  88. package/dist/cli/commands/library.d.ts.map +1 -0
  89. package/dist/cli/commands/library.js +665 -0
  90. package/dist/cli/commands/library.js.map +1 -0
  91. package/dist/cli/commands/message.d.ts +11 -0
  92. package/dist/cli/commands/message.d.ts.map +1 -0
  93. package/dist/cli/commands/message.js +608 -0
  94. package/dist/cli/commands/message.js.map +1 -0
  95. package/dist/cli/commands/plan.d.ts +17 -0
  96. package/dist/cli/commands/plan.d.ts.map +1 -0
  97. package/dist/cli/commands/plan.js +698 -0
  98. package/dist/cli/commands/plan.js.map +1 -0
  99. package/dist/cli/commands/playbook.d.ts +12 -0
  100. package/dist/cli/commands/playbook.d.ts.map +1 -0
  101. package/dist/cli/commands/playbook.js +730 -0
  102. package/dist/cli/commands/playbook.js.map +1 -0
  103. package/dist/cli/commands/reset.d.ts +12 -0
  104. package/dist/cli/commands/reset.d.ts.map +1 -0
  105. package/dist/cli/commands/reset.js +306 -0
  106. package/dist/cli/commands/reset.js.map +1 -0
  107. package/dist/cli/commands/serve.d.ts +11 -0
  108. package/dist/cli/commands/serve.d.ts.map +1 -0
  109. package/dist/cli/commands/serve.js +106 -0
  110. package/dist/cli/commands/serve.js.map +1 -0
  111. package/dist/cli/commands/stats.d.ts +8 -0
  112. package/dist/cli/commands/stats.d.ts.map +1 -0
  113. package/dist/cli/commands/stats.js +82 -0
  114. package/dist/cli/commands/stats.js.map +1 -0
  115. package/dist/cli/commands/sync.d.ts +14 -0
  116. package/dist/cli/commands/sync.d.ts.map +1 -0
  117. package/dist/cli/commands/sync.js +370 -0
  118. package/dist/cli/commands/sync.js.map +1 -0
  119. package/dist/cli/commands/task.d.ts +25 -0
  120. package/dist/cli/commands/task.d.ts.map +1 -0
  121. package/dist/cli/commands/task.js +1153 -0
  122. package/dist/cli/commands/task.js.map +1 -0
  123. package/dist/cli/commands/team.d.ts +13 -0
  124. package/dist/cli/commands/team.d.ts.map +1 -0
  125. package/dist/cli/commands/team.js +471 -0
  126. package/dist/cli/commands/team.js.map +1 -0
  127. package/dist/cli/commands/workflow.d.ts +16 -0
  128. package/dist/cli/commands/workflow.d.ts.map +1 -0
  129. package/dist/cli/commands/workflow.js +753 -0
  130. package/dist/cli/commands/workflow.js.map +1 -0
  131. package/dist/cli/completion.d.ts +28 -0
  132. package/dist/cli/completion.d.ts.map +1 -0
  133. package/dist/cli/completion.js +295 -0
  134. package/dist/cli/completion.js.map +1 -0
  135. package/dist/cli/db.d.ts +38 -0
  136. package/dist/cli/db.d.ts.map +1 -0
  137. package/dist/cli/db.js +90 -0
  138. package/dist/cli/db.js.map +1 -0
  139. package/dist/cli/formatter.d.ts +87 -0
  140. package/dist/cli/formatter.d.ts.map +1 -0
  141. package/dist/cli/formatter.js +464 -0
  142. package/dist/cli/formatter.js.map +1 -0
  143. package/dist/cli/index.d.ts +33 -0
  144. package/dist/cli/index.d.ts.map +1 -0
  145. package/dist/cli/index.js +38 -0
  146. package/dist/cli/index.js.map +1 -0
  147. package/dist/cli/parser.d.ts +45 -0
  148. package/dist/cli/parser.d.ts.map +1 -0
  149. package/dist/cli/parser.js +256 -0
  150. package/dist/cli/parser.js.map +1 -0
  151. package/dist/cli/plugin-loader.d.ts +39 -0
  152. package/dist/cli/plugin-loader.d.ts.map +1 -0
  153. package/dist/cli/plugin-loader.js +165 -0
  154. package/dist/cli/plugin-loader.js.map +1 -0
  155. package/dist/cli/plugin-registry.d.ts +50 -0
  156. package/dist/cli/plugin-registry.d.ts.map +1 -0
  157. package/dist/cli/plugin-registry.js +206 -0
  158. package/dist/cli/plugin-registry.js.map +1 -0
  159. package/dist/cli/plugin-types.d.ts +106 -0
  160. package/dist/cli/plugin-types.d.ts.map +1 -0
  161. package/dist/cli/plugin-types.js +103 -0
  162. package/dist/cli/plugin-types.js.map +1 -0
  163. package/dist/cli/runner.d.ts +35 -0
  164. package/dist/cli/runner.d.ts.map +1 -0
  165. package/dist/cli/runner.js +340 -0
  166. package/dist/cli/runner.js.map +1 -0
  167. package/dist/cli/suggest.d.ts +15 -0
  168. package/dist/cli/suggest.d.ts.map +1 -0
  169. package/dist/cli/suggest.js +49 -0
  170. package/dist/cli/suggest.js.map +1 -0
  171. package/dist/cli/types.d.ts +138 -0
  172. package/dist/cli/types.d.ts.map +1 -0
  173. package/dist/cli/types.js +63 -0
  174. package/dist/cli/types.js.map +1 -0
  175. package/dist/config/config.d.ts +86 -0
  176. package/dist/config/config.d.ts.map +1 -0
  177. package/dist/config/config.js +348 -0
  178. package/dist/config/config.js.map +1 -0
  179. package/dist/config/defaults.d.ts +66 -0
  180. package/dist/config/defaults.d.ts.map +1 -0
  181. package/dist/config/defaults.js +114 -0
  182. package/dist/config/defaults.js.map +1 -0
  183. package/dist/config/duration.d.ts +75 -0
  184. package/dist/config/duration.d.ts.map +1 -0
  185. package/dist/config/duration.js +190 -0
  186. package/dist/config/duration.js.map +1 -0
  187. package/dist/config/env.d.ts +67 -0
  188. package/dist/config/env.d.ts.map +1 -0
  189. package/dist/config/env.js +207 -0
  190. package/dist/config/env.js.map +1 -0
  191. package/dist/config/file.d.ts +97 -0
  192. package/dist/config/file.d.ts.map +1 -0
  193. package/dist/config/file.js +365 -0
  194. package/dist/config/file.js.map +1 -0
  195. package/dist/config/index.d.ts +35 -0
  196. package/dist/config/index.d.ts.map +1 -0
  197. package/dist/config/index.js +41 -0
  198. package/dist/config/index.js.map +1 -0
  199. package/dist/config/merge.d.ts +53 -0
  200. package/dist/config/merge.d.ts.map +1 -0
  201. package/dist/config/merge.js +226 -0
  202. package/dist/config/merge.js.map +1 -0
  203. package/dist/config/types.d.ts +257 -0
  204. package/dist/config/types.d.ts.map +1 -0
  205. package/dist/config/types.js +72 -0
  206. package/dist/config/types.js.map +1 -0
  207. package/dist/config/validation.d.ts +55 -0
  208. package/dist/config/validation.d.ts.map +1 -0
  209. package/dist/config/validation.js +251 -0
  210. package/dist/config/validation.js.map +1 -0
  211. package/dist/http/index.d.ts +8 -0
  212. package/dist/http/index.d.ts.map +1 -0
  213. package/dist/http/index.js +12 -0
  214. package/dist/http/index.js.map +1 -0
  215. package/dist/http/sync-handlers.d.ts +162 -0
  216. package/dist/http/sync-handlers.d.ts.map +1 -0
  217. package/dist/http/sync-handlers.js +271 -0
  218. package/dist/http/sync-handlers.js.map +1 -0
  219. package/dist/index.d.ts +25 -0
  220. package/dist/index.d.ts.map +1 -0
  221. package/dist/index.js +69 -0
  222. package/dist/index.js.map +1 -0
  223. package/dist/server/index.d.ts +34 -0
  224. package/dist/server/index.d.ts.map +1 -0
  225. package/dist/server/index.js +3329 -0
  226. package/dist/server/index.js.map +1 -0
  227. package/dist/server/static.d.ts +18 -0
  228. package/dist/server/static.d.ts.map +1 -0
  229. package/dist/server/static.js +71 -0
  230. package/dist/server/static.js.map +1 -0
  231. package/dist/server/ws/broadcaster.d.ts +8 -0
  232. package/dist/server/ws/broadcaster.d.ts.map +1 -0
  233. package/dist/server/ws/broadcaster.js +7 -0
  234. package/dist/server/ws/broadcaster.js.map +1 -0
  235. package/dist/server/ws/handler.d.ts +55 -0
  236. package/dist/server/ws/handler.d.ts.map +1 -0
  237. package/dist/server/ws/handler.js +160 -0
  238. package/dist/server/ws/handler.js.map +1 -0
  239. package/dist/services/blocked-cache.d.ts +297 -0
  240. package/dist/services/blocked-cache.d.ts.map +1 -0
  241. package/dist/services/blocked-cache.js +755 -0
  242. package/dist/services/blocked-cache.js.map +1 -0
  243. package/dist/services/dependency.d.ts +205 -0
  244. package/dist/services/dependency.d.ts.map +1 -0
  245. package/dist/services/dependency.js +566 -0
  246. package/dist/services/dependency.js.map +1 -0
  247. package/dist/services/embeddings/fusion.d.ts +33 -0
  248. package/dist/services/embeddings/fusion.d.ts.map +1 -0
  249. package/dist/services/embeddings/fusion.js +34 -0
  250. package/dist/services/embeddings/fusion.js.map +1 -0
  251. package/dist/services/embeddings/index.d.ts +12 -0
  252. package/dist/services/embeddings/index.d.ts.map +1 -0
  253. package/dist/services/embeddings/index.js +10 -0
  254. package/dist/services/embeddings/index.js.map +1 -0
  255. package/dist/services/embeddings/local-provider.d.ts +31 -0
  256. package/dist/services/embeddings/local-provider.d.ts.map +1 -0
  257. package/dist/services/embeddings/local-provider.js +80 -0
  258. package/dist/services/embeddings/local-provider.js.map +1 -0
  259. package/dist/services/embeddings/service.d.ts +76 -0
  260. package/dist/services/embeddings/service.d.ts.map +1 -0
  261. package/dist/services/embeddings/service.js +153 -0
  262. package/dist/services/embeddings/service.js.map +1 -0
  263. package/dist/services/embeddings/types.d.ts +70 -0
  264. package/dist/services/embeddings/types.d.ts.map +1 -0
  265. package/dist/services/embeddings/types.js +8 -0
  266. package/dist/services/embeddings/types.js.map +1 -0
  267. package/dist/services/id-length-cache.d.ts +156 -0
  268. package/dist/services/id-length-cache.d.ts.map +1 -0
  269. package/dist/services/id-length-cache.js +197 -0
  270. package/dist/services/id-length-cache.js.map +1 -0
  271. package/dist/services/inbox.d.ts +147 -0
  272. package/dist/services/inbox.d.ts.map +1 -0
  273. package/dist/services/inbox.js +428 -0
  274. package/dist/services/inbox.js.map +1 -0
  275. package/dist/services/index.d.ts +10 -0
  276. package/dist/services/index.d.ts.map +1 -0
  277. package/dist/services/index.js +10 -0
  278. package/dist/services/index.js.map +1 -0
  279. package/dist/services/priority-service.d.ts +145 -0
  280. package/dist/services/priority-service.d.ts.map +1 -0
  281. package/dist/services/priority-service.js +272 -0
  282. package/dist/services/priority-service.js.map +1 -0
  283. package/dist/services/search-utils.d.ts +47 -0
  284. package/dist/services/search-utils.d.ts.map +1 -0
  285. package/dist/services/search-utils.js +83 -0
  286. package/dist/services/search-utils.js.map +1 -0
  287. package/dist/sync/hash.d.ts +48 -0
  288. package/dist/sync/hash.d.ts.map +1 -0
  289. package/dist/sync/hash.js +136 -0
  290. package/dist/sync/hash.js.map +1 -0
  291. package/dist/sync/index.d.ts +11 -0
  292. package/dist/sync/index.d.ts.map +1 -0
  293. package/dist/sync/index.js +16 -0
  294. package/dist/sync/index.js.map +1 -0
  295. package/dist/sync/merge.d.ts +80 -0
  296. package/dist/sync/merge.d.ts.map +1 -0
  297. package/dist/sync/merge.js +310 -0
  298. package/dist/sync/merge.js.map +1 -0
  299. package/dist/sync/serialization.d.ts +132 -0
  300. package/dist/sync/serialization.d.ts.map +1 -0
  301. package/dist/sync/serialization.js +306 -0
  302. package/dist/sync/serialization.js.map +1 -0
  303. package/dist/sync/service.d.ts +102 -0
  304. package/dist/sync/service.d.ts.map +1 -0
  305. package/dist/sync/service.js +493 -0
  306. package/dist/sync/service.js.map +1 -0
  307. package/dist/sync/types.d.ts +275 -0
  308. package/dist/sync/types.d.ts.map +1 -0
  309. package/dist/sync/types.js +76 -0
  310. package/dist/sync/types.js.map +1 -0
  311. package/dist/systems/identity.d.ts +479 -0
  312. package/dist/systems/identity.d.ts.map +1 -0
  313. package/dist/systems/identity.js +817 -0
  314. package/dist/systems/identity.js.map +1 -0
  315. package/dist/systems/index.d.ts +8 -0
  316. package/dist/systems/index.d.ts.map +1 -0
  317. package/dist/systems/index.js +29 -0
  318. package/dist/systems/index.js.map +1 -0
  319. package/package.json +121 -0
  320. package/web/assets/charts-vendor-D1YcbGux.js +55 -0
  321. package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
  322. package/web/assets/editor-vendor-BxraAWts.js +279 -0
  323. package/web/assets/index-B77vv208.js +341 -0
  324. package/web/assets/index-CF_XnVLh.css +1 -0
  325. package/web/assets/router-vendor-BCKpRBrB.js +41 -0
  326. package/web/assets/ui-vendor-DUahGnbT.js +45 -0
  327. package/web/assets/utils-vendor-CfYKiENT.js +813 -0
  328. package/web/favicon.ico +0 -0
  329. package/web/index.html +23 -0
  330. package/web/logo.png +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC7D,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Embeddings Module
3
+ *
4
+ * Public API for document embedding services: semantic search,
5
+ * hybrid search (RRF fusion), and local embedding providers.
6
+ */
7
+ export { EmbeddingService } from './service.js';
8
+ export { LocalEmbeddingProvider } from './local-provider.js';
9
+ export { reciprocalRankFusion } from './fusion.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Local Embedding Provider
3
+ *
4
+ * Uses a local ONNX-based model for embedding generation.
5
+ * Model is downloaded on first use via `sf embeddings install`.
6
+ *
7
+ * Default model: bge-base-en-v1.5 (768 dimensions)
8
+ *
9
+ * This is a placeholder implementation. The actual ONNX runtime integration
10
+ * will be added when the model download infrastructure is in place.
11
+ */
12
+ import type { EmbeddingProvider } from './types.js';
13
+ export declare class LocalEmbeddingProvider implements EmbeddingProvider {
14
+ readonly name = "local-bge-base";
15
+ readonly dimensions = 768;
16
+ readonly isLocal = true;
17
+ private modelDir;
18
+ private initialized;
19
+ constructor(modelDir?: string);
20
+ embed(text: string): Promise<Float32Array>;
21
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
22
+ isAvailable(): Promise<boolean>;
23
+ private ensureInitialized;
24
+ /**
25
+ * Generate a deterministic pseudo-embedding from text content.
26
+ * This is a placeholder until ONNX runtime integration is complete.
27
+ * Uses a simple hash-based approach to produce consistent vectors.
28
+ */
29
+ private pseudoEmbed;
30
+ }
31
+ //# sourceMappingURL=local-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-provider.d.ts","sourceRoot":"","sources":["../../../src/services/embeddings/local-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOpD,qBAAa,sBAAuB,YAAW,iBAAiB;IAC9D,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,UAAU,OAAsB;IACzC,QAAQ,CAAC,OAAO,QAAQ;IAExB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,QAAQ,CAAC,EAAE,MAAM;IAIvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAO1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAKpD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YAIvB,iBAAiB;IAc/B;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAwBpB"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Local Embedding Provider
3
+ *
4
+ * Uses a local ONNX-based model for embedding generation.
5
+ * Model is downloaded on first use via `sf embeddings install`.
6
+ *
7
+ * Default model: bge-base-en-v1.5 (768 dimensions)
8
+ *
9
+ * This is a placeholder implementation. The actual ONNX runtime integration
10
+ * will be added when the model download infrastructure is in place.
11
+ */
12
+ import { existsSync } from 'node:fs';
13
+ import { join } from 'node:path';
14
+ /** Default model directory relative to workspace root */
15
+ const DEFAULT_MODEL_DIR = '.stoneforge/models';
16
+ const DEFAULT_MODEL_NAME = 'bge-base-en-v1.5';
17
+ const DEFAULT_DIMENSIONS = 768;
18
+ export class LocalEmbeddingProvider {
19
+ name = 'local-bge-base';
20
+ dimensions = DEFAULT_DIMENSIONS;
21
+ isLocal = true;
22
+ modelDir;
23
+ initialized = false;
24
+ constructor(modelDir) {
25
+ this.modelDir = modelDir ?? join(process.cwd(), DEFAULT_MODEL_DIR, DEFAULT_MODEL_NAME);
26
+ }
27
+ async embed(text) {
28
+ await this.ensureInitialized();
29
+ // Placeholder: generate a deterministic pseudo-embedding from text hash
30
+ // Real implementation will use ONNX runtime
31
+ return this.pseudoEmbed(text);
32
+ }
33
+ async embedBatch(texts) {
34
+ await this.ensureInitialized();
35
+ return texts.map((text) => this.pseudoEmbed(text));
36
+ }
37
+ async isAvailable() {
38
+ return existsSync(this.modelDir);
39
+ }
40
+ async ensureInitialized() {
41
+ if (this.initialized)
42
+ return;
43
+ const available = await this.isAvailable();
44
+ if (!available) {
45
+ throw new Error(`Local embedding model not installed. Run 'sf embeddings install' to download the model.`);
46
+ }
47
+ // TODO: Initialize ONNX runtime session
48
+ this.initialized = true;
49
+ }
50
+ /**
51
+ * Generate a deterministic pseudo-embedding from text content.
52
+ * This is a placeholder until ONNX runtime integration is complete.
53
+ * Uses a simple hash-based approach to produce consistent vectors.
54
+ */
55
+ pseudoEmbed(text) {
56
+ const embedding = new Float32Array(this.dimensions);
57
+ let hash = 0;
58
+ for (let i = 0; i < text.length; i++) {
59
+ hash = ((hash << 5) - hash + text.charCodeAt(i)) | 0;
60
+ }
61
+ for (let i = 0; i < this.dimensions; i++) {
62
+ // Use simple PRNG seeded from hash
63
+ hash = (hash * 1103515245 + 12345) & 0x7fffffff;
64
+ embedding[i] = (hash / 0x7fffffff) * 2 - 1;
65
+ }
66
+ // Normalize to unit vector
67
+ let norm = 0;
68
+ for (let i = 0; i < this.dimensions; i++) {
69
+ norm += embedding[i] * embedding[i];
70
+ }
71
+ norm = Math.sqrt(norm);
72
+ if (norm > 0) {
73
+ for (let i = 0; i < this.dimensions; i++) {
74
+ embedding[i] /= norm;
75
+ }
76
+ }
77
+ return embedding;
78
+ }
79
+ }
80
+ //# sourceMappingURL=local-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-provider.js","sourceRoot":"","sources":["../../../src/services/embeddings/local-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Embedding Service
3
+ *
4
+ * Manages document embeddings for semantic search.
5
+ * Handles indexing, removal, and similarity search using a configurable provider.
6
+ */
7
+ import type { StorageBackend } from '@stoneforge/storage';
8
+ import type { EmbeddingServiceConfig, SemanticSearchResult } from './types.js';
9
+ /**
10
+ * Service for managing document embeddings and performing semantic search.
11
+ */
12
+ export declare class EmbeddingService {
13
+ private provider;
14
+ private backend;
15
+ private batchSize;
16
+ constructor(backend: StorageBackend, config: EmbeddingServiceConfig);
17
+ /**
18
+ * Check if the embedding service is available.
19
+ */
20
+ isAvailable(): Promise<boolean>;
21
+ /**
22
+ * Get provider info.
23
+ */
24
+ getProviderInfo(): {
25
+ name: string;
26
+ dimensions: number;
27
+ isLocal: boolean;
28
+ };
29
+ /**
30
+ * Generate and store an embedding for a document.
31
+ *
32
+ * @param docId - Document ID
33
+ * @param content - Document content to embed (typically title + content)
34
+ */
35
+ indexDocument(docId: string, content: string): Promise<void>;
36
+ /**
37
+ * Remove the embedding for a document.
38
+ */
39
+ removeDocument(docId: string): void;
40
+ /**
41
+ * Perform semantic search using cosine similarity.
42
+ * Uses brute-force comparison (no ANN index yet).
43
+ *
44
+ * @param query - Search query text
45
+ * @param limit - Maximum results to return
46
+ * @returns Ranked results by similarity (descending)
47
+ */
48
+ searchSemantic(query: string, limit?: number): Promise<SemanticSearchResult[]>;
49
+ /**
50
+ * Hybrid search combining FTS5 results with semantic results via RRF.
51
+ *
52
+ * @param query - Search query text
53
+ * @param ftsDocIds - Document IDs from FTS5 search (in rank order)
54
+ * @param limit - Maximum results to return
55
+ * @param k - RRF smoothing constant (default: 60)
56
+ * @returns Fused document IDs ranked by combined score
57
+ */
58
+ searchHybrid(query: string, ftsDocIds: string[], limit?: number, k?: number): Promise<{
59
+ documentId: string;
60
+ score: number;
61
+ }[]>;
62
+ /**
63
+ * Re-embed all documents. Used for bulk reindexing.
64
+ *
65
+ * @param documents - Array of { id, content } to embed
66
+ * @param onProgress - Optional callback for progress reporting
67
+ */
68
+ reindexAll(documents: Array<{
69
+ id: string;
70
+ content: string;
71
+ }>, onProgress?: (indexed: number, total: number) => void): Promise<{
72
+ indexed: number;
73
+ errors: number;
74
+ }>;
75
+ }
76
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/services/embeddings/service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAqB,sBAAsB,EAAE,oBAAoB,EAAmB,MAAM,YAAY,CAAC;AAenH;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,sBAAsB;IAMnE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;OAEG;IACH,eAAe,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE;IAQzE;;;;;OAKG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBlE;;OAEG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOnC;;;;;;;OAOG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA2BxF;;;;;;;;OAQG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,GAAE,MAAW,EAClB,CAAC,GAAE,MAAW,GACb,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAkBnD;;;;;OAKG;IACG,UAAU,CACd,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EACjD,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAyChD"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Embedding Service
3
+ *
4
+ * Manages document embeddings for semantic search.
5
+ * Handles indexing, removal, and similarity search using a configurable provider.
6
+ */
7
+ import { reciprocalRankFusion } from './fusion.js';
8
+ /**
9
+ * Cosine similarity between two vectors.
10
+ * Assumes both are unit-normalized for efficiency.
11
+ */
12
+ function cosineSimilarity(a, b) {
13
+ let dot = 0;
14
+ for (let i = 0; i < a.length; i++) {
15
+ dot += a[i] * b[i];
16
+ }
17
+ return dot;
18
+ }
19
+ /**
20
+ * Service for managing document embeddings and performing semantic search.
21
+ */
22
+ export class EmbeddingService {
23
+ provider;
24
+ backend;
25
+ batchSize;
26
+ constructor(backend, config) {
27
+ this.backend = backend;
28
+ this.provider = config.provider;
29
+ this.batchSize = config.batchSize ?? 32;
30
+ }
31
+ /**
32
+ * Check if the embedding service is available.
33
+ */
34
+ async isAvailable() {
35
+ return this.provider.isAvailable();
36
+ }
37
+ /**
38
+ * Get provider info.
39
+ */
40
+ getProviderInfo() {
41
+ return {
42
+ name: this.provider.name,
43
+ dimensions: this.provider.dimensions,
44
+ isLocal: this.provider.isLocal,
45
+ };
46
+ }
47
+ /**
48
+ * Generate and store an embedding for a document.
49
+ *
50
+ * @param docId - Document ID
51
+ * @param content - Document content to embed (typically title + content)
52
+ */
53
+ async indexDocument(docId, content) {
54
+ const embedding = await this.provider.embed(content);
55
+ const blob = Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
56
+ this.backend.run(`INSERT OR REPLACE INTO document_embeddings (document_id, embedding, dimensions, provider, model, created_at)
57
+ VALUES (?, ?, ?, ?, ?, ?)`, [
58
+ docId,
59
+ blob,
60
+ this.provider.dimensions,
61
+ this.provider.name,
62
+ this.provider.name,
63
+ new Date().toISOString(),
64
+ ]);
65
+ }
66
+ /**
67
+ * Remove the embedding for a document.
68
+ */
69
+ removeDocument(docId) {
70
+ this.backend.run(`DELETE FROM document_embeddings WHERE document_id = ?`, [docId]);
71
+ }
72
+ /**
73
+ * Perform semantic search using cosine similarity.
74
+ * Uses brute-force comparison (no ANN index yet).
75
+ *
76
+ * @param query - Search query text
77
+ * @param limit - Maximum results to return
78
+ * @returns Ranked results by similarity (descending)
79
+ */
80
+ async searchSemantic(query, limit = 20) {
81
+ const queryEmbedding = await this.provider.embed(query);
82
+ // Load all embeddings (brute-force for now)
83
+ const rows = this.backend.query('SELECT document_id, embedding, dimensions FROM document_embeddings');
84
+ const results = [];
85
+ for (const row of rows) {
86
+ const stored = new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.dimensions);
87
+ const similarity = cosineSimilarity(queryEmbedding, stored);
88
+ results.push({ documentId: row.document_id, similarity });
89
+ }
90
+ // Sort by similarity descending and return top results
91
+ results.sort((a, b) => b.similarity - a.similarity);
92
+ return results.slice(0, limit);
93
+ }
94
+ /**
95
+ * Hybrid search combining FTS5 results with semantic results via RRF.
96
+ *
97
+ * @param query - Search query text
98
+ * @param ftsDocIds - Document IDs from FTS5 search (in rank order)
99
+ * @param limit - Maximum results to return
100
+ * @param k - RRF smoothing constant (default: 60)
101
+ * @returns Fused document IDs ranked by combined score
102
+ */
103
+ async searchHybrid(query, ftsDocIds, limit = 20, k = 60) {
104
+ // Get semantic results
105
+ const semanticResults = await this.searchSemantic(query, limit * 2);
106
+ // Build ranked result sets
107
+ const ftsRanking = ftsDocIds.map((documentId, index) => ({
108
+ documentId,
109
+ rank: index + 1,
110
+ }));
111
+ const semanticRanking = semanticResults.map((result, index) => ({
112
+ documentId: result.documentId,
113
+ rank: index + 1,
114
+ }));
115
+ return reciprocalRankFusion([ftsRanking, semanticRanking], k, limit);
116
+ }
117
+ /**
118
+ * Re-embed all documents. Used for bulk reindexing.
119
+ *
120
+ * @param documents - Array of { id, content } to embed
121
+ * @param onProgress - Optional callback for progress reporting
122
+ */
123
+ async reindexAll(documents, onProgress) {
124
+ let indexed = 0;
125
+ let errors = 0;
126
+ for (let i = 0; i < documents.length; i += this.batchSize) {
127
+ const batch = documents.slice(i, i + this.batchSize);
128
+ const texts = batch.map((d) => d.content);
129
+ try {
130
+ const embeddings = await this.provider.embedBatch(texts);
131
+ for (let j = 0; j < batch.length; j++) {
132
+ const blob = Buffer.from(embeddings[j].buffer, embeddings[j].byteOffset, embeddings[j].byteLength);
133
+ this.backend.run(`INSERT OR REPLACE INTO document_embeddings (document_id, embedding, dimensions, provider, model, created_at)
134
+ VALUES (?, ?, ?, ?, ?, ?)`, [
135
+ batch[j].id,
136
+ blob,
137
+ this.provider.dimensions,
138
+ this.provider.name,
139
+ this.provider.name,
140
+ new Date().toISOString(),
141
+ ]);
142
+ indexed++;
143
+ }
144
+ }
145
+ catch {
146
+ errors += batch.length;
147
+ }
148
+ onProgress?.(indexed + errors, documents.length);
149
+ }
150
+ return { indexed, errors };
151
+ }
152
+ }
153
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/services/embeddings/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Embedding Provider Types
3
+ *
4
+ * Defines the interface for embedding providers used in semantic search.
5
+ * Providers generate vector representations of text for similarity matching.
6
+ */
7
+ /**
8
+ * An embedding provider generates vector representations of text.
9
+ *
10
+ * Implementations can use local models (ONNX) or remote APIs (OpenAI, Voyage).
11
+ */
12
+ export interface EmbeddingProvider {
13
+ /** Human-readable provider name */
14
+ readonly name: string;
15
+ /** Dimensionality of output vectors */
16
+ readonly dimensions: number;
17
+ /** Whether the provider runs locally (no network required) */
18
+ readonly isLocal: boolean;
19
+ /**
20
+ * Generate an embedding for a single text.
21
+ *
22
+ * @param text - Input text to embed
23
+ * @returns Float32Array of embedding values
24
+ */
25
+ embed(text: string): Promise<Float32Array>;
26
+ /**
27
+ * Generate embeddings for multiple texts in a single batch.
28
+ *
29
+ * @param texts - Array of input texts to embed
30
+ * @returns Array of Float32Array embeddings (same order as input)
31
+ */
32
+ embedBatch(texts: string[]): Promise<Float32Array[]>;
33
+ /**
34
+ * Check if the provider is available and ready to use.
35
+ *
36
+ * For local providers, this checks if the model is installed.
37
+ * For remote providers, this checks if API keys are configured.
38
+ *
39
+ * @returns True if the provider can generate embeddings
40
+ */
41
+ isAvailable(): Promise<boolean>;
42
+ }
43
+ /**
44
+ * Stored embedding record from the database.
45
+ */
46
+ export interface StoredEmbedding {
47
+ documentId: string;
48
+ embedding: Float32Array;
49
+ dimensions: number;
50
+ provider: string;
51
+ model: string;
52
+ createdAt: string;
53
+ }
54
+ /**
55
+ * A semantic search result with similarity score.
56
+ */
57
+ export interface SemanticSearchResult {
58
+ documentId: string;
59
+ similarity: number;
60
+ }
61
+ /**
62
+ * Configuration for the embedding service.
63
+ */
64
+ export interface EmbeddingServiceConfig {
65
+ /** The embedding provider to use */
66
+ provider: EmbeddingProvider;
67
+ /** Batch size for bulk operations. Default: 32 */
68
+ batchSize?: number;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/embeddings/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE3C;;;;;OAKG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAErD;;;;;;;OAOG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,YAAY,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Embedding Provider Types
3
+ *
4
+ * Defines the interface for embedding providers used in semantic search.
5
+ * Providers generate vector representations of text for similarity matching.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/embeddings/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * ID Length Cache Service
3
+ *
4
+ * Provides efficient caching for ID hash length calculation.
5
+ * This service avoids querying element count on every ID generation
6
+ * by caching the count and calculated length with periodic invalidation.
7
+ *
8
+ * The cache is automatically invalidated:
9
+ * - After a configurable TTL (default: 60 seconds)
10
+ * - When explicitly refreshed
11
+ * - After a significant number of creates (growth threshold)
12
+ */
13
+ import type { StorageBackend } from '@stoneforge/storage';
14
+ /**
15
+ * Configuration for the ID length cache
16
+ */
17
+ export interface IdLengthCacheConfig {
18
+ /**
19
+ * Time-to-live for cached values in milliseconds.
20
+ * After this time, the cache will be refreshed on next access.
21
+ * Default: 60000 (60 seconds)
22
+ */
23
+ ttlMs?: number;
24
+ /**
25
+ * Minimum number of element creations before triggering a refresh.
26
+ * This helps catch rapid growth before TTL expires.
27
+ * Default: 100
28
+ */
29
+ growthThreshold?: number;
30
+ /**
31
+ * Minimum hash length to use, regardless of element count.
32
+ * Default: 4 (provides reasonable collision resistance)
33
+ */
34
+ minLength?: number;
35
+ }
36
+ /**
37
+ * Statistics for cache monitoring
38
+ */
39
+ export interface IdLengthCacheStats {
40
+ /** Current element count */
41
+ elementCount: number;
42
+ /** Current hash length */
43
+ hashLength: number;
44
+ /** Number of cache hits since creation */
45
+ hits: number;
46
+ /** Number of cache misses (refreshes) since creation */
47
+ misses: number;
48
+ /** Cache hit rate (0-1) */
49
+ hitRate: number;
50
+ /** Time since last refresh in milliseconds */
51
+ ageMs: number;
52
+ /** Whether cache is currently stale */
53
+ isStale: boolean;
54
+ }
55
+ /**
56
+ * Service for caching ID hash length calculations.
57
+ *
58
+ * This service provides efficient access to the optimal ID hash length
59
+ * without querying the database on every ID generation.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const cache = createIdLengthCache(storage);
64
+ *
65
+ * // Get optimal hash length for ID generation
66
+ * const hashLength = cache.getHashLength();
67
+ *
68
+ * // Notify cache of new element creation (for growth tracking)
69
+ * cache.notifyCreate();
70
+ *
71
+ * // Force refresh if needed
72
+ * cache.refresh();
73
+ * ```
74
+ */
75
+ export declare class IdLengthCache {
76
+ private readonly db;
77
+ private cache;
78
+ private hits;
79
+ private misses;
80
+ private readonly ttlMs;
81
+ private readonly growthThreshold;
82
+ private readonly minLength;
83
+ constructor(db: StorageBackend, config?: IdLengthCacheConfig);
84
+ /**
85
+ * Get the optimal hash length for ID generation.
86
+ *
87
+ * Returns the cached hash length if valid, otherwise refreshes
88
+ * the cache first. This is the main method to call when generating IDs.
89
+ *
90
+ * @returns The optimal hash length (3-8)
91
+ */
92
+ getHashLength(): number;
93
+ /**
94
+ * Get the cached element count.
95
+ *
96
+ * This is the element count at the last refresh, not necessarily
97
+ * the current count in the database.
98
+ *
99
+ * @returns The cached element count
100
+ */
101
+ getElementCount(): number;
102
+ /**
103
+ * Notify the cache that a new element was created.
104
+ *
105
+ * This increments the internal counter and may trigger a refresh
106
+ * if the growth threshold is exceeded.
107
+ */
108
+ notifyCreate(): void;
109
+ /**
110
+ * Force a cache refresh.
111
+ *
112
+ * Queries the database for the current element count and
113
+ * recalculates the optimal hash length.
114
+ */
115
+ refresh(): void;
116
+ /**
117
+ * Check if the cache is stale and needs refresh.
118
+ */
119
+ isStale(): boolean;
120
+ /**
121
+ * Clear the cache, forcing a refresh on next access.
122
+ */
123
+ clear(): void;
124
+ /**
125
+ * Get cache statistics for monitoring.
126
+ */
127
+ getStats(): IdLengthCacheStats;
128
+ /**
129
+ * Calculate the optimal hash length for an element count.
130
+ *
131
+ * Applies the minimum length constraint.
132
+ */
133
+ private calculateLength;
134
+ }
135
+ /**
136
+ * Create a new IdLengthCache instance.
137
+ *
138
+ * @param db - Storage backend for querying element count
139
+ * @param config - Optional cache configuration
140
+ * @returns A new IdLengthCache instance
141
+ *
142
+ * @example
143
+ * ```typescript
144
+ * // Basic usage
145
+ * const cache = createIdLengthCache(storage);
146
+ *
147
+ * // With custom configuration
148
+ * const cache = createIdLengthCache(storage, {
149
+ * ttlMs: 30000, // 30 second TTL
150
+ * growthThreshold: 50, // Refresh after 50 creates
151
+ * minLength: 5, // Minimum 5-character hashes
152
+ * });
153
+ * ```
154
+ */
155
+ export declare function createIdLengthCache(db: StorageBackend, config?: IdLengthCacheConfig): IdLengthCache;
156
+ //# sourceMappingURL=id-length-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-length-cache.d.ts","sourceRoot":"","sources":["../../src/services/id-length-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;CAClB;AAcD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAa;IAStB,OAAO,CAAC,QAAQ,CAAC,EAAE;IARrB,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGhB,EAAE,EAAE,cAAc,EACnC,MAAM,GAAE,mBAAwB;IAUlC;;;;;;;OAOG;IACH,aAAa,IAAI,MAAM;IAUvB;;;;;;;OAOG;IACH,eAAe,IAAI,MAAM;IAOzB;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAgBpB;;;;;OAKG;IACH,OAAO,IAAI,IAAI;IAYf;;OAEG;IACH,OAAO,IAAI,OAAO;IASlB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,IAAI,kBAAkB;IAoB9B;;;;OAIG;IACH,OAAO,CAAC,eAAe;CAIxB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,EAClB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,aAAa,CAEf"}