@mclean-capital/neura 3.5.4 → 3.6.1
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 +1039 -500
- 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
|
|
@@ -80104,16 +80568,16 @@ ${context}
|
|
|
80104
80568
|
this.turnAudioChunks = 0;
|
|
80105
80569
|
this.turnAudioBytes = 0;
|
|
80106
80570
|
this.cb.onTurnComplete();
|
|
80107
|
-
const
|
|
80571
|
+
const res = msg.response;
|
|
80572
|
+
const outputItems = Array.isArray(res?.output) ? res.output : [];
|
|
80108
80573
|
const fullParts = [];
|
|
80109
|
-
|
|
80110
|
-
|
|
80111
|
-
|
|
80112
|
-
|
|
80113
|
-
|
|
80114
|
-
|
|
80115
|
-
|
|
80116
|
-
}
|
|
80574
|
+
for (const item of outputItems) {
|
|
80575
|
+
const it = item;
|
|
80576
|
+
if (it.type === "message" && Array.isArray(it.content)) {
|
|
80577
|
+
for (const part of it.content) {
|
|
80578
|
+
if (part.transcript) {
|
|
80579
|
+
this.pushTranscript("assistant", part.transcript);
|
|
80580
|
+
fullParts.push(part.transcript);
|
|
80117
80581
|
}
|
|
80118
80582
|
}
|
|
80119
80583
|
}
|
|
@@ -80121,52 +80585,85 @@ ${context}
|
|
|
80121
80585
|
if (fullParts.length > 0) {
|
|
80122
80586
|
this.cb.onOutputTranscriptComplete(fullParts.join(""));
|
|
80123
80587
|
}
|
|
80588
|
+
if (res?.status === "completed") {
|
|
80589
|
+
void this.dispatchFunctionCalls(outputItems);
|
|
80590
|
+
}
|
|
80124
80591
|
break;
|
|
80125
80592
|
}
|
|
80126
|
-
case "response.function_call_arguments.done":
|
|
80127
|
-
void this.handleFunctionCallDone(msg);
|
|
80128
|
-
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
|
}
|
|
80134
80598
|
}
|
|
80135
|
-
|
|
80136
|
-
|
|
80137
|
-
|
|
80138
|
-
|
|
80139
|
-
|
|
80140
|
-
|
|
80141
|
-
|
|
80142
|
-
|
|
80143
|
-
|
|
80144
|
-
|
|
80145
|
-
|
|
80146
|
-
|
|
80147
|
-
|
|
80148
|
-
|
|
80149
|
-
|
|
80150
|
-
|
|
80151
|
-
|
|
80152
|
-
|
|
80153
|
-
|
|
80154
|
-
|
|
80599
|
+
/**
|
|
80600
|
+
* Execute every `function_call` item from a completed `response.done`
|
|
80601
|
+
* payload in parallel, post their outputs in original `output_index`
|
|
80602
|
+
* order, then fire exactly one `response.create` so the model sees the
|
|
80603
|
+
* full batch as a single follow-up turn.
|
|
80604
|
+
*
|
|
80605
|
+
* Authoritative source: `response.output`. We intentionally do NOT
|
|
80606
|
+
* buffer `response.function_call_arguments.done` deltas; `response.done`
|
|
80607
|
+
* carries the finalized list and is the only shape we trust — see the
|
|
80608
|
+
* Codex review cited in the corresponding commit.
|
|
80609
|
+
*/
|
|
80610
|
+
async dispatchFunctionCalls(outputItems) {
|
|
80611
|
+
const calls = [];
|
|
80612
|
+
outputItems.forEach((item, idx) => {
|
|
80613
|
+
const it = item;
|
|
80614
|
+
if (it.type !== "function_call" || !it.call_id || typeof it.name !== "string") return;
|
|
80615
|
+
let parsed = {};
|
|
80616
|
+
try {
|
|
80617
|
+
parsed = JSON.parse(it.arguments ?? "{}");
|
|
80618
|
+
} catch {
|
|
80619
|
+
}
|
|
80620
|
+
calls.push({ callId: it.call_id, name: it.name, args: parsed, outputIndex: idx });
|
|
80155
80621
|
});
|
|
80156
|
-
|
|
80157
|
-
|
|
80622
|
+
const seen = /* @__PURE__ */ new Set();
|
|
80623
|
+
const unique = calls.filter((c) => {
|
|
80624
|
+
if (seen.has(c.callId)) return false;
|
|
80625
|
+
seen.add(c.callId);
|
|
80626
|
+
return true;
|
|
80627
|
+
});
|
|
80628
|
+
if (unique.length === 0) return;
|
|
80629
|
+
const currentWs = this.ws;
|
|
80630
|
+
const outcomes = [];
|
|
80631
|
+
for (const c of unique) {
|
|
80632
|
+
this.cb.onToolCall(c.name, c.args);
|
|
80633
|
+
try {
|
|
80634
|
+
const result = await handleToolCall(c.name, c.args, {
|
|
80635
|
+
queryWatcher: this.cb.queryWatcher,
|
|
80636
|
+
memoryTools: this.config.memoryTools,
|
|
80637
|
+
enterMode: this.config.enterMode,
|
|
80638
|
+
taskTools: this.config.taskTools,
|
|
80639
|
+
skillTools: this.config.skillTools,
|
|
80640
|
+
workerControl: this.config.workerControl,
|
|
80641
|
+
workerDispatch: this.config.workerDispatch,
|
|
80642
|
+
systemState: this.config.systemState,
|
|
80643
|
+
workerLogs: this.config.workerLogs
|
|
80644
|
+
});
|
|
80645
|
+
this.cb.onToolResult(c.name, result);
|
|
80646
|
+
outcomes.push({ callId: c.callId, result, outputIndex: c.outputIndex });
|
|
80647
|
+
} catch (err) {
|
|
80648
|
+
const errorResult = { error: `Tool ${c.name} failed: ${String(err)}` };
|
|
80649
|
+
this.cb.onToolResult(c.name, errorResult);
|
|
80650
|
+
outcomes.push({ callId: c.callId, result: errorResult, outputIndex: c.outputIndex });
|
|
80651
|
+
}
|
|
80652
|
+
}
|
|
80653
|
+
if (!currentWs || currentWs !== this.ws || currentWs.readyState !== wrapper_default.OPEN) return;
|
|
80654
|
+
outcomes.sort((a, b) => a.outputIndex - b.outputIndex).forEach((o) => {
|
|
80158
80655
|
currentWs.send(
|
|
80159
80656
|
JSON.stringify({
|
|
80160
80657
|
type: "conversation.item.create",
|
|
80161
80658
|
item: {
|
|
80162
80659
|
type: "function_call_output",
|
|
80163
|
-
call_id: callId,
|
|
80164
|
-
output: JSON.stringify(result)
|
|
80660
|
+
call_id: o.callId,
|
|
80661
|
+
output: JSON.stringify(o.result)
|
|
80165
80662
|
}
|
|
80166
80663
|
})
|
|
80167
80664
|
);
|
|
80168
|
-
|
|
80169
|
-
}
|
|
80665
|
+
});
|
|
80666
|
+
currentWs.send(JSON.stringify({ type: "response.create" }));
|
|
80170
80667
|
}
|
|
80171
80668
|
sendAudio(base643) {
|
|
80172
80669
|
if (this.ws?.readyState === wrapper_default.OPEN) {
|
|
@@ -80227,12 +80724,12 @@ ${context}
|
|
|
80227
80724
|
*/
|
|
80228
80725
|
interject(message, options) {
|
|
80229
80726
|
if (this.ws?.readyState !== wrapper_default.OPEN) {
|
|
80230
|
-
|
|
80727
|
+
log32.warn("interject called with no active ws", { preview: message.slice(0, 80) });
|
|
80231
80728
|
return Promise.resolve();
|
|
80232
80729
|
}
|
|
80233
80730
|
const now = Date.now();
|
|
80234
80731
|
if (!options.bypassRateLimit && now - this.lastInterjectAt < this.minInterjectIntervalMs) {
|
|
80235
|
-
|
|
80732
|
+
log32.info("interject rate-limited, dropping", {
|
|
80236
80733
|
preview: message.slice(0, 80),
|
|
80237
80734
|
msSinceLast: now - this.lastInterjectAt
|
|
80238
80735
|
});
|
|
@@ -80270,7 +80767,8 @@ ${context}
|
|
|
80270
80767
|
};
|
|
80271
80768
|
|
|
80272
80769
|
// src/providers/pipeline-voice.ts
|
|
80273
|
-
|
|
80770
|
+
init_logger();
|
|
80771
|
+
var log33 = new Logger("pipeline-voice");
|
|
80274
80772
|
var MAX_TRANSCRIPT_HISTORY = 40;
|
|
80275
80773
|
var MIN_INTERJECT_INTERVAL_MS = 1e4;
|
|
80276
80774
|
var SENTENCE_FLUSH_CHARS = 200;
|
|
@@ -80302,7 +80800,8 @@ var PipelineVoiceProvider = class {
|
|
|
80302
80800
|
includePresence: !!config2.enterMode,
|
|
80303
80801
|
includeTasks: !!config2.taskTools,
|
|
80304
80802
|
includeSkills: !!config2.skillTools,
|
|
80305
|
-
includeWorkerControl: !!config2.workerControl
|
|
80803
|
+
includeWorkerControl: !!config2.workerControl,
|
|
80804
|
+
includeLogs: !!config2.workerLogs
|
|
80306
80805
|
});
|
|
80307
80806
|
this.toolCtx = {
|
|
80308
80807
|
queryWatcher: cb.queryWatcher,
|
|
@@ -80312,7 +80811,8 @@ var PipelineVoiceProvider = class {
|
|
|
80312
80811
|
skillTools: config2.skillTools,
|
|
80313
80812
|
workerControl: config2.workerControl,
|
|
80314
80813
|
workerDispatch: config2.workerDispatch,
|
|
80315
|
-
systemState: config2.systemState
|
|
80814
|
+
systemState: config2.systemState,
|
|
80815
|
+
workerLogs: config2.workerLogs
|
|
80316
80816
|
};
|
|
80317
80817
|
}
|
|
80318
80818
|
// ─── VoiceProvider interface ─────────────────────────────────
|
|
@@ -80321,7 +80821,7 @@ var PipelineVoiceProvider = class {
|
|
|
80321
80821
|
this.connected = true;
|
|
80322
80822
|
this.sttStream = this.sttAdapter.createStream("pcm16");
|
|
80323
80823
|
this.sttStream.on("error", (err) => {
|
|
80324
|
-
|
|
80824
|
+
log33.warn("STT stream error", { err: err.message });
|
|
80325
80825
|
this.cb.onError(`STT error: ${err.message}`);
|
|
80326
80826
|
void this.reconnectSTT();
|
|
80327
80827
|
});
|
|
@@ -80357,12 +80857,12 @@ var PipelineVoiceProvider = class {
|
|
|
80357
80857
|
// ─── VoiceInterjector interface ──────────────────────────────
|
|
80358
80858
|
async interject(message, options) {
|
|
80359
80859
|
if (this.closed || !this.connected) {
|
|
80360
|
-
|
|
80860
|
+
log33.warn("interject called while closed", { preview: message.slice(0, 80) });
|
|
80361
80861
|
return;
|
|
80362
80862
|
}
|
|
80363
80863
|
const now = Date.now();
|
|
80364
80864
|
if (!options.bypassRateLimit && now - this.lastInterjectAt < MIN_INTERJECT_INTERVAL_MS) {
|
|
80365
|
-
|
|
80865
|
+
log33.info("interject rate-limited", { preview: message.slice(0, 80) });
|
|
80366
80866
|
return;
|
|
80367
80867
|
}
|
|
80368
80868
|
this.lastInterjectAt = now;
|
|
@@ -80384,7 +80884,7 @@ var PipelineVoiceProvider = class {
|
|
|
80384
80884
|
}
|
|
80385
80885
|
} catch (err) {
|
|
80386
80886
|
if (!signal.aborted) {
|
|
80387
|
-
|
|
80887
|
+
log33.warn("interject TTS failed", { err: String(err) });
|
|
80388
80888
|
}
|
|
80389
80889
|
}
|
|
80390
80890
|
}
|
|
@@ -80413,7 +80913,7 @@ var PipelineVoiceProvider = class {
|
|
|
80413
80913
|
}
|
|
80414
80914
|
} catch (err) {
|
|
80415
80915
|
if (!this.closed) {
|
|
80416
|
-
|
|
80916
|
+
log33.warn("STT loop error", { err: String(err) });
|
|
80417
80917
|
this.cb.onError(`STT loop error: ${String(err)}`);
|
|
80418
80918
|
void this.reconnectSTT();
|
|
80419
80919
|
}
|
|
@@ -80424,18 +80924,18 @@ var PipelineVoiceProvider = class {
|
|
|
80424
80924
|
// ─── Internal: STT reconnection ──────────────────────────────
|
|
80425
80925
|
reconnectSTT() {
|
|
80426
80926
|
if (this.closed) return;
|
|
80427
|
-
|
|
80927
|
+
log33.info("attempting STT reconnection");
|
|
80428
80928
|
try {
|
|
80429
80929
|
this.sttStream?.abort();
|
|
80430
80930
|
this.sttStream = this.sttAdapter.createStream("pcm16");
|
|
80431
80931
|
this.sttStream.on("error", (err) => {
|
|
80432
|
-
|
|
80932
|
+
log33.warn("STT stream error after reconnect", { err: err.message });
|
|
80433
80933
|
this.cb.onError(`STT error: ${err.message}`);
|
|
80434
80934
|
});
|
|
80435
80935
|
void this.runSTTLoop();
|
|
80436
80936
|
this.cb.onReconnected();
|
|
80437
80937
|
} catch (err) {
|
|
80438
|
-
|
|
80938
|
+
log33.warn("STT reconnection failed", { err: String(err) });
|
|
80439
80939
|
this.cb.onError("STT reconnection failed");
|
|
80440
80940
|
}
|
|
80441
80941
|
}
|
|
@@ -80449,7 +80949,7 @@ var PipelineVoiceProvider = class {
|
|
|
80449
80949
|
const signal = this.currentTurnAbort.signal;
|
|
80450
80950
|
void this.processUserUtterance(text, signal).catch((err) => {
|
|
80451
80951
|
if (!signal.aborted) {
|
|
80452
|
-
|
|
80952
|
+
log33.warn("turn processing failed", { err: String(err) });
|
|
80453
80953
|
this.cb.onError(`Processing error: ${String(err)}`);
|
|
80454
80954
|
}
|
|
80455
80955
|
});
|
|
@@ -80573,7 +81073,7 @@ var PipelineVoiceProvider = class {
|
|
|
80573
81073
|
}
|
|
80574
81074
|
} catch (err) {
|
|
80575
81075
|
if (!signal.aborted) {
|
|
80576
|
-
|
|
81076
|
+
log33.warn("TTS synthesis failed", { err: String(err), text: text.slice(0, 40) });
|
|
80577
81077
|
}
|
|
80578
81078
|
}
|
|
80579
81079
|
}
|
|
@@ -80638,7 +81138,8 @@ function createVoiceSession(cb, config2 = {}, registry2) {
|
|
|
80638
81138
|
skillTools: config2.skillTools,
|
|
80639
81139
|
workerControl: config2.workerControl,
|
|
80640
81140
|
workerDispatch: config2.workerDispatch,
|
|
80641
|
-
systemState: config2.systemState
|
|
81141
|
+
systemState: config2.systemState,
|
|
81142
|
+
workerLogs: config2.workerLogs
|
|
80642
81143
|
};
|
|
80643
81144
|
return new PipelineVoiceProvider(cb, pipelineConfig, llmAdapter, sttAdapter, ttsAdapter);
|
|
80644
81145
|
}
|
|
@@ -85688,14 +86189,14 @@ function __asyncValues(o) {
|
|
|
85688
86189
|
}, i2);
|
|
85689
86190
|
function verb(n) {
|
|
85690
86191
|
i2[n] = o[n] && function(v) {
|
|
85691
|
-
return new Promise(function(
|
|
85692
|
-
v = o[n](v), settle(
|
|
86192
|
+
return new Promise(function(resolve5, reject) {
|
|
86193
|
+
v = o[n](v), settle(resolve5, reject, v.done, v.value);
|
|
85693
86194
|
});
|
|
85694
86195
|
};
|
|
85695
86196
|
}
|
|
85696
|
-
function settle(
|
|
86197
|
+
function settle(resolve5, reject, d, v) {
|
|
85697
86198
|
Promise.resolve(v).then(function(v2) {
|
|
85698
|
-
|
|
86199
|
+
resolve5({ value: v2, done: d });
|
|
85699
86200
|
}, reject);
|
|
85700
86201
|
}
|
|
85701
86202
|
}
|
|
@@ -92001,8 +92502,8 @@ var LiveMusic = class {
|
|
|
92001
92502
|
const url2 = `${websocketBaseUrl}/ws/google.ai.generativelanguage.${apiVersion}.GenerativeService.BidiGenerateMusic?key=${apiKey}`;
|
|
92002
92503
|
let onopenResolve = () => {
|
|
92003
92504
|
};
|
|
92004
|
-
const onopenPromise = new Promise((
|
|
92005
|
-
onopenResolve =
|
|
92505
|
+
const onopenPromise = new Promise((resolve5) => {
|
|
92506
|
+
onopenResolve = resolve5;
|
|
92006
92507
|
});
|
|
92007
92508
|
const callbacks = params.callbacks;
|
|
92008
92509
|
const onopenAwaitedCallback = function() {
|
|
@@ -92242,8 +92743,8 @@ var Live = class {
|
|
|
92242
92743
|
}
|
|
92243
92744
|
let onopenResolve = () => {
|
|
92244
92745
|
};
|
|
92245
|
-
const onopenPromise = new Promise((
|
|
92246
|
-
onopenResolve =
|
|
92746
|
+
const onopenPromise = new Promise((resolve5) => {
|
|
92747
|
+
onopenResolve = resolve5;
|
|
92247
92748
|
});
|
|
92248
92749
|
const callbacks = params.callbacks;
|
|
92249
92750
|
const onopenAwaitedCallback = function() {
|
|
@@ -95244,7 +95745,7 @@ var safeJSON2 = (text) => {
|
|
|
95244
95745
|
return void 0;
|
|
95245
95746
|
}
|
|
95246
95747
|
};
|
|
95247
|
-
var sleep$1 = (ms) => new Promise((
|
|
95748
|
+
var sleep$1 = (ms) => new Promise((resolve5) => setTimeout(resolve5, ms));
|
|
95248
95749
|
function getDefaultFetch2() {
|
|
95249
95750
|
if (typeof fetch !== "undefined") {
|
|
95250
95751
|
return fetch;
|
|
@@ -96037,8 +96538,8 @@ async function defaultParseResponse2(client, props) {
|
|
|
96037
96538
|
}
|
|
96038
96539
|
var APIPromise2 = class _APIPromise extends Promise {
|
|
96039
96540
|
constructor(client, responsePromise, parseResponse2 = defaultParseResponse2) {
|
|
96040
|
-
super((
|
|
96041
|
-
|
|
96541
|
+
super((resolve5) => {
|
|
96542
|
+
resolve5(null);
|
|
96042
96543
|
});
|
|
96043
96544
|
this.responsePromise = responsePromise;
|
|
96044
96545
|
this.parseResponse = parseResponse2;
|
|
@@ -98290,6 +98791,7 @@ function getApiKeyFromEnv() {
|
|
|
98290
98791
|
}
|
|
98291
98792
|
|
|
98292
98793
|
// src/providers/gemini-vision.ts
|
|
98794
|
+
init_logger();
|
|
98293
98795
|
import crypto5 from "crypto";
|
|
98294
98796
|
var GEMINI_VISION_RATE_PER_MS = 2e-3 / 6e4;
|
|
98295
98797
|
var GeminiVisionProvider = class {
|
|
@@ -98450,9 +98952,9 @@ var GeminiVisionProvider = class {
|
|
|
98450
98952
|
}
|
|
98451
98953
|
}
|
|
98452
98954
|
query(prompt) {
|
|
98453
|
-
return new Promise((
|
|
98955
|
+
return new Promise((resolve5) => {
|
|
98454
98956
|
if (!this.connected || !this.session) {
|
|
98455
|
-
|
|
98957
|
+
resolve5("Vision not available \u2014 watcher not connected.");
|
|
98456
98958
|
return;
|
|
98457
98959
|
}
|
|
98458
98960
|
const id = crypto5.randomUUID();
|
|
@@ -98463,9 +98965,9 @@ var GeminiVisionProvider = class {
|
|
|
98463
98965
|
this.responseBuffer = "";
|
|
98464
98966
|
this.processNextQuery();
|
|
98465
98967
|
}
|
|
98466
|
-
|
|
98968
|
+
resolve5("Vision analysis timed out.");
|
|
98467
98969
|
}, this.queryTimeoutMs);
|
|
98468
|
-
this.queryQueue.set(id, { id, prompt, resolve:
|
|
98970
|
+
this.queryQueue.set(id, { id, prompt, resolve: resolve5, timeout });
|
|
98469
98971
|
this.processNextQuery();
|
|
98470
98972
|
});
|
|
98471
98973
|
}
|
|
@@ -98492,7 +98994,8 @@ var GeminiVisionProvider = class {
|
|
|
98492
98994
|
};
|
|
98493
98995
|
|
|
98494
98996
|
// src/adapters/snapshot-vision.ts
|
|
98495
|
-
|
|
98997
|
+
init_logger();
|
|
98998
|
+
var log34 = new Logger("snapshot-vision");
|
|
98496
98999
|
var SnapshotVisionAdapter = class {
|
|
98497
99000
|
constructor(textAdapter) {
|
|
98498
99001
|
this.textAdapter = textAdapter;
|
|
@@ -98510,7 +99013,7 @@ var SnapshotVisionAdapter = class {
|
|
|
98510
99013
|
]);
|
|
98511
99014
|
return response.content;
|
|
98512
99015
|
} catch (err) {
|
|
98513
|
-
|
|
99016
|
+
log34.warn("snapshot vision query failed", { err: String(err) });
|
|
98514
99017
|
return "Vision query failed \u2014 could not analyze the image.";
|
|
98515
99018
|
}
|
|
98516
99019
|
}
|
|
@@ -98630,41 +99133,43 @@ var CostTracker = class {
|
|
|
98630
99133
|
};
|
|
98631
99134
|
|
|
98632
99135
|
// src/server/websocket.ts
|
|
98633
|
-
import { existsSync as
|
|
99136
|
+
import { existsSync as existsSync10, readdirSync as readdirSync2 } from "fs";
|
|
98634
99137
|
import { join as join7 } from "path";
|
|
98635
99138
|
|
|
98636
99139
|
// src/presence/onnx-wake-detector.ts
|
|
98637
|
-
|
|
99140
|
+
init_logger();
|
|
99141
|
+
import { existsSync as existsSync9 } from "fs";
|
|
98638
99142
|
import { join as join6 } from "path";
|
|
98639
99143
|
|
|
98640
99144
|
// src/presence/ort-loader.ts
|
|
98641
|
-
|
|
99145
|
+
init_logger();
|
|
99146
|
+
var log35 = new Logger("ort-loader");
|
|
98642
99147
|
var cached2;
|
|
98643
99148
|
async function loadOrt() {
|
|
98644
99149
|
if (cached2 !== void 0) return cached2;
|
|
98645
99150
|
try {
|
|
98646
99151
|
const mod = await import("onnxruntime-node");
|
|
98647
99152
|
cached2 = { ort: mod, backend: "native" };
|
|
98648
|
-
|
|
99153
|
+
log35.info("ONNX runtime loaded", { backend: "native" });
|
|
98649
99154
|
return cached2;
|
|
98650
99155
|
} catch {
|
|
98651
|
-
|
|
99156
|
+
log35.debug("onnxruntime-node unavailable, trying WASM fallback");
|
|
98652
99157
|
}
|
|
98653
99158
|
try {
|
|
98654
99159
|
const mod = await import("onnxruntime-web");
|
|
98655
99160
|
mod.env.wasm.numThreads = 1;
|
|
98656
99161
|
cached2 = { ort: mod, backend: "wasm" };
|
|
98657
|
-
|
|
99162
|
+
log35.info("ONNX runtime loaded", { backend: "wasm" });
|
|
98658
99163
|
return cached2;
|
|
98659
99164
|
} catch {
|
|
98660
|
-
|
|
99165
|
+
log35.warn("no ONNX runtime available \u2014 wake word detection will be disabled");
|
|
98661
99166
|
}
|
|
98662
99167
|
cached2 = null;
|
|
98663
99168
|
return null;
|
|
98664
99169
|
}
|
|
98665
99170
|
|
|
98666
99171
|
// src/presence/onnx-wake-detector.ts
|
|
98667
|
-
var
|
|
99172
|
+
var log36 = new Logger("onnx-wake");
|
|
98668
99173
|
var MODEL_SAMPLE_RATE = 16e3;
|
|
98669
99174
|
var INPUT_SAMPLE_RATE = 24e3;
|
|
98670
99175
|
var EMBEDDING_WINDOW = 76;
|
|
@@ -98736,7 +99241,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
|
|
|
98736
99241
|
embedding: embeddingPath,
|
|
98737
99242
|
classifier: classifierPath
|
|
98738
99243
|
})) {
|
|
98739
|
-
if (!
|
|
99244
|
+
if (!existsSync9(path3)) {
|
|
98740
99245
|
throw new Error(`ONNX ${name} model not found: ${path3}`);
|
|
98741
99246
|
}
|
|
98742
99247
|
}
|
|
@@ -98750,7 +99255,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
|
|
|
98750
99255
|
ort.InferenceSession.create(embeddingPath, opts),
|
|
98751
99256
|
ort.InferenceSession.create(classifierPath, opts)
|
|
98752
99257
|
]);
|
|
98753
|
-
|
|
99258
|
+
log36.info("ONNX models loaded", {
|
|
98754
99259
|
backend,
|
|
98755
99260
|
mel: melPath,
|
|
98756
99261
|
embedding: embeddingPath,
|
|
@@ -98800,10 +99305,10 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
|
|
|
98800
99305
|
}
|
|
98801
99306
|
setAssistantName(name) {
|
|
98802
99307
|
this.config.assistantName = name;
|
|
98803
|
-
|
|
99308
|
+
log36.info("assistant name updated, reloading classifier", { assistantName: name });
|
|
98804
99309
|
const classifierPath = join6(this.config.modelsDir, `${name}.onnx`);
|
|
98805
|
-
if (!
|
|
98806
|
-
|
|
99310
|
+
if (!existsSync9(classifierPath)) {
|
|
99311
|
+
log36.warn("no ONNX classifier for new name", { name, path: classifierPath });
|
|
98807
99312
|
return;
|
|
98808
99313
|
}
|
|
98809
99314
|
const provider = this.backend === "native" ? "cpu" : "wasm";
|
|
@@ -98813,7 +99318,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
|
|
|
98813
99318
|
this.classifierSession = session;
|
|
98814
99319
|
this.classifierInputName = session.inputNames[0];
|
|
98815
99320
|
this.classifierOutputName = session.outputNames[0];
|
|
98816
|
-
|
|
99321
|
+
log36.info("classifier reloaded", { name });
|
|
98817
99322
|
});
|
|
98818
99323
|
}
|
|
98819
99324
|
close() {
|
|
@@ -98862,11 +99367,11 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
|
|
|
98862
99367
|
const score = await this.runPipeline(chunk);
|
|
98863
99368
|
const isWake = score >= this.threshold;
|
|
98864
99369
|
if (score > 0.1) {
|
|
98865
|
-
|
|
99370
|
+
log36.debug("inference result", { score: score.toFixed(4), isWake });
|
|
98866
99371
|
}
|
|
98867
99372
|
this.config.onDebug?.({ score, isWake });
|
|
98868
99373
|
if (isWake && !this.closed) {
|
|
98869
|
-
|
|
99374
|
+
log36.info("wake word detected via ONNX", { score: score.toFixed(4) });
|
|
98870
99375
|
this.lastDetectionTime = Date.now();
|
|
98871
99376
|
const chunks = [...this.replayChunks];
|
|
98872
99377
|
this.replayChunks.length = 0;
|
|
@@ -98874,7 +99379,7 @@ var OnnxWakeDetector = class _OnnxWakeDetector {
|
|
|
98874
99379
|
this.config.onWake(chunks);
|
|
98875
99380
|
}
|
|
98876
99381
|
} catch (err) {
|
|
98877
|
-
|
|
99382
|
+
log36.error("ONNX inference failed", { err: String(err) });
|
|
98878
99383
|
} finally {
|
|
98879
99384
|
this.inferenceInProgress = false;
|
|
98880
99385
|
}
|
|
@@ -98960,7 +99465,8 @@ function rms(samples) {
|
|
|
98960
99465
|
}
|
|
98961
99466
|
|
|
98962
99467
|
// src/presence/presence-manager.ts
|
|
98963
|
-
|
|
99468
|
+
init_logger();
|
|
99469
|
+
var log37 = new Logger("presence");
|
|
98964
99470
|
var ACTIVE_IDLE_TIMEOUT_MS = 5 * 6e4;
|
|
98965
99471
|
var PresenceManager = class {
|
|
98966
99472
|
_state = "passive";
|
|
@@ -99001,7 +99507,7 @@ var PresenceManager = class {
|
|
|
99001
99507
|
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
99002
99508
|
this.idleTimer = setTimeout(() => {
|
|
99003
99509
|
if (this._state === "active") {
|
|
99004
|
-
|
|
99510
|
+
log37.info("active idle timeout, going passive");
|
|
99005
99511
|
this.enterMode("passive");
|
|
99006
99512
|
}
|
|
99007
99513
|
}, ACTIVE_IDLE_TIMEOUT_MS);
|
|
@@ -99020,16 +99526,25 @@ var PresenceManager = class {
|
|
|
99020
99526
|
if (this._state === newState) return;
|
|
99021
99527
|
const prev = this._state;
|
|
99022
99528
|
this._state = newState;
|
|
99023
|
-
|
|
99529
|
+
log37.info("state transition", { from: prev, to: newState });
|
|
99024
99530
|
this.callbacks.onStateChange(newState);
|
|
99025
99531
|
}
|
|
99026
99532
|
};
|
|
99027
99533
|
|
|
99028
99534
|
// src/server/websocket.ts
|
|
99029
|
-
var
|
|
99535
|
+
var log38 = new Logger("server");
|
|
99030
99536
|
var IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
99031
99537
|
var COST_UPDATE_INTERVAL_MS = 3e4;
|
|
99032
99538
|
var INFRA_MODELS = /* @__PURE__ */ new Set(["melspectrogram", "embedding_model"]);
|
|
99539
|
+
function buildSource(options) {
|
|
99540
|
+
if (options.source === "session") {
|
|
99541
|
+
if (!options.sessionFile) {
|
|
99542
|
+
throw new Error("read_log with source='session' requires session_file");
|
|
99543
|
+
}
|
|
99544
|
+
return { kind: "session", sessionFile: options.sessionFile };
|
|
99545
|
+
}
|
|
99546
|
+
return { kind: "core" };
|
|
99547
|
+
}
|
|
99033
99548
|
function getAvailableWakeWords(modelsDir) {
|
|
99034
99549
|
try {
|
|
99035
99550
|
return readdirSync2(modelsDir).filter((f3) => f3.endsWith(".onnx")).map((f3) => f3.replace(".onnx", "")).filter((name) => !INFRA_MODELS.has(name));
|
|
@@ -99064,13 +99579,13 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99064
99579
|
if (token && verifyToken(token, authToken)) {
|
|
99065
99580
|
done(true);
|
|
99066
99581
|
} else {
|
|
99067
|
-
|
|
99582
|
+
log38.warn("websocket auth rejected");
|
|
99068
99583
|
done(false, 401, "Unauthorized");
|
|
99069
99584
|
}
|
|
99070
99585
|
} : void 0
|
|
99071
99586
|
});
|
|
99072
99587
|
wss2.on("connection", (ws) => {
|
|
99073
|
-
|
|
99588
|
+
log38.info("client connected");
|
|
99074
99589
|
if (ws.readyState === import_websocket.default.OPEN) {
|
|
99075
99590
|
ws.send(JSON.stringify({ type: "presenceState", state: "passive" }));
|
|
99076
99591
|
}
|
|
@@ -99086,7 +99601,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99086
99601
|
}
|
|
99087
99602
|
const visionProviderLabel = visionRoute ? `${visionRoute.provider}/${visionRoute.model} (${visionRoute.mode})` : "none";
|
|
99088
99603
|
const sessionIdPromise = store ? store.createSession(voiceProviderLabel, visionProviderLabel).catch((err) => {
|
|
99089
|
-
|
|
99604
|
+
log38.warn("session creation failed", { err: String(err) });
|
|
99090
99605
|
return null;
|
|
99091
99606
|
}) : Promise.resolve(null);
|
|
99092
99607
|
const pendingWrites = /* @__PURE__ */ new Set();
|
|
@@ -99104,7 +99619,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99104
99619
|
await memoryManager.queueExtraction(sid);
|
|
99105
99620
|
}
|
|
99106
99621
|
}).catch((err) => {
|
|
99107
|
-
|
|
99622
|
+
log38.warn("extraction failed", { err: String(err) });
|
|
99108
99623
|
});
|
|
99109
99624
|
pendingCleanups.add(extractionPromise);
|
|
99110
99625
|
void extractionPromise.finally(() => pendingCleanups.delete(extractionPromise));
|
|
@@ -99113,7 +99628,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99113
99628
|
function resetIdleTimer() {
|
|
99114
99629
|
if (idleTimer) clearTimeout(idleTimer);
|
|
99115
99630
|
idleTimer = setTimeout(() => {
|
|
99116
|
-
|
|
99631
|
+
log38.info("idle timeout, triggering extraction");
|
|
99117
99632
|
triggerExtraction();
|
|
99118
99633
|
}, IDLE_TIMEOUT_MS);
|
|
99119
99634
|
}
|
|
@@ -99154,12 +99669,12 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99154
99669
|
cameraWatcher.close();
|
|
99155
99670
|
cameraWatcher = null;
|
|
99156
99671
|
costTracker.markVisionInactive("camera");
|
|
99157
|
-
|
|
99672
|
+
log38.info("camera watcher closed");
|
|
99158
99673
|
} else if (source === "screen" && screenWatcher) {
|
|
99159
99674
|
screenWatcher.close();
|
|
99160
99675
|
screenWatcher = null;
|
|
99161
99676
|
costTracker.markVisionInactive("screen");
|
|
99162
|
-
|
|
99677
|
+
log38.info("screen watcher closed");
|
|
99163
99678
|
}
|
|
99164
99679
|
}
|
|
99165
99680
|
const memoryTools = memoryManager ? {
|
|
@@ -99218,6 +99733,13 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99218
99733
|
excludeTypes: options?.excludeTypes
|
|
99219
99734
|
});
|
|
99220
99735
|
},
|
|
99736
|
+
getWorkerSessionFile: async (workerId) => {
|
|
99737
|
+
const db = store.getRawDb?.();
|
|
99738
|
+
if (!db) return null;
|
|
99739
|
+
const { getWorker: getWorker2 } = await Promise.resolve().then(() => (init_worker_queries(), worker_queries_exports));
|
|
99740
|
+
const worker = await getWorker2(db, workerId);
|
|
99741
|
+
return worker?.sessionFile ?? null;
|
|
99742
|
+
},
|
|
99221
99743
|
updateTask: async (idOrTitle, payload) => {
|
|
99222
99744
|
const current = await resolveTask(store, idOrTitle);
|
|
99223
99745
|
if (!current) return null;
|
|
@@ -99256,7 +99778,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99256
99778
|
sessionIdPromise.then(async (sid) => {
|
|
99257
99779
|
if (sid) await store.appendTranscript(sid, "user", text);
|
|
99258
99780
|
}).catch((err) => {
|
|
99259
|
-
|
|
99781
|
+
log38.warn("transcript write failed", { err: String(err) });
|
|
99260
99782
|
})
|
|
99261
99783
|
);
|
|
99262
99784
|
}
|
|
@@ -99271,7 +99793,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99271
99793
|
sessionIdPromise.then(async (sid) => {
|
|
99272
99794
|
if (sid) await store.appendTranscript(sid, "assistant", text);
|
|
99273
99795
|
}).catch((err) => {
|
|
99274
|
-
|
|
99796
|
+
log38.warn("transcript write failed", { err: String(err) });
|
|
99275
99797
|
})
|
|
99276
99798
|
);
|
|
99277
99799
|
}
|
|
@@ -99343,10 +99865,10 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99343
99865
|
const MAX_PENDING_ACTIVATION_AUDIO = 100;
|
|
99344
99866
|
async function activateVoiceSession(wakeTranscript) {
|
|
99345
99867
|
if (connectionClosed || session) return;
|
|
99346
|
-
|
|
99868
|
+
log38.info("activating voice session", { wakeTranscript });
|
|
99347
99869
|
extractionTriggered = false;
|
|
99348
99870
|
let systemPromptPrefix = memoryManager ? await memoryManager.buildSystemPrompt().catch((err) => {
|
|
99349
|
-
|
|
99871
|
+
log38.warn("memory prompt build failed", { err: String(err) });
|
|
99350
99872
|
return void 0;
|
|
99351
99873
|
}) : void 0;
|
|
99352
99874
|
if (store) {
|
|
@@ -99377,7 +99899,24 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99377
99899
|
skillTools: skillToolHandler ?? void 0,
|
|
99378
99900
|
workerControl: workerControlHandler ?? void 0,
|
|
99379
99901
|
systemState: systemStateHandler ?? void 0,
|
|
99380
|
-
workerDispatch: workerDispatchHandler ?? void 0
|
|
99902
|
+
workerDispatch: workerDispatchHandler ?? void 0,
|
|
99903
|
+
workerLogs: {
|
|
99904
|
+
// readLog is sync. The async wrapper satisfies the
|
|
99905
|
+
// interface contract and leaves room for future I/O
|
|
99906
|
+
// (e.g. a streamed read), but there's no await here.
|
|
99907
|
+
read: async (options) => {
|
|
99908
|
+
const { readLog: readLog2 } = await Promise.resolve().then(() => (init_log_reader(), log_reader_exports));
|
|
99909
|
+
return readLog2({
|
|
99910
|
+
neuraHome: services2.config.neuraHome,
|
|
99911
|
+
...options.source ? { source: buildSource(options) } : {},
|
|
99912
|
+
...options.path ? { path: options.path } : {},
|
|
99913
|
+
...options.workerId ? { workerId: options.workerId } : {},
|
|
99914
|
+
...options.taskId ? { taskId: options.taskId } : {},
|
|
99915
|
+
minLevel: options.includeInfo ? "info" : "warn",
|
|
99916
|
+
...options.lines !== void 0 ? { limit: options.lines } : {}
|
|
99917
|
+
});
|
|
99918
|
+
}
|
|
99919
|
+
}
|
|
99381
99920
|
},
|
|
99382
99921
|
services2.registry
|
|
99383
99922
|
);
|
|
@@ -99391,7 +99930,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99391
99930
|
}
|
|
99392
99931
|
}
|
|
99393
99932
|
function deactivateVoiceSession() {
|
|
99394
|
-
|
|
99933
|
+
log38.info("deactivating voice session");
|
|
99395
99934
|
pendingWakeAudio = null;
|
|
99396
99935
|
pendingActivationAudio = [];
|
|
99397
99936
|
pendingText = [];
|
|
@@ -99408,13 +99947,13 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99408
99947
|
const melPath = join7(modelsDir, "melspectrogram.onnx");
|
|
99409
99948
|
const embPath = join7(modelsDir, "embedding_model.onnx");
|
|
99410
99949
|
const classifierPath = join7(modelsDir, `${config2.assistantName}.onnx`);
|
|
99411
|
-
if (!
|
|
99412
|
-
|
|
99950
|
+
if (!existsSync10(melPath) || !existsSync10(embPath)) {
|
|
99951
|
+
log38.warn("ONNX base models not found, wake detection disabled", { modelsDir });
|
|
99413
99952
|
return;
|
|
99414
99953
|
}
|
|
99415
|
-
if (!
|
|
99954
|
+
if (!existsSync10(classifierPath)) {
|
|
99416
99955
|
const available = getAvailableWakeWords(modelsDir);
|
|
99417
|
-
|
|
99956
|
+
log38.warn("no wake word model for configured name", {
|
|
99418
99957
|
assistantName: config2.assistantName,
|
|
99419
99958
|
available
|
|
99420
99959
|
});
|
|
@@ -99429,12 +99968,12 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99429
99968
|
presence.wake("(detected via onnx)");
|
|
99430
99969
|
},
|
|
99431
99970
|
onDebug: (info) => {
|
|
99432
|
-
|
|
99971
|
+
log38.debug("onnx wake check", info);
|
|
99433
99972
|
}
|
|
99434
99973
|
});
|
|
99435
|
-
|
|
99974
|
+
log38.info("wake word detection active", { assistantName: config2.assistantName });
|
|
99436
99975
|
} catch (err) {
|
|
99437
|
-
|
|
99976
|
+
log38.error("ONNX wake detector failed to start", { err: String(err) });
|
|
99438
99977
|
}
|
|
99439
99978
|
}
|
|
99440
99979
|
const presence = new PresenceManager({
|
|
@@ -99477,7 +100016,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99477
100016
|
if (wakeDetector) {
|
|
99478
100017
|
wakeDetector.feedAudio(msg.data);
|
|
99479
100018
|
} else {
|
|
99480
|
-
|
|
100019
|
+
log38.debug("audio received but no wake detector");
|
|
99481
100020
|
}
|
|
99482
100021
|
}
|
|
99483
100022
|
break;
|
|
@@ -99515,17 +100054,17 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99515
100054
|
break;
|
|
99516
100055
|
case "manualStart":
|
|
99517
100056
|
if (presence.state === "passive") {
|
|
99518
|
-
|
|
100057
|
+
log38.info("manual session start");
|
|
99519
100058
|
presence.enterMode("active");
|
|
99520
100059
|
}
|
|
99521
100060
|
break;
|
|
99522
100061
|
}
|
|
99523
100062
|
} catch (err) {
|
|
99524
|
-
|
|
100063
|
+
log38.error("bad message", { err: String(err) });
|
|
99525
100064
|
}
|
|
99526
100065
|
});
|
|
99527
100066
|
ws.on("close", () => {
|
|
99528
|
-
|
|
100067
|
+
log38.info("client disconnected");
|
|
99529
100068
|
connectionClosed = true;
|
|
99530
100069
|
connectedClients.delete(ws);
|
|
99531
100070
|
if (idleTimer) {
|
|
@@ -99554,7 +100093,7 @@ function attachWebSocket(httpServer2, services2) {
|
|
|
99554
100093
|
}
|
|
99555
100094
|
|
|
99556
100095
|
// src/server/server.ts
|
|
99557
|
-
var
|
|
100096
|
+
var log39 = new Logger("server");
|
|
99558
100097
|
var services = await initServices();
|
|
99559
100098
|
var actualPort = services.config.port;
|
|
99560
100099
|
var app = createApp(services, () => actualPort);
|
|
@@ -99568,14 +100107,14 @@ function startServer(port, maxRetries = 10) {
|
|
|
99568
100107
|
wss = attachWebSocket(httpServer, services);
|
|
99569
100108
|
process.stdout.write(`NEURA_PORT=${port}
|
|
99570
100109
|
`);
|
|
99571
|
-
|
|
100110
|
+
log39.info(`Neura core server at http://localhost:${port}`);
|
|
99572
100111
|
});
|
|
99573
100112
|
httpServer.once("error", (err) => {
|
|
99574
100113
|
if (err.code === "EADDRINUSE" && maxRetries > 0) {
|
|
99575
|
-
|
|
100114
|
+
log39.warn(`port ${port} in use, trying ${port + 1}`);
|
|
99576
100115
|
startServer(port + 1, maxRetries - 1);
|
|
99577
100116
|
} else {
|
|
99578
|
-
|
|
100117
|
+
log39.error("server failed to start", { err: err.message });
|
|
99579
100118
|
process.exit(1);
|
|
99580
100119
|
}
|
|
99581
100120
|
});
|
|
@@ -99586,11 +100125,11 @@ var doShutdown = () => void shutdown(services, httpServer, wss);
|
|
|
99586
100125
|
process.on("SIGTERM", doShutdown);
|
|
99587
100126
|
process.on("SIGINT", doShutdown);
|
|
99588
100127
|
process.on("uncaughtException", (err) => {
|
|
99589
|
-
|
|
100128
|
+
log39.error("uncaught exception, shutting down", { err: err.message });
|
|
99590
100129
|
doShutdown();
|
|
99591
100130
|
});
|
|
99592
100131
|
process.on("unhandledRejection", (reason) => {
|
|
99593
|
-
|
|
100132
|
+
log39.error("unhandled rejection, shutting down", { err: String(reason) });
|
|
99594
100133
|
doShutdown();
|
|
99595
100134
|
});
|
|
99596
100135
|
/*! Bundled license information:
|