@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.
Files changed (213) hide show
  1. package/README.ja.md +54 -0
  2. package/README.ko.md +54 -0
  3. package/README.md +55 -0
  4. package/README.zh-CN.md +52 -0
  5. package/dist/agent-file/render.d.ts +1 -1
  6. package/dist/agent-file/render.js +2 -2
  7. package/dist/agent-file/render.js.map +1 -1
  8. package/dist/akinator/agent-task.d.ts +3 -0
  9. package/dist/akinator/agent-task.d.ts.map +1 -1
  10. package/dist/akinator/agent-task.js +52 -10
  11. package/dist/akinator/agent-task.js.map +1 -1
  12. package/dist/akinator/capabilities.d.ts +7 -1
  13. package/dist/akinator/capabilities.d.ts.map +1 -1
  14. package/dist/akinator/capabilities.js +10 -3
  15. package/dist/akinator/capabilities.js.map +1 -1
  16. package/dist/akinator/capability-binding.d.ts.map +1 -1
  17. package/dist/akinator/capability-binding.js +18 -3
  18. package/dist/akinator/capability-binding.js.map +1 -1
  19. package/dist/cli.d.ts +4 -0
  20. package/dist/cli.d.ts.map +1 -1
  21. package/dist/cli.js +89 -8
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/agent.d.ts.map +1 -1
  24. package/dist/commands/agent.js +21 -1
  25. package/dist/commands/agent.js.map +1 -1
  26. package/dist/commands/doctor.d.ts +4 -0
  27. package/dist/commands/doctor.d.ts.map +1 -1
  28. package/dist/commands/doctor.js +45 -3
  29. package/dist/commands/doctor.js.map +1 -1
  30. package/dist/commands/embeddings.d.ts +19 -0
  31. package/dist/commands/embeddings.d.ts.map +1 -0
  32. package/dist/commands/embeddings.js +159 -0
  33. package/dist/commands/embeddings.js.map +1 -0
  34. package/dist/commands/import.d.ts.map +1 -1
  35. package/dist/commands/import.js +7 -0
  36. package/dist/commands/import.js.map +1 -1
  37. package/dist/commands/init.d.ts.map +1 -1
  38. package/dist/commands/init.js +4 -1
  39. package/dist/commands/init.js.map +1 -1
  40. package/dist/commands/use.d.ts.map +1 -1
  41. package/dist/commands/use.js +22 -8
  42. package/dist/commands/use.js.map +1 -1
  43. package/dist/context/broker.d.ts +3 -1
  44. package/dist/context/broker.d.ts.map +1 -1
  45. package/dist/context/broker.js +11 -7
  46. package/dist/context/broker.js.map +1 -1
  47. package/dist/context/delivery.d.ts.map +1 -1
  48. package/dist/context/delivery.js +10 -4
  49. package/dist/context/delivery.js.map +1 -1
  50. package/dist/context/ranking.d.ts +1 -1
  51. package/dist/context/ranking.d.ts.map +1 -1
  52. package/dist/context/ranking.js +2 -0
  53. package/dist/context/ranking.js.map +1 -1
  54. package/dist/context/scoped-broker.d.ts +4 -3
  55. package/dist/context/scoped-broker.d.ts.map +1 -1
  56. package/dist/context/scoped-broker.js +45 -7
  57. package/dist/context/scoped-broker.js.map +1 -1
  58. package/dist/context/selection-state.d.ts +12 -0
  59. package/dist/context/selection-state.d.ts.map +1 -1
  60. package/dist/context/selection-state.js +117 -7
  61. package/dist/context/selection-state.js.map +1 -1
  62. package/dist/db/capabilities.d.ts +8 -0
  63. package/dist/db/capabilities.d.ts.map +1 -1
  64. package/dist/db/capabilities.js +14 -0
  65. package/dist/db/capabilities.js.map +1 -1
  66. package/dist/db/connection.d.ts +7 -0
  67. package/dist/db/connection.d.ts.map +1 -1
  68. package/dist/db/connection.js +56 -0
  69. package/dist/db/connection.js.map +1 -1
  70. package/dist/db/migrate.d.ts.map +1 -1
  71. package/dist/db/migrate.js +3 -0
  72. package/dist/db/migrate.js.map +1 -1
  73. package/dist/embedding/backend.d.ts +27 -0
  74. package/dist/embedding/backend.d.ts.map +1 -0
  75. package/dist/embedding/backend.js +51 -0
  76. package/dist/embedding/backend.js.map +1 -0
  77. package/dist/embedding/config.d.ts +7 -0
  78. package/dist/embedding/config.d.ts.map +1 -0
  79. package/dist/embedding/config.js +125 -0
  80. package/dist/embedding/config.js.map +1 -0
  81. package/dist/embedding/diagnostics.d.ts +34 -0
  82. package/dist/embedding/diagnostics.d.ts.map +1 -0
  83. package/dist/embedding/diagnostics.js +248 -0
  84. package/dist/embedding/diagnostics.js.map +1 -0
  85. package/dist/embedding/document.d.ts +15 -0
  86. package/dist/embedding/document.d.ts.map +1 -0
  87. package/dist/embedding/document.js +102 -0
  88. package/dist/embedding/document.js.map +1 -0
  89. package/dist/embedding/javascript-backend.d.ts +11 -0
  90. package/dist/embedding/javascript-backend.d.ts.map +1 -0
  91. package/dist/embedding/javascript-backend.js +164 -0
  92. package/dist/embedding/javascript-backend.js.map +1 -0
  93. package/dist/embedding/jobs.d.ts +67 -0
  94. package/dist/embedding/jobs.d.ts.map +1 -0
  95. package/dist/embedding/jobs.js +259 -0
  96. package/dist/embedding/jobs.js.map +1 -0
  97. package/dist/embedding/openai-compatible-provider.d.ts +24 -0
  98. package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
  99. package/dist/embedding/openai-compatible-provider.js +330 -0
  100. package/dist/embedding/openai-compatible-provider.js.map +1 -0
  101. package/dist/embedding/profile.d.ts +6 -0
  102. package/dist/embedding/profile.d.ts.map +1 -0
  103. package/dist/embedding/profile.js +31 -0
  104. package/dist/embedding/profile.js.map +1 -0
  105. package/dist/embedding/provider.d.ts +13 -0
  106. package/dist/embedding/provider.d.ts.map +1 -0
  107. package/dist/embedding/provider.js +17 -0
  108. package/dist/embedding/provider.js.map +1 -0
  109. package/dist/embedding/query-cache.d.ts +39 -0
  110. package/dist/embedding/query-cache.d.ts.map +1 -0
  111. package/dist/embedding/query-cache.js +160 -0
  112. package/dist/embedding/query-cache.js.map +1 -0
  113. package/dist/embedding/runtime.d.ts +13 -0
  114. package/dist/embedding/runtime.d.ts.map +1 -0
  115. package/dist/embedding/runtime.js +373 -0
  116. package/dist/embedding/runtime.js.map +1 -0
  117. package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
  118. package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
  119. package/dist/embedding/sqlite-vec-backend.js +106 -0
  120. package/dist/embedding/sqlite-vec-backend.js.map +1 -0
  121. package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
  122. package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
  123. package/dist/embedding/sqlite-vec-loader.js +51 -0
  124. package/dist/embedding/sqlite-vec-loader.js.map +1 -0
  125. package/dist/embedding/store.d.ts +64 -0
  126. package/dist/embedding/store.d.ts.map +1 -0
  127. package/dist/embedding/store.js +377 -0
  128. package/dist/embedding/store.js.map +1 -0
  129. package/dist/embedding/types.d.ts +97 -0
  130. package/dist/embedding/types.d.ts.map +1 -0
  131. package/dist/embedding/types.js +2 -0
  132. package/dist/embedding/types.js.map +1 -0
  133. package/dist/embedding/vector.d.ts +9 -0
  134. package/dist/embedding/vector.d.ts.map +1 -0
  135. package/dist/embedding/vector.js +90 -0
  136. package/dist/embedding/vector.js.map +1 -0
  137. package/dist/embedding/worker.d.ts +23 -0
  138. package/dist/embedding/worker.d.ts.map +1 -0
  139. package/dist/embedding/worker.js +84 -0
  140. package/dist/embedding/worker.js.map +1 -0
  141. package/dist/enno-oduno/schemas.d.ts +2 -2
  142. package/dist/ledger/checkpoint-contract.d.ts +2 -2
  143. package/dist/mcp/bounded-stdio-transport.d.ts +12 -2
  144. package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
  145. package/dist/mcp/bounded-stdio-transport.js +103 -4
  146. package/dist/mcp/bounded-stdio-transport.js.map +1 -1
  147. package/dist/mcp/runtime-owner.d.ts +27 -0
  148. package/dist/mcp/runtime-owner.d.ts.map +1 -0
  149. package/dist/mcp/runtime-owner.js +130 -0
  150. package/dist/mcp/runtime-owner.js.map +1 -0
  151. package/dist/mcp/server.d.ts +9 -1
  152. package/dist/mcp/server.d.ts.map +1 -1
  153. package/dist/mcp/server.js +103 -43
  154. package/dist/mcp/server.js.map +1 -1
  155. package/dist/memory/checkpoint-contract.d.ts +3 -3
  156. package/dist/memory/entries.d.ts.map +1 -1
  157. package/dist/memory/entries.js +13 -0
  158. package/dist/memory/entries.js.map +1 -1
  159. package/dist/memory/federated-retrieval.d.ts +3 -2
  160. package/dist/memory/federated-retrieval.d.ts.map +1 -1
  161. package/dist/memory/federated-retrieval.js +112 -31
  162. package/dist/memory/federated-retrieval.js.map +1 -1
  163. package/dist/memory/hybrid-retrieval.d.ts +11 -2
  164. package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
  165. package/dist/memory/hybrid-retrieval.js +175 -31
  166. package/dist/memory/hybrid-retrieval.js.map +1 -1
  167. package/dist/memory/rebuild-search.d.ts +5 -0
  168. package/dist/memory/rebuild-search.d.ts.map +1 -1
  169. package/dist/memory/rebuild-search.js +61 -7
  170. package/dist/memory/rebuild-search.js.map +1 -1
  171. package/dist/memory/retrieval-query.d.ts.map +1 -1
  172. package/dist/memory/retrieval-query.js +99 -1
  173. package/dist/memory/retrieval-query.js.map +1 -1
  174. package/dist/memory/retrieval.d.ts +4 -3
  175. package/dist/memory/retrieval.d.ts.map +1 -1
  176. package/dist/memory/retrieval.js +6 -6
  177. package/dist/memory/retrieval.js.map +1 -1
  178. package/dist/memory/scoped-memory.d.ts +2 -1
  179. package/dist/memory/scoped-memory.d.ts.map +1 -1
  180. package/dist/memory/scoped-memory.js +2 -2
  181. package/dist/memory/scoped-memory.js.map +1 -1
  182. package/dist/memory/structured-memory.d.ts +4 -0
  183. package/dist/memory/structured-memory.d.ts.map +1 -1
  184. package/dist/memory/structured-memory.js +101 -14
  185. package/dist/memory/structured-memory.js.map +1 -1
  186. package/dist/server/agent-application.js +1 -1
  187. package/dist/server/agent-application.js.map +1 -1
  188. package/dist/server/agent-checkpoint-use-case.d.ts.map +1 -1
  189. package/dist/server/agent-checkpoint-use-case.js +4 -3
  190. package/dist/server/agent-checkpoint-use-case.js.map +1 -1
  191. package/dist/server/http.d.ts +17 -1
  192. package/dist/server/http.d.ts.map +1 -1
  193. package/dist/server/http.js +76 -13
  194. package/dist/server/http.js.map +1 -1
  195. package/dist/server/routes/agent-capability-gate.d.ts +3 -0
  196. package/dist/server/routes/agent-capability-gate.d.ts.map +1 -1
  197. package/dist/server/routes/agent-capability-gate.js +23 -5
  198. package/dist/server/routes/agent-capability-gate.js.map +1 -1
  199. package/dist/setup/render.d.ts.map +1 -1
  200. package/dist/setup/render.js +9 -4
  201. package/dist/setup/render.js.map +1 -1
  202. package/dist/setup/standard-skills.d.ts +8 -1
  203. package/dist/setup/standard-skills.d.ts.map +1 -1
  204. package/dist/setup/standard-skills.js +8 -1
  205. package/dist/setup/standard-skills.js.map +1 -1
  206. package/migrations/020_cjk_fts.sql +80 -0
  207. package/migrations/021_semantic_embeddings.sql +122 -0
  208. package/migrations/down/020_cjk_fts.sql +38 -0
  209. package/migrations/down/021_semantic_embeddings.sql +17 -0
  210. package/package.json +7 -1
  211. package/skills/kiokuko-simple-work/SKILL.md +112 -0
  212. package/skills/kiokuko-soul/SKILL.md +39 -7
  213. 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': 1,
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 = parsed.exactSignals.map((signal) => signal.normalizedValue).filter(Boolean).slice(0, 32);
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
- const parameters = [quotedFts(value)];
118
- const filters = filterSql(input, parameters);
119
- parameters.push(MAX_LANE_CANDIDATES);
120
- rows.push(...database.prepare(`
121
- SELECT e.id, bm25(entries_fts) AS score
122
- FROM entries_fts JOIN entries e ON e.rowid = entries_fts.rowid
123
- JOIN entry_revisions r ON r.entry_id = e.id AND r.revision = e.current_revision
124
- WHERE entries_fts MATCH ? AND ${filters}
125
- ORDER BY score ASC, ${rankSql()}
126
- LIMIT ?
127
- `).all(...parameters));
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 >= 2).slice(0, 24);
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
- rows.push(...database.prepare(`
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 laneRows(database, input, parsed) {
176
- return [
177
- ['exact-signal', exactSignalLane(database, input, parsed)],
178
- ['word-fts', wordFtsLane(database, input, parsed)],
179
- ['trigram', trigramLane(database, input, parsed)],
180
- ['like', likeLane(database, input, parsed)],
181
- ['tag', tagLane(database, input, parsed)],
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
- export function hybridSearch(database, input) {
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
- if (/(?:--|\/\*|\*\/|["']\s*(?:OR|AND)\b|\b(?:OR|AND)\s+\d+\s*[=<>])/iu.test(parsed.normalized) && parsed.exactSignals.length === 0)
201
- return [];
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;AAgElE,gFAAgF;AAChF,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0B/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,CA2BA"}
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 while participating in a transaction already owned by the caller. */
51
- export function rebuildHybridSearchInTransaction(database) {
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
- requireHybridSearchProjectionSchema(database);
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 trigram = storedCount('entries_trigram');
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 = database.prepare('SELECT title, body, summary, tags_text FROM entries_trigram WHERE rowid = ?').get(projection.rowid);
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":"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"}
1
+ {"version":3,"file":"rebuild-search.js","sourceRoot":"","sources":["../../src/memory/rebuild-search.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"retrieval-query.d.ts","sourceRoot":"","sources":["../../src/memory/retrieval-query.ts"],"names":[],"mappings":"AAOA,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;AA2BD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CA6BxE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D"}
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
- ...(normalized.match(/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}]{2,}/gu) ?? []),
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 };