draken 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/ACCEPTANCE.md +31 -0
  2. package/CHANGELOG.md +33 -0
  3. package/CONTRIBUTING.md +129 -0
  4. package/MEMORY.md +98 -0
  5. package/PERSONA.md +67 -0
  6. package/README.md +156 -78
  7. package/SETUP.md +111 -0
  8. package/SOURCES.md +75 -0
  9. package/TRAY.md +54 -0
  10. package/VOICE.md +118 -0
  11. package/dist/auth/middleware.d.ts +3 -1
  12. package/dist/auth/middleware.d.ts.map +1 -1
  13. package/dist/auth/middleware.js +20 -15
  14. package/dist/auth/middleware.js.map +1 -1
  15. package/dist/cli.js +77 -113
  16. package/dist/cli.js.map +1 -1
  17. package/dist/db/agent-migration.d.ts +7 -0
  18. package/dist/db/agent-migration.d.ts.map +1 -0
  19. package/dist/db/agent-migration.js +36 -0
  20. package/dist/db/agent-migration.js.map +1 -0
  21. package/dist/db/evidence.d.ts +37 -0
  22. package/dist/db/evidence.d.ts.map +1 -0
  23. package/dist/db/evidence.js +110 -0
  24. package/dist/db/evidence.js.map +1 -0
  25. package/dist/db/pointer-migration.d.ts +7 -0
  26. package/dist/db/pointer-migration.d.ts.map +1 -0
  27. package/dist/db/pointer-migration.js +117 -0
  28. package/dist/db/pointer-migration.js.map +1 -0
  29. package/dist/db/retained-text.d.ts +8 -0
  30. package/dist/db/retained-text.d.ts.map +1 -0
  31. package/dist/db/retained-text.js +36 -0
  32. package/dist/db/retained-text.js.map +1 -0
  33. package/dist/db/schema.d.ts +1 -5
  34. package/dist/db/schema.d.ts.map +1 -1
  35. package/dist/db/schema.js +200 -55
  36. package/dist/db/schema.js.map +1 -1
  37. package/dist/db/snapshot-pointers.d.ts +5 -0
  38. package/dist/db/snapshot-pointers.d.ts.map +1 -0
  39. package/dist/db/snapshot-pointers.js +174 -0
  40. package/dist/db/snapshot-pointers.js.map +1 -0
  41. package/dist/memory/automatic.d.ts +38 -0
  42. package/dist/memory/automatic.d.ts.map +1 -0
  43. package/dist/memory/automatic.js +155 -0
  44. package/dist/memory/automatic.js.map +1 -0
  45. package/dist/memory/context.d.ts +12 -0
  46. package/dist/memory/context.d.ts.map +1 -0
  47. package/dist/memory/context.js +59 -0
  48. package/dist/memory/context.js.map +1 -0
  49. package/dist/memory/embedding-pool.d.ts +28 -0
  50. package/dist/memory/embedding-pool.d.ts.map +1 -0
  51. package/dist/memory/embedding-pool.js +135 -0
  52. package/dist/memory/embedding-pool.js.map +1 -0
  53. package/dist/memory/embedding-worker.d.ts +2 -0
  54. package/dist/memory/embedding-worker.d.ts.map +1 -0
  55. package/dist/memory/embedding-worker.js +32 -0
  56. package/dist/memory/embedding-worker.js.map +1 -0
  57. package/dist/memory/index.d.ts +26 -0
  58. package/dist/memory/index.d.ts.map +1 -0
  59. package/dist/memory/index.js +283 -0
  60. package/dist/memory/index.js.map +1 -0
  61. package/dist/memory/model.d.ts +15 -0
  62. package/dist/memory/model.d.ts.map +1 -0
  63. package/dist/memory/model.js +152 -0
  64. package/dist/memory/model.js.map +1 -0
  65. package/dist/memory/service.d.ts +8 -0
  66. package/dist/memory/service.d.ts.map +1 -0
  67. package/dist/memory/service.js +217 -0
  68. package/dist/memory/service.js.map +1 -0
  69. package/dist/memory/sources.d.ts +15 -0
  70. package/dist/memory/sources.d.ts.map +1 -0
  71. package/dist/memory/sources.js +87 -0
  72. package/dist/memory/sources.js.map +1 -0
  73. package/dist/memory/stamps.d.ts +13 -0
  74. package/dist/memory/stamps.d.ts.map +1 -0
  75. package/dist/memory/stamps.js +101 -0
  76. package/dist/memory/stamps.js.map +1 -0
  77. package/dist/memory/storage.d.ts +5 -0
  78. package/dist/memory/storage.d.ts.map +1 -0
  79. package/dist/memory/storage.js +107 -0
  80. package/dist/memory/storage.js.map +1 -0
  81. package/dist/memory/types.d.ts +68 -0
  82. package/dist/memory/types.d.ts.map +1 -0
  83. package/dist/memory/types.js +8 -0
  84. package/dist/memory/types.js.map +1 -0
  85. package/dist/memory/worker.d.ts +2 -0
  86. package/dist/memory/worker.d.ts.map +1 -0
  87. package/dist/memory/worker.js +82 -0
  88. package/dist/memory/worker.js.map +1 -0
  89. package/dist/npm-cli.d.ts +4 -0
  90. package/dist/npm-cli.d.ts.map +1 -0
  91. package/dist/npm-cli.js +36 -0
  92. package/dist/npm-cli.js.map +1 -0
  93. package/dist/pi/runtime.d.ts +34 -0
  94. package/dist/pi/runtime.d.ts.map +1 -0
  95. package/dist/pi/runtime.js +210 -0
  96. package/dist/pi/runtime.js.map +1 -0
  97. package/dist/pi/setup.d.ts +5 -0
  98. package/dist/pi/setup.d.ts.map +1 -0
  99. package/dist/pi/setup.js +147 -0
  100. package/dist/pi/setup.js.map +1 -0
  101. package/dist/routes/auth.d.ts.map +1 -1
  102. package/dist/routes/auth.js +3 -1
  103. package/dist/routes/auth.js.map +1 -1
  104. package/dist/routes/live-voice.d.ts +3 -0
  105. package/dist/routes/live-voice.d.ts.map +1 -0
  106. package/dist/routes/live-voice.js +49 -0
  107. package/dist/routes/live-voice.js.map +1 -0
  108. package/dist/routes/{browse.d.ts → memory.d.ts} +1 -1
  109. package/dist/routes/memory.d.ts.map +1 -0
  110. package/dist/routes/memory.js +18 -0
  111. package/dist/routes/memory.js.map +1 -0
  112. package/dist/routes/{tasks.d.ts → sync.d.ts} +1 -1
  113. package/dist/routes/sync.d.ts.map +1 -0
  114. package/dist/routes/sync.js +127 -0
  115. package/dist/routes/sync.js.map +1 -0
  116. package/dist/routes/{projects.d.ts → voice.d.ts} +1 -1
  117. package/dist/routes/voice.d.ts.map +1 -0
  118. package/dist/routes/voice.js +35 -0
  119. package/dist/routes/voice.js.map +1 -0
  120. package/dist/server-state.d.ts +30 -0
  121. package/dist/server-state.d.ts.map +1 -0
  122. package/dist/server-state.js +113 -0
  123. package/dist/server-state.js.map +1 -0
  124. package/dist/server-status.d.ts +7 -0
  125. package/dist/server-status.d.ts.map +1 -0
  126. package/dist/server-status.js +34 -0
  127. package/dist/server-status.js.map +1 -0
  128. package/dist/server.d.ts +5 -1
  129. package/dist/server.d.ts.map +1 -1
  130. package/dist/server.js +148 -46
  131. package/dist/server.js.map +1 -1
  132. package/dist/sources/adapters.d.ts +15 -0
  133. package/dist/sources/adapters.d.ts.map +1 -0
  134. package/dist/sources/adapters.js +159 -0
  135. package/dist/sources/adapters.js.map +1 -0
  136. package/dist/sources/registry.d.ts +17 -0
  137. package/dist/sources/registry.d.ts.map +1 -0
  138. package/dist/sources/registry.js +56 -0
  139. package/dist/sources/registry.js.map +1 -0
  140. package/dist/sync/collector.d.ts +3 -0
  141. package/dist/sync/collector.d.ts.map +1 -0
  142. package/dist/sync/collector.js +284 -0
  143. package/dist/sync/collector.js.map +1 -0
  144. package/dist/sync/cost.d.ts +7 -0
  145. package/dist/sync/cost.d.ts.map +1 -0
  146. package/dist/sync/cost.js +31 -0
  147. package/dist/sync/cost.js.map +1 -0
  148. package/dist/sync/jsonl.d.ts +34 -0
  149. package/dist/sync/jsonl.d.ts.map +1 -0
  150. package/dist/sync/jsonl.js +161 -0
  151. package/dist/sync/jsonl.js.map +1 -0
  152. package/dist/sync/manager.d.ts +12 -0
  153. package/dist/sync/manager.d.ts.map +1 -0
  154. package/dist/sync/manager.js +211 -0
  155. package/dist/sync/manager.js.map +1 -0
  156. package/dist/sync/normalize.d.ts +22 -0
  157. package/dist/sync/normalize.d.ts.map +1 -0
  158. package/dist/sync/normalize.js +107 -0
  159. package/dist/sync/normalize.js.map +1 -0
  160. package/dist/sync/pi-output.d.ts +33 -0
  161. package/dist/sync/pi-output.d.ts.map +1 -0
  162. package/dist/sync/pi-output.js +186 -0
  163. package/dist/sync/pi-output.js.map +1 -0
  164. package/dist/sync/pi.d.ts +15 -0
  165. package/dist/sync/pi.d.ts.map +1 -0
  166. package/dist/sync/pi.js +149 -0
  167. package/dist/sync/pi.js.map +1 -0
  168. package/dist/sync/recap.d.ts +25 -0
  169. package/dist/sync/recap.d.ts.map +1 -0
  170. package/dist/sync/recap.js +118 -0
  171. package/dist/sync/recap.js.map +1 -0
  172. package/dist/sync/references.d.ts +10 -0
  173. package/dist/sync/references.d.ts.map +1 -0
  174. package/dist/sync/references.js +50 -0
  175. package/dist/sync/references.js.map +1 -0
  176. package/dist/sync/source-files.d.ts +16 -0
  177. package/dist/sync/source-files.d.ts.map +1 -0
  178. package/dist/sync/source-files.js +56 -0
  179. package/dist/sync/source-files.js.map +1 -0
  180. package/dist/sync/store.d.ts +36 -0
  181. package/dist/sync/store.d.ts.map +1 -0
  182. package/dist/sync/store.js +359 -0
  183. package/dist/sync/store.js.map +1 -0
  184. package/dist/sync/summary-budget.d.ts +19 -0
  185. package/dist/sync/summary-budget.d.ts.map +1 -0
  186. package/dist/sync/summary-budget.js +39 -0
  187. package/dist/sync/summary-budget.js.map +1 -0
  188. package/dist/sync/tree.d.ts +69 -0
  189. package/dist/sync/tree.d.ts.map +1 -0
  190. package/dist/sync/tree.js +599 -0
  191. package/dist/sync/tree.js.map +1 -0
  192. package/dist/tray/controller.d.ts +51 -0
  193. package/dist/tray/controller.d.ts.map +1 -0
  194. package/dist/tray/controller.js +178 -0
  195. package/dist/tray/controller.js.map +1 -0
  196. package/dist/tray/launcher.d.ts +3 -0
  197. package/dist/tray/launcher.d.ts.map +1 -0
  198. package/dist/tray/launcher.js +47 -0
  199. package/dist/tray/launcher.js.map +1 -0
  200. package/dist/tray/native.d.ts +12 -0
  201. package/dist/tray/native.d.ts.map +1 -0
  202. package/dist/tray/native.js +93 -0
  203. package/dist/tray/native.js.map +1 -0
  204. package/dist/tray/processes.d.ts +5 -0
  205. package/dist/tray/processes.d.ts.map +1 -0
  206. package/dist/tray/processes.js +99 -0
  207. package/dist/tray/processes.js.map +1 -0
  208. package/dist/tray/worker.d.ts +4 -0
  209. package/dist/tray/worker.d.ts.map +1 -0
  210. package/dist/tray/worker.js +150 -0
  211. package/dist/tray/worker.js.map +1 -0
  212. package/dist/types.d.ts +212 -20
  213. package/dist/types.d.ts.map +1 -1
  214. package/dist/voice/continuation.d.ts +25 -0
  215. package/dist/voice/continuation.d.ts.map +1 -0
  216. package/dist/voice/continuation.js +94 -0
  217. package/dist/voice/continuation.js.map +1 -0
  218. package/dist/voice/legacy-history.d.ts +5 -0
  219. package/dist/voice/legacy-history.d.ts.map +1 -0
  220. package/dist/voice/legacy-history.js +34 -0
  221. package/dist/voice/legacy-history.js.map +1 -0
  222. package/dist/voice/live-context.d.ts +14 -0
  223. package/dist/voice/live-context.d.ts.map +1 -0
  224. package/dist/voice/live-context.js +137 -0
  225. package/dist/voice/live-context.js.map +1 -0
  226. package/dist/voice/live.d.ts +37 -0
  227. package/dist/voice/live.d.ts.map +1 -0
  228. package/dist/voice/live.js +448 -0
  229. package/dist/voice/live.js.map +1 -0
  230. package/package.json +49 -16
  231. package/public/assets/index-CYz_kpAp.js +126 -0
  232. package/public/assets/index-DmRid5xE.css +1 -0
  233. package/public/assets/index-Ymd62i3g.js +40 -0
  234. package/public/assets/persona-C_m1CVKe.css +1 -0
  235. package/public/assets/persona-XbLvCqRT.js +1 -0
  236. package/public/assets/scene-CBV2oPhA.js +3854 -0
  237. package/public/index.html +6 -8
  238. package/public/persona/THREE-LICENSE.txt +21 -0
  239. package/public/persona/call-poster.webp +0 -0
  240. package/public/persona/reference.jpg +0 -0
  241. package/public/persona/sample.wav +0 -0
  242. package/public/persona.html +7 -0
  243. package/runtime/pi/package-lock.json +1549 -0
  244. package/runtime/pi/package.json +12 -0
  245. package/tests/fixtures/voice-question.wav +0 -0
  246. package/tray/assets/error.ico +0 -0
  247. package/tray/assets/error.png +0 -0
  248. package/tray/assets/running.ico +0 -0
  249. package/tray/assets/running.png +0 -0
  250. package/tray/assets/starting.ico +0 -0
  251. package/tray/assets/starting.png +0 -0
  252. package/tray/assets/stopped.ico +0 -0
  253. package/tray/assets/stopped.png +0 -0
  254. package/tray/assets/stopping.ico +0 -0
  255. package/tray/assets/stopping.png +0 -0
  256. package/tray/macos.js +72 -0
  257. package/tray/windows.ps1 +104 -0
  258. package/voice/realtime/README.md +84 -0
  259. package/voice/realtime/backend.mjs +81 -0
  260. package/voice/realtime/native.mjs +210 -0
  261. package/voice/realtime/peer.d.mts +15 -0
  262. package/voice/realtime/peer.mjs +116 -0
  263. package/voice/realtime/probe-browser.mjs +81 -0
  264. package/voice/realtime/probe-server.mjs +86 -0
  265. package/voice/realtime/probe.html +11 -0
  266. package/voice/realtime/probe.mjs +42 -0
  267. package/voice/realtime/rpc.mjs +118 -0
  268. package/voice/realtime/setup.mjs +32 -0
  269. package/voice/tls.mjs +49 -0
  270. package/dist/db/queries.d.ts +0 -16
  271. package/dist/db/queries.d.ts.map +0 -1
  272. package/dist/db/queries.js +0 -91
  273. package/dist/db/queries.js.map +0 -1
  274. package/dist/docker/dockerfile.d.ts +0 -50
  275. package/dist/docker/dockerfile.d.ts.map +0 -1
  276. package/dist/docker/dockerfile.js +0 -160
  277. package/dist/docker/dockerfile.js.map +0 -1
  278. package/dist/docker/manager.d.ts +0 -42
  279. package/dist/docker/manager.d.ts.map +0 -1
  280. package/dist/docker/manager.js +0 -421
  281. package/dist/docker/manager.js.map +0 -1
  282. package/dist/git/status.d.ts +0 -76
  283. package/dist/git/status.d.ts.map +0 -1
  284. package/dist/git/status.js +0 -332
  285. package/dist/git/status.js.map +0 -1
  286. package/dist/routes/browse.d.ts.map +0 -1
  287. package/dist/routes/browse.js +0 -49
  288. package/dist/routes/browse.js.map +0 -1
  289. package/dist/routes/git.d.ts +0 -9
  290. package/dist/routes/git.d.ts.map +0 -1
  291. package/dist/routes/git.js +0 -338
  292. package/dist/routes/git.js.map +0 -1
  293. package/dist/routes/projects.d.ts.map +0 -1
  294. package/dist/routes/projects.js +0 -220
  295. package/dist/routes/projects.js.map +0 -1
  296. package/dist/routes/tasks.d.ts.map +0 -1
  297. package/dist/routes/tasks.js +0 -313
  298. package/dist/routes/tasks.js.map +0 -1
  299. package/draken.dockerfile.template +0 -18
  300. package/public/assets/index-3ngsG5kF.css +0 -1
  301. package/public/assets/index-B3YSD0ee.js +0 -252
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.digest = digest;
4
+ exports.sourceKey = sourceKey;
5
+ exports.cleanText = cleanText;
6
+ exports.normalizeEntry = normalizeEntry;
7
+ const crypto_1 = require("crypto");
8
+ function digest(value) {
9
+ return (0, crypto_1.createHash)('sha256').update(value).digest('hex');
10
+ }
11
+ // Stable across sync-local E/C references, but changes when a context edit changes the excerpt.
12
+ function sourceKey(item) {
13
+ if (item.unavailable && /^K[a-f0-9]{20}$/.test(item.source_key || ''))
14
+ return item.source_key;
15
+ return `K${digest(JSON.stringify([item.event_key, item.text])).slice(0, 20)}`;
16
+ }
17
+ /** Version 1 is read-only compatibility for existing evidence, never new imports.
18
+ * Keep these recipes stable: pointers must reconstruct exactly their old view.
19
+ * Best-effort minimization, NOT a guarantee of secret-free text. */
20
+ function cleanText(value, limit = 6000, version = 2) {
21
+ if (version !== 1 && version !== 2)
22
+ throw new Error('Unknown evidence normalization version');
23
+ let clean = value
24
+ .replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '')
25
+ .replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?-----END [^-]*PRIVATE KEY-----/g, '[private key redacted]')
26
+ .replace(/\b(?:sk-(?:proj-)?[A-Za-z0-9_-]{16,}|gh[pousr]_[A-Za-z0-9_]{20,}|github_pat_[A-Za-z0-9_]{20,})\b/g, '[token redacted]')
27
+ .replace(/\bBearer\s+[A-Za-z0-9._~+/-]+=*/gi, 'Bearer [redacted]');
28
+ if (version === 2)
29
+ clean = clean.replace(/(\b(?:password|api[_-]?key|access[_-]?token|secret)\b(?:\*\*|__)?\s*[:=](?:\*\*|__)?\s*`)[^`\r\n]{6,}(`)/gi, '$1[redacted]$2');
30
+ clean = clean.replace(/(\b(?:[a-z0-9]+_)*(?:authorization|api[_-]?key|access[_-]?token|password|secret|secret_access_key)\b["']?\s*[:=]\s*["']?)([^\s"',}]{6,})/gi, '$1[redacted]')
31
+ .replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f]/g, '');
32
+ return clean.length > limit ? `${clean.slice(0, limit)}\n[excerpt truncated]` : clean;
33
+ }
34
+ function contentText(content, version) {
35
+ if (typeof content === 'string')
36
+ return cleanText(content, 6000, version);
37
+ if (!Array.isArray(content))
38
+ return '';
39
+ const blocks = [];
40
+ for (const block of content) {
41
+ if (!block || typeof block !== 'object')
42
+ continue;
43
+ if (block.type === 'text' && typeof block.text === 'string')
44
+ blocks.push(block.text);
45
+ if (block.type === 'toolCall') {
46
+ // Capture intent/paths, not write-file contents or arbitrary tool payloads.
47
+ const args = block.arguments || {};
48
+ const selected = {};
49
+ for (const key of ['path', 'file_path', 'command', 'pattern', 'query', 'description']) {
50
+ if (typeof args[key] === 'string')
51
+ selected[key] = cleanText(args[key], 1200, version);
52
+ }
53
+ blocks.push(`Tool requested: ${String(block.name)} ${JSON.stringify(selected)}`);
54
+ }
55
+ // Never index thinking, signatures, image/audio data, or system instructions.
56
+ }
57
+ return cleanText(blocks.join('\n'), 6000, version);
58
+ }
59
+ function normalizeEntry(entry, version = 2) {
60
+ if (!entry || typeof entry.id !== 'string' || typeof entry.type !== 'string')
61
+ return null;
62
+ const type = entry.type;
63
+ let role = type;
64
+ let text = '';
65
+ let isActivity = false;
66
+ if (type === 'message' && entry.message) {
67
+ const message = entry.message;
68
+ role = String(message.role || 'unknown');
69
+ if (['user', 'assistant', 'toolResult', 'custom'].includes(role)) {
70
+ text = contentText(message.content, version);
71
+ if (role === 'toolResult' && text) {
72
+ text = `Tool result (${String(message.toolName || 'unknown')}; ${message.isError ? 'error' : 'not flagged as error'}):\n${text}`;
73
+ }
74
+ if (role === 'assistant' && ['error', 'aborted', 'length'].includes(message.stopReason)) {
75
+ text += `\n[Assistant stop reason: ${message.stopReason}]`;
76
+ }
77
+ }
78
+ else if (role === 'bashExecution' && !message.excludeFromContext) {
79
+ text = cleanText(`Command: ${message.command || ''}\nExit code: ${message.exitCode ?? 'unknown'}\n${message.output || ''}`, 6000, version);
80
+ }
81
+ isActivity = Boolean(text);
82
+ }
83
+ else if (type === 'custom_message') {
84
+ text = contentText(entry.content, version);
85
+ isActivity = Boolean(text);
86
+ }
87
+ else if (type === 'compaction' || type === 'branch_summary') {
88
+ text = cleanText(typeof entry.summary === 'string' ? entry.summary : '', 6000, version);
89
+ // Summaries are background, never new accomplishments.
90
+ }
91
+ const timestamp = typeof entry.timestamp === 'string' ? entry.timestamp : '';
92
+ const parentId = typeof entry.parentId === 'string' ? entry.parentId : null;
93
+ return {
94
+ entry_id: entry.id,
95
+ parent_id: parentId,
96
+ timestamp,
97
+ type,
98
+ role,
99
+ text: cleanText(text, 6000, version),
100
+ // Forks copy entries. Identity across sessions prevents re-briefing inherited history.
101
+ event_key: digest(JSON.stringify([entry.id, parentId, timestamp, type, role, text])),
102
+ is_activity: Number(isActivity),
103
+ target_id: type === 'context_edit' && typeof entry.targetId === 'string' ? entry.targetId : null,
104
+ replacement: type === 'context_edit' && entry.replacement !== null ? contentText(entry.replacement, version) : null,
105
+ };
106
+ }
107
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/sync/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { PiAccounting } from '../types';
2
+ /** Strict LF-framed pi JSON protocol. Retains answer text and numeric accounting,
3
+ * never prompts, thinking, signatures, raw events or provider error payloads. */
4
+ export declare class PiOutput {
5
+ private maxOutput;
6
+ private byteLimit;
7
+ private pending;
8
+ private wireBytes;
9
+ private active;
10
+ private settled;
11
+ private aborted;
12
+ private streamedChars;
13
+ private streamedBytes;
14
+ private latest?;
15
+ private lastEnd;
16
+ private answer;
17
+ private stopReason;
18
+ private error;
19
+ private incomplete;
20
+ private priced;
21
+ private unpriced;
22
+ private usd;
23
+ private totals;
24
+ private models;
25
+ constructor(maxOutput: number, byteLimit: boolean);
26
+ private outputLimit;
27
+ push(chunk: string): void;
28
+ private add;
29
+ private event;
30
+ finish(transportComplete: boolean): PiAccounting;
31
+ result(): string;
32
+ }
33
+ //# sourceMappingURL=pi-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-output.d.ts","sourceRoot":"","sources":["../../src/sync/pi-output.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAkB7C;iFACiF;AACjF,qBAAa,QAAQ;IAmBP,OAAO,CAAC,SAAS;IAAU,OAAO,CAAC,SAAS;IAlBxD,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAAC,CAAQ;IACvB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,MAAM,CAAwE;IACtF,OAAO,CAAC,MAAM,CAAqB;gBACf,SAAS,EAAE,MAAM,EAAU,SAAS,EAAE,OAAO;IACjE,OAAO,CAAC,WAAW;IAGnB,IAAI,CAAC,KAAK,EAAE,MAAM;IAclB,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,KAAK;IAsCb,MAAM,CAAC,iBAAiB,EAAE,OAAO,GAAG,YAAY;IAMhD,MAAM,IAAI,MAAM;CAMjB"}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PiOutput = void 0;
4
+ const crypto_1 = require("crypto");
5
+ const count = (value) => Number.isSafeInteger(value) && value >= 0;
6
+ function usage(value) {
7
+ if (!value || !['input', 'output', 'cacheRead', 'cacheWrite'].every(key => count(value[key])))
8
+ return;
9
+ const reasoning = value.reasoning ?? 0;
10
+ if (!count(reasoning) || reasoning > value.output)
11
+ return;
12
+ const total = value.input + value.output + value.cacheRead + value.cacheWrite;
13
+ if (!Number.isSafeInteger(total) || total === 0)
14
+ return; // Pi also emits zero-filled unknown usage.
15
+ const costs = value.cost, fields = ['input', 'output', 'cacheRead', 'cacheWrite', 'total'];
16
+ const valid = costs && fields.every(key => typeof costs[key] === 'number' && Number.isFinite(costs[key]) && costs[key] >= 0 && costs[key] <= 1e6);
17
+ const sum = valid ? costs.input + costs.output + costs.cacheRead + costs.cacheWrite : 0;
18
+ // Zero catalog rates are indistinguishable from unavailable pricing here.
19
+ const usd = valid && costs.total > 0 && Math.abs(sum - costs.total) <= Math.max(1e-9, costs.total * 1e-6) ? costs.total : null;
20
+ return { input: value.input, output: value.output, cacheRead: value.cacheRead, cacheWrite: value.cacheWrite, reasoning, usd };
21
+ }
22
+ /** Strict LF-framed pi JSON protocol. Retains answer text and numeric accounting,
23
+ * never prompts, thinking, signatures, raw events or provider error payloads. */
24
+ class PiOutput {
25
+ maxOutput;
26
+ byteLimit;
27
+ pending = '';
28
+ wireBytes = 0;
29
+ active = false;
30
+ settled = false;
31
+ aborted = false;
32
+ streamedChars = 0;
33
+ streamedBytes = 0;
34
+ latest;
35
+ lastEnd = '';
36
+ answer = '';
37
+ stopReason = '';
38
+ error = '';
39
+ incomplete = false;
40
+ priced = 0;
41
+ unpriced = 0;
42
+ usd = 0;
43
+ totals = { input: 0, output: 0, cache_read: 0, cache_write: 0, reasoning: 0 };
44
+ models = new Set();
45
+ constructor(maxOutput, byteLimit) {
46
+ this.maxOutput = maxOutput;
47
+ this.byteLimit = byteLimit;
48
+ }
49
+ outputLimit(text) {
50
+ if ((this.byteLimit ? Buffer.byteLength(text) : text.length) > this.maxOutput)
51
+ throw new Error('pi produced too much output. No incomplete result was saved.');
52
+ }
53
+ push(chunk) {
54
+ this.wireBytes += Buffer.byteLength(chunk);
55
+ if (this.wireBytes > 64 * 1024 ** 2)
56
+ throw new Error('pi JSON stream exceeded its safety limit');
57
+ this.pending += chunk;
58
+ let at;
59
+ while ((at = this.pending.indexOf('\n')) >= 0) {
60
+ const line = this.pending.slice(0, at).replace(/\r$/, '');
61
+ this.pending = this.pending.slice(at + 1);
62
+ if (Buffer.byteLength(line) > 8 * 1024 ** 2)
63
+ throw new Error('pi JSON record exceeded its safety limit');
64
+ if (!line.trim())
65
+ continue;
66
+ let event;
67
+ try {
68
+ event = JSON.parse(line);
69
+ }
70
+ catch {
71
+ throw new Error('Invalid pi JSON event stream');
72
+ }
73
+ this.event(event);
74
+ }
75
+ if (Buffer.byteLength(this.pending) > 8 * 1024 ** 2)
76
+ throw new Error('pi JSON record exceeded its safety limit');
77
+ }
78
+ add(value) {
79
+ if (this.priced + this.unpriced >= 512)
80
+ throw new Error('Too many pi usage records');
81
+ if (value && ![this.totals.input + value.input, this.totals.output + value.output, this.totals.cache_read + value.cacheRead, this.totals.cache_write + value.cacheWrite].every(count))
82
+ value = undefined;
83
+ if (!value) {
84
+ this.unpriced++;
85
+ return;
86
+ }
87
+ this.totals.input += value.input;
88
+ this.totals.output += value.output;
89
+ this.totals.cache_read += value.cacheRead;
90
+ this.totals.cache_write += value.cacheWrite;
91
+ this.totals.reasoning += value.reasoning;
92
+ if (value.usd === null)
93
+ this.unpriced++;
94
+ else {
95
+ this.priced++;
96
+ this.usd += value.usd;
97
+ }
98
+ }
99
+ event(event) {
100
+ if (!event || typeof event.type !== 'string')
101
+ throw new Error('Invalid pi JSON event');
102
+ if (event.type.startsWith('tool_execution_'))
103
+ throw new Error('Unexpected tool activity in tool-free pi invocation');
104
+ if (event.type === 'agent_start') {
105
+ this.settled = false;
106
+ return;
107
+ }
108
+ if (event.type === 'message_start' && event.message?.role === 'assistant') {
109
+ if (this.active)
110
+ throw new Error('Overlapping pi assistant messages');
111
+ this.active = true;
112
+ this.latest = undefined;
113
+ this.streamedChars = this.streamedBytes = 0;
114
+ this.settled = false;
115
+ }
116
+ else if (event.type === 'message_update') {
117
+ if (!this.active)
118
+ throw new Error('Unexpected pi assistant update');
119
+ this.latest = usage(event.usage) || this.latest;
120
+ const update = event.assistantMessageEvent;
121
+ if (update?.type === 'text_delta') {
122
+ if (typeof update.delta !== 'string')
123
+ throw new Error('Invalid pi text delta');
124
+ this.streamedChars += update.delta.length;
125
+ this.streamedBytes += Buffer.byteLength(update.delta);
126
+ if ((this.byteLimit ? this.streamedBytes : this.streamedChars) > this.maxOutput)
127
+ throw new Error('pi produced too much output. No incomplete result was saved.');
128
+ }
129
+ }
130
+ else if (event.type === 'message_end' && event.message?.role === 'assistant') {
131
+ const message = event.message, key = (0, crypto_1.createHash)('sha256').update(JSON.stringify(message)).digest('hex');
132
+ if (!this.active && key === this.lastEnd)
133
+ return; // Never count a repeated final event twice.
134
+ if (!this.active)
135
+ throw new Error('Unexpected pi assistant completion');
136
+ this.active = false;
137
+ this.lastEnd = key;
138
+ this.add(usage(message.usage));
139
+ this.latest = undefined;
140
+ if (this.models.size < 32 && [message.provider, message.model].every(value => typeof value === 'string' && /^[\w./:@+-]{1,160}$/.test(value)))
141
+ this.models.add(`${message.provider}/${message.model}`);
142
+ if (!Array.isArray(message.content))
143
+ throw new Error('Invalid pi assistant content');
144
+ const text = message.content.filter((part) => part.type === 'text').map((part) => {
145
+ if (typeof part.text !== 'string')
146
+ throw new Error('Invalid pi assistant text');
147
+ return part.text;
148
+ }).join('');
149
+ this.outputLimit(text);
150
+ this.answer = text;
151
+ this.stopReason = message.stopReason;
152
+ this.error = typeof message.errorMessage === 'string' ? message.errorMessage.slice(0, 1500) : '';
153
+ }
154
+ else if (event.type === 'compaction_end') {
155
+ this.add(usage(event.result?.usage));
156
+ }
157
+ else if (event.type === 'agent_settled') {
158
+ if (typeof event.aborted !== 'boolean')
159
+ throw new Error('Invalid pi settlement');
160
+ this.settled = true;
161
+ this.aborted = event.aborted;
162
+ }
163
+ // message/turn/agent_end repeat the same response: account only message_end.
164
+ }
165
+ finish(transportComplete) {
166
+ if (this.active) {
167
+ this.add(this.latest);
168
+ this.active = false;
169
+ this.incomplete = true;
170
+ }
171
+ const complete = transportComplete && !this.pending.trim() && this.settled && !this.aborted && !this.incomplete && this.unpriced === 0 && this.priced > 0;
172
+ return { source: 'pi-usage/catalog-pricing', cost_usd: this.priced ? this.usd : null, complete,
173
+ responses: this.priced + this.unpriced, tokens: { ...this.totals }, models: [...this.models] };
174
+ }
175
+ result() {
176
+ if (this.pending.trim() || !this.settled || this.incomplete)
177
+ throw new Error('pi ended before its JSON run settled. No incomplete result was saved.');
178
+ if (this.aborted || this.stopReason !== 'stop')
179
+ throw new Error(this.error || `pi response ended with ${this.aborted ? 'aborted' : this.stopReason || 'no completed message'}. No incomplete result was saved.`);
180
+ if (!this.answer.trim())
181
+ throw new Error('pi returned no response. Coverage did not advance.');
182
+ return this.answer.trim();
183
+ }
184
+ }
185
+ exports.PiOutput = PiOutput;
186
+ //# sourceMappingURL=pi-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi-output.js","sourceRoot":"","sources":["../../src/sync/pi-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { PiAccounting } from '../types';
2
+ export interface PiRequest {
3
+ system: string;
4
+ model?: string;
5
+ signal?: AbortSignal;
6
+ thinking?: 'off' | 'low' | 'medium';
7
+ timeoutMs?: number;
8
+ largeSummary?: boolean;
9
+ onAccounting?(accounting: PiAccounting): void;
10
+ }
11
+ export declare function stopManagerProcesses(): void;
12
+ /** One tool-free invocation, without a shell. The user payload uses stdin;
13
+ * the fixed system prompt is a CLI argument. */
14
+ export declare function invokePi(prompt: string, request: PiRequest): Promise<string>;
15
+ //# sourceMappingURL=pi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../src/sync/pi.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG7C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,CAAC,UAAU,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/C;AAGD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED;gDACgD;AAChD,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAqFlF"}
@@ -0,0 +1,149 @@
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.stopManagerProcesses = stopManagerProcesses;
7
+ exports.invokePi = invokePi;
8
+ const child_process_1 = require("child_process");
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const schema_1 = require("../db/schema");
12
+ const normalize_1 = require("./normalize");
13
+ const store_1 = require("./store");
14
+ const summary_budget_1 = require("./summary-budget");
15
+ const pi_output_1 = require("./pi-output");
16
+ const runtime_1 = require("../pi/runtime");
17
+ const children = new Set();
18
+ function stopManagerProcesses() {
19
+ for (const child of children)
20
+ child.kill('SIGTERM');
21
+ }
22
+ /** One tool-free invocation, without a shell. The user payload uses stdin;
23
+ * the fixed system prompt is a CLI argument. */
24
+ async function invokePi(prompt, request) {
25
+ if (request.signal?.aborted)
26
+ throw new store_1.HttpError(409, 'Generation cancelled');
27
+ const large = request.largeSummary === true;
28
+ if (large && !(0, summary_budget_1.isBatchSummaryModel)(request.model))
29
+ throw new store_1.HttpError(400, 'Large summary requests require the configured Luna model.');
30
+ if (large ? Buffer.byteLength(prompt) + Buffer.byteLength(request.system) > summary_budget_1.LUNA_BATCH.requestBytes : prompt.length > 300000) {
31
+ throw new store_1.HttpError(400, 'Model input exceeds the safety limit; no evidence was marked covered.');
32
+ }
33
+ if (large && (0, summary_budget_1.promptTokens)(prompt, request.system) > summary_budget_1.LUNA_BATCH.requestTokens)
34
+ throw new store_1.HttpError(400, 'Summary request exceeds its token safety budget; no evidence was marked covered.');
35
+ const cwd = path_1.default.join((0, schema_1.getDataDir)(), 'manager');
36
+ fs_1.default.mkdirSync(cwd, { recursive: true, mode: 0o700 });
37
+ const args = [
38
+ '--print', ...(request.onAccounting ? ['--mode', 'json'] : []), ...runtime_1.isolatedFlags,
39
+ '--thinking', request.thinking || 'low', '--system-prompt', request.system,
40
+ ];
41
+ if (request.model)
42
+ args.push('--model', request.model);
43
+ let pi;
44
+ try {
45
+ pi = (0, runtime_1.selectedPi)();
46
+ }
47
+ catch {
48
+ throw new store_1.HttpError(503, 'Private pi is unavailable. Run draken setup, then draken login. No other runtime was substituted.');
49
+ }
50
+ return new Promise((resolve, reject) => {
51
+ const child = (0, child_process_1.spawn)(pi.binary, [...pi.prefix, ...args], { cwd, env: pi.env, stdio: ['pipe', 'pipe', 'pipe'], shell: false });
52
+ children.add(child);
53
+ const structured = request.onAccounting ? new pi_output_1.PiOutput(large ? summary_budget_1.LUNA_BATCH.outputBytes : 64000, large) : undefined;
54
+ let closed = false;
55
+ let stdout = '';
56
+ let outputBytes = 0;
57
+ let stderr = '';
58
+ let failure = '';
59
+ let killTimer;
60
+ const terminate = (message) => {
61
+ if (failure)
62
+ return;
63
+ failure = message;
64
+ child.kill('SIGTERM');
65
+ killTimer = setTimeout(() => child.kill('SIGKILL'), 1500);
66
+ killTimer.unref();
67
+ };
68
+ const abort = () => terminate('Generation cancelled. Completed summaries were cached; coverage did not advance.');
69
+ request.signal?.addEventListener('abort', abort, { once: true });
70
+ if (request.signal?.aborted)
71
+ abort();
72
+ const configured = Number(request.timeoutMs ?? process.env.DRAKEN_PI_TIMEOUT_MS ?? 180000);
73
+ const timeout = setTimeout(() => terminate('pi timed out. Retry to reuse completed summaries.'), Number.isFinite(configured) ? Math.max(1000, Math.min(configured, 600000)) : 180000);
74
+ const cleanup = () => {
75
+ clearTimeout(timeout);
76
+ if (killTimer)
77
+ clearTimeout(killTimer);
78
+ request.signal?.removeEventListener('abort', abort);
79
+ children.delete(child);
80
+ };
81
+ const reportAccounting = (complete) => {
82
+ try {
83
+ if (structured)
84
+ request.onAccounting(structured.finish(complete));
85
+ return true;
86
+ }
87
+ catch {
88
+ reject(new store_1.HttpError(502, 'Cannot retain pi usage metadata'));
89
+ return false;
90
+ }
91
+ };
92
+ child.stdout.setEncoding('utf8');
93
+ child.stderr.setEncoding('utf8');
94
+ child.stdout.on('data', (chunk) => {
95
+ if (failure)
96
+ return;
97
+ if (structured) {
98
+ try {
99
+ structured.push(chunk);
100
+ }
101
+ catch (error) {
102
+ terminate(error instanceof Error ? error.message : 'Invalid pi event stream');
103
+ }
104
+ return;
105
+ }
106
+ outputBytes += Buffer.byteLength(chunk);
107
+ if (large ? outputBytes > summary_budget_1.LUNA_BATCH.outputBytes : stdout.length + chunk.length > 64000)
108
+ return terminate('pi produced too much output. No incomplete result was saved.');
109
+ stdout += chunk;
110
+ });
111
+ child.stderr.on('data', (chunk) => { stderr = (stderr + chunk).slice(-4000); });
112
+ child.on('error', error => {
113
+ if (closed)
114
+ return;
115
+ closed = true;
116
+ cleanup();
117
+ if (!reportAccounting(false))
118
+ return;
119
+ reject(new store_1.HttpError(502, `Cannot start pi. Run draken setup and draken login, or configure DRAKEN_PI_BIN with pi 1.4+. ${error.message}`));
120
+ });
121
+ child.on('close', code => {
122
+ if (closed)
123
+ return;
124
+ closed = true;
125
+ cleanup();
126
+ if (!reportAccounting(code === 0 && !failure))
127
+ return;
128
+ if (failure)
129
+ return reject(new store_1.HttpError(502, failure));
130
+ if (code !== 0)
131
+ return reject(new store_1.HttpError(502, `pi failed (${code ?? 'signal'}). ${(0, normalize_1.cleanText)(stderr, 1500) || 'Check model access and pi login.'}`));
132
+ if (structured) {
133
+ try {
134
+ resolve(structured.result());
135
+ }
136
+ catch (error) {
137
+ reject(new store_1.HttpError(502, (0, normalize_1.cleanText)(error instanceof Error ? error.message : 'Invalid pi response', 1500)));
138
+ }
139
+ return;
140
+ }
141
+ if (!stdout.trim())
142
+ return reject(new store_1.HttpError(502, 'pi returned no response. Coverage did not advance.'));
143
+ resolve(stdout.trim());
144
+ });
145
+ child.stdin.on('error', () => { });
146
+ child.stdin.end(prompt);
147
+ });
148
+ }
149
+ //# sourceMappingURL=pi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../src/sync/pi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { SyncDetail } from '../types';
2
+ export interface RecapInput {
3
+ sync_id: number;
4
+ status: string;
5
+ snapshot_at: string;
6
+ briefing: string;
7
+ decisions: string;
8
+ carry_forward: string;
9
+ messages: {
10
+ role: string;
11
+ content: string;
12
+ created_at: string;
13
+ }[];
14
+ }
15
+ export declare const recapInput: (sync: SyncDetail) => RecapInput;
16
+ export declare const recapHash: (input: RecapInput, model: string) => string;
17
+ export declare const memoryText: (text: string) => string;
18
+ type Ask = (payload: unknown, system: string) => Promise<string>;
19
+ /** Every briefing/discussion fragment is processed. Stable chunks/reductions are cached;
20
+ * no silent last-N transcript cutoff and no extra strong-model invocation. */
21
+ export declare function summarizeRecap(input: RecapInput, model: string, ask: Ask, signal: AbortSignal): Promise<string>;
22
+ export declare function invalidateRecap(id: number): void;
23
+ export declare function saveRecap(input: RecapInput, model: string, summary: string): void;
24
+ export {};
25
+ //# sourceMappingURL=recap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recap.d.ts","sourceRoot":"","sources":["../../src/sync/recap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACvE,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IACzC,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACnE;AACD,eAAO,MAAM,UAAU,GAAI,MAAM,UAAU,KAAG,UAEsD,CAAC;AACrG,eAAO,MAAM,SAAS,GAAI,OAAO,UAAU,EAAE,OAAO,MAAM,WAA4D,CAAC;AACvH,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,WAA8F,CAAC;AAkBtI,KAAK,GAAG,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AACjE;8EAC8E;AAC9E,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA2CrH;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,QAEzC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QAI1E"}