@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,197 @@
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 { calculateIdLength, MIN_HASH_LENGTH, MAX_HASH_LENGTH } from '@stoneforge/core';
14
+ // ============================================================================
15
+ // Default Configuration
16
+ // ============================================================================
17
+ const DEFAULT_TTL_MS = 60000; // 60 seconds
18
+ const DEFAULT_GROWTH_THRESHOLD = 100;
19
+ const DEFAULT_MIN_LENGTH = MIN_HASH_LENGTH + 1; // 4 characters
20
+ // ============================================================================
21
+ // IdLengthCache Service
22
+ // ============================================================================
23
+ /**
24
+ * Service for caching ID hash length calculations.
25
+ *
26
+ * This service provides efficient access to the optimal ID hash length
27
+ * without querying the database on every ID generation.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const cache = createIdLengthCache(storage);
32
+ *
33
+ * // Get optimal hash length for ID generation
34
+ * const hashLength = cache.getHashLength();
35
+ *
36
+ * // Notify cache of new element creation (for growth tracking)
37
+ * cache.notifyCreate();
38
+ *
39
+ * // Force refresh if needed
40
+ * cache.refresh();
41
+ * ```
42
+ */
43
+ export class IdLengthCache {
44
+ db;
45
+ cache = null;
46
+ hits = 0;
47
+ misses = 0;
48
+ ttlMs;
49
+ growthThreshold;
50
+ minLength;
51
+ constructor(db, config = {}) {
52
+ this.db = db;
53
+ this.ttlMs = config.ttlMs ?? DEFAULT_TTL_MS;
54
+ this.growthThreshold = config.growthThreshold ?? DEFAULT_GROWTH_THRESHOLD;
55
+ this.minLength = Math.max(MIN_HASH_LENGTH, Math.min(MAX_HASH_LENGTH, config.minLength ?? DEFAULT_MIN_LENGTH));
56
+ }
57
+ /**
58
+ * Get the optimal hash length for ID generation.
59
+ *
60
+ * Returns the cached hash length if valid, otherwise refreshes
61
+ * the cache first. This is the main method to call when generating IDs.
62
+ *
63
+ * @returns The optimal hash length (3-8)
64
+ */
65
+ getHashLength() {
66
+ if (this.isStale()) {
67
+ this.refresh();
68
+ this.misses++;
69
+ }
70
+ else {
71
+ this.hits++;
72
+ }
73
+ return this.cache.hashLength;
74
+ }
75
+ /**
76
+ * Get the cached element count.
77
+ *
78
+ * This is the element count at the last refresh, not necessarily
79
+ * the current count in the database.
80
+ *
81
+ * @returns The cached element count
82
+ */
83
+ getElementCount() {
84
+ if (!this.cache) {
85
+ this.refresh();
86
+ }
87
+ return this.cache.elementCount;
88
+ }
89
+ /**
90
+ * Notify the cache that a new element was created.
91
+ *
92
+ * This increments the internal counter and may trigger a refresh
93
+ * if the growth threshold is exceeded.
94
+ */
95
+ notifyCreate() {
96
+ if (this.cache) {
97
+ this.cache.createsSinceRefresh++;
98
+ // Check if growth threshold exceeded
99
+ if (this.cache.createsSinceRefresh >= this.growthThreshold) {
100
+ // Check if we might need a longer hash
101
+ const newCount = this.cache.elementCount + this.cache.createsSinceRefresh;
102
+ const newLength = this.calculateLength(newCount);
103
+ if (newLength > this.cache.hashLength) {
104
+ this.refresh();
105
+ }
106
+ }
107
+ }
108
+ }
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() {
116
+ const elementCount = this.db.getElementCount();
117
+ const hashLength = this.calculateLength(elementCount);
118
+ this.cache = {
119
+ elementCount,
120
+ hashLength,
121
+ updatedAt: Date.now(),
122
+ createsSinceRefresh: 0,
123
+ };
124
+ }
125
+ /**
126
+ * Check if the cache is stale and needs refresh.
127
+ */
128
+ isStale() {
129
+ if (!this.cache) {
130
+ return true;
131
+ }
132
+ const age = Date.now() - this.cache.updatedAt;
133
+ return age >= this.ttlMs;
134
+ }
135
+ /**
136
+ * Clear the cache, forcing a refresh on next access.
137
+ */
138
+ clear() {
139
+ this.cache = null;
140
+ }
141
+ /**
142
+ * Get cache statistics for monitoring.
143
+ */
144
+ getStats() {
145
+ if (!this.cache) {
146
+ this.refresh();
147
+ }
148
+ const totalAccesses = this.hits + this.misses;
149
+ const hitRate = totalAccesses > 0 ? this.hits / totalAccesses : 0;
150
+ const ageMs = Date.now() - this.cache.updatedAt;
151
+ return {
152
+ elementCount: this.cache.elementCount,
153
+ hashLength: this.cache.hashLength,
154
+ hits: this.hits,
155
+ misses: this.misses,
156
+ hitRate,
157
+ ageMs,
158
+ isStale: this.isStale(),
159
+ };
160
+ }
161
+ /**
162
+ * Calculate the optimal hash length for an element count.
163
+ *
164
+ * Applies the minimum length constraint.
165
+ */
166
+ calculateLength(elementCount) {
167
+ const calculated = calculateIdLength(elementCount);
168
+ return Math.max(this.minLength, calculated);
169
+ }
170
+ }
171
+ // ============================================================================
172
+ // Factory Function
173
+ // ============================================================================
174
+ /**
175
+ * Create a new IdLengthCache instance.
176
+ *
177
+ * @param db - Storage backend for querying element count
178
+ * @param config - Optional cache configuration
179
+ * @returns A new IdLengthCache instance
180
+ *
181
+ * @example
182
+ * ```typescript
183
+ * // Basic usage
184
+ * const cache = createIdLengthCache(storage);
185
+ *
186
+ * // With custom configuration
187
+ * const cache = createIdLengthCache(storage, {
188
+ * ttlMs: 30000, // 30 second TTL
189
+ * growthThreshold: 50, // Refresh after 50 creates
190
+ * minLength: 5, // Minimum 5-character hashes
191
+ * });
192
+ * ```
193
+ */
194
+ export function createIdLengthCache(db, config) {
195
+ return new IdLengthCache(db, config);
196
+ }
197
+ //# sourceMappingURL=id-length-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-length-cache.js","sourceRoot":"","sources":["../../src/services/id-length-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Inbox Service - Unified notification inbox management
3
+ *
4
+ * Provides CRUD operations for inbox items:
5
+ * - addToInbox: Add a new notification to an entity's inbox
6
+ * - getInbox: Get inbox items for an entity with optional filtering
7
+ * - getInboxPaginated: Get inbox items with pagination and total count
8
+ * - markAsRead: Mark an inbox item as read
9
+ * - markAsUnread: Mark an inbox item as unread
10
+ * - markAllAsRead: Mark all unread items as read for an entity
11
+ * - archive: Archive an inbox item
12
+ *
13
+ * The service does NOT integrate with MessageService - that is handled
14
+ * in a separate integration layer (Phase 4).
15
+ */
16
+ import type { StorageBackend } from '@stoneforge/storage';
17
+ import type { EntityId, ChannelId, InboxItem, InboxFilter, CreateInboxItemInput } from '@stoneforge/core';
18
+ /**
19
+ * Service for managing inbox items
20
+ */
21
+ export declare class InboxService {
22
+ private readonly db;
23
+ constructor(db: StorageBackend);
24
+ /**
25
+ * Initialize the inbox_items table schema
26
+ * Should be called during database setup
27
+ *
28
+ * Note: In production, use migrations instead of this method.
29
+ * This is provided for testing and standalone service usage.
30
+ */
31
+ initSchema(): void;
32
+ /**
33
+ * Add a new item to an entity's inbox
34
+ *
35
+ * @param input - Inbox item creation input
36
+ * @returns The created inbox item
37
+ * @throws ValidationError if input is invalid
38
+ * @throws ConflictError if inbox item already exists for this recipient/message
39
+ */
40
+ addToInbox(input: CreateInboxItemInput): InboxItem;
41
+ /**
42
+ * Get inbox items for a recipient with optional filtering
43
+ *
44
+ * @param recipientId - Entity to get inbox for
45
+ * @param filter - Optional filter criteria
46
+ * @returns Array of inbox items
47
+ */
48
+ getInbox(recipientId: EntityId, filter?: InboxFilter): InboxItem[];
49
+ /**
50
+ * Get inbox items with pagination info
51
+ *
52
+ * @param recipientId - Entity to get inbox for
53
+ * @param filter - Optional filter criteria (limit and offset used for pagination)
54
+ * @returns Object with items and total count
55
+ */
56
+ getInboxPaginated(recipientId: EntityId, filter?: InboxFilter): {
57
+ items: InboxItem[];
58
+ total: number;
59
+ };
60
+ /**
61
+ * Get the count of unread inbox items for a recipient
62
+ *
63
+ * @param recipientId - Entity to get unread count for
64
+ * @returns Number of unread items
65
+ */
66
+ getUnreadCount(recipientId: EntityId): number;
67
+ /**
68
+ * Get a single inbox item by ID
69
+ *
70
+ * @param id - Inbox item ID
71
+ * @returns The inbox item or null if not found
72
+ */
73
+ getInboxItem(id: string): InboxItem | null;
74
+ /**
75
+ * Mark an inbox item as read
76
+ *
77
+ * @param itemId - Inbox item ID to mark as read
78
+ * @returns The updated inbox item
79
+ * @throws NotFoundError if inbox item doesn't exist
80
+ */
81
+ markAsRead(itemId: string): InboxItem;
82
+ /**
83
+ * Mark multiple inbox items as read in a single operation.
84
+ *
85
+ * @param itemIds - Inbox item IDs to mark as read
86
+ * @returns Number of items actually marked as read
87
+ */
88
+ markAsReadBatch(itemIds: string[]): number;
89
+ /**
90
+ * Mark an inbox item as unread
91
+ *
92
+ * @param itemId - Inbox item ID to mark as unread
93
+ * @returns The updated inbox item
94
+ * @throws NotFoundError if inbox item doesn't exist
95
+ */
96
+ markAsUnread(itemId: string): InboxItem;
97
+ /**
98
+ * Mark all unread inbox items as read for a recipient
99
+ *
100
+ * @param recipientId - Entity to mark all items as read for
101
+ * @returns Number of items marked as read
102
+ */
103
+ markAllAsRead(recipientId: EntityId): number;
104
+ /**
105
+ * Archive an inbox item
106
+ *
107
+ * @param itemId - Inbox item ID to archive
108
+ * @returns The updated inbox item
109
+ * @throws NotFoundError if inbox item doesn't exist
110
+ */
111
+ archive(itemId: string): InboxItem;
112
+ /**
113
+ * Get inbox items for a specific channel
114
+ *
115
+ * @param recipientId - Entity to get inbox for
116
+ * @param channelId - Channel to filter by
117
+ * @returns Array of inbox items for the channel
118
+ */
119
+ getInboxByChannel(recipientId: EntityId, channelId: ChannelId): InboxItem[];
120
+ /**
121
+ * Delete inbox items by message ID (for cascade deletion)
122
+ *
123
+ * @param messageId - Message ID to delete inbox items for
124
+ * @returns Number of items deleted
125
+ */
126
+ deleteByMessage(messageId: string): number;
127
+ /**
128
+ * Delete all inbox items for a recipient
129
+ *
130
+ * @param recipientId - Entity to delete inbox items for
131
+ * @returns Number of items deleted
132
+ */
133
+ deleteByRecipient(recipientId: EntityId): number;
134
+ /**
135
+ * Build a SQL query from filter options
136
+ */
137
+ private buildFilterQuery;
138
+ /**
139
+ * Convert a database row to an InboxItem object
140
+ */
141
+ private rowToInboxItem;
142
+ }
143
+ /**
144
+ * Create a new InboxService instance
145
+ */
146
+ export declare function createInboxService(db: StorageBackend): InboxService;
147
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../src/services/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAO,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAa,SAAS,EAAa,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAgDhI;;GAEG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAM/C;;;;;;OAMG;IACH,UAAU,IAAI,IAAI;IAsClB;;;;;;;OAOG;IACH,UAAU,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS;IA6ElD;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE;IAMlE;;;;;;OAMG;IACH,iBAAiB,CACf,WAAW,EAAE,QAAQ,EACrB,MAAM,CAAC,EAAE,WAAW,GACnB;QAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAiBxC;;;;;OAKG;IACH,cAAc,CAAC,WAAW,EAAE,QAAQ,GAAG,MAAM;IAS7C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAc1C;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;IA2BrC;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;IAe1C;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;IAyBvC;;;;;OAKG;IACH,aAAa,CAAC,WAAW,EAAE,QAAQ,GAAG,MAAM;IAa5C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS;IAuBlC;;;;;;OAMG;IACH,iBAAiB,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,EAAE;IAQ3E;;;;;OAKG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAQ1C;;;;;OAKG;IACH,iBAAiB,CAAC,WAAW,EAAE,QAAQ,GAAG,MAAM;IAYhD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuFxB;;OAEG;IACH,OAAO,CAAC,cAAc;CAYvB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,cAAc,GAAG,YAAY,CAEnE"}