@askdkc/kiokuko 0.2.7 → 0.2.8

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 (156) hide show
  1. package/README.ja.md +9 -22
  2. package/README.ko.md +8 -22
  3. package/README.md +14 -23
  4. package/README.zh-CN.md +7 -20
  5. package/dist/akinator/agent-task.d.ts +2 -0
  6. package/dist/akinator/agent-task.d.ts.map +1 -1
  7. package/dist/akinator/agent-task.js +62 -26
  8. package/dist/akinator/agent-task.js.map +1 -1
  9. package/dist/cli.d.ts.map +1 -1
  10. package/dist/cli.js +8 -3
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/doctor.js +6 -3
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/embeddings.d.ts +7 -0
  16. package/dist/commands/embeddings.d.ts.map +1 -1
  17. package/dist/commands/embeddings.js +32 -1
  18. package/dist/commands/embeddings.js.map +1 -1
  19. package/dist/config/paths.d.ts +5 -0
  20. package/dist/config/paths.d.ts.map +1 -1
  21. package/dist/config/paths.js +34 -0
  22. package/dist/config/paths.js.map +1 -1
  23. package/dist/embedding/backend.d.ts +1 -1
  24. package/dist/embedding/backend.d.ts.map +1 -1
  25. package/dist/embedding/backend.js +20 -4
  26. package/dist/embedding/backend.js.map +1 -1
  27. package/dist/embedding/config.d.ts +3 -0
  28. package/dist/embedding/config.d.ts.map +1 -1
  29. package/dist/embedding/config.js +17 -0
  30. package/dist/embedding/config.js.map +1 -1
  31. package/dist/embedding/diagnostics.d.ts +1 -1
  32. package/dist/embedding/diagnostics.d.ts.map +1 -1
  33. package/dist/embedding/diagnostics.js +20 -5
  34. package/dist/embedding/diagnostics.js.map +1 -1
  35. package/dist/embedding/document.d.ts +5 -0
  36. package/dist/embedding/document.d.ts.map +1 -1
  37. package/dist/embedding/document.js +20 -0
  38. package/dist/embedding/document.js.map +1 -1
  39. package/dist/embedding/local-model-loader.d.ts +24 -0
  40. package/dist/embedding/local-model-loader.d.ts.map +1 -0
  41. package/dist/embedding/local-model-loader.js +64 -0
  42. package/dist/embedding/local-model-loader.js.map +1 -0
  43. package/dist/embedding/local-transformers-provider.d.ts +17 -0
  44. package/dist/embedding/local-transformers-provider.d.ts.map +1 -0
  45. package/dist/embedding/local-transformers-provider.js +54 -0
  46. package/dist/embedding/local-transformers-provider.js.map +1 -0
  47. package/dist/embedding/model-download.d.ts +32 -0
  48. package/dist/embedding/model-download.d.ts.map +1 -0
  49. package/dist/embedding/model-download.js +41 -0
  50. package/dist/embedding/model-download.js.map +1 -0
  51. package/dist/embedding/model-installation.d.ts +17 -0
  52. package/dist/embedding/model-installation.d.ts.map +1 -0
  53. package/dist/embedding/model-installation.js +71 -0
  54. package/dist/embedding/model-installation.js.map +1 -0
  55. package/dist/embedding/model-manifest.d.ts +18 -0
  56. package/dist/embedding/model-manifest.d.ts.map +1 -0
  57. package/dist/embedding/model-manifest.js +86 -0
  58. package/dist/embedding/model-manifest.js.map +1 -0
  59. package/dist/embedding/presets/local-small.d.ts +8 -0
  60. package/dist/embedding/presets/local-small.d.ts.map +1 -0
  61. package/dist/embedding/presets/local-small.js +67 -0
  62. package/dist/embedding/presets/local-small.js.map +1 -0
  63. package/dist/embedding/presets/manifest.d.ts +27 -0
  64. package/dist/embedding/presets/manifest.d.ts.map +1 -0
  65. package/dist/embedding/presets/manifest.js +5 -0
  66. package/dist/embedding/presets/manifest.js.map +1 -0
  67. package/dist/embedding/profile.d.ts +6 -2
  68. package/dist/embedding/profile.d.ts.map +1 -1
  69. package/dist/embedding/profile.js +36 -0
  70. package/dist/embedding/profile.js.map +1 -1
  71. package/dist/embedding/query-cache.d.ts +6 -0
  72. package/dist/embedding/query-cache.d.ts.map +1 -1
  73. package/dist/embedding/query-cache.js +21 -0
  74. package/dist/embedding/query-cache.js.map +1 -1
  75. package/dist/embedding/runtime.d.ts +2 -1
  76. package/dist/embedding/runtime.d.ts.map +1 -1
  77. package/dist/embedding/runtime.js +39 -5
  78. package/dist/embedding/runtime.js.map +1 -1
  79. package/dist/embedding/settings.d.ts +6 -0
  80. package/dist/embedding/settings.d.ts.map +1 -0
  81. package/dist/embedding/settings.js +69 -0
  82. package/dist/embedding/settings.js.map +1 -0
  83. package/dist/embedding/setup-lock.d.ts +7 -0
  84. package/dist/embedding/setup-lock.d.ts.map +1 -0
  85. package/dist/embedding/setup-lock.js +35 -0
  86. package/dist/embedding/setup-lock.js.map +1 -0
  87. package/dist/embedding/setup-service.d.ts +53 -0
  88. package/dist/embedding/setup-service.d.ts.map +1 -0
  89. package/dist/embedding/setup-service.js +184 -0
  90. package/dist/embedding/setup-service.js.map +1 -0
  91. package/dist/embedding/store.d.ts +3 -1
  92. package/dist/embedding/store.d.ts.map +1 -1
  93. package/dist/embedding/store.js +124 -11
  94. package/dist/embedding/store.js.map +1 -1
  95. package/dist/embedding/types.d.ts +31 -2
  96. package/dist/embedding/types.d.ts.map +1 -1
  97. package/dist/mcp/bounded-stdio-transport.d.ts +3 -10
  98. package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
  99. package/dist/mcp/bounded-stdio-transport.js +2 -89
  100. package/dist/mcp/bounded-stdio-transport.js.map +1 -1
  101. package/dist/mcp/request-deadline.d.ts +51 -0
  102. package/dist/mcp/request-deadline.d.ts.map +1 -0
  103. package/dist/mcp/request-deadline.js +155 -0
  104. package/dist/mcp/request-deadline.js.map +1 -0
  105. package/dist/mcp/runtime-owner.d.ts.map +1 -1
  106. package/dist/mcp/runtime-owner.js +2 -3
  107. package/dist/mcp/runtime-owner.js.map +1 -1
  108. package/dist/mcp/server.d.ts +2 -0
  109. package/dist/mcp/server.d.ts.map +1 -1
  110. package/dist/mcp/server.js +48 -20
  111. package/dist/mcp/server.js.map +1 -1
  112. package/dist/memory/scoped-memory.d.ts +1 -1
  113. package/dist/memory/scoped-memory.d.ts.map +1 -1
  114. package/dist/memory/scoped-memory.js +5 -1
  115. package/dist/memory/scoped-memory.js.map +1 -1
  116. package/dist/server/http.d.ts +1 -1
  117. package/dist/server/http.d.ts.map +1 -1
  118. package/dist/server/http.js +6 -3
  119. package/dist/server/http.js.map +1 -1
  120. package/dist/skills/discovery-service.d.ts.map +1 -1
  121. package/dist/skills/discovery-service.js +10 -8
  122. package/dist/skills/discovery-service.js.map +1 -1
  123. package/dist/skills/find.d.ts +1 -0
  124. package/dist/skills/find.d.ts.map +1 -1
  125. package/dist/skills/find.js +1 -0
  126. package/dist/skills/find.js.map +1 -1
  127. package/dist/skills/materialization-authority.d.ts +1 -1
  128. package/dist/skills/materialization-authority.d.ts.map +1 -1
  129. package/dist/skills/materialization-authority.js +2 -2
  130. package/dist/skills/materialization-authority.js.map +1 -1
  131. package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -1
  132. package/dist/skills/providers/skills-sh-compat.js +4 -2
  133. package/dist/skills/providers/skills-sh-compat.js.map +1 -1
  134. package/dist/skills/providers/skills-sh-v1.d.ts +2 -2
  135. package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -1
  136. package/dist/skills/providers/skills-sh-v1.js +22 -4
  137. package/dist/skills/providers/skills-sh-v1.js.map +1 -1
  138. package/dist/skills/source/github-fetcher.d.ts.map +1 -1
  139. package/dist/skills/source/github-fetcher.js +8 -4
  140. package/dist/skills/source/github-fetcher.js.map +1 -1
  141. package/dist/skills/types.d.ts +3 -2
  142. package/dist/skills/types.d.ts.map +1 -1
  143. package/docs/agent-file.md +72 -0
  144. package/docs/agent-gateway.md +104 -0
  145. package/docs/architecture.md +12 -0
  146. package/docs/cli-contract.md +13 -0
  147. package/docs/client-compatibility.md +298 -0
  148. package/docs/database.md +11 -0
  149. package/docs/execution-ledger.md +89 -0
  150. package/docs/release-notes-0.1.18.md +103 -0
  151. package/docs/retrieval-evaluation.md +10 -0
  152. package/docs/security.md +11 -0
  153. package/docs/sqlite-driver-adr.md +8 -0
  154. package/migrations/022_embedding_setup_v2.sql +236 -0
  155. package/migrations/down/022_embedding_setup_v2.sql +133 -0
  156. package/package.json +4 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-transformers-provider.js","sourceRoot":"","sources":["../../src/embedding/local-transformers-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type VerifiedModelManifest } from './model-manifest.js';
2
+ import type { LocalEmbeddingPreset } from './presets/manifest.js';
3
+ export interface ModelDownloadProgress {
4
+ readonly file: string;
5
+ readonly completedBytes: number;
6
+ readonly totalBytes: number;
7
+ }
8
+ export interface DownloadedModel {
9
+ readonly directory: string;
10
+ readonly manifest: VerifiedModelManifest;
11
+ }
12
+ export interface ModelDownloader {
13
+ download(preset: LocalEmbeddingPreset, stagingDirectory: string, options?: {
14
+ readonly signal?: AbortSignal;
15
+ readonly onProgress?: (progress: ModelDownloadProgress) => void;
16
+ }): Promise<DownloadedModel>;
17
+ }
18
+ type HubDownloadFile = (params: {
19
+ repo: {
20
+ type: 'model';
21
+ name: string;
22
+ };
23
+ path: string;
24
+ revision: string;
25
+ xet: boolean;
26
+ fetch?: typeof fetch;
27
+ }) => Promise<Blob | null>;
28
+ export declare function createHuggingFaceModelDownloader(options?: {
29
+ readonly downloadFile?: HubDownloadFile;
30
+ }): ModelDownloader;
31
+ export {};
32
+ //# sourceMappingURL=model-download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-download.d.ts","sourceRoot":"","sources":["../../src/embedding/model-download.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+C,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAAC;CAC1C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CACN,MAAM,EAAE,oBAAoB,EAC5B,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,IAAI,CAAA;KAAE,GAC3G,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7B;AAED,KAAK,eAAe,GAAG,CAAC,MAAM,EAAE;IAC9B,IAAI,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AAM3B,wBAAgB,gCAAgC,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,eAAe,CAAA;CAAO,GAAG,eAAe,CA6B3H"}
@@ -0,0 +1,41 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { KiokukoError } from '../errors.js';
4
+ import { createModelManifest, validatePresetManifest } from './model-manifest.js';
5
+ function aborted(signal) {
6
+ if (signal?.aborted)
7
+ throw new KiokukoError('SERVICE_UNAVAILABLE', 'Embedding model download was interrupted');
8
+ }
9
+ export function createHuggingFaceModelDownloader(options = {}) {
10
+ return {
11
+ download: async (preset, stagingDirectory, downloadOptions = {}) => {
12
+ validatePresetManifest(preset);
13
+ const downloadFile = options.downloadFile ?? (await import('@huggingface/hub')).downloadFile;
14
+ const manifest = createModelManifest(preset);
15
+ await mkdir(stagingDirectory, { recursive: true, mode: 0o700 });
16
+ let completedBytes = 0;
17
+ for (const file of preset.files) {
18
+ aborted(downloadOptions.signal);
19
+ const blob = await downloadFile({
20
+ repo: { type: 'model', name: preset.artifactRepository },
21
+ path: file.path,
22
+ revision: preset.revision,
23
+ xet: true,
24
+ });
25
+ if (blob === null)
26
+ throw new KiokukoError('NOT_FOUND', `Pinned model artifact is unavailable: ${file.path}`);
27
+ const bytes = new Uint8Array(await blob.arrayBuffer());
28
+ aborted(downloadOptions.signal);
29
+ if (bytes.byteLength !== file.size)
30
+ throw new KiokukoError('INTEGRITY_ERROR', `Downloaded model artifact size mismatch: ${file.path}`);
31
+ const target = path.join(stagingDirectory, file.path);
32
+ await mkdir(path.dirname(target), { recursive: true, mode: 0o700 });
33
+ await writeFile(target, bytes, { mode: 0o600, flag: 'wx' });
34
+ completedBytes += bytes.byteLength;
35
+ downloadOptions.onProgress?.({ file: file.path, completedBytes, totalBytes: manifest.totalBytes });
36
+ }
37
+ return { directory: stagingDirectory, manifest };
38
+ },
39
+ };
40
+ }
41
+ //# sourceMappingURL=model-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-download.js","sourceRoot":"","sources":["../../src/embedding/model-download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAA8B,MAAM,qBAAqB,CAAC;AA8B9G,SAAS,OAAO,CAAC,MAA+B;IAC9C,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,UAAuD,EAAE;IACxG,OAAO;QACL,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,GAAG,EAAE,EAAE,EAAE;YACjE,sBAAsB,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,YAA+B,CAAC;YAChH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC;oBAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,kBAAkB,EAAE;oBACxD,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,GAAG,EAAE,IAAI;iBACV,CAAC,CAAC;gBACH,IAAI,IAAI,KAAK,IAAI;oBAAE,MAAM,IAAI,YAAY,CAAC,WAAW,EAAE,yCAAyC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7G,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBACvD,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,4CAA4C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvI,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpE,MAAM,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC;gBACnC,eAAe,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACrG,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC;QACnD,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type PathEnvironment } from '../config/paths.js';
2
+ import { type ModelDownloader, type ModelDownloadProgress } from './model-download.js';
3
+ import type { LocalEmbeddingPreset } from './presets/manifest.js';
4
+ export interface InstalledModel {
5
+ readonly installation: 'installed' | 'reused';
6
+ readonly directory: string;
7
+ readonly relativePath: string;
8
+ readonly totalBytes: number;
9
+ readonly manifestHash: string;
10
+ }
11
+ export interface InstallModelOptions extends PathEnvironment {
12
+ readonly downloader?: ModelDownloader;
13
+ readonly signal?: AbortSignal;
14
+ readonly onProgress?: (progress: ModelDownloadProgress) => void;
15
+ }
16
+ export declare function installEmbeddingModel(preset: LocalEmbeddingPreset, options?: InstallModelOptions): Promise<InstalledModel>;
17
+ //# sourceMappingURL=model-installation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-installation.d.ts","sourceRoot":"","sources":["../../src/embedding/model-installation.ts"],"names":[],"mappings":"AAIA,OAAO,EAA+B,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEvF,OAAO,EAAoC,KAAK,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACzH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACjE;AAkBD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,cAAc,CAAC,CA0CzB"}
@@ -0,0 +1,71 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { chmod, lstat, mkdir, rename, rm, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { KiokukoError } from '../errors.js';
5
+ import { getEmbeddingPresetDirectory } from '../config/paths.js';
6
+ import { assertNoUnexpectedModelFiles, MODEL_MANIFEST_FILENAME, serializeModelManifest, verifyModelDirectory } from './model-manifest.js';
7
+ import { createHuggingFaceModelDownloader } from './model-download.js';
8
+ function relativeModelPath(preset) {
9
+ return path.posix.join('models', 'embeddings', preset.id, preset.revision);
10
+ }
11
+ async function existingDirectory(pathname) {
12
+ try {
13
+ const stat = await lstat(pathname);
14
+ if (!stat.isDirectory() || stat.isSymbolicLink())
15
+ throw new KiokukoError('SECURITY_REJECTION', 'Existing model installation is not a private directory');
16
+ return true;
17
+ }
18
+ catch (error) {
19
+ if (error instanceof KiokukoError)
20
+ throw error;
21
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT')
22
+ return false;
23
+ throw error;
24
+ }
25
+ }
26
+ export async function installEmbeddingModel(preset, options = {}) {
27
+ const downloader = options.downloader ?? createHuggingFaceModelDownloader();
28
+ const finalDirectory = getEmbeddingPresetDirectory(preset.id, preset.revision, options);
29
+ if (await existingDirectory(finalDirectory)) {
30
+ const manifest = await verifyModelDirectory(finalDirectory, preset);
31
+ await assertNoUnexpectedModelFiles(finalDirectory, preset);
32
+ return { installation: 'reused', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: manifest.totalBytes, manifestHash: manifest.artifactManifestHash };
33
+ }
34
+ const stagingParent = path.dirname(path.dirname(finalDirectory));
35
+ const stagingDirectory = path.join(stagingParent, '.staging', randomUUID());
36
+ await mkdir(stagingDirectory, { recursive: true, mode: 0o700 });
37
+ try {
38
+ const downloaded = await downloader.download(preset, stagingDirectory, {
39
+ ...(options.signal === undefined ? {} : { signal: options.signal }),
40
+ ...(options.onProgress === undefined ? {} : { onProgress: options.onProgress }),
41
+ });
42
+ const manifest = await verifyModelDirectory(downloaded.directory, preset);
43
+ await assertNoUnexpectedModelFiles(downloaded.directory, preset);
44
+ await writeFile(path.join(downloaded.directory, MODEL_MANIFEST_FILENAME), serializeModelManifest(manifest), { mode: 0o600, flag: 'wx' });
45
+ await chmod(downloaded.directory, 0o700);
46
+ await mkdir(path.dirname(finalDirectory), { recursive: true, mode: 0o700 });
47
+ if (await existingDirectory(finalDirectory)) {
48
+ const existing = await verifyModelDirectory(finalDirectory, preset);
49
+ if (existing.artifactManifestHash !== manifest.artifactManifestHash)
50
+ throw new KiokukoError('CONFLICT', 'A different model installation already exists for this preset revision');
51
+ return { installation: 'reused', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: existing.totalBytes, manifestHash: existing.artifactManifestHash };
52
+ }
53
+ try {
54
+ await rename(downloaded.directory, finalDirectory);
55
+ return { installation: 'installed', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: manifest.totalBytes, manifestHash: manifest.artifactManifestHash };
56
+ }
57
+ catch (error) {
58
+ if (error instanceof Error && 'code' in error && error.code === 'ENOTEMPTY'
59
+ && await existingDirectory(finalDirectory)) {
60
+ const existing = await verifyModelDirectory(finalDirectory, preset);
61
+ return { installation: 'reused', directory: finalDirectory, relativePath: relativeModelPath(preset), totalBytes: existing.totalBytes, manifestHash: existing.artifactManifestHash };
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ catch (error) {
67
+ await rm(stagingDirectory, { recursive: true, force: true }).catch(() => undefined);
68
+ throw error;
69
+ }
70
+ }
71
+ //# sourceMappingURL=model-installation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-installation.js","sourceRoot":"","sources":["../../src/embedding/model-installation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { LocalEmbeddingPreset, LocalEmbeddingPresetFile } from './presets/manifest.js';
2
+ export declare const MODEL_MANIFEST_FILENAME = "kiokuko-model-manifest.json";
3
+ export declare const MAX_MODEL_BYTES: number;
4
+ export interface VerifiedModelManifest {
5
+ readonly schemaVersion: 1;
6
+ readonly presetId: 'local-small';
7
+ readonly repositoryId: string;
8
+ readonly revision: string;
9
+ readonly artifactManifestHash: string;
10
+ readonly files: readonly LocalEmbeddingPresetFile[];
11
+ readonly totalBytes: number;
12
+ }
13
+ export declare function validatePresetManifest(preset: LocalEmbeddingPreset): void;
14
+ export declare function createModelManifest(preset: LocalEmbeddingPreset): VerifiedModelManifest;
15
+ export declare function serializeModelManifest(manifest: VerifiedModelManifest): string;
16
+ export declare function verifyModelDirectory(directory: string, preset: LocalEmbeddingPreset): Promise<VerifiedModelManifest>;
17
+ export declare function assertNoUnexpectedModelFiles(directory: string, preset: LocalEmbeddingPreset): Promise<void>;
18
+ //# sourceMappingURL=model-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-manifest.d.ts","sourceRoot":"","sources":["../../src/embedding/model-manifest.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAG5F,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AACrE,eAAO,MAAM,eAAe,QAAoB,CAAC;AAEjD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAUD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAuBzE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,qBAAqB,CAYvF;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAE9E;AAED,wBAAsB,oBAAoB,CACxC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAUhC;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -0,0 +1,86 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lstat, readdir, readFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { KiokukoError } from '../errors.js';
5
+ import { canonicalJson } from '../serialization/validate.js';
6
+ import { presetManifestHash } from './presets/manifest.js';
7
+ export const MODEL_MANIFEST_FILENAME = 'kiokuko-model-manifest.json';
8
+ export const MAX_MODEL_BYTES = 512 * 1024 * 1024;
9
+ function invalid(message) {
10
+ throw new KiokukoError('VALIDATION_ERROR', message);
11
+ }
12
+ function hashFile(bytes) {
13
+ return createHash('sha256').update(bytes).digest('hex');
14
+ }
15
+ export function validatePresetManifest(preset) {
16
+ if (preset.id !== 'local-small' || preset.schemaVersion !== 1
17
+ || preset.sourceModel !== 'intfloat/multilingual-e5-small'
18
+ || preset.artifactRepository !== 'Xenova/multilingual-e5-small'
19
+ || !/^[0-9a-f]{40}$/u.test(preset.revision)
20
+ || preset.dimensions !== 384 || preset.maximumTokens !== 512
21
+ || preset.dtype !== 'q8' || preset.pooling !== 'mean' || preset.normalize !== true
22
+ || preset.distanceMetric !== 'cosine' || preset.distanceCeiling <= 0 || preset.distanceCeiling >= 2
23
+ || preset.inputContract !== 'e5-query-passage-v1' || preset.queryPrefix !== 'query: '
24
+ || preset.documentPrefix !== 'passage: ' || !/^[0-9]+\.[0-9]+\.[0-9]+$/u.test(preset.transformersJsVersion)) {
25
+ invalid('Embedding preset manifest is invalid');
26
+ }
27
+ const paths = new Set();
28
+ let totalBytes = 0;
29
+ for (const file of preset.files) {
30
+ if (paths.has(file.path) || file.path.length === 0 || file.path.startsWith('/')
31
+ || file.path.split('/').some((part) => part === '' || part === '.' || part === '..')
32
+ || !Number.isSafeInteger(file.size) || file.size <= 0
33
+ || !/^[0-9a-f]{64}$/u.test(file.sha256))
34
+ invalid('Embedding preset file manifest is invalid');
35
+ paths.add(file.path);
36
+ totalBytes += file.size;
37
+ }
38
+ if (preset.files.length === 0 || totalBytes > MAX_MODEL_BYTES)
39
+ invalid('Embedding preset file size is unsupported');
40
+ }
41
+ export function createModelManifest(preset) {
42
+ validatePresetManifest(preset);
43
+ const totalBytes = preset.files.reduce((total, file) => total + file.size, 0);
44
+ return Object.freeze({
45
+ schemaVersion: 1,
46
+ presetId: preset.id,
47
+ repositoryId: preset.artifactRepository,
48
+ revision: preset.revision,
49
+ artifactManifestHash: presetManifestHash(preset),
50
+ files: Object.freeze(preset.files.map((file) => Object.freeze({ ...file }))),
51
+ totalBytes,
52
+ });
53
+ }
54
+ export function serializeModelManifest(manifest) {
55
+ return `${canonicalJson(manifest)}\n`;
56
+ }
57
+ export async function verifyModelDirectory(directory, preset) {
58
+ const expected = createModelManifest(preset);
59
+ for (const file of expected.files) {
60
+ const filePath = path.join(directory, file.path);
61
+ const stat = await lstat(filePath);
62
+ if (!stat.isFile() || stat.isSymbolicLink())
63
+ throw new KiokukoError('SECURITY_REJECTION', `Model artifact is not a regular file: ${file.path}`);
64
+ if (stat.size !== file.size)
65
+ throw new KiokukoError('INTEGRITY_ERROR', `Model artifact size mismatch: ${file.path}`);
66
+ if (hashFile(await readFile(filePath)) !== file.sha256)
67
+ throw new KiokukoError('SECURITY_REJECTION', `Model artifact hash mismatch: ${file.path}`);
68
+ }
69
+ return expected;
70
+ }
71
+ export async function assertNoUnexpectedModelFiles(directory, preset) {
72
+ const allowed = new Set([...preset.files.map((file) => file.path), MODEL_MANIFEST_FILENAME]);
73
+ const walk = async (current, prefix) => {
74
+ for (const entry of await readdir(current, { withFileTypes: true })) {
75
+ const relative = prefix.length === 0 ? entry.name : `${prefix}/${entry.name}`;
76
+ if (entry.isSymbolicLink())
77
+ throw new KiokukoError('SECURITY_REJECTION', `Model directory contains a symbolic link: ${relative}`);
78
+ if (entry.isDirectory())
79
+ await walk(path.join(current, entry.name), relative);
80
+ else if (!allowed.has(relative))
81
+ throw new KiokukoError('SECURITY_REJECTION', `Model directory contains an unexpected file: ${relative}`);
82
+ }
83
+ };
84
+ await walk(directory, '');
85
+ }
86
+ //# sourceMappingURL=model-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-manifest.js","sourceRoot":"","sources":["../../src/embedding/model-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { LocalEmbeddingPreset } from './manifest.js';
2
+ /**
3
+ * The only public local model preset. Every artifact coordinate is immutable;
4
+ * model installation code must consume this value rather than user input.
5
+ */
6
+ export declare const LOCAL_SMALL_PRESET: LocalEmbeddingPreset;
7
+ export declare const LOCAL_SMALL_PRESET_MANIFEST_HASH = "85d724217ffdda4333b6c2892f5138754d716f62e08a82cb0093ca5baca24fe4";
8
+ //# sourceMappingURL=local-small.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-small.d.ts","sourceRoot":"","sources":["../../../src/embedding/presets/local-small.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,oBA4D/B,CAAC;AAEH,eAAO,MAAM,gCAAgC,qEACuB,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The only public local model preset. Every artifact coordinate is immutable;
3
+ * model installation code must consume this value rather than user input.
4
+ */
5
+ export const LOCAL_SMALL_PRESET = Object.freeze({
6
+ id: 'local-small',
7
+ schemaVersion: 1,
8
+ displayName: 'multilingual-e5-small',
9
+ sourceModel: 'intfloat/multilingual-e5-small',
10
+ artifactRepository: 'Xenova/multilingual-e5-small',
11
+ revision: 'ae61bf0193ce3851dc8a45147e459b04ed783d8a',
12
+ transformersJsVersion: '4.2.0',
13
+ dimensions: 384,
14
+ maximumTokens: 512,
15
+ dtype: 'q8',
16
+ pooling: 'mean',
17
+ normalize: true,
18
+ distanceMetric: 'cosine',
19
+ distanceCeiling: 0.8,
20
+ inputContract: 'e5-query-passage-v1',
21
+ queryPrefix: 'query: ',
22
+ documentPrefix: 'passage: ',
23
+ files: Object.freeze([
24
+ {
25
+ path: 'README.md',
26
+ size: 553,
27
+ sha256: '000754b7b0eb4d281504ade130052d4ce887d132bb5c8a77ed53f1926b910f8b',
28
+ },
29
+ {
30
+ path: 'config.json',
31
+ size: 658,
32
+ sha256: 'cb99455288675345e1a4f411438d5d0adbba5fbd3a67ea4fb03c015433b996c1',
33
+ },
34
+ {
35
+ path: 'quant_config.json',
36
+ size: 674,
37
+ sha256: '59d175f15264115f18c698d76e443b5d49fc6c8c599911c421405ef4f236e87d',
38
+ },
39
+ {
40
+ path: 'tokenizer.json',
41
+ size: 17_082_730,
42
+ sha256: '0b44a9d7b51c3c62626640cda0e2c2f70fdacdc25bbbd68038369d14ebdf4c39',
43
+ },
44
+ {
45
+ path: 'tokenizer_config.json',
46
+ size: 443,
47
+ sha256: 'a1d6bc8734a6f635dc158508bef000f8e2e5a759c7d92f984b2c86e5ff53425b',
48
+ },
49
+ {
50
+ path: 'special_tokens_map.json',
51
+ size: 167,
52
+ sha256: 'd05497f1da52c5e09554c0cd874037a083e1dc1b9cfd48034d1c717f1afc07a7',
53
+ },
54
+ {
55
+ path: 'sentencepiece.bpe.model',
56
+ size: 5_069_051,
57
+ sha256: 'cfc8146abe2a0488e9e2a0c56de7952f7c11ab059eca145a0a727afce0db2865',
58
+ },
59
+ {
60
+ path: 'onnx/model_quantized.onnx',
61
+ size: 118_308_185,
62
+ sha256: 'f80102d3f2a1229f387d3c81909990d8945513e347b0eab049f7de3c6f98c193',
63
+ },
64
+ ]),
65
+ });
66
+ export const LOCAL_SMALL_PRESET_MANIFEST_HASH = '85d724217ffdda4333b6c2892f5138754d716f62e08a82cb0093ca5baca24fe4';
67
+ //# sourceMappingURL=local-small.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-small.js","sourceRoot":"","sources":["../../../src/embedding/presets/local-small.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAyB,MAAM,CAAC,MAAM,CAAC;IACpE,EAAE,EAAE,aAAa;IACjB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,uBAAuB;IACpC,WAAW,EAAE,gCAAgC;IAC7C,kBAAkB,EAAE,8BAA8B;IAClD,QAAQ,EAAE,0CAA0C;IACpD,qBAAqB,EAAE,OAAO;IAC9B,UAAU,EAAE,GAAG;IACf,aAAa,EAAE,GAAG;IAClB,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,MAAM;IACf,SAAS,EAAE,IAAI;IACf,cAAc,EAAE,QAAQ;IACxB,eAAe,EAAE,GAAG;IACpB,aAAa,EAAE,qBAAqB;IACpC,WAAW,EAAE,SAAS;IACtB,cAAc,EAAE,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB;YACE,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,kEAAkE;SAC3E;QACD;YACE,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,kEAAkE;SAC3E;QACD;YACE,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,kEAAkE;SAC3E;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,kEAAkE;SAC3E;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,kEAAkE;SAC3E;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,GAAG;YACT,MAAM,EAAE,kEAAkE;SAC3E;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,kEAAkE;SAC3E;QACD;YACE,IAAI,EAAE,2BAA2B;YACjC,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,kEAAkE;SAC3E;KACF,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gCAAgC,GAC3C,kEAAkE,CAAC"}
@@ -0,0 +1,27 @@
1
+ export interface LocalEmbeddingPresetFile {
2
+ readonly path: string;
3
+ readonly size: number;
4
+ readonly sha256: string;
5
+ }
6
+ export interface LocalEmbeddingPreset {
7
+ readonly id: 'local-small';
8
+ readonly schemaVersion: 1;
9
+ readonly displayName: string;
10
+ readonly sourceModel: 'intfloat/multilingual-e5-small';
11
+ readonly artifactRepository: 'Xenova/multilingual-e5-small';
12
+ readonly revision: string;
13
+ readonly transformersJsVersion: string;
14
+ readonly dimensions: 384;
15
+ readonly maximumTokens: 512;
16
+ readonly dtype: 'q8';
17
+ readonly pooling: 'mean';
18
+ readonly normalize: true;
19
+ readonly distanceMetric: 'cosine';
20
+ readonly distanceCeiling: number;
21
+ readonly inputContract: 'e5-query-passage-v1';
22
+ readonly queryPrefix: 'query: ';
23
+ readonly documentPrefix: 'passage: ';
24
+ readonly files: readonly LocalEmbeddingPresetFile[];
25
+ }
26
+ export declare function presetManifestHash(preset: LocalEmbeddingPreset): string;
27
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/embedding/presets/manifest.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,gCAAgC,CAAC;IACvD,QAAQ,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAC;CACrD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAEvE"}
@@ -0,0 +1,5 @@
1
+ import { canonicalContentHash } from '../../serialization/validate.js';
2
+ export function presetManifestHash(preset) {
3
+ return canonicalContentHash(preset);
4
+ }
5
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/embedding/presets/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AA6BvE,MAAM,UAAU,kBAAkB,CAAC,MAA4B;IAC7D,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
@@ -1,6 +1,10 @@
1
- import type { EmbeddingConfig, EmbeddingProfile, EmbeddingProfileIdentity, EnabledEmbeddingConfig } from './types.js';
1
+ import type { EmbeddingConfig, EmbeddingProfile, EmbeddingProfileIdentity, EnabledEmbeddingConfig, LocalEmbeddingProfile, LocalEmbeddingProfileIdentity } from './types.js';
2
+ import type { LocalEmbeddingPreset } from './presets/manifest.js';
2
3
  export declare function endpointFingerprint(endpoint: string): string;
3
- export declare function embeddingProfileId(identity: EmbeddingProfileIdentity): string;
4
+ export declare function embeddingProfileId(identity: EmbeddingProfileIdentity | LocalEmbeddingProfileIdentity): string;
5
+ export declare function localEmbeddingProfileId(identity: LocalEmbeddingProfileIdentity): string;
4
6
  export declare function createEmbeddingProfileIdentity(config: EnabledEmbeddingConfig): EmbeddingProfileIdentity;
5
7
  export declare function createEmbeddingProfile(config: EmbeddingConfig): EmbeddingProfile;
8
+ export declare function createLocalEmbeddingProfileIdentity(preset: LocalEmbeddingPreset, inferenceEngineVersion?: string): LocalEmbeddingProfileIdentity;
9
+ export declare function createLocalEmbeddingProfile(preset: LocalEmbeddingPreset, inferenceEngineVersion?: string): LocalEmbeddingProfile;
6
10
  //# sourceMappingURL=profile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/embedding/profile.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAMtH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,MAAM,CAE7E;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,sBAAsB,GAAG,wBAAwB,CAYvG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAIhF"}
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/embedding/profile.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC9B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAOlE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,wBAAwB,GAAG,6BAA6B,GAAG,MAAM,CAE7G;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,6BAA6B,GAAG,MAAM,CAEvF;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,sBAAsB,GAAG,wBAAwB,CAYvG;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,gBAAgB,CAIhF;AAED,wBAAgB,mCAAmC,CACjD,MAAM,EAAE,oBAAoB,EAC5B,sBAAsB,SAA+B,GACpD,6BAA6B,CAwB/B;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,oBAAoB,EAC5B,sBAAsB,SAA+B,GACpD,qBAAqB,CAMvB"}
@@ -1,6 +1,7 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { canonicalJson } from '../serialization/validate.js';
3
3
  import { requireEnabledEmbeddingConfig } from './config.js';
4
+ import { presetManifestHash } from './presets/manifest.js';
4
5
  function sha256(value) {
5
6
  return createHash('sha256').update(value).digest('hex');
6
7
  }
@@ -10,6 +11,9 @@ export function endpointFingerprint(endpoint) {
10
11
  export function embeddingProfileId(identity) {
11
12
  return sha256(canonicalJson(identity));
12
13
  }
14
+ export function localEmbeddingProfileId(identity) {
15
+ return sha256(canonicalJson(identity));
16
+ }
13
17
  export function createEmbeddingProfileIdentity(config) {
14
18
  return {
15
19
  schemaVersion: 1,
@@ -28,4 +32,36 @@ export function createEmbeddingProfile(config) {
28
32
  const identity = createEmbeddingProfileIdentity(enabled);
29
33
  return Object.freeze({ profileId: embeddingProfileId(identity), identity: Object.freeze(identity) });
30
34
  }
35
+ export function createLocalEmbeddingProfileIdentity(preset, inferenceEngineVersion = preset.transformersJsVersion) {
36
+ return {
37
+ schemaVersion: 2,
38
+ providerKind: 'local-transformers',
39
+ presetId: preset.id,
40
+ sourceModel: preset.sourceModel,
41
+ artifactRepository: preset.artifactRepository,
42
+ modelRevision: preset.revision,
43
+ artifactManifestHash: presetManifestHash(preset),
44
+ inferenceEngine: 'transformers-js',
45
+ inferenceEngineVersion,
46
+ dtype: preset.dtype,
47
+ pooling: preset.pooling,
48
+ normalize: preset.normalize,
49
+ maximumTokens: preset.maximumTokens,
50
+ dimensions: preset.dimensions,
51
+ distanceMetric: preset.distanceMetric,
52
+ distanceCeiling: preset.distanceCeiling,
53
+ inputContract: preset.inputContract,
54
+ documentTemplateVersion: 2,
55
+ queryTemplateVersion: 2,
56
+ queryPrefix: preset.queryPrefix,
57
+ documentPrefix: preset.documentPrefix,
58
+ };
59
+ }
60
+ export function createLocalEmbeddingProfile(preset, inferenceEngineVersion = preset.transformersJsVersion) {
61
+ const identity = createLocalEmbeddingProfileIdentity(preset, inferenceEngineVersion);
62
+ return Object.freeze({
63
+ profileId: localEmbeddingProfileId(identity),
64
+ identity: Object.freeze(identity),
65
+ });
66
+ }
31
67
  //# sourceMappingURL=profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/embedding/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAG5D,SAAS,MAAM,CAAC,KAA0B;IACxC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAkC;IACnE,OAAO,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAA8B;IAC3E,OAAO;QACL,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC,QAAQ;QAC7B,mBAAmB,EAAE,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;QACxD,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,cAAc,EAAE,QAAQ;QACxB,uBAAuB,EAAE,CAAC;QAC1B,oBAAoB,EAAE,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAuB;IAC5D,MAAM,OAAO,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACvG,CAAC"}
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/embedding/profile.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { SqliteDatabase } from '../db/adapter.js';
2
2
  export declare const QUERY_TEMPLATE_VERSION: 1;
3
+ export declare const QUERY_TEMPLATE_VERSION_V2: 2;
4
+ export declare const EMBEDDING_QUERY_INPUT_CONTRACT: "e5-query-passage-v1";
3
5
  export declare const MAX_QUERY_TEXT_BYTES: number;
4
6
  export declare const QUERY_EMBEDDING_CACHE_LIMIT = 512;
5
7
  export interface StoredQueryEmbedding {
@@ -23,6 +25,10 @@ export interface QueryEmbeddingWriteOptions {
23
25
  export declare function normalizeEmbeddingQuery(value: string): string;
24
26
  /** Hash only the canonical query template; the raw query is never stored. */
25
27
  export declare function queryEmbeddingHash(value: string): string;
28
+ export declare function normalizeCanonicalEmbeddingQuery(value: string): string;
29
+ export declare function renderEmbeddingQueryInput(value: string, prefix?: string): string;
30
+ /** Hash the complete v2 provider input contract without storing raw query text. */
31
+ export declare function queryEmbeddingHashV2(value: string): string;
26
32
  export declare const embeddingQueryHash: typeof queryEmbeddingHash;
27
33
  export declare function readQueryEmbeddingInTransaction(database: SqliteDatabase, input: {
28
34
  profileId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"query-cache.d.ts","sourceRoot":"","sources":["../../src/embedding/query-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,kBAAkB,CAAC;AAKlE,eAAO,MAAM,sBAAsB,EAAG,CAAU,CAAC;AACjD,eAAO,MAAM,oBAAoB,QAAY,CAAC;AAC9C,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAM/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAqCD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,eAAO,MAAM,kBAAkB,2BAAqB,CAAC;AA2DrD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,oBAAoB,GAAG,SAAS,CAoBlC;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,oBAAoB,GAAG,SAAS,CAElC;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CA0BtB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CAEtB"}
1
+ {"version":3,"file":"query-cache.d.ts","sourceRoot":"","sources":["../../src/embedding/query-cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,kBAAkB,CAAC;AAKlE,eAAO,MAAM,sBAAsB,EAAG,CAAU,CAAC;AACjD,eAAO,MAAM,yBAAyB,EAAG,CAAU,CAAC;AACpD,eAAO,MAAM,8BAA8B,EAAG,qBAA8B,CAAC;AAC7E,eAAO,MAAM,oBAAoB,QAAY,CAAC;AAC9C,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAM/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAqCD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,SAAY,GAAG,MAAM,CAInF;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ1D;AAED,eAAO,MAAM,kBAAkB,2BAAqB,CAAC;AA2DrD,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,oBAAoB,GAAG,SAAS,CAoBlC;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,oBAAoB,GAAG,SAAS,CAElC;AAED,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CA0BtB;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CAEtB"}
@@ -5,6 +5,8 @@ import { KiokukoError } from '../errors.js';
5
5
  import { readEmbeddingProfile, readEmbeddingRuntimeState } from './store.js';
6
6
  import { decodeVector, encodeVector, hashVectorBytes } from './vector.js';
7
7
  export const QUERY_TEMPLATE_VERSION = 1;
8
+ export const QUERY_TEMPLATE_VERSION_V2 = 2;
9
+ export const EMBEDDING_QUERY_INPUT_CONTRACT = 'e5-query-passage-v1';
8
10
  export const MAX_QUERY_TEXT_BYTES = 32 * 1024;
9
11
  export const QUERY_EMBEDDING_CACHE_LIMIT = 512;
10
12
  const HASH_PATTERN = /^[0-9a-f]{64}$/u;
@@ -41,6 +43,25 @@ export function normalizeEmbeddingQuery(value) {
41
43
  export function queryEmbeddingHash(value) {
42
44
  return canonicalContentHash({ templateVersion: QUERY_TEMPLATE_VERSION, text: canonicalQueryText(value) });
43
45
  }
46
+ export function normalizeCanonicalEmbeddingQuery(value) {
47
+ return canonicalQueryText(value);
48
+ }
49
+ export function renderEmbeddingQueryInput(value, prefix = 'query: ') {
50
+ const normalized = normalizeCanonicalEmbeddingQuery(value);
51
+ if (prefix !== 'query: ')
52
+ invalid('Embedding provider query prefix is invalid');
53
+ return `${prefix}${normalized}`;
54
+ }
55
+ /** Hash the complete v2 provider input contract without storing raw query text. */
56
+ export function queryEmbeddingHashV2(value) {
57
+ const normalized = normalizeCanonicalEmbeddingQuery(value);
58
+ return canonicalContentHash({
59
+ contract: EMBEDDING_QUERY_INPUT_CONTRACT,
60
+ prefix: 'query: ',
61
+ templateVersion: QUERY_TEMPLATE_VERSION_V2,
62
+ text: normalized,
63
+ });
64
+ }
44
65
  export const embeddingQueryHash = queryEmbeddingHash;
45
66
  function storedTimestamp(value, label) {
46
67
  if (typeof value !== 'string')