@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 @@
|
|
|
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 @@
|
|
|
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"}
|