@mclean-capital/neura 3.5.3 → 3.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.
@@ -2454,7 +2454,7 @@ var require_transport = __commonJS({
2454
2454
  "use strict";
2455
2455
  var { createRequire } = __require("module");
2456
2456
  var getCallers = require_caller();
2457
- var { join: join8, isAbsolute, sep } = __require("node:path");
2457
+ var { join: join8, isAbsolute: isAbsolute2, sep: sep2 } = __require("node:path");
2458
2458
  var sleep4 = require_atomic_sleep();
2459
2459
  var onExit = require_on_exit_leak_free();
2460
2460
  var ThreadStream = require_thread_stream();
@@ -2553,7 +2553,7 @@ var require_transport = __commonJS({
2553
2553
  return buildStream(fixTarget(target), options, worker, sync);
2554
2554
  function fixTarget(origin) {
2555
2555
  origin = bundlerOverrides[origin] || origin;
2556
- if (isAbsolute(origin) || origin.indexOf("file://") === 0) {
2556
+ if (isAbsolute2(origin) || origin.indexOf("file://") === 0) {
2557
2557
  return origin;
2558
2558
  }
2559
2559
  if (origin === "pino/file") {
@@ -2562,7 +2562,7 @@ var require_transport = __commonJS({
2562
2562
  let fixTarget2;
2563
2563
  for (const filePath of callers) {
2564
2564
  try {
2565
- const context = filePath === "node:repl" ? process.cwd() + sep : filePath;
2565
+ const context = filePath === "node:repl" ? process.cwd() + sep2 : filePath;
2566
2566
  fixTarget2 = createRequire(context).resolve(origin);
2567
2567
  break;
2568
2568
  } catch (err) {
@@ -2885,11 +2885,11 @@ var require_tools = __commonJS({
2885
2885
  }
2886
2886
  }
2887
2887
  }
2888
- function buildFormatters(level2, bindings, log39) {
2888
+ function buildFormatters(level2, bindings, log40) {
2889
2889
  return {
2890
2890
  level: level2,
2891
2891
  bindings,
2892
- log: log39
2892
+ log: log40
2893
2893
  };
2894
2894
  }
2895
2895
  function normalizeDestFileDescriptor(destination) {
@@ -3272,11 +3272,11 @@ var require_proto = __commonJS({
3272
3272
  }
3273
3273
  } else instance[serializersSym] = serializers;
3274
3274
  if (options.hasOwnProperty("formatters")) {
3275
- const { level: level2, bindings: chindings, log: log39 } = options.formatters;
3275
+ const { level: level2, bindings: chindings, log: log40 } = options.formatters;
3276
3276
  instance[formattersSym] = buildFormatters(
3277
3277
  level2 || formatters2.level,
3278
3278
  chindings || resetChildingsFormatter,
3279
- log39 || formatters2.log
3279
+ log40 || formatters2.log
3280
3280
  );
3281
3281
  } else {
3282
3282
  instance[formattersSym] = buildFormatters(
@@ -4344,6 +4344,52 @@ var require_pino = __commonJS({
4344
4344
  }
4345
4345
  });
4346
4346
 
4347
+ // ../utils/dist/logger.js
4348
+ function createBaseLogger() {
4349
+ if (process.env.NODE_ENV !== "production") {
4350
+ try {
4351
+ return (0, import_pino.default)({
4352
+ level,
4353
+ transport: { target: "pino-pretty", options: { colorize: true } }
4354
+ });
4355
+ } catch {
4356
+ }
4357
+ }
4358
+ return (0, import_pino.default)({ level });
4359
+ }
4360
+ var import_pino, level, baseLogger, Logger;
4361
+ var init_logger = __esm({
4362
+ "../utils/dist/logger.js"() {
4363
+ "use strict";
4364
+ import_pino = __toESM(require_pino(), 1);
4365
+ level = process.env.LOG_LEVEL ?? "info";
4366
+ baseLogger = createBaseLogger();
4367
+ Logger = class _Logger {
4368
+ log;
4369
+ constructor(namespace) {
4370
+ this.log = baseLogger.child({ ns: namespace });
4371
+ }
4372
+ debug(msg, data) {
4373
+ this.log.debug(data ?? {}, msg);
4374
+ }
4375
+ info(msg, data) {
4376
+ this.log.info(data ?? {}, msg);
4377
+ }
4378
+ warn(msg, data) {
4379
+ this.log.warn(data ?? {}, msg);
4380
+ }
4381
+ error(msg, data) {
4382
+ this.log.error(data ?? {}, msg);
4383
+ }
4384
+ child(sub) {
4385
+ const child = Object.create(_Logger.prototype);
4386
+ child.log = this.log.child({ sub });
4387
+ return child;
4388
+ }
4389
+ };
4390
+ }
4391
+ });
4392
+
4347
4393
  // ../../node_modules/ws/lib/constants.js
4348
4394
  var require_constants2 = __commonJS({
4349
4395
  "../../node_modules/ws/lib/constants.js"(exports, module) {
@@ -7960,6 +8006,161 @@ var require_websocket_server = __commonJS({
7960
8006
  }
7961
8007
  });
7962
8008
 
8009
+ // src/stores/worker-queries.ts
8010
+ var worker_queries_exports = {};
8011
+ __export(worker_queries_exports, {
8012
+ createWorker: () => createWorker,
8013
+ deleteWorker: () => deleteWorker,
8014
+ getWorker: () => getWorker,
8015
+ listSkillUsage: () => listSkillUsage,
8016
+ listWorkers: () => listWorkers,
8017
+ recordSkillUsage: () => recordSkillUsage,
8018
+ sweepCrashedWorkers: () => sweepCrashedWorkers,
8019
+ updateWorker: () => updateWorker
8020
+ });
8021
+ import crypto2 from "crypto";
8022
+ function mapRow(row) {
8023
+ return {
8024
+ workerId: row.worker_id,
8025
+ taskType: row.task_type,
8026
+ taskSpec: row.task_spec,
8027
+ status: row.status,
8028
+ startedAt: row.started_at,
8029
+ lastProgressAt: row.last_progress_at,
8030
+ result: row.result_json,
8031
+ error: row.error_json,
8032
+ sessionId: row.session_id,
8033
+ sessionFile: row.session_file
8034
+ };
8035
+ }
8036
+ async function createWorker(db, task) {
8037
+ const workerId = crypto2.randomUUID();
8038
+ await db.query(
8039
+ `INSERT INTO workers (worker_id, task_type, task_spec, status)
8040
+ VALUES ($1, $2, $3, 'spawning')`,
8041
+ [workerId, task.taskType, JSON.stringify(task)]
8042
+ );
8043
+ return workerId;
8044
+ }
8045
+ async function updateWorker(db, workerId, update) {
8046
+ const sets = [];
8047
+ const values = [];
8048
+ let paramIdx = 1;
8049
+ if (update.status !== void 0) {
8050
+ sets.push(`status = $${paramIdx++}`);
8051
+ values.push(update.status);
8052
+ sets.push("last_progress_at = NOW()");
8053
+ }
8054
+ if (update.sessionId !== void 0) {
8055
+ sets.push(`session_id = $${paramIdx++}`);
8056
+ values.push(update.sessionId);
8057
+ }
8058
+ if (update.sessionFile !== void 0) {
8059
+ sets.push(`session_file = $${paramIdx++}`);
8060
+ values.push(update.sessionFile);
8061
+ }
8062
+ if (update.result !== void 0) {
8063
+ sets.push(`result_json = $${paramIdx++}`);
8064
+ values.push(JSON.stringify(update.result));
8065
+ }
8066
+ if (update.error !== void 0) {
8067
+ sets.push(`error_json = $${paramIdx++}`);
8068
+ values.push(JSON.stringify(update.error));
8069
+ }
8070
+ if (sets.length === 0) return;
8071
+ values.push(workerId);
8072
+ await db.query(`UPDATE workers SET ${sets.join(", ")} WHERE worker_id = $${paramIdx}`, values);
8073
+ }
8074
+ async function getWorker(db, workerId) {
8075
+ const result = await db.query("SELECT * FROM workers WHERE worker_id = $1", [
8076
+ workerId
8077
+ ]);
8078
+ return result.rows.length > 0 ? mapRow(result.rows[0]) : null;
8079
+ }
8080
+ async function listWorkers(db, options) {
8081
+ const limit2 = options?.limit ?? 100;
8082
+ if (!options?.status) {
8083
+ const result2 = await db.query(
8084
+ "SELECT * FROM workers ORDER BY last_progress_at DESC LIMIT $1",
8085
+ [limit2]
8086
+ );
8087
+ return result2.rows.map(mapRow);
8088
+ }
8089
+ const statusArr = Array.isArray(options.status) ? options.status : [options.status];
8090
+ const placeholders = statusArr.map((_, i2) => `$${i2 + 1}`).join(", ");
8091
+ const result = await db.query(
8092
+ `SELECT * FROM workers WHERE status IN (${placeholders})
8093
+ ORDER BY last_progress_at DESC LIMIT $${statusArr.length + 1}`,
8094
+ [...statusArr, limit2]
8095
+ );
8096
+ return result.rows.map(mapRow);
8097
+ }
8098
+ async function sweepCrashedWorkers(db, fileExists) {
8099
+ const midRunResult = await db.query(
8100
+ `UPDATE workers
8101
+ SET status = 'crashed',
8102
+ error_json = $1::jsonb,
8103
+ last_progress_at = NOW()
8104
+ WHERE status IN ('spawning', 'running', 'blocked_clarifying')
8105
+ RETURNING worker_id`,
8106
+ [JSON.stringify({ reason: "core_restarted" })]
8107
+ );
8108
+ const midRunCount = midRunResult.rows.length;
8109
+ const idleRows = await db.query(`SELECT * FROM workers WHERE status = 'idle_partial'`);
8110
+ let missingFileCount = 0;
8111
+ let resumable = 0;
8112
+ for (const row of idleRows.rows) {
8113
+ if (!row.session_file || !fileExists(row.session_file)) {
8114
+ await db.query(
8115
+ `UPDATE workers
8116
+ SET status = 'crashed',
8117
+ error_json = $1::jsonb,
8118
+ last_progress_at = NOW()
8119
+ WHERE worker_id = $2`,
8120
+ [JSON.stringify({ reason: "session_file_missing" }), row.worker_id]
8121
+ );
8122
+ missingFileCount++;
8123
+ } else {
8124
+ resumable++;
8125
+ }
8126
+ }
8127
+ const summary = {
8128
+ markedCrashedMidRun: midRunCount,
8129
+ markedCrashedMissingFile: missingFileCount,
8130
+ resumable
8131
+ };
8132
+ log21.info("recovery sweep complete", { ...summary });
8133
+ return summary;
8134
+ }
8135
+ async function deleteWorker(db, workerId) {
8136
+ await db.query("DELETE FROM workers WHERE worker_id = $1", [workerId]);
8137
+ }
8138
+ async function recordSkillUsage(db, skillName) {
8139
+ await db.query(
8140
+ `INSERT INTO skill_usage (skill_name, last_used_at, use_count)
8141
+ VALUES ($1, NOW(), 1)
8142
+ ON CONFLICT (skill_name)
8143
+ DO UPDATE SET last_used_at = NOW(), use_count = skill_usage.use_count + 1`,
8144
+ [skillName]
8145
+ );
8146
+ }
8147
+ async function listSkillUsage(db) {
8148
+ const result = await db.query("SELECT * FROM skill_usage ORDER BY last_used_at DESC");
8149
+ return result.rows.map((r2) => ({
8150
+ skillName: r2.skill_name,
8151
+ lastUsedAt: r2.last_used_at,
8152
+ useCount: r2.use_count
8153
+ }));
8154
+ }
8155
+ var log21;
8156
+ var init_worker_queries = __esm({
8157
+ "src/stores/worker-queries.ts"() {
8158
+ "use strict";
8159
+ init_logger();
8160
+ log21 = new Logger("worker-queries");
8161
+ }
8162
+ });
8163
+
7963
8164
  // src/stores/mappers.ts
7964
8165
  function mapWorkItem(r2) {
7965
8166
  return {
@@ -8013,6 +8214,7 @@ __export(work_item_queries_exports, {
8013
8214
  deleteWorkItem: () => deleteWorkItem,
8014
8215
  getOpenWorkItems: () => getOpenWorkItems,
8015
8216
  getWorkItem: () => getWorkItem,
8217
+ getWorkItemByWorkerId: () => getWorkItemByWorkerId,
8016
8218
  getWorkItems: () => getWorkItems,
8017
8219
  updateWorkItem: () => updateWorkItem
8018
8220
  });
@@ -8051,6 +8253,13 @@ async function getWorkItem(db, id) {
8051
8253
  const result = await db.query("SELECT * FROM work_items WHERE id = $1", [id]);
8052
8254
  return result.rows.length > 0 ? mapWorkItem(result.rows[0]) : null;
8053
8255
  }
8256
+ async function getWorkItemByWorkerId(db, workerId) {
8257
+ const result = await db.query(
8258
+ "SELECT * FROM work_items WHERE worker_id = $1 LIMIT 1",
8259
+ [workerId]
8260
+ );
8261
+ return result.rows.length > 0 ? mapWorkItem(result.rows[0]) : null;
8262
+ }
8054
8263
  async function createWorkItem(db, title, priority, options) {
8055
8264
  const id = crypto3.randomUUID();
8056
8265
  await db.query(
@@ -8169,6 +8378,270 @@ var init_work_item_queries = __esm({
8169
8378
  }
8170
8379
  });
8171
8380
 
8381
+ // src/tools/log-reader.ts
8382
+ var log_reader_exports = {};
8383
+ __export(log_reader_exports, {
8384
+ readLog: () => readLog
8385
+ });
8386
+ import { closeSync, existsSync as existsSync6, openSync, readSync, realpathSync, statSync as statSync3 } from "node:fs";
8387
+ import { isAbsolute, resolve as resolve4, sep } from "node:path";
8388
+ function readLog(opts) {
8389
+ const resolved = resolveLogPath(opts);
8390
+ if ("error" in resolved) {
8391
+ return { available: false, entries: [], truncated: false, error: resolved.error };
8392
+ }
8393
+ const logPath = resolved.logPath;
8394
+ if (!existsSync6(logPath)) {
8395
+ return { available: false, logPath, entries: [], truncated: false };
8396
+ }
8397
+ const tailBytes = Math.min(opts.tailBytes ?? DEFAULT_TAIL_BYTES, MAX_TAIL_BYTES);
8398
+ const minLevelNum = LEVEL_NUM[opts.minLevel ?? "warn"];
8399
+ const limit2 = clamp(opts.limit ?? 30, 1, MAX_RETURN_ENTRIES);
8400
+ const { text, truncated, startsOnBoundary } = readTailBytes(logPath, tailBytes);
8401
+ const rawLines = text.split(/\r?\n/);
8402
+ const lines = truncated && !startsOnBoundary ? rawLines.slice(1) : rawLines;
8403
+ const matched = [];
8404
+ for (const line of lines) {
8405
+ if (!line.trim()) continue;
8406
+ const entry = parseLine(line);
8407
+ if (!entry) continue;
8408
+ if (entry.kind === "json" && entry.level && LEVEL_NUM[entry.level] < minLevelNum) continue;
8409
+ if (!matchesFilter(line, entry, opts)) continue;
8410
+ matched.push(redactEntry(entry));
8411
+ }
8412
+ const trimmed = matched.slice(-limit2);
8413
+ return {
8414
+ available: true,
8415
+ logPath,
8416
+ entries: trimmed,
8417
+ truncated: truncated || matched.length > trimmed.length
8418
+ };
8419
+ }
8420
+ function resolveLogPath(opts) {
8421
+ const logsRoot = resolveAllowedRoot(opts.neuraHome, "logs");
8422
+ const sessionsRoot = resolveAllowedRoot(opts.neuraHome, "agent", "sessions");
8423
+ const allowed = [logsRoot, sessionsRoot];
8424
+ let candidate;
8425
+ if (opts.source) {
8426
+ candidate = opts.source.kind === "core" ? resolve4(logsRoot, "core.log") : resolve4(sessionsRoot, stripSessionsPrefix(opts.source.sessionFile));
8427
+ } else if (opts.path) {
8428
+ const requested = opts.path;
8429
+ candidate = isAbsolute(requested) ? resolve4(requested) : resolve4(opts.neuraHome, requested);
8430
+ } else {
8431
+ return { error: "read_log requires source or path" };
8432
+ }
8433
+ if (!isUnderAllowedRoot(candidate, allowed)) {
8434
+ return {
8435
+ error: `path ${candidate} is outside allowed log roots (logs/ and agent/sessions/ under neuraHome)`
8436
+ };
8437
+ }
8438
+ return { logPath: candidate };
8439
+ }
8440
+ function resolveAllowedRoot(neuraHome, ...parts) {
8441
+ return resolve4(neuraHome, ...parts);
8442
+ }
8443
+ function stripSessionsPrefix(input) {
8444
+ const prefix = `agent${sep}sessions${sep}`;
8445
+ const altPrefix = "agent/sessions/";
8446
+ if (input.startsWith(prefix)) return input.slice(prefix.length);
8447
+ if (input.startsWith(altPrefix)) return input.slice(altPrefix.length);
8448
+ return input;
8449
+ }
8450
+ function isUnderAllowedRoot(path3, roots) {
8451
+ let normalized = path3;
8452
+ try {
8453
+ normalized = realpathSync(path3);
8454
+ } catch {
8455
+ }
8456
+ for (const root of roots) {
8457
+ let normalizedRoot;
8458
+ try {
8459
+ normalizedRoot = realpathSync(root);
8460
+ } catch {
8461
+ normalizedRoot = root;
8462
+ }
8463
+ if (isPathInside(normalized, normalizedRoot)) return true;
8464
+ }
8465
+ return false;
8466
+ }
8467
+ function isPathInside(child, parent) {
8468
+ const parentWithSep = parent.endsWith(sep) ? parent : parent + sep;
8469
+ return child === parent || child.startsWith(parentWithSep);
8470
+ }
8471
+ function readTailBytes(path3, tailBytes) {
8472
+ const stat3 = statSync3(path3);
8473
+ const size = stat3.size;
8474
+ const toRead = Math.min(tailBytes, size);
8475
+ const start = size - toRead;
8476
+ const buf = Buffer.alloc(toRead);
8477
+ const fd = openSync(path3, "r");
8478
+ try {
8479
+ let off = 0;
8480
+ let pos = start;
8481
+ while (off < toRead) {
8482
+ const n = readSync(fd, buf, off, toRead - off, pos);
8483
+ if (n === 0) break;
8484
+ off += n;
8485
+ pos += n;
8486
+ }
8487
+ let startsOnBoundary = start === 0;
8488
+ if (!startsOnBoundary && start > 0) {
8489
+ const peek = Buffer.alloc(1);
8490
+ const n = readSync(fd, peek, 0, 1, start - 1);
8491
+ if (n === 1 && (peek[0] === 10 || peek[0] === 13)) {
8492
+ startsOnBoundary = true;
8493
+ }
8494
+ }
8495
+ const text = buf.subarray(0, off).toString("utf8");
8496
+ return { text, truncated: start > 0, startsOnBoundary };
8497
+ } finally {
8498
+ closeSync(fd);
8499
+ }
8500
+ }
8501
+ function parseLine(line) {
8502
+ let trimmed = line.trim();
8503
+ if (!trimmed) return null;
8504
+ const m2 = DESKTOP_PREFIX.exec(trimmed);
8505
+ if (m2) trimmed = trimmed.slice(m2[0].length);
8506
+ if (trimmed.startsWith("{")) {
8507
+ try {
8508
+ const obj = JSON.parse(trimmed);
8509
+ return parseJsonEntry(obj) ?? asText(trimmed);
8510
+ } catch {
8511
+ return asText(trimmed);
8512
+ }
8513
+ }
8514
+ return asText(trimmed);
8515
+ }
8516
+ function parseJsonEntry(obj) {
8517
+ if (typeof obj !== "object" || obj === null) return null;
8518
+ const level2 = coerceLevel(obj.level);
8519
+ const timeMs = typeof obj.time === "number" ? obj.time : void 0;
8520
+ const time3 = timeMs !== void 0 ? new Date(timeMs).toISOString() : typeof obj.timestamp === "string" ? obj.timestamp : void 0;
8521
+ const ns = typeof obj.ns === "string" ? obj.ns : typeof obj.type === "string" ? `session:${obj.type}` : void 0;
8522
+ const msg = typeof obj.msg === "string" ? obj.msg : typeof obj.message === "string" ? obj.message : typeof obj.content === "string" ? obj.content : JSON.stringify(shallowSummary(obj));
8523
+ const structural = /* @__PURE__ */ new Set([
8524
+ "level",
8525
+ "time",
8526
+ "pid",
8527
+ "hostname",
8528
+ "ns",
8529
+ "msg",
8530
+ "v",
8531
+ "type",
8532
+ "content",
8533
+ "message",
8534
+ "timestamp"
8535
+ ]);
8536
+ const fields = {};
8537
+ for (const [key, value] of Object.entries(obj)) {
8538
+ if (structural.has(key)) continue;
8539
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
8540
+ fields[key] = value;
8541
+ }
8542
+ }
8543
+ return {
8544
+ kind: "json",
8545
+ msg,
8546
+ ...time3 ? { time: time3 } : {},
8547
+ ...level2 ? { level: level2 } : {},
8548
+ ...ns ? { ns } : {},
8549
+ ...Object.keys(fields).length > 0 ? { fields } : {}
8550
+ };
8551
+ }
8552
+ function asText(line) {
8553
+ const m2 = /^\[(\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)\]/.exec(line);
8554
+ const time3 = m2?.[1];
8555
+ return {
8556
+ kind: "text",
8557
+ msg: line,
8558
+ ...time3 ? { time: time3 } : {}
8559
+ };
8560
+ }
8561
+ function shallowSummary(obj) {
8562
+ const out = {};
8563
+ for (const [key, value] of Object.entries(obj)) {
8564
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
8565
+ out[key] = value;
8566
+ }
8567
+ }
8568
+ return out;
8569
+ }
8570
+ function coerceLevel(raw) {
8571
+ if (typeof raw === "number") {
8572
+ if (raw < LEVEL_NUM.trace) return void 0;
8573
+ let match = "trace";
8574
+ for (const [name, num] of Object.entries(LEVEL_NUM)) {
8575
+ if (raw >= num) match = name;
8576
+ }
8577
+ return match;
8578
+ }
8579
+ if (typeof raw === "string" && raw in LEVEL_NUM) return raw;
8580
+ return void 0;
8581
+ }
8582
+ function matchesFilter(rawLine, entry, opts) {
8583
+ if (opts.workerId) {
8584
+ if (!lineMentions(rawLine, entry, opts.workerId)) return false;
8585
+ }
8586
+ if (opts.taskId) {
8587
+ if (!lineMentions(rawLine, entry, opts.taskId)) return false;
8588
+ }
8589
+ return true;
8590
+ }
8591
+ function lineMentions(rawLine, entry, needle) {
8592
+ if (rawLine.includes(needle)) return true;
8593
+ if (entry.msg.includes(needle)) return true;
8594
+ if (entry.fields) {
8595
+ for (const v of Object.values(entry.fields)) {
8596
+ if (typeof v === "string" && v.includes(needle)) return true;
8597
+ }
8598
+ }
8599
+ return false;
8600
+ }
8601
+ function redactEntry(entry) {
8602
+ return {
8603
+ ...entry,
8604
+ msg: entry.msg.replace(UUID_RE, "<id>"),
8605
+ ...entry.fields ? { fields: redactFields(entry.fields) } : {}
8606
+ };
8607
+ }
8608
+ function redactFields(fields) {
8609
+ const out = {};
8610
+ for (const [key, value] of Object.entries(fields)) {
8611
+ if (key === "workerId" || key === "taskId" || key === "sessionId" || key === "toolCallId") {
8612
+ continue;
8613
+ }
8614
+ if (typeof value === "string") {
8615
+ out[key] = value.replace(UUID_RE, "<id>");
8616
+ } else {
8617
+ out[key] = value;
8618
+ }
8619
+ }
8620
+ return out;
8621
+ }
8622
+ function clamp(n, lo, hi) {
8623
+ return Math.max(lo, Math.min(hi, n));
8624
+ }
8625
+ var DEFAULT_TAIL_BYTES, MAX_TAIL_BYTES, MAX_RETURN_ENTRIES, LEVEL_NUM, DESKTOP_PREFIX, UUID_RE;
8626
+ var init_log_reader = __esm({
8627
+ "src/tools/log-reader.ts"() {
8628
+ "use strict";
8629
+ DEFAULT_TAIL_BYTES = 256 * 1024;
8630
+ MAX_TAIL_BYTES = 1 * 1024 * 1024;
8631
+ MAX_RETURN_ENTRIES = 100;
8632
+ LEVEL_NUM = {
8633
+ trace: 10,
8634
+ debug: 20,
8635
+ info: 30,
8636
+ warn: 40,
8637
+ error: 50,
8638
+ fatal: 60
8639
+ };
8640
+ DESKTOP_PREFIX = /^\s*\[(stdout|stderr)\]\s*/;
8641
+ UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
8642
+ }
8643
+ });
8644
+
8172
8645
  // ../../node_modules/depd/index.js
8173
8646
  var require_depd = __commonJS({
8174
8647
  "../../node_modules/depd/index.js"(exports, module) {
@@ -8227,7 +8700,7 @@ var require_depd = __commonJS({
8227
8700
  var site = callSiteLocation(stack[1]);
8228
8701
  var file2 = site[0];
8229
8702
  function deprecate3(message) {
8230
- log39.call(deprecate3, message);
8703
+ log40.call(deprecate3, message);
8231
8704
  }
8232
8705
  deprecate3._file = file2;
8233
8706
  deprecate3._ignored = isignored(namespace);
@@ -8256,7 +8729,7 @@ var require_depd = __commonJS({
8256
8729
  var str2 = process.env.TRACE_DEPRECATION || "";
8257
8730
  return containsNamespace(str2, namespace);
8258
8731
  }
8259
- function log39(message, site) {
8732
+ function log40(message, site) {
8260
8733
  var haslisteners = eehaslisteners(process, "deprecation");
8261
8734
  if (!haslisteners && this._ignored) {
8262
8735
  return;
@@ -8396,7 +8869,7 @@ var require_depd = __commonJS({
8396
8869
  "message",
8397
8870
  "site",
8398
8871
  '"use strict"\nreturn function (' + args + ") {log.call(deprecate, message, site)\nreturn fn.apply(this, arguments)\n}"
8399
- )(fn, log39, this, message, site);
8872
+ )(fn, log40, this, message, site);
8400
8873
  return deprecatedfn;
8401
8874
  }
8402
8875
  function wrapproperty(obj, prop, message) {
@@ -8421,13 +8894,13 @@ var require_depd = __commonJS({
8421
8894
  var set2 = descriptor.set;
8422
8895
  if (typeof get === "function") {
8423
8896
  descriptor.get = function getter() {
8424
- log39.call(deprecate3, message, site);
8897
+ log40.call(deprecate3, message, site);
8425
8898
  return get.apply(this, arguments);
8426
8899
  };
8427
8900
  }
8428
8901
  if (typeof set2 === "function") {
8429
8902
  descriptor.set = function setter() {
8430
- log39.call(deprecate3, message, site);
8903
+ log40.call(deprecate3, message, site);
8431
8904
  return set2.apply(this, arguments);
8432
8905
  };
8433
8906
  }
@@ -9264,7 +9737,7 @@ var require_debug = __commonJS({
9264
9737
  var require_browser = __commonJS({
9265
9738
  "../../node_modules/body-parser/node_modules/debug/src/browser.js"(exports, module) {
9266
9739
  exports = module.exports = require_debug();
9267
- exports.log = log39;
9740
+ exports.log = log40;
9268
9741
  exports.formatArgs = formatArgs;
9269
9742
  exports.save = save;
9270
9743
  exports.load = load;
@@ -9312,7 +9785,7 @@ var require_browser = __commonJS({
9312
9785
  });
9313
9786
  args.splice(lastC, 0, c);
9314
9787
  }
9315
- function log39() {
9788
+ function log40() {
9316
9789
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
9317
9790
  }
9318
9791
  function save(namespaces) {
@@ -9353,7 +9826,7 @@ var require_node = __commonJS({
9353
9826
  var util = __require("util");
9354
9827
  exports = module.exports = require_debug();
9355
9828
  exports.init = init;
9356
- exports.log = log39;
9829
+ exports.log = log40;
9357
9830
  exports.formatArgs = formatArgs;
9358
9831
  exports.save = save;
9359
9832
  exports.load = load;
@@ -9404,7 +9877,7 @@ var require_node = __commonJS({
9404
9877
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
9405
9878
  }
9406
9879
  }
9407
- function log39() {
9880
+ function log40() {
9408
9881
  return stream.write(util.format.apply(util, arguments) + "\n");
9409
9882
  }
9410
9883
  function save(namespaces) {
@@ -13082,10 +13555,10 @@ var require_raw_body = __commonJS({
13082
13555
  if (done) {
13083
13556
  return readStream(stream, encoding, length, limit2, wrap(done));
13084
13557
  }
13085
- return new Promise(function executor(resolve4, reject) {
13558
+ return new Promise(function executor(resolve5, reject) {
13086
13559
  readStream(stream, encoding, length, limit2, function onRead(err, buf) {
13087
13560
  if (err) return reject(err);
13088
- resolve4(buf);
13561
+ resolve5(buf);
13089
13562
  });
13090
13563
  });
13091
13564
  }
@@ -25611,7 +26084,7 @@ var require_debug2 = __commonJS({
25611
26084
  var require_browser2 = __commonJS({
25612
26085
  "../../node_modules/finalhandler/node_modules/debug/src/browser.js"(exports, module) {
25613
26086
  exports = module.exports = require_debug2();
25614
- exports.log = log39;
26087
+ exports.log = log40;
25615
26088
  exports.formatArgs = formatArgs;
25616
26089
  exports.save = save;
25617
26090
  exports.load = load;
@@ -25659,7 +26132,7 @@ var require_browser2 = __commonJS({
25659
26132
  });
25660
26133
  args.splice(lastC, 0, c);
25661
26134
  }
25662
- function log39() {
26135
+ function log40() {
25663
26136
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
25664
26137
  }
25665
26138
  function save(namespaces) {
@@ -25700,7 +26173,7 @@ var require_node2 = __commonJS({
25700
26173
  var util = __require("util");
25701
26174
  exports = module.exports = require_debug2();
25702
26175
  exports.init = init;
25703
- exports.log = log39;
26176
+ exports.log = log40;
25704
26177
  exports.formatArgs = formatArgs;
25705
26178
  exports.save = save;
25706
26179
  exports.load = load;
@@ -25751,7 +26224,7 @@ var require_node2 = __commonJS({
25751
26224
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
25752
26225
  }
25753
26226
  }
25754
- function log39() {
26227
+ function log40() {
25755
26228
  return stream.write(util.format.apply(util, arguments) + "\n");
25756
26229
  }
25757
26230
  function save(namespaces) {
@@ -26330,7 +26803,7 @@ var require_debug3 = __commonJS({
26330
26803
  var require_browser3 = __commonJS({
26331
26804
  "../../node_modules/express/node_modules/debug/src/browser.js"(exports, module) {
26332
26805
  exports = module.exports = require_debug3();
26333
- exports.log = log39;
26806
+ exports.log = log40;
26334
26807
  exports.formatArgs = formatArgs;
26335
26808
  exports.save = save;
26336
26809
  exports.load = load;
@@ -26378,7 +26851,7 @@ var require_browser3 = __commonJS({
26378
26851
  });
26379
26852
  args.splice(lastC, 0, c);
26380
26853
  }
26381
- function log39() {
26854
+ function log40() {
26382
26855
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
26383
26856
  }
26384
26857
  function save(namespaces) {
@@ -26419,7 +26892,7 @@ var require_node3 = __commonJS({
26419
26892
  var util = __require("util");
26420
26893
  exports = module.exports = require_debug3();
26421
26894
  exports.init = init;
26422
- exports.log = log39;
26895
+ exports.log = log40;
26423
26896
  exports.formatArgs = formatArgs;
26424
26897
  exports.save = save;
26425
26898
  exports.load = load;
@@ -26470,7 +26943,7 @@ var require_node3 = __commonJS({
26470
26943
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
26471
26944
  }
26472
26945
  }
26473
- function log39() {
26946
+ function log40() {
26474
26947
  return stream.write(util.format.apply(util, arguments) + "\n");
26475
26948
  }
26476
26949
  function save(namespaces) {
@@ -27392,10 +27865,10 @@ var require_view = __commonJS({
27392
27865
  var path3 = __require("path");
27393
27866
  var fs3 = __require("fs");
27394
27867
  var dirname4 = path3.dirname;
27395
- var basename3 = path3.basename;
27868
+ var basename4 = path3.basename;
27396
27869
  var extname = path3.extname;
27397
27870
  var join8 = path3.join;
27398
- var resolve4 = path3.resolve;
27871
+ var resolve5 = path3.resolve;
27399
27872
  module.exports = View;
27400
27873
  function View(name, options) {
27401
27874
  var opts = options || {};
@@ -27429,9 +27902,9 @@ var require_view = __commonJS({
27429
27902
  debug('lookup "%s"', name);
27430
27903
  for (var i2 = 0; i2 < roots.length && !path4; i2++) {
27431
27904
  var root = roots[i2];
27432
- var loc = resolve4(root, name);
27905
+ var loc = resolve5(root, name);
27433
27906
  var dir = dirname4(loc);
27434
- var file2 = basename3(loc);
27907
+ var file2 = basename4(loc);
27435
27908
  path4 = this.resolve(dir, file2);
27436
27909
  }
27437
27910
  return path4;
@@ -27440,14 +27913,14 @@ var require_view = __commonJS({
27440
27913
  debug('render "%s"', this.path);
27441
27914
  this.engine(this.path, options, callback);
27442
27915
  };
27443
- View.prototype.resolve = function resolve5(dir, file2) {
27916
+ View.prototype.resolve = function resolve6(dir, file2) {
27444
27917
  var ext = this.ext;
27445
27918
  var path4 = join8(dir, file2);
27446
27919
  var stat3 = tryStat(path4);
27447
27920
  if (stat3 && stat3.isFile()) {
27448
27921
  return path4;
27449
27922
  }
27450
- path4 = join8(dir, basename3(file2, ext), "index" + ext);
27923
+ path4 = join8(dir, basename4(file2, ext), "index" + ext);
27451
27924
  stat3 = tryStat(path4);
27452
27925
  if (stat3 && stat3.isFile()) {
27453
27926
  return path4;
@@ -27528,7 +28001,7 @@ var require_content_disposition = __commonJS({
27528
28001
  "use strict";
27529
28002
  module.exports = contentDisposition;
27530
28003
  module.exports.parse = parse3;
27531
- var basename3 = __require("path").basename;
28004
+ var basename4 = __require("path").basename;
27532
28005
  var Buffer4 = require_safe_buffer().Buffer;
27533
28006
  var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g;
27534
28007
  var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/;
@@ -27564,9 +28037,9 @@ var require_content_disposition = __commonJS({
27564
28037
  if (typeof fallback === "string" && NON_LATIN1_REGEXP.test(fallback)) {
27565
28038
  throw new TypeError("fallback must be ISO-8859-1 string");
27566
28039
  }
27567
- var name = basename3(filename);
28040
+ var name = basename4(filename);
27568
28041
  var isQuotedString = TEXT_REGEXP.test(name);
27569
- var fallbackName = typeof fallback !== "string" ? fallback && getlatin1(name) : basename3(fallback);
28042
+ var fallbackName = typeof fallback !== "string" ? fallback && getlatin1(name) : basename4(fallback);
27570
28043
  var hasFallback = typeof fallbackName === "string" && fallbackName !== name;
27571
28044
  if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) {
27572
28045
  params["filename*"] = name;
@@ -27896,7 +28369,7 @@ var require_debug4 = __commonJS({
27896
28369
  var require_browser4 = __commonJS({
27897
28370
  "../../node_modules/send/node_modules/debug/src/browser.js"(exports, module) {
27898
28371
  exports = module.exports = require_debug4();
27899
- exports.log = log39;
28372
+ exports.log = log40;
27900
28373
  exports.formatArgs = formatArgs;
27901
28374
  exports.save = save;
27902
28375
  exports.load = load;
@@ -27944,7 +28417,7 @@ var require_browser4 = __commonJS({
27944
28417
  });
27945
28418
  args.splice(lastC, 0, c);
27946
28419
  }
27947
- function log39() {
28420
+ function log40() {
27948
28421
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
27949
28422
  }
27950
28423
  function save(namespaces) {
@@ -27985,7 +28458,7 @@ var require_node4 = __commonJS({
27985
28458
  var util = __require("util");
27986
28459
  exports = module.exports = require_debug4();
27987
28460
  exports.init = init;
27988
- exports.log = log39;
28461
+ exports.log = log40;
27989
28462
  exports.formatArgs = formatArgs;
27990
28463
  exports.save = save;
27991
28464
  exports.load = load;
@@ -28036,7 +28509,7 @@ var require_node4 = __commonJS({
28036
28509
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
28037
28510
  }
28038
28511
  }
28039
- function log39() {
28512
+ function log40() {
28040
28513
  return stream.write(util.format.apply(util, arguments) + "\n");
28041
28514
  }
28042
28515
  function save(namespaces) {
@@ -28506,8 +28979,8 @@ var require_send = __commonJS({
28506
28979
  var extname = path3.extname;
28507
28980
  var join8 = path3.join;
28508
28981
  var normalize = path3.normalize;
28509
- var resolve4 = path3.resolve;
28510
- var sep = path3.sep;
28982
+ var resolve5 = path3.resolve;
28983
+ var sep2 = path3.sep;
28511
28984
  var BYTES_RANGE_REGEXP = /^ *bytes=/;
28512
28985
  var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1e3;
28513
28986
  var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
@@ -28543,7 +29016,7 @@ var require_send = __commonJS({
28543
29016
  this._maxage = opts.maxAge || opts.maxage;
28544
29017
  this._maxage = typeof this._maxage === "string" ? ms(this._maxage) : Number(this._maxage);
28545
29018
  this._maxage = !isNaN(this._maxage) ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) : 0;
28546
- this._root = opts.root ? resolve4(opts.root) : null;
29019
+ this._root = opts.root ? resolve5(opts.root) : null;
28547
29020
  if (!this._root && opts.from) {
28548
29021
  this.from(opts.from);
28549
29022
  }
@@ -28567,7 +29040,7 @@ var require_send = __commonJS({
28567
29040
  return this;
28568
29041
  }, "send.index: pass index as option");
28569
29042
  SendStream.prototype.root = function root(path4) {
28570
- this._root = resolve4(String(path4));
29043
+ this._root = resolve5(String(path4));
28571
29044
  debug("root %s", this._root);
28572
29045
  return this;
28573
29046
  };
@@ -28715,14 +29188,14 @@ var require_send = __commonJS({
28715
29188
  var parts;
28716
29189
  if (root !== null) {
28717
29190
  if (path4) {
28718
- path4 = normalize("." + sep + path4);
29191
+ path4 = normalize("." + sep2 + path4);
28719
29192
  }
28720
29193
  if (UP_PATH_REGEXP.test(path4)) {
28721
29194
  debug('malicious path "%s"', path4);
28722
29195
  this.error(403);
28723
29196
  return res;
28724
29197
  }
28725
- parts = path4.split(sep);
29198
+ parts = path4.split(sep2);
28726
29199
  path4 = normalize(join8(root, path4));
28727
29200
  } else {
28728
29201
  if (UP_PATH_REGEXP.test(path4)) {
@@ -28730,8 +29203,8 @@ var require_send = __commonJS({
28730
29203
  this.error(403);
28731
29204
  return res;
28732
29205
  }
28733
- parts = normalize(path4).split(sep);
28734
- path4 = resolve4(path4);
29206
+ parts = normalize(path4).split(sep2);
29207
+ path4 = resolve5(path4);
28735
29208
  }
28736
29209
  if (containsDotFile(parts)) {
28737
29210
  var access = this._dotfiles;
@@ -28828,7 +29301,7 @@ var require_send = __commonJS({
28828
29301
  var self2 = this;
28829
29302
  debug('stat "%s"', path4);
28830
29303
  fs3.stat(path4, function onstat(err, stat3) {
28831
- if (err && err.code === "ENOENT" && !extname(path4) && path4[path4.length - 1] !== sep) {
29304
+ if (err && err.code === "ENOENT" && !extname(path4) && path4[path4.length - 1] !== sep2) {
28832
29305
  return next(err);
28833
29306
  }
28834
29307
  if (err) return self2.onStatError(err);
@@ -30010,7 +30483,7 @@ var require_application = __commonJS({
30010
30483
  var deprecate3 = require_depd()("express");
30011
30484
  var flatten = require_array_flatten();
30012
30485
  var merge2 = require_utils_merge();
30013
- var resolve4 = __require("path").resolve;
30486
+ var resolve5 = __require("path").resolve;
30014
30487
  var setPrototypeOf = require_setprototypeof();
30015
30488
  var hasOwnProperty = Object.prototype.hasOwnProperty;
30016
30489
  var slice = Array.prototype.slice;
@@ -30049,7 +30522,7 @@ var require_application = __commonJS({
30049
30522
  this.mountpath = "/";
30050
30523
  this.locals.settings = this.settings;
30051
30524
  this.set("view", View);
30052
- this.set("views", resolve4("views"));
30525
+ this.set("views", resolve5("views"));
30053
30526
  this.set("jsonp callback name", "callback");
30054
30527
  if (env === "production") {
30055
30528
  this.enable("view cache");
@@ -31281,7 +31754,7 @@ var require_response = __commonJS({
31281
31754
  var encodeUrl = require_encodeurl();
31282
31755
  var escapeHtml = require_escape_html();
31283
31756
  var http3 = __require("http");
31284
- var isAbsolute = require_utils2().isAbsolute;
31757
+ var isAbsolute2 = require_utils2().isAbsolute;
31285
31758
  var onFinished = require_on_finished();
31286
31759
  var path3 = __require("path");
31287
31760
  var statuses = require_statuses();
@@ -31294,7 +31767,7 @@ var require_response = __commonJS({
31294
31767
  var send = require_send();
31295
31768
  var extname = path3.extname;
31296
31769
  var mime = send.mime;
31297
- var resolve4 = path3.resolve;
31770
+ var resolve5 = path3.resolve;
31298
31771
  var vary = require_vary();
31299
31772
  var res = Object.create(http3.ServerResponse.prototype);
31300
31773
  module.exports = res;
@@ -31487,7 +31960,7 @@ var require_response = __commonJS({
31487
31960
  done = options;
31488
31961
  opts = {};
31489
31962
  }
31490
- if (!opts.root && !isAbsolute(path4)) {
31963
+ if (!opts.root && !isAbsolute2(path4)) {
31491
31964
  throw new TypeError("path must be absolute or specify root to res.sendFile");
31492
31965
  }
31493
31966
  var pathname = encodeURI(path4);
@@ -31553,7 +32026,7 @@ var require_response = __commonJS({
31553
32026
  }
31554
32027
  opts = Object.create(opts);
31555
32028
  opts.headers = headers;
31556
- var fullPath = !opts.root ? resolve4(path4) : path4;
32029
+ var fullPath = !opts.root ? resolve5(path4) : path4;
31557
32030
  return this.sendFile(fullPath, opts, done);
31558
32031
  };
31559
32032
  res.contentType = res.type = function contentType(type) {
@@ -31819,7 +32292,7 @@ var require_serve_static = __commonJS({
31819
32292
  var encodeUrl = require_encodeurl();
31820
32293
  var escapeHtml = require_escape_html();
31821
32294
  var parseUrl = require_parseurl();
31822
- var resolve4 = __require("path").resolve;
32295
+ var resolve5 = __require("path").resolve;
31823
32296
  var send = require_send();
31824
32297
  var url2 = __require("url");
31825
32298
  module.exports = serveStatic;
@@ -31839,7 +32312,7 @@ var require_serve_static = __commonJS({
31839
32312
  throw new TypeError("option setHeaders must be function");
31840
32313
  }
31841
32314
  opts.maxage = opts.maxage || opts.maxAge || 0;
31842
- opts.root = resolve4(root);
32315
+ opts.root = resolve5(root);
31843
32316
  var onDirectory = redirect ? createRedirectDirectoryListener() : createNotFoundDirectoryListener();
31844
32317
  return function serveStatic2(req, res, next) {
31845
32318
  if (req.method !== "GET" && req.method !== "HEAD") {
@@ -32258,7 +32731,7 @@ var require_p_retry = __commonJS({
32258
32731
  return error48;
32259
32732
  };
32260
32733
  var isNetworkError = (errorMessage) => networkErrorMsgs.includes(errorMessage);
32261
- var pRetry2 = (input, options) => new Promise((resolve4, reject) => {
32734
+ var pRetry2 = (input, options) => new Promise((resolve5, reject) => {
32262
32735
  options = {
32263
32736
  onFailedAttempt: () => {
32264
32737
  },
@@ -32268,7 +32741,7 @@ var require_p_retry = __commonJS({
32268
32741
  const operation = retry.operation(options);
32269
32742
  operation.attempt(async (attemptNumber) => {
32270
32743
  try {
32271
- resolve4(await input(attemptNumber));
32744
+ resolve5(await input(attemptNumber));
32272
32745
  } catch (error48) {
32273
32746
  if (!(error48 instanceof Error)) {
32274
32747
  reject(new TypeError(`Non-error was thrown: "${error48}". You should only throw errors.`));
@@ -32804,8 +33277,8 @@ var require_retry3 = __commonJS({
32804
33277
  }
32805
33278
  const delay = getNextRetryDelay(config2);
32806
33279
  err.config.retryConfig.currentRetryAttempt += 1;
32807
- const backoff = config2.retryBackoff ? config2.retryBackoff(err, delay) : new Promise((resolve4) => {
32808
- setTimeout(resolve4, delay);
33280
+ const backoff = config2.retryBackoff ? config2.retryBackoff(err, delay) : new Promise((resolve5) => {
33281
+ setTimeout(resolve5, delay);
32809
33282
  });
32810
33283
  if (config2.onRetryAttempt) {
32811
33284
  await config2.onRetryAttempt(err);
@@ -33341,7 +33814,7 @@ var require_node5 = __commonJS({
33341
33814
  var tty = __require("tty");
33342
33815
  var util = __require("util");
33343
33816
  exports.init = init;
33344
- exports.log = log39;
33817
+ exports.log = log40;
33345
33818
  exports.formatArgs = formatArgs;
33346
33819
  exports.save = save;
33347
33820
  exports.load = load;
@@ -33476,7 +33949,7 @@ var require_node5 = __commonJS({
33476
33949
  }
33477
33950
  return (/* @__PURE__ */ new Date()).toISOString() + " ";
33478
33951
  }
33479
- function log39(...args) {
33952
+ function log40(...args) {
33480
33953
  return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + "\n");
33481
33954
  }
33482
33955
  function save(namespaces) {
@@ -33580,8 +34053,8 @@ var require_helpers = __commonJS({
33580
34053
  function req(url2, opts = {}) {
33581
34054
  const href = typeof url2 === "string" ? url2 : url2.href;
33582
34055
  const req2 = (href.startsWith("https:") ? https2 : http3).request(url2, opts);
33583
- const promise2 = new Promise((resolve4, reject) => {
33584
- req2.once("response", resolve4).once("error", reject).end();
34056
+ const promise2 = new Promise((resolve5, reject) => {
34057
+ req2.once("response", resolve5).once("error", reject).end();
33585
34058
  });
33586
34059
  req2.then = promise2.then.bind(promise2);
33587
34060
  return req2;
@@ -33758,7 +34231,7 @@ var require_parse_proxy_response = __commonJS({
33758
34231
  var debug_1 = __importDefault(require_src5());
33759
34232
  var debug = (0, debug_1.default)("https-proxy-agent:parse-proxy-response");
33760
34233
  function parseProxyResponse(socket) {
33761
- return new Promise((resolve4, reject) => {
34234
+ return new Promise((resolve5, reject) => {
33762
34235
  let buffersLength = 0;
33763
34236
  const buffers = [];
33764
34237
  function read() {
@@ -33824,7 +34297,7 @@ var require_parse_proxy_response = __commonJS({
33824
34297
  }
33825
34298
  debug("got proxy server response: %o %o", firstLine, headers);
33826
34299
  cleanup();
33827
- resolve4({
34300
+ resolve5({
33828
34301
  connect: {
33829
34302
  statusCode,
33830
34303
  statusText,
@@ -34066,7 +34539,7 @@ var require_ponyfill_es2018 = __commonJS({
34066
34539
  return new originalPromise(executor);
34067
34540
  }
34068
34541
  function promiseResolvedWith(value) {
34069
- return newPromise((resolve4) => resolve4(value));
34542
+ return newPromise((resolve5) => resolve5(value));
34070
34543
  }
34071
34544
  function promiseRejectedWith(reason) {
34072
34545
  return originalPromiseReject(reason);
@@ -34236,8 +34709,8 @@ var require_ponyfill_es2018 = __commonJS({
34236
34709
  return new TypeError("Cannot " + name + " a stream using a released reader");
34237
34710
  }
34238
34711
  function defaultReaderClosedPromiseInitialize(reader) {
34239
- reader._closedPromise = newPromise((resolve4, reject) => {
34240
- reader._closedPromise_resolve = resolve4;
34712
+ reader._closedPromise = newPromise((resolve5, reject) => {
34713
+ reader._closedPromise_resolve = resolve5;
34241
34714
  reader._closedPromise_reject = reject;
34242
34715
  });
34243
34716
  }
@@ -34411,8 +34884,8 @@ var require_ponyfill_es2018 = __commonJS({
34411
34884
  }
34412
34885
  let resolvePromise;
34413
34886
  let rejectPromise;
34414
- const promise2 = newPromise((resolve4, reject) => {
34415
- resolvePromise = resolve4;
34887
+ const promise2 = newPromise((resolve5, reject) => {
34888
+ resolvePromise = resolve5;
34416
34889
  rejectPromise = reject;
34417
34890
  });
34418
34891
  const readRequest = {
@@ -34517,8 +34990,8 @@ var require_ponyfill_es2018 = __commonJS({
34517
34990
  const reader = this._reader;
34518
34991
  let resolvePromise;
34519
34992
  let rejectPromise;
34520
- const promise2 = newPromise((resolve4, reject) => {
34521
- resolvePromise = resolve4;
34993
+ const promise2 = newPromise((resolve5, reject) => {
34994
+ resolvePromise = resolve5;
34522
34995
  rejectPromise = reject;
34523
34996
  });
34524
34997
  const readRequest = {
@@ -35537,8 +36010,8 @@ var require_ponyfill_es2018 = __commonJS({
35537
36010
  }
35538
36011
  let resolvePromise;
35539
36012
  let rejectPromise;
35540
- const promise2 = newPromise((resolve4, reject) => {
35541
- resolvePromise = resolve4;
36013
+ const promise2 = newPromise((resolve5, reject) => {
36014
+ resolvePromise = resolve5;
35542
36015
  rejectPromise = reject;
35543
36016
  });
35544
36017
  const readIntoRequest = {
@@ -35850,10 +36323,10 @@ var require_ponyfill_es2018 = __commonJS({
35850
36323
  wasAlreadyErroring = true;
35851
36324
  reason = void 0;
35852
36325
  }
35853
- const promise2 = newPromise((resolve4, reject) => {
36326
+ const promise2 = newPromise((resolve5, reject) => {
35854
36327
  stream._pendingAbortRequest = {
35855
36328
  _promise: void 0,
35856
- _resolve: resolve4,
36329
+ _resolve: resolve5,
35857
36330
  _reject: reject,
35858
36331
  _reason: reason,
35859
36332
  _wasAlreadyErroring: wasAlreadyErroring
@@ -35870,9 +36343,9 @@ var require_ponyfill_es2018 = __commonJS({
35870
36343
  if (state === "closed" || state === "errored") {
35871
36344
  return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`));
35872
36345
  }
35873
- const promise2 = newPromise((resolve4, reject) => {
36346
+ const promise2 = newPromise((resolve5, reject) => {
35874
36347
  const closeRequest = {
35875
- _resolve: resolve4,
36348
+ _resolve: resolve5,
35876
36349
  _reject: reject
35877
36350
  };
35878
36351
  stream._closeRequest = closeRequest;
@@ -35885,9 +36358,9 @@ var require_ponyfill_es2018 = __commonJS({
35885
36358
  return promise2;
35886
36359
  }
35887
36360
  function WritableStreamAddWriteRequest(stream) {
35888
- const promise2 = newPromise((resolve4, reject) => {
36361
+ const promise2 = newPromise((resolve5, reject) => {
35889
36362
  const writeRequest = {
35890
- _resolve: resolve4,
36363
+ _resolve: resolve5,
35891
36364
  _reject: reject
35892
36365
  };
35893
36366
  stream._writeRequests.push(writeRequest);
@@ -36503,8 +36976,8 @@ var require_ponyfill_es2018 = __commonJS({
36503
36976
  return new TypeError("Cannot " + name + " a stream using a released writer");
36504
36977
  }
36505
36978
  function defaultWriterClosedPromiseInitialize(writer) {
36506
- writer._closedPromise = newPromise((resolve4, reject) => {
36507
- writer._closedPromise_resolve = resolve4;
36979
+ writer._closedPromise = newPromise((resolve5, reject) => {
36980
+ writer._closedPromise_resolve = resolve5;
36508
36981
  writer._closedPromise_reject = reject;
36509
36982
  writer._closedPromiseState = "pending";
36510
36983
  });
@@ -36540,8 +37013,8 @@ var require_ponyfill_es2018 = __commonJS({
36540
37013
  writer._closedPromiseState = "resolved";
36541
37014
  }
36542
37015
  function defaultWriterReadyPromiseInitialize(writer) {
36543
- writer._readyPromise = newPromise((resolve4, reject) => {
36544
- writer._readyPromise_resolve = resolve4;
37016
+ writer._readyPromise = newPromise((resolve5, reject) => {
37017
+ writer._readyPromise_resolve = resolve5;
36545
37018
  writer._readyPromise_reject = reject;
36546
37019
  });
36547
37020
  writer._readyPromiseState = "pending";
@@ -36628,7 +37101,7 @@ var require_ponyfill_es2018 = __commonJS({
36628
37101
  source._disturbed = true;
36629
37102
  let shuttingDown = false;
36630
37103
  let currentWrite = promiseResolvedWith(void 0);
36631
- return newPromise((resolve4, reject) => {
37104
+ return newPromise((resolve5, reject) => {
36632
37105
  let abortAlgorithm;
36633
37106
  if (signal !== void 0) {
36634
37107
  abortAlgorithm = () => {
@@ -36773,7 +37246,7 @@ var require_ponyfill_es2018 = __commonJS({
36773
37246
  if (isError) {
36774
37247
  reject(error48);
36775
37248
  } else {
36776
- resolve4(void 0);
37249
+ resolve5(void 0);
36777
37250
  }
36778
37251
  return null;
36779
37252
  }
@@ -37054,8 +37527,8 @@ var require_ponyfill_es2018 = __commonJS({
37054
37527
  let branch1;
37055
37528
  let branch2;
37056
37529
  let resolveCancelPromise;
37057
- const cancelPromise = newPromise((resolve4) => {
37058
- resolveCancelPromise = resolve4;
37530
+ const cancelPromise = newPromise((resolve5) => {
37531
+ resolveCancelPromise = resolve5;
37059
37532
  });
37060
37533
  function pullAlgorithm() {
37061
37534
  if (reading) {
@@ -37146,8 +37619,8 @@ var require_ponyfill_es2018 = __commonJS({
37146
37619
  let branch1;
37147
37620
  let branch2;
37148
37621
  let resolveCancelPromise;
37149
- const cancelPromise = newPromise((resolve4) => {
37150
- resolveCancelPromise = resolve4;
37622
+ const cancelPromise = newPromise((resolve5) => {
37623
+ resolveCancelPromise = resolve5;
37151
37624
  });
37152
37625
  function forwardReaderError(thisReader) {
37153
37626
  uponRejection(thisReader._closedPromise, (r2) => {
@@ -37927,8 +38400,8 @@ var require_ponyfill_es2018 = __commonJS({
37927
38400
  const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1);
37928
38401
  const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy);
37929
38402
  let startPromise_resolve;
37930
- const startPromise = newPromise((resolve4) => {
37931
- startPromise_resolve = resolve4;
38403
+ const startPromise = newPromise((resolve5) => {
38404
+ startPromise_resolve = resolve5;
37932
38405
  });
37933
38406
  InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
37934
38407
  SetUpTransformStreamDefaultControllerFromTransformer(this, transformer);
@@ -38021,8 +38494,8 @@ var require_ponyfill_es2018 = __commonJS({
38021
38494
  if (stream._backpressureChangePromise !== void 0) {
38022
38495
  stream._backpressureChangePromise_resolve();
38023
38496
  }
38024
- stream._backpressureChangePromise = newPromise((resolve4) => {
38025
- stream._backpressureChangePromise_resolve = resolve4;
38497
+ stream._backpressureChangePromise = newPromise((resolve5) => {
38498
+ stream._backpressureChangePromise_resolve = resolve5;
38026
38499
  });
38027
38500
  stream._backpressure = backpressure;
38028
38501
  }
@@ -38190,8 +38663,8 @@ var require_ponyfill_es2018 = __commonJS({
38190
38663
  return controller._finishPromise;
38191
38664
  }
38192
38665
  const readable = stream._readable;
38193
- controller._finishPromise = newPromise((resolve4, reject) => {
38194
- controller._finishPromise_resolve = resolve4;
38666
+ controller._finishPromise = newPromise((resolve5, reject) => {
38667
+ controller._finishPromise_resolve = resolve5;
38195
38668
  controller._finishPromise_reject = reject;
38196
38669
  });
38197
38670
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -38217,8 +38690,8 @@ var require_ponyfill_es2018 = __commonJS({
38217
38690
  return controller._finishPromise;
38218
38691
  }
38219
38692
  const readable = stream._readable;
38220
- controller._finishPromise = newPromise((resolve4, reject) => {
38221
- controller._finishPromise_resolve = resolve4;
38693
+ controller._finishPromise = newPromise((resolve5, reject) => {
38694
+ controller._finishPromise_resolve = resolve5;
38222
38695
  controller._finishPromise_reject = reject;
38223
38696
  });
38224
38697
  const flushPromise = controller._flushAlgorithm();
@@ -38248,8 +38721,8 @@ var require_ponyfill_es2018 = __commonJS({
38248
38721
  return controller._finishPromise;
38249
38722
  }
38250
38723
  const writable = stream._writable;
38251
- controller._finishPromise = newPromise((resolve4, reject) => {
38252
- controller._finishPromise_resolve = resolve4;
38724
+ controller._finishPromise = newPromise((resolve5, reject) => {
38725
+ controller._finishPromise_resolve = resolve5;
38253
38726
  controller._finishPromise_reject = reject;
38254
38727
  });
38255
38728
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -38787,8 +39260,8 @@ var require_node_domexception = __commonJS({
38787
39260
  });
38788
39261
 
38789
39262
  // ../../node_modules/fetch-blob/from.js
38790
- import { statSync as statSync3, createReadStream, promises as fs } from "node:fs";
38791
- import { basename } from "node:path";
39263
+ import { statSync as statSync4, createReadStream, promises as fs } from "node:fs";
39264
+ import { basename as basename2 } from "node:path";
38792
39265
  var import_node_domexception, stat, blobFromSync, blobFrom, fileFrom, fileFromSync, fromBlob, fromFile, BlobDataItem;
38793
39266
  var init_from = __esm({
38794
39267
  "../../node_modules/fetch-blob/from.js"() {
@@ -38796,10 +39269,10 @@ var init_from = __esm({
38796
39269
  init_file();
38797
39270
  init_fetch_blob();
38798
39271
  ({ stat } = fs);
38799
- blobFromSync = (path3, type) => fromBlob(statSync3(path3), path3, type);
39272
+ blobFromSync = (path3, type) => fromBlob(statSync4(path3), path3, type);
38800
39273
  blobFrom = (path3, type) => stat(path3).then((stat3) => fromBlob(stat3, path3, type));
38801
39274
  fileFrom = (path3, type) => stat(path3).then((stat3) => fromFile(stat3, path3, type));
38802
- fileFromSync = (path3, type) => fromFile(statSync3(path3), path3, type);
39275
+ fileFromSync = (path3, type) => fromFile(statSync4(path3), path3, type);
38803
39276
  fromBlob = (stat3, path3, type = "") => new fetch_blob_default([new BlobDataItem({
38804
39277
  path: path3,
38805
39278
  size: stat3.size,
@@ -38811,7 +39284,7 @@ var init_from = __esm({
38811
39284
  size: stat3.size,
38812
39285
  lastModified: stat3.mtimeMs,
38813
39286
  start: 0
38814
- })], basename(path3), { type, lastModified: stat3.mtimeMs });
39287
+ })], basename2(path3), { type, lastModified: stat3.mtimeMs });
38815
39288
  BlobDataItem = class _BlobDataItem {
38816
39289
  #path;
38817
39290
  #start;
@@ -40200,7 +40673,7 @@ import zlib from "node:zlib";
40200
40673
  import Stream3, { PassThrough as PassThrough2, pipeline as pump } from "node:stream";
40201
40674
  import { Buffer as Buffer3 } from "node:buffer";
40202
40675
  async function fetch2(url2, options_) {
40203
- return new Promise((resolve4, reject) => {
40676
+ return new Promise((resolve5, reject) => {
40204
40677
  const request = new Request(url2, options_);
40205
40678
  const { parsedURL, options } = getNodeRequestOptions(request);
40206
40679
  if (!supportedSchemas.has(parsedURL.protocol)) {
@@ -40209,7 +40682,7 @@ async function fetch2(url2, options_) {
40209
40682
  if (parsedURL.protocol === "data:") {
40210
40683
  const data = dist_default(request.url);
40211
40684
  const response2 = new Response2(data, { headers: { "Content-Type": data.typeFull } });
40212
- resolve4(response2);
40685
+ resolve5(response2);
40213
40686
  return;
40214
40687
  }
40215
40688
  const send = (parsedURL.protocol === "https:" ? https : http2).request;
@@ -40331,7 +40804,7 @@ async function fetch2(url2, options_) {
40331
40804
  if (responseReferrerPolicy) {
40332
40805
  requestOptions.referrerPolicy = responseReferrerPolicy;
40333
40806
  }
40334
- resolve4(fetch2(new Request(locationURL, requestOptions)));
40807
+ resolve5(fetch2(new Request(locationURL, requestOptions)));
40335
40808
  finalize2();
40336
40809
  return;
40337
40810
  }
@@ -40364,7 +40837,7 @@ async function fetch2(url2, options_) {
40364
40837
  const codings = headers.get("Content-Encoding");
40365
40838
  if (!request.compress || request.method === "HEAD" || codings === null || response_.statusCode === 204 || response_.statusCode === 304) {
40366
40839
  response = new Response2(body, responseOptions);
40367
- resolve4(response);
40840
+ resolve5(response);
40368
40841
  return;
40369
40842
  }
40370
40843
  const zlibOptions = {
@@ -40378,7 +40851,7 @@ async function fetch2(url2, options_) {
40378
40851
  }
40379
40852
  });
40380
40853
  response = new Response2(body, responseOptions);
40381
- resolve4(response);
40854
+ resolve5(response);
40382
40855
  return;
40383
40856
  }
40384
40857
  if (codings === "deflate" || codings === "x-deflate") {
@@ -40402,12 +40875,12 @@ async function fetch2(url2, options_) {
40402
40875
  });
40403
40876
  }
40404
40877
  response = new Response2(body, responseOptions);
40405
- resolve4(response);
40878
+ resolve5(response);
40406
40879
  });
40407
40880
  raw.once("end", () => {
40408
40881
  if (!response) {
40409
40882
  response = new Response2(body, responseOptions);
40410
- resolve4(response);
40883
+ resolve5(response);
40411
40884
  }
40412
40885
  });
40413
40886
  return;
@@ -40419,11 +40892,11 @@ async function fetch2(url2, options_) {
40419
40892
  }
40420
40893
  });
40421
40894
  response = new Response2(body, responseOptions);
40422
- resolve4(response);
40895
+ resolve5(response);
40423
40896
  return;
40424
40897
  }
40425
40898
  response = new Response2(body, responseOptions);
40426
- resolve4(response);
40899
+ resolve5(response);
40427
40900
  });
40428
40901
  writeToStream(request_, request).catch(reject);
40429
40902
  });
@@ -42915,7 +43388,7 @@ var require_logging_utils = __commonJS({
42915
43388
  exports.getDebugBackend = getDebugBackend;
42916
43389
  exports.getStructuredBackend = getStructuredBackend;
42917
43390
  exports.setBackend = setBackend;
42918
- exports.log = log39;
43391
+ exports.log = log40;
42919
43392
  var events_1 = __require("events");
42920
43393
  var process3 = __importStar(__require("process"));
42921
43394
  var util = __importStar(__require("util"));
@@ -42947,7 +43420,7 @@ var require_logging_utils = __commonJS({
42947
43420
  this.func.info = (...args) => this.invokeSeverity(LogSeverity.INFO, ...args);
42948
43421
  this.func.warn = (...args) => this.invokeSeverity(LogSeverity.WARNING, ...args);
42949
43422
  this.func.error = (...args) => this.invokeSeverity(LogSeverity.ERROR, ...args);
42950
- this.func.sublog = (namespace2) => log39(namespace2, this.func);
43423
+ this.func.sublog = (namespace2) => log40(namespace2, this.func);
42951
43424
  }
42952
43425
  invoke(fields, ...args) {
42953
43426
  if (this.upstream) {
@@ -43114,7 +43587,7 @@ var require_logging_utils = __commonJS({
43114
43587
  cachedBackend = backend;
43115
43588
  loggerCache.clear();
43116
43589
  }
43117
- function log39(namespace, parent) {
43590
+ function log40(namespace, parent) {
43118
43591
  if (!cachedBackend) {
43119
43592
  const enablesFlag = process3.env[exports.env.nodeEnables];
43120
43593
  if (!enablesFlag) {
@@ -43247,7 +43720,7 @@ var require_src8 = __commonJS({
43247
43720
  exports.HEADER_NAME = "Metadata-Flavor";
43248
43721
  exports.HEADER_VALUE = "Google";
43249
43722
  exports.HEADERS = Object.freeze({ [exports.HEADER_NAME]: exports.HEADER_VALUE });
43250
- var log39 = logger.log("gcp-metadata");
43723
+ var log40 = logger.log("gcp-metadata");
43251
43724
  exports.METADATA_SERVER_DETECTION = Object.freeze({
43252
43725
  "assume-present": "don't try to ping the metadata server, but assume it's present",
43253
43726
  none: "don't try to ping the metadata server, but don't try to use it either",
@@ -43310,9 +43783,9 @@ var require_src8 = __commonJS({
43310
43783
  responseType: "text",
43311
43784
  timeout: requestTimeout()
43312
43785
  };
43313
- log39.info("instance request %j", req);
43786
+ log40.info("instance request %j", req);
43314
43787
  const res = await requestMethod(req);
43315
- log39.info("instance metadata is %s", res.data);
43788
+ log40.info("instance metadata is %s", res.data);
43316
43789
  const metadataFlavor = res.headers.get(exports.HEADER_NAME);
43317
43790
  if (metadataFlavor !== exports.HEADER_VALUE) {
43318
43791
  throw new RangeError(`Invalid response from metadata service: incorrect ${exports.HEADER_NAME} header. Expected '${exports.HEADER_VALUE}', got ${metadataFlavor ? `'${metadataFlavor}'` : "no header"}`);
@@ -46435,7 +46908,7 @@ var require_jwtaccess = __commonJS({
46435
46908
  }
46436
46909
  }
46437
46910
  fromStreamAsync(inputStream) {
46438
- return new Promise((resolve4, reject) => {
46911
+ return new Promise((resolve5, reject) => {
46439
46912
  if (!inputStream) {
46440
46913
  reject(new Error("Must pass in a stream containing the service account auth settings."));
46441
46914
  }
@@ -46444,7 +46917,7 @@ var require_jwtaccess = __commonJS({
46444
46917
  try {
46445
46918
  const data = JSON.parse(s2);
46446
46919
  this.fromJSON(data);
46447
- resolve4();
46920
+ resolve5();
46448
46921
  } catch (err) {
46449
46922
  reject(err);
46450
46923
  }
@@ -46683,7 +47156,7 @@ var require_jwtclient = __commonJS({
46683
47156
  }
46684
47157
  }
46685
47158
  fromStreamAsync(inputStream) {
46686
- return new Promise((resolve4, reject) => {
47159
+ return new Promise((resolve5, reject) => {
46687
47160
  if (!inputStream) {
46688
47161
  throw new Error("Must pass in a stream containing the service account auth settings.");
46689
47162
  }
@@ -46692,7 +47165,7 @@ var require_jwtclient = __commonJS({
46692
47165
  try {
46693
47166
  const data = JSON.parse(s2);
46694
47167
  this.fromJSON(data);
46695
- resolve4();
47168
+ resolve5();
46696
47169
  } catch (e2) {
46697
47170
  reject(e2);
46698
47171
  }
@@ -46825,7 +47298,7 @@ var require_refreshclient = __commonJS({
46825
47298
  }
46826
47299
  }
46827
47300
  async fromStreamAsync(inputStream) {
46828
- return new Promise((resolve4, reject) => {
47301
+ return new Promise((resolve5, reject) => {
46829
47302
  if (!inputStream) {
46830
47303
  return reject(new Error("Must pass in a stream containing the user refresh token."));
46831
47304
  }
@@ -46834,7 +47307,7 @@ var require_refreshclient = __commonJS({
46834
47307
  try {
46835
47308
  const data = JSON.parse(s2);
46836
47309
  this.fromJSON(data);
46837
- return resolve4();
47310
+ return resolve5();
46838
47311
  } catch (err) {
46839
47312
  return reject(err);
46840
47313
  }
@@ -48667,7 +49140,7 @@ var require_pluggable_auth_handler = __commonJS({
48667
49140
  * @return A promise that resolves with the executable response.
48668
49141
  */
48669
49142
  retrieveResponseFromExecutable(envMap) {
48670
- return new Promise((resolve4, reject) => {
49143
+ return new Promise((resolve5, reject) => {
48671
49144
  const child = childProcess.spawn(this.commandComponents[0], this.commandComponents.slice(1), {
48672
49145
  env: { ...process.env, ...Object.fromEntries(envMap) }
48673
49146
  });
@@ -48689,7 +49162,7 @@ var require_pluggable_auth_handler = __commonJS({
48689
49162
  try {
48690
49163
  const responseJson = JSON.parse(output);
48691
49164
  const response = new executable_response_1.ExecutableResponse(responseJson);
48692
- return resolve4(response);
49165
+ return resolve5(response);
48693
49166
  } catch (error48) {
48694
49167
  if (error48 instanceof executable_response_1.ExecutableResponseError) {
48695
49168
  return reject(error48);
@@ -49592,7 +50065,7 @@ var require_googleauth = __commonJS({
49592
50065
  }
49593
50066
  }
49594
50067
  fromStreamAsync(inputStream, options) {
49595
- return new Promise((resolve4, reject) => {
50068
+ return new Promise((resolve5, reject) => {
49596
50069
  if (!inputStream) {
49597
50070
  throw new Error("Must pass in a stream containing the Google auth settings.");
49598
50071
  }
@@ -49602,7 +50075,7 @@ var require_googleauth = __commonJS({
49602
50075
  try {
49603
50076
  const data = JSON.parse(chunks.join(""));
49604
50077
  const r2 = this._cacheClientFromJSON(data, options);
49605
- return resolve4(r2);
50078
+ return resolve5(r2);
49606
50079
  } catch (err) {
49607
50080
  if (!this.keyFilename)
49608
50081
  throw err;
@@ -49612,7 +50085,7 @@ var require_googleauth = __commonJS({
49612
50085
  });
49613
50086
  this.cachedCredential = client;
49614
50087
  this.setGapicJWTValues(client);
49615
- return resolve4(client);
50088
+ return resolve5(client);
49616
50089
  }
49617
50090
  } catch (err) {
49618
50091
  return reject(err);
@@ -49648,17 +50121,17 @@ var require_googleauth = __commonJS({
49648
50121
  * Run the Google Cloud SDK command that prints the default project ID
49649
50122
  */
49650
50123
  async getDefaultServiceProjectId() {
49651
- return new Promise((resolve4) => {
50124
+ return new Promise((resolve5) => {
49652
50125
  (0, child_process_1.exec)("gcloud config config-helper --format json", (err, stdout) => {
49653
50126
  if (!err && stdout) {
49654
50127
  try {
49655
50128
  const projectId = JSON.parse(stdout).configuration.properties.core.project;
49656
- resolve4(projectId);
50129
+ resolve5(projectId);
49657
50130
  return;
49658
50131
  } catch (e2) {
49659
50132
  }
49660
50133
  }
49661
- resolve4(null);
50134
+ resolve5(null);
49662
50135
  });
49663
50136
  });
49664
50137
  }
@@ -50309,50 +50782,12 @@ var require_src9 = __commonJS({
50309
50782
  });
50310
50783
 
50311
50784
  // src/server/server.ts
50785
+ init_logger();
50312
50786
  import { createServer } from "http";
50313
50787
 
50314
- // ../utils/dist/logger.js
50315
- var import_pino = __toESM(require_pino(), 1);
50316
- var level = process.env.LOG_LEVEL ?? "info";
50317
- function createBaseLogger() {
50318
- if (process.env.NODE_ENV !== "production") {
50319
- try {
50320
- return (0, import_pino.default)({
50321
- level,
50322
- transport: { target: "pino-pretty", options: { colorize: true } }
50323
- });
50324
- } catch {
50325
- }
50326
- }
50327
- return (0, import_pino.default)({ level });
50328
- }
50329
- var baseLogger = createBaseLogger();
50330
- var Logger = class _Logger {
50331
- log;
50332
- constructor(namespace) {
50333
- this.log = baseLogger.child({ ns: namespace });
50334
- }
50335
- debug(msg, data) {
50336
- this.log.debug(data ?? {}, msg);
50337
- }
50338
- info(msg, data) {
50339
- this.log.info(data ?? {}, msg);
50340
- }
50341
- warn(msg, data) {
50342
- this.log.warn(data ?? {}, msg);
50343
- }
50344
- error(msg, data) {
50345
- this.log.error(data ?? {}, msg);
50346
- }
50347
- child(sub) {
50348
- const child = Object.create(_Logger.prototype);
50349
- child.log = this.log.child({ sub });
50350
- return child;
50351
- }
50352
- };
50353
-
50354
50788
  // src/server/lifecycle.ts
50355
- import { existsSync as existsSync6, readFileSync as readFileSync5, rmSync as rmSync2, unlinkSync, writeFileSync as writeFileSync3 } from "fs";
50789
+ init_logger();
50790
+ import { existsSync as existsSync7, readFileSync as readFileSync5, rmSync as rmSync2, unlinkSync, writeFileSync as writeFileSync3 } from "fs";
50356
50791
  import { homedir as homedir5 } from "os";
50357
50792
  import { dirname as dirname2, join as join4 } from "path";
50358
50793
  import { fileURLToPath } from "url";
@@ -64220,6 +64655,7 @@ function isV2Config(raw) {
64220
64655
  }
64221
64656
 
64222
64657
  // src/config/config.ts
64658
+ init_logger();
64223
64659
  var log = new Logger("config");
64224
64660
  function loadConfig() {
64225
64661
  const neuraHome = process.env.NEURA_HOME ?? join(homedir(), ".neura");
@@ -64308,6 +64744,9 @@ function tryParseInt(val) {
64308
64744
  return Number.isNaN(n) ? void 0 : n;
64309
64745
  }
64310
64746
 
64747
+ // src/registry/provider-registry.ts
64748
+ init_logger();
64749
+
64311
64750
  // ../../node_modules/openai/internal/tslib.mjs
64312
64751
  function __classPrivateFieldSet(receiver, state, value, kind, f3) {
64313
64752
  if (kind === "m")
@@ -64522,7 +64961,7 @@ var safeJSON = (text) => {
64522
64961
  };
64523
64962
 
64524
64963
  // ../../node_modules/openai/internal/utils/sleep.mjs
64525
- var sleep = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
64964
+ var sleep = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
64526
64965
 
64527
64966
  // ../../node_modules/openai/version.mjs
64528
64967
  var VERSION = "6.26.0";
@@ -65601,8 +66040,8 @@ function addRequestID(value, response) {
65601
66040
  var _APIPromise_client;
65602
66041
  var APIPromise = class _APIPromise extends Promise {
65603
66042
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse) {
65604
- super((resolve4) => {
65605
- resolve4(null);
66043
+ super((resolve5) => {
66044
+ resolve5(null);
65606
66045
  });
65607
66046
  this.responsePromise = responsePromise;
65608
66047
  this.parseResponse = parseResponse2;
@@ -66165,12 +66604,12 @@ var EventStream = class {
66165
66604
  _EventStream_errored.set(this, false);
66166
66605
  _EventStream_aborted.set(this, false);
66167
66606
  _EventStream_catchingPromiseCreated.set(this, false);
66168
- __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve4, reject) => {
66169
- __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve4, "f");
66607
+ __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve5, reject) => {
66608
+ __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve5, "f");
66170
66609
  __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, "f");
66171
66610
  }), "f");
66172
- __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve4, reject) => {
66173
- __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve4, "f");
66611
+ __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve5, reject) => {
66612
+ __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve5, "f");
66174
66613
  __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, "f");
66175
66614
  }), "f");
66176
66615
  __classPrivateFieldGet(this, _EventStream_connectedPromise, "f").catch(() => {
@@ -66254,11 +66693,11 @@ var EventStream = class {
66254
66693
  * const message = await stream.emitted('message') // rejects if the stream errors
66255
66694
  */
66256
66695
  emitted(event) {
66257
- return new Promise((resolve4, reject) => {
66696
+ return new Promise((resolve5, reject) => {
66258
66697
  __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
66259
66698
  if (event !== "error")
66260
66699
  this.once("error", reject);
66261
- this.once(event, resolve4);
66700
+ this.once(event, resolve5);
66262
66701
  });
66263
66702
  }
66264
66703
  async done() {
@@ -67197,7 +67636,7 @@ var ChatCompletionStream = class _ChatCompletionStream extends AbstractChatCompl
67197
67636
  if (done) {
67198
67637
  return { value: void 0, done: true };
67199
67638
  }
67200
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
67639
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
67201
67640
  }
67202
67641
  const chunk = pushQueue.shift();
67203
67642
  return { value: chunk, done: false };
@@ -68029,7 +68468,7 @@ var AssistantStream = class extends EventStream {
68029
68468
  if (done) {
68030
68469
  return { value: void 0, done: true };
68031
68470
  }
68032
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
68471
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((chunk2) => chunk2 ? { value: chunk2, done: false } : { value: void 0, done: true });
68033
68472
  }
68034
68473
  const chunk = pushQueue.shift();
68035
68474
  return { value: chunk, done: false };
@@ -69978,7 +70417,7 @@ var ResponseStream = class _ResponseStream extends EventStream {
69978
70417
  if (done) {
69979
70418
  return { value: void 0, done: true };
69980
70419
  }
69981
- return new Promise((resolve4, reject) => readQueue.push({ resolve: resolve4, reject })).then((event2) => event2 ? { value: event2, done: false } : { value: void 0, done: true });
70420
+ return new Promise((resolve5, reject) => readQueue.push({ resolve: resolve5, reject })).then((event2) => event2 ? { value: event2, done: false } : { value: void 0, done: true });
69982
70421
  }
69983
70422
  const event = pushQueue.shift();
69984
70423
  return { value: event, done: false };
@@ -71503,6 +71942,7 @@ var import_websocket_server = __toESM(require_websocket_server(), 1);
71503
71942
  var wrapper_default = import_websocket.default;
71504
71943
 
71505
71944
  // src/adapters/deepgram-stt.ts
71945
+ init_logger();
71506
71946
  var log2 = new Logger("deepgram-stt");
71507
71947
  var DEFAULT_MODEL = "nova-3";
71508
71948
  var DEEPGRAM_WS_BASE = "wss://api.deepgram.com/v1/listen";
@@ -71642,14 +72082,15 @@ var DeepgramSTTStream = class {
71642
72082
  if (this.aborted || this.ended && this.pendingResults.length === 0) {
71643
72083
  return;
71644
72084
  }
71645
- await new Promise((resolve4) => {
71646
- this.resolveWait = resolve4;
72085
+ await new Promise((resolve5) => {
72086
+ this.resolveWait = resolve5;
71647
72087
  });
71648
72088
  }
71649
72089
  }
71650
72090
  };
71651
72091
 
71652
72092
  // src/adapters/elevenlabs-tts.ts
72093
+ init_logger();
71653
72094
  var log3 = new Logger("elevenlabs-tts");
71654
72095
  var ELEVENLABS_WS_BASE = "wss://api.elevenlabs.io/v1/text-to-speech";
71655
72096
  var DEFAULT_MODEL2 = "eleven_turbo_v2";
@@ -71756,14 +72197,15 @@ var ElevenLabsTTSStream = class {
71756
72197
  if (this.aborted || this.done && this.pendingChunks.length === 0) {
71757
72198
  return;
71758
72199
  }
71759
- await new Promise((resolve4) => {
71760
- this.resolveWait = resolve4;
72200
+ await new Promise((resolve5) => {
72201
+ this.resolveWait = resolve5;
71761
72202
  });
71762
72203
  }
71763
72204
  }
71764
72205
  };
71765
72206
 
71766
72207
  // src/adapters/openai-tts.ts
72208
+ init_logger();
71767
72209
  var log4 = new Logger("openai-tts");
71768
72210
  var OpenAITTSAdapter = class {
71769
72211
  client;
@@ -71861,8 +72303,8 @@ var OpenAITTSStream = class {
71861
72303
  if (this.aborted || this.done && this.pendingChunks.length === 0) {
71862
72304
  return;
71863
72305
  }
71864
- await new Promise((resolve4) => {
71865
- this.resolveWait = resolve4;
72306
+ await new Promise((resolve5) => {
72307
+ this.resolveWait = resolve5;
71866
72308
  });
71867
72309
  }
71868
72310
  }
@@ -72007,6 +72449,9 @@ var ProviderRegistry = class {
72007
72449
  }
72008
72450
  };
72009
72451
 
72452
+ // src/memory/memory-manager.ts
72453
+ init_logger();
72454
+
72010
72455
  // src/memory/prompt-builder.ts
72011
72456
  var DEFAULT_TIER_CONFIG = {
72012
72457
  l0Budget: 300,
@@ -72113,6 +72558,7 @@ function formatAttribute(attr) {
72113
72558
  }
72114
72559
 
72115
72560
  // src/memory/extraction-pipeline.ts
72561
+ init_logger();
72116
72562
  var log6 = new Logger("extractor");
72117
72563
  var MIN_TRANSCRIPT_ENTRIES = 4;
72118
72564
  var EXTRACTION_PROMPT = `You are a memory extraction agent. Analyze the conversation transcript and extract structured information. Return JSON only.
@@ -72330,6 +72776,7 @@ ${formattedTranscript}`
72330
72776
  };
72331
72777
 
72332
72778
  // src/memory/reranker.ts
72779
+ init_logger();
72333
72780
  var log7 = new Logger("reranker");
72334
72781
  var RERANK_TIMEOUT_MS = 3e3;
72335
72782
  var Reranker = class {
@@ -72349,7 +72796,7 @@ Entries:
72349
72796
  ${candidates.map((f3, i2) => `[${i2}] ${f3.content} (${f3.category})`).join("\n")}`;
72350
72797
  const apiCall = this.textAdapter.chat([{ role: "user", content: prompt }], { json: true });
72351
72798
  const timeoutPromise = new Promise(
72352
- (resolve4) => setTimeout(() => resolve4(null), RERANK_TIMEOUT_MS)
72799
+ (resolve5) => setTimeout(() => resolve5(null), RERANK_TIMEOUT_MS)
72353
72800
  );
72354
72801
  const response = await Promise.race([apiCall, timeoutPromise]);
72355
72802
  if (!response) {
@@ -72625,6 +73072,7 @@ var MemoryManager = class {
72625
73072
  };
72626
73073
 
72627
73074
  // src/memory/backup-service.ts
73075
+ init_logger();
72628
73076
  import { writeFileSync, readFileSync as readFileSync2, renameSync, existsSync as existsSync2, statSync, mkdirSync } from "fs";
72629
73077
  import { dirname } from "path";
72630
73078
 
@@ -72737,6 +73185,7 @@ var BackupService = class {
72737
73185
  };
72738
73186
 
72739
73187
  // src/discovery/discovery-loop.ts
73188
+ init_logger();
72740
73189
  var log10 = new Logger("discovery");
72741
73190
  var DEFAULT_INTERVAL_MS = 15 * 6e4;
72742
73191
  var DiscoveryLoop = class {
@@ -72830,6 +73279,7 @@ function formatDuration(ms) {
72830
73279
  }
72831
73280
 
72832
73281
  // src/skills/skill-registry.ts
73282
+ init_logger();
72833
73283
  import { formatSkillsForPrompt } from "@mariozechner/pi-coding-agent";
72834
73284
  var log11 = new Logger("skill-registry");
72835
73285
  var CHARS_PER_TOKEN_ESTIMATE = 4;
@@ -73016,11 +73466,13 @@ function toPiSkillShape(skill) {
73016
73466
  }
73017
73467
 
73018
73468
  // src/skills/skill-watcher.ts
73469
+ init_logger();
73019
73470
  import { homedir as homedir3 } from "node:os";
73020
73471
  import { resolve as resolve2 } from "node:path";
73021
73472
  import chokidar from "chokidar";
73022
73473
 
73023
73474
  // src/skills/skill-loader.ts
73475
+ init_logger();
73024
73476
  import { readFileSync as readFileSync3 } from "node:fs";
73025
73477
  import { homedir as homedir2 } from "node:os";
73026
73478
  import { resolve } from "node:path";
@@ -75891,6 +76343,9 @@ __export(type_exports2, {
75891
76343
  // ../../node_modules/@sinclair/typebox/build/esm/type/type/index.mjs
75892
76344
  var Type = type_exports2;
75893
76345
 
76346
+ // src/workers/neura-tools.ts
76347
+ init_logger();
76348
+
75894
76349
  // src/tools/time-tools.ts
75895
76350
  var timeToolDefs = [
75896
76351
  {
@@ -75915,6 +76370,7 @@ function handleTimeTool(name) {
75915
76370
  }
75916
76371
 
75917
76372
  // src/tools/memory-tools.ts
76373
+ init_logger();
75918
76374
  var log14 = new Logger("tool:memory");
75919
76375
  var memoryToolDefs = [
75920
76376
  {
@@ -76091,6 +76547,10 @@ var MEMORY_NAMES = /* @__PURE__ */ new Set([
76091
76547
  "memory_stats"
76092
76548
  ]);
76093
76549
 
76550
+ // src/tools/task-tools.ts
76551
+ init_logger();
76552
+ import { basename } from "node:path";
76553
+
76094
76554
  // src/tools/voice-redact.ts
76095
76555
  function redactTaskForVoice(task) {
76096
76556
  const { workerId, ...rest } = task;
@@ -76104,6 +76564,9 @@ function redactCommentForVoice(comment) {
76104
76564
  }
76105
76565
 
76106
76566
  // src/tools/task-tools.ts
76567
+ function toRelativeSessionPath(raw) {
76568
+ return `agent/sessions/${basename(raw)}`;
76569
+ }
76107
76570
  var log15 = new Logger("tool:task");
76108
76571
  var ALL_STATUSES = [
76109
76572
  "pending",
@@ -76118,7 +76581,6 @@ var ALL_STATUSES = [
76118
76581
  ];
76119
76582
  var COMMENT_TYPES = [
76120
76583
  "progress",
76121
- "heartbeat",
76122
76584
  "clarification_request",
76123
76585
  "approval_request",
76124
76586
  "clarification_response",
@@ -76218,7 +76680,7 @@ var taskToolDefs = [
76218
76680
  {
76219
76681
  type: "function",
76220
76682
  name: "update_task",
76221
- description: "Update a task: field changes, status transitions, and/or comment appends (unified with the worker protocol). Workers use this for report_progress / heartbeat / request_clarification / request_approval / complete_task / fail_task. Orchestrator uses it for user responses (clarification_response / approval_response) and field edits.",
76683
+ description: "Update a task: field changes, status transitions, and/or comment appends (unified with the worker protocol). Workers use this for report_progress / request_clarification / request_approval / complete_task / fail_task. Orchestrator uses it for user responses (clarification_response / approval_response) and field edits.",
76222
76684
  parameters: {
76223
76685
  type: "object",
76224
76686
  properties: {
@@ -76373,11 +76835,24 @@ async function handleTaskTool(name, args, ctx) {
76373
76835
  err: String(err)
76374
76836
  });
76375
76837
  }
76838
+ let sessionFile = null;
76839
+ if (task.workerId) {
76840
+ try {
76841
+ const raw = await ctx.taskTools.getWorkerSessionFile(task.workerId);
76842
+ sessionFile = raw ? toRelativeSessionPath(raw) : null;
76843
+ } catch (err) {
76844
+ log15.error("failed to resolve worker session file for get_task", {
76845
+ taskId: task.id,
76846
+ err: String(err)
76847
+ });
76848
+ }
76849
+ }
76376
76850
  return {
76377
76851
  result: {
76378
76852
  found: true,
76379
76853
  task: redactTaskForVoice(task),
76380
- comments: comments.map(redactCommentForVoice)
76854
+ comments: comments.map(redactCommentForVoice),
76855
+ ...sessionFile ? { sessionFile } : {}
76381
76856
  }
76382
76857
  };
76383
76858
  }
@@ -76459,6 +76934,7 @@ async function handleTaskTool(name, args, ctx) {
76459
76934
  }
76460
76935
 
76461
76936
  // src/tools/presence-tools.ts
76937
+ init_logger();
76462
76938
  var log16 = new Logger("tool:presence");
76463
76939
  var presenceToolDefs = [
76464
76940
  {
@@ -76746,6 +77222,7 @@ function makeTool(spec) {
76746
77222
  }
76747
77223
 
76748
77224
  // src/workers/voice-fanout-bridge.ts
77225
+ init_logger();
76749
77226
  var log18 = new Logger("voice-fanout-bridge");
76750
77227
  var NO_INTERJECTOR = {
76751
77228
  interject: () => Promise.resolve()
@@ -76934,7 +77411,7 @@ function stripToolCallArtifacts(text) {
76934
77411
  return cleaned.trim();
76935
77412
  }
76936
77413
  function sleep2(ms) {
76937
- return new Promise((resolve4) => setTimeout(resolve4, ms));
77414
+ return new Promise((resolve5) => setTimeout(resolve5, ms));
76938
77415
  }
76939
77416
  function extractStopReason(event) {
76940
77417
  if (event.type !== "agent_end") return "stop";
@@ -76950,6 +77427,7 @@ function extractStopReason(event) {
76950
77427
  }
76951
77428
 
76952
77429
  // src/workers/pi-runtime.ts
77430
+ init_logger();
76953
77431
  import { existsSync as existsSync3 } from "node:fs";
76954
77432
  import { join as join2 } from "node:path";
76955
77433
  import {
@@ -76958,6 +77436,8 @@ import {
76958
77436
  SessionManager
76959
77437
  } from "@mariozechner/pi-coding-agent";
76960
77438
  var log19 = new Logger("pi-runtime");
77439
+ var ALIVE_PULSE_THROTTLE_MS = 3e4;
77440
+ var ALIVE_INTERVAL_MS = 6e4;
76961
77441
  var BRIDGE_EVENT_TYPES = /* @__PURE__ */ new Set([
76962
77442
  "agent_start",
76963
77443
  "agent_end",
@@ -77028,6 +77508,15 @@ var PiRuntime = class {
77028
77508
  handleAgentEvent(workerId, event) {
77029
77509
  const worker = this.active.get(workerId);
77030
77510
  if (!worker) return;
77511
+ const now = Date.now();
77512
+ if (now - worker.lastAliveAt >= ALIVE_PULSE_THROTTLE_MS) {
77513
+ worker.lastAliveAt = now;
77514
+ try {
77515
+ worker.callbacks.onAlive?.();
77516
+ } catch (err) {
77517
+ log19.warn("onAlive callback threw", { workerId, err: String(err) });
77518
+ }
77519
+ }
77031
77520
  if (event.type === "agent_start") {
77032
77521
  worker.callbacks.onStatusChange?.("running");
77033
77522
  } else if (event.type === "agent_end") {
@@ -77061,6 +77550,10 @@ var PiRuntime = class {
77061
77550
  worker.callbacks.onStatusChange?.(finalStatus);
77062
77551
  worker.callbacks.onComplete?.(result);
77063
77552
  worker.resolveDone(result);
77553
+ if (worker.aliveInterval) {
77554
+ clearInterval(worker.aliveInterval);
77555
+ worker.aliveInterval = void 0;
77556
+ }
77064
77557
  if (finalStatus !== "idle_partial") {
77065
77558
  this.active.delete(workerId);
77066
77559
  } else {
@@ -77069,6 +77562,28 @@ var PiRuntime = class {
77069
77562
  }
77070
77563
  return result;
77071
77564
  }
77565
+ /**
77566
+ * Start the defense-in-depth interval that refreshes the worker's
77567
+ * lease on a timer, independent of pi's event stream. Pi's bash
77568
+ * tool (and any custom tool that doesn't stream) can go silent for
77569
+ * minutes between `tool_execution_start` and `_end`; without this
77570
+ * pulse the lease would expire and crash-recovery could kill a
77571
+ * perfectly healthy worker that's just waiting on a subprocess.
77572
+ * `unref()` so the timer doesn't keep the process alive on its own.
77573
+ */
77574
+ startAliveInterval(worker) {
77575
+ worker.aliveInterval = setInterval(() => {
77576
+ try {
77577
+ worker.callbacks.onAlive?.();
77578
+ } catch (err) {
77579
+ log19.warn("interval onAlive callback threw", {
77580
+ workerId: worker.workerId,
77581
+ err: String(err)
77582
+ });
77583
+ }
77584
+ }, ALIVE_INTERVAL_MS);
77585
+ worker.aliveInterval.unref?.();
77586
+ }
77072
77587
  /**
77073
77588
  * Authoritative `stopReason` → `WorkerStatus` mapping. Matches the
77074
77589
  * table in docs/phase6-os-core.md exactly:
@@ -77109,8 +77624,8 @@ var PiRuntime = class {
77109
77624
  const sessionManager = SessionManager.create(sessionCwd, this.opts.sessionDir);
77110
77625
  const session = await this.buildSession(sessionManager, workerId, sessionCwd, task.taskId);
77111
77626
  let resolveDone;
77112
- const done = new Promise((resolve4) => {
77113
- resolveDone = resolve4;
77627
+ const done = new Promise((resolve5) => {
77628
+ resolveDone = resolve5;
77114
77629
  });
77115
77630
  const worker = {
77116
77631
  workerId,
@@ -77119,9 +77634,11 @@ var PiRuntime = class {
77119
77634
  resolveDone,
77120
77635
  idleWaiters: [],
77121
77636
  pendingPause: false,
77122
- callbacks
77637
+ callbacks,
77638
+ lastAliveAt: 0
77123
77639
  };
77124
77640
  this.active.set(workerId, worker);
77641
+ this.startAliveInterval(worker);
77125
77642
  session.prompt(task.description).then(() => {
77126
77643
  const stopReason = this.extractStopReasonFromSession(session);
77127
77644
  this.finalizeWorker(workerId, stopReason);
@@ -77144,8 +77661,8 @@ var PiRuntime = class {
77144
77661
  const sessionManager = SessionManager.open(sessionFile, this.opts.sessionDir);
77145
77662
  const session = await this.buildSession(sessionManager, workerId);
77146
77663
  let resolveDone;
77147
- const done = new Promise((resolve4) => {
77148
- resolveDone = resolve4;
77664
+ const done = new Promise((resolve5) => {
77665
+ resolveDone = resolve5;
77149
77666
  });
77150
77667
  const existing = this.active.get(workerId);
77151
77668
  const worker = {
@@ -77155,9 +77672,11 @@ var PiRuntime = class {
77155
77672
  resolveDone,
77156
77673
  idleWaiters: [],
77157
77674
  pendingPause: false,
77158
- callbacks
77675
+ callbacks,
77676
+ lastAliveAt: 0
77159
77677
  };
77160
77678
  this.active.set(workerId, worker);
77679
+ this.startAliveInterval(worker);
77161
77680
  session.prompt(resumePrompt).then(() => {
77162
77681
  const stopReason = this.extractStopReasonFromSession(session);
77163
77682
  this.finalizeWorker(workerId, stopReason);
@@ -77197,8 +77716,8 @@ var PiRuntime = class {
77197
77716
  if (!worker) {
77198
77717
  return Promise.resolve();
77199
77718
  }
77200
- return new Promise((resolve4) => {
77201
- worker.idleWaiters.push(resolve4);
77719
+ return new Promise((resolve5) => {
77720
+ worker.idleWaiters.push(resolve5);
77202
77721
  });
77203
77722
  }
77204
77723
  hasWorker(workerId) {
@@ -77218,6 +77737,7 @@ function defaultSessionDir(agentDir) {
77218
77737
  }
77219
77738
 
77220
77739
  // src/workers/worker-cancellation.ts
77740
+ init_logger();
77221
77741
  var log20 = new Logger("worker-cancellation");
77222
77742
  var WorkerCancellation = class {
77223
77743
  runtime;
@@ -77276,127 +77796,10 @@ var WorkerCancellation = class {
77276
77796
  };
77277
77797
 
77278
77798
  // src/workers/agent-worker.ts
77279
- import { existsSync as existsSync5 } from "node:fs";
77280
-
77281
- // src/stores/worker-queries.ts
77282
- import crypto2 from "crypto";
77283
- var log21 = new Logger("worker-queries");
77284
- function mapRow(row) {
77285
- return {
77286
- workerId: row.worker_id,
77287
- taskType: row.task_type,
77288
- taskSpec: row.task_spec,
77289
- status: row.status,
77290
- startedAt: row.started_at,
77291
- lastProgressAt: row.last_progress_at,
77292
- result: row.result_json,
77293
- error: row.error_json,
77294
- sessionId: row.session_id,
77295
- sessionFile: row.session_file
77296
- };
77297
- }
77298
- async function createWorker(db, task) {
77299
- const workerId = crypto2.randomUUID();
77300
- await db.query(
77301
- `INSERT INTO workers (worker_id, task_type, task_spec, status)
77302
- VALUES ($1, $2, $3, 'spawning')`,
77303
- [workerId, task.taskType, JSON.stringify(task)]
77304
- );
77305
- return workerId;
77306
- }
77307
- async function updateWorker(db, workerId, update) {
77308
- const sets = [];
77309
- const values = [];
77310
- let paramIdx = 1;
77311
- if (update.status !== void 0) {
77312
- sets.push(`status = $${paramIdx++}`);
77313
- values.push(update.status);
77314
- sets.push("last_progress_at = NOW()");
77315
- }
77316
- if (update.sessionId !== void 0) {
77317
- sets.push(`session_id = $${paramIdx++}`);
77318
- values.push(update.sessionId);
77319
- }
77320
- if (update.sessionFile !== void 0) {
77321
- sets.push(`session_file = $${paramIdx++}`);
77322
- values.push(update.sessionFile);
77323
- }
77324
- if (update.result !== void 0) {
77325
- sets.push(`result_json = $${paramIdx++}`);
77326
- values.push(JSON.stringify(update.result));
77327
- }
77328
- if (update.error !== void 0) {
77329
- sets.push(`error_json = $${paramIdx++}`);
77330
- values.push(JSON.stringify(update.error));
77331
- }
77332
- if (sets.length === 0) return;
77333
- values.push(workerId);
77334
- await db.query(`UPDATE workers SET ${sets.join(", ")} WHERE worker_id = $${paramIdx}`, values);
77335
- }
77336
- async function getWorker(db, workerId) {
77337
- const result = await db.query("SELECT * FROM workers WHERE worker_id = $1", [
77338
- workerId
77339
- ]);
77340
- return result.rows.length > 0 ? mapRow(result.rows[0]) : null;
77341
- }
77342
- async function listWorkers(db, options) {
77343
- const limit2 = options?.limit ?? 100;
77344
- if (!options?.status) {
77345
- const result2 = await db.query(
77346
- "SELECT * FROM workers ORDER BY last_progress_at DESC LIMIT $1",
77347
- [limit2]
77348
- );
77349
- return result2.rows.map(mapRow);
77350
- }
77351
- const statusArr = Array.isArray(options.status) ? options.status : [options.status];
77352
- const placeholders = statusArr.map((_, i2) => `$${i2 + 1}`).join(", ");
77353
- const result = await db.query(
77354
- `SELECT * FROM workers WHERE status IN (${placeholders})
77355
- ORDER BY last_progress_at DESC LIMIT $${statusArr.length + 1}`,
77356
- [...statusArr, limit2]
77357
- );
77358
- return result.rows.map(mapRow);
77359
- }
77360
- async function sweepCrashedWorkers(db, fileExists) {
77361
- const midRunResult = await db.query(
77362
- `UPDATE workers
77363
- SET status = 'crashed',
77364
- error_json = $1::jsonb,
77365
- last_progress_at = NOW()
77366
- WHERE status IN ('spawning', 'running', 'blocked_clarifying')
77367
- RETURNING worker_id`,
77368
- [JSON.stringify({ reason: "core_restarted" })]
77369
- );
77370
- const midRunCount = midRunResult.rows.length;
77371
- const idleRows = await db.query(`SELECT * FROM workers WHERE status = 'idle_partial'`);
77372
- let missingFileCount = 0;
77373
- let resumable = 0;
77374
- for (const row of idleRows.rows) {
77375
- if (!row.session_file || !fileExists(row.session_file)) {
77376
- await db.query(
77377
- `UPDATE workers
77378
- SET status = 'crashed',
77379
- error_json = $1::jsonb,
77380
- last_progress_at = NOW()
77381
- WHERE worker_id = $2`,
77382
- [JSON.stringify({ reason: "session_file_missing" }), row.worker_id]
77383
- );
77384
- missingFileCount++;
77385
- } else {
77386
- resumable++;
77387
- }
77388
- }
77389
- const summary = {
77390
- markedCrashedMidRun: midRunCount,
77391
- markedCrashedMissingFile: missingFileCount,
77392
- resumable
77393
- };
77394
- log21.info("recovery sweep complete", { ...summary });
77395
- return summary;
77396
- }
77397
-
77398
- // src/workers/agent-worker.ts
77799
+ init_logger();
77800
+ init_worker_queries();
77399
77801
  init_work_item_queries();
77802
+ import { existsSync as existsSync5 } from "node:fs";
77400
77803
 
77401
77804
  // src/stores/task-comment-queries.ts
77402
77805
  init_mappers();
@@ -77457,15 +77860,6 @@ async function listComments(db, opts) {
77457
77860
  );
77458
77861
  return result.rows.map((r2) => mapTaskComment(r2));
77459
77862
  }
77460
- async function pruneHeartbeats(db, taskId, author) {
77461
- const result = await db.query(
77462
- `DELETE FROM task_comments
77463
- WHERE task_id = $1 AND type = 'heartbeat' AND author = $2
77464
- RETURNING id`,
77465
- [taskId, author]
77466
- );
77467
- return result.rows.length;
77468
- }
77469
77863
  async function countOpenRequests(db, taskId) {
77470
77864
  const result = await db.query(
77471
77865
  `SELECT COUNT(*)::TEXT as count FROM task_comments
@@ -77484,6 +77878,7 @@ async function countOpenRequests(db, taskId) {
77484
77878
  }
77485
77879
 
77486
77880
  // src/workers/worktree-manager.ts
77881
+ init_logger();
77487
77882
  import { execFileSync } from "node:child_process";
77488
77883
  import {
77489
77884
  existsSync as existsSync4,
@@ -77714,6 +78109,7 @@ var WorktreeManager = class {
77714
78109
 
77715
78110
  // src/workers/agent-worker.ts
77716
78111
  var log23 = new Logger("agent-worker");
78112
+ var LEASE_WINDOW_MS = 15 * 6e4;
77717
78113
  var CANONICAL_WORKER_SYSTEM_PROMPT = `You are a Neura worker \u2014 a capable engineering agent executing a task dispatched by the Neura orchestrator. The orchestrator is a voice-first assistant that briefed this task with the user, confirmed intent, and handed it off to you.
77718
78114
 
77719
78115
  Your posture: be decisive. You have full tool access \u2014 Read, Write, Edit, Bash \u2014 scoped to an isolated worktree directory (your cwd). Make progress. Don't ask the user to double-check obvious things. Don't propose a plan and wait for approval when the path is clear.
@@ -77738,12 +78134,13 @@ Actions inside your worktree (creating new files, editing files you created, run
77738
78134
  Communication protocol \u2014 use these tools to report back, not prose:
77739
78135
 
77740
78136
  - \`report_progress(message)\` \u2014 brief status updates. Surfaces to the user as ambient voice. Use sparingly: one update per meaningful step, not one per tool call.
77741
- - \`heartbeat(note?)\` \u2014 signal you're alive on long tasks. Emit at least every 2 minutes when you expect to run longer than that, or the orchestrator will treat you as crashed.
77742
78137
  - \`request_clarification(question, context?, urgency?)\` \u2014 ask the user a blocking question. Returns their answer. Only escalate when you genuinely cannot resolve ambiguity from the task context. Try to answer from context first.
77743
78138
  - \`request_approval(action, rationale?, urgency?)\` \u2014 mandatory before destructive actions (see reversibility rule above).
77744
78139
  - \`complete_task(summary)\` \u2014 mark the task done. Include a short summary of what you did, keyed to the acceptance criteria. The invariant layer will reject this if any clarification or approval is still unresolved.
77745
78140
  - \`fail_task(reason, reason_code)\` \u2014 mark the task failed. Use the right reason_code: \`impossible\` (missing precondition), \`already_done\` (no-op), \`user_aborted\` (user stopped you), \`hard_error\` (exception/timeout).
77746
78141
 
78142
+ You do not need to emit keepalives or heartbeats. The runtime observes your activity through the tool-call stream and refreshes your lease automatically.
78143
+
77747
78144
  Escalation discipline: escalate sparingly. The orchestrator is mediating a voice conversation with a human \u2014 every clarification interrupts it. Only escalate when:
77748
78145
  - You cannot determine which of several paths the user wants (and context doesn't make it obvious).
77749
78146
  - You hit a blocker that requires user authorization (destructive action, external side effect).
@@ -77969,6 +78366,16 @@ var AgentWorker = class {
77969
78366
  callbacks.onStatusChange?.(status);
77970
78367
  },
77971
78368
  onProgress: callbacks.onProgress,
78369
+ onAlive: () => {
78370
+ void this.refreshTaskLease(task.id).catch((err) => {
78371
+ log23.warn("failed to refresh task lease", {
78372
+ workerId,
78373
+ taskId: task.id,
78374
+ err: String(err)
78375
+ });
78376
+ });
78377
+ callbacks.onAlive?.();
78378
+ },
77972
78379
  onComplete: (result) => {
77973
78380
  void this.persistTerminalResult(workerId, result).catch((err) => {
77974
78381
  log23.warn("failed to persist terminal result", {
@@ -78009,6 +78416,10 @@ var AgentWorker = class {
78009
78416
  if (!row.sessionFile) {
78010
78417
  throw new Error(`resume: worker ${workerId} has no session_file`);
78011
78418
  }
78419
+ const linkedTask = await getWorkItemByWorkerId(this.db, workerId);
78420
+ if (linkedTask) {
78421
+ this.workerTaskIds.set(workerId, linkedTask.id);
78422
+ }
78012
78423
  const wrapped = {
78013
78424
  onStatusChange: (status) => {
78014
78425
  void updateWorker(this.db, workerId, { status }).catch((err) => {
@@ -78017,6 +78428,16 @@ var AgentWorker = class {
78017
78428
  callbacks.onStatusChange?.(status);
78018
78429
  },
78019
78430
  onProgress: callbacks.onProgress,
78431
+ onAlive: linkedTask ? () => {
78432
+ void this.refreshTaskLease(linkedTask.id).catch((err) => {
78433
+ log23.warn("failed to refresh task lease on resume", {
78434
+ workerId,
78435
+ taskId: linkedTask.id,
78436
+ err: String(err)
78437
+ });
78438
+ });
78439
+ callbacks.onAlive?.();
78440
+ } : callbacks.onAlive,
78020
78441
  onComplete: (result) => {
78021
78442
  void this.persistTerminalResult(workerId, result).catch((err) => {
78022
78443
  log23.warn("failed to persist terminal result", {
@@ -78126,6 +78547,29 @@ var AgentWorker = class {
78126
78547
  get activeCount() {
78127
78548
  return this.cancellation.activeCount;
78128
78549
  }
78550
+ /**
78551
+ * Refresh a task's lease. Called from the `onAlive` callback the
78552
+ * runtime fires (throttled) on every pi event. Replaces the explicit
78553
+ * `heartbeat` tool the worker used to emit — pi's event stream is a
78554
+ * stronger signal than a self-reported ping and removes a verb from
78555
+ * the worker protocol prompt.
78556
+ *
78557
+ * Terminal tasks are skipped. Pi emits trailing events (agent_end,
78558
+ * final tool_execution_end) after `complete_task`/`fail_task`; without
78559
+ * this guard the lease bump would rewrite `leaseExpiresAt` on a
78560
+ * `done`/`failed`/`cancelled` row and inflate `version`/`updated_at`,
78561
+ * causing spurious optimistic-lock conflicts for the orchestrator's
78562
+ * next edit.
78563
+ */
78564
+ async refreshTaskLease(taskId) {
78565
+ const task = await getWorkItem(this.db, taskId);
78566
+ if (!task) return;
78567
+ if (task.status === "done" || task.status === "failed" || task.status === "cancelled") {
78568
+ return;
78569
+ }
78570
+ const newLease = new Date(Date.now() + LEASE_WINDOW_MS).toISOString();
78571
+ await updateWorkItem(this.db, taskId, { leaseExpiresAt: newLease });
78572
+ }
78129
78573
  /**
78130
78574
  * Persist a terminal result to the workers table. Called by the
78131
78575
  * callbacks wrapper on `onComplete`. Maps the WorkerResult into the
@@ -78206,6 +78650,7 @@ var AgentWorker = class {
78206
78650
  };
78207
78651
 
78208
78652
  // src/workers/clarification-bridge.ts
78653
+ init_logger();
78209
78654
  var log24 = new Logger("clarification-bridge");
78210
78655
  var ClarificationBridge = class {
78211
78656
  opts;
@@ -78238,11 +78683,11 @@ var ClarificationBridge = class {
78238
78683
  immediate: urgency === "blocking",
78239
78684
  bypassRateLimit: true
78240
78685
  });
78241
- const answer = await new Promise((resolve4, reject) => {
78686
+ const answer = await new Promise((resolve5, reject) => {
78242
78687
  const pending = {
78243
78688
  workerId,
78244
78689
  question,
78245
- resolve: resolve4,
78690
+ resolve: resolve5,
78246
78691
  reject,
78247
78692
  ...onAnswer ? { onAnswer } : {}
78248
78693
  };
@@ -78250,8 +78695,10 @@ var ClarificationBridge = class {
78250
78695
  if (signal) {
78251
78696
  const onAbort = () => {
78252
78697
  const idx = this.pending.indexOf(pending);
78253
- if (idx >= 0) this.pending.splice(idx, 1);
78254
- reject(new Error("clarification aborted"));
78698
+ if (idx >= 0) {
78699
+ this.pending.splice(idx, 1);
78700
+ reject(new Error("clarification aborted"));
78701
+ }
78255
78702
  };
78256
78703
  if (signal.aborted) {
78257
78704
  onAbort();
@@ -78283,9 +78730,13 @@ var ClarificationBridge = class {
78283
78730
  * clarifications are waiting, the turn is ignored (the user is just
78284
78731
  * talking to Grok normally).
78285
78732
  *
78286
- * Returns true if the turn was consumed by a pending clarification,
78287
- * false otherwise callers can use this to decide whether to also
78288
- * forward the turn to the normal voice session flow.
78733
+ * Returns `true` synchronously when a pending clarification was
78734
+ * found; `false` when nothing was pending. When `true`, the
78735
+ * response persistence (via `onAnswer`) is in flight and the
78736
+ * worker's `askUser` Promise resolves only after the persistence
78737
+ * completes — so `complete_task`'s open-request gate sees the
78738
+ * committed response comment. Callers use the boolean to decide
78739
+ * whether to forward the turn to the normal voice session flow.
78289
78740
  */
78290
78741
  notifyUserTurn(text) {
78291
78742
  const next = this.pending.shift();
@@ -78295,14 +78746,21 @@ var ClarificationBridge = class {
78295
78746
  textPreview: text.slice(0, 80)
78296
78747
  });
78297
78748
  if (next.onAnswer) {
78298
- void Promise.resolve(next.onAnswer(text)).catch((err) => {
78299
- log24.warn("onAnswer persistence hook threw", {
78300
- workerId: next.workerId,
78301
- err: String(err)
78302
- });
78303
- });
78749
+ void (async () => {
78750
+ try {
78751
+ await Promise.resolve(next.onAnswer(text));
78752
+ } catch (err) {
78753
+ log24.warn("onAnswer persistence hook threw", {
78754
+ workerId: next.workerId,
78755
+ err: String(err)
78756
+ });
78757
+ } finally {
78758
+ next.resolve(text);
78759
+ }
78760
+ })();
78761
+ } else {
78762
+ next.resolve(text);
78304
78763
  }
78305
- next.resolve(text);
78306
78764
  return true;
78307
78765
  }
78308
78766
  /** How many clarifications are currently waiting for a user turn. */
@@ -78356,6 +78814,9 @@ function buildClarificationTool(workerId, bridge) {
78356
78814
  return tool;
78357
78815
  }
78358
78816
 
78817
+ // src/workers/worker-protocol-tools.ts
78818
+ init_logger();
78819
+
78359
78820
  // src/tools/task-update-handler.ts
78360
78821
  init_work_item_queries();
78361
78822
  var TERMINAL_STATUSES = /* @__PURE__ */ new Set(["done", "cancelled", "failed"]);
@@ -78383,7 +78844,6 @@ var ORCHESTRATOR_ALLOWED_FROM = {
78383
78844
  };
78384
78845
  var WORKER_ALLOWED_COMMENT_TYPES = /* @__PURE__ */ new Set([
78385
78846
  "progress",
78386
- "heartbeat",
78387
78847
  "clarification_request",
78388
78848
  "approval_request",
78389
78849
  "error",
@@ -78504,12 +78964,6 @@ async function applyTaskUpdate(args) {
78504
78964
  urgency: payload.comment.urgency ?? null,
78505
78965
  metadata: payload.comment.metadata ?? null
78506
78966
  });
78507
- if (payload.comment.type !== "heartbeat" && actor.startsWith("worker:")) {
78508
- try {
78509
- await pruneHeartbeats(db, task.id, actor);
78510
- } catch {
78511
- }
78512
- }
78513
78967
  }
78514
78968
  const refreshed = await getWorkItem(db, task.id);
78515
78969
  if (!refreshed) {
@@ -78527,17 +78981,9 @@ async function resolveTask(store, idOrTitle) {
78527
78981
 
78528
78982
  // src/workers/worker-protocol-tools.ts
78529
78983
  var log25 = new Logger("worker-protocol-tools");
78530
- var LEASE_WINDOW_MS = 5 * 6e4;
78531
78984
  var ReportProgressParams = Type.Object({
78532
78985
  message: Type.String({ description: "Short status update the user may hear read aloud." })
78533
78986
  });
78534
- var HeartbeatParams = Type.Object({
78535
- note: Type.Optional(
78536
- Type.String({
78537
- description: "Optional short note. Heartbeats are pruned after your next real comment."
78538
- })
78539
- )
78540
- });
78541
78987
  var RequestClarificationParams2 = Type.Object({
78542
78988
  question: Type.String({ description: "Plain-language question to ask the user." }),
78543
78989
  context: Type.Optional(
@@ -78631,26 +79077,6 @@ function buildWorkerProtocolTools(options) {
78631
79077
  });
78632
79078
  }
78633
79079
  });
78634
- tools.push({
78635
- name: "heartbeat",
78636
- label: "Heartbeat",
78637
- description: "Signal that you're still alive on a long-running task. Refreshes the worker's lease. Emit at least every 2 minutes when you expect to run long so the orchestrator doesn't treat you as crashed.",
78638
- parameters: HeartbeatParams,
78639
- execute: async (_toolCallId, rawParams) => {
78640
- const params = rawParams;
78641
- const newLease = new Date(Date.now() + LEASE_WINDOW_MS).toISOString();
78642
- const result = await taskTools.updateTask(taskId, {
78643
- comment: { type: "heartbeat", content: params.note ?? "still working" },
78644
- fields: { leaseExpiresAt: newLease }
78645
- });
78646
- if (!result) throw new Error(`heartbeat: task ${taskId} not found`);
78647
- return textResult("Heartbeat recorded.", {
78648
- taskId,
78649
- workerId,
78650
- leaseExpiresAt: newLease
78651
- });
78652
- }
78653
- });
78654
79080
  tools.push({
78655
79081
  name: "request_clarification",
78656
79082
  label: "Request Clarification",
@@ -78862,6 +79288,7 @@ async function handleVisionTool(name, args, ctx) {
78862
79288
  }
78863
79289
 
78864
79290
  // src/tools/skill-tools.ts
79291
+ init_logger();
78865
79292
  var log26 = new Logger("tool:skill");
78866
79293
  var skillToolDefs = [
78867
79294
  {
@@ -78952,6 +79379,7 @@ async function handleSkillTool(name, args, ctx) {
78952
79379
  }
78953
79380
 
78954
79381
  // src/tools/worker-control-tools.ts
79382
+ init_logger();
78955
79383
  var log27 = new Logger("tool:worker-control");
78956
79384
  var workerControlToolDefs = [
78957
79385
  {
@@ -79063,12 +79491,99 @@ async function handleWorkerControlTool(name, args, ctx) {
79063
79491
  }
79064
79492
  }
79065
79493
 
79494
+ // src/tools/log-tools.ts
79495
+ init_logger();
79496
+ var log28 = new Logger("tool:log");
79497
+ var logToolDefs = [
79498
+ {
79499
+ type: "function",
79500
+ name: "read_log",
79501
+ description: "Call get_task FIRST \u2014 it returns the task's error/result comments and a sessionFile handle. Only call read_log when those comments don't explain the failure. Pick source='session' with the session_file from get_task to see what the worker actually did (tool calls, results, messages). Pick source='core' to see platform-level errors (auth failures, dispatch errors, pi exceptions). Entries return with UUIDs already redacted \u2014 paraphrase messages for the user; never read namespaces or raw JSON aloud.",
79502
+ parameters: {
79503
+ type: "object",
79504
+ properties: {
79505
+ source: {
79506
+ type: "string",
79507
+ enum: ["core", "session"],
79508
+ description: "Symbolic source. 'core' reads ~/.neura/logs/core.log. 'session' reads a worker's per-session JSONL \u2014 requires session_file from get_task."
79509
+ },
79510
+ session_file: {
79511
+ type: "string",
79512
+ description: "Relative path like 'agent/sessions/<sessionId>.jsonl', obtained from get_task's sessionFile field. Required when source='session'."
79513
+ },
79514
+ path: {
79515
+ type: "string",
79516
+ description: "Advanced: relative path under ~/.neura/. Must resolve to a file under logs/ or agent/sessions/ \u2014 anything else is rejected for safety. Prefer source+session_file for normal use."
79517
+ },
79518
+ worker_id: {
79519
+ type: "string",
79520
+ description: "Optional filter \u2014 keep only entries that mention this worker id."
79521
+ },
79522
+ task_id: {
79523
+ type: "string",
79524
+ description: "Optional filter \u2014 keep only entries that mention this task id."
79525
+ },
79526
+ lines: {
79527
+ type: "number",
79528
+ description: "Max entries to return. Default 30, max 100."
79529
+ },
79530
+ include_info: {
79531
+ type: "boolean",
79532
+ description: "Include info-level entries (progress, turn transitions). Default false \u2014 only warn/error/fatal. Text entries (pino-pretty output) always pass through regardless."
79533
+ }
79534
+ },
79535
+ required: []
79536
+ }
79537
+ }
79538
+ ];
79539
+ var LOG_TOOL_NAMES = new Set(logToolDefs.map((d) => d.name));
79540
+ async function handleLogTool(name, args, ctx) {
79541
+ if (!LOG_TOOL_NAMES.has(name)) return null;
79542
+ if (!ctx.workerLogs) {
79543
+ return {
79544
+ error: "Log inspection is not available in this session. Use get_task for task-level error comments."
79545
+ };
79546
+ }
79547
+ try {
79548
+ if (name === "read_log") {
79549
+ const source = args.source;
79550
+ const sessionFile = args.session_file;
79551
+ const path3 = args.path;
79552
+ if (!source && !path3) {
79553
+ return { error: "read_log requires source or path" };
79554
+ }
79555
+ if (source === "session" && !sessionFile) {
79556
+ return { error: "read_log with source='session' requires session_file" };
79557
+ }
79558
+ const workerId = args.worker_id;
79559
+ const taskId = args.task_id;
79560
+ const lines = args.lines;
79561
+ const includeInfo = args.include_info;
79562
+ const result = await ctx.workerLogs.read({
79563
+ ...source ? { source } : {},
79564
+ ...sessionFile ? { sessionFile } : {},
79565
+ ...path3 ? { path: path3 } : {},
79566
+ ...workerId ? { workerId } : {},
79567
+ ...taskId ? { taskId } : {},
79568
+ ...lines !== void 0 ? { lines } : {},
79569
+ ...includeInfo !== void 0 ? { includeInfo } : {}
79570
+ });
79571
+ return { result };
79572
+ }
79573
+ return null;
79574
+ } catch (err) {
79575
+ log28.error(`${name} failed`, { err: String(err) });
79576
+ return { error: `Failed: ${String(err)}` };
79577
+ }
79578
+ }
79579
+
79066
79580
  // src/tools/registry.ts
79067
79581
  var MEMORY_TOOL_NAMES = new Set(memoryToolDefs.map((t2) => t2.name));
79068
79582
  var PRESENCE_TOOL_NAMES = new Set(presenceToolDefs.map((t2) => t2.name));
79069
79583
  var TASK_TOOL_NAMES = new Set(taskToolDefs.map((t2) => t2.name));
79070
79584
  var SKILL_TOOL_NAMES = new Set(skillToolDefs.map((t2) => t2.name));
79071
79585
  var WORKER_CONTROL_TOOL_NAMES = new Set(workerControlToolDefs.map((t2) => t2.name));
79586
+ var LOG_TOOL_NAMES2 = new Set(logToolDefs.map((t2) => t2.name));
79072
79587
  var toolDefs = [
79073
79588
  ...visionToolDefs,
79074
79589
  ...timeToolDefs,
@@ -79076,7 +79591,8 @@ var toolDefs = [
79076
79591
  ...presenceToolDefs,
79077
79592
  ...taskToolDefs,
79078
79593
  ...skillToolDefs,
79079
- ...workerControlToolDefs
79594
+ ...workerControlToolDefs,
79595
+ ...logToolDefs
79080
79596
  ];
79081
79597
  function getToolDefs(options) {
79082
79598
  return toolDefs.filter((t2) => {
@@ -79085,17 +79601,22 @@ function getToolDefs(options) {
79085
79601
  if (TASK_TOOL_NAMES.has(t2.name) && !options.includeTasks) return false;
79086
79602
  if (SKILL_TOOL_NAMES.has(t2.name) && !options.includeSkills) return false;
79087
79603
  if (WORKER_CONTROL_TOOL_NAMES.has(t2.name) && !options.includeWorkerControl) return false;
79604
+ if (LOG_TOOL_NAMES2.has(t2.name) && !options.includeLogs) return false;
79088
79605
  return true;
79089
79606
  });
79090
79607
  }
79091
79608
 
79092
79609
  // src/tools/tool-router.ts
79093
- var log28 = new Logger("tool");
79610
+ init_logger();
79611
+ var log29 = new Logger("tool");
79094
79612
  async function handleToolCall(name, args, ctx) {
79095
- log28.info(`${name}`, { args });
79096
- return await handleVisionTool(name, args, ctx) ?? handleTimeTool(name) ?? await handleMemoryTool(name, args, ctx) ?? handlePresenceTool(name, args, ctx) ?? await handleTaskTool(name, args, ctx) ?? await handleSkillTool(name, args, ctx) ?? await handleWorkerControlTool(name, args, ctx) ?? { error: `Unknown tool: ${name}` };
79613
+ log29.info(`${name}`, { args });
79614
+ return await handleVisionTool(name, args, ctx) ?? handleTimeTool(name) ?? await handleMemoryTool(name, args, ctx) ?? handlePresenceTool(name, args, ctx) ?? await handleTaskTool(name, args, ctx) ?? await handleSkillTool(name, args, ctx) ?? await handleWorkerControlTool(name, args, ctx) ?? await handleLogTool(name, args, ctx) ?? { error: `Unknown tool: ${name}` };
79097
79615
  }
79098
79616
 
79617
+ // src/tools/index.ts
79618
+ init_log_reader();
79619
+
79099
79620
  // src/tools/system-state-handler.ts
79100
79621
  init_mappers();
79101
79622
  var ACTIVE_WORKER_STATUSES = [
@@ -79213,13 +79734,13 @@ function buildSystemStateHandler(options) {
79213
79734
  }
79214
79735
 
79215
79736
  // src/server/lifecycle.ts
79216
- var log29 = new Logger("server");
79737
+ var log30 = new Logger("server");
79217
79738
  function resolveVersion(neuraHome) {
79218
79739
  if (process.env.NEURA_VERSION) return process.env.NEURA_VERSION;
79219
79740
  try {
79220
79741
  const bundleDir = dirname2(fileURLToPath(import.meta.url));
79221
79742
  const bundleVersionPath = join4(bundleDir, "version.txt");
79222
- if (existsSync6(bundleVersionPath)) {
79743
+ if (existsSync7(bundleVersionPath)) {
79223
79744
  return readFileSync5(bundleVersionPath, "utf-8").trim();
79224
79745
  }
79225
79746
  } catch {
@@ -79249,39 +79770,39 @@ async function initServices() {
79249
79770
  process.on("SIGINT", cleanup);
79250
79771
  process.on("SIGTERM", cleanup);
79251
79772
  } catch (err) {
79252
- log29.warn("failed to write neura-core.pid", { err: String(err) });
79773
+ log30.warn("failed to write neura-core.pid", { err: String(err) });
79253
79774
  }
79254
79775
  }
79255
79776
  let store = null;
79256
79777
  const backupPath = join4(config2.neuraHome, "memory-backup.json");
79257
79778
  if (config2.pgDataPath) {
79258
79779
  const pidPath = join4(config2.pgDataPath, "postmaster.pid");
79259
- if (existsSync6(pidPath)) {
79260
- log29.warn("removing stale postmaster.pid");
79780
+ if (existsSync7(pidPath)) {
79781
+ log30.warn("removing stale postmaster.pid");
79261
79782
  unlinkSync(pidPath);
79262
79783
  }
79263
79784
  try {
79264
79785
  const { PgliteStore } = await import("../stores/index.js");
79265
79786
  const embDims = config2.routing.embedding?.dimensions;
79266
79787
  store = await PgliteStore.create(config2.pgDataPath, embDims);
79267
- log29.info("database initialized", { path: config2.pgDataPath, embeddingDimensions: embDims });
79788
+ log30.info("database initialized", { path: config2.pgDataPath, embeddingDimensions: embDims });
79268
79789
  } catch (err) {
79269
- log29.warn("database corrupt or failed to open, resetting", { err: String(err) });
79790
+ log30.warn("database corrupt or failed to open, resetting", { err: String(err) });
79270
79791
  try {
79271
79792
  rmSync2(config2.pgDataPath, { recursive: true, force: true });
79272
79793
  const { PgliteStore } = await import("../stores/index.js");
79273
79794
  const embDims = config2.routing.embedding?.dimensions;
79274
79795
  store = await PgliteStore.create(config2.pgDataPath, embDims);
79275
- log29.info("database recreated after reset", { path: config2.pgDataPath });
79276
- if (existsSync6(backupPath)) {
79796
+ log30.info("database recreated after reset", { path: config2.pgDataPath });
79797
+ if (existsSync7(backupPath)) {
79277
79798
  const bs = new BackupService({ store, backupPath });
79278
79799
  const result = await bs.restore();
79279
79800
  if (result) {
79280
- log29.info("memories restored from backup after corruption", result);
79801
+ log30.info("memories restored from backup after corruption", result);
79281
79802
  }
79282
79803
  }
79283
79804
  } catch (retryErr) {
79284
- log29.warn("database unavailable after reset, persistence disabled", {
79805
+ log30.warn("database unavailable after reset, persistence disabled", {
79285
79806
  err: String(retryErr)
79286
79807
  });
79287
79808
  }
@@ -79301,14 +79822,14 @@ async function initServices() {
79301
79822
  retrievalStrategy: config2.retrievalStrategy,
79302
79823
  assistantName: config2.assistantName
79303
79824
  });
79304
- log29.info("memory manager initialized");
79825
+ log30.info("memory manager initialized");
79305
79826
  } catch (err) {
79306
- log29.warn("memory manager disabled \u2014 adapter error", {
79827
+ log30.warn("memory manager disabled \u2014 adapter error", {
79307
79828
  err: String(err)
79308
79829
  });
79309
79830
  }
79310
79831
  } else if (store) {
79311
- log29.info("memory manager disabled \u2014 text or embedding route not configured");
79832
+ log30.info("memory manager disabled \u2014 text or embedding route not configured");
79312
79833
  }
79313
79834
  if (store) {
79314
79835
  backupService = new BackupService({ store, backupPath });
@@ -79337,12 +79858,12 @@ async function initServices() {
79337
79858
  });
79338
79859
  discoveryLoop.start();
79339
79860
  } catch (err) {
79340
- log29.warn("discovery loop disabled \u2014 text adapter error", {
79861
+ log30.warn("discovery loop disabled \u2014 text adapter error", {
79341
79862
  err: String(err)
79342
79863
  });
79343
79864
  }
79344
79865
  } else if (store) {
79345
- log29.info("discovery loop disabled \u2014 text route not configured");
79866
+ log30.info("discovery loop disabled \u2014 text route not configured");
79346
79867
  }
79347
79868
  const pendingCleanups = /* @__PURE__ */ new Set();
79348
79869
  let skillRegistry = null;
@@ -79371,7 +79892,7 @@ async function initServices() {
79371
79892
  bundledSkillsDir
79372
79893
  });
79373
79894
  await skillWatcher.start();
79374
- log29.info("skill registry loaded", {
79895
+ log30.info("skill registry loaded", {
79375
79896
  count: skillRegistry.size,
79376
79897
  bundledSkillsDir
79377
79898
  });
@@ -79433,6 +79954,11 @@ async function initServices() {
79433
79954
  excludeTypes: options?.excludeTypes
79434
79955
  });
79435
79956
  },
79957
+ getWorkerSessionFile: async (workerId2) => {
79958
+ const { getWorker: getWorker2 } = await Promise.resolve().then(() => (init_worker_queries(), worker_queries_exports));
79959
+ const worker = await getWorker2(rawDb, workerId2);
79960
+ return worker?.sessionFile ?? null;
79961
+ },
79436
79962
  updateTask: async (idOrTitle, payload) => {
79437
79963
  const current = await store.getWorkItem(idOrTitle);
79438
79964
  if (!current) return null;
@@ -79444,7 +79970,7 @@ async function initServices() {
79444
79970
  });
79445
79971
  },
79446
79972
  deleteTask: (idOrTitle) => {
79447
- log29.warn("worker tried deleteTask (not supported for workers)", { idOrTitle });
79973
+ log30.warn("worker tried deleteTask (not supported for workers)", { idOrTitle });
79448
79974
  return Promise.resolve(false);
79449
79975
  }
79450
79976
  };
@@ -79455,14 +79981,14 @@ async function initServices() {
79455
79981
  try {
79456
79982
  await agentWorker?.setStatus(workerId, "blocked_clarifying");
79457
79983
  } catch (err) {
79458
- log29.warn("onBlock setStatus failed", { workerId, err: String(err) });
79984
+ log30.warn("onBlock setStatus failed", { workerId, err: String(err) });
79459
79985
  }
79460
79986
  },
79461
79987
  onUnblock: async (workerId) => {
79462
79988
  try {
79463
79989
  await agentWorker?.setStatus(workerId, "running");
79464
79990
  } catch (err) {
79465
- log29.warn("onUnblock setStatus failed", { workerId, err: String(err) });
79991
+ log30.warn("onUnblock setStatus failed", { workerId, err: String(err) });
79466
79992
  }
79467
79993
  }
79468
79994
  });
@@ -79501,7 +80027,7 @@ async function initServices() {
79501
80027
  }
79502
80028
  const authStorage = AuthStorage.create(join4(agentDir, "auth.json"));
79503
80029
  const seededProviders = seedAuthStorageFromConfig(authStorage, config2.providers);
79504
- log29.info("seeded pi auth storage from config", { count: seededProviders });
80030
+ log30.info("seeded pi auth storage from config", { count: seededProviders });
79505
80031
  const piRuntime = new PiRuntime({
79506
80032
  model,
79507
80033
  thinkingLevel: "low",
@@ -79528,14 +80054,14 @@ async function initServices() {
79528
80054
  const handle = await agentWorker.dispatchForTask(taskId);
79529
80055
  return { workerId: handle.workerId };
79530
80056
  } catch (err) {
79531
- log29.warn("dispatchForTask failed", { taskId, err: String(err) });
80057
+ log30.warn("dispatchForTask failed", { taskId, err: String(err) });
79532
80058
  return { error: String(err) };
79533
80059
  }
79534
80060
  }
79535
80061
  };
79536
- log29.info("phase 6 worker runtime ready");
80062
+ log30.info("phase 6 worker runtime ready");
79537
80063
  } catch (err) {
79538
- log29.error("phase 6 initialization failed \u2014 skills and workers disabled", {
80064
+ log30.error("phase 6 initialization failed \u2014 skills and workers disabled", {
79539
80065
  err: String(err)
79540
80066
  });
79541
80067
  skillRegistry = null;
@@ -79549,7 +80075,7 @@ async function initServices() {
79549
80075
  workerDispatchHandler = null;
79550
80076
  }
79551
80077
  } else {
79552
- log29.info("phase 6 disabled \u2014 missing store or worker route/API key");
80078
+ log30.info("phase 6 disabled \u2014 missing store or worker route/API key");
79553
80079
  }
79554
80080
  return {
79555
80081
  config: config2,
@@ -79588,7 +80114,7 @@ function buildSkillToolHandler(deps) {
79588
80114
  "disable-model-invocation: false"
79589
80115
  );
79590
80116
  if (updated === content) {
79591
- log29.warn("promote_skill did not find the draft flag to clear", {
80117
+ log30.warn("promote_skill did not find the draft flag to clear", {
79592
80118
  skillName,
79593
80119
  filePath: skill.filePath
79594
80120
  });
@@ -79680,7 +80206,7 @@ function buildWorkerControlHandler(deps) {
79680
80206
  return handler;
79681
80207
  }
79682
80208
  async function shutdown(services2, httpServer2, wss2) {
79683
- log29.info("shutting down");
80209
+ log30.info("shutting down");
79684
80210
  const forceExit = setTimeout(() => process.exit(1), 5e3);
79685
80211
  forceExit.unref();
79686
80212
  services2.discoveryLoop?.stop();
@@ -79690,14 +80216,14 @@ async function shutdown(services2, httpServer2, wss2) {
79690
80216
  try {
79691
80217
  await services2.agentWorker.cancelAll();
79692
80218
  } catch (err) {
79693
- log29.warn("agentWorker.cancelAll failed during shutdown", { err: String(err) });
80219
+ log30.warn("agentWorker.cancelAll failed during shutdown", { err: String(err) });
79694
80220
  }
79695
80221
  }
79696
80222
  if (services2.skillWatcher) {
79697
80223
  try {
79698
80224
  await services2.skillWatcher.stop();
79699
80225
  } catch (err) {
79700
- log29.warn("skillWatcher.stop failed during shutdown", { err: String(err) });
80226
+ log30.warn("skillWatcher.stop failed during shutdown", { err: String(err) });
79701
80227
  }
79702
80228
  }
79703
80229
  if (wss2) {
@@ -79705,14 +80231,14 @@ async function shutdown(services2, httpServer2, wss2) {
79705
80231
  void (async () => {
79706
80232
  await Promise.allSettled([...services2.pendingCleanups]);
79707
80233
  await services2.memoryManager?.close();
79708
- await services2.backupService?.backup().catch((err) => log29.warn("final backup failed", { err: String(err) }));
80234
+ await services2.backupService?.backup().catch((err) => log30.warn("final backup failed", { err: String(err) }));
79709
80235
  await services2.store?.close();
79710
80236
  httpServer2.close(() => process.exit(0));
79711
80237
  })();
79712
80238
  });
79713
80239
  } else {
79714
80240
  await services2.memoryManager?.close();
79715
- await services2.backupService?.backup().catch((err) => log29.warn("final backup failed", { err: String(err) }));
80241
+ await services2.backupService?.backup().catch((err) => log30.warn("final backup failed", { err: String(err) }));
79716
80242
  await services2.store?.close();
79717
80243
  httpServer2.close(() => process.exit(0));
79718
80244
  }
@@ -79720,7 +80246,8 @@ async function shutdown(services2, httpServer2, wss2) {
79720
80246
 
79721
80247
  // src/server/app.ts
79722
80248
  var import_express = __toESM(require_express2(), 1);
79723
- import { existsSync as existsSync7 } from "fs";
80249
+ init_logger();
80250
+ import { existsSync as existsSync8 } from "fs";
79724
80251
  import { dirname as dirname3, join as join5 } from "path";
79725
80252
  import { fileURLToPath as fileURLToPath2 } from "url";
79726
80253
 
@@ -79737,7 +80264,7 @@ function verifyToken(provided, expected) {
79737
80264
  }
79738
80265
 
79739
80266
  // src/server/app.ts
79740
- var log30 = new Logger("server");
80267
+ var log31 = new Logger("server");
79741
80268
  function createApp(services2, getPort) {
79742
80269
  const app2 = (0, import_express.default)();
79743
80270
  const { authToken } = services2.config;
@@ -79771,20 +80298,20 @@ function createApp(services2, getPort) {
79771
80298
  try {
79772
80299
  const bundleDir = dirname3(fileURLToPath2(import.meta.url));
79773
80300
  const bundledUiDir = join5(bundleDir, "..", "ui");
79774
- if (existsSync7(join5(bundledUiDir, "index.html"))) {
80301
+ if (existsSync8(join5(bundledUiDir, "index.html"))) {
79775
80302
  uiDir = bundledUiDir;
79776
80303
  }
79777
80304
  } catch {
79778
80305
  }
79779
80306
  if (!uiDir) {
79780
80307
  const homeUiDir = join5(services2.config.neuraHome, "ui");
79781
- if (existsSync7(join5(homeUiDir, "index.html"))) {
80308
+ if (existsSync8(join5(homeUiDir, "index.html"))) {
79782
80309
  uiDir = homeUiDir;
79783
80310
  }
79784
80311
  }
79785
80312
  if (uiDir) {
79786
80313
  app2.use(import_express.default.static(uiDir));
79787
- log30.info("web UI mounted", { path: uiDir });
80314
+ log31.info("web UI mounted", { path: uiDir });
79788
80315
  }
79789
80316
  app2.post("/backup", requireAuth, (_req, res) => {
79790
80317
  if (!services2.backupService) {
@@ -79817,10 +80344,12 @@ function createApp(services2, getPort) {
79817
80344
  }
79818
80345
 
79819
80346
  // src/server/websocket.ts
80347
+ init_logger();
79820
80348
  import { URL as URL2 } from "url";
79821
80349
 
79822
80350
  // src/providers/grok-voice.ts
79823
- var log31 = new Logger("voice");
80351
+ init_logger();
80352
+ var log32 = new Logger("voice");
79824
80353
  var WS_URL = "wss://api.x.ai/v1/realtime";
79825
80354
  var MAX_TRANSCRIPT_ENTRIES = 40;
79826
80355
  var GROK_VOICE_RATE_PER_MS = 0.05 / 6e4;
@@ -79905,7 +80434,7 @@ ${context}
79905
80434
  });
79906
80435
  this.ws.on("open", () => {
79907
80436
  const isReconnect = this.reconnectAttempts > 0 || this.transcript.length > 0;
79908
- log31.info("connected");
80437
+ log32.info("connected");
79909
80438
  this.reconnectAttempts = 0;
79910
80439
  this.ws.send(
79911
80440
  JSON.stringify({
@@ -79927,14 +80456,15 @@ ${context}
79927
80456
  includePresence: !!this.config.enterMode,
79928
80457
  includeTasks: !!this.config.taskTools,
79929
80458
  includeSkills: !!this.config.skillTools,
79930
- includeWorkerControl: !!this.config.workerControl
80459
+ includeWorkerControl: !!this.config.workerControl,
80460
+ includeLogs: !!this.config.workerLogs
79931
80461
  })
79932
80462
  }
79933
80463
  })
79934
80464
  );
79935
80465
  if (this.sessionTimer) clearTimeout(this.sessionTimer);
79936
80466
  this.sessionTimer = setTimeout(() => {
79937
- log31.info("proactive reconnect (approaching session limit)");
80467
+ log32.info("proactive reconnect (approaching session limit)");
79938
80468
  void this.reconnect();
79939
80469
  }, this.sessionMaxMs);
79940
80470
  if (isReconnect) this.cb.onReconnected();
@@ -79944,15 +80474,15 @@ ${context}
79944
80474
  const msg = JSON.parse(raw.toString());
79945
80475
  this.handleMessage(msg);
79946
80476
  } catch (err) {
79947
- log31.error("parse error", { err: String(err) });
80477
+ log32.error("parse error", { err: String(err) });
79948
80478
  }
79949
80479
  });
79950
80480
  this.ws.on("error", (err) => {
79951
- log31.error("ws error", { err: err.message });
80481
+ log32.error("ws error", { err: err.message });
79952
80482
  this.cb.onError(err.message);
79953
80483
  });
79954
80484
  this.ws.on("close", () => {
79955
- log31.info("disconnected");
80485
+ log32.info("disconnected");
79956
80486
  if (this.sessionTimer) {
79957
80487
  clearTimeout(this.sessionTimer);
79958
80488
  this.sessionTimer = null;
@@ -79966,14 +80496,14 @@ ${context}
79966
80496
  }
79967
80497
  attemptReconnect() {
79968
80498
  if (this.reconnectAttempts >= this.maxReconnectAttempts) {
79969
- log31.error(`max reconnect attempts (${this.maxReconnectAttempts}) reached`);
80499
+ log32.error(`max reconnect attempts (${this.maxReconnectAttempts}) reached`);
79970
80500
  this.cb.onError("Voice session disconnected \u2014 max reconnect attempts reached.");
79971
80501
  this.cb.onClose();
79972
80502
  return;
79973
80503
  }
79974
80504
  this.reconnectAttempts++;
79975
80505
  const delay = Math.min(1e3 * Math.pow(2, this.reconnectAttempts - 1), 16e3);
79976
- log31.info(
80506
+ log32.info(
79977
80507
  `reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`
79978
80508
  );
79979
80509
  setTimeout(() => {
@@ -79993,14 +80523,14 @@ ${context}
79993
80523
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
79994
80524
  handleMessage(msg) {
79995
80525
  if (msg.type !== "response.output_audio.delta" && msg.type !== "ping") {
79996
- log31.debug("event", { type: msg.type });
80526
+ log32.debug("event", { type: msg.type });
79997
80527
  }
79998
80528
  switch (msg.type) {
79999
80529
  case "session.created":
80000
80530
  case "conversation.created":
80001
80531
  break;
80002
80532
  case "session.updated":
80003
- log31.info("session configured");
80533
+ log32.info("session configured");
80004
80534
  if (!this.readyFired) {
80005
80535
  this.readyFired = true;
80006
80536
  this.cb.onReady();
@@ -80030,7 +80560,7 @@ ${context}
80030
80560
  break;
80031
80561
  case "response.done": {
80032
80562
  const audioMs = Math.round(this.turnAudioBytes / 48);
80033
- log31.info("turn audio", {
80563
+ log32.info("turn audio", {
80034
80564
  chunks: this.turnAudioChunks,
80035
80565
  bytes: this.turnAudioBytes,
80036
80566
  ms: audioMs
@@ -80061,7 +80591,7 @@ ${context}
80061
80591
  void this.handleFunctionCallDone(msg);
80062
80592
  break;
80063
80593
  case "error":
80064
- log31.error("api error", { error: msg.error });
80594
+ log32.error("api error", { error: msg.error });
80065
80595
  this.cb.onError(msg.error?.message || "Unknown error");
80066
80596
  break;
80067
80597
  }
@@ -80085,7 +80615,8 @@ ${context}
80085
80615
  skillTools: this.config.skillTools,
80086
80616
  workerControl: this.config.workerControl,
80087
80617
  workerDispatch: this.config.workerDispatch,
80088
- systemState: this.config.systemState
80618
+ systemState: this.config.systemState,
80619
+ workerLogs: this.config.workerLogs
80089
80620
  });
80090
80621
  this.cb.onToolResult(name, result);
80091
80622
  if (currentWs && currentWs === this.ws && currentWs.readyState === wrapper_default.OPEN) {
@@ -80161,12 +80692,12 @@ ${context}
80161
80692
  */
80162
80693
  interject(message, options) {
80163
80694
  if (this.ws?.readyState !== wrapper_default.OPEN) {
80164
- log31.warn("interject called with no active ws", { preview: message.slice(0, 80) });
80695
+ log32.warn("interject called with no active ws", { preview: message.slice(0, 80) });
80165
80696
  return Promise.resolve();
80166
80697
  }
80167
80698
  const now = Date.now();
80168
80699
  if (!options.bypassRateLimit && now - this.lastInterjectAt < this.minInterjectIntervalMs) {
80169
- log31.info("interject rate-limited, dropping", {
80700
+ log32.info("interject rate-limited, dropping", {
80170
80701
  preview: message.slice(0, 80),
80171
80702
  msSinceLast: now - this.lastInterjectAt
80172
80703
  });
@@ -80204,7 +80735,8 @@ ${context}
80204
80735
  };
80205
80736
 
80206
80737
  // src/providers/pipeline-voice.ts
80207
- var log32 = new Logger("pipeline-voice");
80738
+ init_logger();
80739
+ var log33 = new Logger("pipeline-voice");
80208
80740
  var MAX_TRANSCRIPT_HISTORY = 40;
80209
80741
  var MIN_INTERJECT_INTERVAL_MS = 1e4;
80210
80742
  var SENTENCE_FLUSH_CHARS = 200;
@@ -80236,7 +80768,8 @@ var PipelineVoiceProvider = class {
80236
80768
  includePresence: !!config2.enterMode,
80237
80769
  includeTasks: !!config2.taskTools,
80238
80770
  includeSkills: !!config2.skillTools,
80239
- includeWorkerControl: !!config2.workerControl
80771
+ includeWorkerControl: !!config2.workerControl,
80772
+ includeLogs: !!config2.workerLogs
80240
80773
  });
80241
80774
  this.toolCtx = {
80242
80775
  queryWatcher: cb.queryWatcher,
@@ -80246,7 +80779,8 @@ var PipelineVoiceProvider = class {
80246
80779
  skillTools: config2.skillTools,
80247
80780
  workerControl: config2.workerControl,
80248
80781
  workerDispatch: config2.workerDispatch,
80249
- systemState: config2.systemState
80782
+ systemState: config2.systemState,
80783
+ workerLogs: config2.workerLogs
80250
80784
  };
80251
80785
  }
80252
80786
  // ─── VoiceProvider interface ─────────────────────────────────
@@ -80255,7 +80789,7 @@ var PipelineVoiceProvider = class {
80255
80789
  this.connected = true;
80256
80790
  this.sttStream = this.sttAdapter.createStream("pcm16");
80257
80791
  this.sttStream.on("error", (err) => {
80258
- log32.warn("STT stream error", { err: err.message });
80792
+ log33.warn("STT stream error", { err: err.message });
80259
80793
  this.cb.onError(`STT error: ${err.message}`);
80260
80794
  void this.reconnectSTT();
80261
80795
  });
@@ -80291,12 +80825,12 @@ var PipelineVoiceProvider = class {
80291
80825
  // ─── VoiceInterjector interface ──────────────────────────────
80292
80826
  async interject(message, options) {
80293
80827
  if (this.closed || !this.connected) {
80294
- log32.warn("interject called while closed", { preview: message.slice(0, 80) });
80828
+ log33.warn("interject called while closed", { preview: message.slice(0, 80) });
80295
80829
  return;
80296
80830
  }
80297
80831
  const now = Date.now();
80298
80832
  if (!options.bypassRateLimit && now - this.lastInterjectAt < MIN_INTERJECT_INTERVAL_MS) {
80299
- log32.info("interject rate-limited", { preview: message.slice(0, 80) });
80833
+ log33.info("interject rate-limited", { preview: message.slice(0, 80) });
80300
80834
  return;
80301
80835
  }
80302
80836
  this.lastInterjectAt = now;
@@ -80318,7 +80852,7 @@ var PipelineVoiceProvider = class {
80318
80852
  }
80319
80853
  } catch (err) {
80320
80854
  if (!signal.aborted) {
80321
- log32.warn("interject TTS failed", { err: String(err) });
80855
+ log33.warn("interject TTS failed", { err: String(err) });
80322
80856
  }
80323
80857
  }
80324
80858
  }
@@ -80347,7 +80881,7 @@ var PipelineVoiceProvider = class {
80347
80881
  }
80348
80882
  } catch (err) {
80349
80883
  if (!this.closed) {
80350
- log32.warn("STT loop error", { err: String(err) });
80884
+ log33.warn("STT loop error", { err: String(err) });
80351
80885
  this.cb.onError(`STT loop error: ${String(err)}`);
80352
80886
  void this.reconnectSTT();
80353
80887
  }
@@ -80358,18 +80892,18 @@ var PipelineVoiceProvider = class {
80358
80892
  // ─── Internal: STT reconnection ──────────────────────────────
80359
80893
  reconnectSTT() {
80360
80894
  if (this.closed) return;
80361
- log32.info("attempting STT reconnection");
80895
+ log33.info("attempting STT reconnection");
80362
80896
  try {
80363
80897
  this.sttStream?.abort();
80364
80898
  this.sttStream = this.sttAdapter.createStream("pcm16");
80365
80899
  this.sttStream.on("error", (err) => {
80366
- log32.warn("STT stream error after reconnect", { err: err.message });
80900
+ log33.warn("STT stream error after reconnect", { err: err.message });
80367
80901
  this.cb.onError(`STT error: ${err.message}`);
80368
80902
  });
80369
80903
  void this.runSTTLoop();
80370
80904
  this.cb.onReconnected();
80371
80905
  } catch (err) {
80372
- log32.warn("STT reconnection failed", { err: String(err) });
80906
+ log33.warn("STT reconnection failed", { err: String(err) });
80373
80907
  this.cb.onError("STT reconnection failed");
80374
80908
  }
80375
80909
  }
@@ -80383,7 +80917,7 @@ var PipelineVoiceProvider = class {
80383
80917
  const signal = this.currentTurnAbort.signal;
80384
80918
  void this.processUserUtterance(text, signal).catch((err) => {
80385
80919
  if (!signal.aborted) {
80386
- log32.warn("turn processing failed", { err: String(err) });
80920
+ log33.warn("turn processing failed", { err: String(err) });
80387
80921
  this.cb.onError(`Processing error: ${String(err)}`);
80388
80922
  }
80389
80923
  });
@@ -80507,7 +81041,7 @@ var PipelineVoiceProvider = class {
80507
81041
  }
80508
81042
  } catch (err) {
80509
81043
  if (!signal.aborted) {
80510
- log32.warn("TTS synthesis failed", { err: String(err), text: text.slice(0, 40) });
81044
+ log33.warn("TTS synthesis failed", { err: String(err), text: text.slice(0, 40) });
80511
81045
  }
80512
81046
  }
80513
81047
  }
@@ -80572,7 +81106,8 @@ function createVoiceSession(cb, config2 = {}, registry2) {
80572
81106
  skillTools: config2.skillTools,
80573
81107
  workerControl: config2.workerControl,
80574
81108
  workerDispatch: config2.workerDispatch,
80575
- systemState: config2.systemState
81109
+ systemState: config2.systemState,
81110
+ workerLogs: config2.workerLogs
80576
81111
  };
80577
81112
  return new PipelineVoiceProvider(cb, pipelineConfig, llmAdapter, sttAdapter, ttsAdapter);
80578
81113
  }
@@ -85622,14 +86157,14 @@ function __asyncValues(o) {
85622
86157
  }, i2);
85623
86158
  function verb(n) {
85624
86159
  i2[n] = o[n] && function(v) {
85625
- return new Promise(function(resolve4, reject) {
85626
- v = o[n](v), settle(resolve4, reject, v.done, v.value);
86160
+ return new Promise(function(resolve5, reject) {
86161
+ v = o[n](v), settle(resolve5, reject, v.done, v.value);
85627
86162
  });
85628
86163
  };
85629
86164
  }
85630
- function settle(resolve4, reject, d, v) {
86165
+ function settle(resolve5, reject, d, v) {
85631
86166
  Promise.resolve(v).then(function(v2) {
85632
- resolve4({ value: v2, done: d });
86167
+ resolve5({ value: v2, done: d });
85633
86168
  }, reject);
85634
86169
  }
85635
86170
  }
@@ -91935,8 +92470,8 @@ var LiveMusic = class {
91935
92470
  const url2 = `${websocketBaseUrl}/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateMusic?key=${apiKey}`;
91936
92471
  let onopenResolve = () => {
91937
92472
  };
91938
- const onopenPromise = new Promise((resolve4) => {
91939
- onopenResolve = resolve4;
92473
+ const onopenPromise = new Promise((resolve5) => {
92474
+ onopenResolve = resolve5;
91940
92475
  });
91941
92476
  const callbacks = params.callbacks;
91942
92477
  const onopenAwaitedCallback = function() {
@@ -92176,8 +92711,8 @@ var Live = class {
92176
92711
  }
92177
92712
  let onopenResolve = () => {
92178
92713
  };
92179
- const onopenPromise = new Promise((resolve4) => {
92180
- onopenResolve = resolve4;
92714
+ const onopenPromise = new Promise((resolve5) => {
92715
+ onopenResolve = resolve5;
92181
92716
  });
92182
92717
  const callbacks = params.callbacks;
92183
92718
  const onopenAwaitedCallback = function() {
@@ -95178,7 +95713,7 @@ var safeJSON2 = (text) => {
95178
95713
  return void 0;
95179
95714
  }
95180
95715
  };
95181
- var sleep$1 = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
95716
+ var sleep$1 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
95182
95717
  function getDefaultFetch2() {
95183
95718
  if (typeof fetch !== "undefined") {
95184
95719
  return fetch;
@@ -95971,8 +96506,8 @@ async function defaultParseResponse2(client, props) {
95971
96506
  }
95972
96507
  var APIPromise2 = class _APIPromise extends Promise {
95973
96508
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse2) {
95974
- super((resolve4) => {
95975
- resolve4(null);
96509
+ super((resolve5) => {
96510
+ resolve5(null);
95976
96511
  });
95977
96512
  this.responsePromise = responsePromise;
95978
96513
  this.parseResponse = parseResponse2;
@@ -98224,6 +98759,7 @@ function getApiKeyFromEnv() {
98224
98759
  }
98225
98760
 
98226
98761
  // src/providers/gemini-vision.ts
98762
+ init_logger();
98227
98763
  import crypto5 from "crypto";
98228
98764
  var GEMINI_VISION_RATE_PER_MS = 2e-3 / 6e4;
98229
98765
  var GeminiVisionProvider = class {
@@ -98384,9 +98920,9 @@ var GeminiVisionProvider = class {
98384
98920
  }
98385
98921
  }
98386
98922
  query(prompt) {
98387
- return new Promise((resolve4) => {
98923
+ return new Promise((resolve5) => {
98388
98924
  if (!this.connected || !this.session) {
98389
- resolve4("Vision not available \u2014 watcher not connected.");
98925
+ resolve5("Vision not available \u2014 watcher not connected.");
98390
98926
  return;
98391
98927
  }
98392
98928
  const id = crypto5.randomUUID();
@@ -98397,9 +98933,9 @@ var GeminiVisionProvider = class {
98397
98933
  this.responseBuffer = "";
98398
98934
  this.processNextQuery();
98399
98935
  }
98400
- resolve4("Vision analysis timed out.");
98936
+ resolve5("Vision analysis timed out.");
98401
98937
  }, this.queryTimeoutMs);
98402
- this.queryQueue.set(id, { id, prompt, resolve: resolve4, timeout });
98938
+ this.queryQueue.set(id, { id, prompt, resolve: resolve5, timeout });
98403
98939
  this.processNextQuery();
98404
98940
  });
98405
98941
  }
@@ -98426,7 +98962,8 @@ var GeminiVisionProvider = class {
98426
98962
  };
98427
98963
 
98428
98964
  // src/adapters/snapshot-vision.ts
98429
- var log33 = new Logger("snapshot-vision");
98965
+ init_logger();
98966
+ var log34 = new Logger("snapshot-vision");
98430
98967
  var SnapshotVisionAdapter = class {
98431
98968
  constructor(textAdapter) {
98432
98969
  this.textAdapter = textAdapter;
@@ -98444,7 +98981,7 @@ var SnapshotVisionAdapter = class {
98444
98981
  ]);
98445
98982
  return response.content;
98446
98983
  } catch (err) {
98447
- log33.warn("snapshot vision query failed", { err: String(err) });
98984
+ log34.warn("snapshot vision query failed", { err: String(err) });
98448
98985
  return "Vision query failed \u2014 could not analyze the image.";
98449
98986
  }
98450
98987
  }
@@ -98564,41 +99101,43 @@ var CostTracker = class {
98564
99101
  };
98565
99102
 
98566
99103
  // src/server/websocket.ts
98567
- import { existsSync as existsSync9, readdirSync as readdirSync2 } from "fs";
99104
+ import { existsSync as existsSync10, readdirSync as readdirSync2 } from "fs";
98568
99105
  import { join as join7 } from "path";
98569
99106
 
98570
99107
  // src/presence/onnx-wake-detector.ts
98571
- import { existsSync as existsSync8 } from "fs";
99108
+ init_logger();
99109
+ import { existsSync as existsSync9 } from "fs";
98572
99110
  import { join as join6 } from "path";
98573
99111
 
98574
99112
  // src/presence/ort-loader.ts
98575
- var log34 = new Logger("ort-loader");
99113
+ init_logger();
99114
+ var log35 = new Logger("ort-loader");
98576
99115
  var cached2;
98577
99116
  async function loadOrt() {
98578
99117
  if (cached2 !== void 0) return cached2;
98579
99118
  try {
98580
99119
  const mod = await import("onnxruntime-node");
98581
99120
  cached2 = { ort: mod, backend: "native" };
98582
- log34.info("ONNX runtime loaded", { backend: "native" });
99121
+ log35.info("ONNX runtime loaded", { backend: "native" });
98583
99122
  return cached2;
98584
99123
  } catch {
98585
- log34.debug("onnxruntime-node unavailable, trying WASM fallback");
99124
+ log35.debug("onnxruntime-node unavailable, trying WASM fallback");
98586
99125
  }
98587
99126
  try {
98588
99127
  const mod = await import("onnxruntime-web");
98589
99128
  mod.env.wasm.numThreads = 1;
98590
99129
  cached2 = { ort: mod, backend: "wasm" };
98591
- log34.info("ONNX runtime loaded", { backend: "wasm" });
99130
+ log35.info("ONNX runtime loaded", { backend: "wasm" });
98592
99131
  return cached2;
98593
99132
  } catch {
98594
- log34.warn("no ONNX runtime available \u2014 wake word detection will be disabled");
99133
+ log35.warn("no ONNX runtime available \u2014 wake word detection will be disabled");
98595
99134
  }
98596
99135
  cached2 = null;
98597
99136
  return null;
98598
99137
  }
98599
99138
 
98600
99139
  // src/presence/onnx-wake-detector.ts
98601
- var log35 = new Logger("onnx-wake");
99140
+ var log36 = new Logger("onnx-wake");
98602
99141
  var MODEL_SAMPLE_RATE = 16e3;
98603
99142
  var INPUT_SAMPLE_RATE = 24e3;
98604
99143
  var EMBEDDING_WINDOW = 76;
@@ -98670,7 +99209,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98670
99209
  embedding: embeddingPath,
98671
99210
  classifier: classifierPath
98672
99211
  })) {
98673
- if (!existsSync8(path3)) {
99212
+ if (!existsSync9(path3)) {
98674
99213
  throw new Error(`ONNX ${name} model not found: ${path3}`);
98675
99214
  }
98676
99215
  }
@@ -98684,7 +99223,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98684
99223
  ort.InferenceSession.create(embeddingPath, opts),
98685
99224
  ort.InferenceSession.create(classifierPath, opts)
98686
99225
  ]);
98687
- log35.info("ONNX models loaded", {
99226
+ log36.info("ONNX models loaded", {
98688
99227
  backend,
98689
99228
  mel: melPath,
98690
99229
  embedding: embeddingPath,
@@ -98734,10 +99273,10 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98734
99273
  }
98735
99274
  setAssistantName(name) {
98736
99275
  this.config.assistantName = name;
98737
- log35.info("assistant name updated, reloading classifier", { assistantName: name });
99276
+ log36.info("assistant name updated, reloading classifier", { assistantName: name });
98738
99277
  const classifierPath = join6(this.config.modelsDir, `${name}.onnx`);
98739
- if (!existsSync8(classifierPath)) {
98740
- log35.warn("no ONNX classifier for new name", { name, path: classifierPath });
99278
+ if (!existsSync9(classifierPath)) {
99279
+ log36.warn("no ONNX classifier for new name", { name, path: classifierPath });
98741
99280
  return;
98742
99281
  }
98743
99282
  const provider = this.backend === "native" ? "cpu" : "wasm";
@@ -98747,7 +99286,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98747
99286
  this.classifierSession = session;
98748
99287
  this.classifierInputName = session.inputNames[0];
98749
99288
  this.classifierOutputName = session.outputNames[0];
98750
- log35.info("classifier reloaded", { name });
99289
+ log36.info("classifier reloaded", { name });
98751
99290
  });
98752
99291
  }
98753
99292
  close() {
@@ -98796,11 +99335,11 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98796
99335
  const score = await this.runPipeline(chunk);
98797
99336
  const isWake = score >= this.threshold;
98798
99337
  if (score > 0.1) {
98799
- log35.debug("inference result", { score: score.toFixed(4), isWake });
99338
+ log36.debug("inference result", { score: score.toFixed(4), isWake });
98800
99339
  }
98801
99340
  this.config.onDebug?.({ score, isWake });
98802
99341
  if (isWake && !this.closed) {
98803
- log35.info("wake word detected via ONNX", { score: score.toFixed(4) });
99342
+ log36.info("wake word detected via ONNX", { score: score.toFixed(4) });
98804
99343
  this.lastDetectionTime = Date.now();
98805
99344
  const chunks = [...this.replayChunks];
98806
99345
  this.replayChunks.length = 0;
@@ -98808,7 +99347,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98808
99347
  this.config.onWake(chunks);
98809
99348
  }
98810
99349
  } catch (err) {
98811
- log35.error("ONNX inference failed", { err: String(err) });
99350
+ log36.error("ONNX inference failed", { err: String(err) });
98812
99351
  } finally {
98813
99352
  this.inferenceInProgress = false;
98814
99353
  }
@@ -98894,7 +99433,8 @@ function rms(samples) {
98894
99433
  }
98895
99434
 
98896
99435
  // src/presence/presence-manager.ts
98897
- var log36 = new Logger("presence");
99436
+ init_logger();
99437
+ var log37 = new Logger("presence");
98898
99438
  var ACTIVE_IDLE_TIMEOUT_MS = 5 * 6e4;
98899
99439
  var PresenceManager = class {
98900
99440
  _state = "passive";
@@ -98935,7 +99475,7 @@ var PresenceManager = class {
98935
99475
  if (this.idleTimer) clearTimeout(this.idleTimer);
98936
99476
  this.idleTimer = setTimeout(() => {
98937
99477
  if (this._state === "active") {
98938
- log36.info("active idle timeout, going passive");
99478
+ log37.info("active idle timeout, going passive");
98939
99479
  this.enterMode("passive");
98940
99480
  }
98941
99481
  }, ACTIVE_IDLE_TIMEOUT_MS);
@@ -98954,16 +99494,25 @@ var PresenceManager = class {
98954
99494
  if (this._state === newState) return;
98955
99495
  const prev = this._state;
98956
99496
  this._state = newState;
98957
- log36.info("state transition", { from: prev, to: newState });
99497
+ log37.info("state transition", { from: prev, to: newState });
98958
99498
  this.callbacks.onStateChange(newState);
98959
99499
  }
98960
99500
  };
98961
99501
 
98962
99502
  // src/server/websocket.ts
98963
- var log37 = new Logger("server");
99503
+ var log38 = new Logger("server");
98964
99504
  var IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
98965
99505
  var COST_UPDATE_INTERVAL_MS = 3e4;
98966
99506
  var INFRA_MODELS = /* @__PURE__ */ new Set(["melspectrogram", "embedding_model"]);
99507
+ function buildSource(options) {
99508
+ if (options.source === "session") {
99509
+ if (!options.sessionFile) {
99510
+ throw new Error("read_log with source='session' requires session_file");
99511
+ }
99512
+ return { kind: "session", sessionFile: options.sessionFile };
99513
+ }
99514
+ return { kind: "core" };
99515
+ }
98967
99516
  function getAvailableWakeWords(modelsDir) {
98968
99517
  try {
98969
99518
  return readdirSync2(modelsDir).filter((f3) => f3.endsWith(".onnx")).map((f3) => f3.replace(".onnx", "")).filter((name) => !INFRA_MODELS.has(name));
@@ -98998,13 +99547,13 @@ function attachWebSocket(httpServer2, services2) {
98998
99547
  if (token && verifyToken(token, authToken)) {
98999
99548
  done(true);
99000
99549
  } else {
99001
- log37.warn("websocket auth rejected");
99550
+ log38.warn("websocket auth rejected");
99002
99551
  done(false, 401, "Unauthorized");
99003
99552
  }
99004
99553
  } : void 0
99005
99554
  });
99006
99555
  wss2.on("connection", (ws) => {
99007
- log37.info("client connected");
99556
+ log38.info("client connected");
99008
99557
  if (ws.readyState === import_websocket.default.OPEN) {
99009
99558
  ws.send(JSON.stringify({ type: "presenceState", state: "passive" }));
99010
99559
  }
@@ -99020,7 +99569,7 @@ function attachWebSocket(httpServer2, services2) {
99020
99569
  }
99021
99570
  const visionProviderLabel = visionRoute ? `${visionRoute.provider}/${visionRoute.model} (${visionRoute.mode})` : "none";
99022
99571
  const sessionIdPromise = store ? store.createSession(voiceProviderLabel, visionProviderLabel).catch((err) => {
99023
- log37.warn("session creation failed", { err: String(err) });
99572
+ log38.warn("session creation failed", { err: String(err) });
99024
99573
  return null;
99025
99574
  }) : Promise.resolve(null);
99026
99575
  const pendingWrites = /* @__PURE__ */ new Set();
@@ -99038,7 +99587,7 @@ function attachWebSocket(httpServer2, services2) {
99038
99587
  await memoryManager.queueExtraction(sid);
99039
99588
  }
99040
99589
  }).catch((err) => {
99041
- log37.warn("extraction failed", { err: String(err) });
99590
+ log38.warn("extraction failed", { err: String(err) });
99042
99591
  });
99043
99592
  pendingCleanups.add(extractionPromise);
99044
99593
  void extractionPromise.finally(() => pendingCleanups.delete(extractionPromise));
@@ -99047,7 +99596,7 @@ function attachWebSocket(httpServer2, services2) {
99047
99596
  function resetIdleTimer() {
99048
99597
  if (idleTimer) clearTimeout(idleTimer);
99049
99598
  idleTimer = setTimeout(() => {
99050
- log37.info("idle timeout, triggering extraction");
99599
+ log38.info("idle timeout, triggering extraction");
99051
99600
  triggerExtraction();
99052
99601
  }, IDLE_TIMEOUT_MS);
99053
99602
  }
@@ -99088,12 +99637,12 @@ function attachWebSocket(httpServer2, services2) {
99088
99637
  cameraWatcher.close();
99089
99638
  cameraWatcher = null;
99090
99639
  costTracker.markVisionInactive("camera");
99091
- log37.info("camera watcher closed");
99640
+ log38.info("camera watcher closed");
99092
99641
  } else if (source === "screen" && screenWatcher) {
99093
99642
  screenWatcher.close();
99094
99643
  screenWatcher = null;
99095
99644
  costTracker.markVisionInactive("screen");
99096
- log37.info("screen watcher closed");
99645
+ log38.info("screen watcher closed");
99097
99646
  }
99098
99647
  }
99099
99648
  const memoryTools = memoryManager ? {
@@ -99152,6 +99701,13 @@ function attachWebSocket(httpServer2, services2) {
99152
99701
  excludeTypes: options?.excludeTypes
99153
99702
  });
99154
99703
  },
99704
+ getWorkerSessionFile: async (workerId) => {
99705
+ const db = store.getRawDb?.();
99706
+ if (!db) return null;
99707
+ const { getWorker: getWorker2 } = await Promise.resolve().then(() => (init_worker_queries(), worker_queries_exports));
99708
+ const worker = await getWorker2(db, workerId);
99709
+ return worker?.sessionFile ?? null;
99710
+ },
99155
99711
  updateTask: async (idOrTitle, payload) => {
99156
99712
  const current = await resolveTask(store, idOrTitle);
99157
99713
  if (!current) return null;
@@ -99190,7 +99746,7 @@ function attachWebSocket(httpServer2, services2) {
99190
99746
  sessionIdPromise.then(async (sid) => {
99191
99747
  if (sid) await store.appendTranscript(sid, "user", text);
99192
99748
  }).catch((err) => {
99193
- log37.warn("transcript write failed", { err: String(err) });
99749
+ log38.warn("transcript write failed", { err: String(err) });
99194
99750
  })
99195
99751
  );
99196
99752
  }
@@ -99205,7 +99761,7 @@ function attachWebSocket(httpServer2, services2) {
99205
99761
  sessionIdPromise.then(async (sid) => {
99206
99762
  if (sid) await store.appendTranscript(sid, "assistant", text);
99207
99763
  }).catch((err) => {
99208
- log37.warn("transcript write failed", { err: String(err) });
99764
+ log38.warn("transcript write failed", { err: String(err) });
99209
99765
  })
99210
99766
  );
99211
99767
  }
@@ -99277,10 +99833,10 @@ function attachWebSocket(httpServer2, services2) {
99277
99833
  const MAX_PENDING_ACTIVATION_AUDIO = 100;
99278
99834
  async function activateVoiceSession(wakeTranscript) {
99279
99835
  if (connectionClosed || session) return;
99280
- log37.info("activating voice session", { wakeTranscript });
99836
+ log38.info("activating voice session", { wakeTranscript });
99281
99837
  extractionTriggered = false;
99282
99838
  let systemPromptPrefix = memoryManager ? await memoryManager.buildSystemPrompt().catch((err) => {
99283
- log37.warn("memory prompt build failed", { err: String(err) });
99839
+ log38.warn("memory prompt build failed", { err: String(err) });
99284
99840
  return void 0;
99285
99841
  }) : void 0;
99286
99842
  if (store) {
@@ -99311,7 +99867,24 @@ function attachWebSocket(httpServer2, services2) {
99311
99867
  skillTools: skillToolHandler ?? void 0,
99312
99868
  workerControl: workerControlHandler ?? void 0,
99313
99869
  systemState: systemStateHandler ?? void 0,
99314
- workerDispatch: workerDispatchHandler ?? void 0
99870
+ workerDispatch: workerDispatchHandler ?? void 0,
99871
+ workerLogs: {
99872
+ // readLog is sync. The async wrapper satisfies the
99873
+ // interface contract and leaves room for future I/O
99874
+ // (e.g. a streamed read), but there's no await here.
99875
+ read: async (options) => {
99876
+ const { readLog: readLog2 } = await Promise.resolve().then(() => (init_log_reader(), log_reader_exports));
99877
+ return readLog2({
99878
+ neuraHome: services2.config.neuraHome,
99879
+ ...options.source ? { source: buildSource(options) } : {},
99880
+ ...options.path ? { path: options.path } : {},
99881
+ ...options.workerId ? { workerId: options.workerId } : {},
99882
+ ...options.taskId ? { taskId: options.taskId } : {},
99883
+ minLevel: options.includeInfo ? "info" : "warn",
99884
+ ...options.lines !== void 0 ? { limit: options.lines } : {}
99885
+ });
99886
+ }
99887
+ }
99315
99888
  },
99316
99889
  services2.registry
99317
99890
  );
@@ -99325,7 +99898,7 @@ function attachWebSocket(httpServer2, services2) {
99325
99898
  }
99326
99899
  }
99327
99900
  function deactivateVoiceSession() {
99328
- log37.info("deactivating voice session");
99901
+ log38.info("deactivating voice session");
99329
99902
  pendingWakeAudio = null;
99330
99903
  pendingActivationAudio = [];
99331
99904
  pendingText = [];
@@ -99342,13 +99915,13 @@ function attachWebSocket(httpServer2, services2) {
99342
99915
  const melPath = join7(modelsDir, "melspectrogram.onnx");
99343
99916
  const embPath = join7(modelsDir, "embedding_model.onnx");
99344
99917
  const classifierPath = join7(modelsDir, `${config2.assistantName}.onnx`);
99345
- if (!existsSync9(melPath) || !existsSync9(embPath)) {
99346
- log37.warn("ONNX base models not found, wake detection disabled", { modelsDir });
99918
+ if (!existsSync10(melPath) || !existsSync10(embPath)) {
99919
+ log38.warn("ONNX base models not found, wake detection disabled", { modelsDir });
99347
99920
  return;
99348
99921
  }
99349
- if (!existsSync9(classifierPath)) {
99922
+ if (!existsSync10(classifierPath)) {
99350
99923
  const available = getAvailableWakeWords(modelsDir);
99351
- log37.warn("no wake word model for configured name", {
99924
+ log38.warn("no wake word model for configured name", {
99352
99925
  assistantName: config2.assistantName,
99353
99926
  available
99354
99927
  });
@@ -99363,12 +99936,12 @@ function attachWebSocket(httpServer2, services2) {
99363
99936
  presence.wake("(detected via onnx)");
99364
99937
  },
99365
99938
  onDebug: (info) => {
99366
- log37.debug("onnx wake check", info);
99939
+ log38.debug("onnx wake check", info);
99367
99940
  }
99368
99941
  });
99369
- log37.info("wake word detection active", { assistantName: config2.assistantName });
99942
+ log38.info("wake word detection active", { assistantName: config2.assistantName });
99370
99943
  } catch (err) {
99371
- log37.error("ONNX wake detector failed to start", { err: String(err) });
99944
+ log38.error("ONNX wake detector failed to start", { err: String(err) });
99372
99945
  }
99373
99946
  }
99374
99947
  const presence = new PresenceManager({
@@ -99411,7 +99984,7 @@ function attachWebSocket(httpServer2, services2) {
99411
99984
  if (wakeDetector) {
99412
99985
  wakeDetector.feedAudio(msg.data);
99413
99986
  } else {
99414
- log37.debug("audio received but no wake detector");
99987
+ log38.debug("audio received but no wake detector");
99415
99988
  }
99416
99989
  }
99417
99990
  break;
@@ -99449,17 +100022,17 @@ function attachWebSocket(httpServer2, services2) {
99449
100022
  break;
99450
100023
  case "manualStart":
99451
100024
  if (presence.state === "passive") {
99452
- log37.info("manual session start");
100025
+ log38.info("manual session start");
99453
100026
  presence.enterMode("active");
99454
100027
  }
99455
100028
  break;
99456
100029
  }
99457
100030
  } catch (err) {
99458
- log37.error("bad message", { err: String(err) });
100031
+ log38.error("bad message", { err: String(err) });
99459
100032
  }
99460
100033
  });
99461
100034
  ws.on("close", () => {
99462
- log37.info("client disconnected");
100035
+ log38.info("client disconnected");
99463
100036
  connectionClosed = true;
99464
100037
  connectedClients.delete(ws);
99465
100038
  if (idleTimer) {
@@ -99488,7 +100061,7 @@ function attachWebSocket(httpServer2, services2) {
99488
100061
  }
99489
100062
 
99490
100063
  // src/server/server.ts
99491
- var log38 = new Logger("server");
100064
+ var log39 = new Logger("server");
99492
100065
  var services = await initServices();
99493
100066
  var actualPort = services.config.port;
99494
100067
  var app = createApp(services, () => actualPort);
@@ -99502,14 +100075,14 @@ function startServer(port, maxRetries = 10) {
99502
100075
  wss = attachWebSocket(httpServer, services);
99503
100076
  process.stdout.write(`NEURA_PORT=${port}
99504
100077
  `);
99505
- log38.info(`Neura core server at http://localhost:${port}`);
100078
+ log39.info(`Neura core server at http://localhost:${port}`);
99506
100079
  });
99507
100080
  httpServer.once("error", (err) => {
99508
100081
  if (err.code === "EADDRINUSE" && maxRetries > 0) {
99509
- log38.warn(`port ${port} in use, trying ${port + 1}`);
100082
+ log39.warn(`port ${port} in use, trying ${port + 1}`);
99510
100083
  startServer(port + 1, maxRetries - 1);
99511
100084
  } else {
99512
- log38.error("server failed to start", { err: err.message });
100085
+ log39.error("server failed to start", { err: err.message });
99513
100086
  process.exit(1);
99514
100087
  }
99515
100088
  });
@@ -99520,11 +100093,11 @@ var doShutdown = () => void shutdown(services, httpServer, wss);
99520
100093
  process.on("SIGTERM", doShutdown);
99521
100094
  process.on("SIGINT", doShutdown);
99522
100095
  process.on("uncaughtException", (err) => {
99523
- log38.error("uncaught exception, shutting down", { err: err.message });
100096
+ log39.error("uncaught exception, shutting down", { err: err.message });
99524
100097
  doShutdown();
99525
100098
  });
99526
100099
  process.on("unhandledRejection", (reason) => {
99527
- log38.error("unhandled rejection, shutting down", { err: String(reason) });
100100
+ log39.error("unhandled rejection, shutting down", { err: String(reason) });
99528
100101
  doShutdown();
99529
100102
  });
99530
100103
  /*! Bundled license information: