@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.
- package/core/server.bundled.mjs +970 -463
- package/core/server.bundled.mjs.map +4 -4
- package/core/version.txt +1 -1
- package/dist/service/linux.d.ts.map +1 -1
- package/dist/service/linux.js +1 -0
- package/dist/service/linux.js.map +1 -1
- package/dist/service/macos.d.ts.map +1 -1
- package/dist/service/macos.js +2 -0
- package/dist/service/macos.js.map +1 -1
- package/dist/service/windows.d.ts.map +1 -1
- package/dist/service/windows.js +1 -0
- package/dist/service/windows.js.map +1 -1
- package/package.json +1 -1
- package/skills/orchestrator-worker-control/SKILL.md +51 -2
package/core/server.bundled.mjs
CHANGED
|
@@ -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 (
|
|
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() +
|
|
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,
|
|
2888
|
+
function buildFormatters(level2, bindings, log40) {
|
|
2889
2889
|
return {
|
|
2890
2890
|
level: level2,
|
|
2891
2891
|
bindings,
|
|
2892
|
-
log:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
27868
|
+
var basename4 = path3.basename;
|
|
27404
27869
|
var extname = path3.extname;
|
|
27405
27870
|
var join8 = path3.join;
|
|
27406
|
-
var
|
|
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 =
|
|
27905
|
+
var loc = resolve5(root, name);
|
|
27441
27906
|
var dir = dirname4(loc);
|
|
27442
|
-
var file2 =
|
|
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
|
|
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,
|
|
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
|
|
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 =
|
|
28040
|
+
var name = basename4(filename);
|
|
27576
28041
|
var isQuotedString = TEXT_REGEXP.test(name);
|
|
27577
|
-
var fallbackName = typeof fallback !== "string" ? fallback && getlatin1(name) :
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
28518
|
-
var
|
|
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 ?
|
|
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 =
|
|
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("." +
|
|
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(
|
|
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(
|
|
28742
|
-
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] !==
|
|
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
|
|
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",
|
|
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
|
|
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
|
|
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 && !
|
|
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 ?
|
|
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
|
|
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 =
|
|
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((
|
|
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
|
-
|
|
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((
|
|
32816
|
-
setTimeout(
|
|
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 =
|
|
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
|
|
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((
|
|
33592
|
-
req2.once("response",
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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((
|
|
34248
|
-
reader._closedPromise_resolve =
|
|
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((
|
|
34423
|
-
resolvePromise =
|
|
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((
|
|
34529
|
-
resolvePromise =
|
|
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((
|
|
35549
|
-
resolvePromise =
|
|
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((
|
|
36326
|
+
const promise2 = newPromise((resolve5, reject) => {
|
|
35862
36327
|
stream._pendingAbortRequest = {
|
|
35863
36328
|
_promise: void 0,
|
|
35864
|
-
_resolve:
|
|
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((
|
|
36346
|
+
const promise2 = newPromise((resolve5, reject) => {
|
|
35882
36347
|
const closeRequest = {
|
|
35883
|
-
_resolve:
|
|
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((
|
|
36361
|
+
const promise2 = newPromise((resolve5, reject) => {
|
|
35897
36362
|
const writeRequest = {
|
|
35898
|
-
_resolve:
|
|
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((
|
|
36515
|
-
writer._closedPromise_resolve =
|
|
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((
|
|
36552
|
-
writer._readyPromise_resolve =
|
|
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((
|
|
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
|
-
|
|
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((
|
|
37066
|
-
resolveCancelPromise =
|
|
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((
|
|
37158
|
-
resolveCancelPromise =
|
|
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((
|
|
37939
|
-
startPromise_resolve =
|
|
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((
|
|
38033
|
-
stream._backpressureChangePromise_resolve =
|
|
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((
|
|
38202
|
-
controller._finishPromise_resolve =
|
|
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((
|
|
38229
|
-
controller._finishPromise_resolve =
|
|
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((
|
|
38260
|
-
controller._finishPromise_resolve =
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
})],
|
|
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((
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
40878
|
+
resolve5(response);
|
|
40414
40879
|
});
|
|
40415
40880
|
raw.once("end", () => {
|
|
40416
40881
|
if (!response) {
|
|
40417
40882
|
response = new Response2(body, responseOptions);
|
|
40418
|
-
|
|
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
|
-
|
|
40895
|
+
resolve5(response);
|
|
40431
40896
|
return;
|
|
40432
40897
|
}
|
|
40433
40898
|
response = new Response2(body, responseOptions);
|
|
40434
|
-
|
|
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 =
|
|
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) =>
|
|
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
|
|
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
|
|
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
|
-
|
|
43786
|
+
log40.info("instance request %j", req);
|
|
43322
43787
|
const res = await requestMethod(req);
|
|
43323
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
-
|
|
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((
|
|
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
|
|
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((
|
|
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
|
|
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((
|
|
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
|
|
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
|
|
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((
|
|
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
|
-
|
|
50129
|
+
resolve5(projectId);
|
|
49665
50130
|
return;
|
|
49666
50131
|
} catch (e2) {
|
|
49667
50132
|
}
|
|
49668
50133
|
}
|
|
49669
|
-
|
|
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
|
-
|
|
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((
|
|
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((
|
|
65613
|
-
|
|
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((
|
|
66177
|
-
__classPrivateFieldSet(this, _EventStream_resolveConnectedPromise,
|
|
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((
|
|
66181
|
-
__classPrivateFieldSet(this, _EventStream_resolveEndPromise,
|
|
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((
|
|
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,
|
|
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((
|
|
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((
|
|
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((
|
|
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((
|
|
71654
|
-
this.resolveWait =
|
|
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((
|
|
71768
|
-
this.resolveWait =
|
|
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((
|
|
71873
|
-
this.resolveWait =
|
|
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
|
-
(
|
|
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((
|
|
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((
|
|
77157
|
-
resolveDone =
|
|
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((
|
|
77194
|
-
resolveDone =
|
|
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((
|
|
77249
|
-
worker.idleWaiters.push(
|
|
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
|
-
|
|
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((
|
|
78686
|
+
const answer = await new Promise((resolve5, reject) => {
|
|
78330
78687
|
const pending = {
|
|
78331
78688
|
workerId,
|
|
78332
78689
|
question,
|
|
78333
|
-
resolve:
|
|
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
|
-
|
|
79610
|
+
init_logger();
|
|
79611
|
+
var log29 = new Logger("tool");
|
|
79160
79612
|
async function handleToolCall(name, args, ctx) {
|
|
79161
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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 (
|
|
79326
|
-
|
|
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
|
-
|
|
79788
|
+
log30.info("database initialized", { path: config2.pgDataPath, embeddingDimensions: embDims });
|
|
79334
79789
|
} catch (err) {
|
|
79335
|
-
|
|
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
|
-
|
|
79342
|
-
if (
|
|
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
|
-
|
|
79801
|
+
log30.info("memories restored from backup after corruption", result);
|
|
79347
79802
|
}
|
|
79348
79803
|
}
|
|
79349
79804
|
} catch (retryErr) {
|
|
79350
|
-
|
|
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
|
-
|
|
79825
|
+
log30.info("memory manager initialized");
|
|
79371
79826
|
} catch (err) {
|
|
79372
|
-
|
|
79827
|
+
log30.warn("memory manager disabled \u2014 adapter error", {
|
|
79373
79828
|
err: String(err)
|
|
79374
79829
|
});
|
|
79375
79830
|
}
|
|
79376
79831
|
} else if (store) {
|
|
79377
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
80057
|
+
log30.warn("dispatchForTask failed", { taskId, err: String(err) });
|
|
79598
80058
|
return { error: String(err) };
|
|
79599
80059
|
}
|
|
79600
80060
|
}
|
|
79601
80061
|
};
|
|
79602
|
-
|
|
80062
|
+
log30.info("phase 6 worker runtime ready");
|
|
79603
80063
|
} catch (err) {
|
|
79604
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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) =>
|
|
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) =>
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
80477
|
+
log32.error("parse error", { err: String(err) });
|
|
80014
80478
|
}
|
|
80015
80479
|
});
|
|
80016
80480
|
this.ws.on("error", (err) => {
|
|
80017
|
-
|
|
80481
|
+
log32.error("ws error", { err: err.message });
|
|
80018
80482
|
this.cb.onError(err.message);
|
|
80019
80483
|
});
|
|
80020
80484
|
this.ws.on("close", () => {
|
|
80021
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
85692
|
-
v = o[n](v), settle(
|
|
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(
|
|
86165
|
+
function settle(resolve5, reject, d, v) {
|
|
85697
86166
|
Promise.resolve(v).then(function(v2) {
|
|
85698
|
-
|
|
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((
|
|
92005
|
-
onopenResolve =
|
|
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((
|
|
92246
|
-
onopenResolve =
|
|
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((
|
|
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((
|
|
96041
|
-
|
|
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((
|
|
98923
|
+
return new Promise((resolve5) => {
|
|
98454
98924
|
if (!this.connected || !this.session) {
|
|
98455
|
-
|
|
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
|
-
|
|
98936
|
+
resolve5("Vision analysis timed out.");
|
|
98467
98937
|
}, this.queryTimeoutMs);
|
|
98468
|
-
this.queryQueue.set(id, { id, prompt, resolve:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99121
|
+
log35.info("ONNX runtime loaded", { backend: "native" });
|
|
98649
99122
|
return cached2;
|
|
98650
99123
|
} catch {
|
|
98651
|
-
|
|
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
|
-
|
|
99130
|
+
log35.info("ONNX runtime loaded", { backend: "wasm" });
|
|
98658
99131
|
return cached2;
|
|
98659
99132
|
} catch {
|
|
98660
|
-
|
|
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
|
|
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 (!
|
|
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
|
-
|
|
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
|
-
|
|
99276
|
+
log36.info("assistant name updated, reloading classifier", { assistantName: name });
|
|
98804
99277
|
const classifierPath = join6(this.config.modelsDir, `${name}.onnx`);
|
|
98805
|
-
if (!
|
|
98806
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99836
|
+
log38.info("activating voice session", { wakeTranscript });
|
|
99347
99837
|
extractionTriggered = false;
|
|
99348
99838
|
let systemPromptPrefix = memoryManager ? await memoryManager.buildSystemPrompt().catch((err) => {
|
|
99349
|
-
|
|
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
|
-
|
|
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 (!
|
|
99412
|
-
|
|
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 (!
|
|
99922
|
+
if (!existsSync10(classifierPath)) {
|
|
99416
99923
|
const available = getAvailableWakeWords(modelsDir);
|
|
99417
|
-
|
|
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
|
-
|
|
99939
|
+
log38.debug("onnx wake check", info);
|
|
99433
99940
|
}
|
|
99434
99941
|
});
|
|
99435
|
-
|
|
99942
|
+
log38.info("wake word detection active", { assistantName: config2.assistantName });
|
|
99436
99943
|
} catch (err) {
|
|
99437
|
-
|
|
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
|
-
|
|
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
|
-
|
|
100025
|
+
log38.info("manual session start");
|
|
99519
100026
|
presence.enterMode("active");
|
|
99520
100027
|
}
|
|
99521
100028
|
break;
|
|
99522
100029
|
}
|
|
99523
100030
|
} catch (err) {
|
|
99524
|
-
|
|
100031
|
+
log38.error("bad message", { err: String(err) });
|
|
99525
100032
|
}
|
|
99526
100033
|
});
|
|
99527
100034
|
ws.on("close", () => {
|
|
99528
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
100082
|
+
log39.warn(`port ${port} in use, trying ${port + 1}`);
|
|
99576
100083
|
startServer(port + 1, maxRetries - 1);
|
|
99577
100084
|
} else {
|
|
99578
|
-
|
|
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
|
-
|
|
100096
|
+
log39.error("uncaught exception, shutting down", { err: err.message });
|
|
99590
100097
|
doShutdown();
|
|
99591
100098
|
});
|
|
99592
100099
|
process.on("unhandledRejection", (reason) => {
|
|
99593
|
-
|
|
100100
|
+
log39.error("unhandled rejection, shutting down", { err: String(reason) });
|
|
99594
100101
|
doShutdown();
|
|
99595
100102
|
});
|
|
99596
100103
|
/*! Bundled license information:
|