@neriros/ralphy 2.13.5 → 2.13.7

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 (2) hide show
  1. package/dist/cli/index.js +578 -141
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -56373,6 +56373,8 @@ var useApp = () => import_react17.useContext(AppContext_default);
56373
56373
  var use_app_default = useApp;
56374
56374
  // node_modules/.bun/ink@5.2.1+1f88f629f0141b18/node_modules/ink/build/hooks/use-stdout.js
56375
56375
  var import_react18 = __toESM(require_react(), 1);
56376
+ var useStdout = () => import_react18.useContext(StdoutContext_default);
56377
+ var use_stdout_default = useStdout;
56376
56378
  // node_modules/.bun/ink@5.2.1+1f88f629f0141b18/node_modules/ink/build/hooks/use-stderr.js
56377
56379
  var import_react19 = __toESM(require_react(), 1);
56378
56380
  // node_modules/.bun/ink@5.2.1+1f88f629f0141b18/node_modules/ink/build/hooks/use-focus.js
@@ -56407,7 +56409,7 @@ function log(msg) {
56407
56409
  // package.json
56408
56410
  var package_default = {
56409
56411
  name: "@neriros/ralphy",
56410
- version: "2.13.5",
56412
+ version: "2.13.7",
56411
56413
  description: "An iterative AI task execution framework. Orchestrates multi-phase autonomous work using Claude or Codex engines.",
56412
56414
  keywords: [
56413
56415
  "agent",
@@ -72107,30 +72109,50 @@ function fmtElapsed(ms) {
72107
72109
  function trunc(s, max2) {
72108
72110
  return s.length > max2 ? s.slice(0, max2 - 1) + "\u2026" : s;
72109
72111
  }
72112
+ function prLabel(prUrl) {
72113
+ const m = prUrl.match(/\/pull\/(\d+)/);
72114
+ return m ? `#${m[1]}` : "PR";
72115
+ }
72116
+ var ANSI_STRIP_RE = /\x1b(?:\[[0-9;]*[A-Za-z]|\][^\x07\x1b]*(?:\x07|\x1b\\)|.)/g;
72117
+ var BOX_ONLY_RE = /^[\s\u2500\u2502\u256D\u256E\u2570\u256F\u254C\u2504\u2501\u2503]+$/;
72118
+ var STATUS_BAR_LINE_RE = /^[\u280B\u2819\u2839\u2838\u283C\u2834\u2826\u2827\u2807\u280F\u2713\u2717]\s+iter\s+\d+/;
72119
+ var ITER_HEADER_LINE_RE = /^\u2500\u2500/;
72120
+ function cleanOutputLine(raw) {
72121
+ const clean = raw.replace(ANSI_STRIP_RE, "").trim();
72122
+ if (!clean)
72123
+ return null;
72124
+ if (BOX_ONLY_RE.test(clean))
72125
+ return null;
72126
+ if (STATUS_BAR_LINE_RE.test(clean))
72127
+ return null;
72128
+ if (ITER_HEADER_LINE_RE.test(clean))
72129
+ return null;
72130
+ return clean;
72131
+ }
72110
72132
  function priorityBadge(p) {
72111
72133
  switch (p) {
72112
72134
  case 1:
72113
- return { text: "!", color: "red" };
72135
+ return { text: "\u25B2", color: "red", label: "URGENT" };
72114
72136
  case 2:
72115
- return { text: "\u2191", color: "yellow" };
72137
+ return { text: "\u2191", color: "yellow", label: "HIGH" };
72116
72138
  case 3:
72117
- return { text: "\xB7", color: "blue" };
72139
+ return { text: "\xB7", color: "blue", label: "MED" };
72118
72140
  case 4:
72119
- return { text: "\u2193", color: "gray" };
72141
+ return { text: "\u2193", color: "gray", label: "LOW" };
72120
72142
  default:
72121
- return { text: " ", color: "gray" };
72143
+ return { text: " ", color: "gray", label: "" };
72122
72144
  }
72123
72145
  }
72124
72146
  function modeBadge(mode) {
72125
72147
  switch (mode) {
72126
72148
  case "fresh":
72127
- return { text: "new", color: "cyan" };
72149
+ return { text: "NEW", color: "cyan" };
72128
72150
  case "resume":
72129
- return { text: "resume", color: "yellow" };
72151
+ return { text: "RESUME", color: "yellow" };
72130
72152
  case "conflict-fix":
72131
- return { text: "fix", color: "magenta" };
72153
+ return { text: "FIX", color: "magenta" };
72132
72154
  default:
72133
- return { text: mode, color: "white" };
72155
+ return { text: mode.toUpperCase(), color: "white" };
72134
72156
  }
72135
72157
  }
72136
72158
  function phaseColor(phase) {
@@ -72160,6 +72182,29 @@ function phaseColor(phase) {
72160
72182
  return "white";
72161
72183
  }
72162
72184
  }
72185
+ function workerBorderColor(phase) {
72186
+ switch (phase) {
72187
+ case "working":
72188
+ case "scaffolding":
72189
+ return "cyan";
72190
+ case "committing":
72191
+ case "commit-retry":
72192
+ case "pushing":
72193
+ case "push-retry":
72194
+ case "rebasing":
72195
+ case "pr-create":
72196
+ return "yellow";
72197
+ case "ci-poll":
72198
+ case "ci-fix":
72199
+ return "blue";
72200
+ case "done":
72201
+ return "green";
72202
+ case "gave-up":
72203
+ return "red";
72204
+ default:
72205
+ return "gray";
72206
+ }
72207
+ }
72163
72208
  function displayTailLines(activeCount) {
72164
72209
  if (activeCount <= 1)
72165
72210
  return 20;
@@ -72167,34 +72212,16 @@ function displayTailLines(activeCount) {
72167
72212
  return 12;
72168
72213
  if (activeCount <= 3)
72169
72214
  return 8;
72170
- return 6;
72171
- }
72172
- function settingsSummary(cfg, filterDesc) {
72173
- const parts = [
72174
- `${cfg.engine}/${cfg.model}`,
72175
- `concurrency: ${cfg.concurrency}`,
72176
- `poll: ${cfg.pollIntervalSeconds}s`
72177
- ];
72178
- if (cfg.maxIterationsPerTask > 0)
72179
- parts.push(`maxIter: ${cfg.maxIterationsPerTask}`);
72180
- if (cfg.maxCostUsdPerTask > 0)
72181
- parts.push(`maxCost: $${cfg.maxCostUsdPerTask}`);
72182
- if (cfg.maxRuntimeMinutesPerTask > 0)
72183
- parts.push(`maxRuntime: ${cfg.maxRuntimeMinutesPerTask}m`);
72184
- if (cfg.createPrOnSuccess)
72185
- parts.push("PR: on");
72186
- if (cfg.fixCiOnFailure)
72187
- parts.push("fixCI: on");
72188
- if (cfg.useWorktree)
72189
- parts.push("worktree: on");
72190
- const settingsStr = parts.join(" \xB7 ");
72191
- return filterDesc ? `${settingsStr} [${filterDesc}]` : settingsStr;
72215
+ return 5;
72192
72216
  }
72193
72217
  function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72194
72218
  const { exit } = use_app_default();
72219
+ const { stdout } = use_stdout_default();
72220
+ const { isRawModeSupported } = use_stdin_default();
72195
72221
  const [logs, setLogs] = import_react57.useState([]);
72196
72222
  const [, setTick] = import_react57.useState(0);
72197
72223
  const [clock, setClock] = import_react57.useState(0);
72224
+ const [focusedIdx, setFocusedIdx] = import_react57.useState(0);
72198
72225
  const coordRef = import_react57.useRef(null);
72199
72226
  const workerMetaRef = import_react57.useRef(new Map);
72200
72227
  const nextPollAtRef = import_react57.useRef(0);
@@ -72258,11 +72285,14 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72258
72285
  const m = workerMetaRef.current.get(changeName);
72259
72286
  if (!m)
72260
72287
  return;
72261
- m.tail.push(line);
72288
+ const clean = cleanOutputLine(line);
72289
+ if (!clean)
72290
+ return;
72291
+ m.tail.push(clean);
72262
72292
  if (m.tail.length > TAIL_BUFFER_SIZE)
72263
72293
  m.tail.splice(0, m.tail.length - TAIL_BUFFER_SIZE);
72264
72294
  },
72265
- onWorkerCmd: (changeName, cmd, state, durationMs, ok) => {
72295
+ onWorkerCmd: (changeName, cmd, state) => {
72266
72296
  const m = workerMetaRef.current.get(changeName);
72267
72297
  if (!m)
72268
72298
  return;
@@ -72278,20 +72308,6 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72278
72308
  m.prUrl = prUrl;
72279
72309
  }
72280
72310
  });
72281
- appendLog(` concurrency: ${concurrency} \xB7 poll: ${pollInterval}s \xB7 ${cfg2.engine}/${cfg2.model}`, "gray");
72282
- const feats = [];
72283
- if (cfg2.createPrOnSuccess)
72284
- feats.push("createPR");
72285
- if (cfg2.fixCiOnFailure)
72286
- feats.push("fixCI");
72287
- if (cfg2.useWorktree)
72288
- feats.push("worktree");
72289
- if (cfg2.maxIterationsPerTask > 0)
72290
- feats.push(`maxIter=${cfg2.maxIterationsPerTask}`);
72291
- if (cfg2.maxCostUsdPerTask > 0)
72292
- feats.push(`maxCost=$${cfg2.maxCostUsdPerTask}`);
72293
- if (feats.length)
72294
- appendLog(` features: ${feats.join(", ")}`, "gray");
72295
72311
  coordRef.current = coord2;
72296
72312
  await coord2.init();
72297
72313
  const tick = async () => {
@@ -72376,7 +72392,26 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72376
72392
  const now2 = Date.now();
72377
72393
  const secsToNextPoll = nextPollAtRef.current ? Math.max(0, Math.ceil((nextPollAtRef.current - now2) / 1000)) : null;
72378
72394
  const activeCount = coord?.activeCount ?? 0;
72379
- const tailLines = displayTailLines(activeCount);
72395
+ const termWidth = (stdout?.columns ?? 100) - 2;
72396
+ const termHeight = stdout?.rows ?? 40;
72397
+ const safeFocusedIdx = activeCount > 0 ? Math.min(focusedIdx, activeCount - 1) : 0;
72398
+ use_input_default((input, key) => {
72399
+ if (activeCount === 0)
72400
+ return;
72401
+ if (key.tab || key.rightArrow) {
72402
+ setFocusedIdx((i) => (Math.min(i, activeCount - 1) + 1) % activeCount);
72403
+ } else if (key.leftArrow) {
72404
+ setFocusedIdx((i) => (Math.min(i, activeCount - 1) - 1 + activeCount) % activeCount);
72405
+ } else {
72406
+ const n = parseInt(input, 10);
72407
+ if (!isNaN(n) && n >= 1 && n <= activeCount)
72408
+ setFocusedIdx(n - 1);
72409
+ }
72410
+ }, { isActive: isRawModeSupported && activeCount > 1 });
72411
+ const FIXED_OVERHEAD = 22;
72412
+ const nonFocusedCount = Math.max(0, activeCount - 1);
72413
+ const focusedTailLines = Math.max(5, termHeight - FIXED_OVERHEAD - nonFocusedCount);
72414
+ const compactTailLines = displayTailLines(activeCount);
72380
72415
  return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72381
72416
  flexDirection: "column",
72382
72417
  children: [
@@ -72390,45 +72425,306 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72390
72425
  }, line.id, false, undefined, this)
72391
72426
  }, undefined, false, undefined, this),
72392
72427
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72393
- marginTop: 1,
72394
72428
  flexDirection: "column",
72429
+ marginTop: 1,
72395
72430
  children: [
72396
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72397
- dimColor: true,
72431
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72432
+ borderStyle: "round",
72433
+ borderColor: "blue",
72434
+ flexDirection: "column",
72435
+ paddingX: 1,
72436
+ width: termWidth,
72398
72437
  children: [
72399
- spinnerFrame,
72400
- " ",
72401
- pollStatus.state === "polling" ? `polling Linear (${pollStatus.filterDesc})` : pollStatus.lastAt !== null ? `last poll: ${pollStatus.lastFound} open, ${pollStatus.lastAdded} new${secsToNextPoll !== null ? ` \xB7 next in ${secsToNextPoll}s` : ""}` : "starting\u2026"
72438
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72439
+ children: [
72440
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72441
+ bold: true,
72442
+ color: "cyan",
72443
+ children: [
72444
+ "\u25C8 RALPH AGENT",
72445
+ " "
72446
+ ]
72447
+ }, undefined, true, undefined, this),
72448
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72449
+ dimColor: true,
72450
+ children: [
72451
+ "v",
72452
+ VERSION
72453
+ ]
72454
+ }, undefined, true, undefined, this),
72455
+ cfg && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72456
+ children: [
72457
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72458
+ dimColor: true,
72459
+ children: " \u2502 "
72460
+ }, undefined, false, undefined, this),
72461
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72462
+ color: "cyan",
72463
+ bold: true,
72464
+ children: [
72465
+ cfg.engine,
72466
+ "/",
72467
+ cfg.model
72468
+ ]
72469
+ }, undefined, true, undefined, this),
72470
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72471
+ dimColor: true,
72472
+ children: [
72473
+ " \u2502 \xD7",
72474
+ cfg.concurrency
72475
+ ]
72476
+ }, undefined, true, undefined, this),
72477
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72478
+ dimColor: true,
72479
+ children: [
72480
+ " \u2502 poll ",
72481
+ cfg.pollIntervalSeconds,
72482
+ "s"
72483
+ ]
72484
+ }, undefined, true, undefined, this),
72485
+ cfg.maxIterationsPerTask > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72486
+ color: "yellow",
72487
+ children: [
72488
+ " \u2502 iter \u2264",
72489
+ cfg.maxIterationsPerTask
72490
+ ]
72491
+ }, undefined, true, undefined, this),
72492
+ cfg.maxCostUsdPerTask > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72493
+ color: "yellow",
72494
+ children: [
72495
+ " \u2502 cost \u2264$",
72496
+ cfg.maxCostUsdPerTask
72497
+ ]
72498
+ }, undefined, true, undefined, this),
72499
+ cfg.createPrOnSuccess && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72500
+ color: "green",
72501
+ children: " \u25CF PR"
72502
+ }, undefined, false, undefined, this),
72503
+ cfg.fixCiOnFailure && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72504
+ color: "green",
72505
+ children: " \u25CF fixCI"
72506
+ }, undefined, false, undefined, this),
72507
+ cfg.useWorktree && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72508
+ color: "green",
72509
+ children: " \u25CF worktree"
72510
+ }, undefined, false, undefined, this)
72511
+ ]
72512
+ }, undefined, true, undefined, this)
72513
+ ]
72514
+ }, undefined, true, undefined, this),
72515
+ pollStatus.filterDesc && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72516
+ dimColor: true,
72517
+ children: [
72518
+ "Linear ",
72519
+ trunc(pollStatus.filterDesc.replace(/, /g, " \xB7 "), termWidth - 12)
72520
+ ]
72521
+ }, undefined, true, undefined, this)
72402
72522
  ]
72403
72523
  }, undefined, true, undefined, this),
72404
72524
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72525
+ flexDirection: "row",
72526
+ gap: 1,
72527
+ marginTop: 1,
72528
+ width: termWidth,
72405
72529
  children: [
72406
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72407
- dimColor: true,
72530
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72531
+ borderStyle: "round",
72532
+ borderColor: "gray",
72533
+ flexDirection: "column",
72534
+ paddingX: 1,
72535
+ flexGrow: 1,
72408
72536
  children: [
72409
- " ",
72410
- "workers active: ",
72411
- activeCount,
72412
- " \xB7 queued: ",
72413
- coord?.queuedCount ?? 0
72537
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72538
+ dimColor: true,
72539
+ bold: true,
72540
+ children: "POLL STATUS"
72541
+ }, undefined, false, undefined, this),
72542
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72543
+ gap: 2,
72544
+ marginTop: 0,
72545
+ children: [
72546
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72547
+ color: "gray",
72548
+ children: spinnerFrame
72549
+ }, undefined, false, undefined, this),
72550
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72551
+ children: pollStatus.state === "polling" ? "Polling Linear\u2026" : pollStatus.lastAt !== null ? "Idle" : "Starting\u2026"
72552
+ }, undefined, false, undefined, this),
72553
+ pollStatus.lastAt !== null && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
72554
+ children: [
72555
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72556
+ dimColor: true,
72557
+ children: "\u2502"
72558
+ }, undefined, false, undefined, this),
72559
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72560
+ dimColor: true,
72561
+ children: "found"
72562
+ }, undefined, false, undefined, this),
72563
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72564
+ color: "white",
72565
+ children: pollStatus.lastFound
72566
+ }, undefined, false, undefined, this),
72567
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72568
+ dimColor: true,
72569
+ children: "\u2502"
72570
+ }, undefined, false, undefined, this),
72571
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72572
+ dimColor: true,
72573
+ children: "new"
72574
+ }, undefined, false, undefined, this),
72575
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72576
+ color: pollStatus.lastAdded > 0 ? "green" : "white",
72577
+ children: pollStatus.lastAdded
72578
+ }, undefined, false, undefined, this),
72579
+ secsToNextPoll !== null && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
72580
+ children: [
72581
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72582
+ dimColor: true,
72583
+ children: "\u2502"
72584
+ }, undefined, false, undefined, this),
72585
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72586
+ dimColor: true,
72587
+ children: "next in"
72588
+ }, undefined, false, undefined, this),
72589
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72590
+ color: "gray",
72591
+ children: [
72592
+ secsToNextPoll,
72593
+ "s"
72594
+ ]
72595
+ }, undefined, true, undefined, this)
72596
+ ]
72597
+ }, undefined, true, undefined, this)
72598
+ ]
72599
+ }, undefined, true, undefined, this)
72600
+ ]
72601
+ }, undefined, true, undefined, this)
72414
72602
  ]
72415
72603
  }, undefined, true, undefined, this),
72416
- cfg && pollStatus.filterDesc && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72417
- dimColor: true,
72604
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72605
+ borderStyle: "round",
72606
+ borderColor: "gray",
72607
+ flexDirection: "column",
72608
+ paddingX: 1,
72609
+ minWidth: 28,
72418
72610
  children: [
72419
- " ",
72420
- settingsSummary(cfg, pollStatus.filterDesc)
72611
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72612
+ dimColor: true,
72613
+ bold: true,
72614
+ children: "WORKERS"
72615
+ }, undefined, false, undefined, this),
72616
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72617
+ gap: 3,
72618
+ marginTop: 0,
72619
+ children: [
72620
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72621
+ gap: 1,
72622
+ children: [
72623
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72624
+ dimColor: true,
72625
+ children: "active"
72626
+ }, undefined, false, undefined, this),
72627
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72628
+ color: activeCount > 0 ? "cyan" : "gray",
72629
+ bold: true,
72630
+ children: activeCount
72631
+ }, undefined, false, undefined, this)
72632
+ ]
72633
+ }, undefined, true, undefined, this),
72634
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72635
+ gap: 1,
72636
+ children: [
72637
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72638
+ dimColor: true,
72639
+ children: "queued"
72640
+ }, undefined, false, undefined, this),
72641
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72642
+ color: coord?.queuedCount ?? 0 > 0 ? "yellow" : "gray",
72643
+ bold: true,
72644
+ children: coord?.queuedCount ?? 0
72645
+ }, undefined, false, undefined, this)
72646
+ ]
72647
+ }, undefined, true, undefined, this)
72648
+ ]
72649
+ }, undefined, true, undefined, this)
72421
72650
  ]
72422
72651
  }, undefined, true, undefined, this)
72423
72652
  ]
72424
72653
  }, undefined, true, undefined, this),
72425
- coord?.activeWorkers.map((w) => {
72654
+ activeCount > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72655
+ borderStyle: "round",
72656
+ borderColor: "gray",
72657
+ flexDirection: "column",
72658
+ paddingX: 1,
72659
+ marginTop: 1,
72660
+ width: termWidth,
72661
+ children: [
72662
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72663
+ gap: 1,
72664
+ children: [
72665
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72666
+ dimColor: true,
72667
+ bold: true,
72668
+ children: "TASKS"
72669
+ }, undefined, false, undefined, this),
72670
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72671
+ dimColor: true,
72672
+ children: activeCount > 1 ? " Tab/\u2190 \u2192 to switch \xB7 1-9 jump" : ""
72673
+ }, undefined, false, undefined, this)
72674
+ ]
72675
+ }, undefined, true, undefined, this),
72676
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72677
+ gap: 3,
72678
+ flexWrap: "wrap",
72679
+ children: coord?.activeWorkers.map((w, idx) => {
72680
+ const meta = workerMetaRef.current.get(w.changeName);
72681
+ const phase = meta?.phase ?? "working";
72682
+ const pBadge = priorityBadge(w.issue.priority);
72683
+ const isFocused = idx === safeFocusedIdx;
72684
+ return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72685
+ gap: 1,
72686
+ children: [
72687
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72688
+ color: isFocused ? "white" : "gray",
72689
+ bold: isFocused,
72690
+ children: [
72691
+ "[",
72692
+ idx + 1,
72693
+ "]"
72694
+ ]
72695
+ }, undefined, true, undefined, this),
72696
+ pBadge.label && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72697
+ color: pBadge.color,
72698
+ children: pBadge.text
72699
+ }, undefined, false, undefined, this),
72700
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72701
+ color: isFocused ? "cyan" : "gray",
72702
+ bold: isFocused,
72703
+ children: w.issueIdentifier
72704
+ }, undefined, false, undefined, this),
72705
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72706
+ color: phaseColor(phase),
72707
+ dimColor: !isFocused,
72708
+ children: phase
72709
+ }, undefined, false, undefined, this),
72710
+ isFocused && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72711
+ color: "white",
72712
+ children: "\u25C0"
72713
+ }, undefined, false, undefined, this)
72714
+ ]
72715
+ }, w.changeName, true, undefined, this);
72716
+ })
72717
+ }, undefined, false, undefined, this)
72718
+ ]
72719
+ }, undefined, true, undefined, this),
72720
+ coord?.activeWorkers.map((w, idx) => {
72721
+ const isFocused = idx === safeFocusedIdx;
72426
72722
  const meta = workerMetaRef.current.get(w.changeName);
72427
72723
  const elapsed = meta ? fmtElapsed(now2 - meta.startedAt) : "\u2013";
72428
72724
  const iter = meta?.iter ?? 0;
72429
72725
  const phase = meta?.phase ?? "working";
72430
72726
  const phaseElapsed = meta ? fmtElapsed(now2 - meta.phaseStartedAt) : "\u2013";
72431
- const phaseDetail = meta?.phaseDetail ? ` (${meta.phaseDetail})` : "";
72727
+ const phaseDetail = meta?.phaseDetail ?? "";
72432
72728
  const cmd = meta?.currentCmd;
72433
72729
  const cmdElapsed = cmd ? fmtElapsed(now2 - cmd.startedAt) : null;
72434
72730
  const tail2 = meta?.tail ?? [];
@@ -72436,136 +72732,277 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72436
72732
  const currentTask = meta?.currentTask ?? null;
72437
72733
  const pBadge = priorityBadge(w.issue.priority);
72438
72734
  const mBadge = modeBadge(w.mode);
72439
- const issueTitle = trunc(w.issue.title, 52);
72440
72735
  const pColor = phaseColor(phase);
72736
+ const bColor = isFocused ? workerBorderColor(phase) : "gray";
72737
+ const visibleTailLines = isFocused ? focusedTailLines : compactTailLines;
72738
+ if (!isFocused && activeCount > 1) {
72739
+ return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72740
+ borderStyle: "round",
72741
+ borderColor: "gray",
72742
+ paddingX: 1,
72743
+ marginTop: 1,
72744
+ gap: 2,
72745
+ width: termWidth,
72746
+ children: [
72747
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72748
+ dimColor: true,
72749
+ children: [
72750
+ "[",
72751
+ idx + 1,
72752
+ "]"
72753
+ ]
72754
+ }, undefined, true, undefined, this),
72755
+ pBadge.label && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72756
+ color: pBadge.color,
72757
+ children: pBadge.text
72758
+ }, undefined, false, undefined, this),
72759
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72760
+ color: "gray",
72761
+ bold: true,
72762
+ children: w.issueIdentifier
72763
+ }, undefined, false, undefined, this),
72764
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72765
+ dimColor: true,
72766
+ children: trunc(w.issue.title, 40)
72767
+ }, undefined, false, undefined, this),
72768
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72769
+ dimColor: true,
72770
+ children: "\u2502"
72771
+ }, undefined, false, undefined, this),
72772
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72773
+ color: pColor,
72774
+ dimColor: true,
72775
+ children: phase
72776
+ }, undefined, false, undefined, this),
72777
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72778
+ dimColor: true,
72779
+ children: "\u2502"
72780
+ }, undefined, false, undefined, this),
72781
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72782
+ dimColor: true,
72783
+ children: elapsed
72784
+ }, undefined, false, undefined, this),
72785
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72786
+ dimColor: true,
72787
+ children: "\xB7"
72788
+ }, undefined, false, undefined, this),
72789
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72790
+ dimColor: true,
72791
+ children: [
72792
+ "iter ",
72793
+ iter
72794
+ ]
72795
+ }, undefined, true, undefined, this),
72796
+ currentTask && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
72797
+ children: [
72798
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72799
+ dimColor: true,
72800
+ children: "\u2502"
72801
+ }, undefined, false, undefined, this),
72802
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72803
+ dimColor: true,
72804
+ children: [
72805
+ "\u25B6 ",
72806
+ trunc(currentTask, 40)
72807
+ ]
72808
+ }, undefined, true, undefined, this)
72809
+ ]
72810
+ }, undefined, true, undefined, this)
72811
+ ]
72812
+ }, w.changeName, true, undefined, this);
72813
+ }
72441
72814
  return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72815
+ borderStyle: "round",
72816
+ borderColor: bColor,
72442
72817
  flexDirection: "column",
72818
+ paddingX: 1,
72443
72819
  marginTop: 1,
72820
+ width: termWidth,
72444
72821
  children: [
72445
72822
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72823
+ gap: 2,
72446
72824
  children: [
72447
72825
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72448
- children: " "
72826
+ children: spinnerFrame
72449
72827
  }, undefined, false, undefined, this),
72450
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72828
+ pBadge.label && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72829
+ color: pBadge.color,
72451
72830
  children: [
72452
- spinnerFrame,
72453
- " "
72831
+ pBadge.text,
72832
+ " ",
72833
+ pBadge.label
72454
72834
  ]
72455
72835
  }, undefined, true, undefined, this),
72456
72836
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72457
- color: pBadge.color,
72458
- children: pBadge.text
72837
+ color: "cyan",
72838
+ bold: true,
72839
+ children: w.issueIdentifier
72459
72840
  }, undefined, false, undefined, this),
72460
72841
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72461
- children: " "
72842
+ color: "white",
72843
+ bold: true,
72844
+ children: trunc(w.issue.title, Math.max(30, termWidth - 60))
72462
72845
  }, undefined, false, undefined, this),
72463
72846
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72464
- color: "cyan",
72847
+ color: mBadge.color,
72465
72848
  bold: true,
72466
- children: w.issueIdentifier
72849
+ children: [
72850
+ "[",
72851
+ mBadge.text,
72852
+ "]"
72853
+ ]
72854
+ }, undefined, true, undefined, this),
72855
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72856
+ dimColor: true,
72857
+ children: "\u2502"
72467
72858
  }, undefined, false, undefined, this),
72468
72859
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72469
72860
  dimColor: true,
72470
- children: " \xB7 "
72861
+ children: "elapsed"
72471
72862
  }, undefined, false, undefined, this),
72472
72863
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72473
- children: issueTitle
72864
+ color: "white",
72865
+ children: elapsed
72474
72866
  }, undefined, false, undefined, this),
72475
72867
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72476
72868
  dimColor: true,
72477
- children: " "
72869
+ children: "\u2502"
72478
72870
  }, undefined, false, undefined, this),
72479
72871
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72480
- color: mBadge.color,
72872
+ dimColor: true,
72873
+ children: "iter"
72874
+ }, undefined, false, undefined, this),
72875
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72876
+ color: "white",
72877
+ bold: true,
72878
+ children: iter
72879
+ }, undefined, false, undefined, this)
72880
+ ]
72881
+ }, undefined, true, undefined, this),
72882
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72883
+ gap: 3,
72884
+ marginTop: 0,
72885
+ children: [
72886
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72887
+ gap: 1,
72481
72888
  children: [
72482
- "[",
72483
- mBadge.text,
72484
- "]"
72889
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72890
+ dimColor: true,
72891
+ children: "\u2197 LINEAR"
72892
+ }, undefined, false, undefined, this),
72893
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72894
+ color: "blue",
72895
+ children: w.issueIdentifier
72896
+ }, undefined, false, undefined, this)
72485
72897
  ]
72486
72898
  }, undefined, true, undefined, this),
72487
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72488
- dimColor: true,
72899
+ prUrl && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72900
+ gap: 1,
72489
72901
  children: [
72490
- " ",
72491
- elapsed,
72492
- " \xB7 iter ",
72493
- iter
72902
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72903
+ dimColor: true,
72904
+ children: "\u2197 PR"
72905
+ }, undefined, false, undefined, this),
72906
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72907
+ color: "green",
72908
+ children: prLabel(prUrl)
72909
+ }, undefined, false, undefined, this)
72494
72910
  ]
72495
72911
  }, undefined, true, undefined, this)
72496
72912
  ]
72497
72913
  }, undefined, true, undefined, this),
72498
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72499
- dimColor: true,
72500
- children: [
72501
- " \u2197 ",
72502
- w.issue.url
72503
- ]
72504
- }, undefined, true, undefined, this),
72505
72914
  currentTask && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72915
+ gap: 1,
72916
+ marginTop: 0,
72506
72917
  children: [
72507
72918
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72508
- dimColor: true,
72509
- children: " \u25B6 "
72919
+ color: "yellow",
72920
+ bold: true,
72921
+ children: "\u25B6 TASK"
72510
72922
  }, undefined, false, undefined, this),
72511
72923
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72512
72924
  color: "white",
72513
- children: trunc(currentTask, 90)
72925
+ children: trunc(currentTask, termWidth - 14)
72514
72926
  }, undefined, false, undefined, this)
72515
72927
  ]
72516
72928
  }, undefined, true, undefined, this),
72517
72929
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72930
+ gap: 3,
72931
+ marginTop: 0,
72518
72932
  children: [
72519
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72520
- dimColor: true,
72521
- children: " phase: "
72522
- }, undefined, false, undefined, this),
72523
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72524
- color: pColor,
72933
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72934
+ gap: 1,
72525
72935
  children: [
72526
- phase,
72527
- phaseDetail
72936
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72937
+ dimColor: true,
72938
+ children: "PHASE"
72939
+ }, undefined, false, undefined, this),
72940
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72941
+ color: pColor,
72942
+ bold: true,
72943
+ children: [
72944
+ phase,
72945
+ phaseDetail ? ` (${phaseDetail})` : ""
72946
+ ]
72947
+ }, undefined, true, undefined, this),
72948
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72949
+ dimColor: true,
72950
+ children: phaseElapsed
72951
+ }, undefined, false, undefined, this)
72528
72952
  ]
72529
72953
  }, undefined, true, undefined, this),
72530
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72531
- dimColor: true,
72954
+ cmd && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72955
+ gap: 1,
72532
72956
  children: [
72533
- " \xB7 ",
72534
- phaseElapsed
72957
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72958
+ color: "yellow",
72959
+ children: "\u23F5 CMD"
72960
+ }, undefined, false, undefined, this),
72961
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72962
+ color: "yellow",
72963
+ children: fmtCmd(cmd.argv)
72964
+ }, undefined, false, undefined, this),
72965
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72966
+ dimColor: true,
72967
+ children: cmdElapsed
72968
+ }, undefined, false, undefined, this)
72969
+ ]
72970
+ }, undefined, true, undefined, this),
72971
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72972
+ gap: 1,
72973
+ children: [
72974
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72975
+ dimColor: true,
72976
+ children: "LOG"
72977
+ }, undefined, false, undefined, this),
72978
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72979
+ dimColor: true,
72980
+ children: trunc(meta?.logFile ?? "\u2013", 60)
72981
+ }, undefined, false, undefined, this)
72535
72982
  ]
72536
72983
  }, undefined, true, undefined, this)
72537
72984
  ]
72538
72985
  }, undefined, true, undefined, this),
72539
- prUrl && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72540
- dimColor: true,
72541
- children: [
72542
- " \u2197 pr: ",
72543
- prUrl
72544
- ]
72545
- }, undefined, true, undefined, this),
72546
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72547
- dimColor: true,
72548
- children: [
72549
- " log: ",
72550
- meta?.logFile ?? "\u2013"
72551
- ]
72552
- }, undefined, true, undefined, this),
72553
- cmd && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72554
- color: "yellow",
72555
- children: [
72556
- " \u23F5 ",
72557
- fmtCmd(cmd.argv),
72558
- " \xB7 ",
72559
- cmdElapsed
72560
- ]
72561
- }, undefined, true, undefined, this),
72562
- tail2.slice(-tailLines).map((line, i) => /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72563
- dimColor: true,
72986
+ tail2.length > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72987
+ flexDirection: "column",
72988
+ marginTop: 0,
72564
72989
  children: [
72565
- " \u2502 ",
72566
- line.length > 110 ? line.slice(0, 109) + "\u2026" : line
72990
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72991
+ dimColor: true,
72992
+ children: [
72993
+ "\u2500 OUTPUT ",
72994
+ "\u2500".repeat(Math.max(4, termWidth - 14))
72995
+ ]
72996
+ }, undefined, true, undefined, this),
72997
+ tail2.slice(-visibleTailLines).map((line, i) => /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72998
+ dimColor: true,
72999
+ children: [
73000
+ "\u2502 ",
73001
+ trunc(line, termWidth - 6)
73002
+ ]
73003
+ }, `${w.changeName}-tail-${i}`, true, undefined, this))
72567
73004
  ]
72568
- }, `${w.changeName}-tail-${i}`, true, undefined, this))
73005
+ }, undefined, true, undefined, this)
72569
73006
  ]
72570
73007
  }, w.changeName, true, undefined, this);
72571
73008
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neriros/ralphy",
3
- "version": "2.13.5",
3
+ "version": "2.13.7",
4
4
  "description": "An iterative AI task execution framework. Orchestrates multi-phase autonomous work using Claude or Codex engines.",
5
5
  "keywords": [
6
6
  "agent",