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.
Files changed (61) hide show
  1. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  2. package/bin/agent-relay-broker-darwin-x64 +0 -0
  3. package/bin/agent-relay-broker-linux-arm64 +0 -0
  4. package/bin/agent-relay-broker-linux-x64 +0 -0
  5. package/dist/index.cjs +858 -519
  6. package/package.json +8 -8
  7. package/packages/acp-bridge/package.json +2 -2
  8. package/packages/config/package.json +1 -1
  9. package/packages/hooks/package.json +4 -4
  10. package/packages/memory/package.json +2 -2
  11. package/packages/openclaw/package.json +2 -2
  12. package/packages/policy/package.json +2 -2
  13. package/packages/sdk/dist/cli-registry.d.ts +42 -0
  14. package/packages/sdk/dist/cli-registry.d.ts.map +1 -0
  15. package/packages/sdk/dist/cli-registry.js +126 -0
  16. package/packages/sdk/dist/cli-registry.js.map +1 -0
  17. package/packages/sdk/dist/cli-resolver.d.ts +30 -0
  18. package/packages/sdk/dist/cli-resolver.d.ts.map +1 -0
  19. package/packages/sdk/dist/cli-resolver.js +132 -0
  20. package/packages/sdk/dist/cli-resolver.js.map +1 -0
  21. package/packages/sdk/dist/index.d.ts +2 -0
  22. package/packages/sdk/dist/index.d.ts.map +1 -1
  23. package/packages/sdk/dist/index.js +2 -0
  24. package/packages/sdk/dist/index.js.map +1 -1
  25. package/packages/sdk/dist/spawn-from-env.d.ts.map +1 -1
  26. package/packages/sdk/dist/spawn-from-env.js +6 -15
  27. package/packages/sdk/dist/spawn-from-env.js.map +1 -1
  28. package/packages/sdk/dist/workflows/builder.d.ts +5 -0
  29. package/packages/sdk/dist/workflows/builder.d.ts.map +1 -1
  30. package/packages/sdk/dist/workflows/builder.js +36 -5
  31. package/packages/sdk/dist/workflows/builder.js.map +1 -1
  32. package/packages/sdk/dist/workflows/collectors/opencode.d.ts.map +1 -1
  33. package/packages/sdk/dist/workflows/collectors/opencode.js +26 -0
  34. package/packages/sdk/dist/workflows/collectors/opencode.js.map +1 -1
  35. package/packages/sdk/dist/workflows/default-logger.d.ts +9 -0
  36. package/packages/sdk/dist/workflows/default-logger.d.ts.map +1 -0
  37. package/packages/sdk/dist/workflows/default-logger.js +104 -0
  38. package/packages/sdk/dist/workflows/default-logger.js.map +1 -0
  39. package/packages/sdk/dist/workflows/index.d.ts +1 -0
  40. package/packages/sdk/dist/workflows/index.d.ts.map +1 -1
  41. package/packages/sdk/dist/workflows/index.js +1 -0
  42. package/packages/sdk/dist/workflows/index.js.map +1 -1
  43. package/packages/sdk/dist/workflows/runner.d.ts +1 -1
  44. package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
  45. package/packages/sdk/dist/workflows/runner.js +16 -45
  46. package/packages/sdk/dist/workflows/runner.js.map +1 -1
  47. package/packages/sdk/package.json +2 -2
  48. package/packages/sdk/src/cli-registry.ts +148 -0
  49. package/packages/sdk/src/cli-resolver.ts +155 -0
  50. package/packages/sdk/src/index.ts +2 -0
  51. package/packages/sdk/src/spawn-from-env.ts +6 -17
  52. package/packages/sdk/src/workflows/builder.ts +44 -4
  53. package/packages/sdk/src/workflows/collectors/opencode.ts +26 -0
  54. package/packages/sdk/src/workflows/default-logger.ts +120 -0
  55. package/packages/sdk/src/workflows/index.ts +1 -0
  56. package/packages/sdk/src/workflows/runner.ts +16 -43
  57. package/packages/sdk-py/pyproject.toml +1 -1
  58. package/packages/telemetry/package.json +1 -1
  59. package/packages/trajectory/package.json +2 -2
  60. package/packages/user-directory/package.json +2 -2
  61. 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(chalk3, styles4) {
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 = chalk3;
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 = (chalk3, temporary) => {
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(chalk3, styles4)(string7));
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(chalk3, styles4)(chunk.join("")));
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 chalk4 = {};
1449
- applyOptions(chalk4, options);
1450
- chalk4.template = (...arguments_) => chalkTag(chalk4.template, ...arguments_);
1451
- Object.setPrototypeOf(chalk4, Chalk.prototype);
1452
- Object.setPrototypeOf(chalk4.template, chalk4);
1453
- chalk4.template.constructor = () => {
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
- chalk4.template.Instance = ChalkClass;
1457
- return chalk4.template;
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 = (chalk4, ...strings) => {
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(chalk4, parts.join(""));
1584
+ return template(chalk5, parts.join(""));
1585
1585
  };
1586
1586
  Object.defineProperties(Chalk.prototype, styles4);
1587
- var chalk3 = Chalk();
1588
- chalk3.supportsColor = stdoutColor;
1589
- chalk3.stderr = Chalk({ level: stderrColor ? stderrColor.level : 0 });
1590
- chalk3.stderr.supportsColor = stderrColor;
1591
- module2.exports = chalk3;
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, import_node_os7, 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;
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
- import_node_os7 = __toESM(require("node:os"), 1);
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 = import_node_os7.default.release().split(".");
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 import_node_util2, 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;
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
- import_node_util2 = require("node:util");
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(import_node_util2.inspect.colors).map((color2) => [color2, (text) => (0, import_node_util2.styleText)(color2, String(text))]));
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 import_node_child_process3 = require("node:child_process");
54912
+ var import_node_child_process4 = require("node:child_process");
54692
54913
  var import_node_crypto5 = require("node:crypto");
54693
- var import_node_fs8 = require("node:fs");
54694
- var import_promises4 = require("node:fs/promises");
54695
- var import_node_path11 = __toESM(require("node:path"), 1);
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/spawn-from-env.js
54700
- var BYPASS_FLAGS = {
54701
- claude: { flag: "--dangerously-skip-permissions" },
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
- flag: "--dangerously-bypass-approvals-and-sandbox",
54704
- aliases: ["--full-auto"]
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
- flag: "--yolo",
54708
- aliases: ["-y"]
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 getBypassFlagConfig(cli) {
55012
+ function getCliDefinition(cli) {
54712
55013
  const baseCli = cli.includes(":") ? cli.split(":")[0] : cli;
54713
- return BYPASS_FLAGS[baseCli];
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/workflows/custom-steps.js
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 = __toESM(require("node:path"), 1);
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 = import_node_path6.default.join(cwd, CUSTOM_STEPS_FILE);
55238
+ const stepsPath = import_node_path7.default.join(cwd, CUSTOM_STEPS_FILE);
54831
55239
  const steps = /* @__PURE__ */ new Map();
54832
- if (!(0, import_node_fs3.existsSync)(stepsPath)) {
55240
+ if (!(0, import_node_fs4.existsSync)(stepsPath)) {
54833
55241
  return steps;
54834
55242
  }
54835
55243
  try {
54836
- const content = (0, import_node_fs3.readFileSync)(stepsPath, "utf-8");
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, import_node_fs3.existsSync)(import_node_path6.default.join(cwd, CUSTOM_STEPS_FILE));
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 import_node_path6.default.join(cwd, CUSTOM_STEPS_FILE);
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 import_node_fs4 = require("node:fs");
55094
- var import_promises2 = require("node:fs/promises");
55095
- var import_node_os4 = require("node:os");
55096
- var import_node_path7 = __toESM(require("node:path"), 1);
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 = import_node_path7.default.join((0, import_node_os4.homedir)(), ".claude");
55099
- var HISTORY_PATH = import_node_path7.default.join(CLAUDE_HOME, "history.jsonl");
55100
- var PROJECTS_PATH = import_node_path7.default.join(CLAUDE_HOME, "projects");
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 = import_node_path7.default.join(PROJECTS_PATH, encodeProjectPath(historyEntry.project), `${historyEntry.sessionId}.jsonl`);
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, import_node_fs4.createReadStream)(HISTORY_PATH, { encoding: "utf8" }),
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, import_node_fs4.createReadStream)(sessionPath, { encoding: "utf8" }),
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, import_node_fs4.existsSync)(filePath) && (0, import_node_fs4.statSync)(filePath).isFile();
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, import_node_fs4.existsSync)(dirPath) && (0, import_node_fs4.statSync)(dirPath).isDirectory();
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, import_promises2.access)(filePath);
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 import_node_fs5 = __toESM(require("node:fs"), 1);
55405
- var import_node_os5 = __toESM(require("node:os"), 1);
55406
- var import_node_path8 = __toESM(require("node:path"), 1);
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 = import_node_path8.default.join(import_node_os5.default.homedir(), ".codex");
55410
- var DEFAULT_HISTORY_PATH = import_node_path8.default.join(CODEX_HOME, "history.jsonl");
55411
- var DEFAULT_STATE_PATH = import_node_path8.default.join(CODEX_HOME, "state_5.sqlite");
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 import_node_fs5.default.existsSync(this.statePath) || import_node_fs5.default.existsSync(this.historyPath);
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 (!import_node_fs5.default.existsSync(this.historyPath)) {
55966
+ if (!import_node_fs6.default.existsSync(this.historyPath)) {
55559
55967
  return [];
55560
55968
  }
55561
55969
  try {
55562
- return import_node_fs5.default.readFileSync(this.historyPath, "utf8").split(/\r?\n/).map((line) => line.trim()).filter(Boolean).flatMap((line) => {
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 (!import_node_fs5.default.existsSync(this.statePath)) {
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 (!import_node_fs5.default.existsSync(this.statePath)) {
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 import_node_fs6 = __toESM(require("node:fs"), 1);
55645
- var import_node_os6 = __toESM(require("node:os"), 1);
55646
- var import_node_path9 = __toESM(require("node:path"), 1);
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 = import_node_path9.default.join(import_node_os6.default.homedir(), ".local", "share", "opencode", "opencode.db");
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 (!import_node_fs6.default.existsSync(OPENCODE_DB_PATH)) {
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 import_node_fs7 = require("node:fs");
55955
- var import_promises3 = require("node:fs/promises");
55956
- var import_node_path10 = __toESM(require("node:path"), 1);
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 ?? import_node_path10.default.join(cwd, ".trajectories");
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 = import_node_path10.default.join(this.dataDir, "active");
56418
- await (0, import_promises3.mkdir)(activeDir, { recursive: true });
56419
- const filePath = import_node_path10.default.join(activeDir, `${this.trajectory.id}.json`);
56420
- await (0, import_promises3.writeFile)(filePath, JSON.stringify(this.trajectory, null, 2), "utf-8");
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 = import_node_path10.default.join(this.dataDir, "active");
56429
- const completedDir = import_node_path10.default.join(this.dataDir, "completed");
56430
- await (0, import_promises3.mkdir)(completedDir, { recursive: true });
56431
- const activePath = import_node_path10.default.join(activeDir, `${this.trajectory.id}.json`);
56432
- const completedPath = import_node_path10.default.join(completedDir, `${this.trajectory.id}.json`);
56433
- if ((0, import_node_fs7.existsSync)(activePath)) {
56434
- await (0, import_promises3.rename)(activePath, completedPath);
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
- if (_resolvedCursorCli !== void 0)
56463
- return _resolvedCursorCli;
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 ?? import_node_path11.default.join(this.cwd, ".relay", "summaries");
56541
- this.workersPath = import_node_path11.default.join(this.cwd, ".agent-relay", "team", "workers.json");
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 = import_node_path11.default.resolve(baseCwd, expanded);
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, import_node_fs8.existsSync)(abs)) {
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 import_node_path11.default.resolve(this.cwd, agent.cwd);
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 import_node_path11.default.resolve(this.cwd, step.cwd);
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) => import_node_path11.default.resolve(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, import_node_fs8.existsSync)(root))
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, import_node_fs8.readdirSync)(currentPath, { withFileTypes: true });
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 = import_node_path11.default.join(currentPath, entry.name);
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, import_node_fs8.statSync)(fullPath);
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, import_node_fs8.statSync)(root);
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 = import_node_path11.default.relative(this.cwd, filePath);
57401
+ const relative = import_node_path12.default.relative(this.cwd, filePath);
56979
57402
  if (!relative || relative === "")
56980
- return import_node_path11.default.basename(filePath);
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 = import_node_path11.default.resolve(this.cwd, filePath);
57189
- const raw = await (0, import_promises4.readFile)(absPath, "utf-8");
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 = import_node_path11.default.resolve(this.cwd, agent.cwd);
57343
- if (!(0, import_node_fs8.existsSync)(resolvedCwd)) {
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 = import_node_path11.default.resolve(this.cwd, ap);
57350
- if (!(0, import_node_fs8.existsSync)(resolvedPath)) {
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 = import_node_path11.default.basename(this.cwd) || "workflow";
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 = import_node_path11.default.basename(m[1]);
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 = import_node_path11.default.basename(m[1]);
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, import_node_child_process3.spawn)("sh", ["-c", check3.command], {
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, import_node_child_process3.spawn)("sh", ["-c", resolvedCommand], {
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) : import_node_path11.default.join(".worktrees", step.name);
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 = import_node_path11.default.resolve(stepCwd, worktreePath);
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, import_node_child_process3.spawn)("sh", ["-c", checkBranchCmd], {
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, import_node_child_process3.spawn)("sh", ["-c", worktreeCmd], {
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
- * Each CLI has a specific flag for one-shot prompt mode.
60155
+ * Delegates to the consolidated CLI registry for per-CLI arg formats.
59733
60156
  */
59734
60157
  static buildNonInteractiveCommand(cli, task, extraArgs = []) {
59735
- switch (cli) {
59736
- case "claude":
59737
- return { cmd: "claude", args: ["-p", "--dangerously-skip-permissions", task, ...extraArgs] };
59738
- case "codex":
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 = import_node_path11.default.join(logsDir, `${agentName}.log`);
59821
- const logStream = (0, import_node_fs8.createWriteStream)(logPath, { flags: "a" });
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, import_node_child_process3.spawn)(cmd, args, {
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, import_node_fs8.createWriteStream)(import_node_path11.default.join(logsDir, `${agentName}.log`), { flags: "a" });
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 = import_node_path11.default.join(logsDir, `${oldName}.log`);
59993
- const newLogPath = import_node_path11.default.join(logsDir, `${agent.name}.log`);
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, import_node_fs8.renameSync)(oldLogPath, newLogPath);
60410
+ (0, import_node_fs9.renameSync)(oldLogPath, newLogPath);
60000
60411
  } catch {
60001
60412
  }
60002
60413
  }
60003
- const newLogStream = (0, import_node_fs8.createWriteStream)(newLogPath, { flags: "a" });
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 = import_node_path11.default.join(this.summaryDir, `${step.name}.md`);
60108
- output = (0, import_node_fs8.existsSync)(summaryPath) ? await (0, import_promises4.readFile)(summaryPath, "utf-8") : exitResult === "timeout" ? "Agent completed (released after idle timeout)" : exitResult === "released" ? "Agent completed (idle \u2014 treated as done)" : `Agent exited (${exitResult})`;
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, import_node_fs8.existsSync)(import_node_path11.default.resolve(this.cwd, check3.value))) {
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 = import_node_path11.default.join(this.cwd, ".agent-relay", "team", "worker-logs");
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, import_node_fs8.mkdirSync)(import_node_path11.default.dirname(target), { recursive: true });
60758
- (0, import_node_fs8.writeFileSync)(target, runId + "\n", "utf8");
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 import_node_path11.default.join(this.cwd, ".agent-relay", "step-outputs", runId);
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 = import_node_path11.default.join(this.getStepOutputDir(runId), `${stepName}.md`);
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, import_node_fs8.mkdirSync)(dir, { recursive: true });
61278
+ (0, import_node_fs9.mkdirSync)(dir, { recursive: true });
60868
61279
  const cleaned = _WorkflowRunner.stripAnsi(output);
60869
- await (0, import_promises4.writeFile)(outputPath, cleaned);
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 = import_node_path11.default.join(this.getStepOutputDir(runId), `${stepName}.report.json`);
61301
+ const reportPath = import_node_path12.default.join(this.getStepOutputDir(runId), `${stepName}.report.json`);
60891
61302
  try {
60892
- (0, import_node_fs8.mkdirSync)(this.getStepOutputDir(runId), { recursive: true });
60893
- await (0, import_promises4.writeFile)(reportPath, JSON.stringify(report, null, 2), "utf8");
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 = import_node_path11.default.join(this.cwd, ".agent-relay", "step-outputs");
60901
- if (!(0, import_node_fs8.existsSync)(baseDir))
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, import_node_fs8.readdirSync)(baseDir);
61314
+ const entries = (0, import_node_fs9.readdirSync)(baseDir);
60904
61315
  let best;
60905
61316
  for (const entry of entries) {
60906
- const dirPath = import_node_path11.default.join(baseDir, entry);
61317
+ const dirPath = import_node_path12.default.join(baseDir, entry);
60907
61318
  try {
60908
- const stat2 = (0, import_node_fs8.statSync)(dirPath);
61319
+ const stat2 = (0, import_node_fs9.statSync)(dirPath);
60909
61320
  if (!stat2.isDirectory())
60910
61321
  continue;
60911
- const hasAny = [...stepNames].some((name) => (0, import_node_fs8.existsSync)(import_node_path11.default.join(dirPath, `${name}.md`)));
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 = import_node_path11.default.join(this.getStepOutputDir(runId), `${stepName}.md`);
60930
- if (!(0, import_node_fs8.existsSync)(filePath))
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, import_node_fs8.readFileSync)(filePath, "utf-8");
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 = import_node_path11.default.join(this.cwd, ".agent-relay", "team", "worker-logs");
60940
- (0, import_node_fs8.mkdirSync)(logsDir, { recursive: true });
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: import_node_path11.default.join(this.getWorkerLogsDir(), `${agentName}.log`)
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, import_node_fs8.mkdirSync)(import_node_path11.default.dirname(this.workersPath), { recursive: true });
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, import_node_fs8.existsSync)(this.workersPath))
61389
+ if (!(0, import_node_fs9.existsSync)(this.workersPath))
60979
61390
  return [];
60980
- const raw = JSON.parse((0, import_node_fs8.readFileSync)(this.workersPath, "utf-8"));
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, import_node_fs8.writeFileSync)(this.workersPath, JSON.stringify({ workers }, null, 2));
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 import_node_fs9 = require("node:fs");
60993
- var import_node_path12 = __toESM(require("node:path"), 1);
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, import_node_fs9.mkdirSync)(import_node_path12.default.dirname(filePath), { recursive: true });
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, import_node_fs9.appendFileSync)(this.filePath, JSON.stringify(entry) + "\n", "utf8");
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, import_node_fs9.readFileSync)(this.filePath, "utf8");
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
- if (this._errorHandling !== void 0)
61380
- config3.errorHandling = this._errorHandling;
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 import_node_fs10 = require("node:fs");
62277
- var import_node_path13 = __toESM(require("node:path"), 1);
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 ? import_node_path13.default.resolve(options.customTemplatesDir) : import_node_path13.default.resolve(options.workspaceDir ?? process.cwd(), ".relay/workflows");
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("..") || import_node_path13.default.isAbsolute(templateName)) {
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 import_node_fs10.promises.mkdir(this.customTemplatesDir, { recursive: true });
62381
- const targetPath = import_node_path13.default.join(this.customTemplatesDir, `${templateName}.yaml`);
62382
- await import_node_fs10.promises.writeFile(targetPath, (0, import_yaml4.stringify)(parsed), "utf-8");
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 import_node_path13.default.resolve(explicitDir);
62936
+ return import_node_path14.default.resolve(explicitDir);
62404
62937
  }
62405
- const currentDir = import_node_path13.default.dirname((0, import_node_url2.fileURLToPath)(import_meta_url));
62938
+ const currentDir = import_node_path14.default.dirname((0, import_node_url2.fileURLToPath)(import_meta_url));
62406
62939
  const candidates = [
62407
- import_node_path13.default.resolve(currentDir, "builtin-templates"),
62408
- import_node_path13.default.resolve(currentDir, "../workflows/builtin-templates")
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, import_node_fs10.existsSync)(candidate)) {
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 = import_node_path13.default.join(directory, `${templateName}${ext}`);
62964
+ const candidate = import_node_path14.default.join(directory, `${templateName}${ext}`);
62432
62965
  try {
62433
- const stat2 = await import_node_fs10.promises.stat(candidate);
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 import_node_fs10.promises.readFile(templatePath, "utf-8");
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 import_node_fs10.promises.readdir(directory);
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/listr-renderer.js
62650
- var import_chalk2 = __toESM(require_source(), 1);
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 import_node_fs11 = __toESM(require("node:fs"), 1);
63005
- var import_node_path14 = __toESM(require("node:path"), 1);
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 = import_node_path14.default.dirname(logFile);
63024
- if (!createdLogDirs.has(logDir) && !import_node_fs11.default.existsSync(logDir)) {
63025
- import_node_fs11.default.mkdirSync(logDir, { recursive: true });
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
- import_node_fs11.default.appendFileSync(logFile, formatted + "\n");
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 import_node_child_process4 = require("node:child_process");
63325
- var import_node_fs12 = __toESM(require("node:fs"), 1);
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, import_node_child_process4.execSync)(`which ${command}`, {
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 = import_node_fs12.default.realpathSync(filePath);
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, import_node_child_process4.execSync)(`which ${command}`, {
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 import_node_child_process5 = require("node:child_process");
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, import_node_child_process5.execSync)(`git remote get-url ${remoteName}`, {
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 import_node_fs13 = __toESM(require("node:fs"), 1);
63452
- var import_node_path15 = __toESM(require("node:path"), 1);
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 import_node_os8 = __toESM(require("node:os"), 1);
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 = import_node_path15.default.join(import_node_os8.default.homedir(), ".agent-relay");
63461
- return import_node_path15.default.join(cacheDir, "update-cache.json");
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 (!import_node_fs13.default.existsSync(cachePath))
63798
+ if (!import_node_fs14.default.existsSync(cachePath))
63467
63799
  return null;
63468
- const data = import_node_fs13.default.readFileSync(cachePath, "utf-8");
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 = import_node_path15.default.dirname(cachePath);
63478
- if (!import_node_fs13.default.existsSync(cacheDir)) {
63479
- import_node_fs13.default.mkdirSync(cacheDir, { recursive: true });
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
- import_node_fs13.default.writeFileSync(cachePath, JSON.stringify(cache, null, 2));
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 import_node_fs14 = __toESM(require("node:fs"), 1);
63761
- var import_node_os9 = __toESM(require("node:os"), 1);
63762
- var import_node_path16 = __toESM(require("node:path"), 1);
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 = import_node_os9.default.platform();
63775
- const arch = import_node_os9.default.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 = import_node_os9.default.platform();
63780
- const arch = import_node_os9.default.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(import_node_path16.default.join(scopedMatch[1], "agent-relay"));
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(import_node_path16.default.join(callerDirname, "..", "..", ".."));
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 = import_node_path16.default.join(home, ".npm", "_npx");
63821
- if (import_node_fs14.default.existsSync(npxCacheBase)) {
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 = import_node_fs14.default.readdirSync(npxCacheBase);
64155
+ const entries = import_node_fs15.default.readdirSync(npxCacheBase);
63824
64156
  for (const entry of entries) {
63825
- const npxPackage = import_node_path16.default.join(npxCacheBase, entry, "node_modules", "agent-relay");
63826
- if (import_node_fs14.default.existsSync(npxPackage)) {
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(import_node_path16.default.join(process.cwd(), "node_modules", "agent-relay"));
64166
+ packageRoots.push(import_node_path17.default.join(process.cwd(), "node_modules", "agent-relay"));
63835
64167
  if (home) {
63836
- packageRoots.push(import_node_path16.default.join(home, ".nvm", "versions", "node", process.version, "lib", "node_modules", "agent-relay"));
63837
- packageRoots.push(import_node_path16.default.join(home, ".volta", "tools", "image", "packages", "agent-relay", "lib", "node_modules", "agent-relay"));
63838
- packageRoots.push(import_node_path16.default.join(home, ".fnm", "node-versions", process.version, "installation", "lib", "node_modules", "agent-relay"));
63839
- packageRoots.push(import_node_path16.default.join(home, "n", "lib", "node_modules", "agent-relay"));
63840
- packageRoots.push(import_node_path16.default.join(home, ".asdf", "installs", "nodejs", process.version.replace("v", ""), "lib", "node_modules", "agent-relay"));
63841
- packageRoots.push(import_node_path16.default.join(home, ".local", "share", "pnpm", "global", "node_modules", "agent-relay"));
63842
- packageRoots.push(import_node_path16.default.join(home, ".config", "yarn", "global", "node_modules", "agent-relay"));
63843
- packageRoots.push(import_node_path16.default.join(home, ".yarn", "global", "node_modules", "agent-relay"));
63844
- }
63845
- const bashInstallerDir = process.env.AGENT_RELAY_INSTALL_DIR ? import_node_path16.default.join(process.env.AGENT_RELAY_INSTALL_DIR, "bin") : home ? import_node_path16.default.join(home, ".agent-relay", "bin") : null;
63846
- const bashInstallerBinDir = process.env.AGENT_RELAY_BIN_DIR || (home ? import_node_path16.default.join(home, ".local", "bin") : null);
63847
- const nodePrefix = import_node_path16.default.resolve(import_node_path16.default.dirname(process.execPath), "..");
63848
- packageRoots.push(import_node_path16.default.join(nodePrefix, "lib", "node_modules", "agent-relay"));
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(import_node_path16.default.join(root, "bin", platformBinary));
64187
+ candidates.push(import_node_path17.default.join(root, "bin", platformBinary));
63856
64188
  }
63857
- candidates.push(import_node_path16.default.join(root, "bin", "relay-pty"));
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(import_node_path16.default.join(bashInstallerDir, platformBinary));
64193
+ candidates.push(import_node_path17.default.join(bashInstallerDir, platformBinary));
63862
64194
  }
63863
- candidates.push(import_node_path16.default.join(bashInstallerDir, "relay-pty"));
64195
+ candidates.push(import_node_path17.default.join(bashInstallerDir, "relay-pty"));
63864
64196
  }
63865
64197
  if (bashInstallerBinDir) {
63866
64198
  if (platformBinary) {
63867
- candidates.push(import_node_path16.default.join(bashInstallerBinDir, platformBinary));
64199
+ candidates.push(import_node_path17.default.join(bashInstallerBinDir, platformBinary));
63868
64200
  }
63869
- candidates.push(import_node_path16.default.join(bashInstallerBinDir, "relay-pty"));
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
- import_node_fs14.default.accessSync(filePath, import_node_fs14.default.constants.X_OK);
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 = import_node_fs14.default.openSync(filePath, "r");
64225
+ fd = import_node_fs15.default.openSync(filePath, "r");
63894
64226
  const header = Buffer.alloc(4);
63895
- const bytesRead = import_node_fs14.default.readSync(fd, header, 0, 4, 0);
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 = import_node_os9.default.platform();
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
- import_node_fs14.default.closeSync(fd);
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 import_node_child_process6 = require("node:child_process");
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 import_node_path17 = __toESM(require("node:path"), 1);
64534
- var import_node_fs15 = __toESM(require("node:fs"), 1);
64535
- var import_node_os10 = __toESM(require("node:os"), 1);
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 import_node_path17.default.join(xdgDataHome, "agent-relay");
64874
+ return import_node_path18.default.join(xdgDataHome, "agent-relay");
64543
64875
  }
64544
- return import_node_path17.default.join(import_node_os10.default.homedir(), ".agent-relay");
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 = import_node_path17.default.resolve(projectPath);
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 import_node_path17.default.resolve(process.env.AGENT_RELAY_PROJECT);
64887
+ return import_node_path18.default.resolve(process.env.AGENT_RELAY_PROJECT);
64556
64888
  }
64557
- let current = import_node_path17.default.resolve(startDir);
64558
- const root = import_node_path17.default.parse(current).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 (import_node_fs15.default.existsSync(import_node_path17.default.join(current, marker))) {
64894
+ if (import_node_fs16.default.existsSync(import_node_path18.default.join(current, marker))) {
64563
64895
  return current;
64564
64896
  }
64565
64897
  }
64566
- current = import_node_path17.default.dirname(current);
64898
+ current = import_node_path18.default.dirname(current);
64567
64899
  }
64568
- return import_node_path17.default.resolve(startDir);
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 = import_node_path17.default.join(root, PROJECT_DATA_DIR2);
64905
+ const dataDir = import_node_path18.default.join(root, PROJECT_DATA_DIR2);
64574
64906
  return {
64575
64907
  dataDir,
64576
- teamDir: import_node_path17.default.join(dataDir, "team"),
64577
- dbPath: import_node_path17.default.join(dataDir, "messages.sqlite"),
64578
- socketPath: import_node_path17.default.join(dataDir, "relay.sock"),
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 import_node_fs16 = require("node:fs");
64586
- var import_node_path18 = require("node:path");
64587
- var import_node_os11 = require("node:os");
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, import_node_path18.join)((0, import_node_os11.homedir)(), ".config", "agent-relay");
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, import_node_path18.join)(getAgentRelayConfigDir(), "relay.json");
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, import_node_fs16.statSync)(configPath);
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, import_node_fs16.existsSync)(configPath)) {
64940
+ if (!(0, import_node_fs17.existsSync)(configPath)) {
64609
64941
  return {};
64610
64942
  }
64611
- const content = (0, import_node_fs16.readFileSync)(configPath, "utf-8");
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, import_node_fs16.statSync)(configPath);
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, import_node_path18.join)((0, import_node_os11.homedir)(), ".config");
64635
- return (0, import_node_path18.join)(configDir, "agent-relay", "trajectories", projectHash);
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, import_node_path18.join)(root, ".trajectories");
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, import_node_child_process6.spawn)("trail", args, {
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, import_node_child_process6.execSync)("which trail", { stdio: "pipe" });
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 import_node_fs17 = require("node:fs");
65280
- var import_node_path19 = require("node:path");
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, import_node_path19.join)(config3.inboxDir, agentName, "inbox.md");
65622
+ return (0, import_node_path20.join)(config3.inboxDir, agentName, "inbox.md");
65291
65623
  }
65292
65624
  function inboxExists(inboxPath) {
65293
- return (0, import_node_fs17.existsSync)(inboxPath);
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, import_node_fs17.readFileSync)(inboxPath, "utf-8");
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,