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