@telorun/cli 0.26.1 → 0.27.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.
@@ -0,0 +1,28 @@
1
+ export interface Blob {
2
+ bytes: Uint8Array;
3
+ mediaType: string;
4
+ }
5
+ /**
6
+ * In-memory, content-addressed blob store for debug binary payloads. The debug
7
+ * serializer offloads every `Uint8Array` here and emits a small pointer in the
8
+ * event log instead of the bytes; the `DebugServer` serves them at `/blobs/:id`
9
+ * on demand. Content addressing (sha1 of the bytes) deduplicates — a redraw loop
10
+ * that emits the same image every turn stores it once.
11
+ *
12
+ * Bounded by a total-byte LRU so a long session of large payloads can't grow
13
+ * without limit; evicted blobs 404 (the event log keeps the pointer + metadata,
14
+ * so the UI still shows *what* it was). Both `put` and `get` refresh recency, so
15
+ * a blob you're actively viewing stays resident.
16
+ */
17
+ export declare class LruBlobStore {
18
+ private readonly maxBytes;
19
+ private readonly map;
20
+ private totalBytes;
21
+ constructor(maxBytes?: number);
22
+ /** Store `bytes`, returning a stable content id. Idempotent for equal bytes. */
23
+ put(bytes: Uint8Array, mediaType: string): string;
24
+ get(id: string): Blob | undefined;
25
+ private touch;
26
+ private evict;
27
+ }
28
+ //# sourceMappingURL=blob-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-store.d.ts","sourceRoot":"","sources":["../src/blob-store.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAHrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA2B;IAC/C,OAAO,CAAC,UAAU,CAAK;gBAEM,QAAQ,SAAoB;IAEzD,gFAAgF;IAChF,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAajD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAMjC,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,KAAK;CAQd"}
@@ -0,0 +1,53 @@
1
+ import { createHash } from "crypto";
2
+ /**
3
+ * In-memory, content-addressed blob store for debug binary payloads. The debug
4
+ * serializer offloads every `Uint8Array` here and emits a small pointer in the
5
+ * event log instead of the bytes; the `DebugServer` serves them at `/blobs/:id`
6
+ * on demand. Content addressing (sha1 of the bytes) deduplicates — a redraw loop
7
+ * that emits the same image every turn stores it once.
8
+ *
9
+ * Bounded by a total-byte LRU so a long session of large payloads can't grow
10
+ * without limit; evicted blobs 404 (the event log keeps the pointer + metadata,
11
+ * so the UI still shows *what* it was). Both `put` and `get` refresh recency, so
12
+ * a blob you're actively viewing stays resident.
13
+ */
14
+ export class LruBlobStore {
15
+ maxBytes;
16
+ map = new Map(); // insertion order = LRU order
17
+ totalBytes = 0;
18
+ constructor(maxBytes = 100 * 1024 * 1024) {
19
+ this.maxBytes = maxBytes;
20
+ }
21
+ /** Store `bytes`, returning a stable content id. Idempotent for equal bytes. */
22
+ put(bytes, mediaType) {
23
+ const id = createHash("sha1").update(bytes).digest("hex").slice(0, 16);
24
+ const existing = this.map.get(id);
25
+ if (existing) {
26
+ this.touch(id, existing);
27
+ return id;
28
+ }
29
+ this.map.set(id, { bytes, mediaType });
30
+ this.totalBytes += bytes.byteLength;
31
+ this.evict();
32
+ return id;
33
+ }
34
+ get(id) {
35
+ const blob = this.map.get(id);
36
+ if (blob)
37
+ this.touch(id, blob);
38
+ return blob;
39
+ }
40
+ touch(id, blob) {
41
+ this.map.delete(id);
42
+ this.map.set(id, blob);
43
+ }
44
+ evict() {
45
+ while (this.totalBytes > this.maxBytes && this.map.size > 1) {
46
+ const oldest = this.map.keys().next().value;
47
+ const blob = this.map.get(oldest);
48
+ this.map.delete(oldest);
49
+ this.totalBytes -= blob.bytes.byteLength;
50
+ }
51
+ }
52
+ }
53
+ //# sourceMappingURL=blob-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-store.js","sourceRoot":"","sources":["../src/blob-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAOpC;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,YAAY;IAIM;IAHZ,GAAG,GAAG,IAAI,GAAG,EAAgB,CAAC,CAAC,8BAA8B;IACtE,UAAU,GAAG,CAAC,CAAC;IAEvB,YAA6B,WAAW,GAAG,GAAG,IAAI,GAAG,IAAI;QAA5B,aAAQ,GAAR,QAAQ,CAAoB;IAAG,CAAC;IAE7D,gFAAgF;IAChF,GAAG,CAAC,KAAiB,EAAE,SAAiB;QACtC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,EAAU,EAAE,IAAU;QAClC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK;QACX,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAe,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;YACnC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxB,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAC3C,CAAC;IACH,CAAC;CACF"}
@@ -2,7 +2,13 @@ import type { Argv } from "yargs";
2
2
  type RunArgv = {
3
3
  path: string;
4
4
  verbose: boolean;
5
+ /** `--debug`: write the `.telo.debug.jsonl` event log. No network, no UI. */
5
6
  debug: boolean;
7
+ /** `--inspect[=[host:]port]`: start the live inspection endpoint. `undefined`
8
+ * when the flag is absent; the (possibly empty) string value otherwise. */
9
+ inspect?: string;
10
+ /** `--no-open`: with `--inspect`, don't auto-open the UI in a browser. */
11
+ open: boolean;
6
12
  snapshotOnExit: boolean;
7
13
  watch: boolean;
8
14
  /** `--no-cache-write`: read the baked cache but never persist derived entries. */
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAsIlC,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AA0GF,wBAAsB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCtD;AA8ED,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAoD5C"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AA2IlC,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,KAAK,EAAE,OAAO,CAAC;IACf;gFAC4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,kFAAkF;IAClF,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAsMF,wBAAsB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CtD;AAsFD,wBAAgB,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAoE5C"}
@@ -3,8 +3,13 @@ import * as dotenv from "dotenv";
3
3
  import * as fs from "fs";
4
4
  import * as path from "path";
5
5
  import { fileURLToPath } from "url";
6
- import { createLogger, formatDiagnostics } from "../logger.js";
7
6
  import { attachControllerProgress } from "../controller-progress.js";
7
+ import { DebugEventSubscriber } from "../debug-event-subscriber.js";
8
+ import { serializeEvent } from "../debug-serialize.js";
9
+ import { DebugServer } from "../debug-server.js";
10
+ import { createLogger, formatDiagnostics } from "../logger.js";
11
+ import { canOpenBrowser, openBrowser } from "../open-browser.js";
12
+ import { resolveUiBundle } from "../ui-fetch.js";
8
13
  /**
9
14
  * Load .env and .env.local from the manifest's directory into process.env.
10
15
  * Priority (highest to lowest): process.env > .env.local > .env
@@ -127,12 +132,89 @@ function createWatcherSet(log, onChange) {
127
132
  },
128
133
  };
129
134
  }
135
+ const DEFAULT_INSPECT_HOST = "127.0.0.1";
136
+ const DEFAULT_INSPECT_PORT = 9230;
137
+ /** Parse `--inspect`'s value: `""` → defaults, `"9300"` → port only,
138
+ * `"host:9300"` / `"[::1]:9300"` → both, `"host"` → host only. */
139
+ function parseInspectTarget(value) {
140
+ const v = value.trim();
141
+ if (!v)
142
+ return { host: DEFAULT_INSPECT_HOST, port: DEFAULT_INSPECT_PORT };
143
+ const bracket = v.match(/^\[(.+)\]:(\d+)$/);
144
+ if (bracket)
145
+ return { host: bracket[1], port: Number(bracket[2]) };
146
+ if (/^\d+$/.test(v))
147
+ return { host: DEFAULT_INSPECT_HOST, port: Number(v) };
148
+ const idx = v.lastIndexOf(":");
149
+ if (idx >= 0) {
150
+ const portStr = v.slice(idx + 1);
151
+ return {
152
+ host: v.slice(0, idx) || DEFAULT_INSPECT_HOST,
153
+ port: /^\d+$/.test(portStr) ? Number(portStr) : DEFAULT_INSPECT_PORT,
154
+ };
155
+ }
156
+ return { host: v, port: DEFAULT_INSPECT_PORT };
157
+ }
158
+ function isLoopbackHost(host) {
159
+ return host === "127.0.0.1" || host === "::1" || host === "localhost";
160
+ }
130
161
  function registryUrlFor(argv) {
131
162
  // The CLI owns the registry-URL fallback chain: --registry-url > TELO_REGISTRY_URL >
132
163
  // RegistrySource default. The kernel itself does no env lookup — programmatic
133
164
  // callers (tests, SDK) pass registryUrl explicitly when they need one.
134
165
  return argv.registryUrl ?? process.env.TELO_REGISTRY_URL ?? "https://registry.telo.run";
135
166
  }
167
+ /**
168
+ * Stand up the enabled sinks once per CLI process: `--debug` opens the JSONL file
169
+ * sink; `--inspect` starts the live endpoint (loopback by default) and serves the
170
+ * on-demand UI. The two compose — either, both, or (when neither flag is set) the
171
+ * caller skips this entirely. A watch session re-attaches each rebuilt kernel via
172
+ * {@link DebugSession.attach} rather than recreating sinks, so the endpoint's port
173
+ * stays stable and the replay buffer + JSONL persist across reloads.
174
+ */
175
+ async function startDebugSession(argv, log, cacheRoot) {
176
+ let fileSink;
177
+ let eventLogPath;
178
+ if (argv.debug) {
179
+ // Stream next to the manifest by default (cwd fallback for URL entries).
180
+ const debugDir = resolveEntryDir(argv.path) ?? process.cwd();
181
+ eventLogPath = path.join(debugDir, ".telo.debug.jsonl");
182
+ fileSink = new DebugEventSubscriber(eventLogPath);
183
+ await fileSink.open();
184
+ log.info(`Debug log: ${eventLogPath}`);
185
+ }
186
+ let server;
187
+ if (argv.inspect !== undefined) {
188
+ const { host, port } = parseInspectTarget(argv.inspect);
189
+ if (!isLoopbackHost(host)) {
190
+ log.info(log.warn(`[inspect] binding ${host}:${port} — the inspection endpoint streams event ` +
191
+ `payloads (which can include secrets) to anyone who can reach this address.`));
192
+ }
193
+ const uiHtmlPath = (await resolveUiBundle(cacheRoot)) ?? undefined;
194
+ server = new DebugServer({ host, port, jsonlPath: eventLogPath, uiHtmlPath });
195
+ await server.start();
196
+ log.info(`Inspect: ${server.url}`);
197
+ // Open the UI once; reloads re-attach to the same endpoint, so no new tab.
198
+ // Skipped on CI / headless boxes.
199
+ if (argv.open && canOpenBrowser()) {
200
+ openBrowser(server.url);
201
+ }
202
+ }
203
+ return {
204
+ attach(kernel) {
205
+ // One `*` tap, serialized once, fanned to whichever sinks are enabled. The
206
+ // kernel knows nothing of debug/inspect — it's a plain event listener.
207
+ kernel.on("*", (event) => {
208
+ const line = serializeEvent(event.name, event.payload, event.metadata, server?.blobStore);
209
+ void fileSink?.write(line);
210
+ server?.push(line);
211
+ });
212
+ },
213
+ stop() {
214
+ server?.stop();
215
+ },
216
+ };
217
+ }
136
218
  async function buildKernel(argv, log, cacheRoot) {
137
219
  const registryUrl = argv.registryUrl ?? process.env.TELO_REGISTRY_URL;
138
220
  // The manifest cache (populated by `telo install`) wins over the registry
@@ -152,12 +234,6 @@ async function buildKernel(argv, log, cacheRoot) {
152
234
  // (so captured logs/CI output get the lines too); otherwise gate on TTY
153
235
  // so CI and the docker service stay silent.
154
236
  attachControllerProgress(kernel, log, { force: argv.verbose });
155
- if (argv.debug) {
156
- const debugDir = path.join(process.cwd(), ".telo-debug");
157
- const eventStreamPath = path.join(debugDir, "events.jsonl");
158
- await kernel.enableEventStream(eventStreamPath);
159
- log.info(`Event stream enabled: ${eventStreamPath}`);
160
- }
161
237
  return kernel;
162
238
  }
163
239
  /**
@@ -222,8 +298,12 @@ export async function run(argv) {
222
298
  }
223
299
  // Resolve the `.telo` cache root once per invocation, then thread it.
224
300
  const cacheRoot = resolveCacheRoot(argv.path);
301
+ const debug = argv.debug || argv.inspect !== undefined
302
+ ? await startDebugSession(argv, log, cacheRoot)
303
+ : undefined;
225
304
  try {
226
305
  const kernel = await buildKernel(argv, log, cacheRoot);
306
+ debug?.attach(kernel);
227
307
  const shutdown = () => {
228
308
  // Cooperatively cancel the boot run first (so honoring targets / in-flight
229
309
  // invoke trees stop early), then unblock the idle wait for graceful exit.
@@ -239,11 +319,16 @@ export async function run(argv) {
239
319
  });
240
320
  await persistManifestCache(argv, kernel, log, cacheRoot);
241
321
  await kernel.start();
322
+ // start() resolves once the app is idle/torn down (incl. via the SIGINT
323
+ // handler's forceIdle). Stop the debug server so its SSE sockets + heartbeats
324
+ // don't keep the process alive past here.
325
+ debug?.stop();
242
326
  if (kernel.exitCode !== 0) {
243
327
  process.exit(kernel.exitCode);
244
328
  }
245
329
  }
246
330
  catch (error) {
331
+ debug?.stop();
247
332
  reportError(argv, error, log);
248
333
  process.exit(1);
249
334
  }
@@ -259,6 +344,11 @@ async function runWatch(argv, log) {
259
344
  loadEnvFiles(argv.path);
260
345
  // Resolve the `.telo` cache root once per invocation, then thread it.
261
346
  const cacheRoot = resolveCacheRoot(argv.path);
347
+ // One inspect endpoint for the whole watch session — reloads re-attach the
348
+ // rebuilt kernel to it (see startDebugSession), so the UI connection survives.
349
+ const debug = argv.debug || argv.inspect !== undefined
350
+ ? await startDebugSession(argv, log, cacheRoot)
351
+ : undefined;
262
352
  let stopping = false;
263
353
  let signalChange = null;
264
354
  let currentKernel = null;
@@ -270,6 +360,7 @@ async function runWatch(argv, log) {
270
360
  stopping = true;
271
361
  log.info("\n[watch] stopping...");
272
362
  watchers.cleanup();
363
+ debug?.stop();
273
364
  currentKernel?.cancel("interrupted");
274
365
  currentKernel?.forceIdle();
275
366
  signalChange?.();
@@ -281,6 +372,7 @@ async function runWatch(argv, log) {
281
372
  watchers.sync(new Set([entryFilePath(argv.path)]));
282
373
  while (!stopping) {
283
374
  const kernel = await buildKernel(argv, log, cacheRoot);
375
+ debug?.attach(kernel);
284
376
  currentKernel = kernel;
285
377
  // Hold the kernel alive across the cycle so apps without their own hold
286
378
  // (e.g. script-only manifests) stay up until a change or Ctrl+C; forceIdle()
@@ -326,6 +418,19 @@ export function runCommand(yargs) {
326
418
  .option("registry-url", {
327
419
  type: "string",
328
420
  describe: "Base URL for the telo module registry. Overrides TELO_REGISTRY_URL.",
421
+ })
422
+ .option("debug", {
423
+ type: "boolean",
424
+ describe: "Write a .telo.debug.jsonl event log next to the manifest.",
425
+ })
426
+ .option("inspect", {
427
+ type: "string",
428
+ describe: "Start the live inspection endpoint. Optional [host:]port (default 127.0.0.1:9230).",
429
+ })
430
+ .option("open", {
431
+ type: "boolean",
432
+ default: true,
433
+ describe: "With --inspect, auto-open the UI in a browser. Use --no-open to suppress.",
329
434
  })
330
435
  .strict(false), async (argv) => {
331
436
  // Everything after the manifest path that isn't a known telo flag
@@ -334,10 +439,12 @@ export function runCommand(yargs) {
334
439
  // known telo flags.
335
440
  const knownBooleanFlags = new Set([
336
441
  "--verbose", "--debug", "--snapshot-on-exit", "--watch", "-w",
337
- "--cache-write", "--no-cache-write",
442
+ "--cache-write", "--no-cache-write", "--open", "--no-open",
338
443
  "--help", "--version",
339
444
  ]);
340
- const knownValuedFlags = new Set(["--registry-url"]);
445
+ // `--inspect` is valued ([host:]port). The valued-flag branch below skips
446
+ // the `=` form and the space form alike, so neither leaks into kernel argv.
447
+ const knownValuedFlags = new Set(["--registry-url", "--inspect"]);
341
448
  const rawArgs = process.argv;
342
449
  const pathIdx = rawArgs.indexOf(argv.path);
343
450
  const sliced = pathIdx >= 0 ? rawArgs.slice(pathIdx + 1) : [];
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The JSONL file sink for `--debug`: one wire-format event per line, appended to
3
+ * `<manifest-dir>/.telo.debug.jsonl`. A pure writer — it does not serialize (that's
4
+ * `debug-serialize.ts`, shared with the SSE server) and does not subscribe to the
5
+ * kernel (the caller owns the single `kernel.on("*")` tap and fans each
6
+ * already-serialized line to both this and the `DebugServer`).
7
+ */
8
+ export declare class DebugEventSubscriber {
9
+ private readonly filePath;
10
+ constructor(filePath: string);
11
+ /** Create the directory and truncate the file so each run starts fresh. */
12
+ open(): Promise<void>;
13
+ /** Append one pre-serialized wire line. A write failure is reported, not fatal. */
14
+ write(line: string): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=debug-event-subscriber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-event-subscriber.d.ts","sourceRoot":"","sources":["../src/debug-event-subscriber.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAE7C,2EAA2E;IACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,mFAAmF;IAC7E,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzC"}
@@ -0,0 +1,32 @@
1
+ import * as fs from "fs/promises";
2
+ import * as path from "path";
3
+ /**
4
+ * The JSONL file sink for `--debug`: one wire-format event per line, appended to
5
+ * `<manifest-dir>/.telo.debug.jsonl`. A pure writer — it does not serialize (that's
6
+ * `debug-serialize.ts`, shared with the SSE server) and does not subscribe to the
7
+ * kernel (the caller owns the single `kernel.on("*")` tap and fans each
8
+ * already-serialized line to both this and the `DebugServer`).
9
+ */
10
+ export class DebugEventSubscriber {
11
+ filePath;
12
+ constructor(filePath) {
13
+ this.filePath = filePath;
14
+ }
15
+ /** Create the directory and truncate the file so each run starts fresh. */
16
+ async open() {
17
+ const dir = path.dirname(this.filePath);
18
+ if (dir && dir !== ".")
19
+ await fs.mkdir(dir, { recursive: true });
20
+ await fs.writeFile(this.filePath, "", "utf-8");
21
+ }
22
+ /** Append one pre-serialized wire line. A write failure is reported, not fatal. */
23
+ async write(line) {
24
+ try {
25
+ await fs.appendFile(this.filePath, line + "\n", "utf-8");
26
+ }
27
+ catch (error) {
28
+ console.error("Failed to write event to debug log:", error);
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=debug-event-subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-event-subscriber.js","sourceRoot":"","sources":["../src/debug-event-subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IACF;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,2EAA2E;IAC3E,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;YAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { LruBlobStore } from "./blob-store.js";
2
+ /**
3
+ * Serialize one event to a single wire-format JSON line (no trailing newline).
4
+ * When `blobStore` is given, byte buffers in the payload are offloaded to it and
5
+ * replaced by pointers; otherwise they degrade to `[Bytes n]` markers.
6
+ */
7
+ export declare function serializeEvent(event: string, payload?: unknown, metadata?: Record<string, unknown>, blobStore?: LruBlobStore): string;
8
+ //# sourceMappingURL=debug-serialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-serialize.d.ts","sourceRoot":"","sources":["../src/debug-serialize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAsGpD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,SAAS,CAAC,EAAE,YAAY,GACvB,MAAM,CAQR"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The Node producer's implementation of the Telo debug wire format (see
3
+ * `@telorun/debug-ui` `wire.ts` / `wire-schema.json` for the language-neutral
4
+ * contract). Both debug sinks — the JSONL file and the live SSE server — encode
5
+ * through here, so a file line and a streamed frame are byte-identical.
6
+ *
7
+ * Event payloads carry live runtime values, not plain data, so a plain
8
+ * `JSON.stringify` is unusable. We walk the value ourselves (rather than via a
9
+ * `JSON.stringify` replacer) so binary is caught by `instanceof Uint8Array`
10
+ * *before* `Buffer.prototype.toJSON` would expand it into a giant number array.
11
+ *
12
+ * Encoding rules (the wire contract):
13
+ * - a byte buffer (`Uint8Array`/`Buffer`) → offloaded to the blob store, emitted
14
+ * as a pointer `{ "$blob": "blobs/<id>", "mediaType", "byteLength" }` (the
15
+ * object key it sits under is preserved; only the bytes leave the log). Without
16
+ * a store, a `"[Bytes <n>]"` marker.
17
+ * - a resolved `!ref` (a controller instance) → the `{ kind, name }` it stands for.
18
+ * - a value with `toJSON` (e.g. `Date`) → its `toJSON()` result.
19
+ * - any other live object (context, stream, client, Node handle) — and values
20
+ * JSON can't represent (functions, bigint) → a one-token `[Marker]`.
21
+ * - a reference cycle → `[Circular]`.
22
+ * - everything else → plain JSON.
23
+ */
24
+ function toWire(value, store, seen) {
25
+ if (typeof value === "bigint")
26
+ return `[BigInt ${value}]`;
27
+ if (typeof value === "function") {
28
+ return `[Function ${value.name || "anonymous"}]`;
29
+ }
30
+ if (value === null || typeof value !== "object")
31
+ return value;
32
+ // Binary first — before the cycle check and before any toJSON. Buffer is a
33
+ // Uint8Array subclass, so this catches both.
34
+ if (value instanceof Uint8Array) {
35
+ const mediaType = sniffMediaType(value);
36
+ if (store) {
37
+ const id = store.put(value, mediaType);
38
+ return { $blob: `blobs/${id}`, mediaType, byteLength: value.byteLength };
39
+ }
40
+ return `[Bytes ${value.byteLength}]`;
41
+ }
42
+ if (seen.has(value))
43
+ return "[Circular]";
44
+ seen.add(value);
45
+ if (Array.isArray(value)) {
46
+ return value.map((v) => toWire(v, store, seen));
47
+ }
48
+ const toJSON = value.toJSON;
49
+ if (typeof toJSON === "function") {
50
+ return toWire(toJSON.call(value), store, seen);
51
+ }
52
+ const proto = Object.getPrototypeOf(value);
53
+ if (proto !== Object.prototype && proto !== null) {
54
+ const ref = resourceRefOf(value);
55
+ if (ref)
56
+ return ref;
57
+ return `[${value.constructor?.name || "Object"}]`;
58
+ }
59
+ const out = {};
60
+ for (const [k, v] of Object.entries(value))
61
+ out[k] = toWire(v, store, seen);
62
+ return out;
63
+ }
64
+ /**
65
+ * If `instance` is a controller instance built from a resource manifest, return
66
+ * the `{ kind, name }` reference it stands for. Controllers don't name the
67
+ * manifest field uniformly (`HttpServerApi` calls it `manifest`, `Run.Sequence`
68
+ * calls it `resource`, …), so rather than hard-code field names we look for any
69
+ * own field holding a manifest-shaped value (`{ kind: string, metadata.name:
70
+ * string }`). Returns null when no field qualifies.
71
+ */
72
+ function resourceRefOf(instance) {
73
+ for (const v of Object.values(instance)) {
74
+ const m = v;
75
+ if (m && typeof m === "object" && typeof m.kind === "string" && typeof m.metadata?.name === "string") {
76
+ return { kind: m.kind, name: m.metadata.name };
77
+ }
78
+ }
79
+ return null;
80
+ }
81
+ /** Best-effort content sniff from magic bytes, for any file kind. Falls back to
82
+ * `application/octet-stream` so a value is still offloaded and downloadable. */
83
+ function sniffMediaType(b) {
84
+ const at = (i, ...sig) => sig.every((v, k) => b[i + k] === v);
85
+ if (b.length >= 8 && at(0, 0x89, 0x50, 0x4e, 0x47))
86
+ return "image/png";
87
+ if (b.length >= 3 && at(0, 0xff, 0xd8, 0xff))
88
+ return "image/jpeg";
89
+ if (b.length >= 6 && at(0, 0x47, 0x49, 0x46, 0x38))
90
+ return "image/gif";
91
+ if (b.length >= 12 && at(0, 0x52, 0x49, 0x46, 0x46) && at(8, 0x57, 0x45, 0x42, 0x50))
92
+ return "image/webp";
93
+ if (b.length >= 4 && at(0, 0x25, 0x50, 0x44, 0x46))
94
+ return "application/pdf";
95
+ if (b.length >= 2 && at(0, 0x1f, 0x8b))
96
+ return "application/gzip";
97
+ if (b.length >= 4 && at(0, 0x50, 0x4b) && (b[2] === 0x03 || b[2] === 0x05 || b[2] === 0x07))
98
+ return "application/zip";
99
+ if (b.length >= 4 && at(0, 0x00, 0x61, 0x73, 0x6d))
100
+ return "application/wasm";
101
+ if (b.length >= 4 && at(0, 0x49, 0x44, 0x33))
102
+ return "audio/mpeg"; // ID3 (mp3)
103
+ if (b.length >= 12 && at(4, 0x66, 0x74, 0x79, 0x70))
104
+ return "video/mp4"; // ....ftyp
105
+ return "application/octet-stream";
106
+ }
107
+ /**
108
+ * Serialize one event to a single wire-format JSON line (no trailing newline).
109
+ * When `blobStore` is given, byte buffers in the payload are offloaded to it and
110
+ * replaced by pointers; otherwise they degrade to `[Bytes n]` markers.
111
+ */
112
+ export function serializeEvent(event, payload, metadata, blobStore) {
113
+ const entry = {
114
+ timestamp: new Date().toISOString(),
115
+ event,
116
+ };
117
+ if (payload !== undefined)
118
+ entry.payload = payload;
119
+ if (metadata && Object.keys(metadata).length > 0)
120
+ entry.metadata = metadata;
121
+ return JSON.stringify(toWire(entry, blobStore, new WeakSet()));
122
+ }
123
+ //# sourceMappingURL=debug-serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-serialize.js","sourceRoot":"","sources":["../src/debug-serialize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { LruBlobStore } from "./blob-store.js";
2
+ export interface DebugServerOptions {
3
+ /** Preferred bind host. Default `127.0.0.1` (loopback). */
4
+ host?: string;
5
+ /** Preferred port; falls back to an ephemeral port if taken. Default 9230. */
6
+ port?: number;
7
+ /** Path to the JSONL file, served at `/events.jsonl` for download. */
8
+ jsonlPath?: string;
9
+ /** Absolute path to the single-file debug UI (`resolveUiBundle`). When absent,
10
+ * the endpoint runs headless and `/` returns a "UI not available" notice. */
11
+ uiHtmlPath?: string;
12
+ /** Replay ring-buffer size. Default 5000. */
13
+ bufferSize?: number;
14
+ }
15
+ /**
16
+ * Localhost-only HTTP server that serves the debug-watcher UI and streams events
17
+ * to it over SSE. Bound to `127.0.0.1` because events can carry secrets. The
18
+ * caller pushes already-serialized wire lines via {@link push}; the server keeps
19
+ * a bounded replay buffer so a browser opened (or reconnected) mid-run sees
20
+ * history, then live events.
21
+ *
22
+ * Producer-side and Node-specific by design — a Rust/Go kernel reimplements this;
23
+ * the cross-runtime contract is the wire format and these endpoints, not the code.
24
+ */
25
+ export declare class DebugServer {
26
+ private readonly options;
27
+ private readonly server;
28
+ private readonly clients;
29
+ private readonly heartbeats;
30
+ private readonly buffer;
31
+ private readonly bufferSize;
32
+ private readonly host;
33
+ private _url;
34
+ /** Binary payloads are offloaded here and served at `/blobs/:id`; the serializer
35
+ * emits pointers into the event log. */
36
+ readonly blobStore: LruBlobStore;
37
+ constructor(options?: DebugServerOptions);
38
+ get url(): string;
39
+ /** Start listening on the configured host (loopback by default). Resolves once
40
+ * the URL is known. */
41
+ start(): Promise<void>;
42
+ private listen;
43
+ /** Fan one serialized wire line to the replay buffer and every live client. */
44
+ push(line: string): void;
45
+ /**
46
+ * Tear down so nothing keeps the process alive. `unref` alone is unreliable
47
+ * across runtimes (bun ignores `socket.unref()`), so we *actively* clear every
48
+ * heartbeat timer and destroy every live SSE socket, then close the listener.
49
+ * Synchronous and idempotent — safe to call from a signal handler.
50
+ */
51
+ stop(): void;
52
+ private handle;
53
+ /** Discovery handshake: protocol identity + version + endpoint paths, so a
54
+ * consumer can confirm it speaks this server's wire format before connecting. */
55
+ private handleVersion;
56
+ private handleSse;
57
+ private handleBlob;
58
+ private handleJsonl;
59
+ /** Serve the single-file UI for every non-API path. The bundle is fully
60
+ * self-contained (JS + CSS inlined), so there are no asset routes to resolve
61
+ * and no path-traversal surface. Absent bundle → a 503 notice; the endpoint
62
+ * itself (SSE / JSONL / blobs / version) keeps working headless. */
63
+ private handleUi;
64
+ }
65
+ //# sourceMappingURL=debug-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-server.d.ts","sourceRoot":"","sources":["../src/debug-server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,MAAM,WAAW,kBAAkB;IACjC,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;kFAC8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,qBAAa,WAAW;IAaV,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6C;IACxE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,IAAI,CAAM;IAElB;6CACyC;IACzC,QAAQ,CAAC,SAAS,eAAsB;gBAEX,OAAO,GAAE,kBAAuB;IAM7D,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED;4BACwB;IAClB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,OAAO,CAAC,MAAM;IAqBd,+EAA+E;IAC/E,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASxB;;;;;OAKG;IACH,IAAI,IAAI,IAAI;IAuBZ,OAAO,CAAC,MAAM;IAWd;sFACkF;IAClF,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,SAAS;IAyBjB,OAAO,CAAC,UAAU;YAeJ,WAAW;IAazB;;;yEAGqE;YACvD,QAAQ;CAiBvB"}
@@ -0,0 +1,212 @@
1
+ import * as http from "http";
2
+ import * as fsp from "fs/promises";
3
+ import { LruBlobStore } from "./blob-store.js";
4
+ /** The debug wire protocol this server speaks, advertised at `/json/version` so a
5
+ * consumer can refuse a mismatch. The wire format (`wire-schema.json`) is v1. */
6
+ const PROTOCOL = "telo-debug";
7
+ const PROTOCOL_VERSION = 1;
8
+ /**
9
+ * Localhost-only HTTP server that serves the debug-watcher UI and streams events
10
+ * to it over SSE. Bound to `127.0.0.1` because events can carry secrets. The
11
+ * caller pushes already-serialized wire lines via {@link push}; the server keeps
12
+ * a bounded replay buffer so a browser opened (or reconnected) mid-run sees
13
+ * history, then live events.
14
+ *
15
+ * Producer-side and Node-specific by design — a Rust/Go kernel reimplements this;
16
+ * the cross-runtime contract is the wire format and these endpoints, not the code.
17
+ */
18
+ export class DebugServer {
19
+ options;
20
+ server;
21
+ clients = new Set();
22
+ heartbeats = new Set();
23
+ buffer = [];
24
+ bufferSize;
25
+ host;
26
+ _url = "";
27
+ /** Binary payloads are offloaded here and served at `/blobs/:id`; the serializer
28
+ * emits pointers into the event log. */
29
+ blobStore = new LruBlobStore();
30
+ constructor(options = {}) {
31
+ this.options = options;
32
+ this.bufferSize = options.bufferSize ?? 5000;
33
+ this.host = options.host ?? "127.0.0.1";
34
+ this.server = http.createServer((req, res) => this.handle(req, res));
35
+ }
36
+ get url() {
37
+ return this._url;
38
+ }
39
+ /** Start listening on the configured host (loopback by default). Resolves once
40
+ * the URL is known. */
41
+ async start() {
42
+ const preferred = this.options.port ?? 9230;
43
+ const port = await this.listen(preferred).catch(() => this.listen(0));
44
+ // A non-loopback bind is reachable as-is; loopback is friendlier as localhost.
45
+ const displayHost = this.host === "127.0.0.1" || this.host === "::1" || this.host === "0.0.0.0"
46
+ ? "localhost"
47
+ : this.host;
48
+ this._url = `http://${displayHost}:${port}`;
49
+ }
50
+ listen(port) {
51
+ return new Promise((resolve, reject) => {
52
+ const onError = (err) => {
53
+ this.server.removeListener("listening", onListening);
54
+ reject(err);
55
+ };
56
+ const onListening = () => {
57
+ this.server.removeListener("error", onError);
58
+ const addr = this.server.address();
59
+ resolve(typeof addr === "object" && addr ? addr.port : port);
60
+ };
61
+ this.server.once("error", onError);
62
+ this.server.once("listening", onListening);
63
+ this.server.listen(port, this.host);
64
+ // Never keep the process alive on the debug server's account: a one-shot
65
+ // `telo run --debug` still exits when its work is done; the UI is live only
66
+ // while the app itself keeps running (the watch-the-events use case).
67
+ this.server.unref();
68
+ });
69
+ }
70
+ /** Fan one serialized wire line to the replay buffer and every live client. */
71
+ push(line) {
72
+ this.buffer.push(line);
73
+ if (this.buffer.length > this.bufferSize) {
74
+ this.buffer.splice(0, this.buffer.length - this.bufferSize);
75
+ }
76
+ const frame = `data: ${line}\n\n`;
77
+ for (const res of this.clients)
78
+ res.write(frame);
79
+ }
80
+ /**
81
+ * Tear down so nothing keeps the process alive. `unref` alone is unreliable
82
+ * across runtimes (bun ignores `socket.unref()`), so we *actively* clear every
83
+ * heartbeat timer and destroy every live SSE socket, then close the listener.
84
+ * Synchronous and idempotent — safe to call from a signal handler.
85
+ */
86
+ stop() {
87
+ for (const hb of this.heartbeats)
88
+ clearInterval(hb);
89
+ this.heartbeats.clear();
90
+ for (const res of this.clients) {
91
+ try {
92
+ res.destroy();
93
+ }
94
+ catch {
95
+ /* already gone */
96
+ }
97
+ try {
98
+ res.socket?.destroy();
99
+ }
100
+ catch {
101
+ /* already gone */
102
+ }
103
+ }
104
+ this.clients.clear();
105
+ try {
106
+ this.server.close();
107
+ }
108
+ catch {
109
+ /* not listening */
110
+ }
111
+ }
112
+ handle(req, res) {
113
+ const url = new URL(req.url ?? "/", "http://localhost");
114
+ if (url.pathname === "/events")
115
+ return this.handleSse(res);
116
+ if (url.pathname === "/events.jsonl")
117
+ return void this.handleJsonl(res);
118
+ if (url.pathname.startsWith("/blobs/")) {
119
+ return this.handleBlob(decodeURIComponent(url.pathname.slice("/blobs/".length)), res);
120
+ }
121
+ if (url.pathname === "/json/version")
122
+ return this.handleVersion(res);
123
+ return void this.handleUi(res);
124
+ }
125
+ /** Discovery handshake: protocol identity + version + endpoint paths, so a
126
+ * consumer can confirm it speaks this server's wire format before connecting. */
127
+ handleVersion(res) {
128
+ res
129
+ .writeHead(200, { "Content-Type": "application/json; charset=utf-8", "Cache-Control": "no-store" })
130
+ .end(JSON.stringify({
131
+ protocol: PROTOCOL,
132
+ protocolVersion: PROTOCOL_VERSION,
133
+ url: this._url,
134
+ events: "/events",
135
+ eventsLog: "/events.jsonl",
136
+ blobs: "/blobs/",
137
+ }));
138
+ }
139
+ handleSse(res) {
140
+ res.writeHead(200, {
141
+ "Content-Type": "text/event-stream",
142
+ "Cache-Control": "no-cache",
143
+ Connection: "keep-alive",
144
+ });
145
+ // Replay history, then stream live.
146
+ for (const line of this.buffer)
147
+ res.write(`data: ${line}\n\n`);
148
+ this.clients.add(res);
149
+ // The debug server must never keep the CLI alive. The listening socket is
150
+ // unref'd in listen(), but an established SSE connection — and its heartbeat
151
+ // timer — are separately ref'd; without unref'ing them, Ctrl+C hangs while a
152
+ // browser is watching. Unref'd handles still work while the app keeps the
153
+ // loop alive; they just stop being a reason *not* to exit.
154
+ res.socket?.unref();
155
+ const heartbeat = setInterval(() => res.write(": ping\n\n"), 25_000);
156
+ heartbeat.unref?.();
157
+ this.heartbeats.add(heartbeat);
158
+ res.on("close", () => {
159
+ clearInterval(heartbeat);
160
+ this.heartbeats.delete(heartbeat);
161
+ this.clients.delete(res);
162
+ });
163
+ }
164
+ handleBlob(id, res) {
165
+ const blob = this.blobStore.get(id);
166
+ if (!blob) {
167
+ res.writeHead(404).end("blob not found");
168
+ return;
169
+ }
170
+ res
171
+ .writeHead(200, {
172
+ "Content-Type": blob.mediaType,
173
+ "Cache-Control": "no-store",
174
+ "Content-Length": String(blob.bytes.byteLength),
175
+ })
176
+ .end(blob.bytes);
177
+ }
178
+ async handleJsonl(res) {
179
+ if (!this.options.jsonlPath) {
180
+ res.writeHead(404).end("no event log");
181
+ return;
182
+ }
183
+ try {
184
+ const body = await fsp.readFile(this.options.jsonlPath);
185
+ res.writeHead(200, { "Content-Type": "application/x-ndjson; charset=utf-8" }).end(body);
186
+ }
187
+ catch {
188
+ res.writeHead(404).end("event log not found");
189
+ }
190
+ }
191
+ /** Serve the single-file UI for every non-API path. The bundle is fully
192
+ * self-contained (JS + CSS inlined), so there are no asset routes to resolve
193
+ * and no path-traversal surface. Absent bundle → a 503 notice; the endpoint
194
+ * itself (SSE / JSONL / blobs / version) keeps working headless. */
195
+ async handleUi(res) {
196
+ if (!this.options.uiHtmlPath) {
197
+ res
198
+ .writeHead(503, { "Content-Type": "text/html; charset=utf-8" })
199
+ .end("<h1>Debug UI not available</h1><p>The endpoint is live at <code>/events</code>; " +
200
+ "the UI bundle could not be resolved or fetched.</p>");
201
+ return;
202
+ }
203
+ try {
204
+ const body = await fsp.readFile(this.options.uiHtmlPath);
205
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }).end(body);
206
+ }
207
+ catch {
208
+ res.writeHead(404).end("not found");
209
+ }
210
+ }
211
+ }
212
+ //# sourceMappingURL=debug-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-server.js","sourceRoot":"","sources":["../src/debug-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Best-effort open of a URL in the user's browser. Never throws — a failure to
3
+ * launch is non-fatal (the URL is always logged alongside).
4
+ *
5
+ * `$BROWSER` wins when set: VSCode remote / devcontainers / Codespaces point it
6
+ * at a helper that forwards the URL to the user's *local* browser through the
7
+ * tunnel, so this works even when the host itself is headless. Otherwise fall
8
+ * back to the OS opener.
9
+ */
10
+ export declare function openBrowser(url: string): void;
11
+ /**
12
+ * Whether auto-opening makes sense here. `$BROWSER` (VSCode remote, devcontainers)
13
+ * forwards to the user's local browser, so opening works even on a headless host —
14
+ * only skip when there's no opener path at all: CI, or a bare headless Linux box
15
+ * with no display and no `$BROWSER`.
16
+ */
17
+ export declare function canOpenBrowser(): boolean;
18
+ //# sourceMappingURL=open-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-browser.d.ts","sourceRoot":"","sources":["../src/open-browser.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAgB7C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAWxC"}
@@ -0,0 +1,47 @@
1
+ import { spawn } from "child_process";
2
+ /**
3
+ * Best-effort open of a URL in the user's browser. Never throws — a failure to
4
+ * launch is non-fatal (the URL is always logged alongside).
5
+ *
6
+ * `$BROWSER` wins when set: VSCode remote / devcontainers / Codespaces point it
7
+ * at a helper that forwards the URL to the user's *local* browser through the
8
+ * tunnel, so this works even when the host itself is headless. Otherwise fall
9
+ * back to the OS opener.
10
+ */
11
+ export function openBrowser(url) {
12
+ const browser = process.env.BROWSER;
13
+ const [cmd, args] = browser
14
+ ? [browser, [url]]
15
+ : process.platform === "darwin"
16
+ ? ["open", [url]]
17
+ : process.platform === "win32"
18
+ ? ["cmd", ["/c", "start", "", url]]
19
+ : ["xdg-open", [url]];
20
+ try {
21
+ const child = spawn(cmd, args, { stdio: "ignore", detached: true });
22
+ child.on("error", () => { });
23
+ child.unref();
24
+ }
25
+ catch {
26
+ // ignored — the URL is logged regardless
27
+ }
28
+ }
29
+ /**
30
+ * Whether auto-opening makes sense here. `$BROWSER` (VSCode remote, devcontainers)
31
+ * forwards to the user's local browser, so opening works even on a headless host —
32
+ * only skip when there's no opener path at all: CI, or a bare headless Linux box
33
+ * with no display and no `$BROWSER`.
34
+ */
35
+ export function canOpenBrowser() {
36
+ if (process.env.CI)
37
+ return false;
38
+ if (process.env.BROWSER)
39
+ return true;
40
+ if (process.platform === "linux" &&
41
+ !process.env.DISPLAY &&
42
+ !process.env.WAYLAND_DISPLAY) {
43
+ return false;
44
+ }
45
+ return true;
46
+ }
47
+ //# sourceMappingURL=open-browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-browser.js","sourceRoot":"","sources":["../src/open-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACpC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAuB,OAAO;QAC7C,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAC7B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;gBACnC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,IACE,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC5B,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;QACpB,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAC5B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** Resolve the on-demand single-file debug UI to an absolute path, first hit
2
+ * wins so local development never touches the network:
3
+ *
4
+ * 1. `TELO_DEBUG_UI_PATH` — explicit override (any local build).
5
+ * 2. devDep on disk — present in the monorepo, absent in a
6
+ * production install.
7
+ * 3. `<cacheRoot>/debug-ui/<ver>` — a previous fetch.
8
+ * 4. jsDelivr — fetch the pinned version, cache, serve.
9
+ *
10
+ * Returns `null` when nothing resolves (offline + uncached): the inspect
11
+ * endpoint still works headless, only the served UI is absent.
12
+ */
13
+ export declare function resolveUiBundle(cacheRoot: string | null): Promise<string | null>;
14
+ //# sourceMappingURL=ui-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-fetch.d.ts","sourceRoot":"","sources":["../src/ui-fetch.ts"],"names":[],"mappings":"AA6CA;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA6BtF"}
@@ -0,0 +1,89 @@
1
+ import * as fs from "fs";
2
+ import * as fsp from "fs/promises";
3
+ import { createRequire } from "module";
4
+ import * as path from "path";
5
+ import { fileURLToPath } from "url";
6
+ const require = createRequire(import.meta.url);
7
+ /** jsDelivr base for the on-demand single-file debug UI. Overridable via env so
8
+ * an air-gapped mirror / staging bundle can be pointed at without a rebuild. */
9
+ const DEFAULT_CDN_BASE = "https://cdn.jsdelivr.net/npm";
10
+ const UI_PACKAGE = "@telorun/debug-ui";
11
+ const UI_ASSET = "app-single/index.html";
12
+ /** Walk up from this module to the CLI's own `package.json`. Works from both the
13
+ * compiled `dist/**` layout and the bun-run `src/**` layout. */
14
+ function readOwnPackageJson() {
15
+ let dir = path.dirname(fileURLToPath(import.meta.url));
16
+ for (;;) {
17
+ const candidate = path.join(dir, "package.json");
18
+ if (fs.existsSync(candidate)) {
19
+ try {
20
+ return JSON.parse(fs.readFileSync(candidate, "utf8"));
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ const parent = path.dirname(dir);
27
+ if (parent === dir)
28
+ return null;
29
+ dir = parent;
30
+ }
31
+ }
32
+ /** The `@telorun/debug-ui` version this CLI was published against. In the
33
+ * monorepo the pin is `workspace:*` (no concrete version) — but there the devDep
34
+ * resolves on disk, so this is only consulted for the cache/fetch paths an end
35
+ * user hits, where `pnpm publish` has rewritten it to an exact version. */
36
+ function pinnedUiVersion() {
37
+ const pkg = readOwnPackageJson();
38
+ const raw = pkg?.devDependencies?.[UI_PACKAGE] ?? pkg?.dependencies?.[UI_PACKAGE];
39
+ if (typeof raw !== "string")
40
+ return null;
41
+ const version = raw.replace(/^[\^~>=<\s]+/, "").trim();
42
+ return /^\d/.test(version) ? version : null;
43
+ }
44
+ /** Resolve the on-demand single-file debug UI to an absolute path, first hit
45
+ * wins so local development never touches the network:
46
+ *
47
+ * 1. `TELO_DEBUG_UI_PATH` — explicit override (any local build).
48
+ * 2. devDep on disk — present in the monorepo, absent in a
49
+ * production install.
50
+ * 3. `<cacheRoot>/debug-ui/<ver>` — a previous fetch.
51
+ * 4. jsDelivr — fetch the pinned version, cache, serve.
52
+ *
53
+ * Returns `null` when nothing resolves (offline + uncached): the inspect
54
+ * endpoint still works headless, only the served UI is absent.
55
+ */
56
+ export async function resolveUiBundle(cacheRoot) {
57
+ const override = process.env.TELO_DEBUG_UI_PATH;
58
+ if (override && fs.existsSync(override))
59
+ return override;
60
+ try {
61
+ const resolved = require.resolve(`${UI_PACKAGE}/${UI_ASSET}`);
62
+ if (fs.existsSync(resolved))
63
+ return resolved;
64
+ }
65
+ catch {
66
+ // Not installed (production CLI strips the devDep) — fall through to fetch.
67
+ }
68
+ const version = pinnedUiVersion();
69
+ if (!version || !cacheRoot)
70
+ return null;
71
+ const cached = path.join(cacheRoot, "debug-ui", version, "index.html");
72
+ if (fs.existsSync(cached))
73
+ return cached;
74
+ const base = process.env.TELO_DEBUG_UI_URL ?? DEFAULT_CDN_BASE;
75
+ const url = `${base}/${UI_PACKAGE}@${version}/${UI_ASSET}`;
76
+ try {
77
+ const res = await fetch(url);
78
+ if (!res.ok)
79
+ return null;
80
+ const body = Buffer.from(await res.arrayBuffer());
81
+ await fsp.mkdir(path.dirname(cached), { recursive: true });
82
+ await fsp.writeFile(cached, body);
83
+ return cached;
84
+ }
85
+ catch {
86
+ return null;
87
+ }
88
+ }
89
+ //# sourceMappingURL=ui-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-fetch.js","sourceRoot":"","sources":["../src/ui-fetch.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telorun/cli",
3
- "version": "0.26.1",
3
+ "version": "0.27.0",
4
4
  "description": "Telo CLI - Command-line interface for the Telo runtime.",
5
5
  "keywords": [
6
6
  "telo",
@@ -36,7 +36,7 @@
36
36
  "dependencies": {
37
37
  "@telorun/analyzer": "0.23.1",
38
38
  "@telorun/ide-support": "0.4.24",
39
- "@telorun/kernel": "0.26.1",
39
+ "@telorun/kernel": "0.27.0",
40
40
  "@telorun/sdk": "0.26.0",
41
41
  "@telorun/templating": "0.8.0",
42
42
  "dotenv": "^17.4.0",
@@ -52,7 +52,8 @@
52
52
  "@types/yargs": "^17.0.33",
53
53
  "nock": "^14.0.15",
54
54
  "typescript": "^5.0.0",
55
- "vitest": "^2.1.8"
55
+ "vitest": "^2.1.8",
56
+ "@telorun/debug-ui": "0.1.0"
56
57
  },
57
58
  "overrides": {
58
59
  "@telorun/analyzer": "$@telorun/analyzer",