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,243 @@
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.searchPreparedHistory = exports.historyReadiness = void 0;
7
+ exports.historyProgress = historyProgress;
8
+ exports.stopHistory = stopHistory;
9
+ exports.validateHistoryQuery = validateHistoryQuery;
10
+ exports.prepareHistory = prepareHistory;
11
+ exports.readHistory = readHistory;
12
+ const path_1 = __importDefault(require("path"));
13
+ const child_process_1 = require("child_process");
14
+ const schema_1 = require("../db/schema");
15
+ const registry_1 = require("../sources/registry");
16
+ const store_1 = require("../sync/store");
17
+ const types_1 = require("./types");
18
+ const readiness_1 = require("./readiness");
19
+ const collector_1 = require("../sync/collector");
20
+ let child, directory = '', sessionRoot = '', sequence = 0, active;
21
+ let idle;
22
+ const retiring = new Set(), queue = [];
23
+ 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.');
24
+ const cancelled = () => new store_1.HttpError(409, 'History lookup stopped. Completed work is retained for the next request.');
25
+ function settle(work, error, value) {
26
+ clearTimeout(work.timer);
27
+ clearTimeout(work.deadline);
28
+ work.signal?.removeEventListener('abort', work.abort);
29
+ if (active === work)
30
+ active = undefined;
31
+ if (error)
32
+ work.reject(error);
33
+ else
34
+ work.resolve(value);
35
+ }
36
+ function retire() {
37
+ const prior = child;
38
+ child = undefined;
39
+ if (prior) {
40
+ retiring.add(prior);
41
+ prior.kill('SIGTERM');
42
+ const timer = setTimeout(() => { if (prior.exitCode === null && prior.signalCode === null)
43
+ prior.kill('SIGKILL'); }, 1500);
44
+ timer.unref();
45
+ }
46
+ }
47
+ function watch(work) {
48
+ clearTimeout(work.timer);
49
+ work.timer = setTimeout(() => { if (active === work) {
50
+ settle(work, failure());
51
+ retire();
52
+ } }, work.method.startsWith('read') ? 30000 : 10 * 60000);
53
+ }
54
+ function progressValue(value) {
55
+ if (!value || !['scanning', 'downloading', 'loading', 'indexing', 'searching', 'reading'].includes(value.stage))
56
+ return;
57
+ for (const name of ['completed', 'total', 'reused', 'downloaded_bytes', 'download_total_bytes'])
58
+ if (!Number.isSafeInteger(value[name]) || value[name] < 0)
59
+ return;
60
+ if (value.completed > value.total || !Number.isSafeInteger(value.total + value.reused) || value.downloaded_bytes > value.download_total_bytes)
61
+ return;
62
+ if (value.remaining_seconds !== null && (!Number.isSafeInteger(value.remaining_seconds) || value.remaining_seconds < 0))
63
+ return;
64
+ const p = value.parallelism;
65
+ 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))
66
+ return;
67
+ return (0, types_1.historyUpdate)(value.stage, { completed: value.completed, total: value.total, reused: value.reused,
68
+ ...(p ? { parallelism: { workers: p.workers, threads: p.threads } } : {}),
69
+ remaining_seconds: value.remaining_seconds, downloaded_bytes: value.downloaded_bytes, download_total_bytes: value.download_total_bytes });
70
+ }
71
+ function historyProgress() {
72
+ return { active: Boolean(active), background: active?.background || false, queued: queue.length, elapsed_ms: active?.started ? Date.now() - active.started : 0,
73
+ updated_at: active?.updated || null, work: active?.progress || null };
74
+ }
75
+ function start() {
76
+ if (child)
77
+ return;
78
+ const processChild = (0, child_process_1.fork)(path_1.default.join(__dirname, 'worker.js'), [directory, sessionRoot], { execArgv: [],
79
+ env: { PATH: process.env.PATH, LANG: process.env.LANG, SYSTEMROOT: process.env.SYSTEMROOT },
80
+ stdio: ['ignore', 'ignore', 'ignore', 'ipc'] });
81
+ child = processChild;
82
+ processChild.on('message', (message) => {
83
+ if (child !== processChild || !message || !active || message.id !== active.id)
84
+ return;
85
+ if (message.progress !== undefined) {
86
+ const value = progressValue(message.progress);
87
+ if (value) {
88
+ active.progress = value;
89
+ active.updated = Date.now();
90
+ watch(active);
91
+ }
92
+ return;
93
+ }
94
+ settle(active, message.error ? failure() : undefined, message.value);
95
+ pump();
96
+ });
97
+ const exited = () => {
98
+ retiring.delete(processChild);
99
+ if (child === processChild) {
100
+ child = undefined;
101
+ if (active)
102
+ settle(active, failure());
103
+ }
104
+ pump();
105
+ };
106
+ processChild.once('error', exited);
107
+ processChild.once('exit', exited);
108
+ }
109
+ function pump() {
110
+ if (active || retiring.size)
111
+ return;
112
+ clearTimeout(idle);
113
+ if (!queue.length) {
114
+ if (child) {
115
+ idle = setTimeout(stopHistory, 5 * 60000);
116
+ idle.unref();
117
+ }
118
+ return;
119
+ }
120
+ const work = queue.shift();
121
+ if (work.signal?.aborted) {
122
+ settle(work, cancelled());
123
+ pump();
124
+ return;
125
+ }
126
+ active = work;
127
+ try {
128
+ start();
129
+ work.started = work.updated = Date.now();
130
+ work.progress = (0, types_1.historyUpdate)(work.method.startsWith('read') ? 'reading' : 'scanning');
131
+ watch(work);
132
+ // A healthy first index can exceed an interactive-query timeout. Progress
133
+ // renews its stall deadline, but total work remains bounded to two hours.
134
+ work.deadline = setTimeout(() => { if (active === work) {
135
+ settle(work, failure());
136
+ retire();
137
+ } }, 2 * 60 * 60000);
138
+ child.send({ id: work.id, method: work.method, ...work.args }, error => { if (error && active === work) {
139
+ settle(work, failure());
140
+ retire();
141
+ } });
142
+ }
143
+ catch {
144
+ settle(work, failure());
145
+ retire();
146
+ if (!retiring.size)
147
+ pump();
148
+ }
149
+ }
150
+ function request(method, args = {}, signal, background = false) {
151
+ if (signal?.aborted)
152
+ return Promise.reject(cancelled());
153
+ const roots = JSON.stringify((0, registry_1.getSourceRoots)());
154
+ if (directory !== (0, schema_1.getDataDir)() || sessionRoot !== roots) {
155
+ stopHistory();
156
+ directory = (0, schema_1.getDataDir)();
157
+ sessionRoot = roots;
158
+ }
159
+ if (background && (active || queue.length || retiring.size))
160
+ return Promise.reject(cancelled());
161
+ if (!background && active?.background) {
162
+ settle(active, cancelled());
163
+ retire();
164
+ }
165
+ if (queue.length >= 8)
166
+ return Promise.reject(new store_1.HttpError(429, 'Too many history requests. Try again shortly.'));
167
+ (0, schema_1.getDb)(); // Only the app initializes its DB. The worker opens it read-only.
168
+ return new Promise((resolve, reject) => {
169
+ const work = { id: ++sequence, method, args, signal, background, resolve: value => resolve(value), reject, abort: () => {
170
+ if (active === work) {
171
+ settle(work, cancelled());
172
+ retire();
173
+ }
174
+ else {
175
+ const at = queue.indexOf(work);
176
+ if (at >= 0) {
177
+ queue.splice(at, 1);
178
+ settle(work, cancelled());
179
+ }
180
+ }
181
+ } };
182
+ signal?.addEventListener('abort', work.abort, { once: true });
183
+ queue.push(work);
184
+ pump();
185
+ });
186
+ }
187
+ function stopHistory() {
188
+ clearTimeout(idle);
189
+ if (active)
190
+ settle(active, cancelled());
191
+ for (const work of queue.splice(0))
192
+ settle(work, cancelled());
193
+ retire();
194
+ }
195
+ function validateHistoryQuery(value) {
196
+ if (!value || typeof value !== 'object' || Array.isArray(value))
197
+ throw new store_1.HttpError(400, 'A history query is required');
198
+ const query = value;
199
+ if (Object.keys(query).some(key => !['question', 'session_id', 'session_ids', 'kind', 'recent', 'reconcile', 'topics', 'sync_id', 'before'].includes(key)))
200
+ throw new store_1.HttpError(400, 'Unknown history query option');
201
+ if (typeof query.question !== 'string' || !query.question.trim() || query.question.length > 2000)
202
+ throw new store_1.HttpError(400, 'History question must be 1 to 2000 characters');
203
+ if (query.session_id !== undefined && (typeof query.session_id !== 'string' || !/^(?:(?:codex|claude):)?[\w-]{1,128}(?::[\w-]{1,128})?$/.test(query.session_id)))
204
+ throw new store_1.HttpError(400, 'Invalid session filter');
205
+ if (query.session_ids !== undefined && (!Array.isArray(query.session_ids) || !query.session_ids.length || query.session_ids.length > 8 || query.session_ids.some(id => typeof id !== 'string' || !/^(?:(?:codex|claude):)?[\w-]{1,128}(?::[\w-]{1,128})?$/.test(id))))
206
+ throw new store_1.HttpError(400, 'Invalid session filters');
207
+ if (query.kind !== undefined && query.kind !== 'sources' && query.kind !== 'conversation')
208
+ throw new store_1.HttpError(400, 'Invalid history kind');
209
+ if (query.topics !== undefined && (!Array.isArray(query.topics) || query.topics.length > 2 || query.topics.some(topic => typeof topic !== 'string' || !topic.trim() || topic.length > 200)))
210
+ throw new store_1.HttpError(400, 'Invalid history topics');
211
+ if (query.reconcile !== undefined && typeof query.reconcile !== 'boolean')
212
+ throw new store_1.HttpError(400, 'Invalid reconciliation option');
213
+ if (query.recent !== undefined && typeof query.recent !== 'boolean')
214
+ throw new store_1.HttpError(400, 'Invalid history ordering');
215
+ if (query.sync_id !== undefined && (!Number.isSafeInteger(query.sync_id) || query.sync_id < 1))
216
+ throw new store_1.HttpError(400, 'Invalid sync filter');
217
+ 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))
218
+ throw new store_1.HttpError(400, 'Invalid history cutoff');
219
+ return { ...query, question: query.question.trim() };
220
+ }
221
+ const historyReadiness = (capturedOnly = false) => (0, readiness_1.storedHistoryReadiness)((0, schema_1.getDataDir)(), (0, schema_1.getDb)(), capturedOnly);
222
+ exports.historyReadiness = historyReadiness;
223
+ async function prepareHistory(before, signal, background = false) {
224
+ if (!background) {
225
+ const scan = await (0, collector_1.scanSessions)(signal);
226
+ if (scan.warnings.length)
227
+ throw new store_1.HttpError(409, 'History import is incomplete. Check session sources before calling.');
228
+ }
229
+ signal.throwIfAborted();
230
+ return request('prepare', { before }, signal, background);
231
+ }
232
+ const searchPreparedHistory = (query, signal) => request('search-prepared', { query: validateHistoryQuery(query) }, signal);
233
+ exports.searchPreparedHistory = searchPreparedHistory;
234
+ const searchHistory = (query, signal) => request('search', { query: validateHistoryQuery(query) }, signal);
235
+ exports.searchHistory = searchHistory;
236
+ function readHistory(ref, offset = 0, signal, preparedBefore) {
237
+ if (!/^H[a-f0-9]{24}$/.test(ref) || !Number.isSafeInteger(offset) || offset < 0 || offset > 1000000)
238
+ throw new store_1.HttpError(400, 'Invalid historical source or offset');
239
+ if (preparedBefore !== undefined)
240
+ validateHistoryQuery({ question: 'source', before: preparedBefore });
241
+ return request(preparedBefore ? 'read-prepared' : 'read', { ref, offset, before: preparedBefore }, signal);
242
+ }
243
+ //# 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 { HistoryQuery, 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, scope?: Partial<HistoryQuery>): 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,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE3D,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,EAAE,KAAK,GAAE,OAAO,CAAC,YAAY,CAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CA0DjL"}
@@ -0,0 +1,94 @@
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, scope = {}) {
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) => scope.kind !== 'conversation'
19
+ && (!scope.session_id || session === scope.session_id) && (!scope.session_ids || scope.session_ids.includes(session))
20
+ && (!scope.before || Boolean(at && at <= scope.before))
21
+ && sessions.get(session)?.enabled === 1 && sessions.get(session)?.included === 1 && !sessions.get(session)?.missing && at >= baseline;
22
+ const record = (key, data, identity) => {
23
+ 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) };
24
+ return { ...clean, identity: identity || (0, exports.digest)(key + '\0' + clean.text), ref: `H${(0, exports.digest)(JSON.stringify([key, clean])).slice(0, 24)}` };
25
+ };
26
+ const evidence = (item, syncId) => {
27
+ if (!allowed(item.session_id, item.timestamp) || !item.text.trim())
28
+ return;
29
+ const key = (0, exports.digest)(item.event_key + '\0' + (0, normalize_1.cleanText)(item.text, Number.MAX_SAFE_INTEGER));
30
+ return record(`snapshot:${syncId}:${item.ref}`, { kind: 'snapshot', session_id: item.session_id, sync_id: syncId, origin_ref: item.ref,
31
+ 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,
32
+ qualification: 'Frozen session excerpt. Assistant claims are not independently verified; tool output proves only what is shown.',
33
+ group: `session:${item.session_id}`, position: item.sequence || 0 }, key);
34
+ };
35
+ const frozen = new evidence_1.EvidenceReader(db, root, cache);
36
+ try {
37
+ 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()) {
38
+ if (scope.sync_id && scope.sync_id !== row.sync_id)
39
+ continue;
40
+ const metadata = JSON.parse(row.evidence_json);
41
+ if (!allowed(metadata.session_id, metadata.timestamp))
42
+ continue;
43
+ const result = evidence(frozen.read(metadata), row.sync_id);
44
+ if (result)
45
+ yield result;
46
+ }
47
+ 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()) {
48
+ if (scope.sync_id && scope.sync_id !== row.id)
49
+ continue;
50
+ for (const item of JSON.parse(row.context_json)) {
51
+ if (!allowed(item.session_id, item.timestamp))
52
+ continue;
53
+ const result = evidence(frozen.read(item), row.id);
54
+ if (result)
55
+ yield result;
56
+ }
57
+ for (const kind of ['decisions', 'carry_forward'])
58
+ if (scope.kind !== 'sources' && !scope.session_id && !scope.session_ids && (!scope.before || (row.completed_at && row.completed_at <= scope.before)) && row[kind].trim())
59
+ yield record(`${kind}:${row.id}`, {
60
+ kind, sync_id: row.id, session_id: null, origin_ref: null, title: `Sync #${row.id} saved ${kind === 'decisions' ? 'decisions' : 'carry-forward'}`,
61
+ workspace: '', role: 'saved_note', at: row.status === 'completed' ? row.completed_at : null, text: row[kind],
62
+ 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.',
63
+ group: `notes:${row.id}`, position: kind === 'decisions' ? 0 : 1
64
+ });
65
+ }
66
+ }
67
+ finally {
68
+ frozen.close();
69
+ }
70
+ const reader = new source_files_1.EntryReader(db, root, cache);
71
+ try {
72
+ 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
73
+ FROM agent_entries e JOIN agent_sessions s ON s.id=e.session_id
74
+ WHERE e.active=1 AND e.present=1 AND e.is_activity=1 AND e.effective_length>0 ORDER BY e.id`).iterate()) {
75
+ if (scope.sync_id || !allowed(row.session_id, row.timestamp))
76
+ continue;
77
+ const text = reader.effective(row.id);
78
+ const key = (0, exports.digest)(row.event_key + '\0' + (0, normalize_1.cleanText)(text, Number.MAX_SAFE_INTEGER));
79
+ 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,
80
+ workspace: row.cwd, role: row.role, at: row.timestamp, text,
81
+ qualification: 'Indexed active session excerpt, not a reviewed snapshot. Assistant claims are not independently verified.', group: `session:${row.session_id}`, position: row.id }, key);
82
+ }
83
+ }
84
+ finally {
85
+ reader.close();
86
+ }
87
+ 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()) {
88
+ if (scope.kind === 'sources' || scope.session_id || scope.session_ids || (scope.sync_id && scope.sync_id !== row.sync_id) || (scope.before && row.created_at > scope.before) || !row.content.trim())
89
+ continue;
90
+ 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,
91
+ 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 });
92
+ }
93
+ }
94
+ //# 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"}
@@ -0,0 +1,101 @@
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.sourceStamps = sourceStamps;
7
+ exports.saveSourceCheckpoint = saveSourceCheckpoint;
8
+ exports.loadSourceCheckpoint = loadSourceCheckpoint;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const crypto_1 = require("crypto");
12
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
13
+ const KEY = 'background-source-stamps-v1';
14
+ const hash = (value) => (0, crypto_1.createHash)('sha256').update(JSON.stringify(value)).digest('hex');
15
+ /** One counter slot per original source entry, not per session/alias/snapshot.
16
+ * Distinct frozen projections join that entry's fingerprint rather than counting
17
+ * the same original again. No bodies are reconstructed or retained here. */
18
+ function sourceStamps(db, before) {
19
+ const since = db.prepare("SELECT value FROM sync_settings WHERE key='history_since'").get()?.value || '';
20
+ const sessions = new Set(db.prepare('SELECT s.id 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').all().map(row => row.id));
21
+ const groups = new Map();
22
+ const add = (key, projection) => {
23
+ const id = hash(key), versions = groups.get(id) || new Set();
24
+ versions.add(hash(projection));
25
+ groups.set(id, versions);
26
+ };
27
+ const allowed = (session, at) => sessions.has(session) && at >= since && (!before || at <= before);
28
+ const projection = (agent, name, cwd, role, at, pointer) => [agent, name || cwd, cwd, role, at, pointer.original.record_hash, pointer.normalization,
29
+ pointer.edit ? [pointer.edit.record_hash, pointer.edit.normalization] : null, pointer.clip || null];
30
+ for (const row of db.prepare(`SELECT e.*,s.agent,s.name,s.cwd,edit.record_hash AS edit_hash,edit.normalization AS edit_normalization
31
+ FROM agent_entries e JOIN agent_sessions s ON s.id=e.session_id LEFT JOIN agent_entries edit ON edit.id=e.effective_id
32
+ WHERE e.active=1 AND e.present=1 AND e.is_activity=1 AND e.effective_length>0 ORDER BY e.id`).iterate()) {
33
+ if (!allowed(row.session_id, row.timestamp))
34
+ continue;
35
+ add(['entry', row.session_id, row.entry_id], projection(row.agent, row.name, row.cwd, row.role, row.timestamp, { original: row, normalization: row.normalization, ...(row.edit_hash ? { edit: { record_hash: row.edit_hash, normalization: row.edit_normalization } } : {}) }));
36
+ }
37
+ const frozen = (item) => {
38
+ if (!allowed(item.session_id, item.timestamp))
39
+ return;
40
+ if (!item.source_pointer)
41
+ throw new Error('Background checkpoint requires verified frozen pointers');
42
+ add(['entry', item.session_id, item.entry_id], projection(item.agent || 'pi', item.session_name, item.cwd, item.role, item.timestamp, item.source_pointer));
43
+ };
44
+ for (const row of db.prepare("SELECT 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())
45
+ frozen(JSON.parse(row.evidence_json));
46
+ 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()) {
47
+ for (const item of JSON.parse(row.context_json))
48
+ frozen(item);
49
+ const at = row.status === 'completed' ? row.completed_at : null;
50
+ if (before && (!at || at > before))
51
+ continue; // Same cutoff admission as prepare().
52
+ for (const kind of ['decisions', 'carry_forward'])
53
+ if (row[kind].trim())
54
+ add([kind, row.id], [row[kind], at, row.status === 'completed']);
55
+ }
56
+ for (const row of db.prepare("SELECT m.id,m.content,m.role,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()) {
57
+ if (row.content.trim() && (!before || row.created_at <= before))
58
+ add(['message', row.id], [row.content, row.role, row.created_at]);
59
+ }
60
+ return new Map([...groups].sort(([a], [b]) => a.localeCompare(b)).map(([key, values]) => [key, hash([...values].sort())]));
61
+ }
62
+ /** Write only after successful unscoped preparation. Hashes are scheduling hints,
63
+ * never evidence or authorization to skip fresh source verification. */
64
+ function saveSourceCheckpoint(db, stamps) {
65
+ const value = JSON.stringify([...stamps]);
66
+ const prior = db.prepare('SELECT value FROM meta WHERE key=?').get(KEY);
67
+ if (prior?.value !== value)
68
+ db.prepare('INSERT INTO meta(key,value) VALUES(?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.value').run(KEY, value);
69
+ }
70
+ /** No file/DB/model creation. Older indexes without a checkpoint need one
71
+ * foreground preparation; treating the whole cached archive as new would let
72
+ * a small tail bypass the minimum after a restart. */
73
+ function loadSourceCheckpoint(directory) {
74
+ const file = path_1.default.join(directory, 'memory', 'index.sqlite');
75
+ if (!fs_1.default.existsSync(file))
76
+ return new Map();
77
+ const db = new better_sqlite3_1.default(file, { readonly: true, fileMustExist: true });
78
+ try {
79
+ db.pragma('query_only = ON');
80
+ db.pragma('busy_timeout = 5000');
81
+ if (!db.prepare("SELECT 1 FROM sqlite_master WHERE type='table'").get())
82
+ return new Map(); // Interrupted brand-new initialization.
83
+ const size = db.prepare('SELECT length(value) AS size FROM meta WHERE key=?').get(KEY);
84
+ if (!size)
85
+ return undefined;
86
+ if (size.size > 33554432)
87
+ throw new Error('Oversized background checkpoint');
88
+ const row = db.prepare('SELECT value FROM meta WHERE key=?').get(KEY);
89
+ const pairs = JSON.parse(row.value);
90
+ if (!Array.isArray(pairs) || pairs.some(pair => !Array.isArray(pair) || pair.length !== 2 || pair.some(value => typeof value !== 'string' || !/^[a-f0-9]{64}$/.test(value))))
91
+ throw new Error('Invalid background checkpoint');
92
+ const result = new Map(pairs);
93
+ if (result.size !== pairs.length)
94
+ throw new Error('Duplicate background checkpoint identity');
95
+ return result;
96
+ }
97
+ finally {
98
+ db.close();
99
+ }
100
+ }
101
+ //# sourceMappingURL=stamps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stamps.js","sourceRoot":"","sources":["../../src/memory/stamps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type Database from 'better-sqlite3';
2
+ /** One physical passage/vector, many scoped occurrences. `chunks` and
3
+ * `embedding_cache` are read views, not additional text/vector stores. */
4
+ export declare function initHistoryStorage(db: Database.Database, fingerprint: string): void;
5
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/memory/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;0EAC0E;AAC1E,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAgGnF"}