@askdkc/kiokuko 0.2.5 → 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 +54 -0
- package/README.ko.md +54 -0
- package/README.md +55 -0
- package/README.zh-CN.md +52 -0
- package/dist/agent-file/render.d.ts +1 -1
- package/dist/agent-file/render.js +2 -2
- package/dist/agent-file/render.js.map +1 -1
- 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 +52 -10
- package/dist/akinator/agent-task.js.map +1 -1
- package/dist/akinator/capabilities.d.ts +7 -1
- package/dist/akinator/capabilities.d.ts.map +1 -1
- package/dist/akinator/capabilities.js +10 -3
- package/dist/akinator/capabilities.js.map +1 -1
- package/dist/akinator/capability-binding.d.ts.map +1 -1
- package/dist/akinator/capability-binding.js +18 -3
- package/dist/akinator/capability-binding.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/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +21 -1
- package/dist/commands/agent.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 +45 -3
- 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/init.d.ts.map +1 -1
- package/dist/commands/init.js +4 -1
- package/dist/commands/init.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 +10 -4
- 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 +2 -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 +103 -43
- 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 +11 -2
- package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
- package/dist/memory/hybrid-retrieval.js +175 -31
- package/dist/memory/hybrid-retrieval.js.map +1 -1
- package/dist/memory/rebuild-search.d.ts +5 -0
- package/dist/memory/rebuild-search.d.ts.map +1 -1
- package/dist/memory/rebuild-search.js +61 -7
- package/dist/memory/rebuild-search.js.map +1 -1
- package/dist/memory/retrieval-query.d.ts.map +1 -1
- package/dist/memory/retrieval-query.js +99 -1
- package/dist/memory/retrieval-query.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/memory/structured-memory.d.ts +4 -0
- package/dist/memory/structured-memory.d.ts.map +1 -1
- package/dist/memory/structured-memory.js +101 -14
- package/dist/memory/structured-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/agent-checkpoint-use-case.d.ts.map +1 -1
- package/dist/server/agent-checkpoint-use-case.js +4 -3
- package/dist/server/agent-checkpoint-use-case.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/dist/server/routes/agent-capability-gate.d.ts +3 -0
- package/dist/server/routes/agent-capability-gate.d.ts.map +1 -1
- package/dist/server/routes/agent-capability-gate.js +23 -5
- package/dist/server/routes/agent-capability-gate.js.map +1 -1
- package/dist/setup/render.d.ts.map +1 -1
- package/dist/setup/render.js +9 -4
- package/dist/setup/render.js.map +1 -1
- package/dist/setup/standard-skills.d.ts +8 -1
- package/dist/setup/standard-skills.d.ts.map +1 -1
- package/dist/setup/standard-skills.js +8 -1
- package/dist/setup/standard-skills.js.map +1 -1
- package/migrations/020_cjk_fts.sql +80 -0
- package/migrations/021_semantic_embeddings.sql +122 -0
- package/migrations/down/020_cjk_fts.sql +38 -0
- package/migrations/down/021_semantic_embeddings.sql +17 -0
- package/package.json +7 -1
- package/skills/kiokuko-simple-work/SKILL.md +112 -0
- package/skills/kiokuko-soul/SKILL.md +39 -7
- package/templates/AGENTS.md +3 -3
|
@@ -8,10 +8,11 @@ const MAX_MERGED_CANDIDATES = 1_000;
|
|
|
8
8
|
const RRF_K = 60;
|
|
9
9
|
const LANE_WEIGHTS = {
|
|
10
10
|
'exact-signal': 5,
|
|
11
|
-
'word-fts':
|
|
11
|
+
'word-fts': 3,
|
|
12
12
|
trigram: 1.5,
|
|
13
13
|
like: 0.75,
|
|
14
14
|
tag: 3,
|
|
15
|
+
semantic: 2.5,
|
|
15
16
|
};
|
|
16
17
|
/** Decide eligibility only after the entry and the complete parent snapshot decode. */
|
|
17
18
|
export function isRetrievableEntry(database, entry) {
|
|
@@ -48,6 +49,50 @@ export function isRetrievableEntry(database, entry) {
|
|
|
48
49
|
throw new KiokukoError('INTEGRITY_ERROR', 'Managed external skill entry has multiple active mappings');
|
|
49
50
|
return active.length === 1 && active[0].revision === entry.revision;
|
|
50
51
|
}
|
|
52
|
+
/** Count current entries in one workspace that are eligible for ordinary retrieval. */
|
|
53
|
+
export function retrievableWorkspaceEntryCount(database, workspace) {
|
|
54
|
+
const count = database.prepare(`
|
|
55
|
+
WITH current_entries AS (
|
|
56
|
+
SELECT e.id, e.current_revision,
|
|
57
|
+
CASE WHEN e.created_by IN ('kiokuko-skill-discovery', 'kiokuko-source-sync')
|
|
58
|
+
OR CASE WHEN json_valid(r.provenance_json)
|
|
59
|
+
THEN json_extract(r.provenance_json, '$.type') END
|
|
60
|
+
IN ('external_skill', 'source_sync')
|
|
61
|
+
THEN 1 ELSE 0 END AS external_marker
|
|
62
|
+
FROM entries AS e
|
|
63
|
+
JOIN entry_revisions AS r
|
|
64
|
+
ON r.entry_id = e.id AND r.revision = e.current_revision
|
|
65
|
+
WHERE e.workspace = ? AND e.status <> 'superseded'
|
|
66
|
+
)
|
|
67
|
+
SELECT COUNT(*) AS count
|
|
68
|
+
FROM current_entries AS e
|
|
69
|
+
WHERE (
|
|
70
|
+
e.external_marker = 0
|
|
71
|
+
AND NOT EXISTS (
|
|
72
|
+
SELECT 1 FROM external_skill_entries AS m WHERE m.entry_id = e.id
|
|
73
|
+
)
|
|
74
|
+
) OR (
|
|
75
|
+
e.external_marker = 1
|
|
76
|
+
AND (SELECT COUNT(DISTINCT m.skill_id)
|
|
77
|
+
FROM external_skill_entries AS m WHERE m.entry_id = e.id) = 1
|
|
78
|
+
AND (SELECT COUNT(*)
|
|
79
|
+
FROM external_skill_entries AS m
|
|
80
|
+
WHERE m.entry_id = e.id AND m.active = 1) = 1
|
|
81
|
+
AND EXISTS (
|
|
82
|
+
SELECT 1
|
|
83
|
+
FROM external_skill_entries AS m
|
|
84
|
+
JOIN external_skills AS s ON s.skill_id = m.skill_id
|
|
85
|
+
WHERE m.entry_id = e.id
|
|
86
|
+
AND m.entry_revision = e.current_revision
|
|
87
|
+
AND m.active = 1
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
`).get(workspace)?.count;
|
|
91
|
+
if (typeof count !== 'number' || !Number.isSafeInteger(count) || count < 0) {
|
|
92
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Stored entry count is invalid');
|
|
93
|
+
}
|
|
94
|
+
return count;
|
|
95
|
+
}
|
|
51
96
|
function invalid() {
|
|
52
97
|
throw new KiokukoError('VALIDATION_ERROR', 'Search query is invalid');
|
|
53
98
|
}
|
|
@@ -57,6 +102,24 @@ function quotedFts(value) {
|
|
|
57
102
|
function escapedLike(value) {
|
|
58
103
|
return value.replaceAll('\\', '\\\\').replaceAll('%', '\\%').replaceAll('_', '\\_');
|
|
59
104
|
}
|
|
105
|
+
function wordTokens(value) {
|
|
106
|
+
return value.normalize('NFKD').replace(/\p{M}/gu, '').toLowerCase().match(/[\p{L}\p{N}_$@]+/gu) ?? [];
|
|
107
|
+
}
|
|
108
|
+
function containsTokenSequence(source, expected) {
|
|
109
|
+
if (expected.length === 0 || expected.length > source.length)
|
|
110
|
+
return false;
|
|
111
|
+
for (let start = 0; start <= source.length - expected.length; start += 1) {
|
|
112
|
+
if (expected.every((token, offset) => source[start + offset] === token))
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
function hasCanonicalWordMatch(database, input, row, value) {
|
|
118
|
+
const entry = readEntry(database, { workspace: input.workspace, entryId: row.id });
|
|
119
|
+
const expected = wordTokens(value);
|
|
120
|
+
const source = wordTokens([entry.title, entry.body, entry.summary ?? '', ...entry.tags].join('\n'));
|
|
121
|
+
return containsTokenSequence(source, expected);
|
|
122
|
+
}
|
|
60
123
|
function filterSql(input, parameters) {
|
|
61
124
|
const clauses = ['e.workspace = ?'];
|
|
62
125
|
parameters.push(input.workspace);
|
|
@@ -68,7 +131,10 @@ function rankSql() {
|
|
|
68
131
|
e.confidence DESC, e.updated_at DESC, e.id ASC`;
|
|
69
132
|
}
|
|
70
133
|
function exactSignalLane(database, input, parsed) {
|
|
71
|
-
const values =
|
|
134
|
+
const values = [...new Set([
|
|
135
|
+
parsed.normalized.length <= 512 ? normalizeSearchSignal(parsed.normalized) : '',
|
|
136
|
+
...parsed.exactSignals.map((signal) => signal.normalizedValue),
|
|
137
|
+
])].filter(Boolean).slice(0, 32);
|
|
72
138
|
if (values.length === 0)
|
|
73
139
|
return [];
|
|
74
140
|
const parameters = [input.workspace, ...values];
|
|
@@ -114,37 +180,69 @@ function wordFtsLane(database, input, parsed) {
|
|
|
114
180
|
.slice(0, 24);
|
|
115
181
|
const rows = [];
|
|
116
182
|
for (const value of values) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
183
|
+
let candidates;
|
|
184
|
+
if (Array.from(value).length >= 3) {
|
|
185
|
+
const parameters = [quotedFts(value)];
|
|
186
|
+
const filters = filterSql(input, parameters);
|
|
187
|
+
parameters.push(MAX_LANE_CANDIDATES);
|
|
188
|
+
candidates = database.prepare(`
|
|
189
|
+
SELECT e.id, bm25(entries_fts) AS score
|
|
190
|
+
FROM entries_fts JOIN entries e ON e.rowid = entries_fts.rowid
|
|
191
|
+
JOIN entry_revisions r ON r.entry_id = e.id AND r.revision = e.current_revision
|
|
192
|
+
WHERE entries_fts MATCH ? AND ${filters}
|
|
193
|
+
ORDER BY score ASC, ${rankSql()}
|
|
194
|
+
LIMIT ?
|
|
195
|
+
`).all(...parameters);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const pattern = `%${escapedLike(value)}%`;
|
|
199
|
+
const parameters = [pattern, pattern, pattern, pattern];
|
|
200
|
+
const filters = filterSql(input, parameters);
|
|
201
|
+
parameters.push(MAX_LANE_CANDIDATES);
|
|
202
|
+
candidates = database.prepare(`
|
|
203
|
+
SELECT e.id, 0 AS score
|
|
204
|
+
FROM entry_search_documents AS d
|
|
205
|
+
JOIN entries AS e ON e.rowid = d.entry_rowid
|
|
206
|
+
JOIN entry_revisions AS r ON r.entry_id = e.id AND r.revision = e.current_revision
|
|
207
|
+
WHERE (d.title LIKE ? ESCAPE '\\' OR d.body LIKE ? ESCAPE '\\'
|
|
208
|
+
OR d.summary LIKE ? ESCAPE '\\' OR d.tags_text LIKE ? ESCAPE '\\')
|
|
209
|
+
AND ${filters}
|
|
210
|
+
ORDER BY ${rankSql()}
|
|
211
|
+
LIMIT ?
|
|
212
|
+
`).all(...parameters);
|
|
213
|
+
}
|
|
214
|
+
rows.push(...candidates.filter((row) => hasCanonicalWordMatch(database, input, row, value)));
|
|
128
215
|
}
|
|
129
216
|
return rows;
|
|
130
217
|
}
|
|
131
218
|
function trigramLane(database, input, parsed) {
|
|
132
|
-
const values = parsed.substringTerms.filter((value) => value.length >=
|
|
133
|
-
const rows =
|
|
219
|
+
const values = parsed.substringTerms.filter((value) => Array.from(value).length >= 3).slice(0, 24);
|
|
220
|
+
const rows = new Map();
|
|
134
221
|
for (const value of values) {
|
|
135
222
|
const parameters = [quotedFts(value)];
|
|
136
223
|
const filters = filterSql(input, parameters);
|
|
137
224
|
parameters.push(MAX_LANE_CANDIDATES);
|
|
138
|
-
|
|
225
|
+
const matches = database.prepare(`
|
|
139
226
|
SELECT e.id, bm25(entries_trigram) AS score
|
|
140
227
|
FROM entries_trigram JOIN entries e ON e.rowid = entries_trigram.rowid
|
|
141
228
|
JOIN entry_revisions r ON r.entry_id = e.id AND r.revision = e.current_revision
|
|
142
229
|
WHERE entries_trigram MATCH ? AND ${filters}
|
|
143
230
|
ORDER BY score ASC, ${rankSql()}
|
|
144
231
|
LIMIT ?
|
|
145
|
-
`).all(...parameters)
|
|
232
|
+
`).all(...parameters);
|
|
233
|
+
const cjkWindow = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]/u.test(value);
|
|
234
|
+
for (const match of matches) {
|
|
235
|
+
const existing = rows.get(match.id);
|
|
236
|
+
if (existing !== undefined) {
|
|
237
|
+
if (cjkWindow)
|
|
238
|
+
existing.cjkWindow = true;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
rows.set(match.id, { ...match, ...(cjkWindow ? { cjkWindow: true } : {}) });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
146
244
|
}
|
|
147
|
-
return rows;
|
|
245
|
+
return [...rows.values()];
|
|
148
246
|
}
|
|
149
247
|
function likeLane(database, input, parsed) {
|
|
150
248
|
const values = [...new Set([
|
|
@@ -172,16 +270,57 @@ function likeLane(database, input, parsed) {
|
|
|
172
270
|
}
|
|
173
271
|
return [...result.values()];
|
|
174
272
|
}
|
|
175
|
-
function
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
[
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
273
|
+
function semanticLane(database, input, runtime) {
|
|
274
|
+
const semantic = runtime.semantic;
|
|
275
|
+
if (semantic === undefined)
|
|
276
|
+
return [];
|
|
277
|
+
const { query, backend } = semantic;
|
|
278
|
+
if (typeof query.profileId !== 'string' || query.profileId.length === 0
|
|
279
|
+
|| !Number.isSafeInteger(query.dimensions) || query.dimensions < 2 || query.dimensions > 8192
|
|
280
|
+
|| !(query.vector instanceof Float32Array) || query.vector.length !== query.dimensions
|
|
281
|
+
|| !Number.isFinite(query.distanceCeiling) || query.distanceCeiling < 0 || query.distanceCeiling >= 2
|
|
282
|
+
|| typeof query.backendId !== 'string' || query.backendId.length === 0
|
|
283
|
+
|| query.backendId !== backend.id) {
|
|
284
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Prepared semantic query is invalid');
|
|
285
|
+
}
|
|
286
|
+
const hits = backend.search(database, {
|
|
287
|
+
profileId: query.profileId,
|
|
288
|
+
dimensions: query.dimensions,
|
|
289
|
+
queryVector: query.vector,
|
|
290
|
+
distanceCeiling: query.distanceCeiling,
|
|
291
|
+
workspace: input.workspace,
|
|
292
|
+
limit: MAX_LANE_CANDIDATES,
|
|
293
|
+
});
|
|
294
|
+
if (!Array.isArray(hits) || hits.length > MAX_LANE_CANDIDATES) {
|
|
295
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Semantic backend returned too many candidates');
|
|
296
|
+
}
|
|
297
|
+
const canonical = new Map();
|
|
298
|
+
for (const hit of hits) {
|
|
299
|
+
if (typeof hit !== 'object' || hit === null
|
|
300
|
+
|| typeof hit.entryId !== 'string' || hit.entryId.length === 0
|
|
301
|
+
|| !Number.isFinite(hit.distance) || hit.distance < 0) {
|
|
302
|
+
throw new KiokukoError('INTEGRITY_ERROR', 'Semantic backend returned an invalid candidate');
|
|
303
|
+
}
|
|
304
|
+
if (hit.distance > query.distanceCeiling)
|
|
305
|
+
continue;
|
|
306
|
+
const previous = canonical.get(hit.entryId);
|
|
307
|
+
if (previous === undefined || hit.distance < previous)
|
|
308
|
+
canonical.set(hit.entryId, hit.distance);
|
|
309
|
+
}
|
|
310
|
+
return [...canonical.entries()]
|
|
311
|
+
.sort((left, right) => left[1] - right[1] || compareCanonicalStrings(left[0], right[0]))
|
|
312
|
+
.map(([id]) => ({ id }));
|
|
183
313
|
}
|
|
184
|
-
|
|
314
|
+
function laneRows(database, input, parsed, runtime, lexicalAllowed) {
|
|
315
|
+
const rows = [['exact-signal', exactSignalLane(database, input, parsed)]];
|
|
316
|
+
if (lexicalAllowed) {
|
|
317
|
+
rows.push(['word-fts', wordFtsLane(database, input, parsed)], ['trigram', trigramLane(database, input, parsed)], ['like', likeLane(database, input, parsed)], ['tag', tagLane(database, input, parsed)]);
|
|
318
|
+
}
|
|
319
|
+
if (runtime.semantic !== undefined)
|
|
320
|
+
rows.push(['semantic', semanticLane(database, input, runtime)]);
|
|
321
|
+
return rows;
|
|
322
|
+
}
|
|
323
|
+
export function hybridSearch(database, input, runtime = {}) {
|
|
185
324
|
if (typeof input.workspace !== 'string' || input.workspace.trim().length === 0)
|
|
186
325
|
invalid();
|
|
187
326
|
if (!Number.isSafeInteger(input.limit) || input.limit < 1 || input.limit > 1_000)
|
|
@@ -197,10 +336,10 @@ export function hybridSearch(database, input) {
|
|
|
197
336
|
return [];
|
|
198
337
|
// Treat SQL/FTS-looking operator soup as data, not as a broad OR query. A
|
|
199
338
|
// punctuation-heavy request must never turn into a full-table lexical scan.
|
|
200
|
-
|
|
201
|
-
|
|
339
|
+
const lexicalAllowed = !/(?:--|\/\*|\*\/|["']\s*(?:OR|AND)\b|\b(?:OR|AND)\s+\d+\s*[=<>])/iu.test(parsed.normalized)
|
|
340
|
+
|| parsed.exactSignals.length > 0;
|
|
202
341
|
const merged = new Map();
|
|
203
|
-
for (const [lane, rows] of laneRows(database, input, parsed)) {
|
|
342
|
+
for (const [lane, rows] of laneRows(database, input, parsed, runtime, lexicalAllowed)) {
|
|
204
343
|
const seen = new Set();
|
|
205
344
|
let rank = 0;
|
|
206
345
|
for (const row of rows) {
|
|
@@ -215,12 +354,17 @@ export function hybridSearch(database, input) {
|
|
|
215
354
|
existing.reasons.push('exact_signal_match');
|
|
216
355
|
if (lane === 'word-fts')
|
|
217
356
|
existing.reasons.push('word_match');
|
|
218
|
-
if (lane === 'trigram')
|
|
357
|
+
if (lane === 'trigram') {
|
|
219
358
|
existing.reasons.push('substring_match');
|
|
359
|
+
if (row.cjkWindow === true)
|
|
360
|
+
existing.reasons.push('cjk_window_match');
|
|
361
|
+
}
|
|
220
362
|
if (lane === 'like')
|
|
221
363
|
existing.reasons.push('literal_fallback_match');
|
|
222
364
|
if (lane === 'tag')
|
|
223
365
|
existing.reasons.push('tag_match');
|
|
366
|
+
if (lane === 'semantic')
|
|
367
|
+
existing.reasons.push('semantic_match');
|
|
224
368
|
existing.matchedSignals.push(...parsed.exactSignals.map((signal) => signal.value));
|
|
225
369
|
merged.set(row.id, existing);
|
|
226
370
|
if (merged.size >= MAX_MERGED_CANDIDATES)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid-retrieval.js","sourceRoot":"","sources":["../../src/memory/hybrid-retrieval.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"hybrid-retrieval.js","sourceRoot":"","sources":["../../src/memory/hybrid-retrieval.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { SqliteDatabase } from '../db/adapter.js';
|
|
2
|
+
/** Rebuild the projection shape used only while migrations 005 through 019 are being applied. */
|
|
3
|
+
export declare function rebuildLegacyHybridSearchInTransaction(database: SqliteDatabase): {
|
|
4
|
+
entries: number;
|
|
5
|
+
signals: number;
|
|
6
|
+
};
|
|
2
7
|
/** Rebuild while participating in a transaction already owned by the caller. */
|
|
3
8
|
export declare function rebuildHybridSearchInTransaction(database: SqliteDatabase): {
|
|
4
9
|
entries: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuild-search.d.ts","sourceRoot":"","sources":["../../src/memory/rebuild-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"rebuild-search.d.ts","sourceRoot":"","sources":["../../src/memory/rebuild-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,kBAAkB,CAAC;AA2FlE,iGAAiG;AACjG,wBAAgB,sCAAsC,CAAC,QAAQ,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAyBrH;AAED,gFAAgF;AAChF,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiC/G;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAElG;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,cAAc,GAAG;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAkCA"}
|
|
@@ -2,10 +2,32 @@ import { withImmediateTransaction } from '../db/transaction.js';
|
|
|
2
2
|
import { KiokukoError } from '../errors.js';
|
|
3
3
|
import { readEntry } from './entries.js';
|
|
4
4
|
import { decodeStoredStructuredScope } from './revisions.js';
|
|
5
|
-
import { extractEntrySearchSignals, requireHybridSearchProjectionSchema } from './structured-memory.js';
|
|
5
|
+
import { extractEntrySearchSignals, hybridSearchProjectionSchema, requireHybridSearchProjectionSchema, } from './structured-memory.js';
|
|
6
6
|
function integrity(message = 'Stored search projection source is invalid') {
|
|
7
7
|
throw new KiokukoError('INTEGRITY_ERROR', message);
|
|
8
8
|
}
|
|
9
|
+
const UNIFIED_FTS_TABLES = ['entries_fts', 'entries_trigram'];
|
|
10
|
+
function assertUnifiedFtsIntegrity(database) {
|
|
11
|
+
try {
|
|
12
|
+
for (const table of UNIFIED_FTS_TABLES) {
|
|
13
|
+
database.prepare(`INSERT INTO ${table}(${table}, rank) VALUES ('integrity-check', 1)`).run();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
integrity('Hybrid search index is inconsistent with its content');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function rebuildUnifiedFtsIndexes(database) {
|
|
21
|
+
try {
|
|
22
|
+
for (const table of UNIFIED_FTS_TABLES) {
|
|
23
|
+
database.prepare(`INSERT INTO ${table}(${table}) VALUES ('rebuild')`).run();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
integrity('Hybrid search index rebuild failed');
|
|
28
|
+
}
|
|
29
|
+
assertUnifiedFtsIntegrity(database);
|
|
30
|
+
}
|
|
9
31
|
function preparedProjections(database) {
|
|
10
32
|
const entryCount = database.prepare('SELECT COUNT(*) AS count FROM entries').get()?.count;
|
|
11
33
|
if (typeof entryCount !== 'number' || !Number.isSafeInteger(entryCount) || entryCount < 0)
|
|
@@ -47,9 +69,8 @@ function preparedProjections(database) {
|
|
|
47
69
|
};
|
|
48
70
|
});
|
|
49
71
|
}
|
|
50
|
-
/** Rebuild
|
|
51
|
-
export function
|
|
52
|
-
requireHybridSearchProjectionSchema(database);
|
|
72
|
+
/** Rebuild the projection shape used only while migrations 005 through 019 are being applied. */
|
|
73
|
+
export function rebuildLegacyHybridSearchInTransaction(database) {
|
|
53
74
|
const projections = preparedProjections(database);
|
|
54
75
|
const expectedSignals = projections.reduce((count, projection) => count + projection.signals.length, 0);
|
|
55
76
|
database.exec('DELETE FROM entries_fts');
|
|
@@ -69,6 +90,31 @@ export function rebuildHybridSearchInTransaction(database) {
|
|
|
69
90
|
const trigramCount = database.prepare('SELECT COUNT(*) AS count FROM entries_trigram').get()?.count;
|
|
70
91
|
const signalCount = database.prepare('SELECT COUNT(*) AS count FROM entry_search_signals').get()?.count;
|
|
71
92
|
if (ftsCount !== projections.length || trigramCount !== projections.length || signalCount !== expectedSignals) {
|
|
93
|
+
integrity('Legacy hybrid search projection rebuild produced an incomplete result');
|
|
94
|
+
}
|
|
95
|
+
return { entries: projections.length, signals: expectedSignals };
|
|
96
|
+
}
|
|
97
|
+
/** Rebuild while participating in a transaction already owned by the caller. */
|
|
98
|
+
export function rebuildHybridSearchInTransaction(database) {
|
|
99
|
+
requireHybridSearchProjectionSchema(database);
|
|
100
|
+
const projections = preparedProjections(database);
|
|
101
|
+
const expectedSignals = projections.reduce((count, projection) => count + projection.signals.length, 0);
|
|
102
|
+
// Repair the external indexes before content-table deletes fire FTS delete
|
|
103
|
+
// commands; an empty or inconsistent index cannot safely consume them.
|
|
104
|
+
rebuildUnifiedFtsIndexes(database);
|
|
105
|
+
database.exec('DELETE FROM entry_search_documents');
|
|
106
|
+
database.exec('DELETE FROM entry_search_signals');
|
|
107
|
+
const insertDocument = database.prepare('INSERT INTO entry_search_documents (entry_rowid, entry_id, title, body, summary, tags_text) VALUES (?, ?, ?, ?, ?, ?)');
|
|
108
|
+
const insertSignal = database.prepare('INSERT INTO entry_search_signals (entry_id, signal_type, normalized_value) VALUES (?, ?, ?)');
|
|
109
|
+
for (const projection of projections) {
|
|
110
|
+
insertDocument.run(projection.rowid, projection.entryId, projection.title, projection.body, projection.summary, projection.tagsText);
|
|
111
|
+
for (const signal of projection.signals)
|
|
112
|
+
insertSignal.run(projection.entryId, signal.type, signal.value);
|
|
113
|
+
}
|
|
114
|
+
rebuildUnifiedFtsIndexes(database);
|
|
115
|
+
const documentCount = database.prepare('SELECT COUNT(*) AS count FROM entry_search_documents').get()?.count;
|
|
116
|
+
const signalCount = database.prepare('SELECT COUNT(*) AS count FROM entry_search_signals').get()?.count;
|
|
117
|
+
if (documentCount !== projections.length || signalCount !== expectedSignals) {
|
|
72
118
|
integrity('Hybrid search projection rebuild produced an incomplete result');
|
|
73
119
|
}
|
|
74
120
|
return { entries: projections.length, signals: expectedSignals };
|
|
@@ -77,7 +123,9 @@ export function rebuildHybridSearch(database) {
|
|
|
77
123
|
return withImmediateTransaction(database, () => rebuildHybridSearchInTransaction(database));
|
|
78
124
|
}
|
|
79
125
|
export function hybridSearchProjectionStatus(database) {
|
|
80
|
-
|
|
126
|
+
const projectionSchema = hybridSearchProjectionSchema(database);
|
|
127
|
+
if (projectionSchema === 'unified')
|
|
128
|
+
assertUnifiedFtsIntegrity(database);
|
|
81
129
|
const projections = preparedProjections(database);
|
|
82
130
|
const storedCount = (table) => {
|
|
83
131
|
const count = database.prepare(`SELECT COUNT(*) AS count FROM ${table}`).get()?.count;
|
|
@@ -86,7 +134,8 @@ export function hybridSearchProjectionStatus(database) {
|
|
|
86
134
|
return count;
|
|
87
135
|
};
|
|
88
136
|
const entries = projections.length;
|
|
89
|
-
const
|
|
137
|
+
const trigramTable = projectionSchema === 'unified' ? 'entry_search_documents' : 'entries_trigram';
|
|
138
|
+
const trigram = storedCount(trigramTable);
|
|
90
139
|
const signals = storedCount('entry_search_signals');
|
|
91
140
|
let missingSignals = 0;
|
|
92
141
|
let extraSignals = 0;
|
|
@@ -100,8 +149,13 @@ export function hybridSearchProjectionStatus(database) {
|
|
|
100
149
|
for (const signal of actual)
|
|
101
150
|
if (!expected.has(signal))
|
|
102
151
|
extraSignals += 1;
|
|
103
|
-
const projected =
|
|
152
|
+
const projected = projectionSchema === 'unified'
|
|
153
|
+
? database.prepare('SELECT entry_id, title, body, summary, tags_text FROM entry_search_documents WHERE entry_rowid = ?')
|
|
154
|
+
.get(projection.rowid)
|
|
155
|
+
: database.prepare('SELECT title, body, summary, tags_text FROM entries_trigram WHERE rowid = ?')
|
|
156
|
+
.get(projection.rowid);
|
|
104
157
|
if (!projected
|
|
158
|
+
|| (projectionSchema === 'unified' && projected.entry_id !== projection.entryId)
|
|
105
159
|
|| projected.title !== projection.title
|
|
106
160
|
|| projected.body !== projection.body
|
|
107
161
|
|| projected.summary !== projection.summary
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rebuild-search.js","sourceRoot":"","sources":["../../src/memory/rebuild-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"rebuild-search.js","sourceRoot":"","sources":["../../src/memory/rebuild-search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,mCAAmC,GACpC,MAAM,wBAAwB,CAAC;AAkBhC,SAAS,SAAS,CAAC,OAAO,GAAG,4CAA4C;IACvE,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAU,CAAC;AAEvE,SAAS,yBAAyB,CAAC,QAAwB;IACzD,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,QAAQ,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI,KAAK,uCAAuC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC/F,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,CAAC,sDAAsD,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAwB;IACxD,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC;YACvC,QAAQ,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI,KAAK,sBAAsB,CAAC,CAAC,GAAG,EAAE,CAAC;QAC9E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAClD,CAAC;IACD,yBAAyB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAwB;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAsB,EAAE,KAAK,CAAC;IAC9G,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC;QAAE,SAAS,EAAE,CAAC;IACvG,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAAiB,CAAC;IAC3G,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU;QAAE,SAAS,CAAC,qCAAqC,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC;eACjF,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;eACjD,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS,EAAE,CAAC;QAClF,IAAI,KAAmC,CAAC;QACxC,IAAI,CAAC;YACH,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY;mBAC5B,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;gBAAE,SAAS,EAAE,CAAC;YACpF,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;QACtE,OAAO;YACL,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,EAAE;YACf,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;YAC5B,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAC9B,OAAO,EAAE,yBAAyB,CAAC;gBACjC,OAAO,EAAE,GAAG,CAAC,EAAE;gBACf,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK;aACN,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,sCAAsC,CAAC,QAAwB;IAC7E,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAExG,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7C,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAElD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,yFAAyF,CAAC,CAAC;IAC9H,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,6FAA6F,CAAC,CAAC;IACtI,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,6FAA6F,CAAC,CAAC;IACrI,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAU,CAAC;QAC3H,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QAC7B,aAAa,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO;YAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3G,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,EAAsB,EAAE,KAAK,CAAC;IAChH,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,EAAsB,EAAE,KAAK,CAAC;IACxH,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,EAAsB,EAAE,KAAK,CAAC;IAC5H,IAAI,QAAQ,KAAK,WAAW,CAAC,MAAM,IAAI,YAAY,KAAK,WAAW,CAAC,MAAM,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;QAC9G,SAAS,CAAC,uEAAuE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AACnE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,gCAAgC,CAAC,QAAwB;IACvE,mCAAmC,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAExG,2EAA2E;IAC3E,uEAAuE;IACvE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAElD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,uHAAuH,CAAC,CAAC;IACjK,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,6FAA6F,CAAC,CAAC;IACrI,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,cAAc,CAAC,GAAG,CAChB,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,QAAQ,CACpB,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAO;YAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3G,CAAC;IAED,wBAAwB,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAAsB,EAAE,KAAK,CAAC;IAChI,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,EAAsB,EAAE,KAAK,CAAC;IAC5H,IAAI,aAAa,KAAK,WAAW,CAAC,MAAM,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;QAC5E,SAAS,CAAC,gEAAgE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC1D,OAAO,wBAAwB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,gCAAgC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,QAAwB;IAQnE,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,gBAAgB,KAAK,SAAS;QAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,CAAC,KAA4E,EAAU,EAAE;QAC3G,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAsB,EAAE,KAAK,CAAC;QAC1G,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;QACxF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IACnC,MAAM,YAAY,GAAG,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IACnG,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACpD,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;IAC/C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpG,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,mFAAmF,CAAC,CAAC,GAAG,CAAoD,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,WAAW,SAAS,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAClR,KAAK,MAAM,MAAM,IAAI,QAAQ;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,cAAc,IAAI,CAAC,CAAC;QAC5E,KAAK,MAAM,MAAM,IAAI,MAAM;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,YAAY,IAAI,CAAC,CAAC;QAC1E,MAAM,SAAS,GAAG,gBAAgB,KAAK,SAAS;YAC9C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,oGAAoG,CAAC;iBACrH,GAAG,CAA8F,UAAU,CAAC,KAAK,CAAC;YACrH,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,6EAA6E,CAAC;iBAC9F,GAAG,CAA8F,UAAU,CAAC,KAAK,CAAC,CAAC;QACxH,IAAI,CAAC,SAAS;eACT,CAAC,gBAAgB,KAAK,SAAS,IAAI,SAAS,CAAC,QAAQ,KAAK,UAAU,CAAC,OAAO,CAAC;eAC7E,SAAS,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK;eACpC,SAAS,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;eAClC,SAAS,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO;eACxC,SAAS,CAAC,SAAS,KAAK,UAAU,CAAC,QAAQ;YAAE,YAAY,IAAI,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AACnF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieval-query.d.ts","sourceRoot":"","sources":["../../src/memory/retrieval-query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retrieval-query.d.ts","sourceRoot":"","sources":["../../src/memory/retrieval-query.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,iBAAiB,EAAE,CAAC;CACnC;AA4HD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAgCxE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D"}
|
|
@@ -2,6 +2,10 @@ import { KiokukoError } from '../errors.js';
|
|
|
2
2
|
const MAX_QUERY_BYTES = 16 * 1024;
|
|
3
3
|
const MAX_TERMS = 64;
|
|
4
4
|
const MAX_TERM_LENGTH = 512;
|
|
5
|
+
const MAX_CJK_SUBSTRING_TERMS = 24;
|
|
6
|
+
const MAX_CJK_BIGRAM_TERMS = 6;
|
|
7
|
+
const JAPANESE_RUN = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\u3005\u303B\u309D\u309E\u30FC\u30FD\u30FE]{2,}/gu;
|
|
8
|
+
const SAME_SCRIPT_JAPANESE_RUN = /(?:[\p{Script=Han}\u3005\u303B]{2,}|[\p{Script=Hiragana}\u309D\u309E]{2,}|[\p{Script=Katakana}\u30FC\u30FD\u30FE]{2,})/gu;
|
|
5
9
|
const STRUCTURED_SIGNAL = /(?:sqlstate\[[^\]]+\]|(?:[a-z_$][\w$]*)(?:::|->)[\w$:.()\\-]+|(?:[a-z_$][\w$]*\\)+[\w$.-]+|(?:^|\s)\/[\w./-]+|@[A-Za-z][\w.-]*|\$[A-Za-z_][\w$]*|[A-Za-z0-9_.-]+\/[A-Za-z0-9_./-]+)/gu;
|
|
6
10
|
function invalid() {
|
|
7
11
|
throw new KiokukoError('VALIDATION_ERROR', 'Search query is invalid');
|
|
@@ -28,6 +32,97 @@ function signalType(value) {
|
|
|
28
32
|
function unique(values) {
|
|
29
33
|
return [...new Set(values)].filter((value) => value.length > 0).slice(0, MAX_TERMS);
|
|
30
34
|
}
|
|
35
|
+
function japaneseScript(value) {
|
|
36
|
+
if (/[\p{Script=Han}\u3005\u303B]/u.test(value))
|
|
37
|
+
return 'han';
|
|
38
|
+
if (/[\p{Script=Hiragana}\u309D\u309E]/u.test(value))
|
|
39
|
+
return 'hiragana';
|
|
40
|
+
return 'katakana';
|
|
41
|
+
}
|
|
42
|
+
function windows(value, lengths) {
|
|
43
|
+
const points = Array.from(value);
|
|
44
|
+
const pools = lengths.map((length) => {
|
|
45
|
+
if (points.length < length)
|
|
46
|
+
return undefined;
|
|
47
|
+
const lastStart = points.length - length;
|
|
48
|
+
const candidateStarts = lastStart + 1 <= MAX_CJK_SUBSTRING_TERMS
|
|
49
|
+
? Array.from({ length: lastStart + 1 }, (_, index) => index)
|
|
50
|
+
: Array.from({ length: MAX_CJK_SUBSTRING_TERMS }, (_, index) => Math.round(index * lastStart / (MAX_CJK_SUBSTRING_TERMS - 1)));
|
|
51
|
+
const boundaryStarts = points.flatMap((point, index) => index > 0
|
|
52
|
+
&& japaneseScript(points[index - 1]) !== japaneseScript(point)
|
|
53
|
+
? [Math.max(0, Math.min(lastStart, index - Math.floor(length / 2)))]
|
|
54
|
+
: []);
|
|
55
|
+
const starts = [...new Set([
|
|
56
|
+
0,
|
|
57
|
+
Math.ceil(lastStart / 2),
|
|
58
|
+
lastStart,
|
|
59
|
+
...boundaryStarts,
|
|
60
|
+
...candidateStarts,
|
|
61
|
+
])].slice(0, MAX_CJK_SUBSTRING_TERMS);
|
|
62
|
+
return starts.map((start) => points.slice(start, start + length).join(''));
|
|
63
|
+
}).filter((pool) => pool !== undefined);
|
|
64
|
+
const result = [];
|
|
65
|
+
for (let offset = 0; pools.some((pool) => offset < pool.length); offset += 1) {
|
|
66
|
+
for (const pool of pools)
|
|
67
|
+
if (offset < pool.length)
|
|
68
|
+
result.push(pool[offset]);
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
function takeRoundRobin(pools, limit, seen) {
|
|
73
|
+
const offsets = pools.map(() => 0);
|
|
74
|
+
const result = [];
|
|
75
|
+
while (result.length < limit) {
|
|
76
|
+
let consumed = false;
|
|
77
|
+
for (let index = 0; index < pools.length && result.length < limit; index += 1) {
|
|
78
|
+
const pool = pools[index];
|
|
79
|
+
while (offsets[index] < pool.length) {
|
|
80
|
+
const candidate = pool[offsets[index]];
|
|
81
|
+
offsets[index] = offsets[index] + 1;
|
|
82
|
+
if (seen.has(candidate))
|
|
83
|
+
continue;
|
|
84
|
+
seen.add(candidate);
|
|
85
|
+
result.push(candidate);
|
|
86
|
+
consumed = true;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (!consumed)
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
function mixedScriptBoundaryTerms(runs) {
|
|
96
|
+
const result = [];
|
|
97
|
+
for (const run of runs) {
|
|
98
|
+
const points = Array.from(run);
|
|
99
|
+
for (let index = 1; index < points.length; index += 1) {
|
|
100
|
+
if (japaneseScript(points[index - 1]) === japaneseScript(points[index]))
|
|
101
|
+
continue;
|
|
102
|
+
for (const length of [3, 4]) {
|
|
103
|
+
if (points.length < length)
|
|
104
|
+
continue;
|
|
105
|
+
const start = Math.max(0, Math.min(points.length - length, index - Math.floor(length / 2)));
|
|
106
|
+
result.push(points.slice(start, start + length).join(''));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
/** Allocate bounded overlapping CJK windows without allowing one long run to starve later runs. */
|
|
113
|
+
function cjkSubstringTerms(runs, mixedRuns) {
|
|
114
|
+
const normalizedRuns = [...new Set(runs)].filter((run) => Array.from(run).length >= 2);
|
|
115
|
+
const seen = new Set();
|
|
116
|
+
const primaryLimit = MAX_CJK_SUBSTRING_TERMS - MAX_CJK_BIGRAM_TERMS;
|
|
117
|
+
const primary = takeRoundRobin(normalizedRuns.map((run) => windows(run, [3, 4])), primaryLimit, seen);
|
|
118
|
+
const mixed = unique(mixedScriptBoundaryTerms(mixedRuns))
|
|
119
|
+
.filter((term) => !seen.has(term))
|
|
120
|
+
.slice(0, MAX_CJK_SUBSTRING_TERMS - primary.length);
|
|
121
|
+
for (const term of mixed)
|
|
122
|
+
seen.add(term);
|
|
123
|
+
const auxiliary = takeRoundRobin(normalizedRuns.map((run) => windows(run, [2])), MAX_CJK_SUBSTRING_TERMS - primary.length - mixed.length, seen);
|
|
124
|
+
return [...primary, ...mixed, ...auxiliary];
|
|
125
|
+
}
|
|
31
126
|
export function parseRetrievalQuery(input) {
|
|
32
127
|
if (typeof input !== 'string')
|
|
33
128
|
invalid();
|
|
@@ -50,9 +145,12 @@ export function parseRetrievalQuery(input) {
|
|
|
50
145
|
.map((term) => term.slice(0, MAX_TERM_LENGTH));
|
|
51
146
|
const phraseTerms = unique(normalized.split(/\s+/u).filter((term) => term.length > 1))
|
|
52
147
|
.map((term) => term.slice(0, MAX_TERM_LENGTH));
|
|
148
|
+
const cjkRuns = normalized.match(SAME_SCRIPT_JAPANESE_RUN) ?? [];
|
|
149
|
+
const mixedRuns = (normalized.match(JAPANESE_RUN) ?? [])
|
|
150
|
+
.filter((run) => new Set(Array.from(run).map(japaneseScript)).size > 1);
|
|
53
151
|
const substringTerms = unique([
|
|
54
152
|
...exactSignals.map((signal) => signal.value),
|
|
55
|
-
...(
|
|
153
|
+
...cjkSubstringTerms(cjkRuns, mixedRuns),
|
|
56
154
|
...lexicalTerms.filter((term) => term.length >= 2),
|
|
57
155
|
]).map((term) => term.slice(0, MAX_TERM_LENGTH));
|
|
58
156
|
return { raw, normalized, lexicalTerms, phraseTerms, substringTerms, exactSignals };
|