@node-agent/local 0.0.0-stage → 0.1.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.
package/dist/local.js ADDED
@@ -0,0 +1,570 @@
1
+ // LocalRuntime: one shared bus, and one worker thread per node in this process by default.
2
+ //
3
+ // Nodes are global. A user is a table on the bus (which nodes it may use), not a second copy of the
4
+ // processes. `connect` ensures the shared node exists and adds it to that user's table; `disconnect`
5
+ // only removes the table entry and leaves the node and the runtime-owned bus running.
6
+ import { spawn } from 'node:child_process';
7
+ import { createWriteStream, existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync, } from 'node:fs';
8
+ import { rm } from 'node:fs/promises';
9
+ import { createRequire } from 'node:module';
10
+ import { dirname, join, resolve } from 'node:path';
11
+ import { createHash, randomUUID } from 'node:crypto';
12
+ import { homedir } from 'node:os';
13
+ import { fileURLToPath } from 'node:url';
14
+ import { Worker } from 'node:worker_threads';
15
+ import { Bus, SERVICE_TENANT } from 'node-agent-bus';
16
+ import { RuntimeError, nodeName, userName, } from './runtime/index.js';
17
+ function envStrings(env) {
18
+ const out = {};
19
+ for (const [key, value] of Object.entries(env ?? {}))
20
+ if (typeof value === 'string')
21
+ out[key] = value;
22
+ return out;
23
+ }
24
+ function tail(text, limit = 1200) {
25
+ return text.length <= limit ? text : text.slice(-limit);
26
+ }
27
+ /** A port the bus can listen on: 0 asks the OS, otherwise scan from the base. */
28
+ async function allocatePort(host, base = 0, span = 100) {
29
+ const { createServer } = await import('node:net');
30
+ const listen = (port) => new Promise((resolve) => {
31
+ const server = createServer();
32
+ server.once('error', () => resolve(null));
33
+ server.listen(port, host, () => {
34
+ const address = server.address();
35
+ const picked = typeof address === 'object' && address !== null ? address.port : port;
36
+ server.close(() => resolve(picked));
37
+ });
38
+ });
39
+ if (base <= 0) {
40
+ const picked = await listen(0);
41
+ if (picked === null)
42
+ throw new RuntimeError('bus_start_failed', 'could not allocate a port');
43
+ return picked;
44
+ }
45
+ for (let port = base; port < base + Math.max(1, span); port += 1) {
46
+ const picked = await listen(port);
47
+ if (picked !== null)
48
+ return picked;
49
+ }
50
+ throw new RuntimeError('bus_start_failed', `no free port in ${base}..${base + span - 1}`);
51
+ }
52
+ function nodeAgentRoot() {
53
+ return resolve(process.env.NODE_AGENT_HOME?.trim() || join(homedir(), '.node_agent'));
54
+ }
55
+ /** Runtime-owned state (user homes, installed packages, bus logs) lives beside node data, under
56
+ * `<node-agent-home>/runtime`. An explicit option remains for tests and embedders. */
57
+ function runtimeRoot(explicit) {
58
+ return explicit === undefined ? join(nodeAgentRoot(), 'runtime') : resolve(explicit);
59
+ }
60
+ function startProcess(command, args, env, logPath) {
61
+ mkdirSync(dirname(logPath), { recursive: true });
62
+ const log = createWriteStream(logPath, { flags: 'a' });
63
+ const child = spawn(command, [...args], {
64
+ env,
65
+ detached: true,
66
+ stdio: ['ignore', 'pipe', 'pipe'],
67
+ });
68
+ let resolveExit;
69
+ const exited = new Promise((resolve) => (resolveExit = resolve));
70
+ const record = { child, log, output: '', exitCode: null, exited };
71
+ const keep = (chunk) => {
72
+ const text = chunk.toString('utf8');
73
+ record.output = tail(record.output + text, 16_000);
74
+ log.write(chunk);
75
+ };
76
+ child.once('exit', (code) => {
77
+ record.exitCode = code;
78
+ resolveExit();
79
+ });
80
+ child.once('error', (error) => {
81
+ record.output = tail(`${record.output}${error.message}\n`, 16_000);
82
+ log.write(`${error.message}\n`);
83
+ if (record.exitCode === null)
84
+ record.exitCode = 1;
85
+ resolveExit();
86
+ });
87
+ child.stdout?.on('data', keep);
88
+ child.stderr?.on('data', keep);
89
+ return record;
90
+ }
91
+ /** Start one node as a worker thread: same OS process, its own module graph and event loop. */
92
+ function startWorker(entry, args, env, logPath) {
93
+ mkdirSync(dirname(logPath), { recursive: true });
94
+ const log = createWriteStream(logPath, { flags: 'a' });
95
+ const worker = new Worker(entry, {
96
+ argv: [...args],
97
+ env: {
98
+ ...env,
99
+ // A debugger attached to the parent must not also attach to every node worker.
100
+ NODE_OPTIONS: '',
101
+ VSCODE_INSPECTOR_OPTIONS: '',
102
+ },
103
+ execArgv: [],
104
+ stdin: false,
105
+ stdout: true,
106
+ stderr: true,
107
+ });
108
+ let resolveExit;
109
+ const exited = new Promise((resolve) => (resolveExit = resolve));
110
+ const record = { child: worker, worker, log, output: '', exitCode: null, exited };
111
+ const keep = (chunk) => {
112
+ const text = chunk.toString('utf8');
113
+ record.output = tail(record.output + text, 16_000);
114
+ log.write(chunk);
115
+ };
116
+ worker.stdout?.on('data', keep);
117
+ worker.stderr?.on('data', keep);
118
+ worker.once('exit', (code) => {
119
+ record.exitCode = code;
120
+ resolveExit();
121
+ });
122
+ worker.once('error', (error) => {
123
+ const text = error instanceof Error ? (error.stack ?? error.message) : String(error);
124
+ record.output = tail(`${record.output}${text}\n`, 16_000);
125
+ log.write(`${text}\n`);
126
+ if (record.exitCode === null)
127
+ record.exitCode = 1;
128
+ resolveExit();
129
+ });
130
+ return record;
131
+ }
132
+ async function stopProcess(record) {
133
+ if (record.exitCode !== null) {
134
+ record.log.end();
135
+ return;
136
+ }
137
+ const exited = record.exited;
138
+ if (record.worker !== undefined) {
139
+ await record.worker.terminate();
140
+ await Promise.race([exited, new Promise((resolve) => setTimeout(resolve, 3_000))]);
141
+ record.log.end();
142
+ return;
143
+ }
144
+ const child = record.child;
145
+ const pid = child.pid;
146
+ try {
147
+ if (pid !== undefined)
148
+ process.kill(-pid, 'SIGTERM');
149
+ else
150
+ child.kill('SIGTERM');
151
+ }
152
+ catch {
153
+ child.kill('SIGTERM');
154
+ }
155
+ const timeout = new Promise((resolve) => setTimeout(resolve, 3_000));
156
+ await Promise.race([exited, timeout]);
157
+ if (record.exitCode === null) {
158
+ try {
159
+ if (pid !== undefined)
160
+ process.kill(-pid, 'SIGKILL');
161
+ else
162
+ child.kill('SIGKILL');
163
+ }
164
+ catch {
165
+ // already gone
166
+ }
167
+ await exited;
168
+ }
169
+ record.log.end();
170
+ }
171
+ /** Resolve a package name or a package root to the directory holding package.json. */
172
+ function packageRoot(ref) {
173
+ const direct = resolve(ref);
174
+ if (existsSync(join(direct, 'package.json')))
175
+ return direct;
176
+ try {
177
+ const require = createRequire(import.meta.url);
178
+ let root = dirname(require.resolve(ref));
179
+ while (!existsSync(join(root, 'package.json'))) {
180
+ const parent = dirname(root);
181
+ if (parent === root)
182
+ break;
183
+ root = parent;
184
+ }
185
+ if (existsSync(join(root, 'package.json')))
186
+ return root;
187
+ }
188
+ catch {
189
+ // fall through to the workspace sibling
190
+ }
191
+ const sibling = fileURLToPath(new URL(`../../${ref}`, import.meta.url));
192
+ if (existsSync(join(sibling, 'package.json')))
193
+ return sibling;
194
+ if (!ref.includes('/') && !ref.startsWith('.')) {
195
+ try {
196
+ return packageRoot(`node-agent-${ref}`);
197
+ }
198
+ catch {
199
+ // fall through
200
+ }
201
+ }
202
+ throw new RuntimeError('node_start_failed', `not a node package: ${ref}`);
203
+ }
204
+ function packageEntry(root) {
205
+ const built = join(root, 'dist', 'serve.js');
206
+ if (existsSync(built))
207
+ return built;
208
+ try {
209
+ const json = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
210
+ if (typeof json.main === 'string' && json.main !== '')
211
+ return join(root, json.main);
212
+ }
213
+ catch {
214
+ // fall through to the error below
215
+ }
216
+ throw new RuntimeError('node_start_failed', `node entry does not exist under ${root}`);
217
+ }
218
+ function manifestVersion(root) {
219
+ try {
220
+ const json = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
221
+ return typeof json.version === 'string' ? json.version : '';
222
+ }
223
+ catch {
224
+ return '';
225
+ }
226
+ }
227
+ function manifestName(root) {
228
+ try {
229
+ const json = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
230
+ const id = json.node?.id;
231
+ if (typeof id === 'string' && id !== '')
232
+ return nodeName(id);
233
+ if (typeof json.name === 'string' && json.name !== '')
234
+ return nodeName(json.name);
235
+ }
236
+ catch {
237
+ // fall through
238
+ }
239
+ throw new RuntimeError('invalid_node', `package has no node.id: ${root}`);
240
+ }
241
+ async function waitForNode(bus, name, record, timeoutMs = 30_000) {
242
+ const deadline = Date.now() + timeoutMs;
243
+ while (Date.now() < deadline) {
244
+ if (bus.envelopeNodes.has(name))
245
+ return;
246
+ if (record.exitCode !== null)
247
+ throw new RuntimeError('node_start_failed', `${name} exited with ${record.exitCode}`);
248
+ await new Promise((resolve) => setTimeout(resolve, 50));
249
+ }
250
+ throw new RuntimeError('node_start_failed', `${name} did not register within ${timeoutMs}ms`);
251
+ }
252
+ export class LocalRuntime {
253
+ /** One node launch at a time: two users asking at startup must not spawn the same shared node twice. */
254
+ launchQueue = Promise.resolve();
255
+ options;
256
+ logger;
257
+ busRecord;
258
+ nodes = new Map();
259
+ knownUsers = new Set();
260
+ constructor(options = {}) {
261
+ this.options = options;
262
+ this.logger = options.logger;
263
+ }
264
+ /** The shared bus, once it is listening. Used by the process entry to print its user table. */
265
+ get bus() {
266
+ return this.busRecord?.bus;
267
+ }
268
+ home(user) {
269
+ const root = runtimeRoot(this.options.home);
270
+ const users = join(root, 'users');
271
+ const dir = join(users, userName(user));
272
+ if (!dir.startsWith(users + '/'))
273
+ throw new RuntimeError('invalid_user', `user home escapes the runtime root: ${user}`);
274
+ mkdirSync(join(dir, 'logs'), { recursive: true });
275
+ return dir;
276
+ }
277
+ nodeHome(name) {
278
+ // Node-owned durable files live under the node-agent home, not the runtime's own user/package
279
+ // home: `<node-agent-home>/<node-name>/`. The runtime only creates the log directory here; a node
280
+ // owns everything else below it.
281
+ const root = nodeAgentRoot();
282
+ const dir = join(root, nodeName(name));
283
+ if (!dir.startsWith(root + '/'))
284
+ throw new RuntimeError('invalid_node', `node home escapes the node-agent home: ${name}`);
285
+ mkdirSync(join(dir, 'logs'), { recursive: true });
286
+ return dir;
287
+ }
288
+ /** The bus never sees a display name: it sees a stable digest of the name. */
289
+ busId(user) {
290
+ return user === SERVICE_TENANT ? SERVICE_TENANT : this.busUser(user);
291
+ }
292
+ busUser(user) {
293
+ userName(user);
294
+ if (this.busRecord === undefined)
295
+ throw new RuntimeError('bus_not_running', 'the bus is not running');
296
+ return createHash('sha256').update(`node-agent\0${user}`).digest('hex');
297
+ }
298
+ tokenFor() {
299
+ const token = this.options.token;
300
+ if (typeof token === 'string' && token !== '')
301
+ return token;
302
+ // Keep a generated token under the runtime home (0600) so credentials derived from it - private
303
+ // node join tokens and the remote history bearer - stay stable across a restart. An explicit
304
+ // NODE_AGENT_TOKEN still wins and is never written here.
305
+ const directory = runtimeRoot(this.options.home);
306
+ const file = join(directory, 'bus-token');
307
+ try {
308
+ const kept = readFileSync(file, 'utf8').trim();
309
+ if (kept !== '')
310
+ return kept;
311
+ }
312
+ catch {
313
+ // first start, or an unreadable file: generate one below
314
+ }
315
+ const generated = `runtime-${randomUUID()}`;
316
+ try {
317
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
318
+ writeFileSync(file, `${generated}\n`, { mode: 0o600 });
319
+ }
320
+ catch (error) {
321
+ throw new RuntimeError('bus_start_failed', `cannot persist the runtime bus token at ${file}: ${error instanceof Error ? error.message : String(error)}`);
322
+ }
323
+ return generated;
324
+ }
325
+ async launchBus(options = {}) {
326
+ const current = this.busRecord;
327
+ if (current !== undefined && current.state === 'running')
328
+ return current.handle;
329
+ const host = options.host ?? this.options.host ?? '127.0.0.1';
330
+ const port = options.port ?? (await allocatePort(host, this.options.basePort, this.options.portSpan));
331
+ const token = options.token ?? this.tokenFor();
332
+ const bus = new Bus(token);
333
+ try {
334
+ await bus.listen(port, host);
335
+ }
336
+ catch (error) {
337
+ throw new RuntimeError('bus_start_failed', `could not start the bus on ${host}:${port}: ${error instanceof Error ? error.message : String(error)}`);
338
+ }
339
+ const record = {
340
+ bus,
341
+ host,
342
+ port: bus.port,
343
+ url: bus.url,
344
+ token,
345
+ state: 'running',
346
+ handle: undefined,
347
+ };
348
+ record.handle = {
349
+ kind: 'bus',
350
+ host: record.host,
351
+ port: record.port,
352
+ url: record.url,
353
+ token: record.token,
354
+ pid: process.pid,
355
+ get state() {
356
+ return record.state;
357
+ },
358
+ stop: async () => await this.stopBus(),
359
+ };
360
+ this.busRecord = record;
361
+ this.logger?.info(`bus: ${record.url}`);
362
+ return record.handle;
363
+ }
364
+ async stopBus() {
365
+ for (const node of [...this.nodes.values()])
366
+ await this.stopNode(node.name);
367
+ const record = this.busRecord;
368
+ if (record === undefined)
369
+ return;
370
+ record.state = 'stopped';
371
+ record.bus.close();
372
+ this.busRecord = undefined;
373
+ }
374
+ async launchNode(node, options = {}) {
375
+ const run = this.launchQueue.then(() => this.launchNodeNow(node, options));
376
+ this.launchQueue = run.then(() => undefined, () => undefined);
377
+ return run;
378
+ }
379
+ async launchNodeNow(node, options = {}) {
380
+ const root = packageRoot(options.dir ?? node);
381
+ const name = nodeName(options.name ?? manifestName(root));
382
+ const version = manifestVersion(root);
383
+ const existing = this.nodes.get(name);
384
+ if (existing !== undefined && existing.state === 'running' && existing.exitCode === null)
385
+ return existing.handle;
386
+ const bus = await this.launchBus();
387
+ const entry = packageEntry(root);
388
+ const dir = this.nodeHome(name);
389
+ const env = {
390
+ ...process.env,
391
+ ...envStrings(this.options.env),
392
+ ...envStrings(options.env),
393
+ NODE_AGENT_BUS_URL: bus.url,
394
+ NODE_AGENT_TOKEN: bus.token,
395
+ // The history node files units under its bearer, so that credential must survive a runtime
396
+ // restart even though the bus token is deliberately random per start.
397
+ NODE_AGENT_HISTORY_TOKEN: process.env.NODE_AGENT_HISTORY_TOKEN?.trim() ||
398
+ process.env.NODE_AGENT_TOKEN?.trim() ||
399
+ bus.token,
400
+ // The bus has one envelope protocol; packages built against the older SDK default must
401
+ // still use its WebSocket session, not the removed legacy handshake.
402
+ NODE_AGENT_TRANSPORT: 'websocket',
403
+ NODE_AGENT_TENANT: SERVICE_TENANT,
404
+ NODE_AGENT_NODE_NAME: name,
405
+ };
406
+ let record;
407
+ try {
408
+ record =
409
+ (this.options.isolation ?? 'worker') === 'worker'
410
+ ? startWorker(entry, options.args ?? [], env, join(dir, 'logs', `${name}.log`))
411
+ : startProcess(this.options.nodeBinary ?? process.execPath, [entry, ...(options.args ?? [])], env, join(dir, 'logs', `${name}.log`));
412
+ }
413
+ catch (error) {
414
+ throw new RuntimeError('spawn_failed', `could not spawn ${name}: ${error instanceof Error ? error.message : String(error)}`);
415
+ }
416
+ const nodeRecord = {
417
+ ...record,
418
+ outputRef: record,
419
+ name,
420
+ version,
421
+ dir: root,
422
+ state: 'starting',
423
+ handle: undefined,
424
+ };
425
+ nodeRecord.handle = {
426
+ kind: 'node',
427
+ name,
428
+ version,
429
+ dir: root,
430
+ pid: nodeRecord.worker === undefined ? nodeRecord.child.pid : process.pid,
431
+ get state() {
432
+ return nodeRecord.state;
433
+ },
434
+ stop: async () => await this.stopNode(name),
435
+ };
436
+ this.nodes.set(name, nodeRecord);
437
+ try {
438
+ await waitForNode(this.busRecord.bus, name, nodeRecord);
439
+ this.busRecord.bus.user(SERVICE_TENANT, true).connect(name);
440
+ }
441
+ catch (error) {
442
+ nodeRecord.state = 'failed';
443
+ this.nodes.delete(name);
444
+ await stopProcess(nodeRecord);
445
+ throw new RuntimeError('node_start_failed', `${error instanceof Error ? error.message : String(error)}\n${tail(nodeRecord.output)}`);
446
+ }
447
+ nodeRecord.state = 'running';
448
+ this.logger?.info(`node ${name}: ${nodeRecord.worker === undefined ? 'pid' : 'worker'}`);
449
+ return nodeRecord.handle;
450
+ }
451
+ async stopNode(node) {
452
+ const name = nodeName(node);
453
+ const record = this.nodes.get(name);
454
+ if (record === undefined)
455
+ return;
456
+ record.state = 'stopped';
457
+ await stopProcess(record);
458
+ this.nodes.delete(name);
459
+ for (const space of this.busRecord?.bus.users.values() ?? [])
460
+ space.disconnect(name);
461
+ }
462
+ async createUser(user) {
463
+ const dir = this.home(user);
464
+ this.knownUsers.add(user);
465
+ if (this.busRecord !== undefined)
466
+ this.busRecord.bus.user(this.busId(user), true);
467
+ return { user, home: dir, state: 'ready' };
468
+ }
469
+ async destroyUser(user) {
470
+ userName(user);
471
+ const dir = this.home(user);
472
+ if (this.busRecord !== undefined)
473
+ this.busRecord.bus.users.delete(this.busId(user));
474
+ await rm(dir, { recursive: true, force: true });
475
+ }
476
+ async connect(user, node, options = {}) {
477
+ this.knownUsers.add(user);
478
+ // A connect by node name must reuse the already-running shared node; only a launch by package
479
+ // root needs package resolution.
480
+ const existing = this.nodes.get(nodeName(node));
481
+ let resolved = options;
482
+ if (existing === undefined || existing.state !== 'running' || existing.exitCode !== null) {
483
+ const name = nodeName(node);
484
+ const installed = this.installedPackage(user, name);
485
+ if (installed !== undefined)
486
+ resolved = { ...options, dir: installed };
487
+ }
488
+ const handle = existing !== undefined && existing.state === 'running' && existing.exitCode === null
489
+ ? existing.handle
490
+ : await this.launchNode(node, resolved);
491
+ this.busRecord.bus.user(this.busId(user), true).connect(handle.name);
492
+ return handle;
493
+ }
494
+ async disconnect(user, node) {
495
+ userName(user);
496
+ const name = nodeName(node);
497
+ if (this.busRecord !== undefined)
498
+ this.busRecord.bus.user(this.busId(user))?.disconnect(name);
499
+ }
500
+ /** Every user this runtime has connected, and the shared nodes each one may reach. */
501
+ async sessions(user) {
502
+ const wanted = user === undefined ? [...this.knownUsers] : this.knownUsers.has(user) ? [user] : [];
503
+ const bus = this.busRecord?.bus;
504
+ const table = wanted.map((one) => {
505
+ const connected = bus === undefined ? undefined : bus.user(this.busId(one));
506
+ const names = connected === undefined ? [] : [...connected.nodes];
507
+ const webui = this.webuiTarget();
508
+ return {
509
+ user: one,
510
+ agents: names.includes('agent')
511
+ ? [{ name: one, running: this.nodeRunning('agent'), rss_bytes: null, webui }]
512
+ : [],
513
+ nodes: names.map((name) => ({
514
+ name,
515
+ version: this.nodes.get(name)?.version ?? '',
516
+ running: this.nodeRunning(name),
517
+ dir: this.nodes.get(name)?.dir ?? '',
518
+ pid: this.nodes.get(name)?.worker === undefined
519
+ ? (this.nodes.get(name)?.child?.pid ?? null)
520
+ : process.pid,
521
+ })),
522
+ userpage: names.includes('userpage'),
523
+ };
524
+ });
525
+ return user === undefined
526
+ ? { users: table }
527
+ : (table[0] ?? { user, agents: [], nodes: [], userpage: false });
528
+ }
529
+ /** The newest package the installer materialized for this user, if there is one. */
530
+ installedPackage(user, name) {
531
+ const root = join(runtimeRoot(this.options.home), 'packages', user, name);
532
+ try {
533
+ const versions = readdirSync(root, { withFileTypes: true })
534
+ .filter((entry) => entry.isDirectory() && existsSync(join(root, entry.name, 'package.json')))
535
+ .map((entry) => entry.name)
536
+ .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
537
+ const version = versions.at(-1);
538
+ return version === undefined ? undefined : join(root, version);
539
+ }
540
+ catch {
541
+ return undefined;
542
+ }
543
+ }
544
+ nodeRunning(name) {
545
+ const record = this.nodes.get(name);
546
+ return record !== undefined && record.state === 'running' && record.exitCode === null;
547
+ }
548
+ /** Where the shared page node printed its address, if it has started yet. */
549
+ webuiTarget() {
550
+ const output = this.nodeOutput('webui') ?? '';
551
+ const found = /webui:\s*http:\/\/([^:\s/]+):(\d+)/.exec(output);
552
+ if (found === null)
553
+ return undefined;
554
+ const port = Number(found[2]);
555
+ return port > 0 && port <= 65535 ? { host: found[1], port } : undefined;
556
+ }
557
+ /** The shared bus, for a trusted caller that has to proxy an outside node. */
558
+ busTarget() {
559
+ const record = this.busRecord;
560
+ return record === undefined ? undefined : { url: record.url, token: record.token };
561
+ }
562
+ /** Recent stdout/stderr of one running node, for the entry process to surface its address. */
563
+ nodeOutput(node) {
564
+ return this.nodes.get(nodeName(node))?.outputRef.output;
565
+ }
566
+ async stopAll() {
567
+ await this.stopBus();
568
+ }
569
+ }
570
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../src/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /** The cookie a successful login hands out. Its value is sha256(token) in hex, never the token. */
2
+ export declare const COOKIE_NAME = "node_agent_access";
3
+ /** How long a login lasts, in seconds (30 days), the same as the gateway's cookie. */
4
+ export declare const COOKIE_MAX_AGE = 2592000;
5
+ export interface ProxyOptions {
6
+ /** The one token a browser exchanges for the cookie. Never printed, never put in a URL. */
7
+ token: string;
8
+ /** The stack behind the door: the webui address serve.ts just read off its own log line. */
9
+ upstream: string;
10
+ /** Default `127.0.0.1`: the browser is on this host unless a deployment says otherwise. */
11
+ bind?: string;
12
+ /** Default `8080`. `0` asks the OS for a free port, which is what the tests do. */
13
+ port?: number;
14
+ /** `true` marks the cookie `Secure`; set it when TLS terminates in front. Default `false`. */
15
+ secure?: boolean;
16
+ }
17
+ export interface ProxyHandle {
18
+ /** Where the door listens, `http://<bind>:<port>` — the line serve.ts prints. */
19
+ url: string;
20
+ bind: string;
21
+ /** The port actually bound, which is the requested one except when it was `0`. */
22
+ port: number;
23
+ close(): Promise<void>;
24
+ }
25
+ /**
26
+ * Start the door. The upstream is fixed at start time; nothing in a request can move it, and an
27
+ * absolute-form request line (`GET http://elsewhere/`) is refused rather than resolved.
28
+ */
29
+ export declare function startProxy(options: ProxyOptions): Promise<ProxyHandle>;