agent-relay 3.2.10 → 3.2.11
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/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/bin/agent-relay-broker-linux-x64 +0 -0
- package/dist/index.cjs +858 -519
- package/package.json +8 -8
- package/packages/acp-bridge/package.json +2 -2
- package/packages/config/package.json +1 -1
- package/packages/hooks/package.json +4 -4
- package/packages/memory/package.json +2 -2
- package/packages/openclaw/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/sdk/dist/cli-registry.d.ts +42 -0
- package/packages/sdk/dist/cli-registry.d.ts.map +1 -0
- package/packages/sdk/dist/cli-registry.js +126 -0
- package/packages/sdk/dist/cli-registry.js.map +1 -0
- package/packages/sdk/dist/cli-resolver.d.ts +30 -0
- package/packages/sdk/dist/cli-resolver.d.ts.map +1 -0
- package/packages/sdk/dist/cli-resolver.js +132 -0
- package/packages/sdk/dist/cli-resolver.js.map +1 -0
- package/packages/sdk/dist/index.d.ts +2 -0
- package/packages/sdk/dist/index.d.ts.map +1 -1
- package/packages/sdk/dist/index.js +2 -0
- package/packages/sdk/dist/index.js.map +1 -1
- package/packages/sdk/dist/spawn-from-env.d.ts.map +1 -1
- package/packages/sdk/dist/spawn-from-env.js +6 -15
- package/packages/sdk/dist/spawn-from-env.js.map +1 -1
- package/packages/sdk/dist/workflows/builder.d.ts +5 -0
- package/packages/sdk/dist/workflows/builder.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/builder.js +36 -5
- package/packages/sdk/dist/workflows/builder.js.map +1 -1
- package/packages/sdk/dist/workflows/collectors/opencode.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/collectors/opencode.js +26 -0
- package/packages/sdk/dist/workflows/collectors/opencode.js.map +1 -1
- package/packages/sdk/dist/workflows/default-logger.d.ts +9 -0
- package/packages/sdk/dist/workflows/default-logger.d.ts.map +1 -0
- package/packages/sdk/dist/workflows/default-logger.js +104 -0
- package/packages/sdk/dist/workflows/default-logger.js.map +1 -0
- package/packages/sdk/dist/workflows/index.d.ts +1 -0
- package/packages/sdk/dist/workflows/index.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/index.js +1 -0
- package/packages/sdk/dist/workflows/index.js.map +1 -1
- package/packages/sdk/dist/workflows/runner.d.ts +1 -1
- package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/runner.js +16 -45
- package/packages/sdk/dist/workflows/runner.js.map +1 -1
- package/packages/sdk/package.json +2 -2
- package/packages/sdk/src/cli-registry.ts +148 -0
- package/packages/sdk/src/cli-resolver.ts +155 -0
- package/packages/sdk/src/index.ts +2 -0
- package/packages/sdk/src/spawn-from-env.ts +6 -17
- package/packages/sdk/src/workflows/builder.ts +44 -4
- package/packages/sdk/src/workflows/collectors/opencode.ts +26 -0
- package/packages/sdk/src/workflows/default-logger.ts +120 -0
- package/packages/sdk/src/workflows/index.ts +1 -0
- package/packages/sdk/src/workflows/runner.ts +16 -43
- package/packages/sdk-py/pyproject.toml +1 -1
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1362,14 +1362,14 @@ var require_templates = __commonJS({
|
|
|
1362
1362
|
}
|
|
1363
1363
|
return results;
|
|
1364
1364
|
}
|
|
1365
|
-
function buildStyle(
|
|
1365
|
+
function buildStyle(chalk4, styles4) {
|
|
1366
1366
|
const enabled = {};
|
|
1367
1367
|
for (const layer of styles4) {
|
|
1368
1368
|
for (const style of layer.styles) {
|
|
1369
1369
|
enabled[style[0]] = layer.inverse ? null : style.slice(1);
|
|
1370
1370
|
}
|
|
1371
1371
|
}
|
|
1372
|
-
let current =
|
|
1372
|
+
let current = chalk4;
|
|
1373
1373
|
for (const [styleName, styles5] of Object.entries(enabled)) {
|
|
1374
1374
|
if (!Array.isArray(styles5)) {
|
|
1375
1375
|
continue;
|
|
@@ -1381,7 +1381,7 @@ var require_templates = __commonJS({
|
|
|
1381
1381
|
}
|
|
1382
1382
|
return current;
|
|
1383
1383
|
}
|
|
1384
|
-
module2.exports = (
|
|
1384
|
+
module2.exports = (chalk4, temporary) => {
|
|
1385
1385
|
const styles4 = [];
|
|
1386
1386
|
const chunks = [];
|
|
1387
1387
|
let chunk = [];
|
|
@@ -1391,13 +1391,13 @@ var require_templates = __commonJS({
|
|
|
1391
1391
|
} else if (style) {
|
|
1392
1392
|
const string7 = chunk.join("");
|
|
1393
1393
|
chunk = [];
|
|
1394
|
-
chunks.push(styles4.length === 0 ? string7 : buildStyle(
|
|
1394
|
+
chunks.push(styles4.length === 0 ? string7 : buildStyle(chalk4, styles4)(string7));
|
|
1395
1395
|
styles4.push({ inverse, styles: parseStyle(style) });
|
|
1396
1396
|
} else if (close) {
|
|
1397
1397
|
if (styles4.length === 0) {
|
|
1398
1398
|
throw new Error("Found extraneous } in Chalk template literal");
|
|
1399
1399
|
}
|
|
1400
|
-
chunks.push(buildStyle(
|
|
1400
|
+
chunks.push(buildStyle(chalk4, styles4)(chunk.join("")));
|
|
1401
1401
|
chunk = [];
|
|
1402
1402
|
styles4.pop();
|
|
1403
1403
|
} else {
|
|
@@ -1445,16 +1445,16 @@ var require_source = __commonJS({
|
|
|
1445
1445
|
}
|
|
1446
1446
|
};
|
|
1447
1447
|
var chalkFactory = (options) => {
|
|
1448
|
-
const
|
|
1449
|
-
applyOptions(
|
|
1450
|
-
|
|
1451
|
-
Object.setPrototypeOf(
|
|
1452
|
-
Object.setPrototypeOf(
|
|
1453
|
-
|
|
1448
|
+
const chalk5 = {};
|
|
1449
|
+
applyOptions(chalk5, options);
|
|
1450
|
+
chalk5.template = (...arguments_) => chalkTag(chalk5.template, ...arguments_);
|
|
1451
|
+
Object.setPrototypeOf(chalk5, Chalk.prototype);
|
|
1452
|
+
Object.setPrototypeOf(chalk5.template, chalk5);
|
|
1453
|
+
chalk5.template.constructor = () => {
|
|
1454
1454
|
throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.");
|
|
1455
1455
|
};
|
|
1456
|
-
|
|
1457
|
-
return
|
|
1456
|
+
chalk5.template.Instance = ChalkClass;
|
|
1457
|
+
return chalk5.template;
|
|
1458
1458
|
};
|
|
1459
1459
|
function Chalk(options) {
|
|
1460
1460
|
return chalkFactory(options);
|
|
@@ -1565,7 +1565,7 @@ var require_source = __commonJS({
|
|
|
1565
1565
|
return openAll + string7 + closeAll;
|
|
1566
1566
|
};
|
|
1567
1567
|
var template;
|
|
1568
|
-
var chalkTag = (
|
|
1568
|
+
var chalkTag = (chalk5, ...strings) => {
|
|
1569
1569
|
const [firstString] = strings;
|
|
1570
1570
|
if (!isArray(firstString) || !isArray(firstString.raw)) {
|
|
1571
1571
|
return strings.join(" ");
|
|
@@ -1581,14 +1581,14 @@ var require_source = __commonJS({
|
|
|
1581
1581
|
if (template === void 0) {
|
|
1582
1582
|
template = require_templates();
|
|
1583
1583
|
}
|
|
1584
|
-
return template(
|
|
1584
|
+
return template(chalk5, parts.join(""));
|
|
1585
1585
|
};
|
|
1586
1586
|
Object.defineProperties(Chalk.prototype, styles4);
|
|
1587
|
-
var
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
module2.exports =
|
|
1587
|
+
var chalk4 = Chalk();
|
|
1588
|
+
chalk4.supportsColor = stdoutColor;
|
|
1589
|
+
chalk4.stderr = Chalk({ level: stderrColor ? stderrColor.level : 0 });
|
|
1590
|
+
chalk4.stderr.supportsColor = stderrColor;
|
|
1591
|
+
module2.exports = chalk4;
|
|
1592
1592
|
}
|
|
1593
1593
|
});
|
|
1594
1594
|
|
|
@@ -9305,11 +9305,11 @@ __export(base_exports, {
|
|
|
9305
9305
|
setCwd: () => setCwd,
|
|
9306
9306
|
synchronizedOutput: () => synchronizedOutput
|
|
9307
9307
|
});
|
|
9308
|
-
var import_node_process,
|
|
9308
|
+
var import_node_process, import_node_os8, ESC, OSC, BEL, SEP, isTerminalApp, isWindows2, isTmux, cwdFunction, wrapOsc, cursorTo, cursorMove, cursorUp, cursorDown, cursorForward, cursorBackward, cursorLeft, cursorSavePosition, cursorRestorePosition, cursorGetPosition, cursorNextLine, cursorPrevLine, cursorHide, cursorShow, eraseLines, eraseEndLine, eraseStartLine, eraseLine, eraseDown, eraseUp, eraseScreen, scrollUp, scrollDown, clearScreen, clearViewport, isOldWindows, clearTerminal, enterAlternativeScreen, exitAlternativeScreen, beginSynchronizedOutput, endSynchronizedOutput, synchronizedOutput, beep, link, image, iTerm, ConEmu, setCwd;
|
|
9309
9309
|
var init_base = __esm({
|
|
9310
9310
|
"node_modules/ansi-escapes/base.js"() {
|
|
9311
9311
|
import_node_process = __toESM(require("node:process"), 1);
|
|
9312
|
-
|
|
9312
|
+
import_node_os8 = __toESM(require("node:os"), 1);
|
|
9313
9313
|
init_environment();
|
|
9314
9314
|
ESC = "\x1B[";
|
|
9315
9315
|
OSC = "\x1B]";
|
|
@@ -9389,7 +9389,7 @@ var init_base = __esm({
|
|
|
9389
9389
|
if (isBrowser || !isWindows2) {
|
|
9390
9390
|
return false;
|
|
9391
9391
|
}
|
|
9392
|
-
const parts =
|
|
9392
|
+
const parts = import_node_os8.default.release().split(".");
|
|
9393
9393
|
const major = Number(parts[0]);
|
|
9394
9394
|
const build = Number(parts[2] ?? 0);
|
|
9395
9395
|
if (major < 10) {
|
|
@@ -12622,11 +12622,11 @@ function delay(time5) {
|
|
|
12622
12622
|
setTimeout(resolve3, time5);
|
|
12623
12623
|
});
|
|
12624
12624
|
}
|
|
12625
|
-
var
|
|
12625
|
+
var import_node_util3, import_util8, import_os, import_string_decoder, import_stream, import_rfdc, import_crypto, ANSI_ESCAPE2, ANSI_ESCAPE_CODES, ListrEnvironmentVariables, ListrErrorTypes, ListrEventType, ListrRendererSelection, ListrTaskEventType, ListrTaskState, EventManager, BaseEventMap, CLEAR_LINE_REGEX, BELL_REGEX, color, FIGURES_MAIN, FIGURES_FALLBACK, figures, ListrLogLevels, LISTR_LOGGER_STYLE, LISTR_LOGGER_STDERR_LEVELS, ListrLogger, ProcessOutputBuffer, ProcessOutputStream, ProcessOutput, ListrPromptAdapter, Spinner, ListrDefaultRendererLogLevels, LISTR_DEFAULT_RENDERER_STYLE, PRESET_TIMER, PRESET_TIMESTAMP, DefaultRenderer, SilentRenderer, SimpleRenderer, TestRendererSerializer, TestRenderer, VerboseRenderer, RENDERERS, clone3, Concurrency, ListrError, ListrRendererError, PromptError, TaskWrapper, ListrTaskEventManager, Task, ListrEventManager, Listr;
|
|
12626
12626
|
var init_dist = __esm({
|
|
12627
12627
|
"node_modules/listr2/dist/index.mjs"() {
|
|
12628
12628
|
init_eventemitter3();
|
|
12629
|
-
|
|
12629
|
+
import_node_util3 = require("node:util");
|
|
12630
12630
|
import_util8 = require("util");
|
|
12631
12631
|
import_os = require("os");
|
|
12632
12632
|
import_string_decoder = require("string_decoder");
|
|
@@ -12711,7 +12711,7 @@ var init_dist = __esm({
|
|
|
12711
12711
|
};
|
|
12712
12712
|
CLEAR_LINE_REGEX = "(?:\\u001b|\\u009b)\\[[\\=><~/#&.:=?%@~_-]*[0-9]*[\\a-ln-tqyz=><~/#&.:=?%@~_-]+";
|
|
12713
12713
|
BELL_REGEX = /\u0007/;
|
|
12714
|
-
color = Object.fromEntries(Object.keys(
|
|
12714
|
+
color = Object.fromEntries(Object.keys(import_node_util3.inspect.colors).map((color2) => [color2, (text) => (0, import_node_util3.styleText)(color2, String(text))]));
|
|
12715
12715
|
FIGURES_MAIN = {
|
|
12716
12716
|
warning: "\u26A0",
|
|
12717
12717
|
cross: "\u2716",
|
|
@@ -14377,6 +14377,220 @@ var init_dist = __esm({
|
|
|
14377
14377
|
}
|
|
14378
14378
|
});
|
|
14379
14379
|
|
|
14380
|
+
// packages/sdk/dist/workflows/listr-renderer.js
|
|
14381
|
+
var listr_renderer_exports = {};
|
|
14382
|
+
__export(listr_renderer_exports, {
|
|
14383
|
+
createWorkflowRenderer: () => createWorkflowRenderer
|
|
14384
|
+
});
|
|
14385
|
+
function installOutputFilter() {
|
|
14386
|
+
const orig = console.log.bind(console);
|
|
14387
|
+
console.log = (...args) => {
|
|
14388
|
+
const str = String(args[0] ?? "");
|
|
14389
|
+
if (str.includes("Observer:") || str.includes("agentrelay.dev") || str.includes("Channel: wf-")) {
|
|
14390
|
+
orig(...args);
|
|
14391
|
+
return;
|
|
14392
|
+
}
|
|
14393
|
+
if (/\[broker\]/.test(str) || /\[workflow\s+\d{2}:\d{2}\]/.test(str))
|
|
14394
|
+
return;
|
|
14395
|
+
orig(...args);
|
|
14396
|
+
};
|
|
14397
|
+
return () => {
|
|
14398
|
+
console.log = orig;
|
|
14399
|
+
};
|
|
14400
|
+
}
|
|
14401
|
+
function createWorkflowRenderer() {
|
|
14402
|
+
const stepHandles = /* @__PURE__ */ new Map();
|
|
14403
|
+
let resolveWorkflow;
|
|
14404
|
+
let rejectWorkflow;
|
|
14405
|
+
const workflowDone = new Promise((resolve3, reject) => {
|
|
14406
|
+
resolveWorkflow = resolve3;
|
|
14407
|
+
rejectWorkflow = reject;
|
|
14408
|
+
});
|
|
14409
|
+
workflowDone.catch(() => {
|
|
14410
|
+
});
|
|
14411
|
+
let setHeader = () => {
|
|
14412
|
+
};
|
|
14413
|
+
let listr = null;
|
|
14414
|
+
const pendingAdds = [];
|
|
14415
|
+
async function ensureListr() {
|
|
14416
|
+
if (listr)
|
|
14417
|
+
return listr;
|
|
14418
|
+
const { Listr: Listr2 } = await Promise.resolve().then(() => (init_dist(), dist_exports));
|
|
14419
|
+
listr = new Listr2([
|
|
14420
|
+
{
|
|
14421
|
+
title: import_chalk3.default.dim("Workflow starting..."),
|
|
14422
|
+
task: async (_ctx, task) => {
|
|
14423
|
+
setHeader = (text) => {
|
|
14424
|
+
task.title = text;
|
|
14425
|
+
};
|
|
14426
|
+
await workflowDone;
|
|
14427
|
+
}
|
|
14428
|
+
}
|
|
14429
|
+
], {
|
|
14430
|
+
concurrent: true,
|
|
14431
|
+
renderer: process.stdout.isTTY ? "default" : "verbose",
|
|
14432
|
+
rendererOptions: {
|
|
14433
|
+
collapseErrors: false,
|
|
14434
|
+
showErrorMessage: true
|
|
14435
|
+
}
|
|
14436
|
+
});
|
|
14437
|
+
for (const task of pendingAdds)
|
|
14438
|
+
listr.add(task);
|
|
14439
|
+
pendingAdds.length = 0;
|
|
14440
|
+
return listr;
|
|
14441
|
+
}
|
|
14442
|
+
const addTask = (task) => {
|
|
14443
|
+
if (listr)
|
|
14444
|
+
listr.add(task);
|
|
14445
|
+
else
|
|
14446
|
+
pendingAdds.push(task);
|
|
14447
|
+
};
|
|
14448
|
+
const onEvent = (event) => {
|
|
14449
|
+
switch (event.type) {
|
|
14450
|
+
case "run:started": {
|
|
14451
|
+
setHeader(import_chalk3.default.dim(`[workflow] run ${event.runId.slice(0, 8)}...`));
|
|
14452
|
+
break;
|
|
14453
|
+
}
|
|
14454
|
+
case "step:started": {
|
|
14455
|
+
let resolveStep;
|
|
14456
|
+
let rejectStep;
|
|
14457
|
+
let taskRef = null;
|
|
14458
|
+
let skipped = false;
|
|
14459
|
+
const done = new Promise((resolve3, reject) => {
|
|
14460
|
+
resolveStep = resolve3;
|
|
14461
|
+
rejectStep = reject;
|
|
14462
|
+
});
|
|
14463
|
+
done.catch(() => {
|
|
14464
|
+
});
|
|
14465
|
+
stepHandles.set(event.stepName, {
|
|
14466
|
+
resolve: resolveStep,
|
|
14467
|
+
reject: rejectStep,
|
|
14468
|
+
setOutput: (text) => {
|
|
14469
|
+
if (taskRef)
|
|
14470
|
+
taskRef.output = text;
|
|
14471
|
+
},
|
|
14472
|
+
markSkipped: () => {
|
|
14473
|
+
skipped = true;
|
|
14474
|
+
if (taskRef)
|
|
14475
|
+
taskRef.title = import_chalk3.default.dim(`${event.stepName} (skipped)`);
|
|
14476
|
+
}
|
|
14477
|
+
});
|
|
14478
|
+
addTask({
|
|
14479
|
+
title: import_chalk3.default.white(event.stepName),
|
|
14480
|
+
task: async (_ctx, task) => {
|
|
14481
|
+
taskRef = task;
|
|
14482
|
+
if (skipped)
|
|
14483
|
+
taskRef.title = import_chalk3.default.dim(`${event.stepName} (skipped)`);
|
|
14484
|
+
await done;
|
|
14485
|
+
},
|
|
14486
|
+
rendererOptions: { persistentOutput: true }
|
|
14487
|
+
});
|
|
14488
|
+
break;
|
|
14489
|
+
}
|
|
14490
|
+
case "step:owner-assigned": {
|
|
14491
|
+
const handle = stepHandles.get(event.stepName);
|
|
14492
|
+
if (handle) {
|
|
14493
|
+
handle.setOutput(import_chalk3.default.dim(`> Owner: ${event.ownerName}`) + (event.specialistName ? import_chalk3.default.dim(` \xB7 specialist: ${event.specialistName}`) : ""));
|
|
14494
|
+
}
|
|
14495
|
+
break;
|
|
14496
|
+
}
|
|
14497
|
+
case "step:retrying": {
|
|
14498
|
+
stepHandles.get(event.stepName)?.setOutput(import_chalk3.default.yellow(`Retrying (attempt ${event.attempt})`));
|
|
14499
|
+
break;
|
|
14500
|
+
}
|
|
14501
|
+
case "step:nudged": {
|
|
14502
|
+
stepHandles.get(event.stepName)?.setOutput(import_chalk3.default.dim(`> Nudge #${event.nudgeCount}`));
|
|
14503
|
+
break;
|
|
14504
|
+
}
|
|
14505
|
+
case "step:force-released": {
|
|
14506
|
+
stepHandles.get(event.stepName)?.setOutput(import_chalk3.default.yellow("> Force-released"));
|
|
14507
|
+
break;
|
|
14508
|
+
}
|
|
14509
|
+
case "step:review-completed": {
|
|
14510
|
+
stepHandles.get(event.stepName)?.setOutput(import_chalk3.default.dim(`> Review: ${event.decision} by ${event.reviewerName}`));
|
|
14511
|
+
break;
|
|
14512
|
+
}
|
|
14513
|
+
case "step:owner-timeout": {
|
|
14514
|
+
stepHandles.get(event.stepName)?.setOutput(import_chalk3.default.red(`> Owner ${event.ownerName} timed out`));
|
|
14515
|
+
break;
|
|
14516
|
+
}
|
|
14517
|
+
case "step:agent-report": {
|
|
14518
|
+
const handle = stepHandles.get(event.stepName);
|
|
14519
|
+
if (handle) {
|
|
14520
|
+
const model = event.report.model ? `:${event.report.model}` : "";
|
|
14521
|
+
handle.setOutput(import_chalk3.default.dim(`> Report collected (${event.report.cli}${model})`));
|
|
14522
|
+
}
|
|
14523
|
+
break;
|
|
14524
|
+
}
|
|
14525
|
+
case "step:completed": {
|
|
14526
|
+
stepHandles.get(event.stepName)?.resolve();
|
|
14527
|
+
break;
|
|
14528
|
+
}
|
|
14529
|
+
case "step:skipped": {
|
|
14530
|
+
const handle = stepHandles.get(event.stepName);
|
|
14531
|
+
if (handle) {
|
|
14532
|
+
handle.markSkipped();
|
|
14533
|
+
handle.resolve();
|
|
14534
|
+
} else {
|
|
14535
|
+
addTask({
|
|
14536
|
+
title: import_chalk3.default.dim(`${event.stepName} (skipped)`),
|
|
14537
|
+
task: async () => {
|
|
14538
|
+
},
|
|
14539
|
+
rendererOptions: { persistentOutput: true }
|
|
14540
|
+
});
|
|
14541
|
+
}
|
|
14542
|
+
break;
|
|
14543
|
+
}
|
|
14544
|
+
case "step:failed": {
|
|
14545
|
+
stepHandles.get(event.stepName)?.reject(new Error(event.error ?? "Step failed"));
|
|
14546
|
+
break;
|
|
14547
|
+
}
|
|
14548
|
+
case "run:completed": {
|
|
14549
|
+
setHeader(import_chalk3.default.green("Workflow completed"));
|
|
14550
|
+
resolveWorkflow();
|
|
14551
|
+
break;
|
|
14552
|
+
}
|
|
14553
|
+
case "run:failed": {
|
|
14554
|
+
setHeader(import_chalk3.default.red(`Workflow failed: ${event.error ?? "unknown error"}`));
|
|
14555
|
+
rejectWorkflow(new Error(event.error ?? "Workflow failed"));
|
|
14556
|
+
break;
|
|
14557
|
+
}
|
|
14558
|
+
case "run:cancelled": {
|
|
14559
|
+
setHeader(import_chalk3.default.yellow("Workflow cancelled"));
|
|
14560
|
+
resolveWorkflow();
|
|
14561
|
+
break;
|
|
14562
|
+
}
|
|
14563
|
+
case "broker:event":
|
|
14564
|
+
break;
|
|
14565
|
+
default: {
|
|
14566
|
+
const _exhaustive = event;
|
|
14567
|
+
void _exhaustive;
|
|
14568
|
+
}
|
|
14569
|
+
}
|
|
14570
|
+
};
|
|
14571
|
+
let restoreConsole;
|
|
14572
|
+
return {
|
|
14573
|
+
onEvent,
|
|
14574
|
+
start: async () => {
|
|
14575
|
+
restoreConsole = installOutputFilter();
|
|
14576
|
+
const l = await ensureListr();
|
|
14577
|
+
return l.run().catch(() => {
|
|
14578
|
+
});
|
|
14579
|
+
},
|
|
14580
|
+
unmount: () => {
|
|
14581
|
+
restoreConsole?.();
|
|
14582
|
+
restoreConsole = void 0;
|
|
14583
|
+
}
|
|
14584
|
+
};
|
|
14585
|
+
}
|
|
14586
|
+
var import_chalk3;
|
|
14587
|
+
var init_listr_renderer = __esm({
|
|
14588
|
+
"packages/sdk/dist/workflows/listr-renderer.js"() {
|
|
14589
|
+
"use strict";
|
|
14590
|
+
import_chalk3 = __toESM(require_source(), 1);
|
|
14591
|
+
}
|
|
14592
|
+
});
|
|
14593
|
+
|
|
14380
14594
|
// node_modules/compare-versions/lib/umd/index.js
|
|
14381
14595
|
var require_umd = __commonJS({
|
|
14382
14596
|
"node_modules/compare-versions/lib/umd/index.js"(exports2, module2) {
|
|
@@ -15851,6 +16065,7 @@ __export(index_exports, {
|
|
|
15851
16065
|
CLIVersions: () => CLIVersions,
|
|
15852
16066
|
CLIs: () => CLIs,
|
|
15853
16067
|
CODEX_MODEL_OPTIONS: () => CODEX_MODEL_OPTIONS,
|
|
16068
|
+
COMMON_SEARCH_PATHS: () => COMMON_SEARCH_PATHS,
|
|
15854
16069
|
CURSOR_MODEL_OPTIONS: () => CURSOR_MODEL_OPTIONS,
|
|
15855
16070
|
CUSTOM_STEPS_FILE: () => CUSTOM_STEPS_FILE,
|
|
15856
16071
|
ClaudeModels: () => ClaudeModels,
|
|
@@ -15899,6 +16114,7 @@ __export(index_exports, {
|
|
|
15899
16114
|
checkForUpdatesInBackground: () => checkForUpdatesInBackground,
|
|
15900
16115
|
cleanLines: () => cleanLines,
|
|
15901
16116
|
clearBinaryCache: () => clearBinaryCache,
|
|
16117
|
+
clearResolveCache: () => clearResolveCache,
|
|
15902
16118
|
collectCliSession: () => collectCliSession,
|
|
15903
16119
|
commandExists: () => commandExists,
|
|
15904
16120
|
connectionLog: () => connectionLog,
|
|
@@ -15906,6 +16122,7 @@ __export(index_exports, {
|
|
|
15906
16122
|
createCollector: () => createCollector,
|
|
15907
16123
|
createConsensusEngine: () => createConsensusEngine,
|
|
15908
16124
|
createContextCompactor: () => createContextCompactor,
|
|
16125
|
+
createDefaultEventLogger: () => createDefaultEventLogger,
|
|
15909
16126
|
createLogger: () => createLogger,
|
|
15910
16127
|
createMemoryAdapter: () => createMemoryAdapter,
|
|
15911
16128
|
createMemoryHooks: () => createMemoryHooks,
|
|
@@ -15933,6 +16150,8 @@ __export(index_exports, {
|
|
|
15933
16150
|
getAgentName: () => getAgentName,
|
|
15934
16151
|
getBaseCli: () => getBaseCli,
|
|
15935
16152
|
getCachedRelayPtyPath: () => getCachedRelayPtyPath,
|
|
16153
|
+
getCliDefinition: () => getCliDefinition,
|
|
16154
|
+
getCliRegistry: () => getCliRegistry,
|
|
15936
16155
|
getCompiledPatterns: () => getCompiledPatterns,
|
|
15937
16156
|
getCustomStepsPath: () => getCustomStepsPath,
|
|
15938
16157
|
getDefaultReasoningEffort: () => getDefaultReasoningEffort,
|
|
@@ -15980,6 +16199,8 @@ __export(index_exports, {
|
|
|
15980
16199
|
readInbox: () => readInbox,
|
|
15981
16200
|
resetPatternMetrics: () => resetPatternMetrics,
|
|
15982
16201
|
resolveAllCustomSteps: () => resolveAllCustomSteps,
|
|
16202
|
+
resolveCli: () => resolveCli,
|
|
16203
|
+
resolveCliSync: () => resolveCliSync,
|
|
15983
16204
|
resolveCommand: () => resolveCommand,
|
|
15984
16205
|
resolveCustomStep: () => resolveCustomStep,
|
|
15985
16206
|
resolveSpawnPolicy: () => resolveSpawnPolicy,
|
|
@@ -54688,29 +54909,120 @@ function isAgentStep(step) {
|
|
|
54688
54909
|
}
|
|
54689
54910
|
|
|
54690
54911
|
// packages/sdk/dist/workflows/runner.js
|
|
54691
|
-
var
|
|
54912
|
+
var import_node_child_process4 = require("node:child_process");
|
|
54692
54913
|
var import_node_crypto5 = require("node:crypto");
|
|
54693
|
-
var
|
|
54694
|
-
var
|
|
54695
|
-
var
|
|
54914
|
+
var import_node_fs9 = require("node:fs");
|
|
54915
|
+
var import_promises5 = require("node:fs/promises");
|
|
54916
|
+
var import_node_path12 = __toESM(require("node:path"), 1);
|
|
54696
54917
|
var import_chalk = __toESM(require_source(), 1);
|
|
54697
54918
|
var import_yaml2 = __toESM(require_dist(), 1);
|
|
54698
54919
|
|
|
54699
|
-
// packages/sdk/dist/
|
|
54700
|
-
var
|
|
54701
|
-
|
|
54920
|
+
// packages/sdk/dist/cli-registry.js
|
|
54921
|
+
var COMMON_SEARCH_PATHS = [
|
|
54922
|
+
"~/.local/bin",
|
|
54923
|
+
"~/.opencode/bin",
|
|
54924
|
+
"~/.claude/local",
|
|
54925
|
+
"/usr/local/bin",
|
|
54926
|
+
"/usr/bin",
|
|
54927
|
+
"/bin",
|
|
54928
|
+
"/opt/homebrew/bin"
|
|
54929
|
+
];
|
|
54930
|
+
var CLI_REGISTRY = {
|
|
54931
|
+
claude: {
|
|
54932
|
+
binaries: ["claude"],
|
|
54933
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
54934
|
+
"-p",
|
|
54935
|
+
"--dangerously-skip-permissions",
|
|
54936
|
+
task,
|
|
54937
|
+
...extra
|
|
54938
|
+
],
|
|
54939
|
+
bypassFlag: "--dangerously-skip-permissions",
|
|
54940
|
+
searchPaths: ["~/.claude/local"]
|
|
54941
|
+
},
|
|
54702
54942
|
codex: {
|
|
54703
|
-
|
|
54704
|
-
|
|
54943
|
+
binaries: ["codex"],
|
|
54944
|
+
nonInteractiveArgs: (task, extra = []) => ["exec", task, ...extra],
|
|
54945
|
+
bypassFlag: "--dangerously-bypass-approvals-and-sandbox",
|
|
54946
|
+
bypassAliases: ["--full-auto"],
|
|
54947
|
+
searchPaths: ["~/.local/bin"]
|
|
54705
54948
|
},
|
|
54706
54949
|
gemini: {
|
|
54707
|
-
|
|
54708
|
-
|
|
54950
|
+
binaries: ["gemini"],
|
|
54951
|
+
nonInteractiveArgs: (task, extra = []) => ["-p", task, ...extra],
|
|
54952
|
+
bypassFlag: "--yolo",
|
|
54953
|
+
bypassAliases: ["-y"]
|
|
54954
|
+
},
|
|
54955
|
+
opencode: {
|
|
54956
|
+
binaries: ["opencode"],
|
|
54957
|
+
nonInteractiveArgs: (task, extra = []) => ["--prompt", task, ...extra],
|
|
54958
|
+
searchPaths: ["~/.opencode/bin"]
|
|
54959
|
+
},
|
|
54960
|
+
droid: {
|
|
54961
|
+
binaries: ["droid"],
|
|
54962
|
+
nonInteractiveArgs: (task, extra = []) => ["exec", task, ...extra]
|
|
54963
|
+
},
|
|
54964
|
+
aider: {
|
|
54965
|
+
binaries: ["aider"],
|
|
54966
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
54967
|
+
"--message",
|
|
54968
|
+
task,
|
|
54969
|
+
"--yes-always",
|
|
54970
|
+
"--no-git",
|
|
54971
|
+
...extra
|
|
54972
|
+
]
|
|
54973
|
+
},
|
|
54974
|
+
goose: {
|
|
54975
|
+
binaries: ["goose"],
|
|
54976
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
54977
|
+
"run",
|
|
54978
|
+
"--text",
|
|
54979
|
+
task,
|
|
54980
|
+
"--no-session",
|
|
54981
|
+
...extra
|
|
54982
|
+
]
|
|
54983
|
+
},
|
|
54984
|
+
"cursor-agent": {
|
|
54985
|
+
binaries: ["cursor-agent"],
|
|
54986
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
54987
|
+
"--force",
|
|
54988
|
+
"-p",
|
|
54989
|
+
task,
|
|
54990
|
+
...extra
|
|
54991
|
+
]
|
|
54992
|
+
},
|
|
54993
|
+
agent: {
|
|
54994
|
+
binaries: ["agent"],
|
|
54995
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
54996
|
+
"--force",
|
|
54997
|
+
"-p",
|
|
54998
|
+
task,
|
|
54999
|
+
...extra
|
|
55000
|
+
]
|
|
55001
|
+
},
|
|
55002
|
+
cursor: {
|
|
55003
|
+
binaries: ["cursor-agent", "agent"],
|
|
55004
|
+
nonInteractiveArgs: (task, extra = []) => [
|
|
55005
|
+
"--force",
|
|
55006
|
+
"-p",
|
|
55007
|
+
task,
|
|
55008
|
+
...extra
|
|
55009
|
+
]
|
|
54709
55010
|
}
|
|
54710
55011
|
};
|
|
54711
|
-
function
|
|
55012
|
+
function getCliDefinition(cli) {
|
|
54712
55013
|
const baseCli = cli.includes(":") ? cli.split(":")[0] : cli;
|
|
54713
|
-
return
|
|
55014
|
+
return CLI_REGISTRY[baseCli];
|
|
55015
|
+
}
|
|
55016
|
+
function getCliRegistry() {
|
|
55017
|
+
return CLI_REGISTRY;
|
|
55018
|
+
}
|
|
55019
|
+
|
|
55020
|
+
// packages/sdk/dist/spawn-from-env.js
|
|
55021
|
+
function getBypassFlagConfig(cli) {
|
|
55022
|
+
const def = getCliDefinition(cli);
|
|
55023
|
+
if (!def?.bypassFlag)
|
|
55024
|
+
return void 0;
|
|
55025
|
+
return { flag: def.bypassFlag, aliases: def.bypassAliases };
|
|
54714
55026
|
}
|
|
54715
55027
|
function parseSpawnEnv(env = process.env) {
|
|
54716
55028
|
const AGENT_NAME = env.AGENT_NAME;
|
|
@@ -54821,19 +55133,115 @@ async function spawnFromEnv(options = {}) {
|
|
|
54821
55133
|
}
|
|
54822
55134
|
}
|
|
54823
55135
|
|
|
54824
|
-
// packages/sdk/dist/
|
|
55136
|
+
// packages/sdk/dist/cli-resolver.js
|
|
55137
|
+
var import_node_child_process3 = require("node:child_process");
|
|
55138
|
+
var import_promises2 = require("node:fs/promises");
|
|
54825
55139
|
var import_node_fs3 = require("node:fs");
|
|
54826
|
-
var import_node_path6 =
|
|
55140
|
+
var import_node_path6 = require("node:path");
|
|
55141
|
+
var import_node_os4 = require("node:os");
|
|
55142
|
+
var import_node_util2 = require("node:util");
|
|
55143
|
+
var execFileAsync = (0, import_node_util2.promisify)(import_node_child_process3.execFile);
|
|
55144
|
+
var resolveCache = /* @__PURE__ */ new Map();
|
|
55145
|
+
function clearResolveCache() {
|
|
55146
|
+
resolveCache.clear();
|
|
55147
|
+
}
|
|
55148
|
+
function expandHome(p) {
|
|
55149
|
+
if (p.startsWith("~/")) {
|
|
55150
|
+
return (0, import_node_path6.join)((0, import_node_os4.homedir)(), p.slice(2));
|
|
55151
|
+
}
|
|
55152
|
+
return p;
|
|
55153
|
+
}
|
|
55154
|
+
async function resolveCli(cli) {
|
|
55155
|
+
if (resolveCache.has(cli)) {
|
|
55156
|
+
return resolveCache.get(cli) ?? void 0;
|
|
55157
|
+
}
|
|
55158
|
+
const def = getCliDefinition(cli);
|
|
55159
|
+
if (!def)
|
|
55160
|
+
return void 0;
|
|
55161
|
+
for (const binary of def.binaries) {
|
|
55162
|
+
try {
|
|
55163
|
+
const { stdout } = await execFileAsync("which", [binary]);
|
|
55164
|
+
const path18 = stdout.trim();
|
|
55165
|
+
if (path18) {
|
|
55166
|
+
const result = { binary, path: path18 };
|
|
55167
|
+
resolveCache.set(cli, result);
|
|
55168
|
+
return result;
|
|
55169
|
+
}
|
|
55170
|
+
} catch {
|
|
55171
|
+
}
|
|
55172
|
+
const searchDirs = [...def.searchPaths ?? [], ...COMMON_SEARCH_PATHS];
|
|
55173
|
+
const seen = /* @__PURE__ */ new Set();
|
|
55174
|
+
for (const dir of searchDirs) {
|
|
55175
|
+
const expanded = expandHome(dir);
|
|
55176
|
+
if (seen.has(expanded))
|
|
55177
|
+
continue;
|
|
55178
|
+
seen.add(expanded);
|
|
55179
|
+
const candidate = (0, import_node_path6.join)(expanded, binary);
|
|
55180
|
+
try {
|
|
55181
|
+
await (0, import_promises2.access)(candidate, import_promises2.constants.X_OK);
|
|
55182
|
+
const result = { binary, path: candidate };
|
|
55183
|
+
resolveCache.set(cli, result);
|
|
55184
|
+
return result;
|
|
55185
|
+
} catch {
|
|
55186
|
+
}
|
|
55187
|
+
}
|
|
55188
|
+
}
|
|
55189
|
+
resolveCache.set(cli, null);
|
|
55190
|
+
return void 0;
|
|
55191
|
+
}
|
|
55192
|
+
function resolveCliSync(cli) {
|
|
55193
|
+
if (resolveCache.has(cli)) {
|
|
55194
|
+
return resolveCache.get(cli) ?? void 0;
|
|
55195
|
+
}
|
|
55196
|
+
const def = getCliDefinition(cli);
|
|
55197
|
+
if (!def)
|
|
55198
|
+
return void 0;
|
|
55199
|
+
const { execFileSync } = require("node:child_process");
|
|
55200
|
+
for (const binary of def.binaries) {
|
|
55201
|
+
try {
|
|
55202
|
+
const stdout = execFileSync("which", [binary], { stdio: ["pipe", "pipe", "ignore"] });
|
|
55203
|
+
const path18 = stdout.toString().trim();
|
|
55204
|
+
if (path18) {
|
|
55205
|
+
const result = { binary, path: path18 };
|
|
55206
|
+
resolveCache.set(cli, result);
|
|
55207
|
+
return result;
|
|
55208
|
+
}
|
|
55209
|
+
} catch {
|
|
55210
|
+
}
|
|
55211
|
+
const searchDirs = [...def.searchPaths ?? [], ...COMMON_SEARCH_PATHS];
|
|
55212
|
+
const seen = /* @__PURE__ */ new Set();
|
|
55213
|
+
for (const dir of searchDirs) {
|
|
55214
|
+
const expanded = expandHome(dir);
|
|
55215
|
+
if (seen.has(expanded))
|
|
55216
|
+
continue;
|
|
55217
|
+
seen.add(expanded);
|
|
55218
|
+
const candidate = (0, import_node_path6.join)(expanded, binary);
|
|
55219
|
+
try {
|
|
55220
|
+
(0, import_node_fs3.accessSync)(candidate, import_node_fs3.constants.X_OK);
|
|
55221
|
+
const result = { binary, path: candidate };
|
|
55222
|
+
resolveCache.set(cli, result);
|
|
55223
|
+
return result;
|
|
55224
|
+
} catch {
|
|
55225
|
+
}
|
|
55226
|
+
}
|
|
55227
|
+
}
|
|
55228
|
+
resolveCache.set(cli, null);
|
|
55229
|
+
return void 0;
|
|
55230
|
+
}
|
|
55231
|
+
|
|
55232
|
+
// packages/sdk/dist/workflows/custom-steps.js
|
|
55233
|
+
var import_node_fs4 = require("node:fs");
|
|
55234
|
+
var import_node_path7 = __toESM(require("node:path"), 1);
|
|
54827
55235
|
var import_yaml = __toESM(require_dist(), 1);
|
|
54828
55236
|
var CUSTOM_STEPS_FILE = ".relay/steps.yaml";
|
|
54829
55237
|
function loadCustomSteps(cwd) {
|
|
54830
|
-
const stepsPath =
|
|
55238
|
+
const stepsPath = import_node_path7.default.join(cwd, CUSTOM_STEPS_FILE);
|
|
54831
55239
|
const steps = /* @__PURE__ */ new Map();
|
|
54832
|
-
if (!(0,
|
|
55240
|
+
if (!(0, import_node_fs4.existsSync)(stepsPath)) {
|
|
54833
55241
|
return steps;
|
|
54834
55242
|
}
|
|
54835
55243
|
try {
|
|
54836
|
-
const content = (0,
|
|
55244
|
+
const content = (0, import_node_fs4.readFileSync)(stepsPath, "utf-8");
|
|
54837
55245
|
if (!content.trim()) {
|
|
54838
55246
|
return steps;
|
|
54839
55247
|
}
|
|
@@ -55083,21 +55491,21 @@ function resolveAllCustomSteps(steps, customSteps) {
|
|
|
55083
55491
|
return steps.map((step) => resolveCustomStep(step, customSteps));
|
|
55084
55492
|
}
|
|
55085
55493
|
function customStepsFileExists(cwd) {
|
|
55086
|
-
return (0,
|
|
55494
|
+
return (0, import_node_fs4.existsSync)(import_node_path7.default.join(cwd, CUSTOM_STEPS_FILE));
|
|
55087
55495
|
}
|
|
55088
55496
|
function getCustomStepsPath(cwd) {
|
|
55089
|
-
return
|
|
55497
|
+
return import_node_path7.default.join(cwd, CUSTOM_STEPS_FILE);
|
|
55090
55498
|
}
|
|
55091
55499
|
|
|
55092
55500
|
// packages/sdk/dist/workflows/collectors/claude.js
|
|
55093
|
-
var
|
|
55094
|
-
var
|
|
55095
|
-
var
|
|
55096
|
-
var
|
|
55501
|
+
var import_node_fs5 = require("node:fs");
|
|
55502
|
+
var import_promises3 = require("node:fs/promises");
|
|
55503
|
+
var import_node_os5 = require("node:os");
|
|
55504
|
+
var import_node_path8 = __toESM(require("node:path"), 1);
|
|
55097
55505
|
var import_node_readline2 = require("node:readline");
|
|
55098
|
-
var CLAUDE_HOME =
|
|
55099
|
-
var HISTORY_PATH =
|
|
55100
|
-
var PROJECTS_PATH =
|
|
55506
|
+
var CLAUDE_HOME = import_node_path8.default.join((0, import_node_os5.homedir)(), ".claude");
|
|
55507
|
+
var HISTORY_PATH = import_node_path8.default.join(CLAUDE_HOME, "history.jsonl");
|
|
55508
|
+
var PROJECTS_PATH = import_node_path8.default.join(CLAUDE_HOME, "projects");
|
|
55101
55509
|
var HISTORY_LOOKBACK_MS = 5e3;
|
|
55102
55510
|
var ClaudeCodeCollector = class {
|
|
55103
55511
|
canCollect() {
|
|
@@ -55108,7 +55516,7 @@ var ClaudeCodeCollector = class {
|
|
|
55108
55516
|
if (!historyEntry) {
|
|
55109
55517
|
return null;
|
|
55110
55518
|
}
|
|
55111
|
-
const sessionPath =
|
|
55519
|
+
const sessionPath = import_node_path8.default.join(PROJECTS_PATH, encodeProjectPath(historyEntry.project), `${historyEntry.sessionId}.jsonl`);
|
|
55112
55520
|
if (!await isReadableFileAsync(sessionPath)) {
|
|
55113
55521
|
return null;
|
|
55114
55522
|
}
|
|
@@ -55117,7 +55525,7 @@ var ClaudeCodeCollector = class {
|
|
|
55117
55525
|
};
|
|
55118
55526
|
async function findMatchingHistoryEntry(query) {
|
|
55119
55527
|
const history = (0, import_node_readline2.createInterface)({
|
|
55120
|
-
input: (0,
|
|
55528
|
+
input: (0, import_node_fs5.createReadStream)(HISTORY_PATH, { encoding: "utf8" }),
|
|
55121
55529
|
crlfDelay: Infinity
|
|
55122
55530
|
});
|
|
55123
55531
|
let match = null;
|
|
@@ -55146,7 +55554,7 @@ async function findMatchingHistoryEntry(query) {
|
|
|
55146
55554
|
}
|
|
55147
55555
|
async function parseSessionLog(sessionPath, query, sessionId) {
|
|
55148
55556
|
const session = (0, import_node_readline2.createInterface)({
|
|
55149
|
-
input: (0,
|
|
55557
|
+
input: (0, import_node_fs5.createReadStream)(sessionPath, { encoding: "utf8" }),
|
|
55150
55558
|
crlfDelay: Infinity
|
|
55151
55559
|
});
|
|
55152
55560
|
const rawLines = [];
|
|
@@ -55379,21 +55787,21 @@ function getNumber(value) {
|
|
|
55379
55787
|
}
|
|
55380
55788
|
function isReadableFile(filePath) {
|
|
55381
55789
|
try {
|
|
55382
|
-
return (0,
|
|
55790
|
+
return (0, import_node_fs5.existsSync)(filePath) && (0, import_node_fs5.statSync)(filePath).isFile();
|
|
55383
55791
|
} catch {
|
|
55384
55792
|
return false;
|
|
55385
55793
|
}
|
|
55386
55794
|
}
|
|
55387
55795
|
function isReadableDirectory(dirPath) {
|
|
55388
55796
|
try {
|
|
55389
|
-
return (0,
|
|
55797
|
+
return (0, import_node_fs5.existsSync)(dirPath) && (0, import_node_fs5.statSync)(dirPath).isDirectory();
|
|
55390
55798
|
} catch {
|
|
55391
55799
|
return false;
|
|
55392
55800
|
}
|
|
55393
55801
|
}
|
|
55394
55802
|
async function isReadableFileAsync(filePath) {
|
|
55395
55803
|
try {
|
|
55396
|
-
await (0,
|
|
55804
|
+
await (0, import_promises3.access)(filePath);
|
|
55397
55805
|
return true;
|
|
55398
55806
|
} catch {
|
|
55399
55807
|
return false;
|
|
@@ -55401,14 +55809,14 @@ async function isReadableFileAsync(filePath) {
|
|
|
55401
55809
|
}
|
|
55402
55810
|
|
|
55403
55811
|
// packages/sdk/dist/workflows/collectors/codex.js
|
|
55404
|
-
var
|
|
55405
|
-
var
|
|
55406
|
-
var
|
|
55812
|
+
var import_node_fs6 = __toESM(require("node:fs"), 1);
|
|
55813
|
+
var import_node_os6 = __toESM(require("node:os"), 1);
|
|
55814
|
+
var import_node_path9 = __toESM(require("node:path"), 1);
|
|
55407
55815
|
var import_node_module = require("node:module");
|
|
55408
55816
|
var require2 = (0, import_node_module.createRequire)(import_meta_url);
|
|
55409
|
-
var CODEX_HOME =
|
|
55410
|
-
var DEFAULT_HISTORY_PATH =
|
|
55411
|
-
var DEFAULT_STATE_PATH =
|
|
55817
|
+
var CODEX_HOME = import_node_path9.default.join(import_node_os6.default.homedir(), ".codex");
|
|
55818
|
+
var DEFAULT_HISTORY_PATH = import_node_path9.default.join(CODEX_HOME, "history.jsonl");
|
|
55819
|
+
var DEFAULT_STATE_PATH = import_node_path9.default.join(CODEX_HOME, "state_5.sqlite");
|
|
55412
55820
|
function loadBetterSqlite3() {
|
|
55413
55821
|
try {
|
|
55414
55822
|
return require2("better-sqlite3");
|
|
@@ -55502,7 +55910,7 @@ var CodexCollector = class {
|
|
|
55502
55910
|
this.statePath = options.statePath ?? DEFAULT_STATE_PATH;
|
|
55503
55911
|
}
|
|
55504
55912
|
canCollect() {
|
|
55505
|
-
return
|
|
55913
|
+
return import_node_fs6.default.existsSync(this.statePath) || import_node_fs6.default.existsSync(this.historyPath);
|
|
55506
55914
|
}
|
|
55507
55915
|
async collect(query) {
|
|
55508
55916
|
const historyEntries = this.readHistoryEntries();
|
|
@@ -55555,11 +55963,11 @@ var CodexCollector = class {
|
|
|
55555
55963
|
};
|
|
55556
55964
|
}
|
|
55557
55965
|
readHistoryEntries() {
|
|
55558
|
-
if (!
|
|
55966
|
+
if (!import_node_fs6.default.existsSync(this.historyPath)) {
|
|
55559
55967
|
return [];
|
|
55560
55968
|
}
|
|
55561
55969
|
try {
|
|
55562
|
-
return
|
|
55970
|
+
return import_node_fs6.default.readFileSync(this.historyPath, "utf8").split(/\r?\n/).map((line) => line.trim()).filter(Boolean).flatMap((line) => {
|
|
55563
55971
|
const parsed = parseJsonLine(line);
|
|
55564
55972
|
return parsed ? [parsed] : [];
|
|
55565
55973
|
});
|
|
@@ -55581,7 +55989,7 @@ var CodexCollector = class {
|
|
|
55581
55989
|
return null;
|
|
55582
55990
|
}
|
|
55583
55991
|
async findMatchingThread(query) {
|
|
55584
|
-
if (!
|
|
55992
|
+
if (!import_node_fs6.default.existsSync(this.statePath)) {
|
|
55585
55993
|
return null;
|
|
55586
55994
|
}
|
|
55587
55995
|
const db = await openDatabase(this.statePath);
|
|
@@ -55607,7 +56015,7 @@ var CodexCollector = class {
|
|
|
55607
56015
|
}
|
|
55608
56016
|
}
|
|
55609
56017
|
async readThreadErrors(threadId) {
|
|
55610
|
-
if (!
|
|
56018
|
+
if (!import_node_fs6.default.existsSync(this.statePath)) {
|
|
55611
56019
|
return [];
|
|
55612
56020
|
}
|
|
55613
56021
|
const db = await openDatabase(this.statePath);
|
|
@@ -55641,17 +56049,44 @@ var CodexCollector = class {
|
|
|
55641
56049
|
};
|
|
55642
56050
|
|
|
55643
56051
|
// packages/sdk/dist/workflows/collectors/opencode.js
|
|
55644
|
-
var
|
|
55645
|
-
var
|
|
55646
|
-
var
|
|
56052
|
+
var import_node_fs7 = __toESM(require("node:fs"), 1);
|
|
56053
|
+
var import_node_os7 = __toESM(require("node:os"), 1);
|
|
56054
|
+
var import_node_path10 = __toESM(require("node:path"), 1);
|
|
55647
56055
|
var import_node_module2 = require("node:module");
|
|
55648
56056
|
var require3 = (0, import_node_module2.createRequire)(import_meta_url);
|
|
55649
|
-
var OPENCODE_DB_PATH =
|
|
56057
|
+
var OPENCODE_DB_PATH = import_node_path10.default.join(import_node_os7.default.homedir(), ".local", "share", "opencode", "opencode.db");
|
|
55650
56058
|
var MATCH_WINDOW_GRACE_MS = 5e3;
|
|
55651
56059
|
var ERROR_LINE_PATTERN = /^(Error|error:|Command failed|FAIL)\b/;
|
|
55652
56060
|
function loadDatabaseConstructor() {
|
|
55653
56061
|
try {
|
|
55654
56062
|
return require3("better-sqlite3");
|
|
56063
|
+
} catch {
|
|
56064
|
+
}
|
|
56065
|
+
try {
|
|
56066
|
+
const { DatabaseSync } = require3("node:sqlite");
|
|
56067
|
+
return function NativeSqliteWrapper(filename, options) {
|
|
56068
|
+
const db = new DatabaseSync(filename, { open: true, readOnly: options?.readonly ?? false });
|
|
56069
|
+
return {
|
|
56070
|
+
prepare(sql) {
|
|
56071
|
+
const stmt = db.prepare(sql);
|
|
56072
|
+
return {
|
|
56073
|
+
get(params) {
|
|
56074
|
+
return params != null ? stmt.get(params) : stmt.get();
|
|
56075
|
+
},
|
|
56076
|
+
all(params) {
|
|
56077
|
+
return params != null ? stmt.all(params) : stmt.all();
|
|
56078
|
+
}
|
|
56079
|
+
};
|
|
56080
|
+
},
|
|
56081
|
+
pragma(source) {
|
|
56082
|
+
db.exec(`PRAGMA ${source}`);
|
|
56083
|
+
return void 0;
|
|
56084
|
+
},
|
|
56085
|
+
close() {
|
|
56086
|
+
db.close();
|
|
56087
|
+
}
|
|
56088
|
+
};
|
|
56089
|
+
};
|
|
55655
56090
|
} catch {
|
|
55656
56091
|
return null;
|
|
55657
56092
|
}
|
|
@@ -55680,7 +56115,7 @@ function isToolPart(part) {
|
|
|
55680
56115
|
}
|
|
55681
56116
|
var OpenCodeCollector = class {
|
|
55682
56117
|
canCollect() {
|
|
55683
|
-
if (!
|
|
56118
|
+
if (!import_node_fs7.default.existsSync(OPENCODE_DB_PATH)) {
|
|
55684
56119
|
return false;
|
|
55685
56120
|
}
|
|
55686
56121
|
const Database = loadDatabaseConstructor();
|
|
@@ -55951,9 +56386,9 @@ function formatRunSummaryTable(outcomes, reports) {
|
|
|
55951
56386
|
|
|
55952
56387
|
// packages/sdk/dist/workflows/trajectory.js
|
|
55953
56388
|
var import_node_crypto4 = require("node:crypto");
|
|
55954
|
-
var
|
|
55955
|
-
var
|
|
55956
|
-
var
|
|
56389
|
+
var import_node_fs8 = require("node:fs");
|
|
56390
|
+
var import_promises4 = require("node:fs/promises");
|
|
56391
|
+
var import_node_path11 = __toESM(require("node:path"), 1);
|
|
55957
56392
|
function classifyFailure(error95) {
|
|
55958
56393
|
const e = error95.toLowerCase();
|
|
55959
56394
|
if (e.includes("timed out") || e.includes("timeout"))
|
|
@@ -56005,7 +56440,7 @@ var WorkflowTrajectory = class {
|
|
|
56005
56440
|
this.reflectOnConverge = cfg.reflectOnConverge !== false;
|
|
56006
56441
|
this.autoDecisions = cfg.autoDecisions !== false;
|
|
56007
56442
|
this.runId = runId;
|
|
56008
|
-
this.dataDir = process.env.TRAJECTORIES_DATA_DIR ??
|
|
56443
|
+
this.dataDir = process.env.TRAJECTORIES_DATA_DIR ?? import_node_path11.default.join(cwd, ".trajectories");
|
|
56009
56444
|
}
|
|
56010
56445
|
// ── Lifecycle ──────────────────────────────────────────────────────────────
|
|
56011
56446
|
/** Start the trajectory (called at run:started). */
|
|
@@ -56414,10 +56849,10 @@ var WorkflowTrajectory = class {
|
|
|
56414
56849
|
if (!this.trajectory)
|
|
56415
56850
|
return;
|
|
56416
56851
|
try {
|
|
56417
|
-
const activeDir =
|
|
56418
|
-
await (0,
|
|
56419
|
-
const filePath =
|
|
56420
|
-
await (0,
|
|
56852
|
+
const activeDir = import_node_path11.default.join(this.dataDir, "active");
|
|
56853
|
+
await (0, import_promises4.mkdir)(activeDir, { recursive: true });
|
|
56854
|
+
const filePath = import_node_path11.default.join(activeDir, `${this.trajectory.id}.json`);
|
|
56855
|
+
await (0, import_promises4.writeFile)(filePath, JSON.stringify(this.trajectory, null, 2), "utf-8");
|
|
56421
56856
|
} catch {
|
|
56422
56857
|
}
|
|
56423
56858
|
}
|
|
@@ -56425,13 +56860,13 @@ var WorkflowTrajectory = class {
|
|
|
56425
56860
|
if (!this.trajectory)
|
|
56426
56861
|
return;
|
|
56427
56862
|
try {
|
|
56428
|
-
const activeDir =
|
|
56429
|
-
const completedDir =
|
|
56430
|
-
await (0,
|
|
56431
|
-
const activePath =
|
|
56432
|
-
const completedPath =
|
|
56433
|
-
if ((0,
|
|
56434
|
-
await (0,
|
|
56863
|
+
const activeDir = import_node_path11.default.join(this.dataDir, "active");
|
|
56864
|
+
const completedDir = import_node_path11.default.join(this.dataDir, "completed");
|
|
56865
|
+
await (0, import_promises4.mkdir)(completedDir, { recursive: true });
|
|
56866
|
+
const activePath = import_node_path11.default.join(activeDir, `${this.trajectory.id}.json`);
|
|
56867
|
+
const completedPath = import_node_path11.default.join(completedDir, `${this.trajectory.id}.json`);
|
|
56868
|
+
if ((0, import_node_fs8.existsSync)(activePath)) {
|
|
56869
|
+
await (0, import_promises4.rename)(activePath, completedPath);
|
|
56435
56870
|
}
|
|
56436
56871
|
} catch {
|
|
56437
56872
|
}
|
|
@@ -56457,21 +56892,9 @@ var WorkflowCompletionError = class extends Error {
|
|
|
56457
56892
|
this.completionReason = completionReason;
|
|
56458
56893
|
}
|
|
56459
56894
|
};
|
|
56460
|
-
var _resolvedCursorCli;
|
|
56461
56895
|
function resolveCursorCli() {
|
|
56462
|
-
|
|
56463
|
-
|
|
56464
|
-
const candidates = ["cursor-agent", "agent"];
|
|
56465
|
-
for (const candidate of candidates) {
|
|
56466
|
-
try {
|
|
56467
|
-
(0, import_node_child_process3.execFileSync)("which", [candidate], { stdio: "ignore" });
|
|
56468
|
-
_resolvedCursorCli = candidate;
|
|
56469
|
-
return candidate;
|
|
56470
|
-
} catch {
|
|
56471
|
-
}
|
|
56472
|
-
}
|
|
56473
|
-
_resolvedCursorCli = "agent";
|
|
56474
|
-
return _resolvedCursorCli;
|
|
56896
|
+
const resolved = resolveCliSync("cursor");
|
|
56897
|
+
return resolved?.binary ?? "agent";
|
|
56475
56898
|
}
|
|
56476
56899
|
var WorkflowRunner = class _WorkflowRunner {
|
|
56477
56900
|
db;
|
|
@@ -56537,8 +56960,8 @@ var WorkflowRunner = class _WorkflowRunner {
|
|
|
56537
56960
|
this.workspaceId = options.workspaceId ?? "local";
|
|
56538
56961
|
this.relayOptions = options.relay ?? {};
|
|
56539
56962
|
this.cwd = options.cwd ?? process.cwd();
|
|
56540
|
-
this.summaryDir = options.summaryDir ??
|
|
56541
|
-
this.workersPath =
|
|
56963
|
+
this.summaryDir = options.summaryDir ?? import_node_path12.default.join(this.cwd, ".relay", "summaries");
|
|
56964
|
+
this.workersPath = import_node_path12.default.join(this.cwd, ".agent-relay", "team", "workers.json");
|
|
56542
56965
|
this.executor = options.executor;
|
|
56543
56966
|
}
|
|
56544
56967
|
// ── Path resolution ─────────────────────────────────────────────────────
|
|
@@ -56567,10 +56990,10 @@ var WorkflowRunner = class _WorkflowRunner {
|
|
|
56567
56990
|
}
|
|
56568
56991
|
seenNames.add(pd.name);
|
|
56569
56992
|
const expanded = _WorkflowRunner.resolveEnvVars(pd.path);
|
|
56570
|
-
const abs =
|
|
56993
|
+
const abs = import_node_path12.default.resolve(baseCwd, expanded);
|
|
56571
56994
|
resolved.set(pd.name, abs);
|
|
56572
56995
|
const isRequired = pd.required !== false;
|
|
56573
|
-
if (!(0,
|
|
56996
|
+
if (!(0, import_node_fs9.existsSync)(abs)) {
|
|
56574
56997
|
if (isRequired) {
|
|
56575
56998
|
errors.push(`Path "${pd.name}" resolves to "${abs}" which does not exist (required)`);
|
|
56576
56999
|
} else {
|
|
@@ -56593,7 +57016,7 @@ var WorkflowRunner = class _WorkflowRunner {
|
|
|
56593
57016
|
return resolved;
|
|
56594
57017
|
}
|
|
56595
57018
|
if (agent.cwd) {
|
|
56596
|
-
return
|
|
57019
|
+
return import_node_path12.default.resolve(this.cwd, agent.cwd);
|
|
56597
57020
|
}
|
|
56598
57021
|
return this.cwd;
|
|
56599
57022
|
}
|
|
@@ -56612,7 +57035,7 @@ var WorkflowRunner = class _WorkflowRunner {
|
|
|
56612
57035
|
}
|
|
56613
57036
|
resolveEffectiveCwd(step, agentDef) {
|
|
56614
57037
|
if (step.cwd) {
|
|
56615
|
-
return
|
|
57038
|
+
return import_node_path12.default.resolve(this.cwd, step.cwd);
|
|
56616
57039
|
}
|
|
56617
57040
|
return this.resolveStepWorkdir(step) ?? (agentDef ? this.resolveAgentCwd(agentDef) : this.cwd);
|
|
56618
57041
|
}
|
|
@@ -56906,16 +57329,16 @@ ${next}` : next;
|
|
|
56906
57329
|
return void 0;
|
|
56907
57330
|
}
|
|
56908
57331
|
uniqueEvidenceRoots(roots) {
|
|
56909
|
-
return [...new Set(roots.filter((root) => Boolean(root)).map((root) =>
|
|
57332
|
+
return [...new Set(roots.filter((root) => Boolean(root)).map((root) => import_node_path12.default.resolve(root)))];
|
|
56910
57333
|
}
|
|
56911
57334
|
captureFileSnapshot(root) {
|
|
56912
57335
|
const snapshot = /* @__PURE__ */ new Map();
|
|
56913
|
-
if (!(0,
|
|
57336
|
+
if (!(0, import_node_fs9.existsSync)(root))
|
|
56914
57337
|
return snapshot;
|
|
56915
57338
|
const visit = (currentPath) => {
|
|
56916
57339
|
let entries;
|
|
56917
57340
|
try {
|
|
56918
|
-
entries = (0,
|
|
57341
|
+
entries = (0, import_node_fs9.readdirSync)(currentPath, { withFileTypes: true });
|
|
56919
57342
|
} catch {
|
|
56920
57343
|
return;
|
|
56921
57344
|
}
|
|
@@ -56923,13 +57346,13 @@ ${next}` : next;
|
|
|
56923
57346
|
if (entry.isDirectory() && _WorkflowRunner.EVIDENCE_IGNORED_DIRS.has(entry.name)) {
|
|
56924
57347
|
continue;
|
|
56925
57348
|
}
|
|
56926
|
-
const fullPath =
|
|
57349
|
+
const fullPath = import_node_path12.default.join(currentPath, entry.name);
|
|
56927
57350
|
if (entry.isDirectory()) {
|
|
56928
57351
|
visit(fullPath);
|
|
56929
57352
|
continue;
|
|
56930
57353
|
}
|
|
56931
57354
|
try {
|
|
56932
|
-
const stats = (0,
|
|
57355
|
+
const stats = (0, import_node_fs9.statSync)(fullPath);
|
|
56933
57356
|
if (!stats.isFile())
|
|
56934
57357
|
continue;
|
|
56935
57358
|
snapshot.set(fullPath, { mtimeMs: stats.mtimeMs, size: stats.size });
|
|
@@ -56938,7 +57361,7 @@ ${next}` : next;
|
|
|
56938
57361
|
}
|
|
56939
57362
|
};
|
|
56940
57363
|
try {
|
|
56941
|
-
const stats = (0,
|
|
57364
|
+
const stats = (0, import_node_fs9.statSync)(root);
|
|
56942
57365
|
if (stats.isFile()) {
|
|
56943
57366
|
snapshot.set(root, { mtimeMs: stats.mtimeMs, size: stats.size });
|
|
56944
57367
|
return snapshot;
|
|
@@ -56975,9 +57398,9 @@ ${next}` : next;
|
|
|
56975
57398
|
return changes.sort((a, b) => a.path.localeCompare(b.path));
|
|
56976
57399
|
}
|
|
56977
57400
|
normalizeEvidencePath(filePath) {
|
|
56978
|
-
const relative =
|
|
57401
|
+
const relative = import_node_path12.default.relative(this.cwd, filePath);
|
|
56979
57402
|
if (!relative || relative === "")
|
|
56980
|
-
return
|
|
57403
|
+
return import_node_path12.default.basename(filePath);
|
|
56981
57404
|
return relative.startsWith("..") ? filePath : relative;
|
|
56982
57405
|
}
|
|
56983
57406
|
buildStepCompletionDecision(stepName, completionReason) {
|
|
@@ -57185,8 +57608,8 @@ ${next}` : next;
|
|
|
57185
57608
|
// ── Parsing & validation ────────────────────────────────────────────────
|
|
57186
57609
|
/** Parse a relay.yaml file from disk. */
|
|
57187
57610
|
async parseYamlFile(filePath) {
|
|
57188
|
-
const absPath =
|
|
57189
|
-
const raw = await (0,
|
|
57611
|
+
const absPath = import_node_path12.default.resolve(this.cwd, filePath);
|
|
57612
|
+
const raw = await (0, import_promises5.readFile)(absPath, "utf-8");
|
|
57190
57613
|
return this.parseYamlString(raw, absPath);
|
|
57191
57614
|
}
|
|
57192
57615
|
/** Parse a relay.yaml string. */
|
|
@@ -57339,15 +57762,15 @@ ${err.suggestion}`);
|
|
|
57339
57762
|
}
|
|
57340
57763
|
for (const agent of resolved.agents) {
|
|
57341
57764
|
if (agent.cwd) {
|
|
57342
|
-
const resolvedCwd =
|
|
57343
|
-
if (!(0,
|
|
57765
|
+
const resolvedCwd = import_node_path12.default.resolve(this.cwd, agent.cwd);
|
|
57766
|
+
if (!(0, import_node_fs9.existsSync)(resolvedCwd)) {
|
|
57344
57767
|
warnings.push(`Agent "${agent.name}" cwd "${agent.cwd}" resolves to "${resolvedCwd}" which does not exist`);
|
|
57345
57768
|
}
|
|
57346
57769
|
}
|
|
57347
57770
|
if (agent.additionalPaths) {
|
|
57348
57771
|
for (const ap of agent.additionalPaths) {
|
|
57349
|
-
const resolvedPath =
|
|
57350
|
-
if (!(0,
|
|
57772
|
+
const resolvedPath = import_node_path12.default.resolve(this.cwd, ap);
|
|
57773
|
+
if (!(0, import_node_fs9.existsSync)(resolvedPath)) {
|
|
57351
57774
|
warnings.push(`Agent "${agent.name}" additionalPath "${ap}" resolves to "${resolvedPath}" which does not exist`);
|
|
57352
57775
|
}
|
|
57353
57776
|
}
|
|
@@ -57851,7 +58274,7 @@ ${err.suggestion}`);
|
|
|
57851
58274
|
}
|
|
57852
58275
|
}
|
|
57853
58276
|
this.log("Starting broker...");
|
|
57854
|
-
const brokerBaseName =
|
|
58277
|
+
const brokerBaseName = import_node_path12.default.basename(this.cwd) || "workflow";
|
|
57855
58278
|
const brokerName = `${brokerBaseName}-${runId.slice(0, 8)}`;
|
|
57856
58279
|
this.relay = new AgentRelay({
|
|
57857
58280
|
...this.relayOptions,
|
|
@@ -57873,7 +58296,7 @@ ${err.suggestion}`);
|
|
|
57873
58296
|
if (/Read\(/.test(stripped)) {
|
|
57874
58297
|
const m = stripped.match(/Read\(\s*~?([^\s)"']{8,})/);
|
|
57875
58298
|
if (m) {
|
|
57876
|
-
const base =
|
|
58299
|
+
const base = import_node_path12.default.basename(m[1]);
|
|
57877
58300
|
activity = base.length >= 3 ? `Reading ${base}` : "Reading file...";
|
|
57878
58301
|
} else {
|
|
57879
58302
|
activity = "Reading file...";
|
|
@@ -57881,7 +58304,7 @@ ${err.suggestion}`);
|
|
|
57881
58304
|
} else if (/Edit\(/.test(stripped)) {
|
|
57882
58305
|
const m = stripped.match(/Edit\(\s*~?([^\s)"']{8,})/);
|
|
57883
58306
|
if (m) {
|
|
57884
|
-
const base =
|
|
58307
|
+
const base = import_node_path12.default.basename(m[1]);
|
|
57885
58308
|
activity = base.length >= 3 ? `Editing ${base}` : "Editing file...";
|
|
57886
58309
|
} else {
|
|
57887
58310
|
activity = "Editing file...";
|
|
@@ -58248,7 +58671,7 @@ ${err.suggestion}`);
|
|
|
58248
58671
|
this.postToChannel(`**[preflight]** ${description}`);
|
|
58249
58672
|
try {
|
|
58250
58673
|
const output = await new Promise((resolve3, reject) => {
|
|
58251
|
-
const child = (0,
|
|
58674
|
+
const child = (0, import_node_child_process4.spawn)("sh", ["-c", check3.command], {
|
|
58252
58675
|
stdio: "pipe",
|
|
58253
58676
|
cwd: this.cwd,
|
|
58254
58677
|
env: { ...process.env }
|
|
@@ -58431,7 +58854,7 @@ ${trimmedOutput.slice(0, 200)}`);
|
|
|
58431
58854
|
let commandStdout = "";
|
|
58432
58855
|
let commandStderr = "";
|
|
58433
58856
|
const output = await new Promise((resolve3, reject) => {
|
|
58434
|
-
const child = (0,
|
|
58857
|
+
const child = (0, import_node_child_process4.spawn)("sh", ["-c", resolvedCommand], {
|
|
58435
58858
|
stdio: "pipe",
|
|
58436
58859
|
cwd: stepCwd,
|
|
58437
58860
|
env: { ...process.env }
|
|
@@ -58557,7 +58980,7 @@ ${trimmedOutput.slice(0, 200)}`);
|
|
|
58557
58980
|
const stepOutputContext = this.buildStepOutputContext(stepStates, runId);
|
|
58558
58981
|
const branch = this.interpolateStepTask(step.branch ?? "", stepOutputContext);
|
|
58559
58982
|
const baseBranch = step.baseBranch ? this.interpolateStepTask(step.baseBranch, stepOutputContext) : "HEAD";
|
|
58560
|
-
const worktreePath = step.path ? this.interpolateStepTask(step.path, stepOutputContext) :
|
|
58983
|
+
const worktreePath = step.path ? this.interpolateStepTask(step.path, stepOutputContext) : import_node_path12.default.join(".worktrees", step.name);
|
|
58561
58984
|
const createBranch = step.createBranch !== false;
|
|
58562
58985
|
const stepCwd = this.resolveStepWorkdir(step) ?? this.cwd;
|
|
58563
58986
|
this.beginStepEvidence(step.name, [stepCwd], state.row.startedAt);
|
|
@@ -58567,11 +58990,11 @@ ${trimmedOutput.slice(0, 200)}`);
|
|
|
58567
58990
|
throw new Error(`Step "${step.name}" failed: ${errorMsg}`);
|
|
58568
58991
|
}
|
|
58569
58992
|
try {
|
|
58570
|
-
const absoluteWorktreePath =
|
|
58993
|
+
const absoluteWorktreePath = import_node_path12.default.resolve(stepCwd, worktreePath);
|
|
58571
58994
|
const checkBranchCmd = `git rev-parse --verify --quiet ${branch} 2>/dev/null`;
|
|
58572
58995
|
let branchExists = false;
|
|
58573
58996
|
await new Promise((resolve3) => {
|
|
58574
|
-
const checkChild = (0,
|
|
58997
|
+
const checkChild = (0, import_node_child_process4.spawn)("sh", ["-c", checkBranchCmd], {
|
|
58575
58998
|
stdio: "pipe",
|
|
58576
58999
|
cwd: stepCwd,
|
|
58577
59000
|
env: { ...process.env }
|
|
@@ -58597,7 +59020,7 @@ ${trimmedOutput.slice(0, 200)}`);
|
|
|
58597
59020
|
let commandExitCode;
|
|
58598
59021
|
let commandExitSignal;
|
|
58599
59022
|
const output = await new Promise((resolve3, reject) => {
|
|
58600
|
-
const child = (0,
|
|
59023
|
+
const child = (0, import_node_child_process4.spawn)("sh", ["-c", worktreeCmd], {
|
|
58601
59024
|
stdio: "pipe",
|
|
58602
59025
|
cwd: stepCwd,
|
|
58603
59026
|
env: { ...process.env }
|
|
@@ -59729,30 +60152,18 @@ ${review}
|
|
|
59729
60152
|
}
|
|
59730
60153
|
/**
|
|
59731
60154
|
* Build the CLI command and arguments for a non-interactive agent execution.
|
|
59732
|
-
*
|
|
60155
|
+
* Delegates to the consolidated CLI registry for per-CLI arg formats.
|
|
59733
60156
|
*/
|
|
59734
60157
|
static buildNonInteractiveCommand(cli, task, extraArgs = []) {
|
|
59735
|
-
|
|
59736
|
-
|
|
59737
|
-
|
|
59738
|
-
|
|
59739
|
-
return { cmd: "codex", args: ["exec", task, ...extraArgs] };
|
|
59740
|
-
case "gemini":
|
|
59741
|
-
return { cmd: "gemini", args: ["-p", task, ...extraArgs] };
|
|
59742
|
-
case "opencode":
|
|
59743
|
-
return { cmd: "opencode", args: ["--prompt", task, ...extraArgs] };
|
|
59744
|
-
case "droid":
|
|
59745
|
-
return { cmd: "droid", args: ["exec", task, ...extraArgs] };
|
|
59746
|
-
case "aider":
|
|
59747
|
-
return { cmd: "aider", args: ["--message", task, "--yes-always", "--no-git", ...extraArgs] };
|
|
59748
|
-
case "goose":
|
|
59749
|
-
return { cmd: "goose", args: ["run", "--text", task, "--no-session", ...extraArgs] };
|
|
59750
|
-
case "cursor-agent":
|
|
59751
|
-
case "agent":
|
|
59752
|
-
return { cmd: cli, args: ["--force", "-p", task, ...extraArgs] };
|
|
59753
|
-
case "cursor":
|
|
59754
|
-
return { cmd: resolveCursorCli(), args: ["--force", "-p", task, ...extraArgs] };
|
|
60158
|
+
const resolvedCli = cli === "cursor" ? resolveCursorCli() : cli;
|
|
60159
|
+
const def = getCliDefinition(resolvedCli);
|
|
60160
|
+
if (!def) {
|
|
60161
|
+
throw new Error(`Unknown CLI: ${resolvedCli}`);
|
|
59755
60162
|
}
|
|
60163
|
+
return {
|
|
60164
|
+
cmd: def.binaries[0],
|
|
60165
|
+
args: def.nonInteractiveArgs(task, extraArgs)
|
|
60166
|
+
};
|
|
59756
60167
|
}
|
|
59757
60168
|
/**
|
|
59758
60169
|
* Apply preset defaults to an agent definition.
|
|
@@ -59817,8 +60228,8 @@ DO NOT:
|
|
|
59817
60228
|
- Output only status messages without the actual deliverable content`;
|
|
59818
60229
|
const { cmd, args } = _WorkflowRunner.buildNonInteractiveCommand(agentDef.cli, taskWithDeliverable, modelArgs);
|
|
59819
60230
|
const logsDir = this.getWorkerLogsDir();
|
|
59820
|
-
const logPath =
|
|
59821
|
-
const logStream = (0,
|
|
60231
|
+
const logPath = import_node_path12.default.join(logsDir, `${agentName}.log`);
|
|
60232
|
+
const logStream = (0, import_node_fs9.createWriteStream)(logPath, { flags: "a" });
|
|
59822
60233
|
this.registerWorker(agentName, agentDef.cli, step.task ?? "", void 0, false);
|
|
59823
60234
|
let stopHeartbeat;
|
|
59824
60235
|
if (this.relayApiKey) {
|
|
@@ -59835,7 +60246,7 @@ DO NOT:
|
|
|
59835
60246
|
const stderrChunks = [];
|
|
59836
60247
|
try {
|
|
59837
60248
|
const { stdout: output, exitCode, exitSignal } = await new Promise((resolve3, reject) => {
|
|
59838
|
-
const child = (0,
|
|
60249
|
+
const child = (0, import_node_child_process4.spawn)(cmd, args, {
|
|
59839
60250
|
stdio: ["ignore", "pipe", "pipe"],
|
|
59840
60251
|
cwd: this.resolveEffectiveCwd(step, agentDef),
|
|
59841
60252
|
env: this.getRelayEnv() ?? { ...process.env }
|
|
@@ -59954,7 +60365,7 @@ DO NOT:
|
|
|
59954
60365
|
const taskWithExit = step.task + (relayRegistrationNote ? "\n\n" + relayRegistrationNote : "") + (delegationGuidance ? "\n\n" + delegationGuidance + "\n" : "") + '\n\n---\nIMPORTANT: When you have fully completed this task, you MUST self-terminate by either: (a) calling remove_agent(name: "<your-agent-name>", reason: "task completed") \u2014 preferred, or (b) outputting the exact text "/exit" on its own line as a fallback. Do not wait for further input \u2014 terminate immediately after finishing. Do NOT spawn sub-agents unless the task explicitly requires it.';
|
|
59955
60366
|
this.ptyOutputBuffers.set(agentName, []);
|
|
59956
60367
|
const logsDir = this.getWorkerLogsDir();
|
|
59957
|
-
const logStream = (0,
|
|
60368
|
+
const logStream = (0, import_node_fs9.createWriteStream)(import_node_path12.default.join(logsDir, `${agentName}.log`), { flags: "a" });
|
|
59958
60369
|
this.ptyLogStreams.set(agentName, logStream);
|
|
59959
60370
|
this.ptyListeners.set(agentName, (chunk) => {
|
|
59960
60371
|
const stripped = _WorkflowRunner.stripAnsi(chunk);
|
|
@@ -59989,18 +60400,18 @@ DO NOT:
|
|
|
59989
60400
|
const oldName = agentName;
|
|
59990
60401
|
this.ptyOutputBuffers.set(agent.name, this.ptyOutputBuffers.get(oldName) ?? []);
|
|
59991
60402
|
this.ptyOutputBuffers.delete(oldName);
|
|
59992
|
-
const oldLogPath =
|
|
59993
|
-
const newLogPath =
|
|
60403
|
+
const oldLogPath = import_node_path12.default.join(logsDir, `${oldName}.log`);
|
|
60404
|
+
const newLogPath = import_node_path12.default.join(logsDir, `${agent.name}.log`);
|
|
59994
60405
|
const oldLogStream = this.ptyLogStreams.get(oldName);
|
|
59995
60406
|
if (oldLogStream) {
|
|
59996
60407
|
oldLogStream.end();
|
|
59997
60408
|
this.ptyLogStreams.delete(oldName);
|
|
59998
60409
|
try {
|
|
59999
|
-
(0,
|
|
60410
|
+
(0, import_node_fs9.renameSync)(oldLogPath, newLogPath);
|
|
60000
60411
|
} catch {
|
|
60001
60412
|
}
|
|
60002
60413
|
}
|
|
60003
|
-
const newLogStream = (0,
|
|
60414
|
+
const newLogStream = (0, import_node_fs9.createWriteStream)(newLogPath, { flags: "a" });
|
|
60004
60415
|
this.ptyLogStreams.set(agent.name, newLogStream);
|
|
60005
60416
|
const oldListener = this.ptyListeners.get(oldName);
|
|
60006
60417
|
if (oldListener) {
|
|
@@ -60104,8 +60515,8 @@ DO NOT:
|
|
|
60104
60515
|
if (ptyChunks.length > 0) {
|
|
60105
60516
|
output = ptyChunks.join("");
|
|
60106
60517
|
} else {
|
|
60107
|
-
const summaryPath =
|
|
60108
|
-
output = (0,
|
|
60518
|
+
const summaryPath = import_node_path12.default.join(this.summaryDir, `${step.name}.md`);
|
|
60519
|
+
output = (0, import_node_fs9.existsSync)(summaryPath) ? await (0, import_promises5.readFile)(summaryPath, "utf-8") : exitResult === "timeout" ? "Agent completed (released after idle timeout)" : exitResult === "released" ? "Agent completed (idle \u2014 treated as done)" : `Agent exited (${exitResult})`;
|
|
60109
60520
|
}
|
|
60110
60521
|
if (ptyChunks.length === 0) {
|
|
60111
60522
|
this.captureStepTerminalEvidence(evidenceStepName, { stdout: output, combined: output }, { exitCode: agent?.exitCode, exitSignal: agent?.exitSignal }, {
|
|
@@ -60356,7 +60767,7 @@ DO NOT:
|
|
|
60356
60767
|
case "exit_code":
|
|
60357
60768
|
break;
|
|
60358
60769
|
case "file_exists":
|
|
60359
|
-
if (!(0,
|
|
60770
|
+
if (!(0, import_node_fs9.existsSync)(import_node_path12.default.resolve(this.cwd, check3.value))) {
|
|
60360
60771
|
return fail(`Verification failed for "${stepName}": file "${check3.value}" does not exist`);
|
|
60361
60772
|
}
|
|
60362
60773
|
break;
|
|
@@ -60668,7 +61079,7 @@ RELAY SETUP \u2014 do this FIRST before any other relay tool:
|
|
|
60668
61079
|
}
|
|
60669
61080
|
}
|
|
60670
61081
|
const outputDir = this.getStepOutputDir(runId);
|
|
60671
|
-
const logsDir =
|
|
61082
|
+
const logsDir = import_node_path12.default.join(this.cwd, ".agent-relay", "team", "worker-logs");
|
|
60672
61083
|
console.log("");
|
|
60673
61084
|
console.log(` Run ID: ${runId}`);
|
|
60674
61085
|
console.log(` Step output: ${outputDir}`);
|
|
@@ -60754,8 +61165,8 @@ ${excerpt}` : "";
|
|
|
60754
61165
|
if (!target)
|
|
60755
61166
|
return;
|
|
60756
61167
|
try {
|
|
60757
|
-
(0,
|
|
60758
|
-
(0,
|
|
61168
|
+
(0, import_node_fs9.mkdirSync)(import_node_path12.default.dirname(target), { recursive: true });
|
|
61169
|
+
(0, import_node_fs9.writeFileSync)(target, runId + "\n", "utf8");
|
|
60759
61170
|
} catch {
|
|
60760
61171
|
}
|
|
60761
61172
|
}
|
|
@@ -60857,16 +61268,16 @@ ${excerpt}` : "";
|
|
|
60857
61268
|
}
|
|
60858
61269
|
/** Directory for persisted step outputs: .agent-relay/step-outputs/{runId}/ */
|
|
60859
61270
|
getStepOutputDir(runId) {
|
|
60860
|
-
return
|
|
61271
|
+
return import_node_path12.default.join(this.cwd, ".agent-relay", "step-outputs", runId);
|
|
60861
61272
|
}
|
|
60862
61273
|
/** Persist step output to disk and post full output as a channel message. */
|
|
60863
61274
|
async persistStepOutput(runId, stepName, output) {
|
|
60864
|
-
const outputPath =
|
|
61275
|
+
const outputPath = import_node_path12.default.join(this.getStepOutputDir(runId), `${stepName}.md`);
|
|
60865
61276
|
try {
|
|
60866
61277
|
const dir = this.getStepOutputDir(runId);
|
|
60867
|
-
(0,
|
|
61278
|
+
(0, import_node_fs9.mkdirSync)(dir, { recursive: true });
|
|
60868
61279
|
const cleaned = _WorkflowRunner.stripAnsi(output);
|
|
60869
|
-
await (0,
|
|
61280
|
+
await (0, import_promises5.writeFile)(outputPath, cleaned);
|
|
60870
61281
|
} catch {
|
|
60871
61282
|
}
|
|
60872
61283
|
this.recordStepToolSideEffect(stepName, {
|
|
@@ -60887,28 +61298,28 @@ ${preview}
|
|
|
60887
61298
|
\`\`\``, { stepName });
|
|
60888
61299
|
}
|
|
60889
61300
|
async persistAgentReport(runId, stepName, report) {
|
|
60890
|
-
const reportPath =
|
|
61301
|
+
const reportPath = import_node_path12.default.join(this.getStepOutputDir(runId), `${stepName}.report.json`);
|
|
60891
61302
|
try {
|
|
60892
|
-
(0,
|
|
60893
|
-
await (0,
|
|
61303
|
+
(0, import_node_fs9.mkdirSync)(this.getStepOutputDir(runId), { recursive: true });
|
|
61304
|
+
await (0, import_promises5.writeFile)(reportPath, JSON.stringify(report, null, 2), "utf8");
|
|
60894
61305
|
} catch {
|
|
60895
61306
|
}
|
|
60896
61307
|
}
|
|
60897
61308
|
/** Scan .agent-relay/step-outputs/ for the most recent run directory containing the needed steps. */
|
|
60898
61309
|
findMostRecentRunWithSteps(stepNames) {
|
|
60899
61310
|
try {
|
|
60900
|
-
const baseDir =
|
|
60901
|
-
if (!(0,
|
|
61311
|
+
const baseDir = import_node_path12.default.join(this.cwd, ".agent-relay", "step-outputs");
|
|
61312
|
+
if (!(0, import_node_fs9.existsSync)(baseDir))
|
|
60902
61313
|
return void 0;
|
|
60903
|
-
const entries = (0,
|
|
61314
|
+
const entries = (0, import_node_fs9.readdirSync)(baseDir);
|
|
60904
61315
|
let best;
|
|
60905
61316
|
for (const entry of entries) {
|
|
60906
|
-
const dirPath =
|
|
61317
|
+
const dirPath = import_node_path12.default.join(baseDir, entry);
|
|
60907
61318
|
try {
|
|
60908
|
-
const stat2 = (0,
|
|
61319
|
+
const stat2 = (0, import_node_fs9.statSync)(dirPath);
|
|
60909
61320
|
if (!stat2.isDirectory())
|
|
60910
61321
|
continue;
|
|
60911
|
-
const hasAny = [...stepNames].some((name) => (0,
|
|
61322
|
+
const hasAny = [...stepNames].some((name) => (0, import_node_fs9.existsSync)(import_node_path12.default.join(dirPath, `${name}.md`)));
|
|
60912
61323
|
if (!hasAny)
|
|
60913
61324
|
continue;
|
|
60914
61325
|
if (!best || stat2.mtimeMs > best.mtime) {
|
|
@@ -60926,18 +61337,18 @@ ${preview}
|
|
|
60926
61337
|
/** Load persisted step output from disk. */
|
|
60927
61338
|
loadStepOutput(runId, stepName) {
|
|
60928
61339
|
try {
|
|
60929
|
-
const filePath =
|
|
60930
|
-
if (!(0,
|
|
61340
|
+
const filePath = import_node_path12.default.join(this.getStepOutputDir(runId), `${stepName}.md`);
|
|
61341
|
+
if (!(0, import_node_fs9.existsSync)(filePath))
|
|
60931
61342
|
return void 0;
|
|
60932
|
-
return (0,
|
|
61343
|
+
return (0, import_node_fs9.readFileSync)(filePath, "utf-8");
|
|
60933
61344
|
} catch {
|
|
60934
61345
|
return void 0;
|
|
60935
61346
|
}
|
|
60936
61347
|
}
|
|
60937
61348
|
/** Get or create the worker logs directory (.agent-relay/team/worker-logs) */
|
|
60938
61349
|
getWorkerLogsDir() {
|
|
60939
|
-
const logsDir =
|
|
60940
|
-
(0,
|
|
61350
|
+
const logsDir = import_node_path12.default.join(this.cwd, ".agent-relay", "team", "worker-logs");
|
|
61351
|
+
(0, import_node_fs9.mkdirSync)(logsDir, { recursive: true });
|
|
60941
61352
|
return logsDir;
|
|
60942
61353
|
}
|
|
60943
61354
|
/** Register a spawned agent in workers.json so `agents:kill` can find it. */
|
|
@@ -60948,12 +61359,12 @@ ${preview}
|
|
|
60948
61359
|
spawnedAt: Date.now(),
|
|
60949
61360
|
pid,
|
|
60950
61361
|
interactive,
|
|
60951
|
-
logFile:
|
|
61362
|
+
logFile: import_node_path12.default.join(this.getWorkerLogsDir(), `${agentName}.log`)
|
|
60952
61363
|
};
|
|
60953
61364
|
this.activeWorkers.set(agentName, workerEntry);
|
|
60954
61365
|
this.workersFileLock = this.workersFileLock.then(() => {
|
|
60955
61366
|
try {
|
|
60956
|
-
(0,
|
|
61367
|
+
(0, import_node_fs9.mkdirSync)(import_node_path12.default.dirname(this.workersPath), { recursive: true });
|
|
60957
61368
|
const existing = this.readWorkers().filter((w) => w.name !== agentName);
|
|
60958
61369
|
existing.push({ name: agentName, ...workerEntry });
|
|
60959
61370
|
this.writeWorkers(existing);
|
|
@@ -60975,22 +61386,22 @@ ${preview}
|
|
|
60975
61386
|
}
|
|
60976
61387
|
readWorkers() {
|
|
60977
61388
|
try {
|
|
60978
|
-
if (!(0,
|
|
61389
|
+
if (!(0, import_node_fs9.existsSync)(this.workersPath))
|
|
60979
61390
|
return [];
|
|
60980
|
-
const raw = JSON.parse((0,
|
|
61391
|
+
const raw = JSON.parse((0, import_node_fs9.readFileSync)(this.workersPath, "utf-8"));
|
|
60981
61392
|
return Array.isArray(raw?.workers) ? raw.workers : [];
|
|
60982
61393
|
} catch {
|
|
60983
61394
|
return [];
|
|
60984
61395
|
}
|
|
60985
61396
|
}
|
|
60986
61397
|
writeWorkers(workers) {
|
|
60987
|
-
(0,
|
|
61398
|
+
(0, import_node_fs9.writeFileSync)(this.workersPath, JSON.stringify({ workers }, null, 2));
|
|
60988
61399
|
}
|
|
60989
61400
|
};
|
|
60990
61401
|
|
|
60991
61402
|
// packages/sdk/dist/workflows/file-db.js
|
|
60992
|
-
var
|
|
60993
|
-
var
|
|
61403
|
+
var import_node_fs10 = require("node:fs");
|
|
61404
|
+
var import_node_path13 = __toESM(require("node:path"), 1);
|
|
60994
61405
|
var JsonFileWorkflowDb = class {
|
|
60995
61406
|
filePath;
|
|
60996
61407
|
/** Whether the storage directory is writable. False = silent no-op mode. */
|
|
@@ -60999,7 +61410,7 @@ var JsonFileWorkflowDb = class {
|
|
|
60999
61410
|
this.filePath = filePath;
|
|
61000
61411
|
let writable = false;
|
|
61001
61412
|
try {
|
|
61002
|
-
(0,
|
|
61413
|
+
(0, import_node_fs10.mkdirSync)(import_node_path13.default.dirname(filePath), { recursive: true });
|
|
61003
61414
|
writable = true;
|
|
61004
61415
|
} catch {
|
|
61005
61416
|
}
|
|
@@ -61014,7 +61425,7 @@ var JsonFileWorkflowDb = class {
|
|
|
61014
61425
|
if (!this.writable)
|
|
61015
61426
|
return;
|
|
61016
61427
|
try {
|
|
61017
|
-
(0,
|
|
61428
|
+
(0, import_node_fs10.appendFileSync)(this.filePath, JSON.stringify(entry) + "\n", "utf8");
|
|
61018
61429
|
} catch {
|
|
61019
61430
|
}
|
|
61020
61431
|
}
|
|
@@ -61024,7 +61435,7 @@ var JsonFileWorkflowDb = class {
|
|
|
61024
61435
|
const steps = /* @__PURE__ */ new Map();
|
|
61025
61436
|
let raw = "";
|
|
61026
61437
|
try {
|
|
61027
|
-
raw = (0,
|
|
61438
|
+
raw = (0, import_node_fs10.readFileSync)(this.filePath, "utf8");
|
|
61028
61439
|
} catch {
|
|
61029
61440
|
return { runs, steps };
|
|
61030
61441
|
}
|
|
@@ -61166,6 +61577,109 @@ async function runWorkflow(yamlPath, options = {}) {
|
|
|
61166
61577
|
|
|
61167
61578
|
// packages/sdk/dist/workflows/builder.js
|
|
61168
61579
|
var import_yaml3 = __toESM(require_dist(), 1);
|
|
61580
|
+
|
|
61581
|
+
// packages/sdk/dist/workflows/default-logger.js
|
|
61582
|
+
var import_chalk2 = __toESM(require_source(), 1);
|
|
61583
|
+
var noop = () => {
|
|
61584
|
+
};
|
|
61585
|
+
function createDefaultEventLogger(level = "normal") {
|
|
61586
|
+
if (level === false)
|
|
61587
|
+
return noop;
|
|
61588
|
+
return (event) => {
|
|
61589
|
+
switch (event.type) {
|
|
61590
|
+
// ── Run lifecycle ──
|
|
61591
|
+
case "run:started":
|
|
61592
|
+
if (level !== "quiet") {
|
|
61593
|
+
console.log(import_chalk2.default.cyan(`[workflow] run ${event.runId.slice(0, 8)}...`));
|
|
61594
|
+
}
|
|
61595
|
+
break;
|
|
61596
|
+
case "run:completed":
|
|
61597
|
+
console.log(import_chalk2.default.green(`[workflow] completed`));
|
|
61598
|
+
break;
|
|
61599
|
+
case "run:failed":
|
|
61600
|
+
console.log(import_chalk2.default.red(`[workflow] FAILED: ${event.error}`));
|
|
61601
|
+
break;
|
|
61602
|
+
case "run:cancelled":
|
|
61603
|
+
if (level !== "quiet") {
|
|
61604
|
+
console.log(import_chalk2.default.yellow(`[workflow] cancelled`));
|
|
61605
|
+
}
|
|
61606
|
+
break;
|
|
61607
|
+
// ── Step lifecycle ──
|
|
61608
|
+
case "step:started":
|
|
61609
|
+
if (level !== "quiet") {
|
|
61610
|
+
console.log(import_chalk2.default.blue(` \u25CF ${event.stepName} \u2014 started`));
|
|
61611
|
+
}
|
|
61612
|
+
break;
|
|
61613
|
+
case "step:completed":
|
|
61614
|
+
if (level !== "quiet") {
|
|
61615
|
+
console.log(import_chalk2.default.green(` \u2713 ${event.stepName} \u2014 completed`));
|
|
61616
|
+
}
|
|
61617
|
+
break;
|
|
61618
|
+
case "step:failed":
|
|
61619
|
+
console.log(import_chalk2.default.red(` \u2717 ${event.stepName} \u2014 FAILED: ${event.error}`));
|
|
61620
|
+
break;
|
|
61621
|
+
case "step:skipped":
|
|
61622
|
+
if (level !== "quiet") {
|
|
61623
|
+
console.log(import_chalk2.default.gray(` \u25CB ${event.stepName} \u2014 skipped`));
|
|
61624
|
+
}
|
|
61625
|
+
break;
|
|
61626
|
+
case "step:retrying":
|
|
61627
|
+
if (level !== "quiet") {
|
|
61628
|
+
console.log(import_chalk2.default.yellow(` \u21BB ${event.stepName} \u2014 retrying (attempt ${event.attempt})`));
|
|
61629
|
+
}
|
|
61630
|
+
break;
|
|
61631
|
+
case "step:nudged":
|
|
61632
|
+
if (level !== "quiet") {
|
|
61633
|
+
console.log(import_chalk2.default.yellow(` \u26A1 ${event.stepName} \u2014 nudged (${event.nudgeCount})`));
|
|
61634
|
+
}
|
|
61635
|
+
break;
|
|
61636
|
+
case "step:agent-report": {
|
|
61637
|
+
if (level !== "quiet") {
|
|
61638
|
+
const r = event.report;
|
|
61639
|
+
const parts = [];
|
|
61640
|
+
if (r.model)
|
|
61641
|
+
parts.push(r.model);
|
|
61642
|
+
if (r.cost != null)
|
|
61643
|
+
parts.push(`$${r.cost.toFixed(2)}`);
|
|
61644
|
+
if (r.tokens)
|
|
61645
|
+
parts.push(`${r.tokens.input}+${r.tokens.output} tokens`);
|
|
61646
|
+
parts.push(`${r.errors.length} errors`);
|
|
61647
|
+
console.log(import_chalk2.default.dim(` \u{1F4CA} ${event.stepName} \u2014 ${parts.join(" \xB7 ")}`));
|
|
61648
|
+
}
|
|
61649
|
+
break;
|
|
61650
|
+
}
|
|
61651
|
+
// ── Broker-level events (verbose only) ──
|
|
61652
|
+
case "broker:event":
|
|
61653
|
+
if (level === "verbose") {
|
|
61654
|
+
console.log(import_chalk2.default.dim(` [broker] ${JSON.stringify(event.event)}`));
|
|
61655
|
+
}
|
|
61656
|
+
break;
|
|
61657
|
+
// ── Other events (verbose only) ──
|
|
61658
|
+
case "step:owner-assigned":
|
|
61659
|
+
if (level === "verbose") {
|
|
61660
|
+
console.log(import_chalk2.default.dim(` ${event.stepName} \u2014 owner: ${event.ownerName}, specialist: ${event.specialistName}`));
|
|
61661
|
+
}
|
|
61662
|
+
break;
|
|
61663
|
+
case "step:review-completed":
|
|
61664
|
+
if (level === "verbose") {
|
|
61665
|
+
console.log(import_chalk2.default.dim(` ${event.stepName} \u2014 review: ${event.decision} by ${event.reviewerName}`));
|
|
61666
|
+
}
|
|
61667
|
+
break;
|
|
61668
|
+
case "step:owner-timeout":
|
|
61669
|
+
if (level !== "quiet") {
|
|
61670
|
+
console.log(import_chalk2.default.yellow(` \u23F1 ${event.stepName} \u2014 owner timeout (${event.ownerName})`));
|
|
61671
|
+
}
|
|
61672
|
+
break;
|
|
61673
|
+
case "step:force-released":
|
|
61674
|
+
if (level === "verbose") {
|
|
61675
|
+
console.log(import_chalk2.default.dim(` ${event.stepName} \u2014 force-released`));
|
|
61676
|
+
}
|
|
61677
|
+
break;
|
|
61678
|
+
}
|
|
61679
|
+
};
|
|
61680
|
+
}
|
|
61681
|
+
|
|
61682
|
+
// packages/sdk/dist/workflows/builder.js
|
|
61169
61683
|
var WorkflowBuilder = class {
|
|
61170
61684
|
_name;
|
|
61171
61685
|
_description;
|
|
@@ -61376,8 +61890,11 @@ var WorkflowBuilder = class {
|
|
|
61376
61890
|
config3.swarm.channel = this._channel;
|
|
61377
61891
|
if (this._idleNudge !== void 0)
|
|
61378
61892
|
config3.swarm.idleNudge = this._idleNudge;
|
|
61379
|
-
|
|
61380
|
-
|
|
61893
|
+
config3.errorHandling = this._errorHandling ?? {
|
|
61894
|
+
strategy: "retry",
|
|
61895
|
+
maxRetries: 2,
|
|
61896
|
+
retryDelayMs: 1e4
|
|
61897
|
+
};
|
|
61381
61898
|
if (this._coordination !== void 0)
|
|
61382
61899
|
config3.coordination = this._coordination;
|
|
61383
61900
|
if (this._state !== void 0)
|
|
@@ -61403,16 +61920,32 @@ var WorkflowBuilder = class {
|
|
|
61403
61920
|
console.log(formatDryRunReport(report));
|
|
61404
61921
|
return report;
|
|
61405
61922
|
}
|
|
61923
|
+
const logLevel = options.renderer === "listr" || options.renderer === false ? false : options.logLevel ?? "normal";
|
|
61924
|
+
if (logLevel !== false) {
|
|
61925
|
+
runner.on(createDefaultEventLogger(logLevel));
|
|
61926
|
+
}
|
|
61406
61927
|
if (options.onEvent) {
|
|
61407
61928
|
runner.on(options.onEvent);
|
|
61408
61929
|
}
|
|
61409
61930
|
const resumeRunId = process.env.RESUME_RUN_ID;
|
|
61410
|
-
if (resumeRunId) {
|
|
61411
|
-
return runner.resume(resumeRunId, options.vars);
|
|
61412
|
-
}
|
|
61413
61931
|
const startFrom = this._startFrom ?? options.startFrom ?? process.env.START_FROM;
|
|
61414
61932
|
const previousRunId = this._previousRunId ?? options.previousRunId ?? process.env.PREVIOUS_RUN_ID;
|
|
61415
61933
|
const executeOptions = startFrom ? { startFrom, previousRunId } : void 0;
|
|
61934
|
+
if (options.renderer === "listr") {
|
|
61935
|
+
const { createWorkflowRenderer: createWorkflowRenderer2 } = await Promise.resolve().then(() => (init_listr_renderer(), listr_renderer_exports));
|
|
61936
|
+
const renderer = createWorkflowRenderer2();
|
|
61937
|
+
runner.on(renderer.onEvent);
|
|
61938
|
+
const runPromise = resumeRunId ? runner.resume(resumeRunId, options.vars) : runner.execute(config3, options.workflow, options.vars, executeOptions);
|
|
61939
|
+
try {
|
|
61940
|
+
const [result] = await Promise.all([runPromise, renderer.start()]);
|
|
61941
|
+
return result;
|
|
61942
|
+
} finally {
|
|
61943
|
+
renderer.unmount();
|
|
61944
|
+
}
|
|
61945
|
+
}
|
|
61946
|
+
if (resumeRunId) {
|
|
61947
|
+
return runner.resume(resumeRunId, options.vars);
|
|
61948
|
+
}
|
|
61416
61949
|
return runner.execute(config3, options.workflow, options.vars, executeOptions);
|
|
61417
61950
|
}
|
|
61418
61951
|
};
|
|
@@ -62273,8 +62806,8 @@ var StateStore = class extends import_node_events5.EventEmitter {
|
|
|
62273
62806
|
};
|
|
62274
62807
|
|
|
62275
62808
|
// packages/sdk/dist/workflows/templates.js
|
|
62276
|
-
var
|
|
62277
|
-
var
|
|
62809
|
+
var import_node_fs11 = require("node:fs");
|
|
62810
|
+
var import_node_path14 = __toESM(require("node:path"), 1);
|
|
62278
62811
|
var import_node_url2 = require("node:url");
|
|
62279
62812
|
var import_yaml4 = __toESM(require_dist(), 1);
|
|
62280
62813
|
var YAML_EXTENSIONS = [".yaml", ".yml"];
|
|
@@ -62299,7 +62832,7 @@ var TemplateRegistry = class {
|
|
|
62299
62832
|
fetcher;
|
|
62300
62833
|
constructor(options = {}) {
|
|
62301
62834
|
this.builtInTemplatesDir = this.resolveBuiltInTemplatesDir(options.builtInTemplatesDir);
|
|
62302
|
-
this.customTemplatesDir = options.customTemplatesDir ?
|
|
62835
|
+
this.customTemplatesDir = options.customTemplatesDir ? import_node_path14.default.resolve(options.customTemplatesDir) : import_node_path14.default.resolve(options.workspaceDir ?? process.cwd(), ".relay/workflows");
|
|
62303
62836
|
this.fetcher = options.fetcher ?? fetch;
|
|
62304
62837
|
}
|
|
62305
62838
|
listBuiltInTemplates() {
|
|
@@ -62373,13 +62906,13 @@ var TemplateRegistry = class {
|
|
|
62373
62906
|
if (!templateName) {
|
|
62374
62907
|
throw new Error('Template name is required. Provide name explicitly or include a string "name" field.');
|
|
62375
62908
|
}
|
|
62376
|
-
if (templateName.includes("/") || templateName.includes("\\") || templateName.includes("..") ||
|
|
62909
|
+
if (templateName.includes("/") || templateName.includes("\\") || templateName.includes("..") || import_node_path14.default.isAbsolute(templateName)) {
|
|
62377
62910
|
throw new Error(`Invalid template name: "${templateName}" contains path separators or traversal sequences`);
|
|
62378
62911
|
}
|
|
62379
62912
|
this.validateRelayConfig(parsed, url3);
|
|
62380
|
-
await
|
|
62381
|
-
const targetPath =
|
|
62382
|
-
await
|
|
62913
|
+
await import_node_fs11.promises.mkdir(this.customTemplatesDir, { recursive: true });
|
|
62914
|
+
const targetPath = import_node_path14.default.join(this.customTemplatesDir, `${templateName}.yaml`);
|
|
62915
|
+
await import_node_fs11.promises.writeFile(targetPath, (0, import_yaml4.stringify)(parsed), "utf-8");
|
|
62383
62916
|
return targetPath;
|
|
62384
62917
|
}
|
|
62385
62918
|
isTemplateShorthand(input) {
|
|
@@ -62400,15 +62933,15 @@ var TemplateRegistry = class {
|
|
|
62400
62933
|
}
|
|
62401
62934
|
resolveBuiltInTemplatesDir(explicitDir) {
|
|
62402
62935
|
if (explicitDir) {
|
|
62403
|
-
return
|
|
62936
|
+
return import_node_path14.default.resolve(explicitDir);
|
|
62404
62937
|
}
|
|
62405
|
-
const currentDir =
|
|
62938
|
+
const currentDir = import_node_path14.default.dirname((0, import_node_url2.fileURLToPath)(import_meta_url));
|
|
62406
62939
|
const candidates = [
|
|
62407
|
-
|
|
62408
|
-
|
|
62940
|
+
import_node_path14.default.resolve(currentDir, "builtin-templates"),
|
|
62941
|
+
import_node_path14.default.resolve(currentDir, "../workflows/builtin-templates")
|
|
62409
62942
|
];
|
|
62410
62943
|
for (const candidate of candidates) {
|
|
62411
|
-
if ((0,
|
|
62944
|
+
if ((0, import_node_fs11.existsSync)(candidate)) {
|
|
62412
62945
|
return candidate;
|
|
62413
62946
|
}
|
|
62414
62947
|
}
|
|
@@ -62428,9 +62961,9 @@ var TemplateRegistry = class {
|
|
|
62428
62961
|
}
|
|
62429
62962
|
async findTemplatePath(directory, templateName) {
|
|
62430
62963
|
for (const ext of YAML_EXTENSIONS) {
|
|
62431
|
-
const candidate =
|
|
62964
|
+
const candidate = import_node_path14.default.join(directory, `${templateName}${ext}`);
|
|
62432
62965
|
try {
|
|
62433
|
-
const stat2 = await
|
|
62966
|
+
const stat2 = await import_node_fs11.promises.stat(candidate);
|
|
62434
62967
|
if (stat2.isFile()) {
|
|
62435
62968
|
return candidate;
|
|
62436
62969
|
}
|
|
@@ -62440,7 +62973,7 @@ var TemplateRegistry = class {
|
|
|
62440
62973
|
return void 0;
|
|
62441
62974
|
}
|
|
62442
62975
|
async readTemplateFile(templatePath) {
|
|
62443
|
-
const raw = await
|
|
62976
|
+
const raw = await import_node_fs11.promises.readFile(templatePath, "utf-8");
|
|
62444
62977
|
const parsed = (0, import_yaml4.parse)(raw);
|
|
62445
62978
|
if (!isRecord(parsed)) {
|
|
62446
62979
|
throw new Error(`Template at ${templatePath} is not a YAML object`);
|
|
@@ -62633,7 +63166,7 @@ var TemplateRegistry = class {
|
|
|
62633
63166
|
}
|
|
62634
63167
|
async safeReadDir(directory) {
|
|
62635
63168
|
try {
|
|
62636
|
-
return await
|
|
63169
|
+
return await import_node_fs11.promises.readdir(directory);
|
|
62637
63170
|
} catch {
|
|
62638
63171
|
return [];
|
|
62639
63172
|
}
|
|
@@ -62646,209 +63179,8 @@ var TemplateRegistry = class {
|
|
|
62646
63179
|
}
|
|
62647
63180
|
};
|
|
62648
63181
|
|
|
62649
|
-
// packages/sdk/dist/workflows/
|
|
62650
|
-
|
|
62651
|
-
function installOutputFilter() {
|
|
62652
|
-
const orig = console.log.bind(console);
|
|
62653
|
-
console.log = (...args) => {
|
|
62654
|
-
const str = String(args[0] ?? "");
|
|
62655
|
-
if (str.includes("Observer:") || str.includes("agentrelay.dev") || str.includes("Channel: wf-")) {
|
|
62656
|
-
orig(...args);
|
|
62657
|
-
return;
|
|
62658
|
-
}
|
|
62659
|
-
if (/\[broker\]/.test(str) || /\[workflow\s+\d{2}:\d{2}\]/.test(str))
|
|
62660
|
-
return;
|
|
62661
|
-
orig(...args);
|
|
62662
|
-
};
|
|
62663
|
-
return () => {
|
|
62664
|
-
console.log = orig;
|
|
62665
|
-
};
|
|
62666
|
-
}
|
|
62667
|
-
function createWorkflowRenderer() {
|
|
62668
|
-
const stepHandles = /* @__PURE__ */ new Map();
|
|
62669
|
-
let resolveWorkflow;
|
|
62670
|
-
let rejectWorkflow;
|
|
62671
|
-
const workflowDone = new Promise((resolve3, reject) => {
|
|
62672
|
-
resolveWorkflow = resolve3;
|
|
62673
|
-
rejectWorkflow = reject;
|
|
62674
|
-
});
|
|
62675
|
-
workflowDone.catch(() => {
|
|
62676
|
-
});
|
|
62677
|
-
let setHeader = () => {
|
|
62678
|
-
};
|
|
62679
|
-
let listr = null;
|
|
62680
|
-
const pendingAdds = [];
|
|
62681
|
-
async function ensureListr() {
|
|
62682
|
-
if (listr)
|
|
62683
|
-
return listr;
|
|
62684
|
-
const { Listr: Listr2 } = await Promise.resolve().then(() => (init_dist(), dist_exports));
|
|
62685
|
-
listr = new Listr2([
|
|
62686
|
-
{
|
|
62687
|
-
title: import_chalk2.default.dim("Workflow starting..."),
|
|
62688
|
-
task: async (_ctx, task) => {
|
|
62689
|
-
setHeader = (text) => {
|
|
62690
|
-
task.title = text;
|
|
62691
|
-
};
|
|
62692
|
-
await workflowDone;
|
|
62693
|
-
}
|
|
62694
|
-
}
|
|
62695
|
-
], {
|
|
62696
|
-
concurrent: true,
|
|
62697
|
-
renderer: process.stdout.isTTY ? "default" : "verbose",
|
|
62698
|
-
rendererOptions: {
|
|
62699
|
-
collapseErrors: false,
|
|
62700
|
-
showErrorMessage: true
|
|
62701
|
-
}
|
|
62702
|
-
});
|
|
62703
|
-
for (const task of pendingAdds)
|
|
62704
|
-
listr.add(task);
|
|
62705
|
-
pendingAdds.length = 0;
|
|
62706
|
-
return listr;
|
|
62707
|
-
}
|
|
62708
|
-
const addTask = (task) => {
|
|
62709
|
-
if (listr)
|
|
62710
|
-
listr.add(task);
|
|
62711
|
-
else
|
|
62712
|
-
pendingAdds.push(task);
|
|
62713
|
-
};
|
|
62714
|
-
const onEvent = (event) => {
|
|
62715
|
-
switch (event.type) {
|
|
62716
|
-
case "run:started": {
|
|
62717
|
-
setHeader(import_chalk2.default.dim(`[workflow] run ${event.runId.slice(0, 8)}...`));
|
|
62718
|
-
break;
|
|
62719
|
-
}
|
|
62720
|
-
case "step:started": {
|
|
62721
|
-
let resolveStep;
|
|
62722
|
-
let rejectStep;
|
|
62723
|
-
let taskRef = null;
|
|
62724
|
-
let skipped = false;
|
|
62725
|
-
const done = new Promise((resolve3, reject) => {
|
|
62726
|
-
resolveStep = resolve3;
|
|
62727
|
-
rejectStep = reject;
|
|
62728
|
-
});
|
|
62729
|
-
done.catch(() => {
|
|
62730
|
-
});
|
|
62731
|
-
stepHandles.set(event.stepName, {
|
|
62732
|
-
resolve: resolveStep,
|
|
62733
|
-
reject: rejectStep,
|
|
62734
|
-
setOutput: (text) => {
|
|
62735
|
-
if (taskRef)
|
|
62736
|
-
taskRef.output = text;
|
|
62737
|
-
},
|
|
62738
|
-
markSkipped: () => {
|
|
62739
|
-
skipped = true;
|
|
62740
|
-
if (taskRef)
|
|
62741
|
-
taskRef.title = import_chalk2.default.dim(`${event.stepName} (skipped)`);
|
|
62742
|
-
}
|
|
62743
|
-
});
|
|
62744
|
-
addTask({
|
|
62745
|
-
title: import_chalk2.default.white(event.stepName),
|
|
62746
|
-
task: async (_ctx, task) => {
|
|
62747
|
-
taskRef = task;
|
|
62748
|
-
if (skipped)
|
|
62749
|
-
taskRef.title = import_chalk2.default.dim(`${event.stepName} (skipped)`);
|
|
62750
|
-
await done;
|
|
62751
|
-
},
|
|
62752
|
-
rendererOptions: { persistentOutput: true }
|
|
62753
|
-
});
|
|
62754
|
-
break;
|
|
62755
|
-
}
|
|
62756
|
-
case "step:owner-assigned": {
|
|
62757
|
-
const handle = stepHandles.get(event.stepName);
|
|
62758
|
-
if (handle) {
|
|
62759
|
-
handle.setOutput(import_chalk2.default.dim(`> Owner: ${event.ownerName}`) + (event.specialistName ? import_chalk2.default.dim(` \xB7 specialist: ${event.specialistName}`) : ""));
|
|
62760
|
-
}
|
|
62761
|
-
break;
|
|
62762
|
-
}
|
|
62763
|
-
case "step:retrying": {
|
|
62764
|
-
stepHandles.get(event.stepName)?.setOutput(import_chalk2.default.yellow(`Retrying (attempt ${event.attempt})`));
|
|
62765
|
-
break;
|
|
62766
|
-
}
|
|
62767
|
-
case "step:nudged": {
|
|
62768
|
-
stepHandles.get(event.stepName)?.setOutput(import_chalk2.default.dim(`> Nudge #${event.nudgeCount}`));
|
|
62769
|
-
break;
|
|
62770
|
-
}
|
|
62771
|
-
case "step:force-released": {
|
|
62772
|
-
stepHandles.get(event.stepName)?.setOutput(import_chalk2.default.yellow("> Force-released"));
|
|
62773
|
-
break;
|
|
62774
|
-
}
|
|
62775
|
-
case "step:review-completed": {
|
|
62776
|
-
stepHandles.get(event.stepName)?.setOutput(import_chalk2.default.dim(`> Review: ${event.decision} by ${event.reviewerName}`));
|
|
62777
|
-
break;
|
|
62778
|
-
}
|
|
62779
|
-
case "step:owner-timeout": {
|
|
62780
|
-
stepHandles.get(event.stepName)?.setOutput(import_chalk2.default.red(`> Owner ${event.ownerName} timed out`));
|
|
62781
|
-
break;
|
|
62782
|
-
}
|
|
62783
|
-
case "step:agent-report": {
|
|
62784
|
-
const handle = stepHandles.get(event.stepName);
|
|
62785
|
-
if (handle) {
|
|
62786
|
-
const model = event.report.model ? `:${event.report.model}` : "";
|
|
62787
|
-
handle.setOutput(import_chalk2.default.dim(`> Report collected (${event.report.cli}${model})`));
|
|
62788
|
-
}
|
|
62789
|
-
break;
|
|
62790
|
-
}
|
|
62791
|
-
case "step:completed": {
|
|
62792
|
-
stepHandles.get(event.stepName)?.resolve();
|
|
62793
|
-
break;
|
|
62794
|
-
}
|
|
62795
|
-
case "step:skipped": {
|
|
62796
|
-
const handle = stepHandles.get(event.stepName);
|
|
62797
|
-
if (handle) {
|
|
62798
|
-
handle.markSkipped();
|
|
62799
|
-
handle.resolve();
|
|
62800
|
-
} else {
|
|
62801
|
-
addTask({
|
|
62802
|
-
title: import_chalk2.default.dim(`${event.stepName} (skipped)`),
|
|
62803
|
-
task: async () => {
|
|
62804
|
-
},
|
|
62805
|
-
rendererOptions: { persistentOutput: true }
|
|
62806
|
-
});
|
|
62807
|
-
}
|
|
62808
|
-
break;
|
|
62809
|
-
}
|
|
62810
|
-
case "step:failed": {
|
|
62811
|
-
stepHandles.get(event.stepName)?.reject(new Error(event.error ?? "Step failed"));
|
|
62812
|
-
break;
|
|
62813
|
-
}
|
|
62814
|
-
case "run:completed": {
|
|
62815
|
-
setHeader(import_chalk2.default.green("Workflow completed"));
|
|
62816
|
-
resolveWorkflow();
|
|
62817
|
-
break;
|
|
62818
|
-
}
|
|
62819
|
-
case "run:failed": {
|
|
62820
|
-
setHeader(import_chalk2.default.red(`Workflow failed: ${event.error ?? "unknown error"}`));
|
|
62821
|
-
rejectWorkflow(new Error(event.error ?? "Workflow failed"));
|
|
62822
|
-
break;
|
|
62823
|
-
}
|
|
62824
|
-
case "run:cancelled": {
|
|
62825
|
-
setHeader(import_chalk2.default.yellow("Workflow cancelled"));
|
|
62826
|
-
resolveWorkflow();
|
|
62827
|
-
break;
|
|
62828
|
-
}
|
|
62829
|
-
case "broker:event":
|
|
62830
|
-
break;
|
|
62831
|
-
default: {
|
|
62832
|
-
const _exhaustive = event;
|
|
62833
|
-
void _exhaustive;
|
|
62834
|
-
}
|
|
62835
|
-
}
|
|
62836
|
-
};
|
|
62837
|
-
let restoreConsole;
|
|
62838
|
-
return {
|
|
62839
|
-
onEvent,
|
|
62840
|
-
start: async () => {
|
|
62841
|
-
restoreConsole = installOutputFilter();
|
|
62842
|
-
const l = await ensureListr();
|
|
62843
|
-
return l.run().catch(() => {
|
|
62844
|
-
});
|
|
62845
|
-
},
|
|
62846
|
-
unmount: () => {
|
|
62847
|
-
restoreConsole?.();
|
|
62848
|
-
restoreConsole = void 0;
|
|
62849
|
-
}
|
|
62850
|
-
};
|
|
62851
|
-
}
|
|
63182
|
+
// packages/sdk/dist/workflows/index.js
|
|
63183
|
+
init_listr_renderer();
|
|
62852
63184
|
|
|
62853
63185
|
// packages/utils/dist/name-generator.js
|
|
62854
63186
|
var ADJECTIVES = [
|
|
@@ -63001,8 +63333,8 @@ function isValidAgentName(name) {
|
|
|
63001
63333
|
}
|
|
63002
63334
|
|
|
63003
63335
|
// packages/utils/dist/logger.js
|
|
63004
|
-
var
|
|
63005
|
-
var
|
|
63336
|
+
var import_node_fs12 = __toESM(require("node:fs"), 1);
|
|
63337
|
+
var import_node_path15 = __toESM(require("node:path"), 1);
|
|
63006
63338
|
function getLogFile() {
|
|
63007
63339
|
return process.env.AGENT_RELAY_LOG_FILE;
|
|
63008
63340
|
}
|
|
@@ -63020,9 +63352,9 @@ var LEVEL_PRIORITY = {
|
|
|
63020
63352
|
};
|
|
63021
63353
|
var createdLogDirs = /* @__PURE__ */ new Set();
|
|
63022
63354
|
function ensureLogDir(logFile) {
|
|
63023
|
-
const logDir =
|
|
63024
|
-
if (!createdLogDirs.has(logDir) && !
|
|
63025
|
-
|
|
63355
|
+
const logDir = import_node_path15.default.dirname(logFile);
|
|
63356
|
+
if (!createdLogDirs.has(logDir) && !import_node_fs12.default.existsSync(logDir)) {
|
|
63357
|
+
import_node_fs12.default.mkdirSync(logDir, { recursive: true });
|
|
63026
63358
|
createdLogDirs.add(logDir);
|
|
63027
63359
|
}
|
|
63028
63360
|
}
|
|
@@ -63051,7 +63383,7 @@ function log(level, component, msg, extra) {
|
|
|
63051
63383
|
const logFile = getLogFile();
|
|
63052
63384
|
if (logFile) {
|
|
63053
63385
|
ensureLogDir(logFile);
|
|
63054
|
-
|
|
63386
|
+
import_node_fs12.default.appendFileSync(logFile, formatted + "\n");
|
|
63055
63387
|
return;
|
|
63056
63388
|
}
|
|
63057
63389
|
if (level === "ERROR" || level === "WARN") {
|
|
@@ -63321,14 +63653,14 @@ function benchmarkPatterns(iterations = 1e4) {
|
|
|
63321
63653
|
}
|
|
63322
63654
|
|
|
63323
63655
|
// packages/utils/dist/command-resolver.js
|
|
63324
|
-
var
|
|
63325
|
-
var
|
|
63656
|
+
var import_node_child_process5 = require("node:child_process");
|
|
63657
|
+
var import_node_fs13 = __toESM(require("node:fs"), 1);
|
|
63326
63658
|
function resolveCommand(command) {
|
|
63327
63659
|
if (command.startsWith("/")) {
|
|
63328
63660
|
return resolveSymlinks(command);
|
|
63329
63661
|
}
|
|
63330
63662
|
try {
|
|
63331
|
-
const output = (0,
|
|
63663
|
+
const output = (0, import_node_child_process5.execSync)(`which ${command}`, {
|
|
63332
63664
|
encoding: "utf-8",
|
|
63333
63665
|
stdio: ["pipe", "pipe", "pipe"],
|
|
63334
63666
|
// Ensure we have a reasonable PATH
|
|
@@ -63348,7 +63680,7 @@ function resolveCommand(command) {
|
|
|
63348
63680
|
}
|
|
63349
63681
|
function resolveSymlinks(filePath) {
|
|
63350
63682
|
try {
|
|
63351
|
-
const resolved =
|
|
63683
|
+
const resolved = import_node_fs13.default.realpathSync(filePath);
|
|
63352
63684
|
if (resolved !== filePath && process.env.DEBUG_SPAWN === "1") {
|
|
63353
63685
|
console.log(`[command-resolver] Resolved symlink: ${filePath} -> ${resolved}`);
|
|
63354
63686
|
}
|
|
@@ -63362,7 +63694,7 @@ function resolveSymlinks(filePath) {
|
|
|
63362
63694
|
}
|
|
63363
63695
|
function commandExists(command) {
|
|
63364
63696
|
try {
|
|
63365
|
-
(0,
|
|
63697
|
+
(0, import_node_child_process5.execSync)(`which ${command}`, {
|
|
63366
63698
|
encoding: "utf-8",
|
|
63367
63699
|
stdio: ["pipe", "pipe", "pipe"]
|
|
63368
63700
|
});
|
|
@@ -63375,7 +63707,7 @@ function commandExists(command) {
|
|
|
63375
63707
|
// packages/utils/dist/git-remote.js
|
|
63376
63708
|
var fs8 = __toESM(require("node:fs"), 1);
|
|
63377
63709
|
var path14 = __toESM(require("node:path"), 1);
|
|
63378
|
-
var
|
|
63710
|
+
var import_node_child_process6 = require("node:child_process");
|
|
63379
63711
|
function parseGitRemoteUrl(url3) {
|
|
63380
63712
|
if (!url3)
|
|
63381
63713
|
return null;
|
|
@@ -63395,7 +63727,7 @@ function getGitRemoteUrl(workingDirectory, remoteName = "origin") {
|
|
|
63395
63727
|
if (!fs8.existsSync(gitDir)) {
|
|
63396
63728
|
return null;
|
|
63397
63729
|
}
|
|
63398
|
-
const result = (0,
|
|
63730
|
+
const result = (0, import_node_child_process6.execSync)(`git remote get-url ${remoteName}`, {
|
|
63399
63731
|
cwd: workingDirectory,
|
|
63400
63732
|
encoding: "utf-8",
|
|
63401
63733
|
timeout: 5e3,
|
|
@@ -63448,24 +63780,24 @@ function getRepoFullNameFromPath(workingDirectory) {
|
|
|
63448
63780
|
}
|
|
63449
63781
|
|
|
63450
63782
|
// packages/utils/dist/update-checker.js
|
|
63451
|
-
var
|
|
63452
|
-
var
|
|
63783
|
+
var import_node_fs14 = __toESM(require("node:fs"), 1);
|
|
63784
|
+
var import_node_path16 = __toESM(require("node:path"), 1);
|
|
63453
63785
|
var import_node_https = __toESM(require("node:https"), 1);
|
|
63454
|
-
var
|
|
63786
|
+
var import_node_os9 = __toESM(require("node:os"), 1);
|
|
63455
63787
|
var import_compare_versions = __toESM(require_umd(), 1);
|
|
63456
63788
|
var PACKAGE_NAME = "agent-relay";
|
|
63457
63789
|
var CHECK_INTERVAL_MS = 60 * 60 * 1e3;
|
|
63458
63790
|
var NPM_REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
63459
63791
|
function getCachePath() {
|
|
63460
|
-
const cacheDir =
|
|
63461
|
-
return
|
|
63792
|
+
const cacheDir = import_node_path16.default.join(import_node_os9.default.homedir(), ".agent-relay");
|
|
63793
|
+
return import_node_path16.default.join(cacheDir, "update-cache.json");
|
|
63462
63794
|
}
|
|
63463
63795
|
function readCache() {
|
|
63464
63796
|
try {
|
|
63465
63797
|
const cachePath = getCachePath();
|
|
63466
|
-
if (!
|
|
63798
|
+
if (!import_node_fs14.default.existsSync(cachePath))
|
|
63467
63799
|
return null;
|
|
63468
|
-
const data =
|
|
63800
|
+
const data = import_node_fs14.default.readFileSync(cachePath, "utf-8");
|
|
63469
63801
|
return JSON.parse(data);
|
|
63470
63802
|
} catch {
|
|
63471
63803
|
return null;
|
|
@@ -63474,11 +63806,11 @@ function readCache() {
|
|
|
63474
63806
|
function writeCache(cache) {
|
|
63475
63807
|
try {
|
|
63476
63808
|
const cachePath = getCachePath();
|
|
63477
|
-
const cacheDir =
|
|
63478
|
-
if (!
|
|
63479
|
-
|
|
63809
|
+
const cacheDir = import_node_path16.default.dirname(cachePath);
|
|
63810
|
+
if (!import_node_fs14.default.existsSync(cacheDir)) {
|
|
63811
|
+
import_node_fs14.default.mkdirSync(cacheDir, { recursive: true });
|
|
63480
63812
|
}
|
|
63481
|
-
|
|
63813
|
+
import_node_fs14.default.writeFileSync(cachePath, JSON.stringify(cache, null, 2));
|
|
63482
63814
|
} catch {
|
|
63483
63815
|
}
|
|
63484
63816
|
}
|
|
@@ -63757,9 +64089,9 @@ function validateModelForCli(cli, model) {
|
|
|
63757
64089
|
}
|
|
63758
64090
|
|
|
63759
64091
|
// packages/utils/dist/relay-pty-path.js
|
|
63760
|
-
var
|
|
63761
|
-
var
|
|
63762
|
-
var
|
|
64092
|
+
var import_node_fs15 = __toESM(require("node:fs"), 1);
|
|
64093
|
+
var import_node_os10 = __toESM(require("node:os"), 1);
|
|
64094
|
+
var import_node_path17 = __toESM(require("node:path"), 1);
|
|
63763
64095
|
var SUPPORTED_PLATFORMS = {
|
|
63764
64096
|
darwin: {
|
|
63765
64097
|
arm64: "relay-pty-darwin-arm64",
|
|
@@ -63771,13 +64103,13 @@ var SUPPORTED_PLATFORMS = {
|
|
|
63771
64103
|
}
|
|
63772
64104
|
};
|
|
63773
64105
|
function getPlatformBinaryName() {
|
|
63774
|
-
const platform2 =
|
|
63775
|
-
const arch =
|
|
64106
|
+
const platform2 = import_node_os10.default.platform();
|
|
64107
|
+
const arch = import_node_os10.default.arch();
|
|
63776
64108
|
return SUPPORTED_PLATFORMS[platform2]?.[arch] ?? null;
|
|
63777
64109
|
}
|
|
63778
64110
|
function isPlatformSupported() {
|
|
63779
|
-
const platform2 =
|
|
63780
|
-
const arch =
|
|
64111
|
+
const platform2 = import_node_os10.default.platform();
|
|
64112
|
+
const arch = import_node_os10.default.arch();
|
|
63781
64113
|
return SUPPORTED_PLATFORMS[platform2]?.[arch] !== void 0;
|
|
63782
64114
|
}
|
|
63783
64115
|
function getSupportedPlatforms() {
|
|
@@ -63807,23 +64139,23 @@ function findRelayPtyBinary(callerDirname) {
|
|
|
63807
64139
|
const scopedMatch = normalizedCaller.match(/^(.+?\/node_modules)\/@agent-relay\//);
|
|
63808
64140
|
const directMatch = normalizedCaller.match(/^(.+?\/node_modules\/agent-relay)/);
|
|
63809
64141
|
if (scopedMatch) {
|
|
63810
|
-
packageRoots.push(
|
|
64142
|
+
packageRoots.push(import_node_path17.default.join(scopedMatch[1], "agent-relay"));
|
|
63811
64143
|
}
|
|
63812
64144
|
if (directMatch) {
|
|
63813
64145
|
packageRoots.push(directMatch[1]);
|
|
63814
64146
|
}
|
|
63815
64147
|
if (!normalizedCaller.includes("node_modules")) {
|
|
63816
|
-
packageRoots.push(
|
|
64148
|
+
packageRoots.push(import_node_path17.default.join(callerDirname, "..", "..", ".."));
|
|
63817
64149
|
}
|
|
63818
64150
|
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
63819
64151
|
if (home) {
|
|
63820
|
-
const npxCacheBase =
|
|
63821
|
-
if (
|
|
64152
|
+
const npxCacheBase = import_node_path17.default.join(home, ".npm", "_npx");
|
|
64153
|
+
if (import_node_fs15.default.existsSync(npxCacheBase)) {
|
|
63822
64154
|
try {
|
|
63823
|
-
const entries =
|
|
64155
|
+
const entries = import_node_fs15.default.readdirSync(npxCacheBase);
|
|
63824
64156
|
for (const entry of entries) {
|
|
63825
|
-
const npxPackage =
|
|
63826
|
-
if (
|
|
64157
|
+
const npxPackage = import_node_path17.default.join(npxCacheBase, entry, "node_modules", "agent-relay");
|
|
64158
|
+
if (import_node_fs15.default.existsSync(npxPackage)) {
|
|
63827
64159
|
packageRoots.push(npxPackage);
|
|
63828
64160
|
}
|
|
63829
64161
|
}
|
|
@@ -63831,42 +64163,42 @@ function findRelayPtyBinary(callerDirname) {
|
|
|
63831
64163
|
}
|
|
63832
64164
|
}
|
|
63833
64165
|
}
|
|
63834
|
-
packageRoots.push(
|
|
64166
|
+
packageRoots.push(import_node_path17.default.join(process.cwd(), "node_modules", "agent-relay"));
|
|
63835
64167
|
if (home) {
|
|
63836
|
-
packageRoots.push(
|
|
63837
|
-
packageRoots.push(
|
|
63838
|
-
packageRoots.push(
|
|
63839
|
-
packageRoots.push(
|
|
63840
|
-
packageRoots.push(
|
|
63841
|
-
packageRoots.push(
|
|
63842
|
-
packageRoots.push(
|
|
63843
|
-
packageRoots.push(
|
|
63844
|
-
}
|
|
63845
|
-
const bashInstallerDir = process.env.AGENT_RELAY_INSTALL_DIR ?
|
|
63846
|
-
const bashInstallerBinDir = process.env.AGENT_RELAY_BIN_DIR || (home ?
|
|
63847
|
-
const nodePrefix =
|
|
63848
|
-
packageRoots.push(
|
|
64168
|
+
packageRoots.push(import_node_path17.default.join(home, ".nvm", "versions", "node", process.version, "lib", "node_modules", "agent-relay"));
|
|
64169
|
+
packageRoots.push(import_node_path17.default.join(home, ".volta", "tools", "image", "packages", "agent-relay", "lib", "node_modules", "agent-relay"));
|
|
64170
|
+
packageRoots.push(import_node_path17.default.join(home, ".fnm", "node-versions", process.version, "installation", "lib", "node_modules", "agent-relay"));
|
|
64171
|
+
packageRoots.push(import_node_path17.default.join(home, "n", "lib", "node_modules", "agent-relay"));
|
|
64172
|
+
packageRoots.push(import_node_path17.default.join(home, ".asdf", "installs", "nodejs", process.version.replace("v", ""), "lib", "node_modules", "agent-relay"));
|
|
64173
|
+
packageRoots.push(import_node_path17.default.join(home, ".local", "share", "pnpm", "global", "node_modules", "agent-relay"));
|
|
64174
|
+
packageRoots.push(import_node_path17.default.join(home, ".config", "yarn", "global", "node_modules", "agent-relay"));
|
|
64175
|
+
packageRoots.push(import_node_path17.default.join(home, ".yarn", "global", "node_modules", "agent-relay"));
|
|
64176
|
+
}
|
|
64177
|
+
const bashInstallerDir = process.env.AGENT_RELAY_INSTALL_DIR ? import_node_path17.default.join(process.env.AGENT_RELAY_INSTALL_DIR, "bin") : home ? import_node_path17.default.join(home, ".agent-relay", "bin") : null;
|
|
64178
|
+
const bashInstallerBinDir = process.env.AGENT_RELAY_BIN_DIR || (home ? import_node_path17.default.join(home, ".local", "bin") : null);
|
|
64179
|
+
const nodePrefix = import_node_path17.default.resolve(import_node_path17.default.dirname(process.execPath), "..");
|
|
64180
|
+
packageRoots.push(import_node_path17.default.join(nodePrefix, "lib", "node_modules", "agent-relay"));
|
|
63849
64181
|
packageRoots.push("/usr/local/lib/node_modules/agent-relay");
|
|
63850
64182
|
packageRoots.push("/opt/homebrew/lib/node_modules/agent-relay");
|
|
63851
64183
|
packageRoots.push("/usr/lib/node_modules/agent-relay");
|
|
63852
64184
|
const candidates = [];
|
|
63853
64185
|
for (const root of packageRoots) {
|
|
63854
64186
|
if (platformBinary) {
|
|
63855
|
-
candidates.push(
|
|
64187
|
+
candidates.push(import_node_path17.default.join(root, "bin", platformBinary));
|
|
63856
64188
|
}
|
|
63857
|
-
candidates.push(
|
|
64189
|
+
candidates.push(import_node_path17.default.join(root, "bin", "relay-pty"));
|
|
63858
64190
|
}
|
|
63859
64191
|
if (bashInstallerDir) {
|
|
63860
64192
|
if (platformBinary) {
|
|
63861
|
-
candidates.push(
|
|
64193
|
+
candidates.push(import_node_path17.default.join(bashInstallerDir, platformBinary));
|
|
63862
64194
|
}
|
|
63863
|
-
candidates.push(
|
|
64195
|
+
candidates.push(import_node_path17.default.join(bashInstallerDir, "relay-pty"));
|
|
63864
64196
|
}
|
|
63865
64197
|
if (bashInstallerBinDir) {
|
|
63866
64198
|
if (platformBinary) {
|
|
63867
|
-
candidates.push(
|
|
64199
|
+
candidates.push(import_node_path17.default.join(bashInstallerBinDir, platformBinary));
|
|
63868
64200
|
}
|
|
63869
|
-
candidates.push(
|
|
64201
|
+
candidates.push(import_node_path17.default.join(bashInstallerBinDir, "relay-pty"));
|
|
63870
64202
|
}
|
|
63871
64203
|
candidates.push("/app/bin/relay-pty");
|
|
63872
64204
|
candidates.push("/usr/local/bin/relay-pty");
|
|
@@ -63881,7 +64213,7 @@ function findRelayPtyBinary(callerDirname) {
|
|
|
63881
64213
|
}
|
|
63882
64214
|
function isExecutable(filePath) {
|
|
63883
64215
|
try {
|
|
63884
|
-
|
|
64216
|
+
import_node_fs15.default.accessSync(filePath, import_node_fs15.default.constants.X_OK);
|
|
63885
64217
|
return true;
|
|
63886
64218
|
} catch {
|
|
63887
64219
|
return false;
|
|
@@ -63890,14 +64222,14 @@ function isExecutable(filePath) {
|
|
|
63890
64222
|
function isPlatformCompatibleBinary(filePath) {
|
|
63891
64223
|
let fd;
|
|
63892
64224
|
try {
|
|
63893
|
-
fd =
|
|
64225
|
+
fd = import_node_fs15.default.openSync(filePath, "r");
|
|
63894
64226
|
const header = Buffer.alloc(4);
|
|
63895
|
-
const bytesRead =
|
|
64227
|
+
const bytesRead = import_node_fs15.default.readSync(fd, header, 0, 4, 0);
|
|
63896
64228
|
if (bytesRead < 4) {
|
|
63897
64229
|
return false;
|
|
63898
64230
|
}
|
|
63899
64231
|
const magic = header.readUInt32BE(0);
|
|
63900
|
-
const platform2 =
|
|
64232
|
+
const platform2 = import_node_os10.default.platform();
|
|
63901
64233
|
if (platform2 === "darwin") {
|
|
63902
64234
|
return isMachOBinary(magic);
|
|
63903
64235
|
}
|
|
@@ -63910,7 +64242,7 @@ function isPlatformCompatibleBinary(filePath) {
|
|
|
63910
64242
|
} finally {
|
|
63911
64243
|
if (fd !== void 0) {
|
|
63912
64244
|
try {
|
|
63913
|
-
|
|
64245
|
+
import_node_fs15.default.closeSync(fd);
|
|
63914
64246
|
} catch {
|
|
63915
64247
|
}
|
|
63916
64248
|
}
|
|
@@ -64526,78 +64858,78 @@ var HookRegistry = class {
|
|
|
64526
64858
|
};
|
|
64527
64859
|
|
|
64528
64860
|
// packages/trajectory/dist/integration.js
|
|
64529
|
-
var
|
|
64861
|
+
var import_node_child_process7 = require("node:child_process");
|
|
64530
64862
|
|
|
64531
64863
|
// packages/config/dist/project-namespace.js
|
|
64532
64864
|
var import_node_crypto13 = __toESM(require("node:crypto"), 1);
|
|
64533
|
-
var
|
|
64534
|
-
var
|
|
64535
|
-
var
|
|
64865
|
+
var import_node_path18 = __toESM(require("node:path"), 1);
|
|
64866
|
+
var import_node_fs16 = __toESM(require("node:fs"), 1);
|
|
64867
|
+
var import_node_os11 = __toESM(require("node:os"), 1);
|
|
64536
64868
|
function getGlobalBaseDir2() {
|
|
64537
64869
|
if (process.env.AGENT_RELAY_DATA_DIR) {
|
|
64538
64870
|
return process.env.AGENT_RELAY_DATA_DIR;
|
|
64539
64871
|
}
|
|
64540
64872
|
const xdgDataHome = process.env.XDG_DATA_HOME;
|
|
64541
64873
|
if (xdgDataHome) {
|
|
64542
|
-
return
|
|
64874
|
+
return import_node_path18.default.join(xdgDataHome, "agent-relay");
|
|
64543
64875
|
}
|
|
64544
|
-
return
|
|
64876
|
+
return import_node_path18.default.join(import_node_os11.default.homedir(), ".agent-relay");
|
|
64545
64877
|
}
|
|
64546
64878
|
var GLOBAL_BASE_DIR2 = getGlobalBaseDir2();
|
|
64547
64879
|
var PROJECT_DATA_DIR2 = ".agent-relay";
|
|
64548
64880
|
function hashPath2(projectPath) {
|
|
64549
|
-
const normalized =
|
|
64881
|
+
const normalized = import_node_path18.default.resolve(projectPath);
|
|
64550
64882
|
const hash3 = import_node_crypto13.default.createHash("sha256").update(normalized).digest("hex");
|
|
64551
64883
|
return hash3.substring(0, 12);
|
|
64552
64884
|
}
|
|
64553
64885
|
function findProjectRoot2(startDir = process.cwd()) {
|
|
64554
64886
|
if (process.env.AGENT_RELAY_PROJECT) {
|
|
64555
|
-
return
|
|
64887
|
+
return import_node_path18.default.resolve(process.env.AGENT_RELAY_PROJECT);
|
|
64556
64888
|
}
|
|
64557
|
-
let current =
|
|
64558
|
-
const root =
|
|
64889
|
+
let current = import_node_path18.default.resolve(startDir);
|
|
64890
|
+
const root = import_node_path18.default.parse(current).root;
|
|
64559
64891
|
const markers = [".git", "package.json", "Cargo.toml", "go.mod", "pyproject.toml", ".agent-relay"];
|
|
64560
64892
|
while (current !== root) {
|
|
64561
64893
|
for (const marker of markers) {
|
|
64562
|
-
if (
|
|
64894
|
+
if (import_node_fs16.default.existsSync(import_node_path18.default.join(current, marker))) {
|
|
64563
64895
|
return current;
|
|
64564
64896
|
}
|
|
64565
64897
|
}
|
|
64566
|
-
current =
|
|
64898
|
+
current = import_node_path18.default.dirname(current);
|
|
64567
64899
|
}
|
|
64568
|
-
return
|
|
64900
|
+
return import_node_path18.default.resolve(startDir);
|
|
64569
64901
|
}
|
|
64570
64902
|
function getProjectPaths2(projectRoot) {
|
|
64571
64903
|
const root = projectRoot ?? findProjectRoot2();
|
|
64572
64904
|
const projectId = hashPath2(root);
|
|
64573
|
-
const dataDir =
|
|
64905
|
+
const dataDir = import_node_path18.default.join(root, PROJECT_DATA_DIR2);
|
|
64574
64906
|
return {
|
|
64575
64907
|
dataDir,
|
|
64576
|
-
teamDir:
|
|
64577
|
-
dbPath:
|
|
64578
|
-
socketPath:
|
|
64908
|
+
teamDir: import_node_path18.default.join(dataDir, "team"),
|
|
64909
|
+
dbPath: import_node_path18.default.join(dataDir, "messages.sqlite"),
|
|
64910
|
+
socketPath: import_node_path18.default.join(dataDir, "relay.sock"),
|
|
64579
64911
|
projectRoot: root,
|
|
64580
64912
|
projectId
|
|
64581
64913
|
};
|
|
64582
64914
|
}
|
|
64583
64915
|
|
|
64584
64916
|
// packages/config/dist/trajectory-config.js
|
|
64585
|
-
var
|
|
64586
|
-
var
|
|
64587
|
-
var
|
|
64917
|
+
var import_node_fs17 = require("node:fs");
|
|
64918
|
+
var import_node_path19 = require("node:path");
|
|
64919
|
+
var import_node_os12 = require("node:os");
|
|
64588
64920
|
var import_node_crypto14 = require("node:crypto");
|
|
64589
64921
|
function getAgentRelayConfigDir() {
|
|
64590
|
-
return process.env.AGENT_RELAY_CONFIG_DIR ?? (0,
|
|
64922
|
+
return process.env.AGENT_RELAY_CONFIG_DIR ?? (0, import_node_path19.join)((0, import_node_os12.homedir)(), ".config", "agent-relay");
|
|
64591
64923
|
}
|
|
64592
64924
|
var configCache = null;
|
|
64593
64925
|
function getRelayConfigPath(_projectRoot) {
|
|
64594
|
-
return (0,
|
|
64926
|
+
return (0, import_node_path19.join)(getAgentRelayConfigDir(), "relay.json");
|
|
64595
64927
|
}
|
|
64596
64928
|
function readRelayConfig(projectRoot) {
|
|
64597
64929
|
const configPath = getRelayConfigPath(projectRoot);
|
|
64598
64930
|
if (configCache && configCache.path === configPath) {
|
|
64599
64931
|
try {
|
|
64600
|
-
const stat2 = (0,
|
|
64932
|
+
const stat2 = (0, import_node_fs17.statSync)(configPath);
|
|
64601
64933
|
if (stat2.mtimeMs === configCache.mtime) {
|
|
64602
64934
|
return configCache.config;
|
|
64603
64935
|
}
|
|
@@ -64605,13 +64937,13 @@ function readRelayConfig(projectRoot) {
|
|
|
64605
64937
|
}
|
|
64606
64938
|
}
|
|
64607
64939
|
try {
|
|
64608
|
-
if (!(0,
|
|
64940
|
+
if (!(0, import_node_fs17.existsSync)(configPath)) {
|
|
64609
64941
|
return {};
|
|
64610
64942
|
}
|
|
64611
|
-
const content = (0,
|
|
64943
|
+
const content = (0, import_node_fs17.readFileSync)(configPath, "utf-8");
|
|
64612
64944
|
const config3 = JSON.parse(content);
|
|
64613
64945
|
try {
|
|
64614
|
-
const stat2 = (0,
|
|
64946
|
+
const stat2 = (0, import_node_fs17.statSync)(configPath);
|
|
64615
64947
|
configCache = { path: configPath, config: config3, mtime: stat2.mtimeMs };
|
|
64616
64948
|
} catch {
|
|
64617
64949
|
}
|
|
@@ -64631,12 +64963,12 @@ function getProjectHash(projectRoot) {
|
|
|
64631
64963
|
}
|
|
64632
64964
|
function getUserTrajectoriesDir(projectRoot) {
|
|
64633
64965
|
const projectHash = getProjectHash(projectRoot);
|
|
64634
|
-
const configDir = process.env.XDG_CONFIG_HOME || (0,
|
|
64635
|
-
return (0,
|
|
64966
|
+
const configDir = process.env.XDG_CONFIG_HOME || (0, import_node_path19.join)((0, import_node_os12.homedir)(), ".config");
|
|
64967
|
+
return (0, import_node_path19.join)(configDir, "agent-relay", "trajectories", projectHash);
|
|
64636
64968
|
}
|
|
64637
64969
|
function getRepoTrajectoriesDir(projectRoot) {
|
|
64638
64970
|
const root = projectRoot ?? getProjectPaths2().projectRoot;
|
|
64639
|
-
return (0,
|
|
64971
|
+
return (0, import_node_path19.join)(root, ".trajectories");
|
|
64640
64972
|
}
|
|
64641
64973
|
function getPrimaryTrajectoriesDir(projectRoot) {
|
|
64642
64974
|
if (shouldStoreInRepo(projectRoot)) {
|
|
@@ -64655,7 +64987,7 @@ function getTrajectoryEnvVars(projectRoot) {
|
|
|
64655
64987
|
async function runTrail(args) {
|
|
64656
64988
|
return new Promise((resolve3) => {
|
|
64657
64989
|
const trajectoryEnv = getTrajectoryEnvVars();
|
|
64658
|
-
const proc = (0,
|
|
64990
|
+
const proc = (0, import_node_child_process7.spawn)("trail", args, {
|
|
64659
64991
|
cwd: getProjectPaths2().projectRoot,
|
|
64660
64992
|
env: { ...process.env, ...trajectoryEnv },
|
|
64661
64993
|
stdio: ["pipe", "pipe", "pipe"]
|
|
@@ -64926,7 +65258,7 @@ var TrajectoryIntegration = class {
|
|
|
64926
65258
|
*/
|
|
64927
65259
|
isTrailInstalledSync() {
|
|
64928
65260
|
try {
|
|
64929
|
-
(0,
|
|
65261
|
+
(0, import_node_child_process7.execSync)("which trail", { stdio: "pipe" });
|
|
64930
65262
|
return true;
|
|
64931
65263
|
} catch {
|
|
64932
65264
|
return false;
|
|
@@ -65276,8 +65608,8 @@ var HookEmitter = class {
|
|
|
65276
65608
|
};
|
|
65277
65609
|
|
|
65278
65610
|
// packages/hooks/dist/inbox-check/utils.js
|
|
65279
|
-
var
|
|
65280
|
-
var
|
|
65611
|
+
var import_node_fs18 = require("node:fs");
|
|
65612
|
+
var import_node_path20 = require("node:path");
|
|
65281
65613
|
var DEFAULT_INBOX_DIR = "/tmp/agent-relay";
|
|
65282
65614
|
function getAgentName() {
|
|
65283
65615
|
return process.env.AGENT_RELAY_NAME;
|
|
@@ -65287,16 +65619,16 @@ function getInboxPath(config3) {
|
|
|
65287
65619
|
if (!agentName) {
|
|
65288
65620
|
throw new Error("Agent name not configured. Set AGENT_RELAY_NAME env var.");
|
|
65289
65621
|
}
|
|
65290
|
-
return (0,
|
|
65622
|
+
return (0, import_node_path20.join)(config3.inboxDir, agentName, "inbox.md");
|
|
65291
65623
|
}
|
|
65292
65624
|
function inboxExists(inboxPath) {
|
|
65293
|
-
return (0,
|
|
65625
|
+
return (0, import_node_fs18.existsSync)(inboxPath);
|
|
65294
65626
|
}
|
|
65295
65627
|
function readInbox(inboxPath) {
|
|
65296
65628
|
if (!inboxExists(inboxPath)) {
|
|
65297
65629
|
return "";
|
|
65298
65630
|
}
|
|
65299
|
-
return (0,
|
|
65631
|
+
return (0, import_node_fs18.readFileSync)(inboxPath, "utf-8");
|
|
65300
65632
|
}
|
|
65301
65633
|
function hasUnreadMessages(inboxPath) {
|
|
65302
65634
|
const content = readInbox(inboxPath);
|
|
@@ -65366,6 +65698,7 @@ init_dist2();
|
|
|
65366
65698
|
CLIVersions,
|
|
65367
65699
|
CLIs,
|
|
65368
65700
|
CODEX_MODEL_OPTIONS,
|
|
65701
|
+
COMMON_SEARCH_PATHS,
|
|
65369
65702
|
CURSOR_MODEL_OPTIONS,
|
|
65370
65703
|
CUSTOM_STEPS_FILE,
|
|
65371
65704
|
ClaudeModels,
|
|
@@ -65414,6 +65747,7 @@ init_dist2();
|
|
|
65414
65747
|
checkForUpdatesInBackground,
|
|
65415
65748
|
cleanLines,
|
|
65416
65749
|
clearBinaryCache,
|
|
65750
|
+
clearResolveCache,
|
|
65417
65751
|
collectCliSession,
|
|
65418
65752
|
commandExists,
|
|
65419
65753
|
connectionLog,
|
|
@@ -65421,6 +65755,7 @@ init_dist2();
|
|
|
65421
65755
|
createCollector,
|
|
65422
65756
|
createConsensusEngine,
|
|
65423
65757
|
createContextCompactor,
|
|
65758
|
+
createDefaultEventLogger,
|
|
65424
65759
|
createLogger,
|
|
65425
65760
|
createMemoryAdapter,
|
|
65426
65761
|
createMemoryHooks,
|
|
@@ -65448,6 +65783,8 @@ init_dist2();
|
|
|
65448
65783
|
getAgentName,
|
|
65449
65784
|
getBaseCli,
|
|
65450
65785
|
getCachedRelayPtyPath,
|
|
65786
|
+
getCliDefinition,
|
|
65787
|
+
getCliRegistry,
|
|
65451
65788
|
getCompiledPatterns,
|
|
65452
65789
|
getCustomStepsPath,
|
|
65453
65790
|
getDefaultReasoningEffort,
|
|
@@ -65495,6 +65832,8 @@ init_dist2();
|
|
|
65495
65832
|
readInbox,
|
|
65496
65833
|
resetPatternMetrics,
|
|
65497
65834
|
resolveAllCustomSteps,
|
|
65835
|
+
resolveCli,
|
|
65836
|
+
resolveCliSync,
|
|
65498
65837
|
resolveCommand,
|
|
65499
65838
|
resolveCustomStep,
|
|
65500
65839
|
resolveSpawnPolicy,
|