@askdkc/kiokuko 0.2.6 → 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 (251) hide show
  1. package/README.ja.md +18 -0
  2. package/README.ko.md +17 -0
  3. package/README.md +23 -0
  4. package/README.zh-CN.md +16 -0
  5. package/dist/akinator/agent-task.d.ts +5 -0
  6. package/dist/akinator/agent-task.d.ts.map +1 -1
  7. package/dist/akinator/agent-task.js +98 -28
  8. package/dist/akinator/agent-task.js.map +1 -1
  9. package/dist/cli.d.ts +4 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +94 -8
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/doctor.d.ts +4 -0
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +46 -1
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/embeddings.d.ts +26 -0
  18. package/dist/commands/embeddings.d.ts.map +1 -0
  19. package/dist/commands/embeddings.js +190 -0
  20. package/dist/commands/embeddings.js.map +1 -0
  21. package/dist/commands/import.d.ts.map +1 -1
  22. package/dist/commands/import.js +7 -0
  23. package/dist/commands/import.js.map +1 -1
  24. package/dist/commands/use.d.ts.map +1 -1
  25. package/dist/commands/use.js +22 -8
  26. package/dist/commands/use.js.map +1 -1
  27. package/dist/config/paths.d.ts +5 -0
  28. package/dist/config/paths.d.ts.map +1 -1
  29. package/dist/config/paths.js +34 -0
  30. package/dist/config/paths.js.map +1 -1
  31. package/dist/context/broker.d.ts +3 -1
  32. package/dist/context/broker.d.ts.map +1 -1
  33. package/dist/context/broker.js +11 -7
  34. package/dist/context/broker.js.map +1 -1
  35. package/dist/context/delivery.d.ts.map +1 -1
  36. package/dist/context/delivery.js +5 -3
  37. package/dist/context/delivery.js.map +1 -1
  38. package/dist/context/ranking.d.ts +1 -1
  39. package/dist/context/ranking.d.ts.map +1 -1
  40. package/dist/context/ranking.js +1 -0
  41. package/dist/context/ranking.js.map +1 -1
  42. package/dist/context/scoped-broker.d.ts +4 -3
  43. package/dist/context/scoped-broker.d.ts.map +1 -1
  44. package/dist/context/scoped-broker.js +45 -7
  45. package/dist/context/scoped-broker.js.map +1 -1
  46. package/dist/context/selection-state.d.ts +12 -0
  47. package/dist/context/selection-state.d.ts.map +1 -1
  48. package/dist/context/selection-state.js +117 -7
  49. package/dist/context/selection-state.js.map +1 -1
  50. package/dist/db/capabilities.d.ts +8 -0
  51. package/dist/db/capabilities.d.ts.map +1 -1
  52. package/dist/db/capabilities.js +14 -0
  53. package/dist/db/capabilities.js.map +1 -1
  54. package/dist/db/connection.d.ts +7 -0
  55. package/dist/db/connection.d.ts.map +1 -1
  56. package/dist/db/connection.js +56 -0
  57. package/dist/db/connection.js.map +1 -1
  58. package/dist/db/migrate.d.ts.map +1 -1
  59. package/dist/db/migrate.js +3 -0
  60. package/dist/db/migrate.js.map +1 -1
  61. package/dist/embedding/backend.d.ts +27 -0
  62. package/dist/embedding/backend.d.ts.map +1 -0
  63. package/dist/embedding/backend.js +67 -0
  64. package/dist/embedding/backend.js.map +1 -0
  65. package/dist/embedding/config.d.ts +10 -0
  66. package/dist/embedding/config.d.ts.map +1 -0
  67. package/dist/embedding/config.js +142 -0
  68. package/dist/embedding/config.js.map +1 -0
  69. package/dist/embedding/diagnostics.d.ts +34 -0
  70. package/dist/embedding/diagnostics.d.ts.map +1 -0
  71. package/dist/embedding/diagnostics.js +263 -0
  72. package/dist/embedding/diagnostics.js.map +1 -0
  73. package/dist/embedding/document.d.ts +20 -0
  74. package/dist/embedding/document.d.ts.map +1 -0
  75. package/dist/embedding/document.js +122 -0
  76. package/dist/embedding/document.js.map +1 -0
  77. package/dist/embedding/javascript-backend.d.ts +11 -0
  78. package/dist/embedding/javascript-backend.d.ts.map +1 -0
  79. package/dist/embedding/javascript-backend.js +164 -0
  80. package/dist/embedding/javascript-backend.js.map +1 -0
  81. package/dist/embedding/jobs.d.ts +67 -0
  82. package/dist/embedding/jobs.d.ts.map +1 -0
  83. package/dist/embedding/jobs.js +259 -0
  84. package/dist/embedding/jobs.js.map +1 -0
  85. package/dist/embedding/local-model-loader.d.ts +24 -0
  86. package/dist/embedding/local-model-loader.d.ts.map +1 -0
  87. package/dist/embedding/local-model-loader.js +64 -0
  88. package/dist/embedding/local-model-loader.js.map +1 -0
  89. package/dist/embedding/local-transformers-provider.d.ts +17 -0
  90. package/dist/embedding/local-transformers-provider.d.ts.map +1 -0
  91. package/dist/embedding/local-transformers-provider.js +54 -0
  92. package/dist/embedding/local-transformers-provider.js.map +1 -0
  93. package/dist/embedding/model-download.d.ts +32 -0
  94. package/dist/embedding/model-download.d.ts.map +1 -0
  95. package/dist/embedding/model-download.js +41 -0
  96. package/dist/embedding/model-download.js.map +1 -0
  97. package/dist/embedding/model-installation.d.ts +17 -0
  98. package/dist/embedding/model-installation.d.ts.map +1 -0
  99. package/dist/embedding/model-installation.js +71 -0
  100. package/dist/embedding/model-installation.js.map +1 -0
  101. package/dist/embedding/model-manifest.d.ts +18 -0
  102. package/dist/embedding/model-manifest.d.ts.map +1 -0
  103. package/dist/embedding/model-manifest.js +86 -0
  104. package/dist/embedding/model-manifest.js.map +1 -0
  105. package/dist/embedding/openai-compatible-provider.d.ts +24 -0
  106. package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
  107. package/dist/embedding/openai-compatible-provider.js +330 -0
  108. package/dist/embedding/openai-compatible-provider.js.map +1 -0
  109. package/dist/embedding/presets/local-small.d.ts +8 -0
  110. package/dist/embedding/presets/local-small.d.ts.map +1 -0
  111. package/dist/embedding/presets/local-small.js +67 -0
  112. package/dist/embedding/presets/local-small.js.map +1 -0
  113. package/dist/embedding/presets/manifest.d.ts +27 -0
  114. package/dist/embedding/presets/manifest.d.ts.map +1 -0
  115. package/dist/embedding/presets/manifest.js +5 -0
  116. package/dist/embedding/presets/manifest.js.map +1 -0
  117. package/dist/embedding/profile.d.ts +10 -0
  118. package/dist/embedding/profile.d.ts.map +1 -0
  119. package/dist/embedding/profile.js +67 -0
  120. package/dist/embedding/profile.js.map +1 -0
  121. package/dist/embedding/provider.d.ts +13 -0
  122. package/dist/embedding/provider.d.ts.map +1 -0
  123. package/dist/embedding/provider.js +17 -0
  124. package/dist/embedding/provider.js.map +1 -0
  125. package/dist/embedding/query-cache.d.ts +45 -0
  126. package/dist/embedding/query-cache.d.ts.map +1 -0
  127. package/dist/embedding/query-cache.js +181 -0
  128. package/dist/embedding/query-cache.js.map +1 -0
  129. package/dist/embedding/runtime.d.ts +14 -0
  130. package/dist/embedding/runtime.d.ts.map +1 -0
  131. package/dist/embedding/runtime.js +407 -0
  132. package/dist/embedding/runtime.js.map +1 -0
  133. package/dist/embedding/settings.d.ts +6 -0
  134. package/dist/embedding/settings.d.ts.map +1 -0
  135. package/dist/embedding/settings.js +69 -0
  136. package/dist/embedding/settings.js.map +1 -0
  137. package/dist/embedding/setup-lock.d.ts +7 -0
  138. package/dist/embedding/setup-lock.d.ts.map +1 -0
  139. package/dist/embedding/setup-lock.js +35 -0
  140. package/dist/embedding/setup-lock.js.map +1 -0
  141. package/dist/embedding/setup-service.d.ts +53 -0
  142. package/dist/embedding/setup-service.d.ts.map +1 -0
  143. package/dist/embedding/setup-service.js +184 -0
  144. package/dist/embedding/setup-service.js.map +1 -0
  145. package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
  146. package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
  147. package/dist/embedding/sqlite-vec-backend.js +106 -0
  148. package/dist/embedding/sqlite-vec-backend.js.map +1 -0
  149. package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
  150. package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
  151. package/dist/embedding/sqlite-vec-loader.js +51 -0
  152. package/dist/embedding/sqlite-vec-loader.js.map +1 -0
  153. package/dist/embedding/store.d.ts +66 -0
  154. package/dist/embedding/store.d.ts.map +1 -0
  155. package/dist/embedding/store.js +490 -0
  156. package/dist/embedding/store.js.map +1 -0
  157. package/dist/embedding/types.d.ts +126 -0
  158. package/dist/embedding/types.d.ts.map +1 -0
  159. package/dist/embedding/types.js +2 -0
  160. package/dist/embedding/types.js.map +1 -0
  161. package/dist/embedding/vector.d.ts +9 -0
  162. package/dist/embedding/vector.d.ts.map +1 -0
  163. package/dist/embedding/vector.js +90 -0
  164. package/dist/embedding/vector.js.map +1 -0
  165. package/dist/embedding/worker.d.ts +23 -0
  166. package/dist/embedding/worker.d.ts.map +1 -0
  167. package/dist/embedding/worker.js +84 -0
  168. package/dist/embedding/worker.js.map +1 -0
  169. package/dist/enno-oduno/schemas.d.ts +2 -2
  170. package/dist/ledger/checkpoint-contract.d.ts +2 -2
  171. package/dist/mcp/bounded-stdio-transport.d.ts +3 -0
  172. package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
  173. package/dist/mcp/bounded-stdio-transport.js +15 -3
  174. package/dist/mcp/bounded-stdio-transport.js.map +1 -1
  175. package/dist/mcp/request-deadline.d.ts +51 -0
  176. package/dist/mcp/request-deadline.d.ts.map +1 -0
  177. package/dist/mcp/request-deadline.js +155 -0
  178. package/dist/mcp/request-deadline.js.map +1 -0
  179. package/dist/mcp/runtime-owner.d.ts +27 -0
  180. package/dist/mcp/runtime-owner.d.ts.map +1 -0
  181. package/dist/mcp/runtime-owner.js +129 -0
  182. package/dist/mcp/runtime-owner.js.map +1 -0
  183. package/dist/mcp/server.d.ts +11 -1
  184. package/dist/mcp/server.d.ts.map +1 -1
  185. package/dist/mcp/server.js +83 -22
  186. package/dist/mcp/server.js.map +1 -1
  187. package/dist/memory/checkpoint-contract.d.ts +3 -3
  188. package/dist/memory/entries.d.ts.map +1 -1
  189. package/dist/memory/entries.js +13 -0
  190. package/dist/memory/entries.js.map +1 -1
  191. package/dist/memory/federated-retrieval.d.ts +3 -2
  192. package/dist/memory/federated-retrieval.d.ts.map +1 -1
  193. package/dist/memory/federated-retrieval.js +112 -31
  194. package/dist/memory/federated-retrieval.js.map +1 -1
  195. package/dist/memory/hybrid-retrieval.d.ts +9 -2
  196. package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
  197. package/dist/memory/hybrid-retrieval.js +60 -13
  198. package/dist/memory/hybrid-retrieval.js.map +1 -1
  199. package/dist/memory/retrieval.d.ts +4 -3
  200. package/dist/memory/retrieval.d.ts.map +1 -1
  201. package/dist/memory/retrieval.js +6 -6
  202. package/dist/memory/retrieval.js.map +1 -1
  203. package/dist/memory/scoped-memory.d.ts +3 -2
  204. package/dist/memory/scoped-memory.d.ts.map +1 -1
  205. package/dist/memory/scoped-memory.js +7 -3
  206. package/dist/memory/scoped-memory.js.map +1 -1
  207. package/dist/server/agent-application.js +1 -1
  208. package/dist/server/agent-application.js.map +1 -1
  209. package/dist/server/http.d.ts +17 -1
  210. package/dist/server/http.d.ts.map +1 -1
  211. package/dist/server/http.js +79 -13
  212. package/dist/server/http.js.map +1 -1
  213. package/dist/skills/discovery-service.d.ts.map +1 -1
  214. package/dist/skills/discovery-service.js +10 -8
  215. package/dist/skills/discovery-service.js.map +1 -1
  216. package/dist/skills/find.d.ts +1 -0
  217. package/dist/skills/find.d.ts.map +1 -1
  218. package/dist/skills/find.js +1 -0
  219. package/dist/skills/find.js.map +1 -1
  220. package/dist/skills/materialization-authority.d.ts +1 -1
  221. package/dist/skills/materialization-authority.d.ts.map +1 -1
  222. package/dist/skills/materialization-authority.js +2 -2
  223. package/dist/skills/materialization-authority.js.map +1 -1
  224. package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -1
  225. package/dist/skills/providers/skills-sh-compat.js +4 -2
  226. package/dist/skills/providers/skills-sh-compat.js.map +1 -1
  227. package/dist/skills/providers/skills-sh-v1.d.ts +2 -2
  228. package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -1
  229. package/dist/skills/providers/skills-sh-v1.js +22 -4
  230. package/dist/skills/providers/skills-sh-v1.js.map +1 -1
  231. package/dist/skills/source/github-fetcher.d.ts.map +1 -1
  232. package/dist/skills/source/github-fetcher.js +8 -4
  233. package/dist/skills/source/github-fetcher.js.map +1 -1
  234. package/dist/skills/types.d.ts +3 -2
  235. package/dist/skills/types.d.ts.map +1 -1
  236. package/docs/agent-file.md +72 -0
  237. package/docs/agent-gateway.md +104 -0
  238. package/docs/architecture.md +12 -0
  239. package/docs/cli-contract.md +13 -0
  240. package/docs/client-compatibility.md +298 -0
  241. package/docs/database.md +11 -0
  242. package/docs/execution-ledger.md +89 -0
  243. package/docs/release-notes-0.1.18.md +103 -0
  244. package/docs/retrieval-evaluation.md +10 -0
  245. package/docs/security.md +11 -0
  246. package/docs/sqlite-driver-adr.md +8 -0
  247. package/migrations/021_semantic_embeddings.sql +122 -0
  248. package/migrations/022_embedding_setup_v2.sql +236 -0
  249. package/migrations/down/021_semantic_embeddings.sql +17 -0
  250. package/migrations/down/022_embedding_setup_v2.sql +133 -0
  251. package/package.json +10 -1
@@ -0,0 +1,67 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ export { enqueueAllCurrentEntryEmbeddingsInTransaction, enqueueCurrentEntryEmbeddingInTransaction } from './store.js';
3
+ export type { CurrentEntryEmbeddingJobInput } from './store.js';
4
+ export declare const EMBEDDING_JOB_LEASE_MS = 60000;
5
+ export declare const EMBEDDING_JOB_MAX_ATTEMPTS = 6;
6
+ export type EmbeddingJobState = 'pending' | 'leased' | 'failed' | 'blocked';
7
+ export type EmbeddingJobErrorCode = 'timeout' | 'rate_limited' | 'provider_unavailable' | 'invalid_response' | 'dimension_mismatch' | 'secret_blocked' | 'profile_changed' | 'entry_changed';
8
+ export interface EmbeddingJob {
9
+ readonly entryId: string;
10
+ readonly profileId: string;
11
+ readonly revision: number;
12
+ readonly contentHash: string;
13
+ readonly state: EmbeddingJobState;
14
+ readonly attempts: number;
15
+ readonly availableAt: string;
16
+ readonly leaseId: string | null;
17
+ readonly leaseExpiresAt: string | null;
18
+ readonly errorCode: EmbeddingJobErrorCode | null;
19
+ readonly createdAt: string;
20
+ readonly updatedAt: string;
21
+ readonly workspace: string;
22
+ }
23
+ export interface ClaimedEmbeddingJob extends EmbeddingJob {
24
+ readonly state: 'leased';
25
+ readonly generation: number;
26
+ readonly leaseId: string;
27
+ readonly leaseExpiresAt: string;
28
+ }
29
+ export interface ClaimEmbeddingJobsOptions {
30
+ readonly maxJobs: number;
31
+ readonly workspace?: string;
32
+ readonly now?: string;
33
+ readonly leaseMs?: number;
34
+ readonly leaseIdFactory?: () => string;
35
+ }
36
+ export interface FinalizeEmbeddingJobInput {
37
+ readonly entryId: string;
38
+ readonly profileId: string;
39
+ readonly generation: number;
40
+ readonly leaseId: string;
41
+ readonly revision: number;
42
+ readonly contentHash: string;
43
+ readonly documentHash: string;
44
+ readonly vector: Float32Array | readonly number[];
45
+ readonly now: string;
46
+ }
47
+ export interface FailEmbeddingJobInput {
48
+ readonly entryId: string;
49
+ readonly profileId: string;
50
+ readonly generation: number;
51
+ readonly leaseId: string;
52
+ readonly errorCode: EmbeddingJobErrorCode;
53
+ readonly availableAt: string;
54
+ readonly now: string;
55
+ readonly permanent?: boolean;
56
+ }
57
+ export declare function claimEmbeddingJobs(database: SqliteDatabase, options: ClaimEmbeddingJobsOptions): ClaimedEmbeddingJob[];
58
+ export declare function finalizeEmbeddingJobInTransaction(database: SqliteDatabase, input: FinalizeEmbeddingJobInput): void;
59
+ export declare function finalizeEmbeddingJob(database: SqliteDatabase, input: FinalizeEmbeddingJobInput): void;
60
+ export declare function failEmbeddingJobInTransaction(database: SqliteDatabase, input: FailEmbeddingJobInput): boolean;
61
+ export declare function failEmbeddingJob(database: SqliteDatabase, input: FailEmbeddingJobInput): boolean;
62
+ export declare function listEmbeddingJobs(database: SqliteDatabase, options?: {
63
+ profileId?: string;
64
+ workspace?: string;
65
+ state?: EmbeddingJobState;
66
+ }): EmbeddingJob[];
67
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/embedding/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,259 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { withImmediateTransaction } from '../db/transaction.js';
3
+ import { KiokukoError } from '../errors.js';
4
+ import { validateTimestamp } from '../ledger/validate.js';
5
+ import { requireWorkspace } from '../serialization/validate.js';
6
+ import { readEmbeddingRuntimeState, upsertEntryEmbeddingInTransaction } from './store.js';
7
+ export { enqueueAllCurrentEntryEmbeddingsInTransaction, enqueueCurrentEntryEmbeddingInTransaction } from './store.js';
8
+ export const EMBEDDING_JOB_LEASE_MS = 60_000;
9
+ export const EMBEDDING_JOB_MAX_ATTEMPTS = 6;
10
+ function invalid(message) {
11
+ throw new KiokukoError('VALIDATION_ERROR', message);
12
+ }
13
+ function integrity(message) {
14
+ throw new KiokukoError('INTEGRITY_ERROR', message);
15
+ }
16
+ function canonicalTimestamp(value, label) {
17
+ if (typeof value !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u.test(value)
18
+ || !Number.isFinite(Date.parse(value)) || new Date(Date.parse(value)).toISOString() !== value) {
19
+ integrity(`Stored embedding job ${label} is invalid`);
20
+ }
21
+ return value;
22
+ }
23
+ function hash(value, label) {
24
+ if (typeof value !== 'string' || !/^[0-9a-f]{64}$/u.test(value))
25
+ invalid(`${label} must be a lowercase SHA-256 hash`);
26
+ return value;
27
+ }
28
+ function jobRow(row) {
29
+ if (typeof row.entry_id !== 'string' || row.entry_id.length === 0
30
+ || typeof row.profile_id !== 'string' || !/^[0-9a-f]{64}$/u.test(row.profile_id)
31
+ || typeof row.revision !== 'number' || !Number.isSafeInteger(row.revision) || row.revision < 1
32
+ || typeof row.content_hash !== 'string' || !/^[0-9a-f]{64}$/u.test(row.content_hash)
33
+ || (row.state !== 'pending' && row.state !== 'leased' && row.state !== 'failed' && row.state !== 'blocked')
34
+ || typeof row.attempts !== 'number' || !Number.isSafeInteger(row.attempts) || row.attempts < 0
35
+ || typeof row.workspace !== 'string' || row.workspace.length === 0) {
36
+ integrity('Stored embedding job is invalid');
37
+ }
38
+ const availableAt = canonicalTimestamp(row.available_at, 'available_at');
39
+ const createdAt = canonicalTimestamp(row.created_at, 'created_at');
40
+ const updatedAt = canonicalTimestamp(row.updated_at, 'updated_at');
41
+ const leaseId = row.lease_id === null ? null : row.lease_id;
42
+ const leaseExpiresAt = row.lease_expires_at === null ? null : row.lease_expires_at;
43
+ if ((row.state === 'leased') !== (leaseId !== null && leaseExpiresAt !== null)
44
+ || (leaseId !== null && (typeof leaseId !== 'string' || leaseId.length === 0))
45
+ || (leaseExpiresAt !== null && typeof leaseExpiresAt !== 'string')) {
46
+ integrity('Stored embedding job lease state is invalid');
47
+ }
48
+ const normalizedLeaseExpiresAt = leaseExpiresAt === null ? null : canonicalTimestamp(leaseExpiresAt, 'lease_expires_at');
49
+ const errorCode = row.error_code === null ? null : row.error_code;
50
+ const errorCodes = new Set([
51
+ 'timeout', 'rate_limited', 'provider_unavailable', 'invalid_response',
52
+ 'dimension_mismatch', 'secret_blocked', 'profile_changed', 'entry_changed',
53
+ ]);
54
+ if (errorCode !== null && (typeof errorCode !== 'string' || !errorCodes.has(errorCode))) {
55
+ integrity('Stored embedding job error code is invalid');
56
+ }
57
+ return {
58
+ entryId: row.entry_id,
59
+ profileId: row.profile_id,
60
+ revision: row.revision,
61
+ contentHash: row.content_hash,
62
+ state: row.state,
63
+ attempts: row.attempts,
64
+ availableAt,
65
+ leaseId,
66
+ leaseExpiresAt: normalizedLeaseExpiresAt,
67
+ errorCode: errorCode,
68
+ createdAt,
69
+ updatedAt,
70
+ workspace: row.workspace,
71
+ };
72
+ }
73
+ function claimLimit(value) {
74
+ if (!Number.isSafeInteger(value) || value < 1 || value > 64)
75
+ invalid('maxJobs must be an integer between 1 and 64');
76
+ return value;
77
+ }
78
+ function leaseDuration(value) {
79
+ const duration = value ?? EMBEDDING_JOB_LEASE_MS;
80
+ if (!Number.isSafeInteger(duration) || duration < 1_000 || duration > 300_000) {
81
+ invalid('leaseMs must be an integer between 1000 and 300000');
82
+ }
83
+ return duration;
84
+ }
85
+ function claimInTransaction(database, options) {
86
+ const maxJobs = claimLimit(options.maxJobs);
87
+ const now = options.now ?? new Date().toISOString();
88
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u.test(now)
89
+ || !Number.isFinite(Date.parse(now)) || new Date(Date.parse(now)).toISOString() !== now) {
90
+ invalid('now must be a canonical ISO-8601 UTC timestamp');
91
+ }
92
+ const leaseExpiresAt = new Date(Date.parse(now) + leaseDuration(options.leaseMs)).toISOString();
93
+ const workspace = options.workspace === undefined ? undefined : requireWorkspace(options.workspace);
94
+ const runtime = readEmbeddingRuntimeState(database);
95
+ if (runtime.activeProfileId === null)
96
+ return [];
97
+ const rows = database.prepare(`
98
+ SELECT j.entry_id, j.profile_id, j.revision, j.content_hash, j.state,
99
+ j.attempts, j.available_at, j.lease_id, j.lease_expires_at,
100
+ j.error_code, j.created_at, j.updated_at, e.workspace
101
+ FROM embedding_jobs AS j
102
+ JOIN entries AS e ON e.id = j.entry_id
103
+ WHERE j.profile_id = ?
104
+ AND (
105
+ (j.state = 'pending' AND j.available_at <= ?)
106
+ OR (j.state = 'failed' AND j.attempts < ? AND j.available_at <= ?)
107
+ OR (j.state = 'leased' AND j.attempts < ? AND j.lease_expires_at IS NOT NULL AND j.lease_expires_at <= ?)
108
+ )
109
+ ${workspace === undefined ? '' : 'AND e.workspace = ?'}
110
+ ORDER BY j.available_at ASC, j.entry_id ASC
111
+ LIMIT ?
112
+ `).all(runtime.activeProfileId, now, EMBEDDING_JOB_MAX_ATTEMPTS, now, EMBEDDING_JOB_MAX_ATTEMPTS, now, ...(workspace === undefined ? [] : [workspace]), maxJobs);
113
+ const leaseIdFactory = options.leaseIdFactory ?? randomUUID;
114
+ const claimed = [];
115
+ for (const row of rows) {
116
+ const job = jobRow(row);
117
+ const leaseId = leaseIdFactory();
118
+ if (typeof leaseId !== 'string' || leaseId.length === 0 || leaseId.length > 256)
119
+ invalid('leaseIdFactory returned an invalid lease ID');
120
+ database.prepare(`
121
+ UPDATE embedding_jobs
122
+ SET state = 'leased', attempts = attempts + 1, available_at = ?,
123
+ lease_id = ?, lease_expires_at = ?, error_code = NULL, updated_at = ?
124
+ WHERE entry_id = ? AND profile_id = ?
125
+ AND state = ? AND revision = ? AND content_hash = ?
126
+ `).run(now, leaseId, leaseExpiresAt, now, job.entryId, job.profileId, job.state, job.revision, job.contentHash);
127
+ const updated = database.prepare(`
128
+ SELECT j.entry_id, j.profile_id, j.revision, j.content_hash, j.state,
129
+ j.attempts, j.available_at, j.lease_id, j.lease_expires_at,
130
+ j.error_code, j.created_at, j.updated_at, e.workspace
131
+ FROM embedding_jobs AS j
132
+ JOIN entries AS e ON e.id = j.entry_id
133
+ WHERE j.entry_id = ? AND j.profile_id = ?
134
+ `).get(job.entryId, job.profileId);
135
+ if (updated === undefined)
136
+ integrity('Claimed embedding job disappeared');
137
+ const claimedJob = jobRow(updated);
138
+ if (claimedJob.state !== 'leased' || claimedJob.leaseId !== leaseId || claimedJob.leaseExpiresAt !== leaseExpiresAt) {
139
+ integrity('Embedding job lease claim was not persisted');
140
+ }
141
+ claimed.push({ ...claimedJob, state: 'leased', generation: runtime.generation, leaseId, leaseExpiresAt });
142
+ }
143
+ return claimed;
144
+ }
145
+ export function claimEmbeddingJobs(database, options) {
146
+ return withImmediateTransaction(database, () => claimInTransaction(database, options));
147
+ }
148
+ function jobForLease(database, input) {
149
+ const row = database.prepare(`
150
+ SELECT j.entry_id, j.profile_id, j.revision, j.content_hash, j.state,
151
+ j.attempts, j.available_at, j.lease_id, j.lease_expires_at,
152
+ j.error_code, j.created_at, j.updated_at, e.workspace
153
+ FROM embedding_jobs AS j
154
+ JOIN entries AS e ON e.id = j.entry_id
155
+ WHERE j.entry_id = ? AND j.profile_id = ?
156
+ `).get(input.entryId, input.profileId);
157
+ return row === undefined ? undefined : jobRow(row);
158
+ }
159
+ function leaseOwner(database, input) {
160
+ const runtime = readEmbeddingRuntimeState(database);
161
+ if (!Number.isSafeInteger(input.generation) || input.generation < 1
162
+ || runtime.activeProfileId !== input.profileId || runtime.generation !== input.generation) {
163
+ throw new KiokukoError('CONFLICT', 'Embedding runtime changed while processing a job');
164
+ }
165
+ const job = jobForLease(database, input);
166
+ if (job === undefined || job.state !== 'leased' || job.leaseId !== input.leaseId
167
+ || job.leaseExpiresAt === null || job.leaseExpiresAt <= input.now) {
168
+ throw new KiokukoError('CONFLICT', 'Embedding job lease is stale');
169
+ }
170
+ return job;
171
+ }
172
+ export function finalizeEmbeddingJobInTransaction(database, input) {
173
+ const now = validateTimestamp(input.now, 'now');
174
+ const job = leaseOwner(database, {
175
+ entryId: input.entryId,
176
+ profileId: input.profileId,
177
+ generation: input.generation,
178
+ leaseId: input.leaseId,
179
+ now,
180
+ });
181
+ if (job.revision !== input.revision || job.contentHash !== input.contentHash) {
182
+ throw new KiokukoError('CONFLICT', 'Embedding job source changed while processing');
183
+ }
184
+ upsertEntryEmbeddingInTransaction(database, {
185
+ entryId: input.entryId,
186
+ profileId: input.profileId,
187
+ revision: input.revision,
188
+ contentHash: input.contentHash,
189
+ documentHash: input.documentHash,
190
+ vector: input.vector,
191
+ createdAt: now,
192
+ });
193
+ database.prepare(`
194
+ DELETE FROM embedding_jobs
195
+ WHERE entry_id = ? AND profile_id = ? AND state = 'leased' AND lease_id = ?
196
+ `).run(input.entryId, input.profileId, input.leaseId);
197
+ if (jobForLease(database, input) !== undefined) {
198
+ throw new KiokukoError('INTEGRITY_ERROR', 'Embedding job was not finalized');
199
+ }
200
+ }
201
+ export function finalizeEmbeddingJob(database, input) {
202
+ withImmediateTransaction(database, () => finalizeEmbeddingJobInTransaction(database, input));
203
+ }
204
+ function failureCode(value) {
205
+ if (![
206
+ 'timeout', 'rate_limited', 'provider_unavailable', 'invalid_response',
207
+ 'dimension_mismatch', 'secret_blocked', 'profile_changed', 'entry_changed',
208
+ ].includes(value))
209
+ invalid('errorCode is invalid');
210
+ return value;
211
+ }
212
+ export function failEmbeddingJobInTransaction(database, input) {
213
+ const now = validateTimestamp(input.now, 'now');
214
+ const availableAt = validateTimestamp(input.availableAt, 'availableAt');
215
+ failureCode(input.errorCode);
216
+ const runtime = readEmbeddingRuntimeState(database);
217
+ if (runtime.activeProfileId !== input.profileId || runtime.generation !== input.generation)
218
+ return false;
219
+ const job = jobForLease(database, input);
220
+ if (job === undefined || job.state !== 'leased' || job.leaseId !== input.leaseId || job.leaseExpiresAt === null || job.leaseExpiresAt <= now)
221
+ return false;
222
+ const state = input.errorCode === 'secret_blocked' ? 'blocked' : 'failed';
223
+ database.prepare(`
224
+ UPDATE embedding_jobs
225
+ SET state = ?, attempts = CASE WHEN ? = 1 THEN ? ELSE attempts END,
226
+ available_at = ?, lease_id = NULL, lease_expires_at = NULL,
227
+ error_code = ?, updated_at = ?
228
+ WHERE entry_id = ? AND profile_id = ? AND state = 'leased' AND lease_id = ?
229
+ `).run(state, input.permanent === true ? 1 : 0, EMBEDDING_JOB_MAX_ATTEMPTS, availableAt, input.errorCode, now, input.entryId, input.profileId, input.leaseId);
230
+ const updated = jobForLease(database, input);
231
+ if (updated === undefined || updated.state !== state || updated.errorCode !== input.errorCode || updated.leaseId !== null) {
232
+ throw new KiokukoError('INTEGRITY_ERROR', 'Embedding job failure was not persisted');
233
+ }
234
+ return true;
235
+ }
236
+ export function failEmbeddingJob(database, input) {
237
+ return withImmediateTransaction(database, () => failEmbeddingJobInTransaction(database, input));
238
+ }
239
+ export function listEmbeddingJobs(database, options = {}) {
240
+ readEmbeddingRuntimeState(database);
241
+ const profileId = options.profileId === undefined ? undefined : hash(options.profileId, 'profileId');
242
+ const workspace = options.workspace === undefined ? undefined : requireWorkspace(options.workspace);
243
+ const state = options.state;
244
+ if (state !== undefined && state !== 'pending' && state !== 'leased' && state !== 'failed' && state !== 'blocked')
245
+ invalid('state is invalid');
246
+ const rows = database.prepare(`
247
+ SELECT j.entry_id, j.profile_id, j.revision, j.content_hash, j.state,
248
+ j.attempts, j.available_at, j.lease_id, j.lease_expires_at,
249
+ j.error_code, j.created_at, j.updated_at, e.workspace
250
+ FROM embedding_jobs AS j
251
+ JOIN entries AS e ON e.id = j.entry_id
252
+ WHERE (? IS NULL OR j.profile_id = ?)
253
+ AND (? IS NULL OR e.workspace = ?)
254
+ AND (? IS NULL OR j.state = ?)
255
+ ORDER BY j.profile_id ASC, j.entry_id ASC
256
+ `).all(profileId ?? null, profileId ?? null, workspace ?? null, workspace ?? null, state ?? null, state ?? null);
257
+ return rows.map(jobRow);
258
+ }
259
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/embedding/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { LocalEmbeddingProfileIdentity } from './types.js';
2
+ export interface LocalModelRuntime {
3
+ embed(inputs: readonly string[], signal?: AbortSignal): Promise<readonly Float32Array[]>;
4
+ dispose?(): Promise<void> | void;
5
+ }
6
+ export interface LocalModelLoader {
7
+ load(profile: LocalEmbeddingProfileIdentity, modelDirectory: string): Promise<LocalModelRuntime>;
8
+ }
9
+ interface FeatureExtractionTensor {
10
+ readonly dims: readonly number[];
11
+ readonly data: ArrayLike<number>;
12
+ }
13
+ interface FeatureExtractionPipeline {
14
+ (inputs: readonly string[], options: {
15
+ pooling: 'mean';
16
+ normalize: true;
17
+ }): Promise<FeatureExtractionTensor>;
18
+ dispose?(): Promise<void> | void;
19
+ }
20
+ export declare function createLocalTransformersModelLoader(options?: {
21
+ readonly pipeline?: (task: string, model: string, options: Record<string, unknown>) => Promise<FeatureExtractionPipeline>;
22
+ }): LocalModelLoader;
23
+ export {};
24
+ //# sourceMappingURL=local-model-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-model-loader.d.ts","sourceRoot":"","sources":["../../src/embedding/local-model-loader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAAC;IACzF,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,OAAO,EAAE,6BAA6B,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAClG;AAED,UAAU,uBAAuB;IAC/B,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,UAAU,yBAAyB;IACjC,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7G,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClC;AAqBD,wBAAgB,kCAAkC,CAChD,OAAO,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAA;CAAO,GAC1I,gBAAgB,CAqClB"}
@@ -0,0 +1,64 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ function unavailable(message, cause) {
3
+ const error = new KiokukoError('SERVICE_UNAVAILABLE', message);
4
+ if (cause !== undefined)
5
+ Object.defineProperty(error, 'cause', { value: cause });
6
+ throw error;
7
+ }
8
+ function outputRows(output, expectedCount) {
9
+ if (!Array.isArray(output.dims) || output.dims.length !== 2 || output.dims[0] !== expectedCount || output.dims[1] !== 384) {
10
+ throw new KiokukoError('VALIDATION_ERROR', 'Local model returned unexpected embedding dimensions');
11
+ }
12
+ const vectors = [];
13
+ for (let row = 0; row < expectedCount; row += 1) {
14
+ const vector = new Float32Array(384);
15
+ for (let column = 0; column < 384; column += 1)
16
+ vector[column] = output.data[row * 384 + column] ?? Number.NaN;
17
+ vectors.push(vector);
18
+ }
19
+ return vectors;
20
+ }
21
+ export function createLocalTransformersModelLoader(options = {}) {
22
+ return {
23
+ load: async (profile, modelDirectory) => {
24
+ if (profile.providerKind !== 'local-transformers' || profile.dtype !== 'q8' || profile.pooling !== 'mean' || profile.normalize !== true || profile.dimensions !== 384) {
25
+ throw new KiokukoError('VALIDATION_ERROR', 'Local model profile contract is invalid');
26
+ }
27
+ let pipeline = options.pipeline;
28
+ if (pipeline === undefined) {
29
+ try {
30
+ const transformers = await import('@huggingface/transformers');
31
+ transformers.env.localModelPath = `${modelDirectory.endsWith('/') ? modelDirectory : `${modelDirectory}/`}`;
32
+ transformers.env.allowLocalModels = true;
33
+ transformers.env.allowRemoteModels = false;
34
+ pipeline = transformers.pipeline;
35
+ }
36
+ catch (error) {
37
+ unavailable('The optional local Transformers.js dependency is unavailable', error);
38
+ }
39
+ }
40
+ if (pipeline === undefined)
41
+ unavailable('The local Transformers.js pipeline is unavailable');
42
+ const pipelineFactory = pipeline;
43
+ let extractor;
44
+ try {
45
+ extractor = await pipelineFactory('feature-extraction', modelDirectory, { dtype: profile.dtype });
46
+ }
47
+ catch (error) {
48
+ unavailable('The verified local embedding model could not be loaded offline', error);
49
+ }
50
+ return {
51
+ embed: async (inputs, signal) => {
52
+ if (signal?.aborted)
53
+ throw new KiokukoError('SERVICE_UNAVAILABLE', 'Local embedding was interrupted');
54
+ const output = await extractor(inputs, { pooling: 'mean', normalize: true });
55
+ if (signal?.aborted)
56
+ throw new KiokukoError('SERVICE_UNAVAILABLE', 'Local embedding was interrupted');
57
+ return outputRows(output, inputs.length);
58
+ },
59
+ dispose: async () => { await extractor.dispose?.(); },
60
+ };
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=local-model-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-model-loader.js","sourceRoot":"","sources":["../../src/embedding/local-model-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type LocalModelLoader } from './local-model-loader.js';
2
+ import type { EmbeddingProvider, LocalEmbeddingProfileIdentity } from './types.js';
3
+ export interface LocalTransformersEmbeddingProviderOptions {
4
+ readonly profile: LocalEmbeddingProfileIdentity;
5
+ readonly modelDirectory: string;
6
+ readonly loader?: LocalModelLoader;
7
+ }
8
+ export declare class LocalTransformersEmbeddingProvider implements EmbeddingProvider {
9
+ #private;
10
+ readonly profile: LocalEmbeddingProfileIdentity;
11
+ constructor(options: LocalTransformersEmbeddingProviderOptions);
12
+ embed(inputs: readonly string[], options?: {
13
+ signal?: AbortSignal;
14
+ }): Promise<readonly Float32Array[]>;
15
+ close(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=local-transformers-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-transformers-provider.d.ts","sourceRoot":"","sources":["../../src/embedding/local-transformers-provider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,gBAAgB,EAA0B,MAAM,yBAAyB,CAAC;AAC5H,OAAO,KAAK,EAAE,iBAAiB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAiBnF,MAAM,WAAW,yCAAyC;IACxD,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,qBAAa,kCAAmC,YAAW,iBAAiB;;IAC1E,QAAQ,CAAC,OAAO,EAAE,6BAA6B,CAAC;gBAMpC,OAAO,EAAE,yCAAyC;IAaxD,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAS1G,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -0,0 +1,54 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ import { normalizeVector } from './vector.js';
3
+ import { createLocalTransformersModelLoader } from './local-model-loader.js';
4
+ const MAX_INPUTS = 64;
5
+ const MAX_INPUT_BYTES = 32 * 1024;
6
+ function validateInputs(inputs) {
7
+ if (!Array.isArray(inputs) || inputs.length === 0 || inputs.length > MAX_INPUTS) {
8
+ throw new KiokukoError('VALIDATION_ERROR', 'Local embedding input batch is invalid');
9
+ }
10
+ return inputs.map((input) => {
11
+ if (typeof input !== 'string' || input.length === 0 || Buffer.byteLength(input, 'utf8') > MAX_INPUT_BYTES || /[\u0000-\u001f\u007f]/u.test(input)) {
12
+ throw new KiokukoError('VALIDATION_ERROR', 'Local embedding input is invalid');
13
+ }
14
+ return input;
15
+ });
16
+ }
17
+ export class LocalTransformersEmbeddingProvider {
18
+ profile;
19
+ #modelDirectory;
20
+ #loader;
21
+ #runtime;
22
+ #closed = false;
23
+ constructor(options) {
24
+ if (options.profile.providerKind !== 'local-transformers')
25
+ throw new KiokukoError('VALIDATION_ERROR', 'Local provider profile is invalid');
26
+ this.profile = Object.freeze({ ...options.profile });
27
+ this.#modelDirectory = options.modelDirectory;
28
+ this.#loader = options.loader ?? createLocalTransformersModelLoader();
29
+ }
30
+ async #load() {
31
+ if (this.#closed)
32
+ throw new KiokukoError('SERVICE_UNAVAILABLE', 'Local embedding provider is closed');
33
+ this.#runtime ??= this.#loader.load(this.profile, this.#modelDirectory);
34
+ return this.#runtime;
35
+ }
36
+ async embed(inputs, options = {}) {
37
+ const validInputs = validateInputs(inputs);
38
+ if (options.signal?.aborted)
39
+ throw new KiokukoError('SERVICE_UNAVAILABLE', 'Local embedding was interrupted');
40
+ const runtime = await this.#load();
41
+ const vectors = await runtime.embed(validInputs, options.signal);
42
+ if (vectors.length !== validInputs.length)
43
+ throw new KiokukoError('VALIDATION_ERROR', 'Local model returned the wrong number of embeddings');
44
+ return vectors.map((vector) => normalizeVector(vector, this.profile.dimensions));
45
+ }
46
+ async close() {
47
+ if (this.#closed)
48
+ return;
49
+ this.#closed = true;
50
+ const runtime = this.#runtime === undefined ? undefined : await this.#runtime;
51
+ await runtime?.dispose?.();
52
+ }
53
+ }
54
+ //# sourceMappingURL=local-transformers-provider.js.map
@@ -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"}