draken 0.1.6 → 0.2.0

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 (301) hide show
  1. package/ACCEPTANCE.md +31 -0
  2. package/CHANGELOG.md +33 -0
  3. package/CONTRIBUTING.md +129 -0
  4. package/MEMORY.md +98 -0
  5. package/PERSONA.md +67 -0
  6. package/README.md +156 -78
  7. package/SETUP.md +111 -0
  8. package/SOURCES.md +75 -0
  9. package/TRAY.md +54 -0
  10. package/VOICE.md +118 -0
  11. package/dist/auth/middleware.d.ts +3 -1
  12. package/dist/auth/middleware.d.ts.map +1 -1
  13. package/dist/auth/middleware.js +20 -15
  14. package/dist/auth/middleware.js.map +1 -1
  15. package/dist/cli.js +77 -113
  16. package/dist/cli.js.map +1 -1
  17. package/dist/db/agent-migration.d.ts +7 -0
  18. package/dist/db/agent-migration.d.ts.map +1 -0
  19. package/dist/db/agent-migration.js +36 -0
  20. package/dist/db/agent-migration.js.map +1 -0
  21. package/dist/db/evidence.d.ts +37 -0
  22. package/dist/db/evidence.d.ts.map +1 -0
  23. package/dist/db/evidence.js +110 -0
  24. package/dist/db/evidence.js.map +1 -0
  25. package/dist/db/pointer-migration.d.ts +7 -0
  26. package/dist/db/pointer-migration.d.ts.map +1 -0
  27. package/dist/db/pointer-migration.js +117 -0
  28. package/dist/db/pointer-migration.js.map +1 -0
  29. package/dist/db/retained-text.d.ts +8 -0
  30. package/dist/db/retained-text.d.ts.map +1 -0
  31. package/dist/db/retained-text.js +36 -0
  32. package/dist/db/retained-text.js.map +1 -0
  33. package/dist/db/schema.d.ts +1 -5
  34. package/dist/db/schema.d.ts.map +1 -1
  35. package/dist/db/schema.js +200 -55
  36. package/dist/db/schema.js.map +1 -1
  37. package/dist/db/snapshot-pointers.d.ts +5 -0
  38. package/dist/db/snapshot-pointers.d.ts.map +1 -0
  39. package/dist/db/snapshot-pointers.js +174 -0
  40. package/dist/db/snapshot-pointers.js.map +1 -0
  41. package/dist/memory/automatic.d.ts +38 -0
  42. package/dist/memory/automatic.d.ts.map +1 -0
  43. package/dist/memory/automatic.js +155 -0
  44. package/dist/memory/automatic.js.map +1 -0
  45. package/dist/memory/context.d.ts +12 -0
  46. package/dist/memory/context.d.ts.map +1 -0
  47. package/dist/memory/context.js +59 -0
  48. package/dist/memory/context.js.map +1 -0
  49. package/dist/memory/embedding-pool.d.ts +28 -0
  50. package/dist/memory/embedding-pool.d.ts.map +1 -0
  51. package/dist/memory/embedding-pool.js +135 -0
  52. package/dist/memory/embedding-pool.js.map +1 -0
  53. package/dist/memory/embedding-worker.d.ts +2 -0
  54. package/dist/memory/embedding-worker.d.ts.map +1 -0
  55. package/dist/memory/embedding-worker.js +32 -0
  56. package/dist/memory/embedding-worker.js.map +1 -0
  57. package/dist/memory/index.d.ts +26 -0
  58. package/dist/memory/index.d.ts.map +1 -0
  59. package/dist/memory/index.js +283 -0
  60. package/dist/memory/index.js.map +1 -0
  61. package/dist/memory/model.d.ts +15 -0
  62. package/dist/memory/model.d.ts.map +1 -0
  63. package/dist/memory/model.js +152 -0
  64. package/dist/memory/model.js.map +1 -0
  65. package/dist/memory/service.d.ts +8 -0
  66. package/dist/memory/service.d.ts.map +1 -0
  67. package/dist/memory/service.js +217 -0
  68. package/dist/memory/service.js.map +1 -0
  69. package/dist/memory/sources.d.ts +15 -0
  70. package/dist/memory/sources.d.ts.map +1 -0
  71. package/dist/memory/sources.js +87 -0
  72. package/dist/memory/sources.js.map +1 -0
  73. package/dist/memory/stamps.d.ts +13 -0
  74. package/dist/memory/stamps.d.ts.map +1 -0
  75. package/dist/memory/stamps.js +101 -0
  76. package/dist/memory/stamps.js.map +1 -0
  77. package/dist/memory/storage.d.ts +5 -0
  78. package/dist/memory/storage.d.ts.map +1 -0
  79. package/dist/memory/storage.js +107 -0
  80. package/dist/memory/storage.js.map +1 -0
  81. package/dist/memory/types.d.ts +68 -0
  82. package/dist/memory/types.d.ts.map +1 -0
  83. package/dist/memory/types.js +8 -0
  84. package/dist/memory/types.js.map +1 -0
  85. package/dist/memory/worker.d.ts +2 -0
  86. package/dist/memory/worker.d.ts.map +1 -0
  87. package/dist/memory/worker.js +82 -0
  88. package/dist/memory/worker.js.map +1 -0
  89. package/dist/npm-cli.d.ts +4 -0
  90. package/dist/npm-cli.d.ts.map +1 -0
  91. package/dist/npm-cli.js +36 -0
  92. package/dist/npm-cli.js.map +1 -0
  93. package/dist/pi/runtime.d.ts +34 -0
  94. package/dist/pi/runtime.d.ts.map +1 -0
  95. package/dist/pi/runtime.js +210 -0
  96. package/dist/pi/runtime.js.map +1 -0
  97. package/dist/pi/setup.d.ts +5 -0
  98. package/dist/pi/setup.d.ts.map +1 -0
  99. package/dist/pi/setup.js +147 -0
  100. package/dist/pi/setup.js.map +1 -0
  101. package/dist/routes/auth.d.ts.map +1 -1
  102. package/dist/routes/auth.js +3 -1
  103. package/dist/routes/auth.js.map +1 -1
  104. package/dist/routes/live-voice.d.ts +3 -0
  105. package/dist/routes/live-voice.d.ts.map +1 -0
  106. package/dist/routes/live-voice.js +49 -0
  107. package/dist/routes/live-voice.js.map +1 -0
  108. package/dist/routes/{browse.d.ts → memory.d.ts} +1 -1
  109. package/dist/routes/memory.d.ts.map +1 -0
  110. package/dist/routes/memory.js +18 -0
  111. package/dist/routes/memory.js.map +1 -0
  112. package/dist/routes/{tasks.d.ts → sync.d.ts} +1 -1
  113. package/dist/routes/sync.d.ts.map +1 -0
  114. package/dist/routes/sync.js +127 -0
  115. package/dist/routes/sync.js.map +1 -0
  116. package/dist/routes/{projects.d.ts → voice.d.ts} +1 -1
  117. package/dist/routes/voice.d.ts.map +1 -0
  118. package/dist/routes/voice.js +35 -0
  119. package/dist/routes/voice.js.map +1 -0
  120. package/dist/server-state.d.ts +30 -0
  121. package/dist/server-state.d.ts.map +1 -0
  122. package/dist/server-state.js +113 -0
  123. package/dist/server-state.js.map +1 -0
  124. package/dist/server-status.d.ts +7 -0
  125. package/dist/server-status.d.ts.map +1 -0
  126. package/dist/server-status.js +34 -0
  127. package/dist/server-status.js.map +1 -0
  128. package/dist/server.d.ts +5 -1
  129. package/dist/server.d.ts.map +1 -1
  130. package/dist/server.js +148 -46
  131. package/dist/server.js.map +1 -1
  132. package/dist/sources/adapters.d.ts +15 -0
  133. package/dist/sources/adapters.d.ts.map +1 -0
  134. package/dist/sources/adapters.js +159 -0
  135. package/dist/sources/adapters.js.map +1 -0
  136. package/dist/sources/registry.d.ts +17 -0
  137. package/dist/sources/registry.d.ts.map +1 -0
  138. package/dist/sources/registry.js +56 -0
  139. package/dist/sources/registry.js.map +1 -0
  140. package/dist/sync/collector.d.ts +3 -0
  141. package/dist/sync/collector.d.ts.map +1 -0
  142. package/dist/sync/collector.js +284 -0
  143. package/dist/sync/collector.js.map +1 -0
  144. package/dist/sync/cost.d.ts +7 -0
  145. package/dist/sync/cost.d.ts.map +1 -0
  146. package/dist/sync/cost.js +31 -0
  147. package/dist/sync/cost.js.map +1 -0
  148. package/dist/sync/jsonl.d.ts +34 -0
  149. package/dist/sync/jsonl.d.ts.map +1 -0
  150. package/dist/sync/jsonl.js +161 -0
  151. package/dist/sync/jsonl.js.map +1 -0
  152. package/dist/sync/manager.d.ts +12 -0
  153. package/dist/sync/manager.d.ts.map +1 -0
  154. package/dist/sync/manager.js +211 -0
  155. package/dist/sync/manager.js.map +1 -0
  156. package/dist/sync/normalize.d.ts +22 -0
  157. package/dist/sync/normalize.d.ts.map +1 -0
  158. package/dist/sync/normalize.js +107 -0
  159. package/dist/sync/normalize.js.map +1 -0
  160. package/dist/sync/pi-output.d.ts +33 -0
  161. package/dist/sync/pi-output.d.ts.map +1 -0
  162. package/dist/sync/pi-output.js +186 -0
  163. package/dist/sync/pi-output.js.map +1 -0
  164. package/dist/sync/pi.d.ts +15 -0
  165. package/dist/sync/pi.d.ts.map +1 -0
  166. package/dist/sync/pi.js +149 -0
  167. package/dist/sync/pi.js.map +1 -0
  168. package/dist/sync/recap.d.ts +25 -0
  169. package/dist/sync/recap.d.ts.map +1 -0
  170. package/dist/sync/recap.js +118 -0
  171. package/dist/sync/recap.js.map +1 -0
  172. package/dist/sync/references.d.ts +10 -0
  173. package/dist/sync/references.d.ts.map +1 -0
  174. package/dist/sync/references.js +50 -0
  175. package/dist/sync/references.js.map +1 -0
  176. package/dist/sync/source-files.d.ts +16 -0
  177. package/dist/sync/source-files.d.ts.map +1 -0
  178. package/dist/sync/source-files.js +56 -0
  179. package/dist/sync/source-files.js.map +1 -0
  180. package/dist/sync/store.d.ts +36 -0
  181. package/dist/sync/store.d.ts.map +1 -0
  182. package/dist/sync/store.js +359 -0
  183. package/dist/sync/store.js.map +1 -0
  184. package/dist/sync/summary-budget.d.ts +19 -0
  185. package/dist/sync/summary-budget.d.ts.map +1 -0
  186. package/dist/sync/summary-budget.js +39 -0
  187. package/dist/sync/summary-budget.js.map +1 -0
  188. package/dist/sync/tree.d.ts +69 -0
  189. package/dist/sync/tree.d.ts.map +1 -0
  190. package/dist/sync/tree.js +599 -0
  191. package/dist/sync/tree.js.map +1 -0
  192. package/dist/tray/controller.d.ts +51 -0
  193. package/dist/tray/controller.d.ts.map +1 -0
  194. package/dist/tray/controller.js +178 -0
  195. package/dist/tray/controller.js.map +1 -0
  196. package/dist/tray/launcher.d.ts +3 -0
  197. package/dist/tray/launcher.d.ts.map +1 -0
  198. package/dist/tray/launcher.js +47 -0
  199. package/dist/tray/launcher.js.map +1 -0
  200. package/dist/tray/native.d.ts +12 -0
  201. package/dist/tray/native.d.ts.map +1 -0
  202. package/dist/tray/native.js +93 -0
  203. package/dist/tray/native.js.map +1 -0
  204. package/dist/tray/processes.d.ts +5 -0
  205. package/dist/tray/processes.d.ts.map +1 -0
  206. package/dist/tray/processes.js +99 -0
  207. package/dist/tray/processes.js.map +1 -0
  208. package/dist/tray/worker.d.ts +4 -0
  209. package/dist/tray/worker.d.ts.map +1 -0
  210. package/dist/tray/worker.js +150 -0
  211. package/dist/tray/worker.js.map +1 -0
  212. package/dist/types.d.ts +212 -20
  213. package/dist/types.d.ts.map +1 -1
  214. package/dist/voice/continuation.d.ts +25 -0
  215. package/dist/voice/continuation.d.ts.map +1 -0
  216. package/dist/voice/continuation.js +94 -0
  217. package/dist/voice/continuation.js.map +1 -0
  218. package/dist/voice/legacy-history.d.ts +5 -0
  219. package/dist/voice/legacy-history.d.ts.map +1 -0
  220. package/dist/voice/legacy-history.js +34 -0
  221. package/dist/voice/legacy-history.js.map +1 -0
  222. package/dist/voice/live-context.d.ts +14 -0
  223. package/dist/voice/live-context.d.ts.map +1 -0
  224. package/dist/voice/live-context.js +137 -0
  225. package/dist/voice/live-context.js.map +1 -0
  226. package/dist/voice/live.d.ts +37 -0
  227. package/dist/voice/live.d.ts.map +1 -0
  228. package/dist/voice/live.js +448 -0
  229. package/dist/voice/live.js.map +1 -0
  230. package/package.json +49 -16
  231. package/public/assets/index-CYz_kpAp.js +126 -0
  232. package/public/assets/index-DmRid5xE.css +1 -0
  233. package/public/assets/index-Ymd62i3g.js +40 -0
  234. package/public/assets/persona-C_m1CVKe.css +1 -0
  235. package/public/assets/persona-XbLvCqRT.js +1 -0
  236. package/public/assets/scene-CBV2oPhA.js +3854 -0
  237. package/public/index.html +6 -8
  238. package/public/persona/THREE-LICENSE.txt +21 -0
  239. package/public/persona/call-poster.webp +0 -0
  240. package/public/persona/reference.jpg +0 -0
  241. package/public/persona/sample.wav +0 -0
  242. package/public/persona.html +7 -0
  243. package/runtime/pi/package-lock.json +1549 -0
  244. package/runtime/pi/package.json +12 -0
  245. package/tests/fixtures/voice-question.wav +0 -0
  246. package/tray/assets/error.ico +0 -0
  247. package/tray/assets/error.png +0 -0
  248. package/tray/assets/running.ico +0 -0
  249. package/tray/assets/running.png +0 -0
  250. package/tray/assets/starting.ico +0 -0
  251. package/tray/assets/starting.png +0 -0
  252. package/tray/assets/stopped.ico +0 -0
  253. package/tray/assets/stopped.png +0 -0
  254. package/tray/assets/stopping.ico +0 -0
  255. package/tray/assets/stopping.png +0 -0
  256. package/tray/macos.js +72 -0
  257. package/tray/windows.ps1 +104 -0
  258. package/voice/realtime/README.md +84 -0
  259. package/voice/realtime/backend.mjs +81 -0
  260. package/voice/realtime/native.mjs +210 -0
  261. package/voice/realtime/peer.d.mts +15 -0
  262. package/voice/realtime/peer.mjs +116 -0
  263. package/voice/realtime/probe-browser.mjs +81 -0
  264. package/voice/realtime/probe-server.mjs +86 -0
  265. package/voice/realtime/probe.html +11 -0
  266. package/voice/realtime/probe.mjs +42 -0
  267. package/voice/realtime/rpc.mjs +118 -0
  268. package/voice/realtime/setup.mjs +32 -0
  269. package/voice/tls.mjs +49 -0
  270. package/dist/db/queries.d.ts +0 -16
  271. package/dist/db/queries.d.ts.map +0 -1
  272. package/dist/db/queries.js +0 -91
  273. package/dist/db/queries.js.map +0 -1
  274. package/dist/docker/dockerfile.d.ts +0 -50
  275. package/dist/docker/dockerfile.d.ts.map +0 -1
  276. package/dist/docker/dockerfile.js +0 -160
  277. package/dist/docker/dockerfile.js.map +0 -1
  278. package/dist/docker/manager.d.ts +0 -42
  279. package/dist/docker/manager.d.ts.map +0 -1
  280. package/dist/docker/manager.js +0 -421
  281. package/dist/docker/manager.js.map +0 -1
  282. package/dist/git/status.d.ts +0 -76
  283. package/dist/git/status.d.ts.map +0 -1
  284. package/dist/git/status.js +0 -332
  285. package/dist/git/status.js.map +0 -1
  286. package/dist/routes/browse.d.ts.map +0 -1
  287. package/dist/routes/browse.js +0 -49
  288. package/dist/routes/browse.js.map +0 -1
  289. package/dist/routes/git.d.ts +0 -9
  290. package/dist/routes/git.d.ts.map +0 -1
  291. package/dist/routes/git.js +0 -338
  292. package/dist/routes/git.js.map +0 -1
  293. package/dist/routes/projects.d.ts.map +0 -1
  294. package/dist/routes/projects.js +0 -220
  295. package/dist/routes/projects.js.map +0 -1
  296. package/dist/routes/tasks.d.ts.map +0 -1
  297. package/dist/routes/tasks.js +0 -313
  298. package/dist/routes/tasks.js.map +0 -1
  299. package/draken.dockerfile.template +0 -18
  300. package/public/assets/index-3ngsG5kF.css +0 -1
  301. package/public/assets/index-B3YSD0ee.js +0 -252
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalEmbedder = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const crypto_1 = require("crypto");
10
+ const os_1 = require("os");
11
+ const tokenizers_1 = require("@huggingface/tokenizers");
12
+ const ort = require('onnxruntime-web/wasm');
13
+ const types_1 = require("./types");
14
+ // CPU-only text embeddings. No speech runtime, provider credentials, downloaded
15
+ // executable code or arbitrary model URLs. The owner prepares files on demand.
16
+ const MODEL = 'Xenova/multilingual-e5-small';
17
+ const REVISION = '761b726dd34fb83930e26aab4e9ac3899aa1fa78';
18
+ const FILES = [
19
+ { name: 'onnx/model_quantized.onnx', size: 118308185, sha: 'f80102d3f2a1229f387d3c81909990d8945513e347b0eab049f7de3c6f98c193' },
20
+ { name: 'tokenizer.json', size: 17082730, sha: '0b44a9d7b51c3c62626640cda0e2c2f70fdacdc25bbbd68038369d14ebdf4c39' },
21
+ { name: 'tokenizer_config.json', size: 443, sha: 'a1d6bc8734a6f635dc158508bef000f8e2e5a759c7d92f984b2c86e5ff53425b' },
22
+ ];
23
+ const MODEL_ID = `${MODEL}@${REVISION}/q8-mean-normalized-v1`;
24
+ class LocalEmbedder {
25
+ directory;
26
+ threads;
27
+ fingerprint = MODEL_ID;
28
+ session;
29
+ tokenizer;
30
+ constructor(directory, threads = Math.max(1, Math.min(4, Math.floor((0, os_1.availableParallelism)() / 2)))) {
31
+ this.directory = directory;
32
+ this.threads = threads;
33
+ if (!Number.isSafeInteger(threads) || threads < 1 || threads > 4)
34
+ throw new Error('Invalid embedding thread budget');
35
+ }
36
+ ready() { return FILES.every(file => { try {
37
+ return fs_1.default.statSync(path_1.default.join(this.directory, file.name)).size === file.size;
38
+ }
39
+ catch {
40
+ return false;
41
+ } }); }
42
+ async verified(file) {
43
+ const hash = (0, crypto_1.createHash)('sha256');
44
+ try {
45
+ for await (const chunk of fs_1.default.createReadStream(path_1.default.join(this.directory, file.name)))
46
+ hash.update(chunk);
47
+ return hash.digest('hex') === file.sha;
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ async setup(report) {
54
+ const total = FILES.reduce((sum, file) => sum + file.size, 0);
55
+ let completed = 0;
56
+ for (const file of FILES) {
57
+ if (await this.verified(file)) {
58
+ completed += file.size;
59
+ continue;
60
+ }
61
+ const progress = (size) => report?.((0, types_1.historyUpdate)('downloading', { downloaded_bytes: completed + size, download_total_bytes: total }));
62
+ progress(0);
63
+ const target = path_1.default.join(this.directory, file.name), temporary = target + '.part';
64
+ fs_1.default.mkdirSync(path_1.default.dirname(target), { recursive: true, mode: 0o700 });
65
+ const controller = new AbortController(), timer = setTimeout(() => controller.abort(), 300000);
66
+ try {
67
+ const response = await fetch(`https://huggingface.co/${MODEL}/resolve/${REVISION}/${file.name}`, { signal: controller.signal });
68
+ if (!response.ok || !response.body)
69
+ throw new Error('Model download failed');
70
+ const handle = fs_1.default.openSync(temporary, 'w', 0o600), hash = (0, crypto_1.createHash)('sha256');
71
+ let size = 0;
72
+ try {
73
+ for await (const chunk of response.body) {
74
+ size += chunk.length;
75
+ if (size > file.size)
76
+ throw new Error('Model size mismatch');
77
+ hash.update(chunk);
78
+ fs_1.default.writeSync(handle, chunk);
79
+ progress(size);
80
+ }
81
+ }
82
+ finally {
83
+ fs_1.default.closeSync(handle);
84
+ }
85
+ if (size !== file.size || hash.digest('hex') !== file.sha)
86
+ throw new Error('Model checksum mismatch');
87
+ fs_1.default.renameSync(temporary, target);
88
+ completed += file.size;
89
+ }
90
+ finally {
91
+ clearTimeout(timer);
92
+ fs_1.default.rmSync(temporary, { force: true });
93
+ }
94
+ }
95
+ }
96
+ async load() {
97
+ if (this.session)
98
+ return;
99
+ for (const file of FILES)
100
+ if (!await this.verified(file))
101
+ throw new Error('Pinned embedding files are missing or damaged. Retry the history request to repair them.');
102
+ // WASM is deliberately used on the server: no CUDA installer or browser bundle.
103
+ // Each isolated embedding lane has one session and a bounded kernel budget.
104
+ // The pool caps their combined CPU use, leaving capacity for other work.
105
+ ort.env.wasm.numThreads = this.threads;
106
+ ort.env.wasm.proxy = false;
107
+ ort.env.logLevel = 'error';
108
+ this.tokenizer = new tokenizers_1.Tokenizer(JSON.parse(fs_1.default.readFileSync(path_1.default.join(this.directory, 'tokenizer.json'), 'utf8')), JSON.parse(fs_1.default.readFileSync(path_1.default.join(this.directory, 'tokenizer_config.json'), 'utf8')));
109
+ this.session = await ort.InferenceSession.create(fs_1.default.readFileSync(path_1.default.join(this.directory, FILES[0].name)), { executionProviders: ['wasm'], logSeverityLevel: 3 });
110
+ }
111
+ async embed(text, query) {
112
+ await this.load();
113
+ const encoded = this.tokenizer.encode(`${query ? 'query' : 'passage'}: ${text}`, { add_special_tokens: false });
114
+ // Pool ALL tokens in bounded windows, not just the prefix of long code or
115
+ // multilingual text. Passage chunks are independently indexed as well.
116
+ const pooled = new Float32Array(384);
117
+ let weight = 0;
118
+ for (let start = 0; start < encoded.ids.length; start += 480) {
119
+ const ids = [0, ...encoded.ids.slice(start, start + 480), 2];
120
+ const input = new ort.Tensor('int64', BigInt64Array.from(ids, BigInt), [1, ids.length]);
121
+ const mask = new ort.Tensor('int64', new BigInt64Array(ids.length).fill(1n), [1, ids.length]);
122
+ const segment = new ort.Tensor('int64', new BigInt64Array(ids.length), [1, ids.length]);
123
+ const result = await this.session.run({ input_ids: input, attention_mask: mask,
124
+ ...(this.session.inputNames.includes('token_type_ids') ? { token_type_ids: segment } : {}) });
125
+ const output = result.last_hidden_state;
126
+ if (!output || output.dims[2] !== 384 || !(output.data instanceof Float32Array))
127
+ throw new Error('Unexpected embedding output');
128
+ for (let token = 0; token < ids.length; token++)
129
+ for (let d = 0; d < 384; d++)
130
+ pooled[d] += output.data[token * 384 + d];
131
+ weight += ids.length;
132
+ for (const tensor of Object.values(result))
133
+ tensor.dispose();
134
+ input.dispose();
135
+ mask.dispose();
136
+ segment.dispose();
137
+ }
138
+ let norm = 0;
139
+ for (let d = 0; d < 384; d++) {
140
+ pooled[d] /= weight;
141
+ norm += pooled[d] ** 2;
142
+ }
143
+ norm = Math.sqrt(norm);
144
+ if (!Number.isFinite(norm) || norm === 0)
145
+ throw new Error('Invalid embedding');
146
+ for (let d = 0; d < 384; d++)
147
+ pooled[d] /= norm;
148
+ return pooled;
149
+ }
150
+ }
151
+ exports.LocalEmbedder = LocalEmbedder;
152
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/memory/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type HistoryPage, type HistoryProgress, type HistoryQuery, type HistoryResults } from './types';
2
+ export declare function historyProgress(): HistoryProgress;
3
+ export declare function stopHistory(): void;
4
+ export declare function validateHistoryQuery(value: unknown): HistoryQuery;
5
+ export declare const prepareHistory: (before: string, signal: AbortSignal, background?: boolean) => Promise<void>;
6
+ export declare const searchHistory: (query: HistoryQuery, signal?: AbortSignal) => Promise<HistoryResults>;
7
+ export declare function readHistory(ref: string, offset?: number, signal?: AbortSignal): Promise<HistoryPage>;
8
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/memory/service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAiB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAsB,MAAM,SAAS,CAAC;AA0C5I,wBAAgB,eAAe,IAAI,eAAe,CAGjD;AAyDD,wBAAgB,WAAW,SAK1B;AACD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CASjE;AACD,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,EAAE,QAAQ,WAAW,EAAE,oBAAkB,kBAA6D,CAAC;AACpJ,eAAO,MAAM,aAAa,GAAI,OAAO,YAAY,EAAE,SAAS,WAAW,4BAAsF,CAAC;AAC9J,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,MAAM,CAAC,EAAE,WAAW,wBAGxE"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.searchHistory = exports.prepareHistory = void 0;
7
+ exports.historyProgress = historyProgress;
8
+ exports.stopHistory = stopHistory;
9
+ exports.validateHistoryQuery = validateHistoryQuery;
10
+ exports.readHistory = readHistory;
11
+ const path_1 = __importDefault(require("path"));
12
+ const child_process_1 = require("child_process");
13
+ const schema_1 = require("../db/schema");
14
+ const registry_1 = require("../sources/registry");
15
+ const store_1 = require("../sync/store");
16
+ const types_1 = require("./types");
17
+ let child, directory = '', sessionRoot = '', sequence = 0, active;
18
+ let idle;
19
+ const retiring = new Set(), queue = [];
20
+ const failure = () => new store_1.HttpError(503, 'History could not be prepared or searched. Check network access on first use; if session files changed or moved, scan sessions again, then retry your question. Completed work is cached; no other provider or search mode was substituted.');
21
+ const cancelled = () => new store_1.HttpError(409, 'History lookup stopped. Completed work is retained for the next request.');
22
+ function settle(work, error, value) {
23
+ clearTimeout(work.timer);
24
+ clearTimeout(work.deadline);
25
+ work.signal?.removeEventListener('abort', work.abort);
26
+ if (active === work)
27
+ active = undefined;
28
+ if (error)
29
+ work.reject(error);
30
+ else
31
+ work.resolve(value);
32
+ }
33
+ function retire() {
34
+ const prior = child;
35
+ child = undefined;
36
+ if (prior) {
37
+ retiring.add(prior);
38
+ prior.kill('SIGTERM');
39
+ const timer = setTimeout(() => { if (prior.exitCode === null && prior.signalCode === null)
40
+ prior.kill('SIGKILL'); }, 1500);
41
+ timer.unref();
42
+ }
43
+ }
44
+ function watch(work) {
45
+ clearTimeout(work.timer);
46
+ work.timer = setTimeout(() => { if (active === work) {
47
+ settle(work, failure());
48
+ retire();
49
+ } }, work.method === 'read' ? 30000 : 10 * 60000);
50
+ }
51
+ function progressValue(value) {
52
+ if (!value || !['scanning', 'downloading', 'loading', 'indexing', 'searching', 'reading'].includes(value.stage))
53
+ return;
54
+ for (const name of ['completed', 'total', 'reused', 'downloaded_bytes', 'download_total_bytes'])
55
+ if (!Number.isSafeInteger(value[name]) || value[name] < 0)
56
+ return;
57
+ if (value.completed > value.total || !Number.isSafeInteger(value.total + value.reused) || value.downloaded_bytes > value.download_total_bytes)
58
+ return;
59
+ if (value.remaining_seconds !== null && (!Number.isSafeInteger(value.remaining_seconds) || value.remaining_seconds < 0))
60
+ return;
61
+ const p = value.parallelism;
62
+ if (p !== undefined && (!p || !Number.isSafeInteger(p.workers) || p.workers < 1 || p.workers > 2 || !Number.isSafeInteger(p.threads) || p.threads < p.workers || p.threads > 6))
63
+ return;
64
+ return (0, types_1.historyUpdate)(value.stage, { completed: value.completed, total: value.total, reused: value.reused,
65
+ ...(p ? { parallelism: { workers: p.workers, threads: p.threads } } : {}),
66
+ remaining_seconds: value.remaining_seconds, downloaded_bytes: value.downloaded_bytes, download_total_bytes: value.download_total_bytes });
67
+ }
68
+ function historyProgress() {
69
+ return { active: Boolean(active), background: active?.background || false, queued: queue.length, elapsed_ms: active?.started ? Date.now() - active.started : 0,
70
+ updated_at: active?.updated || null, work: active?.progress || null };
71
+ }
72
+ function start() {
73
+ if (child)
74
+ return;
75
+ const processChild = (0, child_process_1.fork)(path_1.default.join(__dirname, 'worker.js'), [directory, sessionRoot], { execArgv: [],
76
+ env: { PATH: process.env.PATH, LANG: process.env.LANG, SYSTEMROOT: process.env.SYSTEMROOT },
77
+ stdio: ['ignore', 'ignore', 'ignore', 'ipc'] });
78
+ child = processChild;
79
+ processChild.on('message', (message) => {
80
+ if (child !== processChild || !message || !active || message.id !== active.id)
81
+ return;
82
+ if (message.progress !== undefined) {
83
+ const value = progressValue(message.progress);
84
+ if (value) {
85
+ active.progress = value;
86
+ active.updated = Date.now();
87
+ watch(active);
88
+ }
89
+ return;
90
+ }
91
+ settle(active, message.error ? failure() : undefined, message.value);
92
+ pump();
93
+ });
94
+ const exited = () => {
95
+ retiring.delete(processChild);
96
+ if (child === processChild) {
97
+ child = undefined;
98
+ if (active)
99
+ settle(active, failure());
100
+ }
101
+ pump();
102
+ };
103
+ processChild.once('error', exited);
104
+ processChild.once('exit', exited);
105
+ }
106
+ function pump() {
107
+ if (active || retiring.size)
108
+ return;
109
+ clearTimeout(idle);
110
+ if (!queue.length) {
111
+ if (child) {
112
+ idle = setTimeout(stopHistory, 5 * 60000);
113
+ idle.unref();
114
+ }
115
+ return;
116
+ }
117
+ const work = queue.shift();
118
+ if (work.signal?.aborted) {
119
+ settle(work, cancelled());
120
+ pump();
121
+ return;
122
+ }
123
+ active = work;
124
+ try {
125
+ start();
126
+ work.started = work.updated = Date.now();
127
+ work.progress = (0, types_1.historyUpdate)(work.method === 'read' ? 'reading' : 'scanning');
128
+ watch(work);
129
+ // A healthy first index can exceed an interactive-query timeout. Progress
130
+ // renews its stall deadline, but total work remains bounded to two hours.
131
+ work.deadline = setTimeout(() => { if (active === work) {
132
+ settle(work, failure());
133
+ retire();
134
+ } }, 2 * 60 * 60000);
135
+ child.send({ id: work.id, method: work.method, ...work.args }, error => { if (error && active === work) {
136
+ settle(work, failure());
137
+ retire();
138
+ } });
139
+ }
140
+ catch {
141
+ settle(work, failure());
142
+ retire();
143
+ if (!retiring.size)
144
+ pump();
145
+ }
146
+ }
147
+ function request(method, args = {}, signal, background = false) {
148
+ if (signal?.aborted)
149
+ return Promise.reject(cancelled());
150
+ const roots = JSON.stringify((0, registry_1.getSourceRoots)());
151
+ if (directory !== (0, schema_1.getDataDir)() || sessionRoot !== roots) {
152
+ stopHistory();
153
+ directory = (0, schema_1.getDataDir)();
154
+ sessionRoot = roots;
155
+ }
156
+ if (background && (active || queue.length || retiring.size))
157
+ return Promise.reject(cancelled());
158
+ if (!background && active?.background) {
159
+ settle(active, cancelled());
160
+ retire();
161
+ }
162
+ if (queue.length >= 8)
163
+ return Promise.reject(new store_1.HttpError(429, 'Too many history requests. Try again shortly.'));
164
+ (0, schema_1.getDb)(); // Only the app initializes its DB. The worker opens it read-only.
165
+ return new Promise((resolve, reject) => {
166
+ const work = { id: ++sequence, method, args, signal, background, resolve: value => resolve(value), reject, abort: () => {
167
+ if (active === work) {
168
+ settle(work, cancelled());
169
+ retire();
170
+ }
171
+ else {
172
+ const at = queue.indexOf(work);
173
+ if (at >= 0) {
174
+ queue.splice(at, 1);
175
+ settle(work, cancelled());
176
+ }
177
+ }
178
+ } };
179
+ signal?.addEventListener('abort', work.abort, { once: true });
180
+ queue.push(work);
181
+ pump();
182
+ });
183
+ }
184
+ function stopHistory() {
185
+ clearTimeout(idle);
186
+ if (active)
187
+ settle(active, cancelled());
188
+ for (const work of queue.splice(0))
189
+ settle(work, cancelled());
190
+ retire();
191
+ }
192
+ function validateHistoryQuery(value) {
193
+ if (!value || typeof value !== 'object' || Array.isArray(value))
194
+ throw new store_1.HttpError(400, 'A history query is required');
195
+ const query = value;
196
+ if (Object.keys(query).some(key => !['question', 'session_id', 'sync_id', 'before'].includes(key)))
197
+ throw new store_1.HttpError(400, 'Unknown history query option');
198
+ if (typeof query.question !== 'string' || !query.question.trim() || query.question.length > 2000)
199
+ throw new store_1.HttpError(400, 'History question must be 1 to 2000 characters');
200
+ if (query.session_id !== undefined && (typeof query.session_id !== 'string' || !/^(?:(?:codex|claude):)?[\w-]{1,128}(?::[\w-]{1,128})?$/.test(query.session_id)))
201
+ throw new store_1.HttpError(400, 'Invalid session filter');
202
+ if (query.sync_id !== undefined && (!Number.isSafeInteger(query.sync_id) || query.sync_id < 1))
203
+ throw new store_1.HttpError(400, 'Invalid sync filter');
204
+ if (query.before !== undefined && (typeof query.before !== 'string' || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(query.before) || !Number.isFinite(Date.parse(query.before)) || new Date(query.before).toISOString() !== query.before))
205
+ throw new store_1.HttpError(400, 'Invalid history cutoff');
206
+ return { ...query, question: query.question.trim() };
207
+ }
208
+ const prepareHistory = (before, signal, background = false) => request('prepare', { before }, signal, background);
209
+ exports.prepareHistory = prepareHistory;
210
+ const searchHistory = (query, signal) => request('search', { query: validateHistoryQuery(query) }, signal);
211
+ exports.searchHistory = searchHistory;
212
+ function readHistory(ref, offset = 0, signal) {
213
+ if (!/^H[a-f0-9]{24}$/.test(ref) || !Number.isSafeInteger(offset) || offset < 0 || offset > 1000000)
214
+ throw new store_1.HttpError(400, 'Invalid historical source or offset');
215
+ return request('read', { ref, offset }, signal);
216
+ }
217
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/memory/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type Database from 'better-sqlite3';
2
+ import { type RootInput } from '../sources/registry';
3
+ import type { NormalizationCache } from '../sync/jsonl';
4
+ import type { HistoryRecord } from './types';
5
+ export declare const digest: (text: string) => string;
6
+ export interface SourceRecord extends HistoryRecord {
7
+ group: string;
8
+ position: number;
9
+ identity: string;
10
+ }
11
+ /** Read canonical metadata/frozen pointers and verified, admitted JSONL records.
12
+ * No discovery, scan, recovery or application/source writes. Current exclusions
13
+ * and baseline apply to archive retrieval, not to frozen pages. */
14
+ export declare function historySources(db: Database.Database, root?: RootInput, cache?: NormalizationCache): Generator<SourceRecord>;
15
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/memory/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,eAAO,MAAM,MAAM,GAAI,MAAM,MAAM,WAAoD,CAAC;AACxF,MAAM,WAAW,YAAa,SAAQ,aAAa;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAEzG;;mEAEmE;AACnE,wBAAiB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAE,SAA4B,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC,YAAY,CAAC,CAqD9I"}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.digest = void 0;
4
+ exports.historySources = historySources;
5
+ const crypto_1 = require("crypto");
6
+ const normalize_1 = require("../sync/normalize");
7
+ const source_files_1 = require("../sync/source-files");
8
+ const registry_1 = require("../sources/registry");
9
+ const evidence_1 = require("../db/evidence");
10
+ const digest = (text) => (0, crypto_1.createHash)('sha256').update(text).digest('hex');
11
+ exports.digest = digest;
12
+ /** Read canonical metadata/frozen pointers and verified, admitted JSONL records.
13
+ * No discovery, scan, recovery or application/source writes. Current exclusions
14
+ * and baseline apply to archive retrieval, not to frozen pages. */
15
+ function* historySources(db, root = (0, registry_1.getSourceRoots)(), cache) {
16
+ const sessions = new Map(db.prepare('SELECT s.id,s.included,s.missing,a.enabled FROM agent_sessions s JOIN agent_sources a ON a.id=s.agent').all().map(row => [row.id, row]));
17
+ const baseline = db.prepare("SELECT value FROM sync_settings WHERE key='history_since'").get()?.value || '';
18
+ const allowed = (session, at) => sessions.get(session)?.enabled === 1 && sessions.get(session)?.included === 1 && !sessions.get(session)?.missing && at >= baseline;
19
+ const record = (key, data, identity) => {
20
+ const clean = { ...data, text: (0, normalize_1.cleanText)(data.text, Number.MAX_SAFE_INTEGER), title: (0, normalize_1.cleanText)(data.title, 180), workspace: (0, normalize_1.cleanText)(data.workspace, 300), role: (0, normalize_1.cleanText)(data.role, 40) };
21
+ return { ...clean, identity: identity || (0, exports.digest)(key + '\0' + clean.text), ref: `H${(0, exports.digest)(JSON.stringify([key, clean])).slice(0, 24)}` };
22
+ };
23
+ const evidence = (item, syncId) => {
24
+ if (!allowed(item.session_id, item.timestamp) || !item.text.trim())
25
+ return;
26
+ const key = (0, exports.digest)(item.event_key + '\0' + (0, normalize_1.cleanText)(item.text, Number.MAX_SAFE_INTEGER));
27
+ return record(`snapshot:${syncId}:${item.ref}`, { kind: 'snapshot', session_id: item.session_id, sync_id: syncId, origin_ref: item.ref,
28
+ title: item.agent && item.agent !== 'pi' ? `${item.agent}: ${item.session_name || item.cwd}` : item.session_name || item.cwd, workspace: item.cwd, role: item.role, at: item.timestamp, text: item.text,
29
+ qualification: 'Frozen session excerpt. Assistant claims are not independently verified; tool output proves only what is shown.',
30
+ group: `session:${item.session_id}`, position: item.sequence || 0 }, key);
31
+ };
32
+ const frozen = new evidence_1.EvidenceReader(db, root, cache);
33
+ try {
34
+ for (const row of db.prepare("SELECT i.sync_id,i.evidence_json FROM sync_items i JOIN syncs s ON s.id=i.sync_id WHERE s.status!='discarded' ORDER BY i.sync_id,i.rowid").iterate()) {
35
+ const metadata = JSON.parse(row.evidence_json);
36
+ if (!allowed(metadata.session_id, metadata.timestamp))
37
+ continue;
38
+ const result = evidence(frozen.read(metadata), row.sync_id);
39
+ if (result)
40
+ yield result;
41
+ }
42
+ for (const row of db.prepare("SELECT id,status,completed_at,context_json,decisions,carry_forward FROM syncs WHERE status!='discarded' ORDER BY id").iterate()) {
43
+ for (const item of JSON.parse(row.context_json)) {
44
+ if (!allowed(item.session_id, item.timestamp))
45
+ continue;
46
+ const result = evidence(frozen.read(item), row.id);
47
+ if (result)
48
+ yield result;
49
+ }
50
+ for (const kind of ['decisions', 'carry_forward'])
51
+ if (row[kind].trim())
52
+ yield record(`${kind}:${row.id}`, {
53
+ kind, sync_id: row.id, session_id: null, origin_ref: null, title: `Sync #${row.id} saved ${kind === 'decisions' ? 'decisions' : 'carry-forward'}`,
54
+ workspace: '', role: 'saved_note', at: row.status === 'completed' ? row.completed_at : null, text: row[kind],
55
+ qualification: row.status === 'completed' ? 'Explicitly saved note, frozen on completion; not proof the proposed work happened.' : 'Current saved note. Its edit time was not retained; do not infer when this decision was made.',
56
+ group: `notes:${row.id}`, position: kind === 'decisions' ? 0 : 1
57
+ });
58
+ }
59
+ }
60
+ finally {
61
+ frozen.close();
62
+ }
63
+ const reader = new source_files_1.EntryReader(db, root, cache);
64
+ try {
65
+ for (const row of db.prepare(`SELECT e.id,e.event_key,e.session_id,s.agent,s.name,s.cwd,e.role,e.timestamp
66
+ FROM agent_entries e JOIN agent_sessions s ON s.id=e.session_id
67
+ WHERE e.active=1 AND e.present=1 AND e.is_activity=1 AND e.effective_length>0 ORDER BY e.id`).iterate()) {
68
+ if (!allowed(row.session_id, row.timestamp))
69
+ continue;
70
+ const text = reader.effective(row.id);
71
+ const key = (0, exports.digest)(row.event_key + '\0' + (0, normalize_1.cleanText)(text, Number.MAX_SAFE_INTEGER));
72
+ yield record(`entry:${row.id}`, { kind: 'session', session_id: row.session_id, sync_id: null, origin_ref: null, title: row.agent !== 'pi' ? `${row.agent}: ${row.name || row.cwd}` : row.name || row.cwd,
73
+ workspace: row.cwd, role: row.role, at: row.timestamp, text,
74
+ qualification: 'Indexed active session excerpt, not a reviewed snapshot. Assistant claims are not independently verified.', group: `session:${row.session_id}`, position: row.id }, key);
75
+ }
76
+ }
77
+ finally {
78
+ reader.close();
79
+ }
80
+ for (const row of db.prepare(`SELECT m.id,m.sync_id,m.role,m.content,m.created_at FROM sync_messages m JOIN syncs s ON s.id=m.sync_id WHERE s.status!='discarded' ORDER BY m.id`).iterate()) {
81
+ if (!row.content.trim())
82
+ continue;
83
+ yield record(`message:${row.id}`, { kind: 'discussion', session_id: null, sync_id: row.sync_id, origin_ref: null, title: `Sync #${row.sync_id} discussion`, workspace: '', role: row.role,
84
+ at: row.created_at, text: row.content, qualification: 'Historical conversation, not a current request. Generated text is not proof of playback, agreement or execution.', group: `discussion:${row.sync_id}`, position: row.id });
85
+ }
86
+ }
87
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/memory/sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import Database from 'better-sqlite3';
2
+ /** One counter slot per original source entry, not per session/alias/snapshot.
3
+ * Distinct frozen projections join that entry's fingerprint rather than counting
4
+ * the same original again. No bodies are reconstructed or retained here. */
5
+ export declare function sourceStamps(db: Database.Database, before?: string): Map<string, string>;
6
+ /** Write only after successful unscoped preparation. Hashes are scheduling hints,
7
+ * never evidence or authorization to skip fresh source verification. */
8
+ export declare function saveSourceCheckpoint(db: Database.Database, stamps: Map<string, string>): void;
9
+ /** No file/DB/model creation. Older indexes without a checkpoint need one
10
+ * foreground preparation; treating the whole cached archive as new would let
11
+ * a small tail bypass the minimum after a restart. */
12
+ export declare function loadSourceCheckpoint(directory: string): Map<string, string> | undefined;
13
+ //# sourceMappingURL=stamps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamps.d.ts","sourceRoot":"","sources":["../../src/memory/stamps.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAMtC;;4EAE4E;AAC5E,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAkCxF;AAED;wEACwE;AACxE,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,QAItF;AAED;;sDAEsD;AACtD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAiBvF"}