@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.
- package/README.ja.md +31 -0
- package/README.ko.md +31 -0
- package/README.md +32 -0
- package/README.zh-CN.md +29 -0
- package/dist/akinator/agent-task.d.ts +3 -0
- package/dist/akinator/agent-task.d.ts.map +1 -1
- package/dist/akinator/agent-task.js +38 -4
- package/dist/akinator/agent-task.js.map +1 -1
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +89 -8
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +4 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +43 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/embeddings.d.ts +19 -0
- package/dist/commands/embeddings.d.ts.map +1 -0
- package/dist/commands/embeddings.js +159 -0
- package/dist/commands/embeddings.js.map +1 -0
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +7 -0
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/use.d.ts.map +1 -1
- package/dist/commands/use.js +22 -8
- package/dist/commands/use.js.map +1 -1
- package/dist/context/broker.d.ts +3 -1
- package/dist/context/broker.d.ts.map +1 -1
- package/dist/context/broker.js +11 -7
- package/dist/context/broker.js.map +1 -1
- package/dist/context/delivery.d.ts.map +1 -1
- package/dist/context/delivery.js +5 -3
- package/dist/context/delivery.js.map +1 -1
- package/dist/context/ranking.d.ts +1 -1
- package/dist/context/ranking.d.ts.map +1 -1
- package/dist/context/ranking.js +1 -0
- package/dist/context/ranking.js.map +1 -1
- package/dist/context/scoped-broker.d.ts +4 -3
- package/dist/context/scoped-broker.d.ts.map +1 -1
- package/dist/context/scoped-broker.js +45 -7
- package/dist/context/scoped-broker.js.map +1 -1
- package/dist/context/selection-state.d.ts +12 -0
- package/dist/context/selection-state.d.ts.map +1 -1
- package/dist/context/selection-state.js +117 -7
- package/dist/context/selection-state.js.map +1 -1
- package/dist/db/capabilities.d.ts +8 -0
- package/dist/db/capabilities.d.ts.map +1 -1
- package/dist/db/capabilities.js +14 -0
- package/dist/db/capabilities.js.map +1 -1
- package/dist/db/connection.d.ts +7 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +56 -0
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +3 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/embedding/backend.d.ts +27 -0
- package/dist/embedding/backend.d.ts.map +1 -0
- package/dist/embedding/backend.js +51 -0
- package/dist/embedding/backend.js.map +1 -0
- package/dist/embedding/config.d.ts +7 -0
- package/dist/embedding/config.d.ts.map +1 -0
- package/dist/embedding/config.js +125 -0
- package/dist/embedding/config.js.map +1 -0
- package/dist/embedding/diagnostics.d.ts +34 -0
- package/dist/embedding/diagnostics.d.ts.map +1 -0
- package/dist/embedding/diagnostics.js +248 -0
- package/dist/embedding/diagnostics.js.map +1 -0
- package/dist/embedding/document.d.ts +15 -0
- package/dist/embedding/document.d.ts.map +1 -0
- package/dist/embedding/document.js +102 -0
- package/dist/embedding/document.js.map +1 -0
- package/dist/embedding/javascript-backend.d.ts +11 -0
- package/dist/embedding/javascript-backend.d.ts.map +1 -0
- package/dist/embedding/javascript-backend.js +164 -0
- package/dist/embedding/javascript-backend.js.map +1 -0
- package/dist/embedding/jobs.d.ts +67 -0
- package/dist/embedding/jobs.d.ts.map +1 -0
- package/dist/embedding/jobs.js +259 -0
- package/dist/embedding/jobs.js.map +1 -0
- package/dist/embedding/openai-compatible-provider.d.ts +24 -0
- package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
- package/dist/embedding/openai-compatible-provider.js +330 -0
- package/dist/embedding/openai-compatible-provider.js.map +1 -0
- package/dist/embedding/profile.d.ts +6 -0
- package/dist/embedding/profile.d.ts.map +1 -0
- package/dist/embedding/profile.js +31 -0
- package/dist/embedding/profile.js.map +1 -0
- package/dist/embedding/provider.d.ts +13 -0
- package/dist/embedding/provider.d.ts.map +1 -0
- package/dist/embedding/provider.js +17 -0
- package/dist/embedding/provider.js.map +1 -0
- package/dist/embedding/query-cache.d.ts +39 -0
- package/dist/embedding/query-cache.d.ts.map +1 -0
- package/dist/embedding/query-cache.js +160 -0
- package/dist/embedding/query-cache.js.map +1 -0
- package/dist/embedding/runtime.d.ts +13 -0
- package/dist/embedding/runtime.d.ts.map +1 -0
- package/dist/embedding/runtime.js +373 -0
- package/dist/embedding/runtime.js.map +1 -0
- package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
- package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
- package/dist/embedding/sqlite-vec-backend.js +106 -0
- package/dist/embedding/sqlite-vec-backend.js.map +1 -0
- package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
- package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
- package/dist/embedding/sqlite-vec-loader.js +51 -0
- package/dist/embedding/sqlite-vec-loader.js.map +1 -0
- package/dist/embedding/store.d.ts +64 -0
- package/dist/embedding/store.d.ts.map +1 -0
- package/dist/embedding/store.js +377 -0
- package/dist/embedding/store.js.map +1 -0
- package/dist/embedding/types.d.ts +97 -0
- package/dist/embedding/types.d.ts.map +1 -0
- package/dist/embedding/types.js +2 -0
- package/dist/embedding/types.js.map +1 -0
- package/dist/embedding/vector.d.ts +9 -0
- package/dist/embedding/vector.d.ts.map +1 -0
- package/dist/embedding/vector.js +90 -0
- package/dist/embedding/vector.js.map +1 -0
- package/dist/embedding/worker.d.ts +23 -0
- package/dist/embedding/worker.d.ts.map +1 -0
- package/dist/embedding/worker.js +84 -0
- package/dist/embedding/worker.js.map +1 -0
- package/dist/enno-oduno/schemas.d.ts +2 -2
- package/dist/ledger/checkpoint-contract.d.ts +2 -2
- package/dist/mcp/bounded-stdio-transport.d.ts +12 -2
- package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
- package/dist/mcp/bounded-stdio-transport.js +103 -4
- package/dist/mcp/bounded-stdio-transport.js.map +1 -1
- package/dist/mcp/runtime-owner.d.ts +27 -0
- package/dist/mcp/runtime-owner.d.ts.map +1 -0
- package/dist/mcp/runtime-owner.js +130 -0
- package/dist/mcp/runtime-owner.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +38 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/memory/checkpoint-contract.d.ts +3 -3
- package/dist/memory/entries.d.ts.map +1 -1
- package/dist/memory/entries.js +13 -0
- package/dist/memory/entries.js.map +1 -1
- package/dist/memory/federated-retrieval.d.ts +3 -2
- package/dist/memory/federated-retrieval.d.ts.map +1 -1
- package/dist/memory/federated-retrieval.js +112 -31
- package/dist/memory/federated-retrieval.js.map +1 -1
- package/dist/memory/hybrid-retrieval.d.ts +9 -2
- package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/memory/hybrid-retrieval.js +60 -13
- package/dist/memory/hybrid-retrieval.js.map +1 -1
- package/dist/memory/retrieval.d.ts +4 -3
- package/dist/memory/retrieval.d.ts.map +1 -1
- package/dist/memory/retrieval.js +6 -6
- package/dist/memory/retrieval.js.map +1 -1
- package/dist/memory/scoped-memory.d.ts +2 -1
- package/dist/memory/scoped-memory.d.ts.map +1 -1
- package/dist/memory/scoped-memory.js +2 -2
- package/dist/memory/scoped-memory.js.map +1 -1
- package/dist/server/agent-application.js +1 -1
- package/dist/server/agent-application.js.map +1 -1
- package/dist/server/http.d.ts +17 -1
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +76 -13
- package/dist/server/http.js.map +1 -1
- package/migrations/021_semantic_embeddings.sql +122 -0
- package/migrations/down/021_semantic_embeddings.sql +17 -0
- 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 @@
|
|
|
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"}
|