@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.
- package/LICENSE +13 -0
- package/README.md +160 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/quarry-api.d.ts +268 -0
- package/dist/api/quarry-api.d.ts.map +1 -0
- package/dist/api/quarry-api.js +3905 -0
- package/dist/api/quarry-api.js.map +1 -0
- package/dist/api/types.d.ts +1359 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +204 -0
- package/dist/api/types.js.map +1 -0
- package/dist/bin/sf.d.ts +3 -0
- package/dist/bin/sf.d.ts.map +1 -0
- package/dist/bin/sf.js +9 -0
- package/dist/bin/sf.js.map +1 -0
- package/dist/cli/commands/admin.d.ts +11 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +465 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/alias.d.ts +8 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +70 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/channel.d.ts +13 -0
- package/dist/cli/commands/channel.d.ts.map +1 -0
- package/dist/cli/commands/channel.js +680 -0
- package/dist/cli/commands/channel.js.map +1 -0
- package/dist/cli/commands/completion.d.ts +8 -0
- package/dist/cli/commands/completion.d.ts.map +1 -0
- package/dist/cli/commands/completion.js +87 -0
- package/dist/cli/commands/completion.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +242 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/crud.d.ts +64 -0
- package/dist/cli/commands/crud.d.ts.map +1 -0
- package/dist/cli/commands/crud.js +805 -0
- package/dist/cli/commands/crud.js.map +1 -0
- package/dist/cli/commands/dep.d.ts +16 -0
- package/dist/cli/commands/dep.d.ts.map +1 -0
- package/dist/cli/commands/dep.js +499 -0
- package/dist/cli/commands/dep.js.map +1 -0
- package/dist/cli/commands/document.d.ts +12 -0
- package/dist/cli/commands/document.d.ts.map +1 -0
- package/dist/cli/commands/document.js +1039 -0
- package/dist/cli/commands/document.js.map +1 -0
- package/dist/cli/commands/embeddings.d.ts +12 -0
- package/dist/cli/commands/embeddings.d.ts.map +1 -0
- package/dist/cli/commands/embeddings.js +273 -0
- package/dist/cli/commands/embeddings.js.map +1 -0
- package/dist/cli/commands/entity.d.ts +16 -0
- package/dist/cli/commands/entity.d.ts.map +1 -0
- package/dist/cli/commands/entity.js +522 -0
- package/dist/cli/commands/entity.js.map +1 -0
- package/dist/cli/commands/gc.d.ts +10 -0
- package/dist/cli/commands/gc.d.ts.map +1 -0
- package/dist/cli/commands/gc.js +257 -0
- package/dist/cli/commands/gc.js.map +1 -0
- package/dist/cli/commands/help.d.ts +11 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +169 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/history.d.ts +9 -0
- package/dist/cli/commands/history.d.ts.map +1 -0
- package/dist/cli/commands/history.js +160 -0
- package/dist/cli/commands/history.js.map +1 -0
- package/dist/cli/commands/identity.d.ts +18 -0
- package/dist/cli/commands/identity.d.ts.map +1 -0
- package/dist/cli/commands/identity.js +698 -0
- package/dist/cli/commands/identity.js.map +1 -0
- package/dist/cli/commands/inbox.d.ts +20 -0
- package/dist/cli/commands/inbox.d.ts.map +1 -0
- package/dist/cli/commands/inbox.js +493 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +144 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +9 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +200 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/library.d.ts +12 -0
- package/dist/cli/commands/library.d.ts.map +1 -0
- package/dist/cli/commands/library.js +665 -0
- package/dist/cli/commands/library.js.map +1 -0
- package/dist/cli/commands/message.d.ts +11 -0
- package/dist/cli/commands/message.d.ts.map +1 -0
- package/dist/cli/commands/message.js +608 -0
- package/dist/cli/commands/message.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +17 -0
- package/dist/cli/commands/plan.d.ts.map +1 -0
- package/dist/cli/commands/plan.js +698 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/playbook.d.ts +12 -0
- package/dist/cli/commands/playbook.d.ts.map +1 -0
- package/dist/cli/commands/playbook.js +730 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +12 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +306 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +106 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +8 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +82 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +14 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +370 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/task.d.ts +25 -0
- package/dist/cli/commands/task.d.ts.map +1 -0
- package/dist/cli/commands/task.js +1153 -0
- package/dist/cli/commands/task.js.map +1 -0
- package/dist/cli/commands/team.d.ts +13 -0
- package/dist/cli/commands/team.d.ts.map +1 -0
- package/dist/cli/commands/team.js +471 -0
- package/dist/cli/commands/team.js.map +1 -0
- package/dist/cli/commands/workflow.d.ts +16 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +753 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/completion.d.ts +28 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +295 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/db.d.ts +38 -0
- package/dist/cli/db.d.ts.map +1 -0
- package/dist/cli/db.js +90 -0
- package/dist/cli/db.js.map +1 -0
- package/dist/cli/formatter.d.ts +87 -0
- package/dist/cli/formatter.d.ts.map +1 -0
- package/dist/cli/formatter.js +464 -0
- package/dist/cli/formatter.js.map +1 -0
- package/dist/cli/index.d.ts +33 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parser.d.ts +45 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +256 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/cli/plugin-loader.d.ts +39 -0
- package/dist/cli/plugin-loader.d.ts.map +1 -0
- package/dist/cli/plugin-loader.js +165 -0
- package/dist/cli/plugin-loader.js.map +1 -0
- package/dist/cli/plugin-registry.d.ts +50 -0
- package/dist/cli/plugin-registry.d.ts.map +1 -0
- package/dist/cli/plugin-registry.js +206 -0
- package/dist/cli/plugin-registry.js.map +1 -0
- package/dist/cli/plugin-types.d.ts +106 -0
- package/dist/cli/plugin-types.d.ts.map +1 -0
- package/dist/cli/plugin-types.js +103 -0
- package/dist/cli/plugin-types.js.map +1 -0
- package/dist/cli/runner.d.ts +35 -0
- package/dist/cli/runner.d.ts.map +1 -0
- package/dist/cli/runner.js +340 -0
- package/dist/cli/runner.js.map +1 -0
- package/dist/cli/suggest.d.ts +15 -0
- package/dist/cli/suggest.d.ts.map +1 -0
- package/dist/cli/suggest.js +49 -0
- package/dist/cli/suggest.js.map +1 -0
- package/dist/cli/types.d.ts +138 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +63 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/config.d.ts +86 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +348 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/defaults.d.ts +66 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +114 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/duration.d.ts +75 -0
- package/dist/config/duration.d.ts.map +1 -0
- package/dist/config/duration.js +190 -0
- package/dist/config/duration.js.map +1 -0
- package/dist/config/env.d.ts +67 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +207 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/file.d.ts +97 -0
- package/dist/config/file.d.ts.map +1 -0
- package/dist/config/file.js +365 -0
- package/dist/config/file.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/merge.d.ts +53 -0
- package/dist/config/merge.d.ts.map +1 -0
- package/dist/config/merge.js +226 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/types.d.ts +257 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +72 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +55 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +251 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/http/index.d.ts +8 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +12 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/sync-handlers.d.ts +162 -0
- package/dist/http/sync-handlers.d.ts.map +1 -0
- package/dist/http/sync-handlers.js +271 -0
- package/dist/http/sync-handlers.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +3329 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/static.d.ts +18 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +71 -0
- package/dist/server/static.js.map +1 -0
- package/dist/server/ws/broadcaster.d.ts +8 -0
- package/dist/server/ws/broadcaster.d.ts.map +1 -0
- package/dist/server/ws/broadcaster.js +7 -0
- package/dist/server/ws/broadcaster.js.map +1 -0
- package/dist/server/ws/handler.d.ts +55 -0
- package/dist/server/ws/handler.d.ts.map +1 -0
- package/dist/server/ws/handler.js +160 -0
- package/dist/server/ws/handler.js.map +1 -0
- package/dist/services/blocked-cache.d.ts +297 -0
- package/dist/services/blocked-cache.d.ts.map +1 -0
- package/dist/services/blocked-cache.js +755 -0
- package/dist/services/blocked-cache.js.map +1 -0
- package/dist/services/dependency.d.ts +205 -0
- package/dist/services/dependency.d.ts.map +1 -0
- package/dist/services/dependency.js +566 -0
- package/dist/services/dependency.js.map +1 -0
- package/dist/services/embeddings/fusion.d.ts +33 -0
- package/dist/services/embeddings/fusion.d.ts.map +1 -0
- package/dist/services/embeddings/fusion.js +34 -0
- package/dist/services/embeddings/fusion.js.map +1 -0
- package/dist/services/embeddings/index.d.ts +12 -0
- package/dist/services/embeddings/index.d.ts.map +1 -0
- package/dist/services/embeddings/index.js +10 -0
- package/dist/services/embeddings/index.js.map +1 -0
- package/dist/services/embeddings/local-provider.d.ts +31 -0
- package/dist/services/embeddings/local-provider.d.ts.map +1 -0
- package/dist/services/embeddings/local-provider.js +80 -0
- package/dist/services/embeddings/local-provider.js.map +1 -0
- package/dist/services/embeddings/service.d.ts +76 -0
- package/dist/services/embeddings/service.d.ts.map +1 -0
- package/dist/services/embeddings/service.js +153 -0
- package/dist/services/embeddings/service.js.map +1 -0
- package/dist/services/embeddings/types.d.ts +70 -0
- package/dist/services/embeddings/types.d.ts.map +1 -0
- package/dist/services/embeddings/types.js +8 -0
- package/dist/services/embeddings/types.js.map +1 -0
- package/dist/services/id-length-cache.d.ts +156 -0
- package/dist/services/id-length-cache.d.ts.map +1 -0
- package/dist/services/id-length-cache.js +197 -0
- package/dist/services/id-length-cache.js.map +1 -0
- package/dist/services/inbox.d.ts +147 -0
- package/dist/services/inbox.d.ts.map +1 -0
- package/dist/services/inbox.js +428 -0
- package/dist/services/inbox.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +10 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/priority-service.d.ts +145 -0
- package/dist/services/priority-service.d.ts.map +1 -0
- package/dist/services/priority-service.js +272 -0
- package/dist/services/priority-service.js.map +1 -0
- package/dist/services/search-utils.d.ts +47 -0
- package/dist/services/search-utils.d.ts.map +1 -0
- package/dist/services/search-utils.js +83 -0
- package/dist/services/search-utils.js.map +1 -0
- package/dist/sync/hash.d.ts +48 -0
- package/dist/sync/hash.d.ts.map +1 -0
- package/dist/sync/hash.js +136 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +11 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +16 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/merge.d.ts +80 -0
- package/dist/sync/merge.d.ts.map +1 -0
- package/dist/sync/merge.js +310 -0
- package/dist/sync/merge.js.map +1 -0
- package/dist/sync/serialization.d.ts +132 -0
- package/dist/sync/serialization.d.ts.map +1 -0
- package/dist/sync/serialization.js +306 -0
- package/dist/sync/serialization.js.map +1 -0
- package/dist/sync/service.d.ts +102 -0
- package/dist/sync/service.d.ts.map +1 -0
- package/dist/sync/service.js +493 -0
- package/dist/sync/service.js.map +1 -0
- package/dist/sync/types.d.ts +275 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +76 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/systems/identity.d.ts +479 -0
- package/dist/systems/identity.d.ts.map +1 -0
- package/dist/systems/identity.js +817 -0
- package/dist/systems/identity.js.map +1 -0
- package/dist/systems/index.d.ts +8 -0
- package/dist/systems/index.d.ts.map +1 -0
- package/dist/systems/index.js +29 -0
- package/dist/systems/index.js.map +1 -0
- package/package.json +121 -0
- package/web/assets/charts-vendor-D1YcbGux.js +55 -0
- package/web/assets/dnd-vendor-DmxE-_ZH.js +5 -0
- package/web/assets/editor-vendor-BxraAWts.js +279 -0
- package/web/assets/index-B77vv208.js +341 -0
- package/web/assets/index-CF_XnVLh.css +1 -0
- package/web/assets/router-vendor-BCKpRBrB.js +41 -0
- package/web/assets/ui-vendor-DUahGnbT.js +45 -0
- package/web/assets/utils-vendor-CfYKiENT.js +813 -0
- package/web/favicon.ico +0 -0
- package/web/index.html +23 -0
- 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"}
|