draken 0.5.1 → 0.6.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 (202) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/MEMORY.md +10 -4
  3. package/PERSONA.md +9 -2
  4. package/README.md +8 -10
  5. package/SETUP.md +3 -3
  6. package/TRAY.md +2 -2
  7. package/VOICE.md +1 -1
  8. package/dist/auth/middleware.d.ts.map +1 -1
  9. package/dist/auth/middleware.js +0 -13
  10. package/dist/auth/middleware.js.map +1 -1
  11. package/dist/cli.js +6 -2
  12. package/dist/cli.js.map +1 -1
  13. package/dist/data-dir.d.ts +2 -0
  14. package/dist/data-dir.d.ts.map +1 -0
  15. package/dist/data-dir.js +12 -0
  16. package/dist/data-dir.js.map +1 -0
  17. package/dist/db/evidence.d.ts +2 -1
  18. package/dist/db/evidence.d.ts.map +1 -1
  19. package/dist/db/evidence.js +6 -5
  20. package/dist/db/evidence.js.map +1 -1
  21. package/dist/db/pointer-migration.js +4 -4
  22. package/dist/db/pointer-migration.js.map +1 -1
  23. package/dist/db/schema.d.ts +0 -1
  24. package/dist/db/schema.d.ts.map +1 -1
  25. package/dist/db/schema.js +7 -7
  26. package/dist/db/schema.js.map +1 -1
  27. package/dist/errors.d.ts +5 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +12 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/memory/context.d.ts +2 -9
  32. package/dist/memory/context.d.ts.map +1 -1
  33. package/dist/memory/context.js +7 -84
  34. package/dist/memory/context.js.map +1 -1
  35. package/dist/memory/embedding-contract.d.ts +5 -0
  36. package/dist/memory/embedding-contract.d.ts.map +1 -0
  37. package/dist/memory/embedding-contract.js +12 -0
  38. package/dist/memory/embedding-contract.js.map +1 -0
  39. package/dist/memory/embedding-pool.d.ts +1 -2
  40. package/dist/memory/embedding-pool.d.ts.map +1 -1
  41. package/dist/memory/embedding-pool.js +9 -9
  42. package/dist/memory/embedding-pool.js.map +1 -1
  43. package/dist/memory/embedding-worker.js +2 -1
  44. package/dist/memory/embedding-worker.js.map +1 -1
  45. package/dist/{voice/history-focus.d.ts → memory/focus.d.ts} +6 -6
  46. package/dist/memory/focus.d.ts.map +1 -0
  47. package/dist/{voice/history-focus.js → memory/focus.js} +6 -6
  48. package/dist/memory/focus.js.map +1 -0
  49. package/dist/memory/index.d.ts.map +1 -1
  50. package/dist/memory/index.js +12 -15
  51. package/dist/memory/index.js.map +1 -1
  52. package/dist/memory/model-assets.d.ts +5 -0
  53. package/dist/memory/model-assets.d.ts.map +1 -0
  54. package/dist/memory/model-assets.js +84 -0
  55. package/dist/memory/model-assets.js.map +1 -0
  56. package/dist/memory/model.d.ts +2 -7
  57. package/dist/memory/model.d.ts.map +1 -1
  58. package/dist/memory/model.js +13 -83
  59. package/dist/memory/model.js.map +1 -1
  60. package/dist/memory/packet.d.ts +9 -0
  61. package/dist/memory/packet.d.ts.map +1 -0
  62. package/dist/memory/packet.js +78 -0
  63. package/dist/memory/packet.js.map +1 -0
  64. package/dist/memory/passages.d.ts +15 -0
  65. package/dist/memory/passages.d.ts.map +1 -0
  66. package/dist/memory/passages.js +22 -0
  67. package/dist/memory/passages.js.map +1 -0
  68. package/dist/memory/readiness.d.ts.map +1 -1
  69. package/dist/memory/readiness.js +2 -6
  70. package/dist/memory/readiness.js.map +1 -1
  71. package/dist/memory/service.d.ts +2 -1
  72. package/dist/memory/service.d.ts.map +1 -1
  73. package/dist/memory/service.js +46 -22
  74. package/dist/memory/service.js.map +1 -1
  75. package/dist/memory/sources.d.ts +0 -1
  76. package/dist/memory/sources.d.ts.map +1 -1
  77. package/dist/memory/sources.js +3 -7
  78. package/dist/memory/sources.js.map +1 -1
  79. package/dist/memory/stamps.d.ts +3 -3
  80. package/dist/memory/stamps.d.ts.map +1 -1
  81. package/dist/memory/stamps.js +3 -3
  82. package/dist/memory/stamps.js.map +1 -1
  83. package/dist/memory/storage.d.ts.map +1 -1
  84. package/dist/memory/storage.js +3 -2
  85. package/dist/memory/storage.js.map +1 -1
  86. package/dist/memory/types.d.ts +2 -1
  87. package/dist/memory/types.d.ts.map +1 -1
  88. package/dist/memory/types.js +2 -1
  89. package/dist/memory/types.js.map +1 -1
  90. package/dist/pi/runtime.js +7 -7
  91. package/dist/pi/runtime.js.map +1 -1
  92. package/dist/pi/setup.d.ts +0 -1
  93. package/dist/pi/setup.d.ts.map +1 -1
  94. package/dist/pi/setup.js +2 -11
  95. package/dist/pi/setup.js.map +1 -1
  96. package/dist/routes/auth.d.ts.map +1 -1
  97. package/dist/routes/auth.js +0 -5
  98. package/dist/routes/auth.js.map +1 -1
  99. package/dist/routes/http.d.ts +6 -0
  100. package/dist/routes/http.d.ts.map +1 -0
  101. package/dist/routes/http.js +22 -0
  102. package/dist/routes/http.js.map +1 -0
  103. package/dist/routes/live-voice.d.ts.map +1 -1
  104. package/dist/routes/live-voice.js +18 -32
  105. package/dist/routes/live-voice.js.map +1 -1
  106. package/dist/routes/memory.d.ts.map +1 -1
  107. package/dist/routes/memory.js +8 -14
  108. package/dist/routes/memory.js.map +1 -1
  109. package/dist/routes/sync.d.ts.map +1 -1
  110. package/dist/routes/sync.js +57 -64
  111. package/dist/routes/sync.js.map +1 -1
  112. package/dist/routes/voice.d.ts.map +1 -1
  113. package/dist/routes/voice.js +7 -7
  114. package/dist/routes/voice.js.map +1 -1
  115. package/dist/server-ownership.d.ts +5 -0
  116. package/dist/server-ownership.d.ts.map +1 -0
  117. package/dist/server-ownership.js +34 -0
  118. package/dist/server-ownership.js.map +1 -0
  119. package/dist/server-state.js +3 -3
  120. package/dist/server-state.js.map +1 -1
  121. package/dist/server.d.ts.map +1 -1
  122. package/dist/server.js +40 -10
  123. package/dist/server.js.map +1 -1
  124. package/dist/sync/activity.d.ts +26 -0
  125. package/dist/sync/activity.d.ts.map +1 -0
  126. package/dist/sync/activity.js +80 -0
  127. package/dist/sync/activity.js.map +1 -0
  128. package/dist/{memory/automatic.d.ts → sync/background.d.ts} +5 -12
  129. package/dist/sync/background.d.ts.map +1 -0
  130. package/dist/{memory/automatic.js → sync/background.js} +29 -74
  131. package/dist/sync/background.js.map +1 -0
  132. package/dist/sync/collector.d.ts.map +1 -1
  133. package/dist/sync/collector.js +7 -6
  134. package/dist/sync/collector.js.map +1 -1
  135. package/dist/sync/manager.d.ts +1 -4
  136. package/dist/sync/manager.d.ts.map +1 -1
  137. package/dist/sync/manager.js +29 -49
  138. package/dist/sync/manager.js.map +1 -1
  139. package/dist/sync/models.d.ts +3 -0
  140. package/dist/sync/models.d.ts.map +1 -0
  141. package/dist/sync/models.js +12 -0
  142. package/dist/sync/models.js.map +1 -0
  143. package/dist/sync/pi.d.ts +1 -1
  144. package/dist/sync/pi.d.ts.map +1 -1
  145. package/dist/sync/pi.js +32 -19
  146. package/dist/sync/pi.js.map +1 -1
  147. package/dist/{voice → sync}/preparation.d.ts +0 -1
  148. package/dist/sync/preparation.d.ts.map +1 -0
  149. package/dist/{voice → sync}/preparation.js +10 -18
  150. package/dist/sync/preparation.js.map +1 -0
  151. package/dist/sync/retrieval.d.ts +3 -0
  152. package/dist/sync/retrieval.d.ts.map +1 -0
  153. package/dist/sync/retrieval.js +12 -0
  154. package/dist/sync/retrieval.js.map +1 -0
  155. package/dist/sync/source-files.d.ts +2 -4
  156. package/dist/sync/source-files.d.ts.map +1 -1
  157. package/dist/sync/source-files.js +5 -20
  158. package/dist/sync/source-files.js.map +1 -1
  159. package/dist/sync/store.d.ts +1 -14
  160. package/dist/sync/store.d.ts.map +1 -1
  161. package/dist/sync/store.js +32 -90
  162. package/dist/sync/store.js.map +1 -1
  163. package/dist/sync/tree.d.ts.map +1 -1
  164. package/dist/sync/tree.js +17 -22
  165. package/dist/sync/tree.js.map +1 -1
  166. package/dist/sync/usage.js +3 -3
  167. package/dist/sync/usage.js.map +1 -1
  168. package/dist/tray/launcher.js +2 -2
  169. package/dist/tray/launcher.js.map +1 -1
  170. package/dist/tray/worker.js +4 -4
  171. package/dist/tray/worker.js.map +1 -1
  172. package/dist/types.d.ts +1 -10
  173. package/dist/types.d.ts.map +1 -1
  174. package/dist/voice/history-delivery.js +3 -3
  175. package/dist/voice/history-delivery.js.map +1 -1
  176. package/dist/voice/live-context.js +3 -3
  177. package/dist/voice/live-context.js.map +1 -1
  178. package/dist/voice/live.d.ts +1 -0
  179. package/dist/voice/live.d.ts.map +1 -1
  180. package/dist/voice/live.js +57 -34
  181. package/dist/voice/live.js.map +1 -1
  182. package/package.json +1 -1
  183. package/public/assets/index-DXPfCm7z.js +131 -0
  184. package/public/index.html +1 -1
  185. package/voice/realtime/README.md +1 -1
  186. package/voice/realtime/helper-process.mjs +54 -0
  187. package/voice/realtime/native.mjs +55 -15
  188. package/voice/realtime/probe-server.mjs +24 -4
  189. package/voice/realtime/probe.mjs +49 -11
  190. package/voice/realtime/rpc.mjs +7 -32
  191. package/voice/realtime/setup.mjs +82 -19
  192. package/dist/memory/automatic.d.ts.map +0 -1
  193. package/dist/memory/automatic.js.map +0 -1
  194. package/dist/sync/automatic.d.ts +0 -7
  195. package/dist/sync/automatic.d.ts.map +0 -1
  196. package/dist/sync/automatic.js +0 -56
  197. package/dist/sync/automatic.js.map +0 -1
  198. package/dist/voice/history-focus.d.ts.map +0 -1
  199. package/dist/voice/history-focus.js.map +0 -1
  200. package/dist/voice/preparation.d.ts.map +0 -1
  201. package/dist/voice/preparation.js.map +0 -1
  202. package/public/assets/index-DrGvDGTG.js +0 -131
@@ -2,8 +2,7 @@ import fs from 'node:fs';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { timingSafeEqual } from 'node:crypto';
5
- import { execFile } from 'node:child_process';
6
- import { promisify } from 'node:util';
5
+ import { NativeHelperProcess } from './helper-process.mjs';
7
6
  import { NativeRpc } from './rpc.mjs';
8
7
  import { createReadOnlyBackend } from './backend.mjs';
9
8
 
@@ -19,7 +18,47 @@ export function codexExecutable(root, platform = process.platform, arch = proces
19
18
  }
20
19
  export const defaultBinary = codexExecutable(realtimeRoot);
21
20
  export const defaultHome = path.join(realtimeRoot, 'account');
22
- const exec = promisify(execFile);
21
+ const checks = new Set();
22
+ let checksStopping = false;
23
+
24
+ function inspectNative({ binary, home, signal }) {
25
+ let helper;
26
+ if (!checksStopping && !signal?.aborted) {
27
+ try { helper = new NativeHelperProcess(binary, ['--version'], { env: helperEnvironment(home) }); } catch { /* Structural status only. */ }
28
+ }
29
+ if (!helper) return { stop() {}, done: Promise.resolve({ installed: false, exited: true }) };
30
+ let stdout = '', failed = false;
31
+ const stop = () => { failed = true; helper.close(); };
32
+ const check = { helper, stop }; checks.add(check);
33
+ const timer = setTimeout(stop, 5000);
34
+ helper.child.stdout.setEncoding('utf8');
35
+ helper.child.stdout.on('data', chunk => {
36
+ if (failed) return;
37
+ if (Buffer.byteLength(stdout) + Buffer.byteLength(chunk) > 4096) { stop(); return; }
38
+ stdout += chunk;
39
+ });
40
+ helper.child.on('error', stop); helper.child.stdin.on('error', stop); helper.child.stdin.end();
41
+ signal?.addEventListener('abort', stop, { once: true });
42
+ if (signal?.aborted) stop();
43
+ const done = helper.waitForExit(7500).then(exited => {
44
+ clearTimeout(timer); signal?.removeEventListener('abort', stop);
45
+ if (exited) checks.delete(check);
46
+ return { installed: exited && !failed && helper.child.exitCode === 0 && stdout.trim() === `codex-cli ${CODEX_VERSION}`, exited };
47
+ });
48
+ return { stop, done };
49
+ }
50
+
51
+ export async function stopNativeChecks() {
52
+ checksStopping = true;
53
+ const pending = [...checks];
54
+ for (const check of pending) check.stop();
55
+ const results = await Promise.all(pending.map(async check => {
56
+ const exited = await check.helper.waitForExit();
57
+ if (exited) checks.delete(check);
58
+ return exited;
59
+ }));
60
+ if (results.some(exited => !exited)) throw new Error('Native status helper exit could not be confirmed.');
61
+ }
23
62
 
24
63
  // Positive allowlist: no API keys, pi session ownership, cloud credentials,
25
64
  // proxy overrides, provider URLs, NODE_OPTIONS, or user agent configuration.
@@ -36,12 +75,8 @@ export function hasNativeLogin(home) {
36
75
  ['access_token', 'refresh_token', 'id_token'].every(key => typeof value.tokens?.[key] === 'string' && value.tokens[key].length > 0);
37
76
  } catch { return false; }
38
77
  }
39
- export async function nativeStatus({ binary = defaultBinary, home = defaultHome } = {}) {
40
- let installed = false;
41
- try {
42
- const { stdout } = await exec(binary, ['--version'], { env: helperEnvironment(home), timeout: 5000, maxBuffer: 4096 });
43
- installed = stdout.trim() === `codex-cli ${CODEX_VERSION}`;
44
- } catch { /* Report a structural status only; never leak subprocess output. */ }
78
+ export async function nativeStatus({ binary = defaultBinary, home = defaultHome, signal } = {}) {
79
+ const { installed } = await inspectNative({ binary, home, signal }).done;
45
80
  return { installed, expectedVersion: CODEX_VERSION, nativeLoginPresent: hasNativeLogin(home),
46
81
  readyForProbe: installed && hasNativeLogin(home), audioVerified: false };
47
82
  }
@@ -97,6 +132,7 @@ export class NativeVoice {
97
132
  #answer;
98
133
  #cleanup;
99
134
  #unsubscribe;
135
+ #preflight;
100
136
  constructor({ binary = defaultBinary, home = defaultHome, answer } = {}) { this.#binary = binary; this.#home = home; this.#answer = answer; }
101
137
  subscribe(listener) { this.#listeners.add(listener); return () => this.#listeners.delete(listener); }
102
138
  #emit(event) { for (const listener of this.#listeners) { try { listener(event); } catch { void this.close(); } } }
@@ -104,15 +140,16 @@ export class NativeVoice {
104
140
  if (this.#closed || this.#opened) throw new Error('A native voice instance can open only once.');
105
141
  this.#opened = true;
106
142
  if (typeof sdp !== 'string' || sdp.length > 64_000 || !sdp.startsWith('v=0') || (sdp.match(/^m=audio /gm) || []).length !== 1 || /^m=video /m.test(sdp)) throw new Error('One audio track and a bounded SDP offer are required.');
107
- const status = await nativeStatus({ binary: this.#binary, home: this.#home });
108
- if (!status.installed) throw new Error(`Install the pinned Codex ${CODEX_VERSION} helper first.`);
109
- if (!status.nativeLoginPresent) throw new Error('A separate native ChatGPT sign-in is required. Run npm run voice:realtime:login. The pi login is not copied or converted.');
110
- if (fs.existsSync(path.join(this.#home, 'config.toml'))) throw new Error('Use the dedicated voice account directory without a custom Codex config.');
111
- if (signal?.aborted || this.#closed) throw new Error('Native voice setup cancelled.');
112
143
  const abort = () => { void this.close(); };
113
144
  signal?.addEventListener('abort', abort, { once: true });
114
145
  this.#cleanup = () => signal?.removeEventListener('abort', abort);
115
146
  try {
147
+ this.#preflight = inspectNative({ binary: this.#binary, home: this.#home, signal });
148
+ const status = await this.#preflight.done;
149
+ if (signal?.aborted || this.#closed) throw new Error('Native voice setup cancelled.');
150
+ if (!status.installed) throw new Error(`Install the pinned Codex ${CODEX_VERSION} helper first.`);
151
+ if (!hasNativeLogin(this.#home)) throw new Error('A separate native ChatGPT sign-in is required. Run npm run voice:realtime:login. The pi login is not copied or converted.');
152
+ if (fs.existsSync(path.join(this.#home, 'config.toml'))) throw new Error('Use the dedicated voice account directory without a custom Codex config.');
116
153
  this.#deny = await createReadOnlyBackend({ answer: this.#answer, maxRequests: 120,
117
154
  authorize: headers => {
118
155
  // Native auth already accompanies the helper's backing requests. Match
@@ -197,11 +234,14 @@ export class NativeVoice {
197
234
  }
198
235
  async #closeResources() {
199
236
  this.#cleanup?.(); this.#unsubscribe?.();
237
+ this.#preflight?.stop();
238
+ const preflightExited = !this.#preflight || (await this.#preflight.done).exited;
200
239
  if (this.#thread && this.#rpc && !this.#rpc.closed) {
201
240
  try { await this.#rpc.request('thread/realtime/stop', { threadId: this.#thread }, { timeoutMs: 1500 }); } catch { /* Terminate below, even if stop was rejected. */ }
202
241
  }
203
242
  this.#rpc?.close();
204
- const exited = !this.#rpc || await this.#rpc.waitForExit();
243
+ const rpcExited = !this.#rpc || await this.#rpc.waitForExit();
244
+ const exited = preflightExited && rpcExited;
205
245
  await this.#deny?.close();
206
246
  this.#emit({ method: 'draken/closed', params: { reason: exited ? 'Native voice connection closed.' : 'Native helper exit could not be confirmed.', helperExited: exited } });
207
247
  this.#listeners.clear();
@@ -11,9 +11,16 @@ export async function createProbeServer({ voiceFactory = () => new NativeVoice({
11
11
  }), leaseMs = 10_000, lifetimeMs = 90_000 } = {}) {
12
12
  const token = randomBytes(32).toString('hex');
13
13
  const expected = Buffer.from(`Bearer ${token}`);
14
- let call, accepted = false, touched = Date.now(), origin, closing;
14
+ let call, accepted = false, touched = Date.now(), origin, closing, serverClosing;
15
15
  const events = []; let sequence = 0;
16
- const finish = () => { if (!closing) closing = Promise.resolve().then(() => call?.close()); return closing; };
16
+ const finish = () => {
17
+ if (!closing) {
18
+ closing = Promise.resolve().then(() => call?.close());
19
+ // Event/lease shutdown may precede the terminal owner's awaited close.
20
+ closing.catch(() => {});
21
+ }
22
+ return closing;
23
+ };
17
24
  const body = async req => {
18
25
  req.setEncoding('utf8');
19
26
  let data = ''; for await (const chunk of req) { data += chunk; if (data.length > 64_000) throw new Error('Request too large.'); }
@@ -73,7 +80,7 @@ export async function createProbeServer({ voiceFactory = () => new NativeVoice({
73
80
  res.end(JSON.stringify({ helperExited: result?.helperExited !== false })); return;
74
81
  }
75
82
  res.writeHead(404); res.end();
76
- } catch { await finish(); if (!res.headersSent) res.writeHead(502); res.end('Native voice qualification failed. No provider fallback was attempted.'); }
83
+ } catch { await finish().catch(() => {}); if (!res.headersSent) res.writeHead(502); res.end('Native voice qualification failed. No provider fallback was attempted.'); }
77
84
  });
78
85
  server.requestTimeout = 65_000;
79
86
  server.headersTimeout = 10_000;
@@ -82,5 +89,18 @@ export async function createProbeServer({ voiceFactory = () => new NativeVoice({
82
89
  const sweep = setInterval(() => { if (accepted && Date.now() - touched > leaseMs) void finish(); }, Math.min(1000, leaseMs)); sweep.unref();
83
90
  const deadline = setTimeout(() => { void finish(); }, lifetimeMs); deadline.unref();
84
91
  return { origin, token, events,
85
- async close() { clearInterval(sweep); clearTimeout(deadline); await finish(); server.closeAllConnections(); await new Promise(resolve => server.close(resolve)); } };
92
+ close() {
93
+ if (!serverClosing) {
94
+ clearInterval(sweep); clearTimeout(deadline);
95
+ const completion = finish();
96
+ serverClosing = (async () => {
97
+ const listener = new Promise(resolve => server.close(resolve));
98
+ server.closeAllConnections();
99
+ const [helper] = await Promise.allSettled([completion, listener]);
100
+ if (helper.status === 'rejected') throw helper.reason;
101
+ if (helper.value?.helperExited === false) throw new Error('Native probe helper exit could not be confirmed.');
102
+ })();
103
+ }
104
+ return serverClosing;
105
+ } };
86
106
  }
@@ -1,32 +1,59 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { realtimeRoot, nativeStatus } from './native.mjs';
3
+ import { realtimeRoot, nativeStatus, stopNativeChecks } from './native.mjs';
4
4
  import { createProbeServer } from './probe-server.mjs';
5
5
 
6
6
  process.umask(0o077);
7
- let browser, lab, stopping = false;
8
- const onSignal = signal => {
9
- if (stopping) return; stopping = true;
10
- void Promise.allSettled([browser?.close(), lab?.close()]).then(() => process.exit(signal === 'SIGINT' ? 130 : 143));
7
+ let browser, lab, browserClosing, checksClosing;
8
+ const controller = new AbortController();
9
+ const { signal } = controller;
10
+ const hold = setInterval(() => {}, 1000);
11
+ const stopChecks = () => {
12
+ if (!checksClosing) { checksClosing = stopNativeChecks(); checksClosing.catch(() => {}); }
13
+ return checksClosing;
11
14
  };
12
- process.once('SIGINT', onSignal); process.once('SIGTERM', onSignal);
15
+ const closeBrowser = () => {
16
+ if (browser && !browserClosing) { browserClosing = browser.close(); browserClosing.catch(() => {}); }
17
+ return browserClosing;
18
+ };
19
+ const onSignal = name => {
20
+ if (signal.aborted) return;
21
+ process.exitCode = name === 'SIGINT' ? 130 : 143;
22
+ controller.abort();
23
+ void stopChecks(); void closeBrowser(); void lab?.close().catch(() => {});
24
+ };
25
+ const active = () => { if (signal.aborted) throw new Error('Native voice probe cancelled.'); };
26
+ process.on('SIGINT', onSignal); process.on('SIGTERM', onSignal);
13
27
  try {
14
28
  const flags = process.argv.slice(2);
15
29
  if (flags.length !== 1 || !['--check', '--allow-provider'].includes(flags[0])) throw new Error('Use --check, or explicitly --allow-provider for one bounded synthetic audio test.');
16
- const status = await nativeStatus();
30
+ const status = await nativeStatus({ signal });
31
+ active();
17
32
  if (flags[0] === '--check') console.log(JSON.stringify(status, null, 2));
18
33
  else {
19
34
  if (!status.readyForProbe) throw new Error('Native ChatGPT sign-in is missing or the pinned helper is unavailable. Run npm run voice:realtime:setup, then npm run voice:realtime:login. No provider request was made.');
20
35
  const { chromium } = await import('@playwright/test');
21
- lab = await createProbeServer(); browser = await chromium.launch();
36
+ active();
37
+ lab = await createProbeServer();
38
+ active();
39
+ browser = await chromium.launch();
40
+ active();
22
41
  const context = await browser.newContext({ extraHTTPHeaders: { Authorization: `Bearer ${lab.token}` } });
42
+ if (signal.aborted) { await context.close(); active(); }
23
43
  // Do not let page HTTP requests carry the lab credential to any other origin.
24
44
  await context.route('**/*', route => new URL(route.request().url()).origin === lab.origin ? route.continue() : route.abort());
45
+ active();
25
46
  const page = await context.newPage(); const pageErrors = [];
47
+ active();
26
48
  page.on('pageerror', () => pageErrors.push('Browser runtime error.'));
27
- await page.goto(lab.origin); await page.getByRole('button', { name: 'Run synthetic call' }).click();
49
+ await page.goto(lab.origin);
50
+ active();
51
+ await page.getByRole('button', { name: 'Run synthetic call' }).click();
52
+ active();
28
53
  await page.waitForFunction(() => window.voiceResult?.completed, {}, { timeout: 85_000 });
54
+ active();
29
55
  const result = await page.evaluate(() => window.voiceResult);
56
+ active();
30
57
  result.errors.push(...pageErrors);
31
58
  result.success = result.success && result.localCleanup && result.helperCleanup && result.questions.length === 2 && result.audioFrames > 10 && !result.errors.length;
32
59
  result.audioVerified = result.success;
@@ -38,5 +65,16 @@ try {
38
65
  receivedAudioFrames: result.audioFrames, transcripts: result.transcripts.length, localCleanup: result.localCleanup, helperCleanup: result.helperCleanup, report }, null, 2));
39
66
  if (!result.success) process.exitCode = 1;
40
67
  }
41
- } catch (error) { console.error(error.message); process.exitCode = 1; }
42
- finally { await browser?.close(); await lab?.close(); process.removeListener('SIGINT', onSignal); process.removeListener('SIGTERM', onSignal); }
68
+ } catch (error) { console.error(signal.aborted ? 'Native voice probe cancelled.' : error.message); if (!signal.aborted) process.exitCode = 1; }
69
+ finally {
70
+ const warning = setTimeout(() => console.error('Native probe cleanup is still pending. Keeping this terminal host alive.'), 10_000);
71
+ const results = await Promise.allSettled([stopChecks(), closeBrowser(), lab?.close()]);
72
+ clearTimeout(warning);
73
+ if (results.some(result => result.status === 'rejected')) {
74
+ process.exitCode = 1;
75
+ console.error('Native probe cleanup could not be confirmed. Keeping this terminal host alive; no further operation will start.');
76
+ await new Promise(() => {});
77
+ }
78
+ clearInterval(hold);
79
+ process.removeListener('SIGINT', onSignal); process.removeListener('SIGTERM', onSignal);
80
+ }
@@ -1,4 +1,4 @@
1
- import { spawn } from 'node:child_process';
1
+ import { NativeHelperProcess } from './helper-process.mjs';
2
2
 
3
3
  /** Private stdio only. No HTTP listener, shell, generic command route, or raw logging. */
4
4
  export class NativeRpc {
@@ -8,24 +8,15 @@ export class NativeRpc {
8
8
  #sequence = 0;
9
9
  #buffer = '';
10
10
  #closed = false;
11
- #exited = false;
12
- #killTimer;
13
- #exitPromise;
14
- #resolveExit;
15
- constructor(binary, args, { cwd, env, spawnProcess = spawn } = {}) {
16
- this.#exitPromise = new Promise(resolve => { this.#resolveExit = resolve; });
17
- this.#child = spawnProcess(binary, args, { cwd, env, shell: false, detached: process.platform !== 'win32', stdio: ['pipe', 'pipe', 'pipe'] });
11
+ #helper;
12
+ constructor(binary, args, options = {}) {
13
+ this.#helper = new NativeHelperProcess(binary, args, options);
14
+ this.#child = this.#helper.child;
18
15
  this.#child.stdout.setEncoding('utf8');
19
16
  this.#child.stdout.on('data', chunk => this.#receive(chunk));
20
- // Native diagnostics can contain prompts, transcripts, paths and auth details.
21
- // Drain them, but never copy them into routine logs or browser errors.
22
- this.#child.stderr.resume();
23
17
  this.#child.stdin.on('error', () => this.close('Native voice input closed.'));
24
18
  this.#child.on('error', () => this.close('Cannot start the pinned native voice helper.'));
25
19
  this.#child.on('close', () => {
26
- this.#exited = true;
27
- clearTimeout(this.#killTimer);
28
- this.#resolveExit(true);
29
20
  this.close('Native voice helper stopped.');
30
21
  });
31
22
  }
@@ -89,29 +80,13 @@ export class NativeRpc {
89
80
  if (signal?.aborted) abort();
90
81
  });
91
82
  }
92
- async waitForExit(timeoutMs = 2500) {
93
- let timer;
94
- try { return await Promise.race([this.#exitPromise, new Promise(resolve => { timer = setTimeout(() => resolve(false), timeoutMs); })]); }
95
- finally { clearTimeout(timer); }
96
- }
97
- #terminate(signal) {
98
- // The official npm launcher owns a native child. On Unix terminate the
99
- // entire group, including escalation if a launcher exits before its child.
100
- if (process.platform !== 'win32' && Number.isInteger(this.#child.pid) && this.#child.pid > 1) {
101
- try { process.kill(-this.#child.pid, signal); return; } catch { /* Already gone, or test double. */ }
102
- }
103
- try { this.#child.kill(signal); } catch { /* Exit confirmation is separate. */ }
104
- }
83
+ waitForExit(timeoutMs) { return this.#helper.waitForExit(timeoutMs); }
105
84
  close(reason = 'Native voice connection closed.') {
106
85
  if (this.#closed) return;
107
86
  this.#closed = true; this.#buffer = '';
108
87
  for (const pending of this.#pending.values()) { pending.cleanup(); pending.reject(new Error(reason)); }
109
88
  this.#pending.clear();
110
- this.#child.stdin.destroy();
111
- if (!this.#exited) {
112
- this.#terminate('SIGTERM');
113
- this.#killTimer = setTimeout(() => this.#terminate('SIGKILL'), 1500); this.#killTimer.unref();
114
- }
89
+ this.#helper.close();
115
90
  this.#emit({ method: 'draken/closed', params: { reason } });
116
91
  this.#listeners.clear();
117
92
  }
@@ -1,32 +1,95 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { spawn } from 'node:child_process';
3
+ import { pathToFileURL } from 'node:url';
4
4
  import { npmCli } from '../../dist/npm-cli.js';
5
- import { CODEX_VERSION, realtimeRoot, defaultBinary, defaultHome, helperEnvironment, nativeStatus } from './native.mjs';
5
+ import { NativeHelperProcess } from './helper-process.mjs';
6
+ import { CODEX_VERSION, realtimeRoot, defaultBinary, defaultHome, helperEnvironment, nativeStatus, stopNativeChecks } from './native.mjs';
6
7
 
7
- process.umask(0o077);
8
- const flags = process.argv.slice(2);
9
- if (flags.length !== 1 || !['--install', '--login', '--check'].includes(flags[0])) {
10
- console.error('Usage: node voice/realtime/setup.mjs --install | --login | --check'); process.exitCode = 2;
11
- } else {
12
- const run = (binary, args, env) => new Promise((resolve, reject) => {
13
- const child = spawn(binary, args, { stdio: 'inherit', shell: false, env });
14
- child.once('error', () => reject(new Error('Cannot start the requested helper.')));
15
- child.once('exit', code => code === 0 ? resolve() : reject(new Error('The requested helper did not complete.')));
16
- });
8
+ /** One terminal workflow owns both preflight and explicit install/login children. */
9
+ export async function voiceSetup(action) {
10
+ if (!['setup', 'login', 'status'].includes(action)) throw new Error('Usage: draken voice setup | login | status');
11
+ process.umask(0o077);
12
+ const controller = new AbortController();
13
+ const { signal } = controller;
14
+ let command, checksClosing;
15
+ // A pending cleanup promise alone does not keep Node alive.
16
+ const hold = setInterval(() => {}, 1000);
17
+ const stopChecks = () => {
18
+ if (!checksClosing) { checksClosing = stopNativeChecks(); checksClosing.catch(() => {}); }
19
+ return checksClosing;
20
+ };
21
+ const onSignal = name => {
22
+ if (signal.aborted) return;
23
+ process.exitCode = name === 'SIGINT' ? 130 : 143;
24
+ controller.abort(); command?.close(); void stopChecks();
25
+ };
26
+ process.on('SIGINT', onSignal); process.on('SIGTERM', onSignal);
27
+ const active = () => { if (signal.aborted) throw new Error('Native voice operation cancelled.'); };
28
+ const run = async (binary, args, env) => {
29
+ active();
30
+ command = new NativeHelperProcess(binary, args, { env, stdio: 'inherit' });
31
+ const helper = command;
32
+ await new Promise(resolve => {
33
+ const done = () => {
34
+ helper.child.removeListener('close', done); helper.child.removeListener('error', done);
35
+ signal.removeEventListener('abort', done); resolve();
36
+ };
37
+ helper.child.once('close', done); helper.child.once('error', done);
38
+ signal.addEventListener('abort', done, { once: true });
39
+ if (signal.aborted) done();
40
+ });
41
+ if (signal.aborted) helper.close();
42
+ if (!(await helper.waitForExit())) throw new Error('Native terminal helper exit could not be confirmed.');
43
+ command = undefined;
44
+ active();
45
+ if (helper.child.exitCode !== 0) throw new Error('The requested helper did not complete.');
46
+ };
17
47
  try {
18
- if (flags[0] === '--install') {
48
+ active();
49
+ if (action === 'setup') {
19
50
  fs.mkdirSync(realtimeRoot, { recursive: true, mode: 0o700 });
20
51
  await run(process.execPath, [npmCli(), 'install', '--prefix', path.join(realtimeRoot, 'runtime'), '--ignore-scripts', '--no-audit', '--no-fund', '--save-exact', `@openai/codex@${CODEX_VERSION}`], helperEnvironment(defaultHome));
21
52
  }
22
- if (flags[0] === '--login') {
23
- if (!(await nativeStatus()).installed) throw new Error('Run npm run voice:realtime:setup first.');
53
+ if (action === 'login') {
54
+ const status = await nativeStatus({ signal });
55
+ active();
56
+ if (!status.installed) throw new Error('Run npm run voice:realtime:setup first.');
24
57
  fs.mkdirSync(defaultHome, { recursive: true, mode: 0o700 });
25
58
  if (fs.existsSync(path.join(defaultHome, 'config.toml'))) throw new Error('The dedicated voice account directory must not contain a custom config.toml.');
26
- // An explicit operator command, not an automatic browser popup or token conversion.
27
- // This is native ChatGPT sign-in, not API-key login and not pi's direct-token registration.
59
+ // Explicit native ChatGPT sign-in, not API-key login or pi token conversion.
28
60
  await run(defaultBinary, ['-c', 'cli_auth_credentials_store="file"', '-c', 'forced_login_method="chatgpt"', 'login', '--device-auth'], helperEnvironment(defaultHome));
29
61
  }
30
- console.log(JSON.stringify(await nativeStatus(), null, 2));
31
- } catch (error) { console.error(error.message); process.exitCode = 1; }
62
+ active();
63
+ const status = await nativeStatus({ signal });
64
+ active();
65
+ console.log(JSON.stringify(status, null, 2));
66
+ } catch (error) {
67
+ console.error(error.message);
68
+ if (!signal.aborted) process.exitCode = 1;
69
+ } finally {
70
+ command?.close();
71
+ const warning = setTimeout(() => console.error('Native voice cleanup is still pending. Keeping this terminal host alive.'), 10_000);
72
+ const results = await Promise.allSettled([stopChecks(), command ? command.waitForExit().then(exited => {
73
+ if (!exited) throw new Error('Native terminal helper exit could not be confirmed.');
74
+ }) : Promise.resolve()]);
75
+ clearTimeout(warning);
76
+ if (results.some(result => result.status === 'rejected')) {
77
+ process.exitCode = 1;
78
+ console.error('Native voice cleanup could not be confirmed. Keeping this terminal host alive; no further operation will start.');
79
+ // Keep signal handlers and the host alive rather than abandon owned children.
80
+ await new Promise(() => {});
81
+ }
82
+ clearInterval(hold);
83
+ process.removeListener('SIGINT', onSignal); process.removeListener('SIGTERM', onSignal);
84
+ }
85
+ }
86
+
87
+ if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {
88
+ const flags = process.argv.slice(2);
89
+ const action = ({ '--install': 'setup', '--login': 'login', '--check': 'status' })[flags[0]];
90
+ if (flags.length !== 1 || !action) {
91
+ console.error('Usage: node voice/realtime/setup.mjs --install | --login | --check'); process.exitCode = 2;
92
+ } else {
93
+ void voiceSetup(action).catch(error => { console.error(error.message); process.exitCode = 1; });
94
+ }
32
95
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"automatic.d.ts","sourceRoot":"","sources":["../../src/memory/automatic.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD,KAAK,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,iBAAiB,GAAG,mBAAmB,GAAG,OAAO,CAAC,CAAC;AAClG,UAAU,UAAU;IAClB,OAAO,IAAI,OAAO,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC;IAAC,GAAG,IAAI,MAAM,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,MAAM,CAAC;IACnB,UAAU,CAAC,IAAI,OAAO,CAAC;IACvB,QAAQ,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,MAAM,CAAC;IACnB,SAAS,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAGD;;;iFAGiF;AACjF,cAAM,WAAW;IAMH,OAAO,CAAC,GAAG;IALvB,KAAK,QAAa;IAClB,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACvC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,IAAI,CAAC,CAAkB;IAC/B,OAAO,CAAC,GAAG,CAAC,CAAgB;gBACR,GAAG,EAAE,UAAU;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,KAAK;IAIC,IAAI;IACV,KAAK;YACS,GAAG;CAmDlB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,eAAkC;AAOnF,wBAAgB,uBAAuB,SAStC;AACD,wBAAsB,sBAAsB,kBAG3C;AACD,wBAAsB,uBAAuB,kBAA4B;AACzE,wBAAgB,iBAAiB,IAAI,iBAAiB,CAUrD;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAW9D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"automatic.js","sourceRoot":"","sources":["../../src/memory/automatic.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- export declare function pendingAutomaticBriefing(): number | undefined;
2
- /** A failed provider run needs an explicit retry, not an endless paid timer loop.
3
- * Interrupted/cancelled runs may resume from their durable cached tree. */
4
- export declare function automaticBriefingError(): string;
5
- export declare function retryAutomaticBriefing(): void;
6
- export declare function prepareAutomaticBriefing(signal: AbortSignal): Promise<void>;
7
- //# sourceMappingURL=automatic.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"automatic.d.ts","sourceRoot":"","sources":["../../src/sync/automatic.ts"],"names":[],"mappings":"AAMA,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAI7D;AAED;2EAC2E;AAC3E,wBAAgB,sBAAsB,IAAI,MAAM,CAK/C;AACD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AACD,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjF"}
@@ -1,56 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pendingAutomaticBriefing = pendingAutomaticBriefing;
4
- exports.automaticBriefingError = automaticBriefingError;
5
- exports.retryAutomaticBriefing = retryAutomaticBriefing;
6
- exports.prepareAutomaticBriefing = prepareAutomaticBriefing;
7
- const node_crypto_1 = require("node:crypto");
8
- const schema_1 = require("../db/schema");
9
- const service_1 = require("../memory/service");
10
- const manager_1 = require("./manager");
11
- const store_1 = require("./store");
12
- function pendingAutomaticBriefing() {
13
- const row = (0, schema_1.getDb)().prepare("SELECT value FROM sync_settings WHERE key='auto_preparing_sync'").get();
14
- const id = row ? Number(row.value) : undefined;
15
- return id !== undefined && ((0, store_1.automaticSyncId)(false) === id || (0, store_1.automaticSyncId)(true) === id) ? id : (0, store_1.automaticSyncId)(false);
16
- }
17
- /** A failed provider run needs an explicit retry, not an endless paid timer loop.
18
- * Interrupted/cancelled runs may resume from their durable cached tree. */
19
- function automaticBriefingError() {
20
- const row = (0, schema_1.getDb)().prepare("SELECT value FROM sync_settings WHERE key='auto_briefing_failed'").get();
21
- if (!row)
22
- return '';
23
- const pending = pendingAutomaticBriefing();
24
- return pending === Number(row.value) ? `Automatic briefing #${pending} stopped. Open that sync to inspect or retry it, or retry automatic preparation. Completed summaries are retained.` : '';
25
- }
26
- function retryAutomaticBriefing() {
27
- (0, schema_1.getDb)().prepare("DELETE FROM sync_settings WHERE key='auto_briefing_failed'").run();
28
- }
29
- async function prepareAutomaticBriefing(signal) {
30
- signal.throwIfAborted();
31
- const pending = pendingAutomaticBriefing();
32
- if (pending === undefined && !(0, store_1.availableCount)())
33
- return;
34
- const id = pending ?? (0, store_1.startConversationSync)(`auto:${(0, node_crypto_1.randomUUID)()}`, true).id;
35
- (0, schema_1.getDb)().prepare("INSERT INTO sync_settings(key,value) VALUES ('auto_preparing_sync',?) ON CONFLICT(key) DO UPDATE SET value=excluded.value").run(String(id));
36
- store_1.backgroundSyncs.add(id);
37
- try {
38
- (0, store_1.assertAutomaticScope)(id);
39
- await (0, manager_1.generateReply)(id, undefined, undefined, { signal, deferHistory: true });
40
- signal.throwIfAborted();
41
- // Include the completed preparation's retained context in the readiness
42
- // receipt, outside a conversation and with the same cancellation owner.
43
- await (0, service_1.prepareHistory)(new Date().toISOString(), signal, true);
44
- signal.throwIfAborted();
45
- (0, schema_1.getDb)().prepare("DELETE FROM sync_settings WHERE key='auto_preparing_sync' AND value=?").run(String(id));
46
- }
47
- catch (error) {
48
- if (!signal.aborted)
49
- (0, schema_1.getDb)().prepare("INSERT INTO sync_settings(key,value) VALUES ('auto_briefing_failed',?) ON CONFLICT(key) DO UPDATE SET value=excluded.value").run(String(id));
50
- throw error;
51
- }
52
- finally {
53
- store_1.backgroundSyncs.delete(id);
54
- }
55
- }
56
- //# sourceMappingURL=automatic.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"automatic.js","sourceRoot":"","sources":["../../src/sync/automatic.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-focus.d.ts","sourceRoot":"","sources":["../../src/voice/history-focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGpD,MAAM,WAAW,iBAAiB;IAAG,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE;AAK9F;;gFAEgF;AAChF,wBAAgB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,SAAK,GAAG,iBAAiB,GAAG,SAAS,CASxH;AAED;6EAC6E;AAC7E,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG;IAAE,KAAK,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CA4B1J"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"history-focus.js","sourceRoot":"","sources":["../../src/voice/history-focus.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"preparation.d.ts","sourceRoot":"","sources":["../../src/voice/preparation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,aAAa,CAO7E;AAED;gFACgF;AAChF,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,iCAYrC;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,0CAIlD;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAIzD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"preparation.js","sourceRoot":"","sources":["../../src/voice/preparation.ts"],"names":[],"mappings":"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"}