@askdkc/kiokuko 0.2.6 → 0.2.8

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 (251) hide show
  1. package/README.ja.md +18 -0
  2. package/README.ko.md +17 -0
  3. package/README.md +23 -0
  4. package/README.zh-CN.md +16 -0
  5. package/dist/akinator/agent-task.d.ts +5 -0
  6. package/dist/akinator/agent-task.d.ts.map +1 -1
  7. package/dist/akinator/agent-task.js +98 -28
  8. package/dist/akinator/agent-task.js.map +1 -1
  9. package/dist/cli.d.ts +4 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +94 -8
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/doctor.d.ts +4 -0
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +46 -1
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/embeddings.d.ts +26 -0
  18. package/dist/commands/embeddings.d.ts.map +1 -0
  19. package/dist/commands/embeddings.js +190 -0
  20. package/dist/commands/embeddings.js.map +1 -0
  21. package/dist/commands/import.d.ts.map +1 -1
  22. package/dist/commands/import.js +7 -0
  23. package/dist/commands/import.js.map +1 -1
  24. package/dist/commands/use.d.ts.map +1 -1
  25. package/dist/commands/use.js +22 -8
  26. package/dist/commands/use.js.map +1 -1
  27. package/dist/config/paths.d.ts +5 -0
  28. package/dist/config/paths.d.ts.map +1 -1
  29. package/dist/config/paths.js +34 -0
  30. package/dist/config/paths.js.map +1 -1
  31. package/dist/context/broker.d.ts +3 -1
  32. package/dist/context/broker.d.ts.map +1 -1
  33. package/dist/context/broker.js +11 -7
  34. package/dist/context/broker.js.map +1 -1
  35. package/dist/context/delivery.d.ts.map +1 -1
  36. package/dist/context/delivery.js +5 -3
  37. package/dist/context/delivery.js.map +1 -1
  38. package/dist/context/ranking.d.ts +1 -1
  39. package/dist/context/ranking.d.ts.map +1 -1
  40. package/dist/context/ranking.js +1 -0
  41. package/dist/context/ranking.js.map +1 -1
  42. package/dist/context/scoped-broker.d.ts +4 -3
  43. package/dist/context/scoped-broker.d.ts.map +1 -1
  44. package/dist/context/scoped-broker.js +45 -7
  45. package/dist/context/scoped-broker.js.map +1 -1
  46. package/dist/context/selection-state.d.ts +12 -0
  47. package/dist/context/selection-state.d.ts.map +1 -1
  48. package/dist/context/selection-state.js +117 -7
  49. package/dist/context/selection-state.js.map +1 -1
  50. package/dist/db/capabilities.d.ts +8 -0
  51. package/dist/db/capabilities.d.ts.map +1 -1
  52. package/dist/db/capabilities.js +14 -0
  53. package/dist/db/capabilities.js.map +1 -1
  54. package/dist/db/connection.d.ts +7 -0
  55. package/dist/db/connection.d.ts.map +1 -1
  56. package/dist/db/connection.js +56 -0
  57. package/dist/db/connection.js.map +1 -1
  58. package/dist/db/migrate.d.ts.map +1 -1
  59. package/dist/db/migrate.js +3 -0
  60. package/dist/db/migrate.js.map +1 -1
  61. package/dist/embedding/backend.d.ts +27 -0
  62. package/dist/embedding/backend.d.ts.map +1 -0
  63. package/dist/embedding/backend.js +67 -0
  64. package/dist/embedding/backend.js.map +1 -0
  65. package/dist/embedding/config.d.ts +10 -0
  66. package/dist/embedding/config.d.ts.map +1 -0
  67. package/dist/embedding/config.js +142 -0
  68. package/dist/embedding/config.js.map +1 -0
  69. package/dist/embedding/diagnostics.d.ts +34 -0
  70. package/dist/embedding/diagnostics.d.ts.map +1 -0
  71. package/dist/embedding/diagnostics.js +263 -0
  72. package/dist/embedding/diagnostics.js.map +1 -0
  73. package/dist/embedding/document.d.ts +20 -0
  74. package/dist/embedding/document.d.ts.map +1 -0
  75. package/dist/embedding/document.js +122 -0
  76. package/dist/embedding/document.js.map +1 -0
  77. package/dist/embedding/javascript-backend.d.ts +11 -0
  78. package/dist/embedding/javascript-backend.d.ts.map +1 -0
  79. package/dist/embedding/javascript-backend.js +164 -0
  80. package/dist/embedding/javascript-backend.js.map +1 -0
  81. package/dist/embedding/jobs.d.ts +67 -0
  82. package/dist/embedding/jobs.d.ts.map +1 -0
  83. package/dist/embedding/jobs.js +259 -0
  84. package/dist/embedding/jobs.js.map +1 -0
  85. package/dist/embedding/local-model-loader.d.ts +24 -0
  86. package/dist/embedding/local-model-loader.d.ts.map +1 -0
  87. package/dist/embedding/local-model-loader.js +64 -0
  88. package/dist/embedding/local-model-loader.js.map +1 -0
  89. package/dist/embedding/local-transformers-provider.d.ts +17 -0
  90. package/dist/embedding/local-transformers-provider.d.ts.map +1 -0
  91. package/dist/embedding/local-transformers-provider.js +54 -0
  92. package/dist/embedding/local-transformers-provider.js.map +1 -0
  93. package/dist/embedding/model-download.d.ts +32 -0
  94. package/dist/embedding/model-download.d.ts.map +1 -0
  95. package/dist/embedding/model-download.js +41 -0
  96. package/dist/embedding/model-download.js.map +1 -0
  97. package/dist/embedding/model-installation.d.ts +17 -0
  98. package/dist/embedding/model-installation.d.ts.map +1 -0
  99. package/dist/embedding/model-installation.js +71 -0
  100. package/dist/embedding/model-installation.js.map +1 -0
  101. package/dist/embedding/model-manifest.d.ts +18 -0
  102. package/dist/embedding/model-manifest.d.ts.map +1 -0
  103. package/dist/embedding/model-manifest.js +86 -0
  104. package/dist/embedding/model-manifest.js.map +1 -0
  105. package/dist/embedding/openai-compatible-provider.d.ts +24 -0
  106. package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
  107. package/dist/embedding/openai-compatible-provider.js +330 -0
  108. package/dist/embedding/openai-compatible-provider.js.map +1 -0
  109. package/dist/embedding/presets/local-small.d.ts +8 -0
  110. package/dist/embedding/presets/local-small.d.ts.map +1 -0
  111. package/dist/embedding/presets/local-small.js +67 -0
  112. package/dist/embedding/presets/local-small.js.map +1 -0
  113. package/dist/embedding/presets/manifest.d.ts +27 -0
  114. package/dist/embedding/presets/manifest.d.ts.map +1 -0
  115. package/dist/embedding/presets/manifest.js +5 -0
  116. package/dist/embedding/presets/manifest.js.map +1 -0
  117. package/dist/embedding/profile.d.ts +10 -0
  118. package/dist/embedding/profile.d.ts.map +1 -0
  119. package/dist/embedding/profile.js +67 -0
  120. package/dist/embedding/profile.js.map +1 -0
  121. package/dist/embedding/provider.d.ts +13 -0
  122. package/dist/embedding/provider.d.ts.map +1 -0
  123. package/dist/embedding/provider.js +17 -0
  124. package/dist/embedding/provider.js.map +1 -0
  125. package/dist/embedding/query-cache.d.ts +45 -0
  126. package/dist/embedding/query-cache.d.ts.map +1 -0
  127. package/dist/embedding/query-cache.js +181 -0
  128. package/dist/embedding/query-cache.js.map +1 -0
  129. package/dist/embedding/runtime.d.ts +14 -0
  130. package/dist/embedding/runtime.d.ts.map +1 -0
  131. package/dist/embedding/runtime.js +407 -0
  132. package/dist/embedding/runtime.js.map +1 -0
  133. package/dist/embedding/settings.d.ts +6 -0
  134. package/dist/embedding/settings.d.ts.map +1 -0
  135. package/dist/embedding/settings.js +69 -0
  136. package/dist/embedding/settings.js.map +1 -0
  137. package/dist/embedding/setup-lock.d.ts +7 -0
  138. package/dist/embedding/setup-lock.d.ts.map +1 -0
  139. package/dist/embedding/setup-lock.js +35 -0
  140. package/dist/embedding/setup-lock.js.map +1 -0
  141. package/dist/embedding/setup-service.d.ts +53 -0
  142. package/dist/embedding/setup-service.d.ts.map +1 -0
  143. package/dist/embedding/setup-service.js +184 -0
  144. package/dist/embedding/setup-service.js.map +1 -0
  145. package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
  146. package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
  147. package/dist/embedding/sqlite-vec-backend.js +106 -0
  148. package/dist/embedding/sqlite-vec-backend.js.map +1 -0
  149. package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
  150. package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
  151. package/dist/embedding/sqlite-vec-loader.js +51 -0
  152. package/dist/embedding/sqlite-vec-loader.js.map +1 -0
  153. package/dist/embedding/store.d.ts +66 -0
  154. package/dist/embedding/store.d.ts.map +1 -0
  155. package/dist/embedding/store.js +490 -0
  156. package/dist/embedding/store.js.map +1 -0
  157. package/dist/embedding/types.d.ts +126 -0
  158. package/dist/embedding/types.d.ts.map +1 -0
  159. package/dist/embedding/types.js +2 -0
  160. package/dist/embedding/types.js.map +1 -0
  161. package/dist/embedding/vector.d.ts +9 -0
  162. package/dist/embedding/vector.d.ts.map +1 -0
  163. package/dist/embedding/vector.js +90 -0
  164. package/dist/embedding/vector.js.map +1 -0
  165. package/dist/embedding/worker.d.ts +23 -0
  166. package/dist/embedding/worker.d.ts.map +1 -0
  167. package/dist/embedding/worker.js +84 -0
  168. package/dist/embedding/worker.js.map +1 -0
  169. package/dist/enno-oduno/schemas.d.ts +2 -2
  170. package/dist/ledger/checkpoint-contract.d.ts +2 -2
  171. package/dist/mcp/bounded-stdio-transport.d.ts +3 -0
  172. package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
  173. package/dist/mcp/bounded-stdio-transport.js +15 -3
  174. package/dist/mcp/bounded-stdio-transport.js.map +1 -1
  175. package/dist/mcp/request-deadline.d.ts +51 -0
  176. package/dist/mcp/request-deadline.d.ts.map +1 -0
  177. package/dist/mcp/request-deadline.js +155 -0
  178. package/dist/mcp/request-deadline.js.map +1 -0
  179. package/dist/mcp/runtime-owner.d.ts +27 -0
  180. package/dist/mcp/runtime-owner.d.ts.map +1 -0
  181. package/dist/mcp/runtime-owner.js +129 -0
  182. package/dist/mcp/runtime-owner.js.map +1 -0
  183. package/dist/mcp/server.d.ts +11 -1
  184. package/dist/mcp/server.d.ts.map +1 -1
  185. package/dist/mcp/server.js +83 -22
  186. package/dist/mcp/server.js.map +1 -1
  187. package/dist/memory/checkpoint-contract.d.ts +3 -3
  188. package/dist/memory/entries.d.ts.map +1 -1
  189. package/dist/memory/entries.js +13 -0
  190. package/dist/memory/entries.js.map +1 -1
  191. package/dist/memory/federated-retrieval.d.ts +3 -2
  192. package/dist/memory/federated-retrieval.d.ts.map +1 -1
  193. package/dist/memory/federated-retrieval.js +112 -31
  194. package/dist/memory/federated-retrieval.js.map +1 -1
  195. package/dist/memory/hybrid-retrieval.d.ts +9 -2
  196. package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
  197. package/dist/memory/hybrid-retrieval.js +60 -13
  198. package/dist/memory/hybrid-retrieval.js.map +1 -1
  199. package/dist/memory/retrieval.d.ts +4 -3
  200. package/dist/memory/retrieval.d.ts.map +1 -1
  201. package/dist/memory/retrieval.js +6 -6
  202. package/dist/memory/retrieval.js.map +1 -1
  203. package/dist/memory/scoped-memory.d.ts +3 -2
  204. package/dist/memory/scoped-memory.d.ts.map +1 -1
  205. package/dist/memory/scoped-memory.js +7 -3
  206. package/dist/memory/scoped-memory.js.map +1 -1
  207. package/dist/server/agent-application.js +1 -1
  208. package/dist/server/agent-application.js.map +1 -1
  209. package/dist/server/http.d.ts +17 -1
  210. package/dist/server/http.d.ts.map +1 -1
  211. package/dist/server/http.js +79 -13
  212. package/dist/server/http.js.map +1 -1
  213. package/dist/skills/discovery-service.d.ts.map +1 -1
  214. package/dist/skills/discovery-service.js +10 -8
  215. package/dist/skills/discovery-service.js.map +1 -1
  216. package/dist/skills/find.d.ts +1 -0
  217. package/dist/skills/find.d.ts.map +1 -1
  218. package/dist/skills/find.js +1 -0
  219. package/dist/skills/find.js.map +1 -1
  220. package/dist/skills/materialization-authority.d.ts +1 -1
  221. package/dist/skills/materialization-authority.d.ts.map +1 -1
  222. package/dist/skills/materialization-authority.js +2 -2
  223. package/dist/skills/materialization-authority.js.map +1 -1
  224. package/dist/skills/providers/skills-sh-compat.d.ts.map +1 -1
  225. package/dist/skills/providers/skills-sh-compat.js +4 -2
  226. package/dist/skills/providers/skills-sh-compat.js.map +1 -1
  227. package/dist/skills/providers/skills-sh-v1.d.ts +2 -2
  228. package/dist/skills/providers/skills-sh-v1.d.ts.map +1 -1
  229. package/dist/skills/providers/skills-sh-v1.js +22 -4
  230. package/dist/skills/providers/skills-sh-v1.js.map +1 -1
  231. package/dist/skills/source/github-fetcher.d.ts.map +1 -1
  232. package/dist/skills/source/github-fetcher.js +8 -4
  233. package/dist/skills/source/github-fetcher.js.map +1 -1
  234. package/dist/skills/types.d.ts +3 -2
  235. package/dist/skills/types.d.ts.map +1 -1
  236. package/docs/agent-file.md +72 -0
  237. package/docs/agent-gateway.md +104 -0
  238. package/docs/architecture.md +12 -0
  239. package/docs/cli-contract.md +13 -0
  240. package/docs/client-compatibility.md +298 -0
  241. package/docs/database.md +11 -0
  242. package/docs/execution-ledger.md +89 -0
  243. package/docs/release-notes-0.1.18.md +103 -0
  244. package/docs/retrieval-evaluation.md +10 -0
  245. package/docs/security.md +11 -0
  246. package/docs/sqlite-driver-adr.md +8 -0
  247. package/migrations/021_semantic_embeddings.sql +122 -0
  248. package/migrations/022_embedding_setup_v2.sql +236 -0
  249. package/migrations/down/021_semantic_embeddings.sql +17 -0
  250. package/migrations/down/022_embedding_setup_v2.sql +133 -0
  251. package/package.json +10 -1
@@ -0,0 +1,407 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { KiokukoError } from '../errors.js';
3
+ import { readEntry } from '../memory/entries.js';
4
+ import { buildEmbeddingDocument } from './document.js';
5
+ import { claimEmbeddingJobs, EMBEDDING_JOB_MAX_ATTEMPTS, failEmbeddingJob, finalizeEmbeddingJob, listEmbeddingJobs, } from './jobs.js';
6
+ import { requireEnabledEmbeddingConfig } from './config.js';
7
+ import { createEmbeddingProfile, embeddingProfileId } from './profile.js';
8
+ import { normalizeEmbeddingQuery, queryEmbeddingHash, readQueryEmbedding, writeQueryEmbedding, } from './query-cache.js';
9
+ import { JavaScriptVectorSearchBackend } from './javascript-backend.js';
10
+ import { EmbeddingProviderError } from './provider.js';
11
+ import { OpenAICompatibleEmbeddingProvider } from './openai-compatible-provider.js';
12
+ import { normalizeVector } from './vector.js';
13
+ import { readActiveEmbeddingProfile, readEntryEmbedding } from './store.js';
14
+ import { defaultEmbeddingConfig, readPersistedEmbeddingSettings } from './settings.js';
15
+ import { getEmbeddingPresetDirectory } from '../config/paths.js';
16
+ import { LocalTransformersEmbeddingProvider } from './local-transformers-provider.js';
17
+ const MAX_DRAIN_JOBS = 64;
18
+ const MAX_DRAIN_DEADLINE_MS = 120_000;
19
+ const RETRY_BASE_MS = 1_000;
20
+ const RETRY_MAX_MS = 60_000;
21
+ function invalid(message) {
22
+ throw new KiokukoError('VALIDATION_ERROR', message);
23
+ }
24
+ function unavailable(message = 'Embedding runtime is unavailable') {
25
+ throw new KiokukoError('SERVICE_UNAVAILABLE', message);
26
+ }
27
+ function disabledRuntime(mode) {
28
+ return Object.freeze({
29
+ mode,
30
+ profileId: null,
31
+ backendId: null,
32
+ backend: null,
33
+ prepareQuery: async () => null,
34
+ drain: async () => ({ claimed: 0, completed: 0, failed: 0, blocked: 0, remaining: 0 }),
35
+ close: async () => undefined,
36
+ });
37
+ }
38
+ function profileMatches(provider, profile) {
39
+ try {
40
+ return embeddingProfileId(provider.profile) === profile.profileId;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ function validateDrainOptions(options) {
47
+ if (!Number.isSafeInteger(options.maxJobs) || options.maxJobs < 1 || options.maxJobs > MAX_DRAIN_JOBS)
48
+ invalid('maxJobs is invalid');
49
+ if (!Number.isSafeInteger(options.deadlineMs) || options.deadlineMs < 1 || options.deadlineMs > MAX_DRAIN_DEADLINE_MS)
50
+ invalid('deadlineMs is invalid');
51
+ }
52
+ function retryable(code) {
53
+ return code === 'timeout' || code === 'rate_limited' || code === 'provider_unavailable';
54
+ }
55
+ function retryDelay(job) {
56
+ if (!retryable(job.errorCode ?? 'provider_unavailable') || job.attempts >= EMBEDDING_JOB_MAX_ATTEMPTS)
57
+ return 0;
58
+ const jitterSeed = createHash('sha256')
59
+ .update(`${job.entryId}\u0000${job.profileId}\u0000${job.attempts}`, 'utf8')
60
+ .digest()
61
+ .readUInt16BE(0);
62
+ const exponential = RETRY_BASE_MS * (2 ** Math.min(6, Math.max(0, job.attempts - 1)));
63
+ return Math.min(RETRY_MAX_MS, exponential + (jitterSeed % 251));
64
+ }
65
+ function providerFailureCode(error) {
66
+ if (error instanceof EmbeddingProviderError)
67
+ return error.code;
68
+ if (error instanceof KiokukoError && error.code === 'SECURITY_REJECTION')
69
+ return 'secret_blocked';
70
+ return 'provider_unavailable';
71
+ }
72
+ function permanentFailure(code) {
73
+ return code === 'invalid_response'
74
+ || code === 'dimension_mismatch'
75
+ || code === 'secret_blocked'
76
+ || code === 'profile_changed';
77
+ }
78
+ function preparedQuery(profile, backend, cached) {
79
+ return {
80
+ profileId: profile.profileId,
81
+ dimensions: profile.identity.dimensions,
82
+ vector: new Float32Array(cached.vector),
83
+ vectorHash: cached.vectorHash,
84
+ backendId: backend.id,
85
+ distanceCeiling: profile.identity.distanceCeiling,
86
+ };
87
+ }
88
+ function failureAvailableAt(job, errorCode, now) {
89
+ const delay = errorCode === 'secret_blocked' || permanentFailure(errorCode) ? 0 : retryDelay(job);
90
+ return new Date(Date.parse(now) + delay).toISOString();
91
+ }
92
+ function createEnabledRuntime(database, config, options) {
93
+ const profile = options.profile ?? createEmbeddingProfile(config);
94
+ const active = readActiveEmbeddingProfile(database);
95
+ if (active === null || active.profile.profileId !== profile.profileId) {
96
+ if (config.mode === 'required')
97
+ unavailable('Embedding profile is not active');
98
+ return disabledRuntime(config.mode);
99
+ }
100
+ const provider = options.provider ?? new OpenAICompatibleEmbeddingProvider({ config });
101
+ if (!profileMatches(provider, profile))
102
+ throw new KiokukoError('CONFLICT', 'Embedding provider profile does not match the active profile');
103
+ const backend = options.backend ?? (() => {
104
+ if (config.vectorBackend === 'sqlite-vec') {
105
+ if (config.mode === 'optional')
106
+ return null;
107
+ unavailable('sqlite-vec backend is not available');
108
+ }
109
+ return new JavaScriptVectorSearchBackend();
110
+ })();
111
+ if (backend === null)
112
+ return disabledRuntime(config.mode);
113
+ const state = {
114
+ config,
115
+ profile,
116
+ generation: active.generation,
117
+ provider,
118
+ backend,
119
+ now: options.now ?? (() => new Date().toISOString()),
120
+ };
121
+ const inFlight = new Set();
122
+ let closed = false;
123
+ const enqueueWrite = options.enqueueWrite ?? ((operation) => Promise.resolve(operation()));
124
+ const ensureActive = () => {
125
+ const current = readActiveEmbeddingProfile(database);
126
+ if (current === null || current.profile.profileId !== state.profile.profileId || current.generation !== state.generation) {
127
+ unavailable('Embedding profile changed while the runtime was active');
128
+ }
129
+ };
130
+ const failOrFallback = (error) => {
131
+ if (error instanceof KiokukoError && error.code === 'INTEGRITY_ERROR')
132
+ throw error;
133
+ if (state.config.mode === 'optional')
134
+ return null;
135
+ unavailable();
136
+ };
137
+ const prepareQuery = async (databaseForQuery, text) => {
138
+ if (closed)
139
+ unavailable('Embedding runtime is closed');
140
+ ensureActive();
141
+ const normalizedText = normalizeEmbeddingQuery(text);
142
+ const queryHash = queryEmbeddingHash(normalizedText);
143
+ const now = state.now();
144
+ const cached = readQueryEmbedding(databaseForQuery, { profileId: state.profile.profileId, queryHash, now });
145
+ if (cached !== undefined) {
146
+ ensureActive();
147
+ return preparedQuery(state.profile, state.backend, cached);
148
+ }
149
+ const controller = new AbortController();
150
+ inFlight.add(controller);
151
+ let vectors;
152
+ try {
153
+ vectors = await state.provider.embed([normalizedText], { signal: controller.signal });
154
+ }
155
+ catch (error) {
156
+ return failOrFallback(error);
157
+ }
158
+ finally {
159
+ inFlight.delete(controller);
160
+ }
161
+ if (vectors.length !== 1)
162
+ return failOrFallback(new EmbeddingProviderError('invalid_response', false));
163
+ let vector;
164
+ try {
165
+ vector = normalizeVector(vectors[0], state.profile.identity.dimensions);
166
+ }
167
+ catch {
168
+ return failOrFallback(new EmbeddingProviderError('dimension_mismatch', false));
169
+ }
170
+ ensureActive();
171
+ const stored = await enqueueWrite(() => writeQueryEmbedding(databaseForQuery, { profileId: state.profile.profileId, queryHash, vector }, { now: state.now(), expectedGeneration: state.generation }));
172
+ return preparedQuery(state.profile, state.backend, stored);
173
+ };
174
+ const settleFailure = (job, errorCode) => {
175
+ const now = state.now();
176
+ return enqueueWrite(() => failEmbeddingJob(database, {
177
+ entryId: job.entryId,
178
+ profileId: job.profileId,
179
+ generation: job.generation,
180
+ leaseId: job.leaseId,
181
+ errorCode,
182
+ availableAt: failureAvailableAt(job, errorCode, now),
183
+ now,
184
+ permanent: permanentFailure(errorCode),
185
+ }));
186
+ };
187
+ const processPending = async (pending, deadline, controller) => {
188
+ let completed = 0;
189
+ let failed = 0;
190
+ let blocked = 0;
191
+ for (let offset = 0; offset < pending.length; offset += state.config.batchSize) {
192
+ if (Date.now() >= deadline || closed)
193
+ break;
194
+ const batch = pending.slice(offset, offset + state.config.batchSize);
195
+ let vectors;
196
+ try {
197
+ vectors = await state.provider.embed(batch.map((item) => item.text), { signal: controller.signal });
198
+ }
199
+ catch (error) {
200
+ const code = providerFailureCode(error);
201
+ for (const item of batch) {
202
+ if (!(await settleFailure(item.job, code)))
203
+ continue;
204
+ if (code === 'secret_blocked')
205
+ blocked += 1;
206
+ else
207
+ failed += 1;
208
+ }
209
+ continue;
210
+ }
211
+ if (vectors.length !== batch.length) {
212
+ for (const item of batch)
213
+ if (await settleFailure(item.job, 'invalid_response'))
214
+ failed += 1;
215
+ continue;
216
+ }
217
+ for (let index = 0; index < batch.length; index += 1) {
218
+ const item = batch[index];
219
+ let vector;
220
+ try {
221
+ vector = normalizeVector(vectors[index], state.profile.identity.dimensions);
222
+ }
223
+ catch {
224
+ if (await settleFailure(item.job, 'dimension_mismatch'))
225
+ failed += 1;
226
+ continue;
227
+ }
228
+ try {
229
+ await enqueueWrite(() => finalizeEmbeddingJob(database, {
230
+ entryId: item.job.entryId,
231
+ profileId: item.job.profileId,
232
+ generation: item.job.generation,
233
+ leaseId: item.job.leaseId,
234
+ revision: item.job.revision,
235
+ contentHash: item.job.contentHash,
236
+ documentHash: item.documentHash,
237
+ vector,
238
+ now: state.now(),
239
+ }));
240
+ completed += 1;
241
+ }
242
+ catch (error) {
243
+ if (error instanceof KiokukoError && error.code === 'CONFLICT')
244
+ continue;
245
+ throw error;
246
+ }
247
+ }
248
+ }
249
+ return { completed, failed, blocked };
250
+ };
251
+ const drain = async (options) => {
252
+ validateDrainOptions(options);
253
+ if (closed)
254
+ unavailable('Embedding runtime is closed');
255
+ ensureActive();
256
+ const now = state.now();
257
+ const claimed = claimEmbeddingJobs(database, {
258
+ maxJobs: options.maxJobs,
259
+ ...(options.workspace === undefined ? {} : { workspace: options.workspace }),
260
+ now,
261
+ });
262
+ const deadline = Date.now() + options.deadlineMs;
263
+ const controller = new AbortController();
264
+ const deadlineTimer = setTimeout(() => controller.abort(), options.deadlineMs);
265
+ inFlight.add(controller);
266
+ const pending = [];
267
+ let completed = 0;
268
+ let failed = 0;
269
+ let blocked = 0;
270
+ try {
271
+ for (const job of claimed) {
272
+ if (Date.now() >= deadline || closed)
273
+ break;
274
+ try {
275
+ const entry = readEntry(database, { workspace: job.workspace, entryId: job.entryId });
276
+ if (entry.revision !== job.revision || entry.contentHash !== job.contentHash) {
277
+ if (await settleFailure(job, 'entry_changed'))
278
+ failed += 1;
279
+ continue;
280
+ }
281
+ const document = buildEmbeddingDocument({
282
+ kind: entry.kind,
283
+ title: entry.title,
284
+ summary: entry.summary,
285
+ body: entry.body,
286
+ tags: entry.tags,
287
+ scope: entry.scope,
288
+ });
289
+ const previous = readEntryEmbedding(database, { entryId: entry.id, profileId: state.profile.profileId });
290
+ if (previous !== undefined && previous.documentHash === document.documentHash && previous.dimensions === state.profile.identity.dimensions) {
291
+ try {
292
+ await enqueueWrite(() => finalizeEmbeddingJob(database, {
293
+ entryId: job.entryId,
294
+ profileId: job.profileId,
295
+ generation: job.generation,
296
+ leaseId: job.leaseId,
297
+ revision: job.revision,
298
+ contentHash: job.contentHash,
299
+ documentHash: document.documentHash,
300
+ vector: previous.vector,
301
+ now: state.now(),
302
+ }));
303
+ completed += 1;
304
+ }
305
+ catch (error) {
306
+ if (!(error instanceof KiokukoError && error.code === 'CONFLICT'))
307
+ throw error;
308
+ }
309
+ continue;
310
+ }
311
+ pending.push({ job, documentHash: document.documentHash, text: document.text });
312
+ }
313
+ catch (error) {
314
+ const code = error instanceof KiokukoError && error.code === 'SECURITY_REJECTION'
315
+ ? 'secret_blocked'
316
+ : error instanceof KiokukoError && (error.code === 'NOT_FOUND' || error.code === 'CONFLICT')
317
+ ? 'entry_changed'
318
+ : null;
319
+ if (code === null)
320
+ throw error;
321
+ if (!(await settleFailure(job, code)))
322
+ continue;
323
+ if (code === 'secret_blocked')
324
+ blocked += 1;
325
+ else
326
+ failed += 1;
327
+ }
328
+ }
329
+ const processed = await processPending(pending, deadline, controller);
330
+ completed += processed.completed;
331
+ failed += processed.failed;
332
+ blocked += processed.blocked;
333
+ }
334
+ finally {
335
+ clearTimeout(deadlineTimer);
336
+ inFlight.delete(controller);
337
+ }
338
+ const remaining = listEmbeddingJobs(database, {
339
+ profileId: state.profile.profileId,
340
+ ...(options.workspace === undefined ? {} : { workspace: options.workspace }),
341
+ }).length;
342
+ return { claimed: claimed.length, completed, failed, blocked, remaining };
343
+ };
344
+ const close = async () => {
345
+ if (closed)
346
+ return;
347
+ closed = true;
348
+ for (const controller of inFlight)
349
+ controller.abort();
350
+ inFlight.clear();
351
+ };
352
+ return Object.freeze({
353
+ mode: config.mode,
354
+ profileId: profile.profileId,
355
+ backendId: backend.id,
356
+ backend,
357
+ prepareQuery,
358
+ drain,
359
+ close,
360
+ });
361
+ }
362
+ export function createEmbeddingRuntime(database, config, options = {}) {
363
+ const persisted = config ?? (() => {
364
+ try {
365
+ return readPersistedEmbeddingSettings(database);
366
+ }
367
+ catch {
368
+ return defaultEmbeddingConfig();
369
+ }
370
+ })();
371
+ if (persisted.mode === 'off')
372
+ return disabledRuntime('off');
373
+ const active = readActiveEmbeddingProfile(database);
374
+ if (active?.profile.identity.schemaVersion === 2) {
375
+ const localIdentity = active.profile.identity;
376
+ if (localIdentity.schemaVersion !== 2)
377
+ throw new KiokukoError('INTEGRITY_ERROR', 'Local embedding profile identity is invalid');
378
+ const localProfile = { profileId: active.profile.profileId, identity: localIdentity };
379
+ const localProvider = options.provider ?? new LocalTransformersEmbeddingProvider({
380
+ profile: localProfile.identity,
381
+ modelDirectory: getEmbeddingPresetDirectory(localProfile.identity.presetId, localProfile.identity.modelRevision),
382
+ });
383
+ return createEnabledRuntime(database, {
384
+ mode: persisted.mode,
385
+ provider: 'openai-compatible',
386
+ baseUrl: 'http://127.0.0.1/kiokuko-local',
387
+ model: localProfile.identity.sourceModel,
388
+ dimensions: localProfile.identity.dimensions,
389
+ distanceCeiling: localProfile.identity.distanceCeiling,
390
+ allowRemote: false,
391
+ vectorBackend: persisted.vectorBackend,
392
+ timeoutMs: persisted.timeoutMs,
393
+ batchSize: persisted.batchSize,
394
+ }, { ...options, provider: localProvider, profile: localProfile });
395
+ }
396
+ return createEnabledRuntime(database, requireEnabledEmbeddingConfig(persisted), options);
397
+ }
398
+ /** Convert an owned runtime into the retrieval-only shape consumed by search lanes. */
399
+ export async function prepareEmbeddingSearchRuntime(runtime, database, text) {
400
+ if (runtime === undefined || runtime.backend === null)
401
+ return {};
402
+ const query = await runtime.prepareQuery(database, text);
403
+ if (query === null)
404
+ return {};
405
+ return { semantic: { query, backend: runtime.backend } };
406
+ }
407
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/embedding/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ import type { EmbeddingConfig } from './types.js';
3
+ /** Read durable embedding settings without consulting embedding environment variables. */
4
+ export declare function readPersistedEmbeddingSettings(database: SqliteDatabase): EmbeddingConfig;
5
+ export declare function defaultEmbeddingConfig(): EmbeddingConfig;
6
+ //# sourceMappingURL=settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/embedding/settings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,kBAAkB,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAA2B,MAAM,YAAY,CAAC;AA2C3E,0FAA0F;AAC1F,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,cAAc,GAAG,eAAe,CAgCxF;AAED,wBAAgB,sBAAsB,IAAI,eAAe,CAExD"}
@@ -0,0 +1,69 @@
1
+ import { KiokukoError } from '../errors.js';
2
+ const DISABLED_CONFIG = Object.freeze({
3
+ mode: 'off',
4
+ provider: 'openai-compatible',
5
+ allowRemote: false,
6
+ vectorBackend: 'auto',
7
+ timeoutMs: 30_000,
8
+ batchSize: 16,
9
+ });
10
+ function invalid(message) {
11
+ throw new KiokukoError('INTEGRITY_ERROR', message);
12
+ }
13
+ function tableExists(database) {
14
+ return Boolean(database.prepare(`
15
+ SELECT 1 AS present FROM sqlite_schema WHERE type = 'table' AND name = 'embedding_settings'
16
+ `).get());
17
+ }
18
+ function vectorBackend(value) {
19
+ if (value !== 'auto' && value !== 'javascript' && value !== 'sqlite-vec')
20
+ invalid('Persisted embedding vector backend is invalid');
21
+ return value;
22
+ }
23
+ function integer(value, minimum, maximum, field) {
24
+ if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < minimum || value > maximum) {
25
+ invalid(`Persisted embedding ${field} is invalid`);
26
+ }
27
+ return value;
28
+ }
29
+ /** Read durable embedding settings without consulting embedding environment variables. */
30
+ export function readPersistedEmbeddingSettings(database) {
31
+ if (!tableExists(database))
32
+ return DISABLED_CONFIG;
33
+ const row = database.prepare(`
34
+ SELECT singleton, mode, provider_kind, vector_backend, batch_size, timeout_ms, setup_state
35
+ FROM embedding_settings
36
+ `).get();
37
+ if (row === undefined || row.singleton !== 1)
38
+ invalid('Persisted embedding settings must contain exactly one singleton row');
39
+ const backend = vectorBackend(row.vector_backend);
40
+ const batchSize = integer(row.batch_size, 1, 64, 'batch size');
41
+ const timeoutMs = integer(row.timeout_ms, 100, 120_000, 'timeout');
42
+ if (row.mode !== 'off' && row.mode !== 'optional' && row.mode !== 'required')
43
+ invalid('Persisted embedding mode is invalid');
44
+ if (row.setup_state !== 'disabled' && row.setup_state !== 'requires_setup' && row.setup_state !== 'installing'
45
+ && row.setup_state !== 'ready' && row.setup_state !== 'degraded')
46
+ invalid('Persisted embedding setup state is invalid');
47
+ // v1 remote profiles intentionally cannot be reconstructed and local v2
48
+ // loading is supplied by the local provider work unit. Until a verified
49
+ // provider is available, fail closed to lexical retrieval.
50
+ if (row.mode === 'off' || row.provider_kind !== 'local-transformers' || row.setup_state !== 'ready') {
51
+ return Object.freeze({ ...DISABLED_CONFIG, vectorBackend: backend, batchSize, timeoutMs });
52
+ }
53
+ return Object.freeze({
54
+ mode: row.mode,
55
+ provider: 'openai-compatible',
56
+ baseUrl: 'http://127.0.0.1/kiokuko-local',
57
+ model: 'intfloat/multilingual-e5-small',
58
+ dimensions: 384,
59
+ distanceCeiling: 0.8,
60
+ allowRemote: false,
61
+ vectorBackend: backend,
62
+ batchSize,
63
+ timeoutMs,
64
+ });
65
+ }
66
+ export function defaultEmbeddingConfig() {
67
+ return DISABLED_CONFIG;
68
+ }
69
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/embedding/settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type PathEnvironment } from '../config/paths.js';
2
+ export interface EmbeddingSetupLock {
3
+ readonly path: string;
4
+ release(): Promise<void>;
5
+ }
6
+ export declare function acquireEmbeddingSetupLock(options?: PathEnvironment): Promise<EmbeddingSetupLock>;
7
+ //# sourceMappingURL=setup-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-lock.d.ts","sourceRoot":"","sources":["../../src/embedding/setup-lock.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0D,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGlH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAsB,yBAAyB,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAwB1G"}
@@ -0,0 +1,35 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { mkdir, open, unlink } from 'node:fs/promises';
3
+ import { getEmbeddingModelsDirectory, getEmbeddingSetupLockPath } from '../config/paths.js';
4
+ import { KiokukoError } from '../errors.js';
5
+ export async function acquireEmbeddingSetupLock(options = {}) {
6
+ await mkdir(getEmbeddingModelsDirectory(options), { recursive: true, mode: 0o700 });
7
+ const lockPath = getEmbeddingSetupLockPath(options);
8
+ let handle;
9
+ try {
10
+ handle = await open(lockPath, 'wx', 0o600);
11
+ await handle.writeFile(`${randomUUID()}\n`, 'utf8');
12
+ }
13
+ catch (error) {
14
+ try {
15
+ await handle?.close();
16
+ }
17
+ catch { /* preserve the lock conflict */ }
18
+ if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {
19
+ throw new KiokukoError('CONFLICT', 'Another embedding setup is already in progress');
20
+ }
21
+ throw error;
22
+ }
23
+ let released = false;
24
+ return Object.freeze({
25
+ path: lockPath,
26
+ release: async () => {
27
+ if (released)
28
+ return;
29
+ released = true;
30
+ await handle.close();
31
+ await unlink(lockPath);
32
+ },
33
+ });
34
+ }
35
+ //# sourceMappingURL=setup-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-lock.js","sourceRoot":"","sources":["../../src/embedding/setup-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAE,yBAAyB,EAAwB,MAAM,oBAAoB,CAAC;AAClH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,UAA2B,EAAE;IAC3E,MAAM,KAAK,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;QACzE,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpG,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,gDAAgD,CAAC,CAAC;QACvF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,QAAQ;gBAAE,OAAO;YACrB,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { type InstalledModel } from './model-installation.js';
2
+ import { LOCAL_SMALL_PRESET } from './presets/local-small.js';
3
+ import type { ModelDownloader, ModelDownloadProgress } from './model-download.js';
4
+ import type { SqliteDatabase } from '../db/adapter.js';
5
+ import type { EmbeddingProvider } from './types.js';
6
+ import type { PathEnvironment } from '../config/paths.js';
7
+ export interface EmbeddingSetupInput {
8
+ readonly presetId: string;
9
+ readonly confirmed: boolean;
10
+ readonly dryRun: boolean;
11
+ readonly offline: boolean;
12
+ readonly replace: boolean;
13
+ }
14
+ export interface EmbeddingSetupResult {
15
+ readonly presetId: string;
16
+ readonly model: {
17
+ readonly repository: string;
18
+ readonly revision: string;
19
+ readonly installation: 'installed' | 'reused';
20
+ readonly bytes: number;
21
+ };
22
+ readonly migration: {
23
+ readonly fromVersion: number;
24
+ readonly toVersion: number;
25
+ readonly backupPath: string | null;
26
+ readonly applied: readonly number[];
27
+ };
28
+ readonly profile: {
29
+ readonly profileId: string;
30
+ readonly generation: number;
31
+ readonly activated: boolean;
32
+ };
33
+ readonly embeddings: {
34
+ readonly eligible: number;
35
+ readonly completed: number;
36
+ readonly failed: number;
37
+ readonly blocked: number;
38
+ readonly remaining: number;
39
+ };
40
+ readonly backend: string;
41
+ readonly semanticEnabled: boolean;
42
+ readonly restartRequired: boolean;
43
+ }
44
+ export interface EmbeddingSetupOptions extends PathEnvironment {
45
+ readonly downloader?: ModelDownloader;
46
+ readonly installer?: (preset: typeof LOCAL_SMALL_PRESET, options: EmbeddingSetupOptions) => Promise<InstalledModel>;
47
+ readonly provider?: EmbeddingProvider;
48
+ readonly backendId?: string;
49
+ readonly now?: () => string;
50
+ readonly onProgress?: (progress: ModelDownloadProgress) => void;
51
+ }
52
+ export declare function runEmbeddingSetup(database: SqliteDatabase, input: EmbeddingSetupInput, options?: EmbeddingSetupOptions): Promise<EmbeddingSetupResult>;
53
+ //# sourceMappingURL=setup-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup-service.d.ts","sourceRoot":"","sources":["../../src/embedding/setup-service.ts"],"names":[],"mappings":"AAQA,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,GAAG,QAAQ,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClJ,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC1J,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAC3G,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9J,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,kBAAkB,EAAE,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IACpH,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACjE;AAgGD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CA0E/B"}