draken 0.1.6 → 0.3.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 (326) hide show
  1. package/ACCEPTANCE.md +34 -0
  2. package/CHANGELOG.md +65 -0
  3. package/CONTRIBUTING.md +129 -0
  4. package/MEMORY.md +118 -0
  5. package/PERSONA.md +67 -0
  6. package/README.md +168 -78
  7. package/SETUP.md +111 -0
  8. package/SOURCES.md +75 -0
  9. package/TRAY.md +54 -0
  10. package/VOICE.md +126 -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 +206 -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 +107 -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 +32 -0
  58. package/dist/memory/index.d.ts.map +1 -0
  59. package/dist/memory/index.js +441 -0
  60. package/dist/memory/index.js.map +1 -0
  61. package/dist/memory/model-files.d.ts +9 -0
  62. package/dist/memory/model-files.d.ts.map +1 -0
  63. package/dist/memory/model-files.js +13 -0
  64. package/dist/memory/model-files.js.map +1 -0
  65. package/dist/memory/model.d.ts +15 -0
  66. package/dist/memory/model.d.ts.map +1 -0
  67. package/dist/memory/model.js +147 -0
  68. package/dist/memory/model.js.map +1 -0
  69. package/dist/memory/readiness.d.ts +16 -0
  70. package/dist/memory/readiness.d.ts.map +1 -0
  71. package/dist/memory/readiness.js +131 -0
  72. package/dist/memory/readiness.js.map +1 -0
  73. package/dist/memory/reconcile.d.ts +11 -0
  74. package/dist/memory/reconcile.d.ts.map +1 -0
  75. package/dist/memory/reconcile.js +132 -0
  76. package/dist/memory/reconcile.js.map +1 -0
  77. package/dist/memory/service.d.ts +10 -0
  78. package/dist/memory/service.d.ts.map +1 -0
  79. package/dist/memory/service.js +243 -0
  80. package/dist/memory/service.js.map +1 -0
  81. package/dist/memory/sources.d.ts +15 -0
  82. package/dist/memory/sources.d.ts.map +1 -0
  83. package/dist/memory/sources.js +94 -0
  84. package/dist/memory/sources.js.map +1 -0
  85. package/dist/memory/stamps.d.ts +13 -0
  86. package/dist/memory/stamps.d.ts.map +1 -0
  87. package/dist/memory/stamps.js +101 -0
  88. package/dist/memory/stamps.js.map +1 -0
  89. package/dist/memory/storage.d.ts +5 -0
  90. package/dist/memory/storage.d.ts.map +1 -0
  91. package/dist/memory/storage.js +116 -0
  92. package/dist/memory/storage.js.map +1 -0
  93. package/dist/memory/types.d.ts +89 -0
  94. package/dist/memory/types.d.ts.map +1 -0
  95. package/dist/memory/types.js +8 -0
  96. package/dist/memory/types.js.map +1 -0
  97. package/dist/memory/worker.d.ts +2 -0
  98. package/dist/memory/worker.d.ts.map +1 -0
  99. package/dist/memory/worker.js +84 -0
  100. package/dist/memory/worker.js.map +1 -0
  101. package/dist/npm-cli.d.ts +4 -0
  102. package/dist/npm-cli.d.ts.map +1 -0
  103. package/dist/npm-cli.js +36 -0
  104. package/dist/npm-cli.js.map +1 -0
  105. package/dist/pi/runtime.d.ts +34 -0
  106. package/dist/pi/runtime.d.ts.map +1 -0
  107. package/dist/pi/runtime.js +210 -0
  108. package/dist/pi/runtime.js.map +1 -0
  109. package/dist/pi/setup.d.ts +5 -0
  110. package/dist/pi/setup.d.ts.map +1 -0
  111. package/dist/pi/setup.js +147 -0
  112. package/dist/pi/setup.js.map +1 -0
  113. package/dist/routes/auth.d.ts.map +1 -1
  114. package/dist/routes/auth.js +3 -1
  115. package/dist/routes/auth.js.map +1 -1
  116. package/dist/routes/live-voice.d.ts +3 -0
  117. package/dist/routes/live-voice.d.ts.map +1 -0
  118. package/dist/routes/live-voice.js +49 -0
  119. package/dist/routes/live-voice.js.map +1 -0
  120. package/dist/routes/{browse.d.ts → memory.d.ts} +1 -1
  121. package/dist/routes/memory.d.ts.map +1 -0
  122. package/dist/routes/memory.js +18 -0
  123. package/dist/routes/memory.js.map +1 -0
  124. package/dist/routes/{tasks.d.ts → sync.d.ts} +1 -1
  125. package/dist/routes/sync.d.ts.map +1 -0
  126. package/dist/routes/sync.js +145 -0
  127. package/dist/routes/sync.js.map +1 -0
  128. package/dist/routes/{projects.d.ts → voice.d.ts} +1 -1
  129. package/dist/routes/voice.d.ts.map +1 -0
  130. package/dist/routes/voice.js +35 -0
  131. package/dist/routes/voice.js.map +1 -0
  132. package/dist/server-state.d.ts +30 -0
  133. package/dist/server-state.d.ts.map +1 -0
  134. package/dist/server-state.js +113 -0
  135. package/dist/server-state.js.map +1 -0
  136. package/dist/server-status.d.ts +7 -0
  137. package/dist/server-status.d.ts.map +1 -0
  138. package/dist/server-status.js +34 -0
  139. package/dist/server-status.js.map +1 -0
  140. package/dist/server.d.ts +5 -1
  141. package/dist/server.d.ts.map +1 -1
  142. package/dist/server.js +148 -46
  143. package/dist/server.js.map +1 -1
  144. package/dist/sources/adapters.d.ts +15 -0
  145. package/dist/sources/adapters.d.ts.map +1 -0
  146. package/dist/sources/adapters.js +159 -0
  147. package/dist/sources/adapters.js.map +1 -0
  148. package/dist/sources/registry.d.ts +17 -0
  149. package/dist/sources/registry.d.ts.map +1 -0
  150. package/dist/sources/registry.js +56 -0
  151. package/dist/sources/registry.js.map +1 -0
  152. package/dist/sync/collector.d.ts +3 -0
  153. package/dist/sync/collector.d.ts.map +1 -0
  154. package/dist/sync/collector.js +324 -0
  155. package/dist/sync/collector.js.map +1 -0
  156. package/dist/sync/cost.d.ts +7 -0
  157. package/dist/sync/cost.d.ts.map +1 -0
  158. package/dist/sync/cost.js +31 -0
  159. package/dist/sync/cost.js.map +1 -0
  160. package/dist/sync/jsonl.d.ts +34 -0
  161. package/dist/sync/jsonl.d.ts.map +1 -0
  162. package/dist/sync/jsonl.js +161 -0
  163. package/dist/sync/jsonl.js.map +1 -0
  164. package/dist/sync/manager.d.ts +15 -0
  165. package/dist/sync/manager.d.ts.map +1 -0
  166. package/dist/sync/manager.js +287 -0
  167. package/dist/sync/manager.js.map +1 -0
  168. package/dist/sync/normalize.d.ts +22 -0
  169. package/dist/sync/normalize.d.ts.map +1 -0
  170. package/dist/sync/normalize.js +107 -0
  171. package/dist/sync/normalize.js.map +1 -0
  172. package/dist/sync/pi-output.d.ts +33 -0
  173. package/dist/sync/pi-output.d.ts.map +1 -0
  174. package/dist/sync/pi-output.js +186 -0
  175. package/dist/sync/pi-output.js.map +1 -0
  176. package/dist/sync/pi.d.ts +15 -0
  177. package/dist/sync/pi.d.ts.map +1 -0
  178. package/dist/sync/pi.js +149 -0
  179. package/dist/sync/pi.js.map +1 -0
  180. package/dist/sync/recap.d.ts +25 -0
  181. package/dist/sync/recap.d.ts.map +1 -0
  182. package/dist/sync/recap.js +118 -0
  183. package/dist/sync/recap.js.map +1 -0
  184. package/dist/sync/reconciliation.d.ts +16 -0
  185. package/dist/sync/reconciliation.d.ts.map +1 -0
  186. package/dist/sync/reconciliation.js +22 -0
  187. package/dist/sync/reconciliation.js.map +1 -0
  188. package/dist/sync/references.d.ts +10 -0
  189. package/dist/sync/references.d.ts.map +1 -0
  190. package/dist/sync/references.js +50 -0
  191. package/dist/sync/references.js.map +1 -0
  192. package/dist/sync/source-files.d.ts +16 -0
  193. package/dist/sync/source-files.d.ts.map +1 -0
  194. package/dist/sync/source-files.js +56 -0
  195. package/dist/sync/source-files.js.map +1 -0
  196. package/dist/sync/store.d.ts +36 -0
  197. package/dist/sync/store.d.ts.map +1 -0
  198. package/dist/sync/store.js +359 -0
  199. package/dist/sync/store.js.map +1 -0
  200. package/dist/sync/summary-budget.d.ts +19 -0
  201. package/dist/sync/summary-budget.d.ts.map +1 -0
  202. package/dist/sync/summary-budget.js +39 -0
  203. package/dist/sync/summary-budget.js.map +1 -0
  204. package/dist/sync/tree.d.ts +69 -0
  205. package/dist/sync/tree.d.ts.map +1 -0
  206. package/dist/sync/tree.js +599 -0
  207. package/dist/sync/tree.js.map +1 -0
  208. package/dist/tray/controller.d.ts +51 -0
  209. package/dist/tray/controller.d.ts.map +1 -0
  210. package/dist/tray/controller.js +178 -0
  211. package/dist/tray/controller.js.map +1 -0
  212. package/dist/tray/launcher.d.ts +3 -0
  213. package/dist/tray/launcher.d.ts.map +1 -0
  214. package/dist/tray/launcher.js +47 -0
  215. package/dist/tray/launcher.js.map +1 -0
  216. package/dist/tray/native.d.ts +12 -0
  217. package/dist/tray/native.d.ts.map +1 -0
  218. package/dist/tray/native.js +93 -0
  219. package/dist/tray/native.js.map +1 -0
  220. package/dist/tray/processes.d.ts +5 -0
  221. package/dist/tray/processes.d.ts.map +1 -0
  222. package/dist/tray/processes.js +99 -0
  223. package/dist/tray/processes.js.map +1 -0
  224. package/dist/tray/worker.d.ts +4 -0
  225. package/dist/tray/worker.d.ts.map +1 -0
  226. package/dist/tray/worker.js +150 -0
  227. package/dist/tray/worker.js.map +1 -0
  228. package/dist/types.d.ts +221 -20
  229. package/dist/types.d.ts.map +1 -1
  230. package/dist/voice/continuation.d.ts +25 -0
  231. package/dist/voice/continuation.d.ts.map +1 -0
  232. package/dist/voice/continuation.js +95 -0
  233. package/dist/voice/continuation.js.map +1 -0
  234. package/dist/voice/history-focus.d.ts +14 -0
  235. package/dist/voice/history-focus.d.ts.map +1 -0
  236. package/dist/voice/history-focus.js +39 -0
  237. package/dist/voice/history-focus.js.map +1 -0
  238. package/dist/voice/legacy-history.d.ts +5 -0
  239. package/dist/voice/legacy-history.d.ts.map +1 -0
  240. package/dist/voice/legacy-history.js +34 -0
  241. package/dist/voice/legacy-history.js.map +1 -0
  242. package/dist/voice/live-context.d.ts +14 -0
  243. package/dist/voice/live-context.d.ts.map +1 -0
  244. package/dist/voice/live-context.js +137 -0
  245. package/dist/voice/live-context.js.map +1 -0
  246. package/dist/voice/live.d.ts +37 -0
  247. package/dist/voice/live.d.ts.map +1 -0
  248. package/dist/voice/live.js +462 -0
  249. package/dist/voice/live.js.map +1 -0
  250. package/dist/voice/preparation.d.ts +8 -0
  251. package/dist/voice/preparation.d.ts.map +1 -0
  252. package/dist/voice/preparation.js +59 -0
  253. package/dist/voice/preparation.js.map +1 -0
  254. package/package.json +49 -16
  255. package/public/assets/index-BQFBaSKm.js +40 -0
  256. package/public/assets/index-CYCbTSh1.js +131 -0
  257. package/public/assets/index-DntUQtGK.css +1 -0
  258. package/public/assets/persona-BVIfx5k8.js +1 -0
  259. package/public/assets/persona-C_m1CVKe.css +1 -0
  260. package/public/assets/scene-CBV2oPhA.js +3854 -0
  261. package/public/index.html +6 -8
  262. package/public/persona/THREE-LICENSE.txt +21 -0
  263. package/public/persona/call-poster.webp +0 -0
  264. package/public/persona/chat-avatar.webp +0 -0
  265. package/public/persona/reference.jpg +0 -0
  266. package/public/persona/sample.wav +0 -0
  267. package/public/persona.html +7 -0
  268. package/runtime/pi/package-lock.json +1549 -0
  269. package/runtime/pi/package.json +12 -0
  270. package/tests/fixtures/voice-question.wav +0 -0
  271. package/tray/assets/error.ico +0 -0
  272. package/tray/assets/error.png +0 -0
  273. package/tray/assets/running.ico +0 -0
  274. package/tray/assets/running.png +0 -0
  275. package/tray/assets/starting.ico +0 -0
  276. package/tray/assets/starting.png +0 -0
  277. package/tray/assets/stopped.ico +0 -0
  278. package/tray/assets/stopped.png +0 -0
  279. package/tray/assets/stopping.ico +0 -0
  280. package/tray/assets/stopping.png +0 -0
  281. package/tray/macos.js +72 -0
  282. package/tray/windows.ps1 +104 -0
  283. package/voice/realtime/README.md +84 -0
  284. package/voice/realtime/backend.mjs +81 -0
  285. package/voice/realtime/native.mjs +210 -0
  286. package/voice/realtime/peer.d.mts +15 -0
  287. package/voice/realtime/peer.mjs +116 -0
  288. package/voice/realtime/probe-browser.mjs +81 -0
  289. package/voice/realtime/probe-server.mjs +86 -0
  290. package/voice/realtime/probe.html +11 -0
  291. package/voice/realtime/probe.mjs +42 -0
  292. package/voice/realtime/rpc.mjs +118 -0
  293. package/voice/realtime/setup.mjs +32 -0
  294. package/voice/tls.mjs +49 -0
  295. package/dist/db/queries.d.ts +0 -16
  296. package/dist/db/queries.d.ts.map +0 -1
  297. package/dist/db/queries.js +0 -91
  298. package/dist/db/queries.js.map +0 -1
  299. package/dist/docker/dockerfile.d.ts +0 -50
  300. package/dist/docker/dockerfile.d.ts.map +0 -1
  301. package/dist/docker/dockerfile.js +0 -160
  302. package/dist/docker/dockerfile.js.map +0 -1
  303. package/dist/docker/manager.d.ts +0 -42
  304. package/dist/docker/manager.d.ts.map +0 -1
  305. package/dist/docker/manager.js +0 -421
  306. package/dist/docker/manager.js.map +0 -1
  307. package/dist/git/status.d.ts +0 -76
  308. package/dist/git/status.d.ts.map +0 -1
  309. package/dist/git/status.js +0 -332
  310. package/dist/git/status.js.map +0 -1
  311. package/dist/routes/browse.d.ts.map +0 -1
  312. package/dist/routes/browse.js +0 -49
  313. package/dist/routes/browse.js.map +0 -1
  314. package/dist/routes/git.d.ts +0 -9
  315. package/dist/routes/git.d.ts.map +0 -1
  316. package/dist/routes/git.js +0 -338
  317. package/dist/routes/git.js.map +0 -1
  318. package/dist/routes/projects.d.ts.map +0 -1
  319. package/dist/routes/projects.js +0 -220
  320. package/dist/routes/projects.js.map +0 -1
  321. package/dist/routes/tasks.d.ts.map +0 -1
  322. package/dist/routes/tasks.js +0 -313
  323. package/dist/routes/tasks.js.map +0 -1
  324. package/draken.dockerfile.template +0 -18
  325. package/public/assets/index-3ngsG5kF.css +0 -1
  326. package/public/assets/index-B3YSD0ee.js +0 -252
@@ -0,0 +1,147 @@
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_files_1 = require("./model-files");
17
+ class LocalEmbedder {
18
+ directory;
19
+ threads;
20
+ fingerprint = model_files_1.MODEL_ID;
21
+ session;
22
+ tokenizer;
23
+ constructor(directory, threads = Math.max(1, Math.min(4, Math.floor((0, os_1.availableParallelism)() / 2)))) {
24
+ this.directory = directory;
25
+ this.threads = threads;
26
+ if (!Number.isSafeInteger(threads) || threads < 1 || threads > 4)
27
+ throw new Error('Invalid embedding thread budget');
28
+ }
29
+ ready() { return model_files_1.FILES.every(file => { try {
30
+ return fs_1.default.statSync(path_1.default.join(this.directory, file.name)).size === file.size;
31
+ }
32
+ catch {
33
+ return false;
34
+ } }); }
35
+ async verified(file) {
36
+ const hash = (0, crypto_1.createHash)('sha256');
37
+ try {
38
+ for await (const chunk of fs_1.default.createReadStream(path_1.default.join(this.directory, file.name)))
39
+ hash.update(chunk);
40
+ return hash.digest('hex') === file.sha;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ async setup(report, allowDownload = true) {
47
+ const total = model_files_1.FILES.reduce((sum, file) => sum + file.size, 0);
48
+ let completed = 0;
49
+ for (const file of model_files_1.FILES) {
50
+ if (await this.verified(file)) {
51
+ completed += file.size;
52
+ continue;
53
+ }
54
+ if (!allowDownload)
55
+ throw new Error('Pinned embedding files are missing or damaged. Prepare history before calling.');
56
+ const progress = (size) => report?.((0, types_1.historyUpdate)('downloading', { downloaded_bytes: completed + size, download_total_bytes: total }));
57
+ progress(0);
58
+ const target = path_1.default.join(this.directory, file.name), temporary = target + '.part';
59
+ fs_1.default.mkdirSync(path_1.default.dirname(target), { recursive: true, mode: 0o700 });
60
+ const controller = new AbortController(), timer = setTimeout(() => controller.abort(), 300000);
61
+ try {
62
+ const response = await fetch(`https://huggingface.co/${model_files_1.MODEL}/resolve/${model_files_1.REVISION}/${file.name}`, { signal: controller.signal });
63
+ if (!response.ok || !response.body)
64
+ throw new Error('Model download failed');
65
+ const handle = fs_1.default.openSync(temporary, 'w', 0o600), hash = (0, crypto_1.createHash)('sha256');
66
+ let size = 0;
67
+ try {
68
+ for await (const chunk of response.body) {
69
+ size += chunk.length;
70
+ if (size > file.size)
71
+ throw new Error('Model size mismatch');
72
+ hash.update(chunk);
73
+ fs_1.default.writeSync(handle, chunk);
74
+ progress(size);
75
+ }
76
+ }
77
+ finally {
78
+ fs_1.default.closeSync(handle);
79
+ }
80
+ if (size !== file.size || hash.digest('hex') !== file.sha)
81
+ throw new Error('Model checksum mismatch');
82
+ fs_1.default.renameSync(temporary, target);
83
+ completed += file.size;
84
+ }
85
+ finally {
86
+ clearTimeout(timer);
87
+ fs_1.default.rmSync(temporary, { force: true });
88
+ }
89
+ }
90
+ }
91
+ async load() {
92
+ if (this.session)
93
+ return;
94
+ for (const file of model_files_1.FILES)
95
+ if (!await this.verified(file))
96
+ throw new Error('Pinned embedding files are missing or damaged. Retry the history request to repair them.');
97
+ // WASM is deliberately used on the server: no CUDA installer or browser bundle.
98
+ // Each isolated embedding lane has one session and a bounded kernel budget.
99
+ // The pool caps their combined CPU use, leaving capacity for other work.
100
+ ort.env.wasm.numThreads = this.threads;
101
+ ort.env.wasm.proxy = false;
102
+ ort.env.logLevel = 'error';
103
+ 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')));
104
+ this.session = await ort.InferenceSession.create(fs_1.default.readFileSync(path_1.default.join(this.directory, model_files_1.FILES[0].name)), { executionProviders: ['wasm'], logSeverityLevel: 3 });
105
+ }
106
+ async embed(text, query) {
107
+ await this.load();
108
+ const encoded = this.tokenizer.encode(`${query ? 'query' : 'passage'}: ${text}`, { add_special_tokens: false });
109
+ // Pool ALL tokens in bounded windows, not just the prefix of long code or
110
+ // multilingual text. Passage chunks are independently indexed as well.
111
+ const pooled = new Float32Array(384);
112
+ let weight = 0;
113
+ for (let start = 0; start < encoded.ids.length; start += 480) {
114
+ const ids = [0, ...encoded.ids.slice(start, start + 480), 2];
115
+ const input = new ort.Tensor('int64', BigInt64Array.from(ids, BigInt), [1, ids.length]);
116
+ const mask = new ort.Tensor('int64', new BigInt64Array(ids.length).fill(1n), [1, ids.length]);
117
+ const segment = new ort.Tensor('int64', new BigInt64Array(ids.length), [1, ids.length]);
118
+ const result = await this.session.run({ input_ids: input, attention_mask: mask,
119
+ ...(this.session.inputNames.includes('token_type_ids') ? { token_type_ids: segment } : {}) });
120
+ const output = result.last_hidden_state;
121
+ if (!output || output.dims[2] !== 384 || !(output.data instanceof Float32Array))
122
+ throw new Error('Unexpected embedding output');
123
+ for (let token = 0; token < ids.length; token++)
124
+ for (let d = 0; d < 384; d++)
125
+ pooled[d] += output.data[token * 384 + d];
126
+ weight += ids.length;
127
+ for (const tensor of Object.values(result))
128
+ tensor.dispose();
129
+ input.dispose();
130
+ mask.dispose();
131
+ segment.dispose();
132
+ }
133
+ let norm = 0;
134
+ for (let d = 0; d < 384; d++) {
135
+ pooled[d] /= weight;
136
+ norm += pooled[d] ** 2;
137
+ }
138
+ norm = Math.sqrt(norm);
139
+ if (!Number.isFinite(norm) || norm === 0)
140
+ throw new Error('Invalid embedding');
141
+ for (let d = 0; d < 384; d++)
142
+ pooled[d] /= norm;
143
+ return pooled;
144
+ }
145
+ }
146
+ exports.LocalEmbedder = LocalEmbedder;
147
+ //# 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,16 @@
1
+ import Database from 'better-sqlite3';
2
+ import { type RootInput } from '../sources/registry';
3
+ export interface HistoryReadiness {
4
+ ready: boolean;
5
+ before: string | null;
6
+ }
7
+ /** A scheduling/readiness hint, not evidence. Original bytes are still verified
8
+ * when preparing and retrieving. Include frozen aliases here: unlike the
9
+ * strict64 counter, readiness must cover their search links too. */
10
+ export declare function historyStamp(source: Database.Database, before?: string, roots?: RootInput): string;
11
+ export declare function saveHistoryReadiness(db: Database.Database, source: Database.Database, before: string, stamp: string, model: string, roots?: RootInput): void;
12
+ export declare function indexReadiness(db: Database.Database, source: Database.Database, capturedOnly?: boolean): HistoryReadiness;
13
+ /** Read-only metadata. Never creates a cache, scans source logs, starts a worker,
14
+ * downloads weights or infers. Missing/older receipts need explicit preparation. */
15
+ export declare function storedHistoryReadiness(directory: string, source: Database.Database, capturedOnly?: boolean): HistoryReadiness;
16
+ //# sourceMappingURL=readiness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/memory/readiness.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIlE,MAAM,WAAW,gBAAgB;IAAG,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAG3E;;oEAEoE;AACpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CA6BlG;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAY5J;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,UAAQ,GAAG,gBAAgB,CAgBvH;AAED;oFACoF;AACpF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,UAAQ,GAAG,gBAAgB,CAa3H"}
@@ -0,0 +1,131 @@
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.historyStamp = historyStamp;
7
+ exports.saveHistoryReadiness = saveHistoryReadiness;
8
+ exports.indexReadiness = indexReadiness;
9
+ exports.storedHistoryReadiness = storedHistoryReadiness;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const crypto_1 = require("crypto");
13
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
14
+ const stamps_1 = require("./stamps");
15
+ const registry_1 = require("../sources/registry");
16
+ const model_files_1 = require("./model-files");
17
+ const KEY = 'call-history-ready-v1';
18
+ const cached = new WeakMap();
19
+ /** A scheduling/readiness hint, not evidence. Original bytes are still verified
20
+ * when preparing and retrieving. Include frozen aliases here: unlike the
21
+ * strict64 counter, readiness must cover their search links too. */
22
+ function historyStamp(source, before, roots) {
23
+ if (source.prepare("SELECT value FROM sync_settings WHERE key='source-scan-complete-v1'").get()?.value === '0')
24
+ throw new Error('History import has not completed. Scan sessions before calling.');
25
+ const now = Date.now(), cutoff = before || new Date(now).toISOString();
26
+ const files = (0, crypto_1.createHash)('sha256').update(JSON.stringify((0, registry_1.sourceRoots)(roots)));
27
+ for (const row of source.prepare('SELECT s.path,s.file_identity,s.byte_offset,s.scanned_bytes,s.modified_at FROM agent_sessions s JOIN agent_sources a ON a.id=s.agent WHERE s.included=1 AND s.missing=0 AND a.enabled=1 AND EXISTS (SELECT 1 FROM agent_entries e WHERE e.session_id=s.id AND e.is_activity=1) ORDER BY s.id').iterate()) {
28
+ const stat = fs_1.default.lstatSync(row.path);
29
+ if (!stat.isFile() || `${stat.dev}:${stat.ino}` !== row.file_identity || stat.size < row.scanned_bytes)
30
+ throw new Error('Original session file is unavailable.');
31
+ if (stat.size === row.scanned_bytes && stat.mtime.toISOString() !== row.modified_at)
32
+ throw new Error('Original session file is unavailable or changed. Prepare history again.');
33
+ if (!row.scanned_bytes || row.scanned_bytes < row.byte_offset)
34
+ throw new Error('Finish importing history before calling.');
35
+ // Later appends belong to a later preparation. Never make an active agent's
36
+ // growing log invalidate an already captured and verified prefix forever.
37
+ files.update(JSON.stringify([row.path, row.file_identity, row.byte_offset, row.scanned_bytes]));
38
+ }
39
+ const fileStamp = files.digest('hex');
40
+ const revision = `${source.pragma('data_version', { simple: true })}:${source.prepare('SELECT total_changes() AS n').get().n}:${fileStamp}`;
41
+ const prior = cached.get(source);
42
+ if (prior?.revision === revision && prior.before === before && now < prior.until)
43
+ return prior.stamp;
44
+ const hash = (0, crypto_1.createHash)('sha256').update(fileStamp).update(JSON.stringify([...(0, stamps_1.sourceStamps)(source, cutoff)]));
45
+ for (const row of source.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.rowid").iterate())
46
+ hash.update(JSON.stringify(row));
47
+ for (const row of source.prepare("SELECT id,context_json FROM syncs WHERE status!='discarded' ORDER BY id").iterate())
48
+ hash.update(JSON.stringify(row));
49
+ const stamp = hash.digest('hex');
50
+ if (!before) {
51
+ const next = source.prepare(`SELECT MIN(at) AS at FROM (
52
+ SELECT timestamp AS at FROM agent_entries WHERE timestamp>?
53
+ UNION ALL SELECT created_at FROM sync_messages WHERE created_at>?
54
+ UNION ALL SELECT completed_at FROM syncs WHERE completed_at>?)`).get(cutoff, cutoff, cutoff);
55
+ cached.set(source, { revision, until: next.at ? Date.parse(next.at) : Infinity, stamp });
56
+ }
57
+ else
58
+ cached.set(source, { revision, until: Infinity, stamp, before });
59
+ return stamp;
60
+ }
61
+ function saveHistoryReadiness(db, source, before, stamp, model, roots) {
62
+ if (historyStamp(source, before, roots) !== stamp)
63
+ throw new Error('History changed during preparation. Prepare the remaining changes before calling.');
64
+ const prior = db.prepare('SELECT value FROM meta WHERE key=?').get(KEY);
65
+ // Unchanged preparation must not rewrite derived state merely to move a clock.
66
+ if (prior && prior.value.length <= 1024) {
67
+ try {
68
+ const value = JSON.parse(prior.value);
69
+ if (value.stamp === stamp && value.model === model && typeof value.before === 'string'
70
+ && new Date(value.before).toISOString() === value.before && value.before <= before)
71
+ return;
72
+ }
73
+ catch { /* Explicit preparation can replace an invalid receipt, not source evidence. */ }
74
+ }
75
+ db.prepare('INSERT INTO meta(key,value) VALUES(?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.value').run(KEY, JSON.stringify({ before, stamp, model }));
76
+ }
77
+ function indexReadiness(db, source, capturedOnly = false) {
78
+ const absent = { ready: false, before: null };
79
+ try {
80
+ if (db.prepare("SELECT value FROM meta WHERE key='schema'").get()?.value !== 'history-index-v3-contentless')
81
+ return absent;
82
+ const row = db.prepare('SELECT value FROM meta WHERE key=?').get(KEY);
83
+ if (!row || row.value.length > 1024)
84
+ return absent;
85
+ const marker = JSON.parse(row.value);
86
+ if (typeof marker.before !== 'string' || !Number.isFinite(Date.parse(marker.before)) || new Date(marker.before).toISOString() !== marker.before || marker.before > new Date().toISOString()
87
+ || typeof marker.stamp !== 'string' || !/^[a-f0-9]{64}$/.test(marker.stamp)
88
+ || marker.model !== db.prepare("SELECT value FROM meta WHERE key='model'").get()?.value)
89
+ return absent;
90
+ if (db.prepare('SELECT 1 FROM passages p JOIN chunk_links c ON c.passage_id=p.id JOIN records r ON r.ref=c.ref WHERE p.embedded=0 AND r.at<=? LIMIT 1').get(marker.before))
91
+ return absent;
92
+ // A text conversation may keep using its prepared cutoff while saving new
93
+ // messages. Those newer messages are supplied directly, not falsely claimed
94
+ // as indexed. Original-file/cursor/admission changes still invalidate it.
95
+ return marker.stamp === historyStamp(source, capturedOnly ? marker.before : undefined) ? { ready: true, before: marker.before } : absent;
96
+ }
97
+ catch {
98
+ return absent;
99
+ }
100
+ }
101
+ /** Read-only metadata. Never creates a cache, scans source logs, starts a worker,
102
+ * downloads weights or infers. Missing/older receipts need explicit preparation. */
103
+ function storedHistoryReadiness(directory, source, capturedOnly = false) {
104
+ const file = path_1.default.join(directory, 'memory', 'index.sqlite');
105
+ if (!fs_1.default.existsSync(file))
106
+ return { ready: false, before: null };
107
+ let db;
108
+ try {
109
+ db = new better_sqlite3_1.default(file, { readonly: true, fileMustExist: true });
110
+ db.pragma('query_only = ON');
111
+ db.pragma('busy_timeout = 1000');
112
+ if (db.prepare("SELECT value FROM meta WHERE key='model'").get()?.value !== model_files_1.MODEL_ID)
113
+ return { ready: false, before: null };
114
+ if (db.prepare('SELECT 1 FROM passages WHERE embedded=1 LIMIT 1').get()
115
+ && !model_files_1.FILES.every(file => { try {
116
+ return fs_1.default.statSync(path_1.default.join(directory, 'memory', 'model', file.name)).size === file.size;
117
+ }
118
+ catch {
119
+ return false;
120
+ } }))
121
+ return { ready: false, before: null };
122
+ return indexReadiness(db, source, capturedOnly);
123
+ }
124
+ catch {
125
+ return { ready: false, before: null };
126
+ }
127
+ finally {
128
+ db?.close();
129
+ }
130
+ }
131
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/memory/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { HistoryQuery, HistoryResults } from './types';
2
+ import type { SourceRecord } from './sources';
3
+ export declare const statusQuestion: (text: string) => boolean;
4
+ type Hit = HistoryResults['results'][number];
5
+ /** Candidate follow-ups, NOT an automatic truth/status classifier. Walk verified
6
+ * original narratives after each retrieved blocker in the SAME source session.
7
+ * Never use generated Draken replies, aliases, or another project's test result
8
+ * to declare a feature done. Source sequence wins over skewed timestamps. */
9
+ export declare function reconcileHistory(records: SourceRecord[], hits: Hit[], query: HistoryQuery): Pick<HistoryResults, 'results' | 'reconciliation'>;
10
+ export {};
11
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/memory/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,YAAkM,CAAC;AAgB9O,KAAK,GAAG,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAa7C;;;6EAG6E;AAC7E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,gBAAgB,CAAC,CA6E9I"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.statusQuestion = void 0;
4
+ exports.reconcileHistory = reconcileHistory;
5
+ const statusQuestion = (text) => /\b(?:status|current|latest|blocked|blockers?|unfinished|unconfirmed|remaining|finished|completed?|still|how (?:long|much longer)|where (?:are we|we are)|what(?:'s| is) left)\b/i.test(text);
6
+ exports.statusQuestion = statusQuestion;
7
+ const pending = /\b(?:not (?:yet |fully )?(?:implemented|connected|wired|complete\w*|finished|enabled|available|established|activated)|unfinished|unconfirmed|pending|remain\w*|block\w*|disabled|incomplete|next|need\w*|todo|unverified)\b/i;
8
+ const stop = new Set(('the and for from with without this that these those have has had are was were will would could should into still ' +
9
+ 'not yet now then next only before after while more most some same other all any new old our your its but also which what where when how ' +
10
+ 'app native project work working implementation implemented implement implementing complete completed completion finished unfinished ' +
11
+ 'remaining remains remain pending blocked blockers needs need needed verified verification unverified passed passing tests test tested testing ' +
12
+ 'check checks checked build builds release debug simulator strict concurrency source sources report reported reports checkpoint updated ' +
13
+ 'continue continued continuing details documented documentation unchanged preserved evidence changes change requested existing later current ' +
14
+ 'ready readiness feature features fully end local locally real live enabled disabled intended result results planned plan full ' +
15
+ 'nothing deployed uncommitted mobile ios docs rewrite progress updated update there their several just functionality functional area').split(' '));
16
+ const narrative = (text) => text.split('\nTool requested:')[0];
17
+ function terms(text) {
18
+ return new Set((text.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().match(/[\p{L}\p{N}]+/gu) || [])
19
+ .filter(word => word.length >= 3 && !stop.has(word) && !/^\d+$/.test(word))
20
+ .map(word => /^(?:push|apns|notifications?)$/.test(word) ? 'notification' : word.length > 3 && word.endsWith('s') ? word.slice(0, -1) : word));
21
+ }
22
+ function blocks(text) {
23
+ let change = false;
24
+ return narrative(text).split(/\n\s*\n/).map(block => {
25
+ const lead = block.split('\n')[0].replace(/^[#*\s-]+/, '');
26
+ if (/^(?:verification|tests?|details|documentation|live delivery|overall)/i.test(lead)
27
+ || (pending.test(lead) && !/^(?:implemented|completed|added|fixed|integrated|wired)\b/i.test(lead)))
28
+ change = false;
29
+ else if (/\b(?:implemented|completed|added|fixed|integrated|wired|reopened|reverted|rolled back)\b/i.test(lead))
30
+ change = true;
31
+ else if (/^\s*#/.test(block))
32
+ change = false;
33
+ return { words: terms(block), change };
34
+ });
35
+ }
36
+ /** Candidate follow-ups, NOT an automatic truth/status classifier. Walk verified
37
+ * original narratives after each retrieved blocker in the SAME source session.
38
+ * Never use generated Draken replies, aliases, or another project's test result
39
+ * to declare a feature done. Source sequence wins over skewed timestamps. */
40
+ function reconcileHistory(records, hits, query) {
41
+ if (!query.reconcile || query.kind !== 'sources' || !(query.recent || (0, exports.statusQuestion)(query.question)))
42
+ return { results: hits };
43
+ const all = records.filter(record => record.kind === 'session' && record.session_id && record.role === 'assistant'
44
+ && (!query.before || Boolean(record.at && record.at <= query.before))
45
+ && (!query.session_id || record.session_id === query.session_id)
46
+ && (!query.session_ids || query.session_ids.includes(record.session_id))
47
+ && narrative(record.text).trim().length >= 40 && !/^Tool requested:/.test(record.text));
48
+ const selected = all.sort((a, b) => b.position - a.position).slice(0, 4096);
49
+ const corpus = selected.map(record => ({ record, words: terms(narrative(record.text)), blocks: blocks(record.text) }));
50
+ const frequency = new Map();
51
+ for (const item of corpus)
52
+ for (const word of item.words)
53
+ frequency.set(word, (frequency.get(word) || 0) + 1);
54
+ const weight = (word) => 1 + Math.log(1 + corpus.length / (frequency.get(word) || 1));
55
+ const byRef = new Map(records.map(record => [record.ref, record]));
56
+ const follow = (ref) => {
57
+ const seed = byRef.get(ref);
58
+ if (!seed || seed.role !== 'assistant' || seed.kind !== 'session')
59
+ return [];
60
+ const clauses = narrative(seed.text).split(/\n|(?<=[.!?])\s+/u).filter(line => pending.test(line));
61
+ const facets = clauses.flatMap(line => line.split(/[,;:]\s*/)).map(terms).filter(words => words.size >= 2);
62
+ const anchor = new Set(facets.flatMap(words => [...words]));
63
+ if (anchor.size < 2)
64
+ return [];
65
+ const candidates = corpus.filter(item => item.record.session_id === seed.session_id && item.record.position > seed.position
66
+ && item.record.identity !== seed.identity).map(item => ({ ...item, shared: [...anchor].filter(word => item.words.has(word)) }))
67
+ .filter(item => item.shared.length >= Math.min(3, anchor.size) && facets.some(facet => item.blocks.some(block => [...facet].filter(word => block.words.has(word)).length >= Math.min(3, facet.size))));
68
+ if (!candidates.length)
69
+ return [];
70
+ const winners = new Map();
71
+ // Search each comma/line-delimited sub-task separately. A client report
72
+ // repeating 'backend jobs remain' must not crowd out the later job report.
73
+ // Prefer locally matching change sections, not broad whole-document overlap.
74
+ // This is ranking only: plans/negations still reach the model as quoted data.
75
+ for (const facet of facets) {
76
+ const ranked = candidates.map(item => ({ item, score: Math.max(...item.blocks.map(block => {
77
+ const shared = [...facet].filter(word => block.words.has(word));
78
+ return shared.length < Math.min(2, facet.size) ? 0 : shared.reduce((sum, word) => sum + weight(word), 0)
79
+ / facet.size * (block.change ? 2 : 0.6);
80
+ })) })).filter(item => item.score > 0).sort((a, b) => b.score - a.score || b.item.record.position - a.item.record.position);
81
+ if (ranked[0])
82
+ winners.set(ranked[0].item, (winners.get(ranked[0].item) || 0) + ranked[0].score);
83
+ }
84
+ const chosen = [...winners].sort((a, b) => b[1] - a[1]).slice(0, 2).map(([item]) => item);
85
+ const latest = candidates.reduce((a, b) => a.record.position > b.record.position ? a : b);
86
+ if (!chosen.includes(latest))
87
+ chosen.push(latest);
88
+ return [{ seed, chosen: chosen.sort((a, b) => a.record.position - b.record.position),
89
+ score: [...winners.values()].reduce((sum, value) => sum + value, 0) / Math.sqrt(facets.length), candidates: candidates.length }];
90
+ };
91
+ const rank = (groups) => groups.sort((a, b) => b.score - a.score || b.seed.position - a.seed.position);
92
+ const initial = rank(hits.flatMap(hit => follow(hit.ref))), groups = initial.slice(0, 4);
93
+ let omitted = initial.length - groups.length, frontier = groups.slice();
94
+ const visited = new Set(groups.map(group => group.seed.ref));
95
+ // A follow-up may itself have become stale (client done, jobs still pending,
96
+ // then jobs implemented). Check two further bounded generations, not just the
97
+ // initially ranked excerpts. No extra model inference or corpus writes.
98
+ for (let depth = 0; depth < 2; depth++) {
99
+ const refs = [...new Set(frontier.flatMap(group => group.chosen.map(item => item.record.ref)))].filter(ref => !visited.has(ref));
100
+ refs.forEach(ref => visited.add(ref));
101
+ const next = rank(refs.flatMap(follow));
102
+ frontier = next.slice(0, 4);
103
+ omitted += next.length - frontier.length;
104
+ groups.push(...frontier);
105
+ }
106
+ const threads = groups.map(group => ({ earlier_ref: group.seed.ref,
107
+ later_refs: group.chosen.map(item => item.record.ref), matched_terms: [...new Set(group.chosen.flatMap(item => item.shared))].slice(0, 24),
108
+ other_candidates: group.candidates - group.chosen.length }));
109
+ const result = [];
110
+ const add = (record) => {
111
+ if (result.some(item => item.ref === record.ref))
112
+ return;
113
+ result.push({ ...record, text: narrative(record.text), offset: 0, score: 1, sequence: record.position });
114
+ };
115
+ // Later reports precede their earlier anchor for packing priority. If space
116
+ // runs out, discard the old anchor, never preserve it without its follow-ups.
117
+ // All roots' direct follow-ups come before deeper dependencies and anchors;
118
+ // one broad roadmap must not consume the packet ahead of another feature.
119
+ for (const group of groups)
120
+ group.chosen.forEach(item => add(item.record));
121
+ for (const group of groups)
122
+ add(group.seed);
123
+ for (const hit of hits)
124
+ if (!result.some(item => item.ref === hit.ref))
125
+ result.push(hit);
126
+ return { results: result, reconciliation: {
127
+ checked_narratives: corpus.length, omitted_narratives: all.length - corpus.length,
128
+ omitted_threads: omitted, threads,
129
+ qualification: 'Bounded lexical follow-up candidates within the same original session (4096 narratives, four starting threads, two further generations). Not exhaustive or verified supersession. Reconcile each sub-task: implemented, tested, enabled/deployed and device/provider acceptance are different. A later partial success does not close the whole feature; a delivery gate does not erase implemented client work. No match is not proof that no later update exists.',
130
+ } };
131
+ }
132
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/memory/reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
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 historyReadiness: (capturedOnly?: boolean) => import("./readiness").HistoryReadiness;
6
+ export declare function prepareHistory(before: string, signal: AbortSignal, background?: boolean): Promise<void>;
7
+ export declare const searchPreparedHistory: (query: HistoryQuery, signal?: AbortSignal) => Promise<HistoryResults>;
8
+ export declare const searchHistory: (query: HistoryQuery, signal?: AbortSignal) => Promise<HistoryResults>;
9
+ export declare function readHistory(ref: string, offset?: number, signal?: AbortSignal, preparedBefore?: string): Promise<HistoryPage>;
10
+ //# 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;AA4C5I,wBAAgB,eAAe,IAAI,eAAe,CAGjD;AAyDD,wBAAgB,WAAW,SAK1B;AACD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAcjE;AACD,eAAO,MAAM,gBAAgB,GAAI,sBAAoB,2CAAgE,CAAC;AACtH,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,UAAQ,iBAO3F;AACD,eAAO,MAAM,qBAAqB,GAAI,OAAO,YAAY,EAAE,SAAS,WAAW,4BAA+F,CAAC;AAC/K,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,EAAE,cAAc,CAAC,EAAE,MAAM,wBAIjG"}