@askdkc/kiokuko 0.2.6 → 0.2.7

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 (167) hide show
  1. package/README.ja.md +31 -0
  2. package/README.ko.md +31 -0
  3. package/README.md +32 -0
  4. package/README.zh-CN.md +29 -0
  5. package/dist/akinator/agent-task.d.ts +3 -0
  6. package/dist/akinator/agent-task.d.ts.map +1 -1
  7. package/dist/akinator/agent-task.js +38 -4
  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 +89 -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 +43 -1
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/embeddings.d.ts +19 -0
  18. package/dist/commands/embeddings.d.ts.map +1 -0
  19. package/dist/commands/embeddings.js +159 -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/context/broker.d.ts +3 -1
  28. package/dist/context/broker.d.ts.map +1 -1
  29. package/dist/context/broker.js +11 -7
  30. package/dist/context/broker.js.map +1 -1
  31. package/dist/context/delivery.d.ts.map +1 -1
  32. package/dist/context/delivery.js +5 -3
  33. package/dist/context/delivery.js.map +1 -1
  34. package/dist/context/ranking.d.ts +1 -1
  35. package/dist/context/ranking.d.ts.map +1 -1
  36. package/dist/context/ranking.js +1 -0
  37. package/dist/context/ranking.js.map +1 -1
  38. package/dist/context/scoped-broker.d.ts +4 -3
  39. package/dist/context/scoped-broker.d.ts.map +1 -1
  40. package/dist/context/scoped-broker.js +45 -7
  41. package/dist/context/scoped-broker.js.map +1 -1
  42. package/dist/context/selection-state.d.ts +12 -0
  43. package/dist/context/selection-state.d.ts.map +1 -1
  44. package/dist/context/selection-state.js +117 -7
  45. package/dist/context/selection-state.js.map +1 -1
  46. package/dist/db/capabilities.d.ts +8 -0
  47. package/dist/db/capabilities.d.ts.map +1 -1
  48. package/dist/db/capabilities.js +14 -0
  49. package/dist/db/capabilities.js.map +1 -1
  50. package/dist/db/connection.d.ts +7 -0
  51. package/dist/db/connection.d.ts.map +1 -1
  52. package/dist/db/connection.js +56 -0
  53. package/dist/db/connection.js.map +1 -1
  54. package/dist/db/migrate.d.ts.map +1 -1
  55. package/dist/db/migrate.js +3 -0
  56. package/dist/db/migrate.js.map +1 -1
  57. package/dist/embedding/backend.d.ts +27 -0
  58. package/dist/embedding/backend.d.ts.map +1 -0
  59. package/dist/embedding/backend.js +51 -0
  60. package/dist/embedding/backend.js.map +1 -0
  61. package/dist/embedding/config.d.ts +7 -0
  62. package/dist/embedding/config.d.ts.map +1 -0
  63. package/dist/embedding/config.js +125 -0
  64. package/dist/embedding/config.js.map +1 -0
  65. package/dist/embedding/diagnostics.d.ts +34 -0
  66. package/dist/embedding/diagnostics.d.ts.map +1 -0
  67. package/dist/embedding/diagnostics.js +248 -0
  68. package/dist/embedding/diagnostics.js.map +1 -0
  69. package/dist/embedding/document.d.ts +15 -0
  70. package/dist/embedding/document.d.ts.map +1 -0
  71. package/dist/embedding/document.js +102 -0
  72. package/dist/embedding/document.js.map +1 -0
  73. package/dist/embedding/javascript-backend.d.ts +11 -0
  74. package/dist/embedding/javascript-backend.d.ts.map +1 -0
  75. package/dist/embedding/javascript-backend.js +164 -0
  76. package/dist/embedding/javascript-backend.js.map +1 -0
  77. package/dist/embedding/jobs.d.ts +67 -0
  78. package/dist/embedding/jobs.d.ts.map +1 -0
  79. package/dist/embedding/jobs.js +259 -0
  80. package/dist/embedding/jobs.js.map +1 -0
  81. package/dist/embedding/openai-compatible-provider.d.ts +24 -0
  82. package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
  83. package/dist/embedding/openai-compatible-provider.js +330 -0
  84. package/dist/embedding/openai-compatible-provider.js.map +1 -0
  85. package/dist/embedding/profile.d.ts +6 -0
  86. package/dist/embedding/profile.d.ts.map +1 -0
  87. package/dist/embedding/profile.js +31 -0
  88. package/dist/embedding/profile.js.map +1 -0
  89. package/dist/embedding/provider.d.ts +13 -0
  90. package/dist/embedding/provider.d.ts.map +1 -0
  91. package/dist/embedding/provider.js +17 -0
  92. package/dist/embedding/provider.js.map +1 -0
  93. package/dist/embedding/query-cache.d.ts +39 -0
  94. package/dist/embedding/query-cache.d.ts.map +1 -0
  95. package/dist/embedding/query-cache.js +160 -0
  96. package/dist/embedding/query-cache.js.map +1 -0
  97. package/dist/embedding/runtime.d.ts +13 -0
  98. package/dist/embedding/runtime.d.ts.map +1 -0
  99. package/dist/embedding/runtime.js +373 -0
  100. package/dist/embedding/runtime.js.map +1 -0
  101. package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
  102. package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
  103. package/dist/embedding/sqlite-vec-backend.js +106 -0
  104. package/dist/embedding/sqlite-vec-backend.js.map +1 -0
  105. package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
  106. package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
  107. package/dist/embedding/sqlite-vec-loader.js +51 -0
  108. package/dist/embedding/sqlite-vec-loader.js.map +1 -0
  109. package/dist/embedding/store.d.ts +64 -0
  110. package/dist/embedding/store.d.ts.map +1 -0
  111. package/dist/embedding/store.js +377 -0
  112. package/dist/embedding/store.js.map +1 -0
  113. package/dist/embedding/types.d.ts +97 -0
  114. package/dist/embedding/types.d.ts.map +1 -0
  115. package/dist/embedding/types.js +2 -0
  116. package/dist/embedding/types.js.map +1 -0
  117. package/dist/embedding/vector.d.ts +9 -0
  118. package/dist/embedding/vector.d.ts.map +1 -0
  119. package/dist/embedding/vector.js +90 -0
  120. package/dist/embedding/vector.js.map +1 -0
  121. package/dist/embedding/worker.d.ts +23 -0
  122. package/dist/embedding/worker.d.ts.map +1 -0
  123. package/dist/embedding/worker.js +84 -0
  124. package/dist/embedding/worker.js.map +1 -0
  125. package/dist/enno-oduno/schemas.d.ts +2 -2
  126. package/dist/ledger/checkpoint-contract.d.ts +2 -2
  127. package/dist/mcp/bounded-stdio-transport.d.ts +12 -2
  128. package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
  129. package/dist/mcp/bounded-stdio-transport.js +103 -4
  130. package/dist/mcp/bounded-stdio-transport.js.map +1 -1
  131. package/dist/mcp/runtime-owner.d.ts +27 -0
  132. package/dist/mcp/runtime-owner.d.ts.map +1 -0
  133. package/dist/mcp/runtime-owner.js +130 -0
  134. package/dist/mcp/runtime-owner.js.map +1 -0
  135. package/dist/mcp/server.d.ts +9 -1
  136. package/dist/mcp/server.d.ts.map +1 -1
  137. package/dist/mcp/server.js +38 -5
  138. package/dist/mcp/server.js.map +1 -1
  139. package/dist/memory/checkpoint-contract.d.ts +3 -3
  140. package/dist/memory/entries.d.ts.map +1 -1
  141. package/dist/memory/entries.js +13 -0
  142. package/dist/memory/entries.js.map +1 -1
  143. package/dist/memory/federated-retrieval.d.ts +3 -2
  144. package/dist/memory/federated-retrieval.d.ts.map +1 -1
  145. package/dist/memory/federated-retrieval.js +112 -31
  146. package/dist/memory/federated-retrieval.js.map +1 -1
  147. package/dist/memory/hybrid-retrieval.d.ts +9 -2
  148. package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
  149. package/dist/memory/hybrid-retrieval.js +60 -13
  150. package/dist/memory/hybrid-retrieval.js.map +1 -1
  151. package/dist/memory/retrieval.d.ts +4 -3
  152. package/dist/memory/retrieval.d.ts.map +1 -1
  153. package/dist/memory/retrieval.js +6 -6
  154. package/dist/memory/retrieval.js.map +1 -1
  155. package/dist/memory/scoped-memory.d.ts +2 -1
  156. package/dist/memory/scoped-memory.d.ts.map +1 -1
  157. package/dist/memory/scoped-memory.js +2 -2
  158. package/dist/memory/scoped-memory.js.map +1 -1
  159. package/dist/server/agent-application.js +1 -1
  160. package/dist/server/agent-application.js.map +1 -1
  161. package/dist/server/http.d.ts +17 -1
  162. package/dist/server/http.d.ts.map +1 -1
  163. package/dist/server/http.js +76 -13
  164. package/dist/server/http.js.map +1 -1
  165. package/migrations/021_semantic_embeddings.sql +122 -0
  166. package/migrations/down/021_semantic_embeddings.sql +17 -0
  167. package/package.json +7 -1
@@ -0,0 +1,64 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ import type { EmbeddingProfile } from './types.js';
3
+ export interface EmbeddingRuntimeState {
4
+ readonly activeProfileId: string | null;
5
+ readonly generation: number;
6
+ readonly activatedAt: string | null;
7
+ }
8
+ export interface ActiveEmbeddingProfile {
9
+ readonly profile: EmbeddingProfile;
10
+ readonly generation: number;
11
+ readonly activatedAt: string;
12
+ }
13
+ export interface ActivateEmbeddingProfileOptions {
14
+ readonly replace: boolean;
15
+ readonly now?: string;
16
+ }
17
+ export interface EmbeddingProfileActivation {
18
+ readonly profileId: string;
19
+ readonly generation: number;
20
+ readonly activated: boolean;
21
+ readonly enqueued: number;
22
+ }
23
+ export interface CurrentEntryEmbeddingJobInput {
24
+ readonly entryId: string;
25
+ readonly revision: number;
26
+ readonly contentHash: string;
27
+ readonly now: string;
28
+ }
29
+ export interface EntryEmbeddingInput {
30
+ readonly entryId: string;
31
+ readonly profileId: string;
32
+ readonly revision: number;
33
+ readonly contentHash: string;
34
+ readonly documentHash: string;
35
+ readonly vector: Float32Array | readonly number[];
36
+ readonly createdAt: string;
37
+ }
38
+ export interface StoredEntryEmbedding {
39
+ readonly entryId: string;
40
+ readonly profileId: string;
41
+ readonly revision: number;
42
+ readonly contentHash: string;
43
+ readonly documentHash: string;
44
+ readonly dimensions: number;
45
+ readonly vector: Float32Array;
46
+ readonly vectorHash: string;
47
+ readonly createdAt: string;
48
+ }
49
+ export declare function readEmbeddingProfile(database: SqliteDatabase, profileId: string): EmbeddingProfile | undefined;
50
+ export declare function readEmbeddingRuntimeState(database: SqliteDatabase): EmbeddingRuntimeState;
51
+ export declare function readActiveEmbeddingProfile(database: SqliteDatabase): ActiveEmbeddingProfile | null;
52
+ /** Enqueue the current entry revision for the active profile inside its caller-owned transaction. */
53
+ export declare function enqueueCurrentEntryEmbeddingInTransaction(database: SqliteDatabase, input: CurrentEntryEmbeddingJobInput): void;
54
+ /** Enqueue every current entry for an already-installed active profile. */
55
+ export declare function enqueueAllCurrentEntryEmbeddingsInTransaction(database: SqliteDatabase, requestedNow?: string, requestedWorkspace?: string): number;
56
+ export declare function activateEmbeddingProfileInTransaction(database: SqliteDatabase, profile: EmbeddingProfile, options: ActivateEmbeddingProfileOptions): EmbeddingProfileActivation;
57
+ export declare function activateEmbeddingProfile(database: SqliteDatabase, profile: EmbeddingProfile, options: ActivateEmbeddingProfileOptions): EmbeddingProfileActivation;
58
+ export declare function upsertEntryEmbeddingInTransaction(database: SqliteDatabase, input: EntryEmbeddingInput): void;
59
+ export declare function upsertEntryEmbedding(database: SqliteDatabase, input: EntryEmbeddingInput): void;
60
+ export declare function readEntryEmbedding(database: SqliteDatabase, input: {
61
+ entryId: string;
62
+ profileId: string;
63
+ }): StoredEntryEmbedding | undefined;
64
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/embedding/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,377 @@
1
+ import { withImmediateTransaction } from '../db/transaction.js';
2
+ import { KiokukoError } from '../errors.js';
3
+ import { validateTimestamp } from '../ledger/validate.js';
4
+ import { requireWorkspace } from '../serialization/validate.js';
5
+ import { embeddingProfileId } from './profile.js';
6
+ import { decodeVector, encodeVector, hashVectorBytes } from './vector.js';
7
+ const HASH_PATTERN = /^[0-9a-f]{64}$/u;
8
+ const EMBEDDING_TABLES = [
9
+ 'embedding_profiles',
10
+ 'embedding_runtime',
11
+ 'entry_embeddings',
12
+ 'embedding_jobs',
13
+ 'query_embeddings',
14
+ ];
15
+ function invalid(message) {
16
+ throw new KiokukoError('VALIDATION_ERROR', message);
17
+ }
18
+ function integrity(message) {
19
+ throw new KiokukoError('INTEGRITY_ERROR', message);
20
+ }
21
+ function conflict(message) {
22
+ throw new KiokukoError('CONFLICT', message);
23
+ }
24
+ function positiveInteger(value, label) {
25
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1) {
26
+ invalid(`${label} must be a positive integer`);
27
+ }
28
+ return value;
29
+ }
30
+ function hashValue(value, label) {
31
+ if (typeof value !== 'string' || !HASH_PATTERN.test(value))
32
+ invalid(`${label} must be a lowercase SHA-256 hash`);
33
+ return value;
34
+ }
35
+ function storedHash(value, label) {
36
+ if (typeof value !== 'string' || !HASH_PATTERN.test(value))
37
+ integrity(`${label} is invalid`);
38
+ return value;
39
+ }
40
+ function storedTimestamp(value, label) {
41
+ if (typeof value !== 'string')
42
+ integrity(`${label} is invalid`);
43
+ try {
44
+ return validateTimestamp(value, label);
45
+ }
46
+ catch {
47
+ integrity(`${label} is invalid`);
48
+ }
49
+ }
50
+ function entryIdValue(value, label) {
51
+ if (typeof value !== 'string' || value.length === 0 || value.length > 512 || /[\u0000-\u001f\u007f]/u.test(value)) {
52
+ invalid(`${label} is invalid`);
53
+ }
54
+ return value;
55
+ }
56
+ function requireProfileIdentity(identity) {
57
+ if (identity.schemaVersion !== 1
58
+ || identity.providerKind !== 'openai-compatible'
59
+ || !HASH_PATTERN.test(identity.endpointFingerprint)
60
+ || typeof identity.model !== 'string'
61
+ || identity.model.length === 0
62
+ || identity.model.length > 256
63
+ || /[\u0000-\u001f\u007f]/u.test(identity.model)
64
+ || !Number.isSafeInteger(identity.dimensions)
65
+ || identity.dimensions < 2
66
+ || identity.dimensions > 8192
67
+ || identity.distanceMetric !== 'cosine'
68
+ || identity.documentTemplateVersion !== 1
69
+ || identity.queryTemplateVersion !== 1
70
+ || !Number.isFinite(identity.distanceCeiling)
71
+ || identity.distanceCeiling <= 0
72
+ || identity.distanceCeiling >= 2) {
73
+ invalid('Embedding profile identity is invalid');
74
+ }
75
+ }
76
+ function requireProfile(profile) {
77
+ if (typeof profile.profileId !== 'string' || !HASH_PATTERN.test(profile.profileId))
78
+ invalid('Embedding profile ID is invalid');
79
+ requireProfileIdentity(profile.identity);
80
+ if (embeddingProfileId(profile.identity) !== profile.profileId) {
81
+ invalid('Embedding profile ID does not match its identity');
82
+ }
83
+ }
84
+ function profileIdentityFromRow(row) {
85
+ if (typeof row.profile_id !== 'string' || !HASH_PATTERN.test(row.profile_id)
86
+ || row.provider_kind !== 'openai-compatible'
87
+ || typeof row.endpoint_fingerprint !== 'string' || !HASH_PATTERN.test(row.endpoint_fingerprint)
88
+ || typeof row.model !== 'string' || row.model.length === 0 || row.model.length > 256
89
+ || /[\u0000-\u001f\u007f]/u.test(row.model)
90
+ || typeof row.dimensions !== 'number' || !Number.isSafeInteger(row.dimensions) || row.dimensions < 2 || row.dimensions > 8192
91
+ || row.distance_metric !== 'cosine'
92
+ || typeof row.distance_ceiling !== 'number' || !Number.isFinite(row.distance_ceiling) || row.distance_ceiling <= 0 || row.distance_ceiling >= 2
93
+ || row.document_template_version !== 1
94
+ || row.query_template_version !== 1) {
95
+ integrity('Stored embedding profile is invalid');
96
+ }
97
+ const identity = {
98
+ schemaVersion: 1,
99
+ providerKind: 'openai-compatible',
100
+ endpointFingerprint: row.endpoint_fingerprint,
101
+ model: row.model,
102
+ dimensions: row.dimensions,
103
+ distanceMetric: 'cosine',
104
+ documentTemplateVersion: 1,
105
+ queryTemplateVersion: 1,
106
+ distanceCeiling: row.distance_ceiling,
107
+ };
108
+ if (embeddingProfileId(identity) !== row.profile_id)
109
+ integrity('Stored embedding profile ID does not match its identity');
110
+ storedTimestamp(row.created_at, 'embedding profile created_at');
111
+ return Object.freeze({ profileId: row.profile_id, identity: Object.freeze(identity) });
112
+ }
113
+ function profileIdentitiesEqual(left, right) {
114
+ return left.schemaVersion === right.schemaVersion
115
+ && left.providerKind === right.providerKind
116
+ && left.endpointFingerprint === right.endpointFingerprint
117
+ && left.model === right.model
118
+ && left.dimensions === right.dimensions
119
+ && left.distanceMetric === right.distanceMetric
120
+ && left.documentTemplateVersion === right.documentTemplateVersion
121
+ && left.queryTemplateVersion === right.queryTemplateVersion
122
+ && left.distanceCeiling === right.distanceCeiling;
123
+ }
124
+ function schemaTables(database) {
125
+ return new Set(database.prepare(`
126
+ SELECT name
127
+ FROM sqlite_master
128
+ WHERE type = 'table' AND name IN (${EMBEDDING_TABLES.map(() => '?').join(', ')})
129
+ `).all(...EMBEDDING_TABLES).map((row) => row.name));
130
+ }
131
+ function requireEmbeddingSchema(database) {
132
+ const tables = schemaTables(database);
133
+ const missing = EMBEDDING_TABLES.filter((table) => !tables.has(table));
134
+ if (missing.length > 0)
135
+ integrity(`Embedding projection schema is incomplete: missing ${missing.join(', ')}`);
136
+ }
137
+ function embeddingSchemaInstalled(database) {
138
+ const tables = schemaTables(database);
139
+ const present = EMBEDDING_TABLES.filter((table) => tables.has(table));
140
+ if (present.length === 0)
141
+ return false;
142
+ if (present.length !== EMBEDDING_TABLES.length) {
143
+ const missing = EMBEDDING_TABLES.filter((table) => !tables.has(table));
144
+ integrity(`Embedding projection schema is incomplete: missing ${missing.join(', ')}`);
145
+ }
146
+ return true;
147
+ }
148
+ function readProfileRow(database, profileId) {
149
+ const row = database.prepare(`
150
+ SELECT profile_id, provider_kind, endpoint_fingerprint, model, dimensions,
151
+ distance_metric, distance_ceiling, document_template_version,
152
+ query_template_version, created_at
153
+ FROM embedding_profiles
154
+ WHERE profile_id = ?
155
+ `).get(profileId);
156
+ return row === undefined ? undefined : profileIdentityFromRow(row);
157
+ }
158
+ export function readEmbeddingProfile(database, profileId) {
159
+ hashValue(profileId, 'profileId');
160
+ if (!embeddingSchemaInstalled(database))
161
+ return undefined;
162
+ return readProfileRow(database, profileId);
163
+ }
164
+ export function readEmbeddingRuntimeState(database) {
165
+ requireEmbeddingSchema(database);
166
+ const rows = database.prepare(`
167
+ SELECT singleton, active_profile_id, generation, activated_at
168
+ FROM embedding_runtime
169
+ `).all();
170
+ if (rows.length !== 1)
171
+ integrity('Embedding runtime must contain exactly one singleton row');
172
+ const row = rows[0];
173
+ if (row.singleton !== 1
174
+ || (row.active_profile_id !== null && (typeof row.active_profile_id !== 'string' || !HASH_PATTERN.test(row.active_profile_id)))
175
+ || typeof row.generation !== 'number'
176
+ || !Number.isSafeInteger(row.generation)
177
+ || row.generation < 1
178
+ || (row.activated_at !== null && typeof row.activated_at !== 'string')) {
179
+ integrity('Stored embedding runtime is invalid');
180
+ }
181
+ const activatedAt = row.activated_at === null ? null : storedTimestamp(row.activated_at, 'embedding runtime activated_at');
182
+ if ((row.active_profile_id === null) !== (activatedAt === null))
183
+ integrity('Stored embedding runtime activation state is invalid');
184
+ if (row.active_profile_id !== null && readProfileRow(database, row.active_profile_id) === undefined) {
185
+ integrity('Active embedding profile is missing');
186
+ }
187
+ return { activeProfileId: row.active_profile_id, generation: row.generation, activatedAt };
188
+ }
189
+ export function readActiveEmbeddingProfile(database) {
190
+ const runtime = readEmbeddingRuntimeState(database);
191
+ if (runtime.activeProfileId === null || runtime.activatedAt === null)
192
+ return null;
193
+ const profile = readProfileRow(database, runtime.activeProfileId);
194
+ if (profile === undefined)
195
+ integrity('Active embedding profile is missing');
196
+ return Object.freeze({ profile, generation: runtime.generation, activatedAt: runtime.activatedAt });
197
+ }
198
+ function currentEntry(database, entryId) {
199
+ const row = database.prepare(`
200
+ SELECT e.current_revision, r.content_hash
201
+ FROM entries AS e
202
+ JOIN entry_revisions AS r
203
+ ON r.entry_id = e.id AND r.revision = e.current_revision
204
+ WHERE e.id = ?
205
+ `).get(entryId);
206
+ if (row === undefined)
207
+ throw new KiokukoError('NOT_FOUND', 'Entry not found');
208
+ if (typeof row.current_revision !== 'number' || !Number.isSafeInteger(row.current_revision) || row.current_revision < 1
209
+ || typeof row.content_hash !== 'string' || row.content_hash.length === 0) {
210
+ integrity('Current entry embedding source is invalid');
211
+ }
212
+ return { revision: row.current_revision, contentHash: row.content_hash };
213
+ }
214
+ function enqueueForProfile(database, profileId, input) {
215
+ const current = currentEntry(database, input.entryId);
216
+ if (current.revision !== input.revision || current.contentHash !== input.contentHash) {
217
+ conflict('Entry changed before its embedding job could be enqueued');
218
+ }
219
+ database.prepare(`
220
+ INSERT INTO embedding_jobs (
221
+ entry_id, profile_id, revision, content_hash, state, attempts,
222
+ available_at, lease_id, lease_expires_at, error_code, created_at, updated_at
223
+ ) VALUES (?, ?, ?, ?, 'pending', 0, ?, NULL, NULL, NULL, ?, ?)
224
+ ON CONFLICT(entry_id, profile_id) DO UPDATE SET
225
+ revision = excluded.revision,
226
+ content_hash = excluded.content_hash,
227
+ state = 'pending',
228
+ attempts = 0,
229
+ available_at = excluded.available_at,
230
+ lease_id = NULL,
231
+ lease_expires_at = NULL,
232
+ error_code = NULL,
233
+ updated_at = excluded.updated_at
234
+ `).run(input.entryId, profileId, input.revision, input.contentHash, input.now, input.now, input.now);
235
+ }
236
+ /** Enqueue the current entry revision for the active profile inside its caller-owned transaction. */
237
+ export function enqueueCurrentEntryEmbeddingInTransaction(database, input) {
238
+ entryIdValue(input.entryId, 'entryId');
239
+ const revision = positiveInteger(input.revision, 'revision');
240
+ const contentHash = hashValue(input.contentHash, 'contentHash');
241
+ const now = validateTimestamp(input.now, 'now');
242
+ if (!embeddingSchemaInstalled(database))
243
+ return;
244
+ const runtime = readEmbeddingRuntimeState(database);
245
+ if (runtime.activeProfileId === null)
246
+ return;
247
+ enqueueForProfile(database, runtime.activeProfileId, { entryId: input.entryId, revision, contentHash, now });
248
+ }
249
+ /** Enqueue every current entry for an already-installed active profile. */
250
+ export function enqueueAllCurrentEntryEmbeddingsInTransaction(database, requestedNow, requestedWorkspace) {
251
+ if (!embeddingSchemaInstalled(database))
252
+ return 0;
253
+ const runtime = readEmbeddingRuntimeState(database);
254
+ if (runtime.activeProfileId === null)
255
+ return 0;
256
+ const now = validateTimestamp(requestedNow ?? new Date().toISOString(), 'now');
257
+ const workspace = requestedWorkspace === undefined ? undefined : requireWorkspace(requestedWorkspace);
258
+ const rows = database.prepare(`
259
+ SELECT e.id, e.current_revision, r.content_hash
260
+ FROM entries AS e
261
+ JOIN entry_revisions AS r
262
+ ON r.entry_id = e.id AND r.revision = e.current_revision
263
+ ${workspace === undefined ? '' : 'WHERE e.workspace = ?'}
264
+ ORDER BY e.id ASC
265
+ `).all(...(workspace === undefined ? [] : [workspace]));
266
+ for (const row of rows) {
267
+ const entryId = entryIdValue(row.id, 'entryId');
268
+ const revision = positiveInteger(row.current_revision, 'revision');
269
+ const contentHash = hashValue(row.content_hash, 'contentHash');
270
+ enqueueForProfile(database, runtime.activeProfileId, { entryId, revision, contentHash, now });
271
+ }
272
+ return rows.length;
273
+ }
274
+ export function activateEmbeddingProfileInTransaction(database, profile, options) {
275
+ requireProfile(profile);
276
+ if (typeof options.replace !== 'boolean')
277
+ invalid('replace must be a boolean');
278
+ const now = validateTimestamp(options.now ?? new Date().toISOString(), 'now');
279
+ requireEmbeddingSchema(database);
280
+ const existing = readProfileRow(database, profile.profileId);
281
+ if (existing === undefined) {
282
+ database.prepare(`
283
+ INSERT OR IGNORE INTO embedding_profiles (
284
+ profile_id, provider_kind, endpoint_fingerprint, model, dimensions,
285
+ distance_metric, distance_ceiling, document_template_version,
286
+ query_template_version, created_at
287
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
288
+ `).run(profile.profileId, profile.identity.providerKind, profile.identity.endpointFingerprint, profile.identity.model, profile.identity.dimensions, profile.identity.distanceMetric, profile.identity.distanceCeiling, profile.identity.documentTemplateVersion, profile.identity.queryTemplateVersion, now);
289
+ }
290
+ else if (!profileIdentitiesEqual(existing.identity, profile.identity)) {
291
+ conflict('Embedding profile ID already refers to different profile fields');
292
+ }
293
+ const runtime = readEmbeddingRuntimeState(database);
294
+ if (runtime.activeProfileId === profile.profileId) {
295
+ return { profileId: profile.profileId, generation: runtime.generation, activated: false, enqueued: 0 };
296
+ }
297
+ if (runtime.activeProfileId !== null && !options.replace) {
298
+ conflict('An active embedding profile already exists; use replace to switch it');
299
+ }
300
+ const generation = runtime.activeProfileId === null ? runtime.generation : runtime.generation + 1;
301
+ database.prepare(`
302
+ UPDATE embedding_runtime
303
+ SET active_profile_id = ?, generation = ?, activated_at = ?
304
+ WHERE singleton = 1 AND generation = ?
305
+ `).run(profile.profileId, generation, now, runtime.generation);
306
+ const updated = readEmbeddingRuntimeState(database);
307
+ if (updated.activeProfileId !== profile.profileId || updated.generation !== generation || updated.activatedAt !== now) {
308
+ conflict('Embedding runtime changed while activating a profile');
309
+ }
310
+ const enqueued = enqueueAllCurrentEntryEmbeddingsInTransaction(database, now);
311
+ return { profileId: profile.profileId, generation, activated: true, enqueued };
312
+ }
313
+ export function activateEmbeddingProfile(database, profile, options) {
314
+ return withImmediateTransaction(database, () => activateEmbeddingProfileInTransaction(database, profile, options));
315
+ }
316
+ function storedEmbedding(row) {
317
+ const entryId = entryIdValue(row.entry_id, 'entryId');
318
+ const profileId = hashValue(row.profile_id, 'profileId');
319
+ const revision = positiveInteger(row.revision, 'revision');
320
+ const contentHash = storedHash(row.content_hash, 'entry embedding content_hash');
321
+ const documentHash = storedHash(row.document_hash, 'entry embedding document_hash');
322
+ const dimensions = positiveInteger(row.dimensions, 'dimensions');
323
+ if (dimensions < 2 || dimensions > 8192)
324
+ integrity('Stored entry embedding dimensions are invalid');
325
+ const vectorHash = storedHash(row.vector_hash, 'entry embedding vector_hash');
326
+ const vector = decodeVector(row.embedding, dimensions, vectorHash);
327
+ const createdAt = storedTimestamp(row.created_at, 'entry embedding created_at');
328
+ return { entryId, profileId, revision, contentHash, documentHash, dimensions, vector, vectorHash, createdAt };
329
+ }
330
+ export function upsertEntryEmbeddingInTransaction(database, input) {
331
+ requireEmbeddingSchema(database);
332
+ entryIdValue(input.entryId, 'entryId');
333
+ const profileId = hashValue(input.profileId, 'profileId');
334
+ const profile = readProfileRow(database, profileId);
335
+ if (profile === undefined)
336
+ throw new KiokukoError('NOT_FOUND', 'Embedding profile not found');
337
+ const revision = positiveInteger(input.revision, 'revision');
338
+ const contentHash = hashValue(input.contentHash, 'contentHash');
339
+ const documentHash = hashValue(input.documentHash, 'documentHash');
340
+ const createdAt = validateTimestamp(input.createdAt, 'createdAt');
341
+ const current = currentEntry(database, input.entryId);
342
+ if (current.revision !== revision || current.contentHash !== contentHash) {
343
+ conflict('Entry changed before its embedding could be stored');
344
+ }
345
+ const bytes = encodeVector(input.vector, profile.identity.dimensions);
346
+ const vectorHash = hashVectorBytes(bytes);
347
+ database.prepare(`
348
+ INSERT INTO entry_embeddings (
349
+ entry_id, profile_id, revision, content_hash, document_hash,
350
+ dimensions, embedding, vector_hash, created_at
351
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
352
+ ON CONFLICT(entry_id, profile_id) DO UPDATE SET
353
+ revision = excluded.revision,
354
+ content_hash = excluded.content_hash,
355
+ document_hash = excluded.document_hash,
356
+ dimensions = excluded.dimensions,
357
+ embedding = excluded.embedding,
358
+ vector_hash = excluded.vector_hash,
359
+ created_at = excluded.created_at
360
+ `).run(input.entryId, profileId, revision, contentHash, documentHash, profile.identity.dimensions, bytes, vectorHash, createdAt);
361
+ }
362
+ export function upsertEntryEmbedding(database, input) {
363
+ withImmediateTransaction(database, () => upsertEntryEmbeddingInTransaction(database, input));
364
+ }
365
+ export function readEntryEmbedding(database, input) {
366
+ requireEmbeddingSchema(database);
367
+ const entryId = entryIdValue(input.entryId, 'entryId');
368
+ const profileId = hashValue(input.profileId, 'profileId');
369
+ const row = database.prepare(`
370
+ SELECT entry_id, profile_id, revision, content_hash, document_hash,
371
+ dimensions, embedding, vector_hash, created_at
372
+ FROM entry_embeddings
373
+ WHERE entry_id = ? AND profile_id = ?
374
+ `).get(entryId, profileId);
375
+ return row === undefined ? undefined : storedEmbedding(row);
376
+ }
377
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/embedding/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ export type EmbeddingMode = 'off' | 'optional' | 'required';
3
+ export type VectorBackendPreference = 'auto' | 'javascript' | 'sqlite-vec';
4
+ export type EmbeddingProviderKind = 'openai-compatible';
5
+ export interface EmbeddingConfig {
6
+ readonly mode: EmbeddingMode;
7
+ readonly provider: EmbeddingProviderKind;
8
+ readonly baseUrl?: string;
9
+ readonly model?: string;
10
+ readonly dimensions?: number;
11
+ readonly distanceCeiling?: number;
12
+ readonly apiKey?: string;
13
+ readonly allowRemote: boolean;
14
+ readonly vectorBackend: VectorBackendPreference;
15
+ readonly timeoutMs: number;
16
+ readonly batchSize: number;
17
+ }
18
+ export interface EnabledEmbeddingConfig extends EmbeddingConfig {
19
+ readonly mode: 'optional' | 'required';
20
+ readonly baseUrl: string;
21
+ readonly model: string;
22
+ readonly dimensions: number;
23
+ readonly distanceCeiling: number;
24
+ }
25
+ export interface EmbeddingProfileIdentity {
26
+ readonly schemaVersion: 1;
27
+ readonly providerKind: 'openai-compatible';
28
+ readonly endpointFingerprint: string;
29
+ readonly model: string;
30
+ readonly dimensions: number;
31
+ readonly distanceMetric: 'cosine';
32
+ readonly documentTemplateVersion: 1;
33
+ readonly queryTemplateVersion: 1;
34
+ readonly distanceCeiling: number;
35
+ }
36
+ export interface EmbeddingProfile {
37
+ readonly profileId: string;
38
+ readonly identity: EmbeddingProfileIdentity;
39
+ }
40
+ export interface PreparedSemanticQuery {
41
+ readonly profileId: string;
42
+ readonly dimensions: number;
43
+ readonly vector: Float32Array;
44
+ readonly vectorHash: string;
45
+ readonly backendId: string;
46
+ readonly distanceCeiling: number;
47
+ }
48
+ export interface EmbeddingDocument {
49
+ readonly text: string;
50
+ readonly bytes: Uint8Array;
51
+ readonly documentHash: string;
52
+ readonly truncated: boolean;
53
+ }
54
+ export interface VectorSearchInput {
55
+ readonly profileId: string;
56
+ readonly dimensions: number;
57
+ readonly queryVector: Float32Array;
58
+ readonly distanceCeiling: number;
59
+ readonly workspace?: string;
60
+ readonly excludedWorkspaces?: readonly string[];
61
+ readonly limit: number;
62
+ }
63
+ export interface VectorHit {
64
+ readonly entryId: string;
65
+ readonly distance: number;
66
+ }
67
+ export interface VectorSearchBackend {
68
+ readonly id: string;
69
+ search(database: SqliteDatabase, input: VectorSearchInput): VectorHit[];
70
+ }
71
+ export interface EmbeddingProvider {
72
+ readonly profile: EmbeddingProfileIdentity;
73
+ embed(inputs: readonly string[], options?: {
74
+ signal?: AbortSignal;
75
+ }): Promise<readonly Float32Array[]>;
76
+ }
77
+ export interface EmbeddingDrainResult {
78
+ readonly claimed: number;
79
+ readonly completed: number;
80
+ readonly failed: number;
81
+ readonly blocked: number;
82
+ readonly remaining: number;
83
+ }
84
+ export interface EmbeddingRuntime {
85
+ readonly mode: EmbeddingMode;
86
+ readonly profileId: string | null;
87
+ readonly backendId: string | null;
88
+ readonly backend: VectorSearchBackend | null;
89
+ prepareQuery(database: SqliteDatabase, text: string): Promise<PreparedSemanticQuery | null>;
90
+ drain(options: {
91
+ workspace?: string;
92
+ maxJobs: number;
93
+ deadlineMs: number;
94
+ }): Promise<EmbeddingDrainResult>;
95
+ close(): Promise<void>;
96
+ }
97
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embedding/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embedding/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare const MIN_VECTOR_DIMENSIONS = 2;
2
+ export declare const MAX_VECTOR_DIMENSIONS = 8192;
3
+ export declare function normalizeVector(input: Float32Array | readonly number[], expectedDimensions?: number): Float32Array;
4
+ export declare function encodeVector(input: Float32Array | readonly number[], expectedDimensions?: number): Uint8Array;
5
+ export declare function decodeVector(blob: unknown, dimensions: number, expectedHash?: string): Float32Array;
6
+ export declare function hashVectorBytes(bytes: Uint8Array): string;
7
+ export declare function hashVector(input: Float32Array | readonly number[]): string;
8
+ export declare function cosineDistance(left: Float32Array, right: Float32Array): number;
9
+ //# sourceMappingURL=vector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.d.ts","sourceRoot":"","sources":["../../src/embedding/vector.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAyB3C,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,YAAY,CAGlH;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,UAAU,CAQ7G;AASD,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,CAWnG;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,MAAM,EAAE,GAAG,MAAM,CAE1E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAiB9E"}