draken 0.1.5 → 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 -58
  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,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,CAwFnF"}
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initHistoryStorage = initHistoryStorage;
4
+ /** One physical passage/vector, many scoped occurrences. `chunks` and
5
+ * `embedding_cache` are read views, not additional text/vector stores. */
6
+ function initHistoryStorage(db, fingerprint) {
7
+ const version = 'history-index-v3-contentless';
8
+ db.exec("CREATE TABLE IF NOT EXISTS meta(key TEXT PRIMARY KEY,value TEXT NOT NULL)");
9
+ const prior = db.prepare("SELECT value FROM meta WHERE key='schema'").get()?.value;
10
+ if ((prior && !['history-index-v1', 'history-index-v2-pointers', version].includes(prior)) || (!prior && db.prepare("SELECT 1 FROM sqlite_schema WHERE name IN ('records','chunks','vectors','passages')").get()))
11
+ throw new Error('Unknown history storage version; existing data was not reset');
12
+ db.transaction(() => {
13
+ db.exec(`
14
+ CREATE TABLE IF NOT EXISTS records(ref TEXT PRIMARY KEY,json TEXT NOT NULL,session_id TEXT,sync_id INTEGER,at TEXT,group_id TEXT NOT NULL,position INTEGER NOT NULL);
15
+ CREATE INDEX IF NOT EXISTS records_group ON records(group_id,at,position);
16
+ CREATE TABLE IF NOT EXISTS passages(id INTEGER PRIMARY KEY AUTOINCREMENT,hash TEXT NOT NULL UNIQUE,body TEXT,embedded INTEGER NOT NULL DEFAULT 0);
17
+ CREATE TABLE IF NOT EXISTS chunk_links(id INTEGER PRIMARY KEY AUTOINCREMENT,ref TEXT NOT NULL REFERENCES records(ref) ON DELETE CASCADE,offset INTEGER NOT NULL,passage_id INTEGER NOT NULL REFERENCES passages(id));
18
+ CREATE INDEX IF NOT EXISTS links_ref ON chunk_links(ref);
19
+ CREATE INDEX IF NOT EXISTS links_passage ON chunk_links(passage_id);
20
+ CREATE VIRTUAL TABLE IF NOT EXISTS passage_vectors USING vec0(embedding float[384] distance_metric=cosine);
21
+ `);
22
+ if (prior === 'history-index-v1') {
23
+ const sequence = db.prepare("SELECT seq FROM sqlite_sequence WHERE name='chunks'").get()?.seq || 0;
24
+ const insert = db.prepare('INSERT OR IGNORE INTO passages(hash,body) VALUES(?,?)');
25
+ const id = db.prepare('SELECT id,body FROM passages WHERE hash=?');
26
+ const link = db.prepare('INSERT INTO chunk_links(id,ref,offset,passage_id) VALUES(?,?,?,?)');
27
+ for (const row of db.prepare('SELECT * FROM chunks ORDER BY id').all()) {
28
+ insert.run(row.hash, row.body);
29
+ const passage = id.get(row.hash);
30
+ if (passage.body !== row.body)
31
+ throw new Error('Conflicting passage hash');
32
+ link.run(row.id, row.ref, row.offset, passage.id);
33
+ }
34
+ if (!db.prepare("UPDATE sqlite_sequence SET seq=MAX(seq,?) WHERE name='chunk_links'").run(sequence).changes && sequence)
35
+ db.prepare('INSERT INTO sqlite_sequence(name,seq) VALUES(?,?)').run('chunk_links', sequence);
36
+ const cache = db.prepare('SELECT embedding FROM embedding_cache WHERE hash=?');
37
+ const vector = db.prepare('SELECT embedding FROM vectors WHERE rowid=?');
38
+ const save = db.prepare('INSERT INTO passage_vectors(rowid,embedding) VALUES(?,?)');
39
+ // Cache-only rows are retained too; ordinary admission refresh may later
40
+ // prune genuinely unreferenced data, just as before this migration.
41
+ for (const row of db.prepare('SELECT hash FROM embedding_cache').all())
42
+ insert.run(row.hash, null);
43
+ for (const passage of db.prepare('SELECT id,hash FROM passages ORDER BY id').all()) {
44
+ let bytes = cache.get(passage.hash)?.embedding;
45
+ for (const row of db.prepare('SELECT id FROM chunks WHERE hash=? AND embedded=1').all(passage.hash)) {
46
+ const saved = vector.get(BigInt(row.id))?.embedding;
47
+ if (!saved || (bytes && !saved.equals(bytes)))
48
+ throw new Error('Existing embeddings disagree; migration refused');
49
+ bytes ||= saved;
50
+ }
51
+ if (!bytes)
52
+ continue;
53
+ if (bytes.length !== 1536 || [...new Float32Array(Uint8Array.from(bytes).buffer)].some(value => !Number.isFinite(value)))
54
+ throw new Error('Invalid retained embedding');
55
+ save.run(BigInt(passage.id), bytes);
56
+ db.prepare('UPDATE passages SET embedded=1 WHERE id=?').run(passage.id);
57
+ }
58
+ // Preserve the external-content FTS index and occurrence IDs, including
59
+ // its document frequencies. Only its backing table becomes a join view.
60
+ db.exec('DROP TRIGGER IF EXISTS chunks_insert; DROP TRIGGER IF EXISTS chunks_delete; DROP TABLE chunks; DROP TABLE vectors; DROP TABLE embedding_cache');
61
+ if (!db.prepare("SELECT 1 FROM meta WHERE key='covered-tails-removed'").get()) {
62
+ const remove = db.prepare('DELETE FROM chunk_links WHERE id=?');
63
+ for (const row of db.prepare(`SELECT c.id,c.offset,r.json FROM chunk_links c JOIN records r ON r.ref=c.ref
64
+ WHERE c.offset>0 AND NOT EXISTS(SELECT 1 FROM chunk_links n WHERE n.ref=c.ref AND n.offset>c.offset)
65
+ AND EXISTS(SELECT 1 FROM chunk_links p WHERE p.ref=c.ref AND p.offset=c.offset-700)`).all()) {
66
+ const text = JSON.parse(row.json).text;
67
+ if (typeof text === 'string' && row.offset + 100 >= text.length) {
68
+ // External-content FTS needs an explicit delete before its link is removed.
69
+ const body = db.prepare('SELECT body FROM passages p JOIN chunk_links c ON p.id=c.passage_id WHERE c.id=?').get(row.id).body;
70
+ db.prepare("INSERT INTO words(words,rowid,body) VALUES('delete',?,?)").run(row.id, body);
71
+ remove.run(row.id);
72
+ }
73
+ }
74
+ }
75
+ db.exec("UPDATE records SET json=json_remove(json,'$.text')");
76
+ }
77
+ if (db.pragma('table_info(passages)').some(column => column.name === 'body')) {
78
+ if (db.prepare('SELECT 1 FROM chunk_links c JOIN passages p ON p.id=c.passage_id WHERE p.body IS NULL LIMIT 1').get())
79
+ throw new Error('A stored search passage is missing; conversion refused');
80
+ // FTS retains token postings/positions, not original passage strings.
81
+ // Re-tokenize existing inputs only; vector bytes and IDs do not change.
82
+ db.exec(`CREATE VIRTUAL TABLE words_source USING fts5(body,content='',contentless_delete=1);
83
+ INSERT INTO words_source(rowid,body) SELECT c.id,p.body FROM chunk_links c JOIN passages p ON p.id=c.passage_id;
84
+ DROP TRIGGER IF EXISTS links_insert; DROP TRIGGER IF EXISTS links_delete;
85
+ DROP VIEW IF EXISTS chunks; DROP TABLE IF EXISTS words;
86
+ ALTER TABLE words_source RENAME TO words;
87
+ ALTER TABLE passages DROP COLUMN body;`);
88
+ }
89
+ db.exec(`
90
+ CREATE VIEW IF NOT EXISTS chunks AS SELECT c.id,c.ref,c.offset,p.hash,p.embedded FROM chunk_links c JOIN passages p ON p.id=c.passage_id;
91
+ CREATE VIEW IF NOT EXISTS embedding_cache AS SELECT p.hash,v.embedding FROM passages p JOIN passage_vectors v ON v.rowid=p.id;
92
+ CREATE VIRTUAL TABLE IF NOT EXISTS words USING fts5(body,content='',contentless_delete=1);
93
+ CREATE TRIGGER IF NOT EXISTS links_delete AFTER DELETE ON chunk_links BEGIN DELETE FROM words WHERE rowid=old.id; END;
94
+ CREATE TRIGGER IF NOT EXISTS passage_delete AFTER DELETE ON passages BEGIN DELETE FROM passage_vectors WHERE rowid=old.id; END;
95
+ `);
96
+ const oldModel = db.prepare("SELECT value FROM meta WHERE key='model'").get()?.value;
97
+ if (oldModel && oldModel !== fingerprint) {
98
+ // A real fingerprint change invalidates derived passages, never canonical records.
99
+ db.exec('DELETE FROM records; DELETE FROM passages');
100
+ }
101
+ const metadata = db.prepare('INSERT INTO meta(key,value) VALUES(?,?) ON CONFLICT(key) DO UPDATE SET value=excluded.value WHERE meta.value!=excluded.value');
102
+ metadata.run('schema', version);
103
+ metadata.run('model', fingerprint);
104
+ db.prepare("INSERT OR IGNORE INTO meta VALUES('covered-tails-removed','1')").run();
105
+ })();
106
+ }
107
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/memory/storage.ts"],"names":[],"mappings":";;AAIA,gDAwFC;AA1FD;0EAC0E;AAC1E,SAAgB,kBAAkB,CAAC,EAAqB,EAAE,WAAmB;IAC3E,MAAM,OAAO,GAAG,8BAA8B,CAAC;IAC/C,EAAE,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;IACrF,MAAM,KAAK,GAAI,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,EAAU,EAAE,KAAK,CAAC;IAC5F,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,kBAAkB,EAAE,2BAA2B,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,qFAAqF,CAAC,CAAC,GAAG,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACnS,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAClB,EAAE,CAAC,IAAI,CAAC;;;;;;;;KAQP,CAAC,CAAC;QACH,IAAI,KAAK,KAAK,kBAAkB,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAI,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAAU,EAAE,GAAG,IAAI,CAAC,CAAC;YAC5G,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;YACnF,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;YACnE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC;YAC7F,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAW,EAAE,CAAC;gBAChF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAC,MAAM,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAQ,CAAC;gBACxE,IAAI,OAAO,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;gBAC3E,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,IAAI,QAAQ;gBAAE,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACtN,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;YACzE,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC;YACpF,yEAAyE;YACzE,oEAAoE;YACpE,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC,GAAG,EAAW;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5G,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAW,EAAE,CAAC;gBAC5F,IAAI,KAAK,GAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAS,EAAE,SAA+B,CAAC;gBAC9E,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAU,EAAE,CAAC;oBAC7G,MAAM,KAAK,GAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAS,EAAE,SAA+B,CAAC;oBACnF,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;oBAClH,KAAK,KAAK,KAAK,CAAC;gBAClB,CAAC;gBACD,IAAI,CAAC,KAAK;oBAAE,SAAS;gBACrB,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBACxK,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBAAC,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC/G,CAAC;YACD,wEAAwE;YACxE,wEAAwE;YACxE,EAAE,CAAC,IAAI,CAAC,+IAA+I,CAAC,CAAC;YACzJ,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC9E,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;gBAChE,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC;;8FAEyD,CAAC,CAAC,GAAG,EAAW,EAAE,CAAC;oBACvG,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;oBACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChE,4EAA4E;wBAC5E,MAAM,IAAI,GAAI,EAAE,CAAC,OAAO,CAAC,kFAAkF,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAS,CAAC,IAAI,CAAC;wBACtI,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;wBAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAC/G,CAAC;gBACH,CAAC;YACH,CAAC;YACD,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;QAChE,CAAC;QACD,IAAK,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CAAC;YACrG,IAAI,EAAE,CAAC,OAAO,CAAC,+FAA+F,CAAC,CAAC,GAAG,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACjM,sEAAsE;YACtE,wEAAwE;YACxE,EAAE,CAAC,IAAI,CAAC;;;;;+CAKiC,CAAC,CAAC;QAC7C,CAAC;QACD,EAAE,CAAC,IAAI,CAAC;;;;;;KAMP,CAAC,CAAC;QACH,MAAM,QAAQ,GAAI,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAU,EAAE,KAAK,CAAC;QAC9F,IAAI,QAAQ,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YACzC,mFAAmF;YACnF,EAAE,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,8HAA8H,CAAC,CAAC;QAC5J,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACpE,EAAE,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC,GAAG,EAAE,CAAC;IACrF,CAAC,CAAC,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,68 @@
1
+ export interface HistoryRecord {
2
+ ref: string;
3
+ kind: 'session' | 'snapshot' | 'discussion' | 'decisions' | 'carry_forward';
4
+ session_id: string | null;
5
+ sync_id: number | null;
6
+ origin_ref: string | null;
7
+ title: string;
8
+ workspace: string;
9
+ role: string;
10
+ at: string | null;
11
+ qualification: string;
12
+ text: string;
13
+ }
14
+ export interface HistoryQuery {
15
+ question: string;
16
+ session_id?: string;
17
+ sync_id?: number;
18
+ before?: string;
19
+ }
20
+ export interface HistoryResults {
21
+ mode: 'hybrid';
22
+ results: (HistoryRecord & {
23
+ offset: number;
24
+ score: number;
25
+ })[];
26
+ limitations: string;
27
+ }
28
+ export interface HistoryPage {
29
+ record: HistoryRecord;
30
+ offset: number;
31
+ total: number;
32
+ neighbors: HistoryRecord[];
33
+ }
34
+ export interface HistoryUpdate {
35
+ stage: 'scanning' | 'downloading' | 'loading' | 'indexing' | 'searching' | 'reading';
36
+ completed: number;
37
+ total: number;
38
+ reused: number;
39
+ parallelism?: {
40
+ workers: number;
41
+ threads: number;
42
+ };
43
+ remaining_seconds: number | null;
44
+ downloaded_bytes: number;
45
+ download_total_bytes: number;
46
+ }
47
+ export interface HistoryProgress {
48
+ active: boolean;
49
+ background?: boolean;
50
+ queued: number;
51
+ elapsed_ms: number;
52
+ updated_at: number | null;
53
+ work: HistoryUpdate | null;
54
+ }
55
+ export type ReportHistory = (update: HistoryUpdate) => void;
56
+ export declare const historyUpdate: (stage: HistoryUpdate["stage"], fields?: Partial<Omit<HistoryUpdate, "stage">>) => HistoryUpdate;
57
+ export interface Embedder {
58
+ readonly fingerprint: string;
59
+ ready(): boolean;
60
+ setup(report?: ReportHistory): Promise<void>;
61
+ embed(text: string, query: boolean): Promise<Float32Array>;
62
+ embedMany?(texts: string[], parallel?: boolean): Promise<Float32Array[]>;
63
+ readonly parallelism?: {
64
+ workers: number;
65
+ threads: number;
66
+ };
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.historyUpdate = void 0;
4
+ const historyUpdate = (stage, fields = {}) => ({
5
+ stage, completed: 0, total: 0, reused: 0, remaining_seconds: null, downloaded_bytes: 0, download_total_bytes: 0, ...fields,
6
+ });
7
+ exports.historyUpdate = historyUpdate;
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":";;;AAiDO,MAAM,aAAa,GAAG,CAAC,KAA6B,EAAE,SAAgD,EAAE,EAAiB,EAAE,CAAC,CAAC;IAClI,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,GAAG,MAAM;CAC3H,CAAC,CAAC;AAFU,QAAA,aAAa,iBAEvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/memory/worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,82 @@
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
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
9
+ const index_1 = require("./index");
10
+ const embedding_pool_1 = require("./embedding-pool");
11
+ const types_1 = require("./types");
12
+ const registry_1 = require("../sources/registry");
13
+ // A private IPC child, not an HTTP service or tool runner. Native SQLite/vector
14
+ // work and embedding WASM cannot block the dashboard or audio event loop.
15
+ process.umask(0o077);
16
+ const directory = process.argv[2];
17
+ if (!process.send || !directory || !path_1.default.isAbsolute(directory) || !process.argv[3])
18
+ process.exit(1);
19
+ const roots = (0, registry_1.sourceRoots)(JSON.parse(process.argv[3]));
20
+ const folder = path_1.default.join(directory, 'memory');
21
+ fs_1.default.mkdirSync(folder, { recursive: true, mode: 0o700 });
22
+ const source = new better_sqlite3_1.default(path_1.default.join(directory, 'draken.db'), { readonly: true, fileMustExist: true });
23
+ source.pragma('query_only = ON');
24
+ source.pragma('busy_timeout = 5000');
25
+ const file = path_1.default.join(folder, 'index.sqlite'), db = new better_sqlite3_1.default(file);
26
+ fs_1.default.chmodSync(file, 0o600);
27
+ const model = new embedding_pool_1.EmbeddingPool(path_1.default.join(folder, 'model'));
28
+ const index = new index_1.HistoryIndex(db, source, model, roots);
29
+ let busy = false;
30
+ process.on('message', async (message) => {
31
+ if (busy || !message || !Number.isSafeInteger(message.id))
32
+ return;
33
+ busy = true;
34
+ try {
35
+ let lastSent = 0, stage = '';
36
+ const report = progress => {
37
+ const now = Date.now();
38
+ if (progress.stage !== stage || now - lastSent >= 250 || (progress.total > 0 && progress.completed === progress.total)) {
39
+ stage = progress.stage;
40
+ lastSent = now;
41
+ process.send?.({ id: message.id, progress });
42
+ }
43
+ };
44
+ let value;
45
+ if (message.method === 'prepare') {
46
+ await index.prepare({ before: message.before }, report, true);
47
+ value = null;
48
+ }
49
+ else if (message.method === 'search')
50
+ value = await index.search(message.query, report);
51
+ else if (message.method === 'read') {
52
+ report((0, types_1.historyUpdate)('reading'));
53
+ value = index.read(message.ref, message.offset);
54
+ }
55
+ else
56
+ throw new Error('Unknown history operation');
57
+ process.send?.({ id: message.id, value });
58
+ }
59
+ catch {
60
+ // Never emit private source text, a model input, filesystem error or rejected
61
+ // request diagnostics. The parent provides action-specific recovery wording.
62
+ process.send?.({ id: message.id, error: true });
63
+ }
64
+ finally {
65
+ busy = false;
66
+ }
67
+ });
68
+ async function close() {
69
+ // Let SQLite finish its normal checkpoint on orderly retirement. Abrupt exit
70
+ // still leaves committed WAL work recoverable; no VACUUM or history pruning.
71
+ try {
72
+ await model.close();
73
+ db.close();
74
+ source.close();
75
+ }
76
+ finally {
77
+ process.exit(0);
78
+ }
79
+ }
80
+ process.once('SIGTERM', close);
81
+ process.once('disconnect', close);
82
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/memory/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** Run npm's JS entry under the current Node, never a Windows command shim or
2
+ * a shell command. Paths with spaces/metacharacters remain individual argv. */
3
+ export declare function npmCli(env?: NodeJS.ProcessEnv, node?: string): string;
4
+ //# sourceMappingURL=npm-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-cli.d.ts","sourceRoot":"","sources":["../src/npm-cli.ts"],"names":[],"mappings":"AAGA;+EAC+E;AAC/E,wBAAgB,MAAM,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,SAAmB,GAAG,MAAM,CAkB5F"}
@@ -0,0 +1,36 @@
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.npmCli = npmCli;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ /** Run npm's JS entry under the current Node, never a Windows command shim or
10
+ * a shell command. Paths with spaces/metacharacters remain individual argv. */
11
+ function npmCli(env = process.env, node = process.execPath) {
12
+ const candidates = [env.npm_execpath,
13
+ path_1.default.join(path_1.default.dirname(node), 'node_modules/npm/bin/npm-cli.js'),
14
+ path_1.default.resolve(path_1.default.dirname(node), '../lib/node_modules/npm/bin/npm-cli.js')];
15
+ for (const directory of (env.PATH || '').split(path_1.default.delimiter).filter(Boolean)) {
16
+ for (const name of ['npm', 'npm.cmd']) {
17
+ try {
18
+ const file = fs_1.default.realpathSync(path_1.default.join(directory, name));
19
+ candidates.push(file, path_1.default.join(path_1.default.dirname(file), 'node_modules/npm/bin/npm-cli.js'), path_1.default.join(directory, 'node_modules/npm/bin/npm-cli.js'));
20
+ }
21
+ catch { /* Try the other known npm installation layouts. */ }
22
+ }
23
+ }
24
+ const found = candidates.find(file => {
25
+ try {
26
+ return file && path_1.default.basename(file) === 'npm-cli.js' && fs_1.default.statSync(file).isFile();
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ });
32
+ if (!found)
33
+ throw new Error('npm was not found. Install Node.js 22.19+ with npm, then run setup again.');
34
+ return found;
35
+ }
36
+ //# sourceMappingURL=npm-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm-cli.js","sourceRoot":"","sources":["../src/npm-cli.ts"],"names":[],"mappings":";;;;;AAKA,wBAkBC;AAvBD,4CAAoB;AACpB,gDAAwB;AAExB;+EAC+E;AAC/E,SAAgB,MAAM,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ;IAClF,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,YAAY;QAClC,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,iCAAiC,CAAC;QAChE,cAAI,CAAC,OAAO,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,wCAAwC,CAAC,CAAC,CAAC;IAC9E,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,cAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/E,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;gBACzD,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,cAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,iCAAiC,CAAC,EACpF,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC,CAAC;YAC7D,CAAC;YAAC,MAAM,CAAC,CAAC,mDAAmD,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnC,IAAI,CAAC;YAAC,OAAO,IAAI,IAAI,cAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,YAAY,IAAI,YAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,KAAK,CAAC;QAAC,CAAC;IACpH,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IACzG,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,34 @@
1
+ export declare const PI_VERSION = "1.5.0";
2
+ export declare const PI_PACKAGE = "@earendil-works/pi-coding-agent";
3
+ export declare const isolatedFlags: string[];
4
+ import type { PiSetupStatus } from '../types';
5
+ export declare function piPaths(): {
6
+ root: string;
7
+ agent: string;
8
+ home: string;
9
+ work: string;
10
+ selected: string;
11
+ };
12
+ export declare function managedEnvironment(): NodeJS.ProcessEnv;
13
+ /** Refuse symlinked private subdirectories, without creating anything during GET/status. */
14
+ export declare function privateDirectory(directory: string, create?: boolean): void;
15
+ export declare function executable(name: string): string | undefined;
16
+ export declare function selectedPi(): {
17
+ source: "managed";
18
+ binary: string;
19
+ prefix: string[];
20
+ env: NodeJS.ProcessEnv;
21
+ agent: string;
22
+ } | {
23
+ source: "external";
24
+ binary: string;
25
+ prefix: string[];
26
+ env: {
27
+ [key: string]: string | undefined;
28
+ TZ?: string | undefined;
29
+ };
30
+ agent: string;
31
+ };
32
+ export declare function stopPiChecks(): Promise<void>;
33
+ export declare function piSetupStatus(fresh?: boolean): Promise<PiSetupStatus>;
34
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/pi/runtime.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,UAAU,UAAU,CAAC;AAClC,eAAO,MAAM,UAAU,oCAAoC,CAAC;AAC5D,eAAO,MAAM,aAAa,UAA0K,CAAC;AACrM,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,wBAAgB,OAAO;;;;;;EAGtB;AAKD,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,UAAU,CAKtD;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,IAAI,CAUxE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK3D;AAED,wBAAgB,UAAU;;;;;;;;;;;;;;;EA0BzB;AAID,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlD;AAmDD,wBAAgB,aAAa,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAOnE"}