@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,164 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ import { requireWorkspace } from '../serialization/validate.js';
3
+ import { decodeVector, cosineDistance, normalizeVector } from './vector.js';
4
+ export const JAVASCRIPT_BACKEND_ID = 'javascript';
5
+ export const MAX_JAVASCRIPT_BACKEND_ENTRIES = 10_000;
6
+ export const MAX_VECTOR_SEARCH_LIMIT = 120;
7
+ function invalid(message) {
8
+ throw new KiokukoError('VALIDATION_ERROR', message);
9
+ }
10
+ function integrity(message) {
11
+ throw new KiokukoError('INTEGRITY_ERROR', message);
12
+ }
13
+ function entryId(value) {
14
+ if (typeof value !== 'string' || value.length === 0 || value.length > 512 || /[\u0000-\u001f\u007f]/u.test(value)) {
15
+ integrity('Stored vector entry ID is invalid');
16
+ }
17
+ return value;
18
+ }
19
+ function searchInput(input) {
20
+ if (typeof input.profileId !== 'string' || !/^[0-9a-f]{64}$/u.test(input.profileId))
21
+ invalid('profileId is invalid');
22
+ if (!Number.isSafeInteger(input.dimensions) || input.dimensions < 2 || input.dimensions > 8192)
23
+ invalid('dimensions is invalid');
24
+ if (!Number.isFinite(input.distanceCeiling) || input.distanceCeiling <= 0 || input.distanceCeiling >= 2)
25
+ invalid('distanceCeiling is invalid');
26
+ if (!Number.isSafeInteger(input.limit) || input.limit < 1 || input.limit > MAX_VECTOR_SEARCH_LIMIT)
27
+ invalid('limit is invalid');
28
+ const workspace = input.workspace === undefined ? undefined : requireWorkspace(input.workspace);
29
+ const excludedWorkspaces = input.excludedWorkspaces === undefined
30
+ ? []
31
+ : [...new Set(input.excludedWorkspaces.map((value) => requireWorkspace(value)))];
32
+ return {
33
+ profileId: input.profileId,
34
+ dimensions: input.dimensions,
35
+ queryVector: normalizeVector(input.queryVector, input.dimensions),
36
+ distanceCeiling: input.distanceCeiling,
37
+ workspace,
38
+ excludedWorkspaces,
39
+ limit: input.limit,
40
+ };
41
+ }
42
+ function worse(left, right) {
43
+ return left.distance > right.distance || left.distance === right.distance && left.entryId > right.entryId;
44
+ }
45
+ function better(left, right) {
46
+ return left.distance < right.distance || left.distance === right.distance && left.entryId < right.entryId;
47
+ }
48
+ class WorstFirstHeap {
49
+ limit;
50
+ #items = [];
51
+ constructor(limit) {
52
+ this.limit = limit;
53
+ }
54
+ add(hit) {
55
+ if (this.#items.length < this.limit) {
56
+ this.#items.push(hit);
57
+ this.siftUp(this.#items.length - 1);
58
+ return;
59
+ }
60
+ const worst = this.#items[0];
61
+ if (worst === undefined || !better(hit, worst))
62
+ return;
63
+ this.#items[0] = hit;
64
+ this.siftDown(0);
65
+ }
66
+ values() {
67
+ return [...this.#items].sort((left, right) => better(left, right) ? -1 : better(right, left) ? 1 : 0);
68
+ }
69
+ siftUp(start) {
70
+ let child = start;
71
+ while (child > 0) {
72
+ const parent = Math.floor((child - 1) / 2);
73
+ const parentValue = this.#items[parent];
74
+ const childValue = this.#items[child];
75
+ if (parentValue === undefined || childValue === undefined || !worse(childValue, parentValue))
76
+ break;
77
+ this.#items[parent] = childValue;
78
+ this.#items[child] = parentValue;
79
+ child = parent;
80
+ }
81
+ }
82
+ siftDown(start) {
83
+ let parent = start;
84
+ for (;;) {
85
+ const left = parent * 2 + 1;
86
+ const right = left + 1;
87
+ let largest = parent;
88
+ const leftValue = this.#items[left];
89
+ const rightValue = this.#items[right];
90
+ const largestValue = this.#items[largest];
91
+ if (leftValue !== undefined && largestValue !== undefined && worse(leftValue, largestValue))
92
+ largest = left;
93
+ const candidate = this.#items[largest];
94
+ if (rightValue !== undefined && candidate !== undefined && worse(rightValue, candidate))
95
+ largest = right;
96
+ if (largest === parent)
97
+ return;
98
+ const parentValue = this.#items[parent];
99
+ const replacement = this.#items[largest];
100
+ if (parentValue === undefined || replacement === undefined)
101
+ return;
102
+ this.#items[parent] = replacement;
103
+ this.#items[largest] = parentValue;
104
+ parent = largest;
105
+ }
106
+ }
107
+ }
108
+ export class JavaScriptVectorSearchBackend {
109
+ id = JAVASCRIPT_BACKEND_ID;
110
+ search(database, input) {
111
+ const normalized = searchInput(input);
112
+ const clauses = [
113
+ 'ee.profile_id = ?',
114
+ 'ee.dimensions = ?',
115
+ 'ee.revision = e.current_revision',
116
+ 'ee.content_hash = r.content_hash',
117
+ ];
118
+ const parameters = [normalized.profileId, normalized.dimensions];
119
+ if (normalized.workspace !== undefined) {
120
+ clauses.push('e.workspace = ?');
121
+ parameters.push(normalized.workspace);
122
+ }
123
+ if (normalized.excludedWorkspaces.length > 0) {
124
+ clauses.push(`e.workspace NOT IN (${normalized.excludedWorkspaces.map(() => '?').join(', ')})`);
125
+ parameters.push(...normalized.excludedWorkspaces);
126
+ }
127
+ parameters.push(MAX_JAVASCRIPT_BACKEND_ENTRIES + 1);
128
+ const rows = database.prepare(`
129
+ SELECT ee.entry_id, ee.dimensions, ee.embedding, ee.vector_hash
130
+ FROM entry_embeddings AS ee
131
+ JOIN entries AS e ON e.id = ee.entry_id
132
+ JOIN entry_revisions AS r
133
+ ON r.entry_id = e.id AND r.revision = e.current_revision
134
+ WHERE ${clauses.join(' AND ')}
135
+ ORDER BY ee.entry_id ASC
136
+ LIMIT ?
137
+ `).all(...parameters);
138
+ if (rows.length > MAX_JAVASCRIPT_BACKEND_ENTRIES) {
139
+ throw new KiokukoError('BACKPRESSURE', 'JavaScript vector search corpus exceeds its safety bound');
140
+ }
141
+ const heap = new WorstFirstHeap(normalized.limit);
142
+ for (const row of rows) {
143
+ const id = entryId(row.entry_id);
144
+ if (typeof row.dimensions !== 'number' || row.dimensions !== normalized.dimensions)
145
+ integrity('Stored vector dimensions do not match the search profile');
146
+ const vectorHash = typeof row.vector_hash === 'string' ? row.vector_hash : integrity('Stored vector hash is invalid');
147
+ let vector;
148
+ try {
149
+ vector = decodeVector(row.embedding, normalized.dimensions, vectorHash);
150
+ }
151
+ catch {
152
+ integrity('Stored vector is invalid');
153
+ }
154
+ const distance = cosineDistance(normalized.queryVector, vector);
155
+ if (!Number.isFinite(distance))
156
+ integrity('Vector distance is invalid');
157
+ if (distance <= normalized.distanceCeiling)
158
+ heap.add({ entryId: id, distance });
159
+ }
160
+ return heap.values();
161
+ }
162
+ }
163
+ export const createJavaScriptVectorSearchBackend = () => new JavaScriptVectorSearchBackend();
164
+ //# sourceMappingURL=javascript-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript-backend.js","sourceRoot":"","sources":["../../src/embedding/javascript-backend.ts"],"names":[],"mappings":"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"}
@@ -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 { EmbeddingProvider, EmbeddingProfileIdentity, EnabledEmbeddingConfig } from './types.js';
2
+ export declare const MAX_EMBEDDING_PROVIDER_INPUTS = 64;
3
+ export declare const MAX_EMBEDDING_PROVIDER_REQUEST_BYTES: number;
4
+ export declare const MAX_EMBEDDING_PROVIDER_RESPONSE_BYTES: number;
5
+ export declare const DEFAULT_EMBEDDING_PROVIDER_RETRIES = 2;
6
+ export declare const MAX_EMBEDDING_PROVIDER_RETRY_DELAY_MS = 5000;
7
+ export interface OpenAICompatibleEmbeddingProviderOptions {
8
+ readonly config: EnabledEmbeddingConfig;
9
+ readonly fetchImpl?: typeof fetch;
10
+ readonly timeoutMs?: number;
11
+ readonly maxRetries?: number;
12
+ readonly retryDelayMs?: number;
13
+ readonly sleepImpl?: (milliseconds: number, signal?: AbortSignal) => Promise<void>;
14
+ }
15
+ export declare class OpenAICompatibleEmbeddingProvider implements EmbeddingProvider {
16
+ #private;
17
+ readonly profile: EmbeddingProfileIdentity;
18
+ constructor(options: OpenAICompatibleEmbeddingProviderOptions);
19
+ embed(inputs: readonly string[], options?: {
20
+ signal?: AbortSignal;
21
+ }): Promise<readonly Float32Array[]>;
22
+ }
23
+ export { OpenAICompatibleEmbeddingProvider as OpenAICompatibleProvider };
24
+ //# sourceMappingURL=openai-compatible-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible-provider.d.ts","sourceRoot":"","sources":["../../src/embedding/openai-compatible-provider.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEtG,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,oCAAoC,QAAkB,CAAC;AACpE,eAAO,MAAM,qCAAqC,QAAkB,CAAC;AACrE,eAAO,MAAM,kCAAkC,IAAI,CAAC;AACpD,eAAO,MAAM,qCAAqC,OAAQ,CAAC;AAM3D,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpF;AAqND,qBAAa,iCAAkC,YAAW,iBAAiB;;IACzE,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;gBAS/B,OAAO,EAAE,wCAAwC;IAavD,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;CAwEjH;AAED,OAAO,EAAE,iCAAiC,IAAI,wBAAwB,EAAE,CAAC"}