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,113 @@
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.rememberServer = rememberServer;
7
+ exports.configuredServerTarget = configuredServerTarget;
8
+ exports.recordedServerTarget = recordedServerTarget;
9
+ exports.serverTarget = serverTarget;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const net_1 = require("net");
13
+ const crypto_1 = require("crypto");
14
+ const schema_1 = require("./db/schema");
15
+ const stateFile = () => path_1.default.join((0, schema_1.getDataDir)(), 'server-state.json');
16
+ const idPattern = /^[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12}$/;
17
+ function endpoint(host, port, secure = false) {
18
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
19
+ throw new Error('Invalid status port');
20
+ const local = host === '0.0.0.0' ? '127.0.0.1' : host === '::' ? '::1' : host;
21
+ const address = local.includes(':') && !local.startsWith('[') ? `[${local}]` : local;
22
+ const value = new URL(`${secure ? 'https' : 'http'}://${address}:${port}`);
23
+ if (value.username || value.password || value.pathname !== '/' || value.search || value.hash)
24
+ throw new Error('Invalid status address');
25
+ return value.origin;
26
+ }
27
+ function readState() {
28
+ let fd;
29
+ try {
30
+ if (fs_1.default.lstatSync(stateFile()).isSymbolicLink())
31
+ throw new Error('Invalid server record');
32
+ fd = fs_1.default.openSync(stateFile(), fs_1.default.constants.O_RDONLY | (fs_1.default.constants.O_NOFOLLOW || 0));
33
+ const stat = fs_1.default.fstatSync(fd);
34
+ if (!stat.isFile() || stat.size > 4096)
35
+ throw new Error('Invalid server record');
36
+ const bytes = Buffer.alloc(4097), length = fs_1.default.readSync(fd, bytes, 0, bytes.length, 0);
37
+ if (length > 4096)
38
+ throw new Error('Invalid server record');
39
+ const value = JSON.parse(bytes.subarray(0, length).toString('utf8'));
40
+ if (value.version !== 1 || typeof value.instance !== 'string' || !idPattern.test(value.instance) || !Number.isSafeInteger(value.pid) || value.pid < 1
41
+ || typeof value.started_at !== 'string' || !Number.isFinite(Date.parse(value.started_at)))
42
+ throw new Error('Invalid server record');
43
+ for (const [key, protocol] of [['http_url', 'http:'], ['https_url', 'https:']]) {
44
+ if (key === 'https_url' && value[key] === null)
45
+ continue;
46
+ if (typeof value[key] !== 'string' || value[key].length > 256)
47
+ throw new Error('Invalid server record');
48
+ const url = new URL(value[key]);
49
+ // Saved addresses come from the actual bound sockets, never arbitrary URLs
50
+ // or dashboard input. Explicit operator overrides may still use DNS names.
51
+ if (url.protocol !== protocol || url.port === '0' || !(0, net_1.isIP)(url.hostname.replace(/^\[|\]$/g, '')) || url.origin !== value[key])
52
+ throw new Error('Invalid server record');
53
+ }
54
+ return value;
55
+ }
56
+ catch (error) {
57
+ if (error.code === 'ENOENT')
58
+ return;
59
+ throw new Error('The saved server address is invalid. Check server-state.json in DRAKEN_DATA_DIR, or supply an explicit DRAKEN_HOST/DRAKEN_PORT override.');
60
+ }
61
+ finally {
62
+ if (fd !== undefined)
63
+ fs_1.default.closeSync(fd);
64
+ }
65
+ }
66
+ /** Last successful bind, not a claim that the process is still alive. Kept after
67
+ * shutdown so status can check the same address; a live instance match is required. */
68
+ function rememberServer(instance, http, https) {
69
+ const state = { version: 1, instance, pid: process.pid, http_url: endpoint(http.address, http.port),
70
+ https_url: https ? endpoint(https.address, https.port, true) : null, started_at: new Date().toISOString() };
71
+ const temp = path_1.default.join((0, schema_1.getDataDir)(), `.server-state-${(0, crypto_1.randomUUID)()}.tmp`);
72
+ try {
73
+ fs_1.default.writeFileSync(temp, JSON.stringify(state) + '\n', { mode: 0o600, flag: 'wx' });
74
+ fs_1.default.renameSync(temp, stateFile());
75
+ }
76
+ finally {
77
+ fs_1.default.rmSync(temp, { force: true });
78
+ }
79
+ return { url: state.http_url, open: state.https_url || state.http_url, instance };
80
+ }
81
+ /** Where a new server would bind with this process's environment, not saved state. */
82
+ function configuredServerTarget() {
83
+ const host = process.env.DRAKEN_HOST || '127.0.0.1';
84
+ const url = endpoint(host, Number(process.env.DRAKEN_PORT || 40333));
85
+ return { url, open: process.env.DRAKEN_HTTPS_PORT && process.env.DRAKEN_HTTPS_PORT !== '0'
86
+ ? endpoint(host, Number(process.env.DRAKEN_HTTPS_PORT), true) : url, instance: undefined };
87
+ }
88
+ function recordedServerTarget() {
89
+ const saved = readState();
90
+ return saved ? { url: saved.http_url, open: saved.https_url || saved.http_url, instance: saved.instance } : undefined;
91
+ }
92
+ function serverTarget() {
93
+ const explicit = Boolean(process.env.DRAKEN_HOST || process.env.DRAKEN_PORT);
94
+ let saved;
95
+ try {
96
+ saved = readState();
97
+ }
98
+ catch (error) {
99
+ if (!explicit)
100
+ throw error;
101
+ }
102
+ if (explicit) {
103
+ const last = saved && new URL(saved.http_url);
104
+ const host = process.env.DRAKEN_HOST || last?.hostname || '127.0.0.1';
105
+ const port = Number(process.env.DRAKEN_PORT || last?.port || (last ? '80' : '40333'));
106
+ const url = endpoint(host, port), same = url === saved?.http_url;
107
+ return { url, open: same ? saved.https_url || url : url, instance: same ? saved.instance : undefined };
108
+ }
109
+ if (saved)
110
+ return { url: saved.http_url, open: saved.https_url || saved.http_url, instance: saved.instance };
111
+ return { url: 'http://127.0.0.1:40333', open: 'http://127.0.0.1:40333', instance: undefined };
112
+ }
113
+ //# sourceMappingURL=server-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-state.js","sourceRoot":"","sources":["../src/server-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { serverTarget } from './server-state';
2
+ export type ServerTarget = ReturnType<typeof serverTarget>;
3
+ /** Connectivity only. Never obtains credentials, follows redirects, or calls models. */
4
+ export declare function probeServer(target: ServerTarget): Promise<{
5
+ instance?: string;
6
+ }>;
7
+ //# sourceMappingURL=server-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-status.d.ts","sourceRoot":"","sources":["../src/server-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAE3D,wFAAwF;AACxF,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBtF"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.probeServer = probeServer;
4
+ /** Connectivity only. Never obtains credentials, follows redirects, or calls models. */
5
+ async function probeServer(target) {
6
+ const response = await fetch(target.url + '/api/auth/status', { signal: AbortSignal.timeout(2500), redirect: 'error' });
7
+ if (!response.ok || !response.body) {
8
+ await response.body?.cancel();
9
+ throw new Error('Server did not respond as Draken');
10
+ }
11
+ const reader = response.body.getReader(), chunks = [];
12
+ let size = 0;
13
+ try {
14
+ for (;;) {
15
+ const part = await reader.read();
16
+ if (part.done)
17
+ break;
18
+ size += part.value.byteLength;
19
+ if (size > 8192)
20
+ throw new Error('Oversized server status');
21
+ chunks.push(part.value);
22
+ }
23
+ const identity = JSON.parse(Buffer.concat(chunks).toString('utf8'));
24
+ if (identity.application !== 'draken')
25
+ throw new Error('Server did not respond as Draken');
26
+ if (target.instance && identity.instance !== target.instance)
27
+ throw new Error('Different server instance');
28
+ return { instance: typeof identity.instance === 'string' ? identity.instance : undefined };
29
+ }
30
+ finally {
31
+ await reader.cancel().catch(() => { });
32
+ }
33
+ }
34
+ //# sourceMappingURL=server-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-status.js","sourceRoot":"","sources":["../src/server-status.ts"],"names":[],"mappings":";;AAKA,kCAgBC;AAjBD,wFAAwF;AACjF,KAAK,UAAU,WAAW,CAAC,MAAoB;IACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,kBAAkB,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACxH,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAAC,CAAC;IAC3H,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,GAAiB,EAAE,CAAC;IAAC,IAAI,IAAI,GAAG,CAAC,CAAC;IAClF,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAAC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM;YACvD,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC9B,IAAI,IAAI,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,IAAI,QAAQ,CAAC,WAAW,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAC3F,IAAI,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3G,OAAO,EAAE,QAAQ,EAAE,OAAO,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7F,CAAC;YAAS,CAAC;QAAC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAAC,CAAC;AACtD,CAAC"}
package/dist/server.d.ts CHANGED
@@ -1,2 +1,6 @@
1
- export {};
1
+ export declare function createApp(options?: {
2
+ staticDir?: string;
3
+ instanceId?: string;
4
+ }): import("express-serve-static-core").Express;
5
+ export declare function startServer(trayOwned?: boolean): void;
2
6
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAoBA,wBAAgB,SAAS,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,+CAkClF;AAED,wBAAgB,WAAW,CAAC,SAAS,UAAQ,GAAG,IAAI,CA8DnD"}
package/dist/server.js CHANGED
@@ -3,58 +3,160 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createApp = createApp;
7
+ exports.startServer = startServer;
6
8
  const express_1 = __importDefault(require("express"));
7
9
  const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const https_1 = __importDefault(require("https"));
12
+ const crypto_1 = require("crypto");
13
+ const server_state_1 = require("./server-state");
8
14
  const schema_1 = require("./db/schema");
9
15
  const middleware_1 = require("./auth/middleware");
10
- const manager_1 = require("./docker/manager");
11
16
  const auth_1 = __importDefault(require("./routes/auth"));
12
- const projects_1 = __importDefault(require("./routes/projects"));
13
- const tasks_1 = __importDefault(require("./routes/tasks"));
14
- const browse_1 = __importDefault(require("./routes/browse"));
15
- const git_1 = __importDefault(require("./routes/git"));
16
- const PORT = 40333;
17
- // Validate configurations early - will throw if required vars are missing
18
- try {
19
- // Validate Draken web auth (DRAKEN_USERNAME, DRAKEN_PASSWORD, DRAKEN_JWT_SECRET)
17
+ const sync_1 = __importDefault(require("./routes/sync"));
18
+ const memory_1 = __importDefault(require("./routes/memory"));
19
+ const service_1 = require("./memory/service");
20
+ const automatic_1 = require("./memory/automatic");
21
+ const voice_1 = __importDefault(require("./routes/voice"));
22
+ const legacy_history_1 = require("./voice/legacy-history");
23
+ const live_1 = require("./voice/live");
24
+ const store_1 = require("./sync/store");
25
+ const manager_1 = require("./sync/manager");
26
+ const runtime_1 = require("./pi/runtime");
27
+ function createApp(options = {}) {
28
+ const app = (0, express_1.default)();
29
+ app.locals.drakenInstance = options.instanceId;
30
+ const staticDir = options.staticDir || path_1.default.join(__dirname, '../public');
31
+ app.disable('x-powered-by');
32
+ app.use(express_1.default.json({ limit: '32kb' }));
33
+ app.use('/api', (req, res, next) => {
34
+ // This local application exposes private transcripts. No cross-origin API access.
35
+ if (req.headers.origin) {
36
+ try {
37
+ if (new URL(req.headers.origin).host !== req.headers.host)
38
+ return res.status(403).json({ error: 'Cross-origin requests are not allowed' });
39
+ }
40
+ catch {
41
+ return res.status(403).json({ error: 'Invalid origin' });
42
+ }
43
+ }
44
+ if (req.headers['sec-fetch-site'] === 'cross-site')
45
+ return res.status(403).json({ error: 'Cross-site requests are not allowed' });
46
+ if ((0, middleware_1.isNoAuthMode)()) {
47
+ const hostname = (req.headers.host || '').replace(/:\d+$/, '');
48
+ if (!['localhost', '127.0.0.1', '[::1]'].includes(hostname))
49
+ return res.status(403).json({ error: 'Local mode requires a loopback host' });
50
+ }
51
+ res.setHeader('Cache-Control', 'no-store');
52
+ next();
53
+ });
54
+ app.use('/api/auth', auth_1.default);
55
+ app.use('/api/voice', middleware_1.authMiddleware, voice_1.default);
56
+ app.use('/api/memory', middleware_1.authMiddleware, memory_1.default);
57
+ app.use('/api', middleware_1.authMiddleware, sync_1.default);
58
+ app.use('/api', (_req, res) => res.status(404).json({ error: 'API route not found' }));
59
+ app.use(express_1.default.static(staticDir));
60
+ app.get('*', (_req, res) => res.sendFile(path_1.default.join(staticDir, 'index.html')));
61
+ app.use((error, _req, res, _next) => {
62
+ const status = error instanceof store_1.HttpError ? error.status : error.status === 400 || error.status === 413 ? error.status : 500;
63
+ if (status === 500)
64
+ console.error('Draken request failed:', error.message);
65
+ res.status(status).json({ error: status === 500 ? 'Internal error. See the local server log.' : error.message });
66
+ });
67
+ return app;
68
+ }
69
+ function startServer(trayOwned = false) {
70
+ if (trayOwned && (!process.send || !process.connected))
71
+ throw new Error('The tray launcher disconnected. No server was started.');
20
72
  (0, middleware_1.validateAuthConfig)();
21
- // Validate Claude auth (OAuth credentials or ANTHROPIC_API_KEY)
22
- (0, manager_1.validateClaudeAuth)();
73
+ (0, live_1.validateVoiceConfig)();
74
+ const host = process.env.DRAKEN_HOST || '127.0.0.1';
75
+ const port = Number(process.env.DRAKEN_PORT || 40333);
76
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
77
+ throw new Error('DRAKEN_PORT must be between 1 and 65535');
78
+ if ((0, middleware_1.isNoAuthMode)() && !(0, middleware_1.isLoopbackHost)(host)) {
79
+ throw new Error('No-auth mode may only bind to loopback. Configure authentication before exposing Draken.');
80
+ }
81
+ const httpsPort = Number(process.env.DRAKEN_HTTPS_PORT || 0);
82
+ if (!Number.isInteger(httpsPort) || httpsPort < 0 || httpsPort > 65535 || (httpsPort !== 0 && httpsPort === port))
83
+ throw new Error('DRAKEN_HTTPS_PORT must be a different valid port');
84
+ const tls = httpsPort ? { cert: fs_1.default.readFileSync(process.env.DRAKEN_TLS_CERT || ''), key: fs_1.default.readFileSync(process.env.DRAKEN_TLS_KEY || '') } : null;
85
+ // Bind before recovery: a second launch on an occupied port must not mark the
86
+ // actual server's active runs/calls interrupted or mutate its database.
87
+ let ready = false, listening = 0, stopping = false;
88
+ const instanceId = (0, crypto_1.randomUUID)();
89
+ const app = (0, express_1.default)();
90
+ app.use((_req, res, next) => ready ? next() : res.status(503).json({ error: 'Draken is starting or stopping.' }));
91
+ app.use(createApp({ instanceId }));
92
+ const bound = () => {
93
+ if (++listening !== (tls ? 2 : 1) || stopping)
94
+ return;
95
+ try {
96
+ (0, schema_1.getDb)();
97
+ (0, store_1.recoverInterruptedRuns)();
98
+ (0, legacy_history_1.recoverLegacyCalls)();
99
+ (0, live_1.recoverLiveCalls)();
100
+ const httpAddress = server.address(), secureAddress = secureServer?.address();
101
+ if (!httpAddress || typeof httpAddress === 'string' || typeof secureAddress === 'string')
102
+ throw new Error('Cannot record the listening address');
103
+ const target = (0, server_state_1.rememberServer)(instanceId, httpAddress, secureAddress || undefined);
104
+ ready = true;
105
+ if (trayOwned)
106
+ process.send({ type: 'draken-ready', target }, error => { if (error)
107
+ shutdown(1); });
108
+ const display = host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;
109
+ console.log(`Draken sync running at http://${display}:${port}`);
110
+ if (tls)
111
+ console.log(`Draken voice page: https://${display}:${httpsPort}`);
112
+ console.log((trayOwned ? 'Managed by Draken tray. Use its menu to stop the server; closing the browser does not.\n' : 'Keep this terminal open. Ctrl+C stops the server; closing the browser does not.\n') + 'First use / missing pi: draken setup → draken login (inside pi, type /login, then /quit).\nAlready have pi? Keep your configured installation; draken doctor checks summary setup.\nVoice: draken voice setup → draken voice login (separate ChatGPT sign-in).\nUse the same server user and environment for these commands. Select history in Settings → Agents & sessions, then Sync with Draken.\nCheck server connectivity with draken status. No startup login, model download, provider call or microphone capture is performed.');
113
+ (0, automatic_1.startBackgroundIndexing)();
114
+ }
115
+ catch (error) {
116
+ console.error(error instanceof Error ? error.message : 'Draken startup failed');
117
+ shutdown(1);
118
+ }
119
+ };
120
+ const secureServer = tls ? https_1.default.createServer(tls, app).listen(httpsPort, host, bound) : null;
121
+ const server = app.listen(port, host, bound);
122
+ const shutdown = (code = 0) => {
123
+ if (stopping)
124
+ return;
125
+ stopping = true;
126
+ ready = false;
127
+ const backgroundStopped = (0, automatic_1.stopBackgroundIndexing)();
128
+ (0, manager_1.stopManagerProcesses)();
129
+ (0, service_1.stopHistory)();
130
+ secureServer?.close();
131
+ const closed = new Promise(resolve => server.close(() => resolve()));
132
+ void Promise.all([closed, (0, live_1.stopLiveCalls)(), backgroundStopped, (0, runtime_1.stopPiChecks)()]).finally(() => { (0, schema_1.closeDb)(); process.exit(code); });
133
+ setTimeout(() => process.exit(code), 6500).unref();
134
+ };
135
+ const failed = (error) => {
136
+ console.error(error.code === 'EADDRINUSE' ? 'Draken could not bind: a configured port is already in use. Run draken status; do not start a second server.' : `Draken could not listen (${error.code || 'unknown error'}). Check the bind address, ports and server log.`);
137
+ shutdown(1);
138
+ };
139
+ server.once('error', failed);
140
+ secureServer?.once('error', failed);
141
+ if (trayOwned) {
142
+ // Only the owning child-process IPC channel can request this. There is no
143
+ // HTTP shutdown endpoint, PID-file kill, or Windows forced termination.
144
+ process.on('message', (message) => {
145
+ if (message?.type === 'draken-shutdown' && message.instance === instanceId)
146
+ shutdown();
147
+ });
148
+ process.once('disconnect', () => shutdown());
149
+ }
150
+ process.once('SIGINT', () => shutdown());
151
+ process.once('SIGTERM', () => shutdown());
23
152
  }
24
- catch (err) {
25
- console.error('\n' + err.message + '\n');
26
- process.exit(1);
153
+ if (require.main === module) {
154
+ try {
155
+ startServer();
156
+ }
157
+ catch (error) {
158
+ console.error(error instanceof Error ? error.message : error);
159
+ process.exitCode = 1;
160
+ }
27
161
  }
28
- const app = (0, express_1.default)();
29
- // Middleware
30
- app.use(express_1.default.json());
31
- app.use(express_1.default.static(path_1.default.join(__dirname, '../public')));
32
- // Auth routes (public - no auth required)
33
- app.use('/api/auth', auth_1.default);
34
- // Protected API Routes (auth required if configured)
35
- app.use('/api/projects', middleware_1.authMiddleware, projects_1.default);
36
- app.use('/api/tasks', middleware_1.authMiddleware, tasks_1.default);
37
- app.use('/api/browse', middleware_1.authMiddleware, browse_1.default);
38
- app.use('/api/git', middleware_1.authMiddleware, git_1.default);
39
- // Client-side routing - serve index.html for all non-API routes
40
- app.get('*', (req, res) => {
41
- res.sendFile(path_1.default.join(__dirname, '../public/index.html'));
42
- });
43
- // Initialize database
44
- (0, schema_1.getDb)();
45
- // Graceful shutdown
46
- process.on('SIGINT', () => {
47
- console.log('\nShutting down...');
48
- (0, schema_1.closeDb)();
49
- process.exit(0);
50
- });
51
- process.on('SIGTERM', () => {
52
- console.log('\nShutting down...');
53
- (0, schema_1.closeDb)();
54
- process.exit(0);
55
- });
56
- // Start server
57
- app.listen(PORT, () => {
58
- console.log(`Draken dashboard running at http://localhost:${PORT}`);
59
- });
60
162
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;AAAA,sDAA8B;AAC9B,gDAAwB;AACxB,wCAA6C;AAC7C,kDAAuE;AACvE,8CAAsD;AACtD,yDAAuC;AACvC,iEAA+C;AAC/C,2DAAyC;AACzC,6DAA2C;AAC3C,uDAAqC;AAErC,MAAM,IAAI,GAAG,KAAK,CAAC;AAEnB,0EAA0E;AAC1E,IAAI,CAAC;IACH,iFAAiF;IACjF,IAAA,+BAAkB,GAAE,CAAC;IAErB,gEAAgE;IAChE,IAAA,4BAAkB,GAAE,CAAC;AACvB,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,IAAI,GAAI,GAAa,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,GAAG,GAAG,IAAA,iBAAO,GAAE,CAAC;AAEtB,aAAa;AACb,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACxB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AAE3D,0CAA0C;AAC1C,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,cAAU,CAAC,CAAC;AAEjC,qDAAqD;AACrD,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,2BAAc,EAAE,kBAAc,CAAC,CAAC;AACzD,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,2BAAc,EAAE,eAAW,CAAC,CAAC;AACnD,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,2BAAc,EAAE,gBAAY,CAAC,CAAC;AACrD,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,2BAAc,EAAE,aAAS,CAAC,CAAC;AAE/C,gEAAgE;AAChE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACxB,GAAG,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,IAAA,cAAK,GAAE,CAAC;AAER,oBAAoB;AACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,IAAA,gBAAO,GAAE,CAAC;IACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,IAAA,gBAAO,GAAE,CAAC;IACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,eAAe;AACf,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AgentKind } from '../types';
2
+ import type { PointerRecord } from '../sync/jsonl';
3
+ import { type NormalizedEntry, type NormalizationVersion } from '../sync/normalize';
4
+ import { type SourceIdentity } from './registry';
5
+ export interface SourceHeader extends SourceIdentity {
6
+ id: string;
7
+ cwd: string;
8
+ }
9
+ /** Bounded header/identity discovery. Never read credentials, history.jsonl,
10
+ * request dumps or tool definitions as session headers. */
11
+ export declare function identifySource(agent: AgentKind, records: Iterable<PointerRecord>): SourceHeader;
12
+ /** v1 adapter recipes are immutable: live and frozen pointers use the same
13
+ * normalizer. One physical record projects to at most one evidence entry. */
14
+ export declare function normalizeSource(source: SourceIdentity, record: PointerRecord, version?: NormalizationVersion): NormalizedEntry | null;
15
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/sources/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAqC,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACvH,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,WAAW,YAAa,SAAQ,cAAc;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAEhF;2DAC2D;AAC3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,YAAY,CA0B/F;AAYD;6EAC6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,oBAAwB,GAAG,eAAe,GAAG,IAAI,CAkDxI"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.identifySource = identifySource;
4
+ exports.normalizeSource = normalizeSource;
5
+ const normalize_1 = require("../sync/normalize");
6
+ const registry_1 = require("./registry");
7
+ const identifier = (value) => typeof value === 'string' && /^[\w-]{1,128}$/.test(value);
8
+ /** Bounded header/identity discovery. Never read credentials, history.jsonl,
9
+ * request dumps or tool definitions as session headers. */
10
+ function identifySource(agent, records) {
11
+ let count = 0;
12
+ for (const { value: r } of records) {
13
+ if (++count > 256)
14
+ break;
15
+ if (!r || typeof r !== 'object')
16
+ continue;
17
+ if (agent === 'pi') {
18
+ if (r.type === 'session' && r.version !== 3)
19
+ throw new Error('Unsupported pi session version; only v3 JSONL is supported');
20
+ if (r.type !== 'session' || typeof r.id !== 'string' || typeof r.cwd !== 'string')
21
+ break;
22
+ return { agent, external_id: r.id, parser_version: 1, id: r.id, cwd: r.cwd };
23
+ }
24
+ if (agent === 'codex') {
25
+ const p = r.payload;
26
+ if (r.type !== 'session_meta' || !identifier(p?.id) || typeof p.cwd !== 'string')
27
+ break;
28
+ if (p.history_base)
29
+ throw new Error('Codex external history-base rollouts are not supported; no inherited evidence was guessed');
30
+ const source = { agent, external_id: p.id, parser_version: 1 };
31
+ return { ...source, id: (0, registry_1.sessionId)(source), cwd: p.cwd };
32
+ }
33
+ if (identifier(r.sessionId) && identifier(r.uuid) && typeof r.cwd === 'string') {
34
+ // Subagent files often share their parent's sessionId. A recorded agent ID
35
+ // (or the first sidechain message UUID) separates them without relying on a filename.
36
+ const suffix = r.isSidechain === true ? (identifier(r.agentId) ? r.agentId : r.uuid) : undefined;
37
+ const source = { agent, external_id: r.sessionId + (suffix ? '/' + suffix : ''), parser_version: 1 };
38
+ return { ...source, id: (0, registry_1.sessionId)(source), cwd: r.cwd };
39
+ }
40
+ }
41
+ throw new Error(`No supported ${agent} session header/identity found`);
42
+ }
43
+ function textBlocks(value) {
44
+ if (typeof value === 'string')
45
+ return value;
46
+ if (!Array.isArray(value))
47
+ return '';
48
+ return value.filter(part => part && ['text', 'input_text', 'output_text'].includes(part.type) && typeof part.text === 'string').map(part => part.text).join('\n');
49
+ }
50
+ function tool(name, args) {
51
+ if (typeof args === 'string') {
52
+ try {
53
+ args = JSON.parse(args);
54
+ }
55
+ catch {
56
+ args = {};
57
+ }
58
+ }
59
+ return { type: 'toolCall', name: typeof name === 'string' ? name.slice(0, 100) : 'unknown', arguments: args && typeof args === 'object' ? args : {} };
60
+ }
61
+ const contextOnly = (text) => /^(?:# AGENTS\.md instructions for [^\n]*\n\s*)?<(environment_context|INSTRUCTIONS|permissions instructions)>[\s\S]*<\/\1>\s*$/.test(text.trim());
62
+ /** v1 adapter recipes are immutable: live and frozen pointers use the same
63
+ * normalizer. One physical record projects to at most one evidence entry. */
64
+ function normalizeSource(source, record, version = 2) {
65
+ if (source.parser_version !== 1)
66
+ throw new Error('Unknown agent parser version');
67
+ if (source.agent === 'pi')
68
+ return (0, normalize_1.normalizeEntry)(record.value, version);
69
+ const r = record.value;
70
+ if (!r || typeof r !== 'object')
71
+ return null;
72
+ let value;
73
+ if (source.agent === 'codex') {
74
+ const p = r.payload;
75
+ if (r.type === 'event_msg' && p?.type === 'thread_rolled_back')
76
+ throw new Error('Codex rollback replay is not supported; scan stopped rather than treating abandoned turns as current');
77
+ const id = `record-${record.record_offset}`, timestamp = typeof r.timestamp === 'string' ? r.timestamp : '';
78
+ if (r.type === 'response_item' && p && typeof p === 'object') {
79
+ let role = '', content = '';
80
+ if (p.type === 'message' && ['user', 'assistant'].includes(p.role) && p.channel !== 'analysis') {
81
+ role = p.role;
82
+ const text = textBlocks(p.content);
83
+ content = role === 'user' && contextOnly(text) ? '' : text;
84
+ }
85
+ else if (p.type === 'function_call') {
86
+ role = 'assistant';
87
+ content = [tool(p.name, p.arguments)];
88
+ }
89
+ else if (p.type === 'custom_tool_call') {
90
+ role = 'assistant';
91
+ content = [tool(p.name, {})];
92
+ }
93
+ else if (['function_call_output', 'custom_tool_call_output'].includes(p.type)) {
94
+ role = 'toolResult';
95
+ content = textBlocks(p.output);
96
+ }
97
+ else if (p.type === 'local_shell_call') {
98
+ role = 'assistant';
99
+ content = [tool('shell', { command: Array.isArray(p.action?.command) ? p.action.command.filter((part) => typeof part === 'string').join(' ') : '' })];
100
+ }
101
+ if (role)
102
+ value = { id, timestamp, type: 'message', message: { role, content, toolName: 'Codex tool output; success not inferred', stopReason: p.status === 'incomplete' ? 'length' : undefined } };
103
+ }
104
+ else if (r.type === 'compacted' && typeof p?.message === 'string')
105
+ value = { id, timestamp, type: 'compaction', summary: p.message };
106
+ else if (r.type === 'event_msg' && p?.type === 'turn_aborted')
107
+ value = { id, timestamp, type: 'custom_message', content: '[Codex turn aborted. Earlier generated text does not establish completed work.]' };
108
+ // event_msg user_message/agent_message echo response_item messages; never
109
+ // import both. Reasoning, token counts, request context and system/developer messages are not evidence.
110
+ }
111
+ else {
112
+ if (!identifier(r.uuid))
113
+ return null;
114
+ if (r.sessionId !== undefined && r.sessionId !== source.external_id.split('/')[0])
115
+ throw new Error('Mixed Claude session identities; scan stopped rather than guessing fork attribution');
116
+ const parentId = typeof r.parentUuid === 'string' ? r.parentUuid : typeof r.logicalParentUuid === 'string' ? r.logicalParentUuid : null;
117
+ if (r.type === 'system' && r.subtype === 'compact_boundary' && !parentId)
118
+ throw new Error('Claude compaction boundary has no verified history link');
119
+ value = { id: r.uuid, parentId, timestamp: typeof r.timestamp === 'string' ? r.timestamp : '', type: String(r.type || 'metadata') };
120
+ if (['user', 'assistant'].includes(r.type) && r.message) {
121
+ if (r.isCompactSummary === true) {
122
+ value.type = 'compaction';
123
+ value.summary = textBlocks(r.message.content);
124
+ }
125
+ else if (r.isMeta !== true) {
126
+ if (typeof r.message.role === 'string' && r.message.role !== r.type)
127
+ throw new Error('Claude role attribution mismatch');
128
+ const parts = typeof r.message.content === 'string' ? [{ type: 'text', text: r.message.content }] : Array.isArray(r.message.content) ? r.message.content : [];
129
+ const blocks = [];
130
+ let results = 0, ordinary = 0;
131
+ for (const part of parts) {
132
+ if (part?.type === 'text' && typeof part.text === 'string') {
133
+ blocks.push(part);
134
+ ordinary++;
135
+ }
136
+ else if (part?.type === 'tool_use') {
137
+ blocks.push(tool(part.name, part.input));
138
+ ordinary++;
139
+ }
140
+ else if (part?.type === 'tool_result') {
141
+ blocks.push({ type: 'text', text: `Tool result (${(0, normalize_1.cleanText)(String(part.tool_use_id || 'unknown'), 150)}; ${part.is_error === true ? 'error' : 'not flagged as error'}):\n${textBlocks(part.content)}` });
142
+ results++;
143
+ }
144
+ }
145
+ value.type = 'message';
146
+ value.message = { role: results && !ordinary ? 'toolResult' : r.type, content: blocks, toolName: 'Claude tool output', stopReason: ['max_tokens', 'model_context_window_exceeded'].includes(r.message.stop_reason) ? 'length' : undefined };
147
+ }
148
+ }
149
+ }
150
+ if (!value)
151
+ return null;
152
+ const entry = (0, normalize_1.normalizeEntry)(value, version);
153
+ if (!entry)
154
+ return null;
155
+ // Agent domains prevent identical pi/Claude UUIDs from sharing review coverage.
156
+ entry.event_key = (0, normalize_1.digest)(JSON.stringify([source.agent, 1, source.agent === 'codex' ? record.record_hash : entry.event_key, entry.type, entry.role, entry.text]));
157
+ return entry;
158
+ }
159
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../src/sources/adapters.ts"],"names":[],"mappings":"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"}