@mclean-capital/neura 3.5.4 → 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 {
@@ -8177,6 +8378,270 @@ var init_work_item_queries = __esm({
8177
8378
  }
8178
8379
  });
8179
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
+
8180
8645
  // ../../node_modules/depd/index.js
8181
8646
  var require_depd = __commonJS({
8182
8647
  "../../node_modules/depd/index.js"(exports, module) {
@@ -8235,7 +8700,7 @@ var require_depd = __commonJS({
8235
8700
  var site = callSiteLocation(stack[1]);
8236
8701
  var file2 = site[0];
8237
8702
  function deprecate3(message) {
8238
- log39.call(deprecate3, message);
8703
+ log40.call(deprecate3, message);
8239
8704
  }
8240
8705
  deprecate3._file = file2;
8241
8706
  deprecate3._ignored = isignored(namespace);
@@ -8264,7 +8729,7 @@ var require_depd = __commonJS({
8264
8729
  var str2 = process.env.TRACE_DEPRECATION || "";
8265
8730
  return containsNamespace(str2, namespace);
8266
8731
  }
8267
- function log39(message, site) {
8732
+ function log40(message, site) {
8268
8733
  var haslisteners = eehaslisteners(process, "deprecation");
8269
8734
  if (!haslisteners && this._ignored) {
8270
8735
  return;
@@ -8404,7 +8869,7 @@ var require_depd = __commonJS({
8404
8869
  "message",
8405
8870
  "site",
8406
8871
  '"use strict"\nreturn function (' + args + ") {log.call(deprecate, message, site)\nreturn fn.apply(this, arguments)\n}"
8407
- )(fn, log39, this, message, site);
8872
+ )(fn, log40, this, message, site);
8408
8873
  return deprecatedfn;
8409
8874
  }
8410
8875
  function wrapproperty(obj, prop, message) {
@@ -8429,13 +8894,13 @@ var require_depd = __commonJS({
8429
8894
  var set2 = descriptor.set;
8430
8895
  if (typeof get === "function") {
8431
8896
  descriptor.get = function getter() {
8432
- log39.call(deprecate3, message, site);
8897
+ log40.call(deprecate3, message, site);
8433
8898
  return get.apply(this, arguments);
8434
8899
  };
8435
8900
  }
8436
8901
  if (typeof set2 === "function") {
8437
8902
  descriptor.set = function setter() {
8438
- log39.call(deprecate3, message, site);
8903
+ log40.call(deprecate3, message, site);
8439
8904
  return set2.apply(this, arguments);
8440
8905
  };
8441
8906
  }
@@ -9272,7 +9737,7 @@ var require_debug = __commonJS({
9272
9737
  var require_browser = __commonJS({
9273
9738
  "../../node_modules/body-parser/node_modules/debug/src/browser.js"(exports, module) {
9274
9739
  exports = module.exports = require_debug();
9275
- exports.log = log39;
9740
+ exports.log = log40;
9276
9741
  exports.formatArgs = formatArgs;
9277
9742
  exports.save = save;
9278
9743
  exports.load = load;
@@ -9320,7 +9785,7 @@ var require_browser = __commonJS({
9320
9785
  });
9321
9786
  args.splice(lastC, 0, c);
9322
9787
  }
9323
- function log39() {
9788
+ function log40() {
9324
9789
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
9325
9790
  }
9326
9791
  function save(namespaces) {
@@ -9361,7 +9826,7 @@ var require_node = __commonJS({
9361
9826
  var util = __require("util");
9362
9827
  exports = module.exports = require_debug();
9363
9828
  exports.init = init;
9364
- exports.log = log39;
9829
+ exports.log = log40;
9365
9830
  exports.formatArgs = formatArgs;
9366
9831
  exports.save = save;
9367
9832
  exports.load = load;
@@ -9412,7 +9877,7 @@ var require_node = __commonJS({
9412
9877
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
9413
9878
  }
9414
9879
  }
9415
- function log39() {
9880
+ function log40() {
9416
9881
  return stream.write(util.format.apply(util, arguments) + "\n");
9417
9882
  }
9418
9883
  function save(namespaces) {
@@ -13090,10 +13555,10 @@ var require_raw_body = __commonJS({
13090
13555
  if (done) {
13091
13556
  return readStream(stream, encoding, length, limit2, wrap(done));
13092
13557
  }
13093
- return new Promise(function executor(resolve4, reject) {
13558
+ return new Promise(function executor(resolve5, reject) {
13094
13559
  readStream(stream, encoding, length, limit2, function onRead(err, buf) {
13095
13560
  if (err) return reject(err);
13096
- resolve4(buf);
13561
+ resolve5(buf);
13097
13562
  });
13098
13563
  });
13099
13564
  }
@@ -25619,7 +26084,7 @@ var require_debug2 = __commonJS({
25619
26084
  var require_browser2 = __commonJS({
25620
26085
  "../../node_modules/finalhandler/node_modules/debug/src/browser.js"(exports, module) {
25621
26086
  exports = module.exports = require_debug2();
25622
- exports.log = log39;
26087
+ exports.log = log40;
25623
26088
  exports.formatArgs = formatArgs;
25624
26089
  exports.save = save;
25625
26090
  exports.load = load;
@@ -25667,7 +26132,7 @@ var require_browser2 = __commonJS({
25667
26132
  });
25668
26133
  args.splice(lastC, 0, c);
25669
26134
  }
25670
- function log39() {
26135
+ function log40() {
25671
26136
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
25672
26137
  }
25673
26138
  function save(namespaces) {
@@ -25708,7 +26173,7 @@ var require_node2 = __commonJS({
25708
26173
  var util = __require("util");
25709
26174
  exports = module.exports = require_debug2();
25710
26175
  exports.init = init;
25711
- exports.log = log39;
26176
+ exports.log = log40;
25712
26177
  exports.formatArgs = formatArgs;
25713
26178
  exports.save = save;
25714
26179
  exports.load = load;
@@ -25759,7 +26224,7 @@ var require_node2 = __commonJS({
25759
26224
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
25760
26225
  }
25761
26226
  }
25762
- function log39() {
26227
+ function log40() {
25763
26228
  return stream.write(util.format.apply(util, arguments) + "\n");
25764
26229
  }
25765
26230
  function save(namespaces) {
@@ -26338,7 +26803,7 @@ var require_debug3 = __commonJS({
26338
26803
  var require_browser3 = __commonJS({
26339
26804
  "../../node_modules/express/node_modules/debug/src/browser.js"(exports, module) {
26340
26805
  exports = module.exports = require_debug3();
26341
- exports.log = log39;
26806
+ exports.log = log40;
26342
26807
  exports.formatArgs = formatArgs;
26343
26808
  exports.save = save;
26344
26809
  exports.load = load;
@@ -26386,7 +26851,7 @@ var require_browser3 = __commonJS({
26386
26851
  });
26387
26852
  args.splice(lastC, 0, c);
26388
26853
  }
26389
- function log39() {
26854
+ function log40() {
26390
26855
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
26391
26856
  }
26392
26857
  function save(namespaces) {
@@ -26427,7 +26892,7 @@ var require_node3 = __commonJS({
26427
26892
  var util = __require("util");
26428
26893
  exports = module.exports = require_debug3();
26429
26894
  exports.init = init;
26430
- exports.log = log39;
26895
+ exports.log = log40;
26431
26896
  exports.formatArgs = formatArgs;
26432
26897
  exports.save = save;
26433
26898
  exports.load = load;
@@ -26478,7 +26943,7 @@ var require_node3 = __commonJS({
26478
26943
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
26479
26944
  }
26480
26945
  }
26481
- function log39() {
26946
+ function log40() {
26482
26947
  return stream.write(util.format.apply(util, arguments) + "\n");
26483
26948
  }
26484
26949
  function save(namespaces) {
@@ -27400,10 +27865,10 @@ var require_view = __commonJS({
27400
27865
  var path3 = __require("path");
27401
27866
  var fs3 = __require("fs");
27402
27867
  var dirname4 = path3.dirname;
27403
- var basename3 = path3.basename;
27868
+ var basename4 = path3.basename;
27404
27869
  var extname = path3.extname;
27405
27870
  var join8 = path3.join;
27406
- var resolve4 = path3.resolve;
27871
+ var resolve5 = path3.resolve;
27407
27872
  module.exports = View;
27408
27873
  function View(name, options) {
27409
27874
  var opts = options || {};
@@ -27437,9 +27902,9 @@ var require_view = __commonJS({
27437
27902
  debug('lookup "%s"', name);
27438
27903
  for (var i2 = 0; i2 < roots.length && !path4; i2++) {
27439
27904
  var root = roots[i2];
27440
- var loc = resolve4(root, name);
27905
+ var loc = resolve5(root, name);
27441
27906
  var dir = dirname4(loc);
27442
- var file2 = basename3(loc);
27907
+ var file2 = basename4(loc);
27443
27908
  path4 = this.resolve(dir, file2);
27444
27909
  }
27445
27910
  return path4;
@@ -27448,14 +27913,14 @@ var require_view = __commonJS({
27448
27913
  debug('render "%s"', this.path);
27449
27914
  this.engine(this.path, options, callback);
27450
27915
  };
27451
- View.prototype.resolve = function resolve5(dir, file2) {
27916
+ View.prototype.resolve = function resolve6(dir, file2) {
27452
27917
  var ext = this.ext;
27453
27918
  var path4 = join8(dir, file2);
27454
27919
  var stat3 = tryStat(path4);
27455
27920
  if (stat3 && stat3.isFile()) {
27456
27921
  return path4;
27457
27922
  }
27458
- path4 = join8(dir, basename3(file2, ext), "index" + ext);
27923
+ path4 = join8(dir, basename4(file2, ext), "index" + ext);
27459
27924
  stat3 = tryStat(path4);
27460
27925
  if (stat3 && stat3.isFile()) {
27461
27926
  return path4;
@@ -27536,7 +28001,7 @@ var require_content_disposition = __commonJS({
27536
28001
  "use strict";
27537
28002
  module.exports = contentDisposition;
27538
28003
  module.exports.parse = parse3;
27539
- var basename3 = __require("path").basename;
28004
+ var basename4 = __require("path").basename;
27540
28005
  var Buffer4 = require_safe_buffer().Buffer;
27541
28006
  var ENCODE_URL_ATTR_CHAR_REGEXP = /[\x00-\x20"'()*,/:;<=>?@[\\\]{}\x7f]/g;
27542
28007
  var HEX_ESCAPE_REGEXP = /%[0-9A-Fa-f]{2}/;
@@ -27572,9 +28037,9 @@ var require_content_disposition = __commonJS({
27572
28037
  if (typeof fallback === "string" && NON_LATIN1_REGEXP.test(fallback)) {
27573
28038
  throw new TypeError("fallback must be ISO-8859-1 string");
27574
28039
  }
27575
- var name = basename3(filename);
28040
+ var name = basename4(filename);
27576
28041
  var isQuotedString = TEXT_REGEXP.test(name);
27577
- var fallbackName = typeof fallback !== "string" ? fallback && getlatin1(name) : basename3(fallback);
28042
+ var fallbackName = typeof fallback !== "string" ? fallback && getlatin1(name) : basename4(fallback);
27578
28043
  var hasFallback = typeof fallbackName === "string" && fallbackName !== name;
27579
28044
  if (hasFallback || !isQuotedString || HEX_ESCAPE_REGEXP.test(name)) {
27580
28045
  params["filename*"] = name;
@@ -27904,7 +28369,7 @@ var require_debug4 = __commonJS({
27904
28369
  var require_browser4 = __commonJS({
27905
28370
  "../../node_modules/send/node_modules/debug/src/browser.js"(exports, module) {
27906
28371
  exports = module.exports = require_debug4();
27907
- exports.log = log39;
28372
+ exports.log = log40;
27908
28373
  exports.formatArgs = formatArgs;
27909
28374
  exports.save = save;
27910
28375
  exports.load = load;
@@ -27952,7 +28417,7 @@ var require_browser4 = __commonJS({
27952
28417
  });
27953
28418
  args.splice(lastC, 0, c);
27954
28419
  }
27955
- function log39() {
28420
+ function log40() {
27956
28421
  return "object" === typeof console && console.log && Function.prototype.apply.call(console.log, console, arguments);
27957
28422
  }
27958
28423
  function save(namespaces) {
@@ -27993,7 +28458,7 @@ var require_node4 = __commonJS({
27993
28458
  var util = __require("util");
27994
28459
  exports = module.exports = require_debug4();
27995
28460
  exports.init = init;
27996
- exports.log = log39;
28461
+ exports.log = log40;
27997
28462
  exports.formatArgs = formatArgs;
27998
28463
  exports.save = save;
27999
28464
  exports.load = load;
@@ -28044,7 +28509,7 @@ var require_node4 = __commonJS({
28044
28509
  args[0] = (/* @__PURE__ */ new Date()).toUTCString() + " " + name + " " + args[0];
28045
28510
  }
28046
28511
  }
28047
- function log39() {
28512
+ function log40() {
28048
28513
  return stream.write(util.format.apply(util, arguments) + "\n");
28049
28514
  }
28050
28515
  function save(namespaces) {
@@ -28514,8 +28979,8 @@ var require_send = __commonJS({
28514
28979
  var extname = path3.extname;
28515
28980
  var join8 = path3.join;
28516
28981
  var normalize = path3.normalize;
28517
- var resolve4 = path3.resolve;
28518
- var sep = path3.sep;
28982
+ var resolve5 = path3.resolve;
28983
+ var sep2 = path3.sep;
28519
28984
  var BYTES_RANGE_REGEXP = /^ *bytes=/;
28520
28985
  var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1e3;
28521
28986
  var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/;
@@ -28551,7 +29016,7 @@ var require_send = __commonJS({
28551
29016
  this._maxage = opts.maxAge || opts.maxage;
28552
29017
  this._maxage = typeof this._maxage === "string" ? ms(this._maxage) : Number(this._maxage);
28553
29018
  this._maxage = !isNaN(this._maxage) ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE) : 0;
28554
- this._root = opts.root ? resolve4(opts.root) : null;
29019
+ this._root = opts.root ? resolve5(opts.root) : null;
28555
29020
  if (!this._root && opts.from) {
28556
29021
  this.from(opts.from);
28557
29022
  }
@@ -28575,7 +29040,7 @@ var require_send = __commonJS({
28575
29040
  return this;
28576
29041
  }, "send.index: pass index as option");
28577
29042
  SendStream.prototype.root = function root(path4) {
28578
- this._root = resolve4(String(path4));
29043
+ this._root = resolve5(String(path4));
28579
29044
  debug("root %s", this._root);
28580
29045
  return this;
28581
29046
  };
@@ -28723,14 +29188,14 @@ var require_send = __commonJS({
28723
29188
  var parts;
28724
29189
  if (root !== null) {
28725
29190
  if (path4) {
28726
- path4 = normalize("." + sep + path4);
29191
+ path4 = normalize("." + sep2 + path4);
28727
29192
  }
28728
29193
  if (UP_PATH_REGEXP.test(path4)) {
28729
29194
  debug('malicious path "%s"', path4);
28730
29195
  this.error(403);
28731
29196
  return res;
28732
29197
  }
28733
- parts = path4.split(sep);
29198
+ parts = path4.split(sep2);
28734
29199
  path4 = normalize(join8(root, path4));
28735
29200
  } else {
28736
29201
  if (UP_PATH_REGEXP.test(path4)) {
@@ -28738,8 +29203,8 @@ var require_send = __commonJS({
28738
29203
  this.error(403);
28739
29204
  return res;
28740
29205
  }
28741
- parts = normalize(path4).split(sep);
28742
- path4 = resolve4(path4);
29206
+ parts = normalize(path4).split(sep2);
29207
+ path4 = resolve5(path4);
28743
29208
  }
28744
29209
  if (containsDotFile(parts)) {
28745
29210
  var access = this._dotfiles;
@@ -28836,7 +29301,7 @@ var require_send = __commonJS({
28836
29301
  var self2 = this;
28837
29302
  debug('stat "%s"', path4);
28838
29303
  fs3.stat(path4, function onstat(err, stat3) {
28839
- 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) {
28840
29305
  return next(err);
28841
29306
  }
28842
29307
  if (err) return self2.onStatError(err);
@@ -30018,7 +30483,7 @@ var require_application = __commonJS({
30018
30483
  var deprecate3 = require_depd()("express");
30019
30484
  var flatten = require_array_flatten();
30020
30485
  var merge2 = require_utils_merge();
30021
- var resolve4 = __require("path").resolve;
30486
+ var resolve5 = __require("path").resolve;
30022
30487
  var setPrototypeOf = require_setprototypeof();
30023
30488
  var hasOwnProperty = Object.prototype.hasOwnProperty;
30024
30489
  var slice = Array.prototype.slice;
@@ -30057,7 +30522,7 @@ var require_application = __commonJS({
30057
30522
  this.mountpath = "/";
30058
30523
  this.locals.settings = this.settings;
30059
30524
  this.set("view", View);
30060
- this.set("views", resolve4("views"));
30525
+ this.set("views", resolve5("views"));
30061
30526
  this.set("jsonp callback name", "callback");
30062
30527
  if (env === "production") {
30063
30528
  this.enable("view cache");
@@ -31289,7 +31754,7 @@ var require_response = __commonJS({
31289
31754
  var encodeUrl = require_encodeurl();
31290
31755
  var escapeHtml = require_escape_html();
31291
31756
  var http3 = __require("http");
31292
- var isAbsolute = require_utils2().isAbsolute;
31757
+ var isAbsolute2 = require_utils2().isAbsolute;
31293
31758
  var onFinished = require_on_finished();
31294
31759
  var path3 = __require("path");
31295
31760
  var statuses = require_statuses();
@@ -31302,7 +31767,7 @@ var require_response = __commonJS({
31302
31767
  var send = require_send();
31303
31768
  var extname = path3.extname;
31304
31769
  var mime = send.mime;
31305
- var resolve4 = path3.resolve;
31770
+ var resolve5 = path3.resolve;
31306
31771
  var vary = require_vary();
31307
31772
  var res = Object.create(http3.ServerResponse.prototype);
31308
31773
  module.exports = res;
@@ -31495,7 +31960,7 @@ var require_response = __commonJS({
31495
31960
  done = options;
31496
31961
  opts = {};
31497
31962
  }
31498
- if (!opts.root && !isAbsolute(path4)) {
31963
+ if (!opts.root && !isAbsolute2(path4)) {
31499
31964
  throw new TypeError("path must be absolute or specify root to res.sendFile");
31500
31965
  }
31501
31966
  var pathname = encodeURI(path4);
@@ -31561,7 +32026,7 @@ var require_response = __commonJS({
31561
32026
  }
31562
32027
  opts = Object.create(opts);
31563
32028
  opts.headers = headers;
31564
- var fullPath = !opts.root ? resolve4(path4) : path4;
32029
+ var fullPath = !opts.root ? resolve5(path4) : path4;
31565
32030
  return this.sendFile(fullPath, opts, done);
31566
32031
  };
31567
32032
  res.contentType = res.type = function contentType(type) {
@@ -31827,7 +32292,7 @@ var require_serve_static = __commonJS({
31827
32292
  var encodeUrl = require_encodeurl();
31828
32293
  var escapeHtml = require_escape_html();
31829
32294
  var parseUrl = require_parseurl();
31830
- var resolve4 = __require("path").resolve;
32295
+ var resolve5 = __require("path").resolve;
31831
32296
  var send = require_send();
31832
32297
  var url2 = __require("url");
31833
32298
  module.exports = serveStatic;
@@ -31847,7 +32312,7 @@ var require_serve_static = __commonJS({
31847
32312
  throw new TypeError("option setHeaders must be function");
31848
32313
  }
31849
32314
  opts.maxage = opts.maxage || opts.maxAge || 0;
31850
- opts.root = resolve4(root);
32315
+ opts.root = resolve5(root);
31851
32316
  var onDirectory = redirect ? createRedirectDirectoryListener() : createNotFoundDirectoryListener();
31852
32317
  return function serveStatic2(req, res, next) {
31853
32318
  if (req.method !== "GET" && req.method !== "HEAD") {
@@ -32266,7 +32731,7 @@ var require_p_retry = __commonJS({
32266
32731
  return error48;
32267
32732
  };
32268
32733
  var isNetworkError = (errorMessage) => networkErrorMsgs.includes(errorMessage);
32269
- var pRetry2 = (input, options) => new Promise((resolve4, reject) => {
32734
+ var pRetry2 = (input, options) => new Promise((resolve5, reject) => {
32270
32735
  options = {
32271
32736
  onFailedAttempt: () => {
32272
32737
  },
@@ -32276,7 +32741,7 @@ var require_p_retry = __commonJS({
32276
32741
  const operation = retry.operation(options);
32277
32742
  operation.attempt(async (attemptNumber) => {
32278
32743
  try {
32279
- resolve4(await input(attemptNumber));
32744
+ resolve5(await input(attemptNumber));
32280
32745
  } catch (error48) {
32281
32746
  if (!(error48 instanceof Error)) {
32282
32747
  reject(new TypeError(`Non-error was thrown: "${error48}". You should only throw errors.`));
@@ -32812,8 +33277,8 @@ var require_retry3 = __commonJS({
32812
33277
  }
32813
33278
  const delay = getNextRetryDelay(config2);
32814
33279
  err.config.retryConfig.currentRetryAttempt += 1;
32815
- const backoff = config2.retryBackoff ? config2.retryBackoff(err, delay) : new Promise((resolve4) => {
32816
- setTimeout(resolve4, delay);
33280
+ const backoff = config2.retryBackoff ? config2.retryBackoff(err, delay) : new Promise((resolve5) => {
33281
+ setTimeout(resolve5, delay);
32817
33282
  });
32818
33283
  if (config2.onRetryAttempt) {
32819
33284
  await config2.onRetryAttempt(err);
@@ -33349,7 +33814,7 @@ var require_node5 = __commonJS({
33349
33814
  var tty = __require("tty");
33350
33815
  var util = __require("util");
33351
33816
  exports.init = init;
33352
- exports.log = log39;
33817
+ exports.log = log40;
33353
33818
  exports.formatArgs = formatArgs;
33354
33819
  exports.save = save;
33355
33820
  exports.load = load;
@@ -33484,7 +33949,7 @@ var require_node5 = __commonJS({
33484
33949
  }
33485
33950
  return (/* @__PURE__ */ new Date()).toISOString() + " ";
33486
33951
  }
33487
- function log39(...args) {
33952
+ function log40(...args) {
33488
33953
  return process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + "\n");
33489
33954
  }
33490
33955
  function save(namespaces) {
@@ -33588,8 +34053,8 @@ var require_helpers = __commonJS({
33588
34053
  function req(url2, opts = {}) {
33589
34054
  const href = typeof url2 === "string" ? url2 : url2.href;
33590
34055
  const req2 = (href.startsWith("https:") ? https2 : http3).request(url2, opts);
33591
- const promise2 = new Promise((resolve4, reject) => {
33592
- req2.once("response", resolve4).once("error", reject).end();
34056
+ const promise2 = new Promise((resolve5, reject) => {
34057
+ req2.once("response", resolve5).once("error", reject).end();
33593
34058
  });
33594
34059
  req2.then = promise2.then.bind(promise2);
33595
34060
  return req2;
@@ -33766,7 +34231,7 @@ var require_parse_proxy_response = __commonJS({
33766
34231
  var debug_1 = __importDefault(require_src5());
33767
34232
  var debug = (0, debug_1.default)("https-proxy-agent:parse-proxy-response");
33768
34233
  function parseProxyResponse(socket) {
33769
- return new Promise((resolve4, reject) => {
34234
+ return new Promise((resolve5, reject) => {
33770
34235
  let buffersLength = 0;
33771
34236
  const buffers = [];
33772
34237
  function read() {
@@ -33832,7 +34297,7 @@ var require_parse_proxy_response = __commonJS({
33832
34297
  }
33833
34298
  debug("got proxy server response: %o %o", firstLine, headers);
33834
34299
  cleanup();
33835
- resolve4({
34300
+ resolve5({
33836
34301
  connect: {
33837
34302
  statusCode,
33838
34303
  statusText,
@@ -34074,7 +34539,7 @@ var require_ponyfill_es2018 = __commonJS({
34074
34539
  return new originalPromise(executor);
34075
34540
  }
34076
34541
  function promiseResolvedWith(value) {
34077
- return newPromise((resolve4) => resolve4(value));
34542
+ return newPromise((resolve5) => resolve5(value));
34078
34543
  }
34079
34544
  function promiseRejectedWith(reason) {
34080
34545
  return originalPromiseReject(reason);
@@ -34244,8 +34709,8 @@ var require_ponyfill_es2018 = __commonJS({
34244
34709
  return new TypeError("Cannot " + name + " a stream using a released reader");
34245
34710
  }
34246
34711
  function defaultReaderClosedPromiseInitialize(reader) {
34247
- reader._closedPromise = newPromise((resolve4, reject) => {
34248
- reader._closedPromise_resolve = resolve4;
34712
+ reader._closedPromise = newPromise((resolve5, reject) => {
34713
+ reader._closedPromise_resolve = resolve5;
34249
34714
  reader._closedPromise_reject = reject;
34250
34715
  });
34251
34716
  }
@@ -34419,8 +34884,8 @@ var require_ponyfill_es2018 = __commonJS({
34419
34884
  }
34420
34885
  let resolvePromise;
34421
34886
  let rejectPromise;
34422
- const promise2 = newPromise((resolve4, reject) => {
34423
- resolvePromise = resolve4;
34887
+ const promise2 = newPromise((resolve5, reject) => {
34888
+ resolvePromise = resolve5;
34424
34889
  rejectPromise = reject;
34425
34890
  });
34426
34891
  const readRequest = {
@@ -34525,8 +34990,8 @@ var require_ponyfill_es2018 = __commonJS({
34525
34990
  const reader = this._reader;
34526
34991
  let resolvePromise;
34527
34992
  let rejectPromise;
34528
- const promise2 = newPromise((resolve4, reject) => {
34529
- resolvePromise = resolve4;
34993
+ const promise2 = newPromise((resolve5, reject) => {
34994
+ resolvePromise = resolve5;
34530
34995
  rejectPromise = reject;
34531
34996
  });
34532
34997
  const readRequest = {
@@ -35545,8 +36010,8 @@ var require_ponyfill_es2018 = __commonJS({
35545
36010
  }
35546
36011
  let resolvePromise;
35547
36012
  let rejectPromise;
35548
- const promise2 = newPromise((resolve4, reject) => {
35549
- resolvePromise = resolve4;
36013
+ const promise2 = newPromise((resolve5, reject) => {
36014
+ resolvePromise = resolve5;
35550
36015
  rejectPromise = reject;
35551
36016
  });
35552
36017
  const readIntoRequest = {
@@ -35858,10 +36323,10 @@ var require_ponyfill_es2018 = __commonJS({
35858
36323
  wasAlreadyErroring = true;
35859
36324
  reason = void 0;
35860
36325
  }
35861
- const promise2 = newPromise((resolve4, reject) => {
36326
+ const promise2 = newPromise((resolve5, reject) => {
35862
36327
  stream._pendingAbortRequest = {
35863
36328
  _promise: void 0,
35864
- _resolve: resolve4,
36329
+ _resolve: resolve5,
35865
36330
  _reject: reject,
35866
36331
  _reason: reason,
35867
36332
  _wasAlreadyErroring: wasAlreadyErroring
@@ -35878,9 +36343,9 @@ var require_ponyfill_es2018 = __commonJS({
35878
36343
  if (state === "closed" || state === "errored") {
35879
36344
  return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`));
35880
36345
  }
35881
- const promise2 = newPromise((resolve4, reject) => {
36346
+ const promise2 = newPromise((resolve5, reject) => {
35882
36347
  const closeRequest = {
35883
- _resolve: resolve4,
36348
+ _resolve: resolve5,
35884
36349
  _reject: reject
35885
36350
  };
35886
36351
  stream._closeRequest = closeRequest;
@@ -35893,9 +36358,9 @@ var require_ponyfill_es2018 = __commonJS({
35893
36358
  return promise2;
35894
36359
  }
35895
36360
  function WritableStreamAddWriteRequest(stream) {
35896
- const promise2 = newPromise((resolve4, reject) => {
36361
+ const promise2 = newPromise((resolve5, reject) => {
35897
36362
  const writeRequest = {
35898
- _resolve: resolve4,
36363
+ _resolve: resolve5,
35899
36364
  _reject: reject
35900
36365
  };
35901
36366
  stream._writeRequests.push(writeRequest);
@@ -36511,8 +36976,8 @@ var require_ponyfill_es2018 = __commonJS({
36511
36976
  return new TypeError("Cannot " + name + " a stream using a released writer");
36512
36977
  }
36513
36978
  function defaultWriterClosedPromiseInitialize(writer) {
36514
- writer._closedPromise = newPromise((resolve4, reject) => {
36515
- writer._closedPromise_resolve = resolve4;
36979
+ writer._closedPromise = newPromise((resolve5, reject) => {
36980
+ writer._closedPromise_resolve = resolve5;
36516
36981
  writer._closedPromise_reject = reject;
36517
36982
  writer._closedPromiseState = "pending";
36518
36983
  });
@@ -36548,8 +37013,8 @@ var require_ponyfill_es2018 = __commonJS({
36548
37013
  writer._closedPromiseState = "resolved";
36549
37014
  }
36550
37015
  function defaultWriterReadyPromiseInitialize(writer) {
36551
- writer._readyPromise = newPromise((resolve4, reject) => {
36552
- writer._readyPromise_resolve = resolve4;
37016
+ writer._readyPromise = newPromise((resolve5, reject) => {
37017
+ writer._readyPromise_resolve = resolve5;
36553
37018
  writer._readyPromise_reject = reject;
36554
37019
  });
36555
37020
  writer._readyPromiseState = "pending";
@@ -36636,7 +37101,7 @@ var require_ponyfill_es2018 = __commonJS({
36636
37101
  source._disturbed = true;
36637
37102
  let shuttingDown = false;
36638
37103
  let currentWrite = promiseResolvedWith(void 0);
36639
- return newPromise((resolve4, reject) => {
37104
+ return newPromise((resolve5, reject) => {
36640
37105
  let abortAlgorithm;
36641
37106
  if (signal !== void 0) {
36642
37107
  abortAlgorithm = () => {
@@ -36781,7 +37246,7 @@ var require_ponyfill_es2018 = __commonJS({
36781
37246
  if (isError) {
36782
37247
  reject(error48);
36783
37248
  } else {
36784
- resolve4(void 0);
37249
+ resolve5(void 0);
36785
37250
  }
36786
37251
  return null;
36787
37252
  }
@@ -37062,8 +37527,8 @@ var require_ponyfill_es2018 = __commonJS({
37062
37527
  let branch1;
37063
37528
  let branch2;
37064
37529
  let resolveCancelPromise;
37065
- const cancelPromise = newPromise((resolve4) => {
37066
- resolveCancelPromise = resolve4;
37530
+ const cancelPromise = newPromise((resolve5) => {
37531
+ resolveCancelPromise = resolve5;
37067
37532
  });
37068
37533
  function pullAlgorithm() {
37069
37534
  if (reading) {
@@ -37154,8 +37619,8 @@ var require_ponyfill_es2018 = __commonJS({
37154
37619
  let branch1;
37155
37620
  let branch2;
37156
37621
  let resolveCancelPromise;
37157
- const cancelPromise = newPromise((resolve4) => {
37158
- resolveCancelPromise = resolve4;
37622
+ const cancelPromise = newPromise((resolve5) => {
37623
+ resolveCancelPromise = resolve5;
37159
37624
  });
37160
37625
  function forwardReaderError(thisReader) {
37161
37626
  uponRejection(thisReader._closedPromise, (r2) => {
@@ -37935,8 +38400,8 @@ var require_ponyfill_es2018 = __commonJS({
37935
38400
  const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1);
37936
38401
  const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy);
37937
38402
  let startPromise_resolve;
37938
- const startPromise = newPromise((resolve4) => {
37939
- startPromise_resolve = resolve4;
38403
+ const startPromise = newPromise((resolve5) => {
38404
+ startPromise_resolve = resolve5;
37940
38405
  });
37941
38406
  InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm);
37942
38407
  SetUpTransformStreamDefaultControllerFromTransformer(this, transformer);
@@ -38029,8 +38494,8 @@ var require_ponyfill_es2018 = __commonJS({
38029
38494
  if (stream._backpressureChangePromise !== void 0) {
38030
38495
  stream._backpressureChangePromise_resolve();
38031
38496
  }
38032
- stream._backpressureChangePromise = newPromise((resolve4) => {
38033
- stream._backpressureChangePromise_resolve = resolve4;
38497
+ stream._backpressureChangePromise = newPromise((resolve5) => {
38498
+ stream._backpressureChangePromise_resolve = resolve5;
38034
38499
  });
38035
38500
  stream._backpressure = backpressure;
38036
38501
  }
@@ -38198,8 +38663,8 @@ var require_ponyfill_es2018 = __commonJS({
38198
38663
  return controller._finishPromise;
38199
38664
  }
38200
38665
  const readable = stream._readable;
38201
- controller._finishPromise = newPromise((resolve4, reject) => {
38202
- controller._finishPromise_resolve = resolve4;
38666
+ controller._finishPromise = newPromise((resolve5, reject) => {
38667
+ controller._finishPromise_resolve = resolve5;
38203
38668
  controller._finishPromise_reject = reject;
38204
38669
  });
38205
38670
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -38225,8 +38690,8 @@ var require_ponyfill_es2018 = __commonJS({
38225
38690
  return controller._finishPromise;
38226
38691
  }
38227
38692
  const readable = stream._readable;
38228
- controller._finishPromise = newPromise((resolve4, reject) => {
38229
- controller._finishPromise_resolve = resolve4;
38693
+ controller._finishPromise = newPromise((resolve5, reject) => {
38694
+ controller._finishPromise_resolve = resolve5;
38230
38695
  controller._finishPromise_reject = reject;
38231
38696
  });
38232
38697
  const flushPromise = controller._flushAlgorithm();
@@ -38256,8 +38721,8 @@ var require_ponyfill_es2018 = __commonJS({
38256
38721
  return controller._finishPromise;
38257
38722
  }
38258
38723
  const writable = stream._writable;
38259
- controller._finishPromise = newPromise((resolve4, reject) => {
38260
- controller._finishPromise_resolve = resolve4;
38724
+ controller._finishPromise = newPromise((resolve5, reject) => {
38725
+ controller._finishPromise_resolve = resolve5;
38261
38726
  controller._finishPromise_reject = reject;
38262
38727
  });
38263
38728
  const cancelPromise = controller._cancelAlgorithm(reason);
@@ -38795,8 +39260,8 @@ var require_node_domexception = __commonJS({
38795
39260
  });
38796
39261
 
38797
39262
  // ../../node_modules/fetch-blob/from.js
38798
- import { statSync as statSync3, createReadStream, promises as fs } from "node:fs";
38799
- 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";
38800
39265
  var import_node_domexception, stat, blobFromSync, blobFrom, fileFrom, fileFromSync, fromBlob, fromFile, BlobDataItem;
38801
39266
  var init_from = __esm({
38802
39267
  "../../node_modules/fetch-blob/from.js"() {
@@ -38804,10 +39269,10 @@ var init_from = __esm({
38804
39269
  init_file();
38805
39270
  init_fetch_blob();
38806
39271
  ({ stat } = fs);
38807
- blobFromSync = (path3, type) => fromBlob(statSync3(path3), path3, type);
39272
+ blobFromSync = (path3, type) => fromBlob(statSync4(path3), path3, type);
38808
39273
  blobFrom = (path3, type) => stat(path3).then((stat3) => fromBlob(stat3, path3, type));
38809
39274
  fileFrom = (path3, type) => stat(path3).then((stat3) => fromFile(stat3, path3, type));
38810
- fileFromSync = (path3, type) => fromFile(statSync3(path3), path3, type);
39275
+ fileFromSync = (path3, type) => fromFile(statSync4(path3), path3, type);
38811
39276
  fromBlob = (stat3, path3, type = "") => new fetch_blob_default([new BlobDataItem({
38812
39277
  path: path3,
38813
39278
  size: stat3.size,
@@ -38819,7 +39284,7 @@ var init_from = __esm({
38819
39284
  size: stat3.size,
38820
39285
  lastModified: stat3.mtimeMs,
38821
39286
  start: 0
38822
- })], basename(path3), { type, lastModified: stat3.mtimeMs });
39287
+ })], basename2(path3), { type, lastModified: stat3.mtimeMs });
38823
39288
  BlobDataItem = class _BlobDataItem {
38824
39289
  #path;
38825
39290
  #start;
@@ -40208,7 +40673,7 @@ import zlib from "node:zlib";
40208
40673
  import Stream3, { PassThrough as PassThrough2, pipeline as pump } from "node:stream";
40209
40674
  import { Buffer as Buffer3 } from "node:buffer";
40210
40675
  async function fetch2(url2, options_) {
40211
- return new Promise((resolve4, reject) => {
40676
+ return new Promise((resolve5, reject) => {
40212
40677
  const request = new Request(url2, options_);
40213
40678
  const { parsedURL, options } = getNodeRequestOptions(request);
40214
40679
  if (!supportedSchemas.has(parsedURL.protocol)) {
@@ -40217,7 +40682,7 @@ async function fetch2(url2, options_) {
40217
40682
  if (parsedURL.protocol === "data:") {
40218
40683
  const data = dist_default(request.url);
40219
40684
  const response2 = new Response2(data, { headers: { "Content-Type": data.typeFull } });
40220
- resolve4(response2);
40685
+ resolve5(response2);
40221
40686
  return;
40222
40687
  }
40223
40688
  const send = (parsedURL.protocol === "https:" ? https : http2).request;
@@ -40339,7 +40804,7 @@ async function fetch2(url2, options_) {
40339
40804
  if (responseReferrerPolicy) {
40340
40805
  requestOptions.referrerPolicy = responseReferrerPolicy;
40341
40806
  }
40342
- resolve4(fetch2(new Request(locationURL, requestOptions)));
40807
+ resolve5(fetch2(new Request(locationURL, requestOptions)));
40343
40808
  finalize2();
40344
40809
  return;
40345
40810
  }
@@ -40372,7 +40837,7 @@ async function fetch2(url2, options_) {
40372
40837
  const codings = headers.get("Content-Encoding");
40373
40838
  if (!request.compress || request.method === "HEAD" || codings === null || response_.statusCode === 204 || response_.statusCode === 304) {
40374
40839
  response = new Response2(body, responseOptions);
40375
- resolve4(response);
40840
+ resolve5(response);
40376
40841
  return;
40377
40842
  }
40378
40843
  const zlibOptions = {
@@ -40386,7 +40851,7 @@ async function fetch2(url2, options_) {
40386
40851
  }
40387
40852
  });
40388
40853
  response = new Response2(body, responseOptions);
40389
- resolve4(response);
40854
+ resolve5(response);
40390
40855
  return;
40391
40856
  }
40392
40857
  if (codings === "deflate" || codings === "x-deflate") {
@@ -40410,12 +40875,12 @@ async function fetch2(url2, options_) {
40410
40875
  });
40411
40876
  }
40412
40877
  response = new Response2(body, responseOptions);
40413
- resolve4(response);
40878
+ resolve5(response);
40414
40879
  });
40415
40880
  raw.once("end", () => {
40416
40881
  if (!response) {
40417
40882
  response = new Response2(body, responseOptions);
40418
- resolve4(response);
40883
+ resolve5(response);
40419
40884
  }
40420
40885
  });
40421
40886
  return;
@@ -40427,11 +40892,11 @@ async function fetch2(url2, options_) {
40427
40892
  }
40428
40893
  });
40429
40894
  response = new Response2(body, responseOptions);
40430
- resolve4(response);
40895
+ resolve5(response);
40431
40896
  return;
40432
40897
  }
40433
40898
  response = new Response2(body, responseOptions);
40434
- resolve4(response);
40899
+ resolve5(response);
40435
40900
  });
40436
40901
  writeToStream(request_, request).catch(reject);
40437
40902
  });
@@ -42923,7 +43388,7 @@ var require_logging_utils = __commonJS({
42923
43388
  exports.getDebugBackend = getDebugBackend;
42924
43389
  exports.getStructuredBackend = getStructuredBackend;
42925
43390
  exports.setBackend = setBackend;
42926
- exports.log = log39;
43391
+ exports.log = log40;
42927
43392
  var events_1 = __require("events");
42928
43393
  var process3 = __importStar(__require("process"));
42929
43394
  var util = __importStar(__require("util"));
@@ -42955,7 +43420,7 @@ var require_logging_utils = __commonJS({
42955
43420
  this.func.info = (...args) => this.invokeSeverity(LogSeverity.INFO, ...args);
42956
43421
  this.func.warn = (...args) => this.invokeSeverity(LogSeverity.WARNING, ...args);
42957
43422
  this.func.error = (...args) => this.invokeSeverity(LogSeverity.ERROR, ...args);
42958
- this.func.sublog = (namespace2) => log39(namespace2, this.func);
43423
+ this.func.sublog = (namespace2) => log40(namespace2, this.func);
42959
43424
  }
42960
43425
  invoke(fields, ...args) {
42961
43426
  if (this.upstream) {
@@ -43122,7 +43587,7 @@ var require_logging_utils = __commonJS({
43122
43587
  cachedBackend = backend;
43123
43588
  loggerCache.clear();
43124
43589
  }
43125
- function log39(namespace, parent) {
43590
+ function log40(namespace, parent) {
43126
43591
  if (!cachedBackend) {
43127
43592
  const enablesFlag = process3.env[exports.env.nodeEnables];
43128
43593
  if (!enablesFlag) {
@@ -43255,7 +43720,7 @@ var require_src8 = __commonJS({
43255
43720
  exports.HEADER_NAME = "Metadata-Flavor";
43256
43721
  exports.HEADER_VALUE = "Google";
43257
43722
  exports.HEADERS = Object.freeze({ [exports.HEADER_NAME]: exports.HEADER_VALUE });
43258
- var log39 = logger.log("gcp-metadata");
43723
+ var log40 = logger.log("gcp-metadata");
43259
43724
  exports.METADATA_SERVER_DETECTION = Object.freeze({
43260
43725
  "assume-present": "don't try to ping the metadata server, but assume it's present",
43261
43726
  none: "don't try to ping the metadata server, but don't try to use it either",
@@ -43318,9 +43783,9 @@ var require_src8 = __commonJS({
43318
43783
  responseType: "text",
43319
43784
  timeout: requestTimeout()
43320
43785
  };
43321
- log39.info("instance request %j", req);
43786
+ log40.info("instance request %j", req);
43322
43787
  const res = await requestMethod(req);
43323
- log39.info("instance metadata is %s", res.data);
43788
+ log40.info("instance metadata is %s", res.data);
43324
43789
  const metadataFlavor = res.headers.get(exports.HEADER_NAME);
43325
43790
  if (metadataFlavor !== exports.HEADER_VALUE) {
43326
43791
  throw new RangeError(`Invalid response from metadata service: incorrect ${exports.HEADER_NAME} header. Expected '${exports.HEADER_VALUE}', got ${metadataFlavor ? `'${metadataFlavor}'` : "no header"}`);
@@ -46443,7 +46908,7 @@ var require_jwtaccess = __commonJS({
46443
46908
  }
46444
46909
  }
46445
46910
  fromStreamAsync(inputStream) {
46446
- return new Promise((resolve4, reject) => {
46911
+ return new Promise((resolve5, reject) => {
46447
46912
  if (!inputStream) {
46448
46913
  reject(new Error("Must pass in a stream containing the service account auth settings."));
46449
46914
  }
@@ -46452,7 +46917,7 @@ var require_jwtaccess = __commonJS({
46452
46917
  try {
46453
46918
  const data = JSON.parse(s2);
46454
46919
  this.fromJSON(data);
46455
- resolve4();
46920
+ resolve5();
46456
46921
  } catch (err) {
46457
46922
  reject(err);
46458
46923
  }
@@ -46691,7 +47156,7 @@ var require_jwtclient = __commonJS({
46691
47156
  }
46692
47157
  }
46693
47158
  fromStreamAsync(inputStream) {
46694
- return new Promise((resolve4, reject) => {
47159
+ return new Promise((resolve5, reject) => {
46695
47160
  if (!inputStream) {
46696
47161
  throw new Error("Must pass in a stream containing the service account auth settings.");
46697
47162
  }
@@ -46700,7 +47165,7 @@ var require_jwtclient = __commonJS({
46700
47165
  try {
46701
47166
  const data = JSON.parse(s2);
46702
47167
  this.fromJSON(data);
46703
- resolve4();
47168
+ resolve5();
46704
47169
  } catch (e2) {
46705
47170
  reject(e2);
46706
47171
  }
@@ -46833,7 +47298,7 @@ var require_refreshclient = __commonJS({
46833
47298
  }
46834
47299
  }
46835
47300
  async fromStreamAsync(inputStream) {
46836
- return new Promise((resolve4, reject) => {
47301
+ return new Promise((resolve5, reject) => {
46837
47302
  if (!inputStream) {
46838
47303
  return reject(new Error("Must pass in a stream containing the user refresh token."));
46839
47304
  }
@@ -46842,7 +47307,7 @@ var require_refreshclient = __commonJS({
46842
47307
  try {
46843
47308
  const data = JSON.parse(s2);
46844
47309
  this.fromJSON(data);
46845
- return resolve4();
47310
+ return resolve5();
46846
47311
  } catch (err) {
46847
47312
  return reject(err);
46848
47313
  }
@@ -48675,7 +49140,7 @@ var require_pluggable_auth_handler = __commonJS({
48675
49140
  * @return A promise that resolves with the executable response.
48676
49141
  */
48677
49142
  retrieveResponseFromExecutable(envMap) {
48678
- return new Promise((resolve4, reject) => {
49143
+ return new Promise((resolve5, reject) => {
48679
49144
  const child = childProcess.spawn(this.commandComponents[0], this.commandComponents.slice(1), {
48680
49145
  env: { ...process.env, ...Object.fromEntries(envMap) }
48681
49146
  });
@@ -48697,7 +49162,7 @@ var require_pluggable_auth_handler = __commonJS({
48697
49162
  try {
48698
49163
  const responseJson = JSON.parse(output);
48699
49164
  const response = new executable_response_1.ExecutableResponse(responseJson);
48700
- return resolve4(response);
49165
+ return resolve5(response);
48701
49166
  } catch (error48) {
48702
49167
  if (error48 instanceof executable_response_1.ExecutableResponseError) {
48703
49168
  return reject(error48);
@@ -49600,7 +50065,7 @@ var require_googleauth = __commonJS({
49600
50065
  }
49601
50066
  }
49602
50067
  fromStreamAsync(inputStream, options) {
49603
- return new Promise((resolve4, reject) => {
50068
+ return new Promise((resolve5, reject) => {
49604
50069
  if (!inputStream) {
49605
50070
  throw new Error("Must pass in a stream containing the Google auth settings.");
49606
50071
  }
@@ -49610,7 +50075,7 @@ var require_googleauth = __commonJS({
49610
50075
  try {
49611
50076
  const data = JSON.parse(chunks.join(""));
49612
50077
  const r2 = this._cacheClientFromJSON(data, options);
49613
- return resolve4(r2);
50078
+ return resolve5(r2);
49614
50079
  } catch (err) {
49615
50080
  if (!this.keyFilename)
49616
50081
  throw err;
@@ -49620,7 +50085,7 @@ var require_googleauth = __commonJS({
49620
50085
  });
49621
50086
  this.cachedCredential = client;
49622
50087
  this.setGapicJWTValues(client);
49623
- return resolve4(client);
50088
+ return resolve5(client);
49624
50089
  }
49625
50090
  } catch (err) {
49626
50091
  return reject(err);
@@ -49656,17 +50121,17 @@ var require_googleauth = __commonJS({
49656
50121
  * Run the Google Cloud SDK command that prints the default project ID
49657
50122
  */
49658
50123
  async getDefaultServiceProjectId() {
49659
- return new Promise((resolve4) => {
50124
+ return new Promise((resolve5) => {
49660
50125
  (0, child_process_1.exec)("gcloud config config-helper --format json", (err, stdout) => {
49661
50126
  if (!err && stdout) {
49662
50127
  try {
49663
50128
  const projectId = JSON.parse(stdout).configuration.properties.core.project;
49664
- resolve4(projectId);
50129
+ resolve5(projectId);
49665
50130
  return;
49666
50131
  } catch (e2) {
49667
50132
  }
49668
50133
  }
49669
- resolve4(null);
50134
+ resolve5(null);
49670
50135
  });
49671
50136
  });
49672
50137
  }
@@ -50317,50 +50782,12 @@ var require_src9 = __commonJS({
50317
50782
  });
50318
50783
 
50319
50784
  // src/server/server.ts
50785
+ init_logger();
50320
50786
  import { createServer } from "http";
50321
50787
 
50322
- // ../utils/dist/logger.js
50323
- var import_pino = __toESM(require_pino(), 1);
50324
- var level = process.env.LOG_LEVEL ?? "info";
50325
- function createBaseLogger() {
50326
- if (process.env.NODE_ENV !== "production") {
50327
- try {
50328
- return (0, import_pino.default)({
50329
- level,
50330
- transport: { target: "pino-pretty", options: { colorize: true } }
50331
- });
50332
- } catch {
50333
- }
50334
- }
50335
- return (0, import_pino.default)({ level });
50336
- }
50337
- var baseLogger = createBaseLogger();
50338
- var Logger = class _Logger {
50339
- log;
50340
- constructor(namespace) {
50341
- this.log = baseLogger.child({ ns: namespace });
50342
- }
50343
- debug(msg, data) {
50344
- this.log.debug(data ?? {}, msg);
50345
- }
50346
- info(msg, data) {
50347
- this.log.info(data ?? {}, msg);
50348
- }
50349
- warn(msg, data) {
50350
- this.log.warn(data ?? {}, msg);
50351
- }
50352
- error(msg, data) {
50353
- this.log.error(data ?? {}, msg);
50354
- }
50355
- child(sub) {
50356
- const child = Object.create(_Logger.prototype);
50357
- child.log = this.log.child({ sub });
50358
- return child;
50359
- }
50360
- };
50361
-
50362
50788
  // src/server/lifecycle.ts
50363
- 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";
50364
50791
  import { homedir as homedir5 } from "os";
50365
50792
  import { dirname as dirname2, join as join4 } from "path";
50366
50793
  import { fileURLToPath } from "url";
@@ -64228,6 +64655,7 @@ function isV2Config(raw) {
64228
64655
  }
64229
64656
 
64230
64657
  // src/config/config.ts
64658
+ init_logger();
64231
64659
  var log = new Logger("config");
64232
64660
  function loadConfig() {
64233
64661
  const neuraHome = process.env.NEURA_HOME ?? join(homedir(), ".neura");
@@ -64316,6 +64744,9 @@ function tryParseInt(val) {
64316
64744
  return Number.isNaN(n) ? void 0 : n;
64317
64745
  }
64318
64746
 
64747
+ // src/registry/provider-registry.ts
64748
+ init_logger();
64749
+
64319
64750
  // ../../node_modules/openai/internal/tslib.mjs
64320
64751
  function __classPrivateFieldSet(receiver, state, value, kind, f3) {
64321
64752
  if (kind === "m")
@@ -64530,7 +64961,7 @@ var safeJSON = (text) => {
64530
64961
  };
64531
64962
 
64532
64963
  // ../../node_modules/openai/internal/utils/sleep.mjs
64533
- var sleep = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
64964
+ var sleep = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
64534
64965
 
64535
64966
  // ../../node_modules/openai/version.mjs
64536
64967
  var VERSION = "6.26.0";
@@ -65609,8 +66040,8 @@ function addRequestID(value, response) {
65609
66040
  var _APIPromise_client;
65610
66041
  var APIPromise = class _APIPromise extends Promise {
65611
66042
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse) {
65612
- super((resolve4) => {
65613
- resolve4(null);
66043
+ super((resolve5) => {
66044
+ resolve5(null);
65614
66045
  });
65615
66046
  this.responsePromise = responsePromise;
65616
66047
  this.parseResponse = parseResponse2;
@@ -66173,12 +66604,12 @@ var EventStream = class {
66173
66604
  _EventStream_errored.set(this, false);
66174
66605
  _EventStream_aborted.set(this, false);
66175
66606
  _EventStream_catchingPromiseCreated.set(this, false);
66176
- __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve4, reject) => {
66177
- __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve4, "f");
66607
+ __classPrivateFieldSet(this, _EventStream_connectedPromise, new Promise((resolve5, reject) => {
66608
+ __classPrivateFieldSet(this, _EventStream_resolveConnectedPromise, resolve5, "f");
66178
66609
  __classPrivateFieldSet(this, _EventStream_rejectConnectedPromise, reject, "f");
66179
66610
  }), "f");
66180
- __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve4, reject) => {
66181
- __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve4, "f");
66611
+ __classPrivateFieldSet(this, _EventStream_endPromise, new Promise((resolve5, reject) => {
66612
+ __classPrivateFieldSet(this, _EventStream_resolveEndPromise, resolve5, "f");
66182
66613
  __classPrivateFieldSet(this, _EventStream_rejectEndPromise, reject, "f");
66183
66614
  }), "f");
66184
66615
  __classPrivateFieldGet(this, _EventStream_connectedPromise, "f").catch(() => {
@@ -66262,11 +66693,11 @@ var EventStream = class {
66262
66693
  * const message = await stream.emitted('message') // rejects if the stream errors
66263
66694
  */
66264
66695
  emitted(event) {
66265
- return new Promise((resolve4, reject) => {
66696
+ return new Promise((resolve5, reject) => {
66266
66697
  __classPrivateFieldSet(this, _EventStream_catchingPromiseCreated, true, "f");
66267
66698
  if (event !== "error")
66268
66699
  this.once("error", reject);
66269
- this.once(event, resolve4);
66700
+ this.once(event, resolve5);
66270
66701
  });
66271
66702
  }
66272
66703
  async done() {
@@ -67205,7 +67636,7 @@ var ChatCompletionStream = class _ChatCompletionStream extends AbstractChatCompl
67205
67636
  if (done) {
67206
67637
  return { value: void 0, done: true };
67207
67638
  }
67208
- 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 });
67209
67640
  }
67210
67641
  const chunk = pushQueue.shift();
67211
67642
  return { value: chunk, done: false };
@@ -68037,7 +68468,7 @@ var AssistantStream = class extends EventStream {
68037
68468
  if (done) {
68038
68469
  return { value: void 0, done: true };
68039
68470
  }
68040
- 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 });
68041
68472
  }
68042
68473
  const chunk = pushQueue.shift();
68043
68474
  return { value: chunk, done: false };
@@ -69986,7 +70417,7 @@ var ResponseStream = class _ResponseStream extends EventStream {
69986
70417
  if (done) {
69987
70418
  return { value: void 0, done: true };
69988
70419
  }
69989
- 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 });
69990
70421
  }
69991
70422
  const event = pushQueue.shift();
69992
70423
  return { value: event, done: false };
@@ -71511,6 +71942,7 @@ var import_websocket_server = __toESM(require_websocket_server(), 1);
71511
71942
  var wrapper_default = import_websocket.default;
71512
71943
 
71513
71944
  // src/adapters/deepgram-stt.ts
71945
+ init_logger();
71514
71946
  var log2 = new Logger("deepgram-stt");
71515
71947
  var DEFAULT_MODEL = "nova-3";
71516
71948
  var DEEPGRAM_WS_BASE = "wss://api.deepgram.com/v1/listen";
@@ -71650,14 +72082,15 @@ var DeepgramSTTStream = class {
71650
72082
  if (this.aborted || this.ended && this.pendingResults.length === 0) {
71651
72083
  return;
71652
72084
  }
71653
- await new Promise((resolve4) => {
71654
- this.resolveWait = resolve4;
72085
+ await new Promise((resolve5) => {
72086
+ this.resolveWait = resolve5;
71655
72087
  });
71656
72088
  }
71657
72089
  }
71658
72090
  };
71659
72091
 
71660
72092
  // src/adapters/elevenlabs-tts.ts
72093
+ init_logger();
71661
72094
  var log3 = new Logger("elevenlabs-tts");
71662
72095
  var ELEVENLABS_WS_BASE = "wss://api.elevenlabs.io/v1/text-to-speech";
71663
72096
  var DEFAULT_MODEL2 = "eleven_turbo_v2";
@@ -71764,14 +72197,15 @@ var ElevenLabsTTSStream = class {
71764
72197
  if (this.aborted || this.done && this.pendingChunks.length === 0) {
71765
72198
  return;
71766
72199
  }
71767
- await new Promise((resolve4) => {
71768
- this.resolveWait = resolve4;
72200
+ await new Promise((resolve5) => {
72201
+ this.resolveWait = resolve5;
71769
72202
  });
71770
72203
  }
71771
72204
  }
71772
72205
  };
71773
72206
 
71774
72207
  // src/adapters/openai-tts.ts
72208
+ init_logger();
71775
72209
  var log4 = new Logger("openai-tts");
71776
72210
  var OpenAITTSAdapter = class {
71777
72211
  client;
@@ -71869,8 +72303,8 @@ var OpenAITTSStream = class {
71869
72303
  if (this.aborted || this.done && this.pendingChunks.length === 0) {
71870
72304
  return;
71871
72305
  }
71872
- await new Promise((resolve4) => {
71873
- this.resolveWait = resolve4;
72306
+ await new Promise((resolve5) => {
72307
+ this.resolveWait = resolve5;
71874
72308
  });
71875
72309
  }
71876
72310
  }
@@ -72015,6 +72449,9 @@ var ProviderRegistry = class {
72015
72449
  }
72016
72450
  };
72017
72451
 
72452
+ // src/memory/memory-manager.ts
72453
+ init_logger();
72454
+
72018
72455
  // src/memory/prompt-builder.ts
72019
72456
  var DEFAULT_TIER_CONFIG = {
72020
72457
  l0Budget: 300,
@@ -72121,6 +72558,7 @@ function formatAttribute(attr) {
72121
72558
  }
72122
72559
 
72123
72560
  // src/memory/extraction-pipeline.ts
72561
+ init_logger();
72124
72562
  var log6 = new Logger("extractor");
72125
72563
  var MIN_TRANSCRIPT_ENTRIES = 4;
72126
72564
  var EXTRACTION_PROMPT = `You are a memory extraction agent. Analyze the conversation transcript and extract structured information. Return JSON only.
@@ -72338,6 +72776,7 @@ ${formattedTranscript}`
72338
72776
  };
72339
72777
 
72340
72778
  // src/memory/reranker.ts
72779
+ init_logger();
72341
72780
  var log7 = new Logger("reranker");
72342
72781
  var RERANK_TIMEOUT_MS = 3e3;
72343
72782
  var Reranker = class {
@@ -72357,7 +72796,7 @@ Entries:
72357
72796
  ${candidates.map((f3, i2) => `[${i2}] ${f3.content} (${f3.category})`).join("\n")}`;
72358
72797
  const apiCall = this.textAdapter.chat([{ role: "user", content: prompt }], { json: true });
72359
72798
  const timeoutPromise = new Promise(
72360
- (resolve4) => setTimeout(() => resolve4(null), RERANK_TIMEOUT_MS)
72799
+ (resolve5) => setTimeout(() => resolve5(null), RERANK_TIMEOUT_MS)
72361
72800
  );
72362
72801
  const response = await Promise.race([apiCall, timeoutPromise]);
72363
72802
  if (!response) {
@@ -72633,6 +73072,7 @@ var MemoryManager = class {
72633
73072
  };
72634
73073
 
72635
73074
  // src/memory/backup-service.ts
73075
+ init_logger();
72636
73076
  import { writeFileSync, readFileSync as readFileSync2, renameSync, existsSync as existsSync2, statSync, mkdirSync } from "fs";
72637
73077
  import { dirname } from "path";
72638
73078
 
@@ -72745,6 +73185,7 @@ var BackupService = class {
72745
73185
  };
72746
73186
 
72747
73187
  // src/discovery/discovery-loop.ts
73188
+ init_logger();
72748
73189
  var log10 = new Logger("discovery");
72749
73190
  var DEFAULT_INTERVAL_MS = 15 * 6e4;
72750
73191
  var DiscoveryLoop = class {
@@ -72838,6 +73279,7 @@ function formatDuration(ms) {
72838
73279
  }
72839
73280
 
72840
73281
  // src/skills/skill-registry.ts
73282
+ init_logger();
72841
73283
  import { formatSkillsForPrompt } from "@mariozechner/pi-coding-agent";
72842
73284
  var log11 = new Logger("skill-registry");
72843
73285
  var CHARS_PER_TOKEN_ESTIMATE = 4;
@@ -73024,11 +73466,13 @@ function toPiSkillShape(skill) {
73024
73466
  }
73025
73467
 
73026
73468
  // src/skills/skill-watcher.ts
73469
+ init_logger();
73027
73470
  import { homedir as homedir3 } from "node:os";
73028
73471
  import { resolve as resolve2 } from "node:path";
73029
73472
  import chokidar from "chokidar";
73030
73473
 
73031
73474
  // src/skills/skill-loader.ts
73475
+ init_logger();
73032
73476
  import { readFileSync as readFileSync3 } from "node:fs";
73033
73477
  import { homedir as homedir2 } from "node:os";
73034
73478
  import { resolve } from "node:path";
@@ -75899,6 +76343,9 @@ __export(type_exports2, {
75899
76343
  // ../../node_modules/@sinclair/typebox/build/esm/type/type/index.mjs
75900
76344
  var Type = type_exports2;
75901
76345
 
76346
+ // src/workers/neura-tools.ts
76347
+ init_logger();
76348
+
75902
76349
  // src/tools/time-tools.ts
75903
76350
  var timeToolDefs = [
75904
76351
  {
@@ -75923,6 +76370,7 @@ function handleTimeTool(name) {
75923
76370
  }
75924
76371
 
75925
76372
  // src/tools/memory-tools.ts
76373
+ init_logger();
75926
76374
  var log14 = new Logger("tool:memory");
75927
76375
  var memoryToolDefs = [
75928
76376
  {
@@ -76099,6 +76547,10 @@ var MEMORY_NAMES = /* @__PURE__ */ new Set([
76099
76547
  "memory_stats"
76100
76548
  ]);
76101
76549
 
76550
+ // src/tools/task-tools.ts
76551
+ init_logger();
76552
+ import { basename } from "node:path";
76553
+
76102
76554
  // src/tools/voice-redact.ts
76103
76555
  function redactTaskForVoice(task) {
76104
76556
  const { workerId, ...rest } = task;
@@ -76112,6 +76564,9 @@ function redactCommentForVoice(comment) {
76112
76564
  }
76113
76565
 
76114
76566
  // src/tools/task-tools.ts
76567
+ function toRelativeSessionPath(raw) {
76568
+ return `agent/sessions/${basename(raw)}`;
76569
+ }
76115
76570
  var log15 = new Logger("tool:task");
76116
76571
  var ALL_STATUSES = [
76117
76572
  "pending",
@@ -76380,11 +76835,24 @@ async function handleTaskTool(name, args, ctx) {
76380
76835
  err: String(err)
76381
76836
  });
76382
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
+ }
76383
76850
  return {
76384
76851
  result: {
76385
76852
  found: true,
76386
76853
  task: redactTaskForVoice(task),
76387
- comments: comments.map(redactCommentForVoice)
76854
+ comments: comments.map(redactCommentForVoice),
76855
+ ...sessionFile ? { sessionFile } : {}
76388
76856
  }
76389
76857
  };
76390
76858
  }
@@ -76466,6 +76934,7 @@ async function handleTaskTool(name, args, ctx) {
76466
76934
  }
76467
76935
 
76468
76936
  // src/tools/presence-tools.ts
76937
+ init_logger();
76469
76938
  var log16 = new Logger("tool:presence");
76470
76939
  var presenceToolDefs = [
76471
76940
  {
@@ -76753,6 +77222,7 @@ function makeTool(spec) {
76753
77222
  }
76754
77223
 
76755
77224
  // src/workers/voice-fanout-bridge.ts
77225
+ init_logger();
76756
77226
  var log18 = new Logger("voice-fanout-bridge");
76757
77227
  var NO_INTERJECTOR = {
76758
77228
  interject: () => Promise.resolve()
@@ -76941,7 +77411,7 @@ function stripToolCallArtifacts(text) {
76941
77411
  return cleaned.trim();
76942
77412
  }
76943
77413
  function sleep2(ms) {
76944
- return new Promise((resolve4) => setTimeout(resolve4, ms));
77414
+ return new Promise((resolve5) => setTimeout(resolve5, ms));
76945
77415
  }
76946
77416
  function extractStopReason(event) {
76947
77417
  if (event.type !== "agent_end") return "stop";
@@ -76957,6 +77427,7 @@ function extractStopReason(event) {
76957
77427
  }
76958
77428
 
76959
77429
  // src/workers/pi-runtime.ts
77430
+ init_logger();
76960
77431
  import { existsSync as existsSync3 } from "node:fs";
76961
77432
  import { join as join2 } from "node:path";
76962
77433
  import {
@@ -77153,8 +77624,8 @@ var PiRuntime = class {
77153
77624
  const sessionManager = SessionManager.create(sessionCwd, this.opts.sessionDir);
77154
77625
  const session = await this.buildSession(sessionManager, workerId, sessionCwd, task.taskId);
77155
77626
  let resolveDone;
77156
- const done = new Promise((resolve4) => {
77157
- resolveDone = resolve4;
77627
+ const done = new Promise((resolve5) => {
77628
+ resolveDone = resolve5;
77158
77629
  });
77159
77630
  const worker = {
77160
77631
  workerId,
@@ -77190,8 +77661,8 @@ var PiRuntime = class {
77190
77661
  const sessionManager = SessionManager.open(sessionFile, this.opts.sessionDir);
77191
77662
  const session = await this.buildSession(sessionManager, workerId);
77192
77663
  let resolveDone;
77193
- const done = new Promise((resolve4) => {
77194
- resolveDone = resolve4;
77664
+ const done = new Promise((resolve5) => {
77665
+ resolveDone = resolve5;
77195
77666
  });
77196
77667
  const existing = this.active.get(workerId);
77197
77668
  const worker = {
@@ -77245,8 +77716,8 @@ var PiRuntime = class {
77245
77716
  if (!worker) {
77246
77717
  return Promise.resolve();
77247
77718
  }
77248
- return new Promise((resolve4) => {
77249
- worker.idleWaiters.push(resolve4);
77719
+ return new Promise((resolve5) => {
77720
+ worker.idleWaiters.push(resolve5);
77250
77721
  });
77251
77722
  }
77252
77723
  hasWorker(workerId) {
@@ -77266,6 +77737,7 @@ function defaultSessionDir(agentDir) {
77266
77737
  }
77267
77738
 
77268
77739
  // src/workers/worker-cancellation.ts
77740
+ init_logger();
77269
77741
  var log20 = new Logger("worker-cancellation");
77270
77742
  var WorkerCancellation = class {
77271
77743
  runtime;
@@ -77324,127 +77796,10 @@ var WorkerCancellation = class {
77324
77796
  };
77325
77797
 
77326
77798
  // src/workers/agent-worker.ts
77327
- import { existsSync as existsSync5 } from "node:fs";
77328
-
77329
- // src/stores/worker-queries.ts
77330
- import crypto2 from "crypto";
77331
- var log21 = new Logger("worker-queries");
77332
- function mapRow(row) {
77333
- return {
77334
- workerId: row.worker_id,
77335
- taskType: row.task_type,
77336
- taskSpec: row.task_spec,
77337
- status: row.status,
77338
- startedAt: row.started_at,
77339
- lastProgressAt: row.last_progress_at,
77340
- result: row.result_json,
77341
- error: row.error_json,
77342
- sessionId: row.session_id,
77343
- sessionFile: row.session_file
77344
- };
77345
- }
77346
- async function createWorker(db, task) {
77347
- const workerId = crypto2.randomUUID();
77348
- await db.query(
77349
- `INSERT INTO workers (worker_id, task_type, task_spec, status)
77350
- VALUES ($1, $2, $3, 'spawning')`,
77351
- [workerId, task.taskType, JSON.stringify(task)]
77352
- );
77353
- return workerId;
77354
- }
77355
- async function updateWorker(db, workerId, update) {
77356
- const sets = [];
77357
- const values = [];
77358
- let paramIdx = 1;
77359
- if (update.status !== void 0) {
77360
- sets.push(`status = $${paramIdx++}`);
77361
- values.push(update.status);
77362
- sets.push("last_progress_at = NOW()");
77363
- }
77364
- if (update.sessionId !== void 0) {
77365
- sets.push(`session_id = $${paramIdx++}`);
77366
- values.push(update.sessionId);
77367
- }
77368
- if (update.sessionFile !== void 0) {
77369
- sets.push(`session_file = $${paramIdx++}`);
77370
- values.push(update.sessionFile);
77371
- }
77372
- if (update.result !== void 0) {
77373
- sets.push(`result_json = $${paramIdx++}`);
77374
- values.push(JSON.stringify(update.result));
77375
- }
77376
- if (update.error !== void 0) {
77377
- sets.push(`error_json = $${paramIdx++}`);
77378
- values.push(JSON.stringify(update.error));
77379
- }
77380
- if (sets.length === 0) return;
77381
- values.push(workerId);
77382
- await db.query(`UPDATE workers SET ${sets.join(", ")} WHERE worker_id = $${paramIdx}`, values);
77383
- }
77384
- async function getWorker(db, workerId) {
77385
- const result = await db.query("SELECT * FROM workers WHERE worker_id = $1", [
77386
- workerId
77387
- ]);
77388
- return result.rows.length > 0 ? mapRow(result.rows[0]) : null;
77389
- }
77390
- async function listWorkers(db, options) {
77391
- const limit2 = options?.limit ?? 100;
77392
- if (!options?.status) {
77393
- const result2 = await db.query(
77394
- "SELECT * FROM workers ORDER BY last_progress_at DESC LIMIT $1",
77395
- [limit2]
77396
- );
77397
- return result2.rows.map(mapRow);
77398
- }
77399
- const statusArr = Array.isArray(options.status) ? options.status : [options.status];
77400
- const placeholders = statusArr.map((_, i2) => `$${i2 + 1}`).join(", ");
77401
- const result = await db.query(
77402
- `SELECT * FROM workers WHERE status IN (${placeholders})
77403
- ORDER BY last_progress_at DESC LIMIT $${statusArr.length + 1}`,
77404
- [...statusArr, limit2]
77405
- );
77406
- return result.rows.map(mapRow);
77407
- }
77408
- async function sweepCrashedWorkers(db, fileExists) {
77409
- const midRunResult = await db.query(
77410
- `UPDATE workers
77411
- SET status = 'crashed',
77412
- error_json = $1::jsonb,
77413
- last_progress_at = NOW()
77414
- WHERE status IN ('spawning', 'running', 'blocked_clarifying')
77415
- RETURNING worker_id`,
77416
- [JSON.stringify({ reason: "core_restarted" })]
77417
- );
77418
- const midRunCount = midRunResult.rows.length;
77419
- const idleRows = await db.query(`SELECT * FROM workers WHERE status = 'idle_partial'`);
77420
- let missingFileCount = 0;
77421
- let resumable = 0;
77422
- for (const row of idleRows.rows) {
77423
- if (!row.session_file || !fileExists(row.session_file)) {
77424
- await db.query(
77425
- `UPDATE workers
77426
- SET status = 'crashed',
77427
- error_json = $1::jsonb,
77428
- last_progress_at = NOW()
77429
- WHERE worker_id = $2`,
77430
- [JSON.stringify({ reason: "session_file_missing" }), row.worker_id]
77431
- );
77432
- missingFileCount++;
77433
- } else {
77434
- resumable++;
77435
- }
77436
- }
77437
- const summary = {
77438
- markedCrashedMidRun: midRunCount,
77439
- markedCrashedMissingFile: missingFileCount,
77440
- resumable
77441
- };
77442
- log21.info("recovery sweep complete", { ...summary });
77443
- return summary;
77444
- }
77445
-
77446
- // src/workers/agent-worker.ts
77799
+ init_logger();
77800
+ init_worker_queries();
77447
77801
  init_work_item_queries();
77802
+ import { existsSync as existsSync5 } from "node:fs";
77448
77803
 
77449
77804
  // src/stores/task-comment-queries.ts
77450
77805
  init_mappers();
@@ -77523,6 +77878,7 @@ async function countOpenRequests(db, taskId) {
77523
77878
  }
77524
77879
 
77525
77880
  // src/workers/worktree-manager.ts
77881
+ init_logger();
77526
77882
  import { execFileSync } from "node:child_process";
77527
77883
  import {
77528
77884
  existsSync as existsSync4,
@@ -78294,6 +78650,7 @@ var AgentWorker = class {
78294
78650
  };
78295
78651
 
78296
78652
  // src/workers/clarification-bridge.ts
78653
+ init_logger();
78297
78654
  var log24 = new Logger("clarification-bridge");
78298
78655
  var ClarificationBridge = class {
78299
78656
  opts;
@@ -78326,11 +78683,11 @@ var ClarificationBridge = class {
78326
78683
  immediate: urgency === "blocking",
78327
78684
  bypassRateLimit: true
78328
78685
  });
78329
- const answer = await new Promise((resolve4, reject) => {
78686
+ const answer = await new Promise((resolve5, reject) => {
78330
78687
  const pending = {
78331
78688
  workerId,
78332
78689
  question,
78333
- resolve: resolve4,
78690
+ resolve: resolve5,
78334
78691
  reject,
78335
78692
  ...onAnswer ? { onAnswer } : {}
78336
78693
  };
@@ -78457,6 +78814,9 @@ function buildClarificationTool(workerId, bridge) {
78457
78814
  return tool;
78458
78815
  }
78459
78816
 
78817
+ // src/workers/worker-protocol-tools.ts
78818
+ init_logger();
78819
+
78460
78820
  // src/tools/task-update-handler.ts
78461
78821
  init_work_item_queries();
78462
78822
  var TERMINAL_STATUSES = /* @__PURE__ */ new Set(["done", "cancelled", "failed"]);
@@ -78928,6 +79288,7 @@ async function handleVisionTool(name, args, ctx) {
78928
79288
  }
78929
79289
 
78930
79290
  // src/tools/skill-tools.ts
79291
+ init_logger();
78931
79292
  var log26 = new Logger("tool:skill");
78932
79293
  var skillToolDefs = [
78933
79294
  {
@@ -79018,6 +79379,7 @@ async function handleSkillTool(name, args, ctx) {
79018
79379
  }
79019
79380
 
79020
79381
  // src/tools/worker-control-tools.ts
79382
+ init_logger();
79021
79383
  var log27 = new Logger("tool:worker-control");
79022
79384
  var workerControlToolDefs = [
79023
79385
  {
@@ -79129,12 +79491,99 @@ async function handleWorkerControlTool(name, args, ctx) {
79129
79491
  }
79130
79492
  }
79131
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
+
79132
79580
  // src/tools/registry.ts
79133
79581
  var MEMORY_TOOL_NAMES = new Set(memoryToolDefs.map((t2) => t2.name));
79134
79582
  var PRESENCE_TOOL_NAMES = new Set(presenceToolDefs.map((t2) => t2.name));
79135
79583
  var TASK_TOOL_NAMES = new Set(taskToolDefs.map((t2) => t2.name));
79136
79584
  var SKILL_TOOL_NAMES = new Set(skillToolDefs.map((t2) => t2.name));
79137
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));
79138
79587
  var toolDefs = [
79139
79588
  ...visionToolDefs,
79140
79589
  ...timeToolDefs,
@@ -79142,7 +79591,8 @@ var toolDefs = [
79142
79591
  ...presenceToolDefs,
79143
79592
  ...taskToolDefs,
79144
79593
  ...skillToolDefs,
79145
- ...workerControlToolDefs
79594
+ ...workerControlToolDefs,
79595
+ ...logToolDefs
79146
79596
  ];
79147
79597
  function getToolDefs(options) {
79148
79598
  return toolDefs.filter((t2) => {
@@ -79151,17 +79601,22 @@ function getToolDefs(options) {
79151
79601
  if (TASK_TOOL_NAMES.has(t2.name) && !options.includeTasks) return false;
79152
79602
  if (SKILL_TOOL_NAMES.has(t2.name) && !options.includeSkills) return false;
79153
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;
79154
79605
  return true;
79155
79606
  });
79156
79607
  }
79157
79608
 
79158
79609
  // src/tools/tool-router.ts
79159
- var log28 = new Logger("tool");
79610
+ init_logger();
79611
+ var log29 = new Logger("tool");
79160
79612
  async function handleToolCall(name, args, ctx) {
79161
- log28.info(`${name}`, { args });
79162
- 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}` };
79163
79615
  }
79164
79616
 
79617
+ // src/tools/index.ts
79618
+ init_log_reader();
79619
+
79165
79620
  // src/tools/system-state-handler.ts
79166
79621
  init_mappers();
79167
79622
  var ACTIVE_WORKER_STATUSES = [
@@ -79279,13 +79734,13 @@ function buildSystemStateHandler(options) {
79279
79734
  }
79280
79735
 
79281
79736
  // src/server/lifecycle.ts
79282
- var log29 = new Logger("server");
79737
+ var log30 = new Logger("server");
79283
79738
  function resolveVersion(neuraHome) {
79284
79739
  if (process.env.NEURA_VERSION) return process.env.NEURA_VERSION;
79285
79740
  try {
79286
79741
  const bundleDir = dirname2(fileURLToPath(import.meta.url));
79287
79742
  const bundleVersionPath = join4(bundleDir, "version.txt");
79288
- if (existsSync6(bundleVersionPath)) {
79743
+ if (existsSync7(bundleVersionPath)) {
79289
79744
  return readFileSync5(bundleVersionPath, "utf-8").trim();
79290
79745
  }
79291
79746
  } catch {
@@ -79315,39 +79770,39 @@ async function initServices() {
79315
79770
  process.on("SIGINT", cleanup);
79316
79771
  process.on("SIGTERM", cleanup);
79317
79772
  } catch (err) {
79318
- log29.warn("failed to write neura-core.pid", { err: String(err) });
79773
+ log30.warn("failed to write neura-core.pid", { err: String(err) });
79319
79774
  }
79320
79775
  }
79321
79776
  let store = null;
79322
79777
  const backupPath = join4(config2.neuraHome, "memory-backup.json");
79323
79778
  if (config2.pgDataPath) {
79324
79779
  const pidPath = join4(config2.pgDataPath, "postmaster.pid");
79325
- if (existsSync6(pidPath)) {
79326
- log29.warn("removing stale postmaster.pid");
79780
+ if (existsSync7(pidPath)) {
79781
+ log30.warn("removing stale postmaster.pid");
79327
79782
  unlinkSync(pidPath);
79328
79783
  }
79329
79784
  try {
79330
79785
  const { PgliteStore } = await import("../stores/index.js");
79331
79786
  const embDims = config2.routing.embedding?.dimensions;
79332
79787
  store = await PgliteStore.create(config2.pgDataPath, embDims);
79333
- log29.info("database initialized", { path: config2.pgDataPath, embeddingDimensions: embDims });
79788
+ log30.info("database initialized", { path: config2.pgDataPath, embeddingDimensions: embDims });
79334
79789
  } catch (err) {
79335
- 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) });
79336
79791
  try {
79337
79792
  rmSync2(config2.pgDataPath, { recursive: true, force: true });
79338
79793
  const { PgliteStore } = await import("../stores/index.js");
79339
79794
  const embDims = config2.routing.embedding?.dimensions;
79340
79795
  store = await PgliteStore.create(config2.pgDataPath, embDims);
79341
- log29.info("database recreated after reset", { path: config2.pgDataPath });
79342
- if (existsSync6(backupPath)) {
79796
+ log30.info("database recreated after reset", { path: config2.pgDataPath });
79797
+ if (existsSync7(backupPath)) {
79343
79798
  const bs = new BackupService({ store, backupPath });
79344
79799
  const result = await bs.restore();
79345
79800
  if (result) {
79346
- log29.info("memories restored from backup after corruption", result);
79801
+ log30.info("memories restored from backup after corruption", result);
79347
79802
  }
79348
79803
  }
79349
79804
  } catch (retryErr) {
79350
- log29.warn("database unavailable after reset, persistence disabled", {
79805
+ log30.warn("database unavailable after reset, persistence disabled", {
79351
79806
  err: String(retryErr)
79352
79807
  });
79353
79808
  }
@@ -79367,14 +79822,14 @@ async function initServices() {
79367
79822
  retrievalStrategy: config2.retrievalStrategy,
79368
79823
  assistantName: config2.assistantName
79369
79824
  });
79370
- log29.info("memory manager initialized");
79825
+ log30.info("memory manager initialized");
79371
79826
  } catch (err) {
79372
- log29.warn("memory manager disabled \u2014 adapter error", {
79827
+ log30.warn("memory manager disabled \u2014 adapter error", {
79373
79828
  err: String(err)
79374
79829
  });
79375
79830
  }
79376
79831
  } else if (store) {
79377
- 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");
79378
79833
  }
79379
79834
  if (store) {
79380
79835
  backupService = new BackupService({ store, backupPath });
@@ -79403,12 +79858,12 @@ async function initServices() {
79403
79858
  });
79404
79859
  discoveryLoop.start();
79405
79860
  } catch (err) {
79406
- log29.warn("discovery loop disabled \u2014 text adapter error", {
79861
+ log30.warn("discovery loop disabled \u2014 text adapter error", {
79407
79862
  err: String(err)
79408
79863
  });
79409
79864
  }
79410
79865
  } else if (store) {
79411
- log29.info("discovery loop disabled \u2014 text route not configured");
79866
+ log30.info("discovery loop disabled \u2014 text route not configured");
79412
79867
  }
79413
79868
  const pendingCleanups = /* @__PURE__ */ new Set();
79414
79869
  let skillRegistry = null;
@@ -79437,7 +79892,7 @@ async function initServices() {
79437
79892
  bundledSkillsDir
79438
79893
  });
79439
79894
  await skillWatcher.start();
79440
- log29.info("skill registry loaded", {
79895
+ log30.info("skill registry loaded", {
79441
79896
  count: skillRegistry.size,
79442
79897
  bundledSkillsDir
79443
79898
  });
@@ -79499,6 +79954,11 @@ async function initServices() {
79499
79954
  excludeTypes: options?.excludeTypes
79500
79955
  });
79501
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
+ },
79502
79962
  updateTask: async (idOrTitle, payload) => {
79503
79963
  const current = await store.getWorkItem(idOrTitle);
79504
79964
  if (!current) return null;
@@ -79510,7 +79970,7 @@ async function initServices() {
79510
79970
  });
79511
79971
  },
79512
79972
  deleteTask: (idOrTitle) => {
79513
- log29.warn("worker tried deleteTask (not supported for workers)", { idOrTitle });
79973
+ log30.warn("worker tried deleteTask (not supported for workers)", { idOrTitle });
79514
79974
  return Promise.resolve(false);
79515
79975
  }
79516
79976
  };
@@ -79521,14 +79981,14 @@ async function initServices() {
79521
79981
  try {
79522
79982
  await agentWorker?.setStatus(workerId, "blocked_clarifying");
79523
79983
  } catch (err) {
79524
- log29.warn("onBlock setStatus failed", { workerId, err: String(err) });
79984
+ log30.warn("onBlock setStatus failed", { workerId, err: String(err) });
79525
79985
  }
79526
79986
  },
79527
79987
  onUnblock: async (workerId) => {
79528
79988
  try {
79529
79989
  await agentWorker?.setStatus(workerId, "running");
79530
79990
  } catch (err) {
79531
- log29.warn("onUnblock setStatus failed", { workerId, err: String(err) });
79991
+ log30.warn("onUnblock setStatus failed", { workerId, err: String(err) });
79532
79992
  }
79533
79993
  }
79534
79994
  });
@@ -79567,7 +80027,7 @@ async function initServices() {
79567
80027
  }
79568
80028
  const authStorage = AuthStorage.create(join4(agentDir, "auth.json"));
79569
80029
  const seededProviders = seedAuthStorageFromConfig(authStorage, config2.providers);
79570
- log29.info("seeded pi auth storage from config", { count: seededProviders });
80030
+ log30.info("seeded pi auth storage from config", { count: seededProviders });
79571
80031
  const piRuntime = new PiRuntime({
79572
80032
  model,
79573
80033
  thinkingLevel: "low",
@@ -79594,14 +80054,14 @@ async function initServices() {
79594
80054
  const handle = await agentWorker.dispatchForTask(taskId);
79595
80055
  return { workerId: handle.workerId };
79596
80056
  } catch (err) {
79597
- log29.warn("dispatchForTask failed", { taskId, err: String(err) });
80057
+ log30.warn("dispatchForTask failed", { taskId, err: String(err) });
79598
80058
  return { error: String(err) };
79599
80059
  }
79600
80060
  }
79601
80061
  };
79602
- log29.info("phase 6 worker runtime ready");
80062
+ log30.info("phase 6 worker runtime ready");
79603
80063
  } catch (err) {
79604
- log29.error("phase 6 initialization failed \u2014 skills and workers disabled", {
80064
+ log30.error("phase 6 initialization failed \u2014 skills and workers disabled", {
79605
80065
  err: String(err)
79606
80066
  });
79607
80067
  skillRegistry = null;
@@ -79615,7 +80075,7 @@ async function initServices() {
79615
80075
  workerDispatchHandler = null;
79616
80076
  }
79617
80077
  } else {
79618
- 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");
79619
80079
  }
79620
80080
  return {
79621
80081
  config: config2,
@@ -79654,7 +80114,7 @@ function buildSkillToolHandler(deps) {
79654
80114
  "disable-model-invocation: false"
79655
80115
  );
79656
80116
  if (updated === content) {
79657
- 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", {
79658
80118
  skillName,
79659
80119
  filePath: skill.filePath
79660
80120
  });
@@ -79746,7 +80206,7 @@ function buildWorkerControlHandler(deps) {
79746
80206
  return handler;
79747
80207
  }
79748
80208
  async function shutdown(services2, httpServer2, wss2) {
79749
- log29.info("shutting down");
80209
+ log30.info("shutting down");
79750
80210
  const forceExit = setTimeout(() => process.exit(1), 5e3);
79751
80211
  forceExit.unref();
79752
80212
  services2.discoveryLoop?.stop();
@@ -79756,14 +80216,14 @@ async function shutdown(services2, httpServer2, wss2) {
79756
80216
  try {
79757
80217
  await services2.agentWorker.cancelAll();
79758
80218
  } catch (err) {
79759
- log29.warn("agentWorker.cancelAll failed during shutdown", { err: String(err) });
80219
+ log30.warn("agentWorker.cancelAll failed during shutdown", { err: String(err) });
79760
80220
  }
79761
80221
  }
79762
80222
  if (services2.skillWatcher) {
79763
80223
  try {
79764
80224
  await services2.skillWatcher.stop();
79765
80225
  } catch (err) {
79766
- log29.warn("skillWatcher.stop failed during shutdown", { err: String(err) });
80226
+ log30.warn("skillWatcher.stop failed during shutdown", { err: String(err) });
79767
80227
  }
79768
80228
  }
79769
80229
  if (wss2) {
@@ -79771,14 +80231,14 @@ async function shutdown(services2, httpServer2, wss2) {
79771
80231
  void (async () => {
79772
80232
  await Promise.allSettled([...services2.pendingCleanups]);
79773
80233
  await services2.memoryManager?.close();
79774
- 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) }));
79775
80235
  await services2.store?.close();
79776
80236
  httpServer2.close(() => process.exit(0));
79777
80237
  })();
79778
80238
  });
79779
80239
  } else {
79780
80240
  await services2.memoryManager?.close();
79781
- 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) }));
79782
80242
  await services2.store?.close();
79783
80243
  httpServer2.close(() => process.exit(0));
79784
80244
  }
@@ -79786,7 +80246,8 @@ async function shutdown(services2, httpServer2, wss2) {
79786
80246
 
79787
80247
  // src/server/app.ts
79788
80248
  var import_express = __toESM(require_express2(), 1);
79789
- import { existsSync as existsSync7 } from "fs";
80249
+ init_logger();
80250
+ import { existsSync as existsSync8 } from "fs";
79790
80251
  import { dirname as dirname3, join as join5 } from "path";
79791
80252
  import { fileURLToPath as fileURLToPath2 } from "url";
79792
80253
 
@@ -79803,7 +80264,7 @@ function verifyToken(provided, expected) {
79803
80264
  }
79804
80265
 
79805
80266
  // src/server/app.ts
79806
- var log30 = new Logger("server");
80267
+ var log31 = new Logger("server");
79807
80268
  function createApp(services2, getPort) {
79808
80269
  const app2 = (0, import_express.default)();
79809
80270
  const { authToken } = services2.config;
@@ -79837,20 +80298,20 @@ function createApp(services2, getPort) {
79837
80298
  try {
79838
80299
  const bundleDir = dirname3(fileURLToPath2(import.meta.url));
79839
80300
  const bundledUiDir = join5(bundleDir, "..", "ui");
79840
- if (existsSync7(join5(bundledUiDir, "index.html"))) {
80301
+ if (existsSync8(join5(bundledUiDir, "index.html"))) {
79841
80302
  uiDir = bundledUiDir;
79842
80303
  }
79843
80304
  } catch {
79844
80305
  }
79845
80306
  if (!uiDir) {
79846
80307
  const homeUiDir = join5(services2.config.neuraHome, "ui");
79847
- if (existsSync7(join5(homeUiDir, "index.html"))) {
80308
+ if (existsSync8(join5(homeUiDir, "index.html"))) {
79848
80309
  uiDir = homeUiDir;
79849
80310
  }
79850
80311
  }
79851
80312
  if (uiDir) {
79852
80313
  app2.use(import_express.default.static(uiDir));
79853
- log30.info("web UI mounted", { path: uiDir });
80314
+ log31.info("web UI mounted", { path: uiDir });
79854
80315
  }
79855
80316
  app2.post("/backup", requireAuth, (_req, res) => {
79856
80317
  if (!services2.backupService) {
@@ -79883,10 +80344,12 @@ function createApp(services2, getPort) {
79883
80344
  }
79884
80345
 
79885
80346
  // src/server/websocket.ts
80347
+ init_logger();
79886
80348
  import { URL as URL2 } from "url";
79887
80349
 
79888
80350
  // src/providers/grok-voice.ts
79889
- var log31 = new Logger("voice");
80351
+ init_logger();
80352
+ var log32 = new Logger("voice");
79890
80353
  var WS_URL = "wss://api.x.ai/v1/realtime";
79891
80354
  var MAX_TRANSCRIPT_ENTRIES = 40;
79892
80355
  var GROK_VOICE_RATE_PER_MS = 0.05 / 6e4;
@@ -79971,7 +80434,7 @@ ${context}
79971
80434
  });
79972
80435
  this.ws.on("open", () => {
79973
80436
  const isReconnect = this.reconnectAttempts > 0 || this.transcript.length > 0;
79974
- log31.info("connected");
80437
+ log32.info("connected");
79975
80438
  this.reconnectAttempts = 0;
79976
80439
  this.ws.send(
79977
80440
  JSON.stringify({
@@ -79993,14 +80456,15 @@ ${context}
79993
80456
  includePresence: !!this.config.enterMode,
79994
80457
  includeTasks: !!this.config.taskTools,
79995
80458
  includeSkills: !!this.config.skillTools,
79996
- includeWorkerControl: !!this.config.workerControl
80459
+ includeWorkerControl: !!this.config.workerControl,
80460
+ includeLogs: !!this.config.workerLogs
79997
80461
  })
79998
80462
  }
79999
80463
  })
80000
80464
  );
80001
80465
  if (this.sessionTimer) clearTimeout(this.sessionTimer);
80002
80466
  this.sessionTimer = setTimeout(() => {
80003
- log31.info("proactive reconnect (approaching session limit)");
80467
+ log32.info("proactive reconnect (approaching session limit)");
80004
80468
  void this.reconnect();
80005
80469
  }, this.sessionMaxMs);
80006
80470
  if (isReconnect) this.cb.onReconnected();
@@ -80010,15 +80474,15 @@ ${context}
80010
80474
  const msg = JSON.parse(raw.toString());
80011
80475
  this.handleMessage(msg);
80012
80476
  } catch (err) {
80013
- log31.error("parse error", { err: String(err) });
80477
+ log32.error("parse error", { err: String(err) });
80014
80478
  }
80015
80479
  });
80016
80480
  this.ws.on("error", (err) => {
80017
- log31.error("ws error", { err: err.message });
80481
+ log32.error("ws error", { err: err.message });
80018
80482
  this.cb.onError(err.message);
80019
80483
  });
80020
80484
  this.ws.on("close", () => {
80021
- log31.info("disconnected");
80485
+ log32.info("disconnected");
80022
80486
  if (this.sessionTimer) {
80023
80487
  clearTimeout(this.sessionTimer);
80024
80488
  this.sessionTimer = null;
@@ -80032,14 +80496,14 @@ ${context}
80032
80496
  }
80033
80497
  attemptReconnect() {
80034
80498
  if (this.reconnectAttempts >= this.maxReconnectAttempts) {
80035
- log31.error(`max reconnect attempts (${this.maxReconnectAttempts}) reached`);
80499
+ log32.error(`max reconnect attempts (${this.maxReconnectAttempts}) reached`);
80036
80500
  this.cb.onError("Voice session disconnected \u2014 max reconnect attempts reached.");
80037
80501
  this.cb.onClose();
80038
80502
  return;
80039
80503
  }
80040
80504
  this.reconnectAttempts++;
80041
80505
  const delay = Math.min(1e3 * Math.pow(2, this.reconnectAttempts - 1), 16e3);
80042
- log31.info(
80506
+ log32.info(
80043
80507
  `reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`
80044
80508
  );
80045
80509
  setTimeout(() => {
@@ -80059,14 +80523,14 @@ ${context}
80059
80523
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
80060
80524
  handleMessage(msg) {
80061
80525
  if (msg.type !== "response.output_audio.delta" && msg.type !== "ping") {
80062
- log31.debug("event", { type: msg.type });
80526
+ log32.debug("event", { type: msg.type });
80063
80527
  }
80064
80528
  switch (msg.type) {
80065
80529
  case "session.created":
80066
80530
  case "conversation.created":
80067
80531
  break;
80068
80532
  case "session.updated":
80069
- log31.info("session configured");
80533
+ log32.info("session configured");
80070
80534
  if (!this.readyFired) {
80071
80535
  this.readyFired = true;
80072
80536
  this.cb.onReady();
@@ -80096,7 +80560,7 @@ ${context}
80096
80560
  break;
80097
80561
  case "response.done": {
80098
80562
  const audioMs = Math.round(this.turnAudioBytes / 48);
80099
- log31.info("turn audio", {
80563
+ log32.info("turn audio", {
80100
80564
  chunks: this.turnAudioChunks,
80101
80565
  bytes: this.turnAudioBytes,
80102
80566
  ms: audioMs
@@ -80127,7 +80591,7 @@ ${context}
80127
80591
  void this.handleFunctionCallDone(msg);
80128
80592
  break;
80129
80593
  case "error":
80130
- log31.error("api error", { error: msg.error });
80594
+ log32.error("api error", { error: msg.error });
80131
80595
  this.cb.onError(msg.error?.message || "Unknown error");
80132
80596
  break;
80133
80597
  }
@@ -80151,7 +80615,8 @@ ${context}
80151
80615
  skillTools: this.config.skillTools,
80152
80616
  workerControl: this.config.workerControl,
80153
80617
  workerDispatch: this.config.workerDispatch,
80154
- systemState: this.config.systemState
80618
+ systemState: this.config.systemState,
80619
+ workerLogs: this.config.workerLogs
80155
80620
  });
80156
80621
  this.cb.onToolResult(name, result);
80157
80622
  if (currentWs && currentWs === this.ws && currentWs.readyState === wrapper_default.OPEN) {
@@ -80227,12 +80692,12 @@ ${context}
80227
80692
  */
80228
80693
  interject(message, options) {
80229
80694
  if (this.ws?.readyState !== wrapper_default.OPEN) {
80230
- 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) });
80231
80696
  return Promise.resolve();
80232
80697
  }
80233
80698
  const now = Date.now();
80234
80699
  if (!options.bypassRateLimit && now - this.lastInterjectAt < this.minInterjectIntervalMs) {
80235
- log31.info("interject rate-limited, dropping", {
80700
+ log32.info("interject rate-limited, dropping", {
80236
80701
  preview: message.slice(0, 80),
80237
80702
  msSinceLast: now - this.lastInterjectAt
80238
80703
  });
@@ -80270,7 +80735,8 @@ ${context}
80270
80735
  };
80271
80736
 
80272
80737
  // src/providers/pipeline-voice.ts
80273
- var log32 = new Logger("pipeline-voice");
80738
+ init_logger();
80739
+ var log33 = new Logger("pipeline-voice");
80274
80740
  var MAX_TRANSCRIPT_HISTORY = 40;
80275
80741
  var MIN_INTERJECT_INTERVAL_MS = 1e4;
80276
80742
  var SENTENCE_FLUSH_CHARS = 200;
@@ -80302,7 +80768,8 @@ var PipelineVoiceProvider = class {
80302
80768
  includePresence: !!config2.enterMode,
80303
80769
  includeTasks: !!config2.taskTools,
80304
80770
  includeSkills: !!config2.skillTools,
80305
- includeWorkerControl: !!config2.workerControl
80771
+ includeWorkerControl: !!config2.workerControl,
80772
+ includeLogs: !!config2.workerLogs
80306
80773
  });
80307
80774
  this.toolCtx = {
80308
80775
  queryWatcher: cb.queryWatcher,
@@ -80312,7 +80779,8 @@ var PipelineVoiceProvider = class {
80312
80779
  skillTools: config2.skillTools,
80313
80780
  workerControl: config2.workerControl,
80314
80781
  workerDispatch: config2.workerDispatch,
80315
- systemState: config2.systemState
80782
+ systemState: config2.systemState,
80783
+ workerLogs: config2.workerLogs
80316
80784
  };
80317
80785
  }
80318
80786
  // ─── VoiceProvider interface ─────────────────────────────────
@@ -80321,7 +80789,7 @@ var PipelineVoiceProvider = class {
80321
80789
  this.connected = true;
80322
80790
  this.sttStream = this.sttAdapter.createStream("pcm16");
80323
80791
  this.sttStream.on("error", (err) => {
80324
- log32.warn("STT stream error", { err: err.message });
80792
+ log33.warn("STT stream error", { err: err.message });
80325
80793
  this.cb.onError(`STT error: ${err.message}`);
80326
80794
  void this.reconnectSTT();
80327
80795
  });
@@ -80357,12 +80825,12 @@ var PipelineVoiceProvider = class {
80357
80825
  // ─── VoiceInterjector interface ──────────────────────────────
80358
80826
  async interject(message, options) {
80359
80827
  if (this.closed || !this.connected) {
80360
- log32.warn("interject called while closed", { preview: message.slice(0, 80) });
80828
+ log33.warn("interject called while closed", { preview: message.slice(0, 80) });
80361
80829
  return;
80362
80830
  }
80363
80831
  const now = Date.now();
80364
80832
  if (!options.bypassRateLimit && now - this.lastInterjectAt < MIN_INTERJECT_INTERVAL_MS) {
80365
- log32.info("interject rate-limited", { preview: message.slice(0, 80) });
80833
+ log33.info("interject rate-limited", { preview: message.slice(0, 80) });
80366
80834
  return;
80367
80835
  }
80368
80836
  this.lastInterjectAt = now;
@@ -80384,7 +80852,7 @@ var PipelineVoiceProvider = class {
80384
80852
  }
80385
80853
  } catch (err) {
80386
80854
  if (!signal.aborted) {
80387
- log32.warn("interject TTS failed", { err: String(err) });
80855
+ log33.warn("interject TTS failed", { err: String(err) });
80388
80856
  }
80389
80857
  }
80390
80858
  }
@@ -80413,7 +80881,7 @@ var PipelineVoiceProvider = class {
80413
80881
  }
80414
80882
  } catch (err) {
80415
80883
  if (!this.closed) {
80416
- log32.warn("STT loop error", { err: String(err) });
80884
+ log33.warn("STT loop error", { err: String(err) });
80417
80885
  this.cb.onError(`STT loop error: ${String(err)}`);
80418
80886
  void this.reconnectSTT();
80419
80887
  }
@@ -80424,18 +80892,18 @@ var PipelineVoiceProvider = class {
80424
80892
  // ─── Internal: STT reconnection ──────────────────────────────
80425
80893
  reconnectSTT() {
80426
80894
  if (this.closed) return;
80427
- log32.info("attempting STT reconnection");
80895
+ log33.info("attempting STT reconnection");
80428
80896
  try {
80429
80897
  this.sttStream?.abort();
80430
80898
  this.sttStream = this.sttAdapter.createStream("pcm16");
80431
80899
  this.sttStream.on("error", (err) => {
80432
- log32.warn("STT stream error after reconnect", { err: err.message });
80900
+ log33.warn("STT stream error after reconnect", { err: err.message });
80433
80901
  this.cb.onError(`STT error: ${err.message}`);
80434
80902
  });
80435
80903
  void this.runSTTLoop();
80436
80904
  this.cb.onReconnected();
80437
80905
  } catch (err) {
80438
- log32.warn("STT reconnection failed", { err: String(err) });
80906
+ log33.warn("STT reconnection failed", { err: String(err) });
80439
80907
  this.cb.onError("STT reconnection failed");
80440
80908
  }
80441
80909
  }
@@ -80449,7 +80917,7 @@ var PipelineVoiceProvider = class {
80449
80917
  const signal = this.currentTurnAbort.signal;
80450
80918
  void this.processUserUtterance(text, signal).catch((err) => {
80451
80919
  if (!signal.aborted) {
80452
- log32.warn("turn processing failed", { err: String(err) });
80920
+ log33.warn("turn processing failed", { err: String(err) });
80453
80921
  this.cb.onError(`Processing error: ${String(err)}`);
80454
80922
  }
80455
80923
  });
@@ -80573,7 +81041,7 @@ var PipelineVoiceProvider = class {
80573
81041
  }
80574
81042
  } catch (err) {
80575
81043
  if (!signal.aborted) {
80576
- 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) });
80577
81045
  }
80578
81046
  }
80579
81047
  }
@@ -80638,7 +81106,8 @@ function createVoiceSession(cb, config2 = {}, registry2) {
80638
81106
  skillTools: config2.skillTools,
80639
81107
  workerControl: config2.workerControl,
80640
81108
  workerDispatch: config2.workerDispatch,
80641
- systemState: config2.systemState
81109
+ systemState: config2.systemState,
81110
+ workerLogs: config2.workerLogs
80642
81111
  };
80643
81112
  return new PipelineVoiceProvider(cb, pipelineConfig, llmAdapter, sttAdapter, ttsAdapter);
80644
81113
  }
@@ -85688,14 +86157,14 @@ function __asyncValues(o) {
85688
86157
  }, i2);
85689
86158
  function verb(n) {
85690
86159
  i2[n] = o[n] && function(v) {
85691
- return new Promise(function(resolve4, reject) {
85692
- 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);
85693
86162
  });
85694
86163
  };
85695
86164
  }
85696
- function settle(resolve4, reject, d, v) {
86165
+ function settle(resolve5, reject, d, v) {
85697
86166
  Promise.resolve(v).then(function(v2) {
85698
- resolve4({ value: v2, done: d });
86167
+ resolve5({ value: v2, done: d });
85699
86168
  }, reject);
85700
86169
  }
85701
86170
  }
@@ -92001,8 +92470,8 @@ var LiveMusic = class {
92001
92470
  const url2 = `${websocketBaseUrl}/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateMusic?key=${apiKey}`;
92002
92471
  let onopenResolve = () => {
92003
92472
  };
92004
- const onopenPromise = new Promise((resolve4) => {
92005
- onopenResolve = resolve4;
92473
+ const onopenPromise = new Promise((resolve5) => {
92474
+ onopenResolve = resolve5;
92006
92475
  });
92007
92476
  const callbacks = params.callbacks;
92008
92477
  const onopenAwaitedCallback = function() {
@@ -92242,8 +92711,8 @@ var Live = class {
92242
92711
  }
92243
92712
  let onopenResolve = () => {
92244
92713
  };
92245
- const onopenPromise = new Promise((resolve4) => {
92246
- onopenResolve = resolve4;
92714
+ const onopenPromise = new Promise((resolve5) => {
92715
+ onopenResolve = resolve5;
92247
92716
  });
92248
92717
  const callbacks = params.callbacks;
92249
92718
  const onopenAwaitedCallback = function() {
@@ -95244,7 +95713,7 @@ var safeJSON2 = (text) => {
95244
95713
  return void 0;
95245
95714
  }
95246
95715
  };
95247
- var sleep$1 = (ms) => new Promise((resolve4) => setTimeout(resolve4, ms));
95716
+ var sleep$1 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
95248
95717
  function getDefaultFetch2() {
95249
95718
  if (typeof fetch !== "undefined") {
95250
95719
  return fetch;
@@ -96037,8 +96506,8 @@ async function defaultParseResponse2(client, props) {
96037
96506
  }
96038
96507
  var APIPromise2 = class _APIPromise extends Promise {
96039
96508
  constructor(client, responsePromise, parseResponse2 = defaultParseResponse2) {
96040
- super((resolve4) => {
96041
- resolve4(null);
96509
+ super((resolve5) => {
96510
+ resolve5(null);
96042
96511
  });
96043
96512
  this.responsePromise = responsePromise;
96044
96513
  this.parseResponse = parseResponse2;
@@ -98290,6 +98759,7 @@ function getApiKeyFromEnv() {
98290
98759
  }
98291
98760
 
98292
98761
  // src/providers/gemini-vision.ts
98762
+ init_logger();
98293
98763
  import crypto5 from "crypto";
98294
98764
  var GEMINI_VISION_RATE_PER_MS = 2e-3 / 6e4;
98295
98765
  var GeminiVisionProvider = class {
@@ -98450,9 +98920,9 @@ var GeminiVisionProvider = class {
98450
98920
  }
98451
98921
  }
98452
98922
  query(prompt) {
98453
- return new Promise((resolve4) => {
98923
+ return new Promise((resolve5) => {
98454
98924
  if (!this.connected || !this.session) {
98455
- resolve4("Vision not available \u2014 watcher not connected.");
98925
+ resolve5("Vision not available \u2014 watcher not connected.");
98456
98926
  return;
98457
98927
  }
98458
98928
  const id = crypto5.randomUUID();
@@ -98463,9 +98933,9 @@ var GeminiVisionProvider = class {
98463
98933
  this.responseBuffer = "";
98464
98934
  this.processNextQuery();
98465
98935
  }
98466
- resolve4("Vision analysis timed out.");
98936
+ resolve5("Vision analysis timed out.");
98467
98937
  }, this.queryTimeoutMs);
98468
- this.queryQueue.set(id, { id, prompt, resolve: resolve4, timeout });
98938
+ this.queryQueue.set(id, { id, prompt, resolve: resolve5, timeout });
98469
98939
  this.processNextQuery();
98470
98940
  });
98471
98941
  }
@@ -98492,7 +98962,8 @@ var GeminiVisionProvider = class {
98492
98962
  };
98493
98963
 
98494
98964
  // src/adapters/snapshot-vision.ts
98495
- var log33 = new Logger("snapshot-vision");
98965
+ init_logger();
98966
+ var log34 = new Logger("snapshot-vision");
98496
98967
  var SnapshotVisionAdapter = class {
98497
98968
  constructor(textAdapter) {
98498
98969
  this.textAdapter = textAdapter;
@@ -98510,7 +98981,7 @@ var SnapshotVisionAdapter = class {
98510
98981
  ]);
98511
98982
  return response.content;
98512
98983
  } catch (err) {
98513
- log33.warn("snapshot vision query failed", { err: String(err) });
98984
+ log34.warn("snapshot vision query failed", { err: String(err) });
98514
98985
  return "Vision query failed \u2014 could not analyze the image.";
98515
98986
  }
98516
98987
  }
@@ -98630,41 +99101,43 @@ var CostTracker = class {
98630
99101
  };
98631
99102
 
98632
99103
  // src/server/websocket.ts
98633
- import { existsSync as existsSync9, readdirSync as readdirSync2 } from "fs";
99104
+ import { existsSync as existsSync10, readdirSync as readdirSync2 } from "fs";
98634
99105
  import { join as join7 } from "path";
98635
99106
 
98636
99107
  // src/presence/onnx-wake-detector.ts
98637
- import { existsSync as existsSync8 } from "fs";
99108
+ init_logger();
99109
+ import { existsSync as existsSync9 } from "fs";
98638
99110
  import { join as join6 } from "path";
98639
99111
 
98640
99112
  // src/presence/ort-loader.ts
98641
- var log34 = new Logger("ort-loader");
99113
+ init_logger();
99114
+ var log35 = new Logger("ort-loader");
98642
99115
  var cached2;
98643
99116
  async function loadOrt() {
98644
99117
  if (cached2 !== void 0) return cached2;
98645
99118
  try {
98646
99119
  const mod = await import("onnxruntime-node");
98647
99120
  cached2 = { ort: mod, backend: "native" };
98648
- log34.info("ONNX runtime loaded", { backend: "native" });
99121
+ log35.info("ONNX runtime loaded", { backend: "native" });
98649
99122
  return cached2;
98650
99123
  } catch {
98651
- log34.debug("onnxruntime-node unavailable, trying WASM fallback");
99124
+ log35.debug("onnxruntime-node unavailable, trying WASM fallback");
98652
99125
  }
98653
99126
  try {
98654
99127
  const mod = await import("onnxruntime-web");
98655
99128
  mod.env.wasm.numThreads = 1;
98656
99129
  cached2 = { ort: mod, backend: "wasm" };
98657
- log34.info("ONNX runtime loaded", { backend: "wasm" });
99130
+ log35.info("ONNX runtime loaded", { backend: "wasm" });
98658
99131
  return cached2;
98659
99132
  } catch {
98660
- 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");
98661
99134
  }
98662
99135
  cached2 = null;
98663
99136
  return null;
98664
99137
  }
98665
99138
 
98666
99139
  // src/presence/onnx-wake-detector.ts
98667
- var log35 = new Logger("onnx-wake");
99140
+ var log36 = new Logger("onnx-wake");
98668
99141
  var MODEL_SAMPLE_RATE = 16e3;
98669
99142
  var INPUT_SAMPLE_RATE = 24e3;
98670
99143
  var EMBEDDING_WINDOW = 76;
@@ -98736,7 +99209,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98736
99209
  embedding: embeddingPath,
98737
99210
  classifier: classifierPath
98738
99211
  })) {
98739
- if (!existsSync8(path3)) {
99212
+ if (!existsSync9(path3)) {
98740
99213
  throw new Error(`ONNX ${name} model not found: ${path3}`);
98741
99214
  }
98742
99215
  }
@@ -98750,7 +99223,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98750
99223
  ort.InferenceSession.create(embeddingPath, opts),
98751
99224
  ort.InferenceSession.create(classifierPath, opts)
98752
99225
  ]);
98753
- log35.info("ONNX models loaded", {
99226
+ log36.info("ONNX models loaded", {
98754
99227
  backend,
98755
99228
  mel: melPath,
98756
99229
  embedding: embeddingPath,
@@ -98800,10 +99273,10 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98800
99273
  }
98801
99274
  setAssistantName(name) {
98802
99275
  this.config.assistantName = name;
98803
- log35.info("assistant name updated, reloading classifier", { assistantName: name });
99276
+ log36.info("assistant name updated, reloading classifier", { assistantName: name });
98804
99277
  const classifierPath = join6(this.config.modelsDir, `${name}.onnx`);
98805
- if (!existsSync8(classifierPath)) {
98806
- 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 });
98807
99280
  return;
98808
99281
  }
98809
99282
  const provider = this.backend === "native" ? "cpu" : "wasm";
@@ -98813,7 +99286,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98813
99286
  this.classifierSession = session;
98814
99287
  this.classifierInputName = session.inputNames[0];
98815
99288
  this.classifierOutputName = session.outputNames[0];
98816
- log35.info("classifier reloaded", { name });
99289
+ log36.info("classifier reloaded", { name });
98817
99290
  });
98818
99291
  }
98819
99292
  close() {
@@ -98862,11 +99335,11 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98862
99335
  const score = await this.runPipeline(chunk);
98863
99336
  const isWake = score >= this.threshold;
98864
99337
  if (score > 0.1) {
98865
- log35.debug("inference result", { score: score.toFixed(4), isWake });
99338
+ log36.debug("inference result", { score: score.toFixed(4), isWake });
98866
99339
  }
98867
99340
  this.config.onDebug?.({ score, isWake });
98868
99341
  if (isWake && !this.closed) {
98869
- log35.info("wake word detected via ONNX", { score: score.toFixed(4) });
99342
+ log36.info("wake word detected via ONNX", { score: score.toFixed(4) });
98870
99343
  this.lastDetectionTime = Date.now();
98871
99344
  const chunks = [...this.replayChunks];
98872
99345
  this.replayChunks.length = 0;
@@ -98874,7 +99347,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
98874
99347
  this.config.onWake(chunks);
98875
99348
  }
98876
99349
  } catch (err) {
98877
- log35.error("ONNX inference failed", { err: String(err) });
99350
+ log36.error("ONNX inference failed", { err: String(err) });
98878
99351
  } finally {
98879
99352
  this.inferenceInProgress = false;
98880
99353
  }
@@ -98960,7 +99433,8 @@ function rms(samples) {
98960
99433
  }
98961
99434
 
98962
99435
  // src/presence/presence-manager.ts
98963
- var log36 = new Logger("presence");
99436
+ init_logger();
99437
+ var log37 = new Logger("presence");
98964
99438
  var ACTIVE_IDLE_TIMEOUT_MS = 5 * 6e4;
98965
99439
  var PresenceManager = class {
98966
99440
  _state = "passive";
@@ -99001,7 +99475,7 @@ var PresenceManager = class {
99001
99475
  if (this.idleTimer) clearTimeout(this.idleTimer);
99002
99476
  this.idleTimer = setTimeout(() => {
99003
99477
  if (this._state === "active") {
99004
- log36.info("active idle timeout, going passive");
99478
+ log37.info("active idle timeout, going passive");
99005
99479
  this.enterMode("passive");
99006
99480
  }
99007
99481
  }, ACTIVE_IDLE_TIMEOUT_MS);
@@ -99020,16 +99494,25 @@ var PresenceManager = class {
99020
99494
  if (this._state === newState) return;
99021
99495
  const prev = this._state;
99022
99496
  this._state = newState;
99023
- log36.info("state transition", { from: prev, to: newState });
99497
+ log37.info("state transition", { from: prev, to: newState });
99024
99498
  this.callbacks.onStateChange(newState);
99025
99499
  }
99026
99500
  };
99027
99501
 
99028
99502
  // src/server/websocket.ts
99029
- var log37 = new Logger("server");
99503
+ var log38 = new Logger("server");
99030
99504
  var IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
99031
99505
  var COST_UPDATE_INTERVAL_MS = 3e4;
99032
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
+ }
99033
99516
  function getAvailableWakeWords(modelsDir) {
99034
99517
  try {
99035
99518
  return readdirSync2(modelsDir).filter((f3) => f3.endsWith(".onnx")).map((f3) => f3.replace(".onnx", "")).filter((name) => !INFRA_MODELS.has(name));
@@ -99064,13 +99547,13 @@ function attachWebSocket(httpServer2, services2) {
99064
99547
  if (token && verifyToken(token, authToken)) {
99065
99548
  done(true);
99066
99549
  } else {
99067
- log37.warn("websocket auth rejected");
99550
+ log38.warn("websocket auth rejected");
99068
99551
  done(false, 401, "Unauthorized");
99069
99552
  }
99070
99553
  } : void 0
99071
99554
  });
99072
99555
  wss2.on("connection", (ws) => {
99073
- log37.info("client connected");
99556
+ log38.info("client connected");
99074
99557
  if (ws.readyState === import_websocket.default.OPEN) {
99075
99558
  ws.send(JSON.stringify({ type: "presenceState", state: "passive" }));
99076
99559
  }
@@ -99086,7 +99569,7 @@ function attachWebSocket(httpServer2, services2) {
99086
99569
  }
99087
99570
  const visionProviderLabel = visionRoute ? `${visionRoute.provider}/${visionRoute.model} (${visionRoute.mode})` : "none";
99088
99571
  const sessionIdPromise = store ? store.createSession(voiceProviderLabel, visionProviderLabel).catch((err) => {
99089
- log37.warn("session creation failed", { err: String(err) });
99572
+ log38.warn("session creation failed", { err: String(err) });
99090
99573
  return null;
99091
99574
  }) : Promise.resolve(null);
99092
99575
  const pendingWrites = /* @__PURE__ */ new Set();
@@ -99104,7 +99587,7 @@ function attachWebSocket(httpServer2, services2) {
99104
99587
  await memoryManager.queueExtraction(sid);
99105
99588
  }
99106
99589
  }).catch((err) => {
99107
- log37.warn("extraction failed", { err: String(err) });
99590
+ log38.warn("extraction failed", { err: String(err) });
99108
99591
  });
99109
99592
  pendingCleanups.add(extractionPromise);
99110
99593
  void extractionPromise.finally(() => pendingCleanups.delete(extractionPromise));
@@ -99113,7 +99596,7 @@ function attachWebSocket(httpServer2, services2) {
99113
99596
  function resetIdleTimer() {
99114
99597
  if (idleTimer) clearTimeout(idleTimer);
99115
99598
  idleTimer = setTimeout(() => {
99116
- log37.info("idle timeout, triggering extraction");
99599
+ log38.info("idle timeout, triggering extraction");
99117
99600
  triggerExtraction();
99118
99601
  }, IDLE_TIMEOUT_MS);
99119
99602
  }
@@ -99154,12 +99637,12 @@ function attachWebSocket(httpServer2, services2) {
99154
99637
  cameraWatcher.close();
99155
99638
  cameraWatcher = null;
99156
99639
  costTracker.markVisionInactive("camera");
99157
- log37.info("camera watcher closed");
99640
+ log38.info("camera watcher closed");
99158
99641
  } else if (source === "screen" && screenWatcher) {
99159
99642
  screenWatcher.close();
99160
99643
  screenWatcher = null;
99161
99644
  costTracker.markVisionInactive("screen");
99162
- log37.info("screen watcher closed");
99645
+ log38.info("screen watcher closed");
99163
99646
  }
99164
99647
  }
99165
99648
  const memoryTools = memoryManager ? {
@@ -99218,6 +99701,13 @@ function attachWebSocket(httpServer2, services2) {
99218
99701
  excludeTypes: options?.excludeTypes
99219
99702
  });
99220
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
+ },
99221
99711
  updateTask: async (idOrTitle, payload) => {
99222
99712
  const current = await resolveTask(store, idOrTitle);
99223
99713
  if (!current) return null;
@@ -99256,7 +99746,7 @@ function attachWebSocket(httpServer2, services2) {
99256
99746
  sessionIdPromise.then(async (sid) => {
99257
99747
  if (sid) await store.appendTranscript(sid, "user", text);
99258
99748
  }).catch((err) => {
99259
- log37.warn("transcript write failed", { err: String(err) });
99749
+ log38.warn("transcript write failed", { err: String(err) });
99260
99750
  })
99261
99751
  );
99262
99752
  }
@@ -99271,7 +99761,7 @@ function attachWebSocket(httpServer2, services2) {
99271
99761
  sessionIdPromise.then(async (sid) => {
99272
99762
  if (sid) await store.appendTranscript(sid, "assistant", text);
99273
99763
  }).catch((err) => {
99274
- log37.warn("transcript write failed", { err: String(err) });
99764
+ log38.warn("transcript write failed", { err: String(err) });
99275
99765
  })
99276
99766
  );
99277
99767
  }
@@ -99343,10 +99833,10 @@ function attachWebSocket(httpServer2, services2) {
99343
99833
  const MAX_PENDING_ACTIVATION_AUDIO = 100;
99344
99834
  async function activateVoiceSession(wakeTranscript) {
99345
99835
  if (connectionClosed || session) return;
99346
- log37.info("activating voice session", { wakeTranscript });
99836
+ log38.info("activating voice session", { wakeTranscript });
99347
99837
  extractionTriggered = false;
99348
99838
  let systemPromptPrefix = memoryManager ? await memoryManager.buildSystemPrompt().catch((err) => {
99349
- log37.warn("memory prompt build failed", { err: String(err) });
99839
+ log38.warn("memory prompt build failed", { err: String(err) });
99350
99840
  return void 0;
99351
99841
  }) : void 0;
99352
99842
  if (store) {
@@ -99377,7 +99867,24 @@ function attachWebSocket(httpServer2, services2) {
99377
99867
  skillTools: skillToolHandler ?? void 0,
99378
99868
  workerControl: workerControlHandler ?? void 0,
99379
99869
  systemState: systemStateHandler ?? void 0,
99380
- 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
+ }
99381
99888
  },
99382
99889
  services2.registry
99383
99890
  );
@@ -99391,7 +99898,7 @@ function attachWebSocket(httpServer2, services2) {
99391
99898
  }
99392
99899
  }
99393
99900
  function deactivateVoiceSession() {
99394
- log37.info("deactivating voice session");
99901
+ log38.info("deactivating voice session");
99395
99902
  pendingWakeAudio = null;
99396
99903
  pendingActivationAudio = [];
99397
99904
  pendingText = [];
@@ -99408,13 +99915,13 @@ function attachWebSocket(httpServer2, services2) {
99408
99915
  const melPath = join7(modelsDir, "melspectrogram.onnx");
99409
99916
  const embPath = join7(modelsDir, "embedding_model.onnx");
99410
99917
  const classifierPath = join7(modelsDir, `${config2.assistantName}.onnx`);
99411
- if (!existsSync9(melPath) || !existsSync9(embPath)) {
99412
- 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 });
99413
99920
  return;
99414
99921
  }
99415
- if (!existsSync9(classifierPath)) {
99922
+ if (!existsSync10(classifierPath)) {
99416
99923
  const available = getAvailableWakeWords(modelsDir);
99417
- log37.warn("no wake word model for configured name", {
99924
+ log38.warn("no wake word model for configured name", {
99418
99925
  assistantName: config2.assistantName,
99419
99926
  available
99420
99927
  });
@@ -99429,12 +99936,12 @@ function attachWebSocket(httpServer2, services2) {
99429
99936
  presence.wake("(detected via onnx)");
99430
99937
  },
99431
99938
  onDebug: (info) => {
99432
- log37.debug("onnx wake check", info);
99939
+ log38.debug("onnx wake check", info);
99433
99940
  }
99434
99941
  });
99435
- log37.info("wake word detection active", { assistantName: config2.assistantName });
99942
+ log38.info("wake word detection active", { assistantName: config2.assistantName });
99436
99943
  } catch (err) {
99437
- log37.error("ONNX wake detector failed to start", { err: String(err) });
99944
+ log38.error("ONNX wake detector failed to start", { err: String(err) });
99438
99945
  }
99439
99946
  }
99440
99947
  const presence = new PresenceManager({
@@ -99477,7 +99984,7 @@ function attachWebSocket(httpServer2, services2) {
99477
99984
  if (wakeDetector) {
99478
99985
  wakeDetector.feedAudio(msg.data);
99479
99986
  } else {
99480
- log37.debug("audio received but no wake detector");
99987
+ log38.debug("audio received but no wake detector");
99481
99988
  }
99482
99989
  }
99483
99990
  break;
@@ -99515,17 +100022,17 @@ function attachWebSocket(httpServer2, services2) {
99515
100022
  break;
99516
100023
  case "manualStart":
99517
100024
  if (presence.state === "passive") {
99518
- log37.info("manual session start");
100025
+ log38.info("manual session start");
99519
100026
  presence.enterMode("active");
99520
100027
  }
99521
100028
  break;
99522
100029
  }
99523
100030
  } catch (err) {
99524
- log37.error("bad message", { err: String(err) });
100031
+ log38.error("bad message", { err: String(err) });
99525
100032
  }
99526
100033
  });
99527
100034
  ws.on("close", () => {
99528
- log37.info("client disconnected");
100035
+ log38.info("client disconnected");
99529
100036
  connectionClosed = true;
99530
100037
  connectedClients.delete(ws);
99531
100038
  if (idleTimer) {
@@ -99554,7 +100061,7 @@ function attachWebSocket(httpServer2, services2) {
99554
100061
  }
99555
100062
 
99556
100063
  // src/server/server.ts
99557
- var log38 = new Logger("server");
100064
+ var log39 = new Logger("server");
99558
100065
  var services = await initServices();
99559
100066
  var actualPort = services.config.port;
99560
100067
  var app = createApp(services, () => actualPort);
@@ -99568,14 +100075,14 @@ function startServer(port, maxRetries = 10) {
99568
100075
  wss = attachWebSocket(httpServer, services);
99569
100076
  process.stdout.write(`NEURA_PORT=${port}
99570
100077
  `);
99571
- log38.info(`Neura core server at http://localhost:${port}`);
100078
+ log39.info(`Neura core server at http://localhost:${port}`);
99572
100079
  });
99573
100080
  httpServer.once("error", (err) => {
99574
100081
  if (err.code === "EADDRINUSE" && maxRetries > 0) {
99575
- log38.warn(`port ${port} in use, trying ${port + 1}`);
100082
+ log39.warn(`port ${port} in use, trying ${port + 1}`);
99576
100083
  startServer(port + 1, maxRetries - 1);
99577
100084
  } else {
99578
- log38.error("server failed to start", { err: err.message });
100085
+ log39.error("server failed to start", { err: err.message });
99579
100086
  process.exit(1);
99580
100087
  }
99581
100088
  });
@@ -99586,11 +100093,11 @@ var doShutdown = () => void shutdown(services, httpServer, wss);
99586
100093
  process.on("SIGTERM", doShutdown);
99587
100094
  process.on("SIGINT", doShutdown);
99588
100095
  process.on("uncaughtException", (err) => {
99589
- log38.error("uncaught exception, shutting down", { err: err.message });
100096
+ log39.error("uncaught exception, shutting down", { err: err.message });
99590
100097
  doShutdown();
99591
100098
  });
99592
100099
  process.on("unhandledRejection", (reason) => {
99593
- log38.error("unhandled rejection, shutting down", { err: String(reason) });
100100
+ log39.error("unhandled rejection, shutting down", { err: String(reason) });
99594
100101
  doShutdown();
99595
100102
  });
99596
100103
  /*! Bundled license information: