@neriros/ralphy 2.14.0 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli/index.js +310 -318
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -56418,8 +56418,8 @@ import { readFileSync as readFileSync2 } from "fs";
56418
56418
  import { resolve } from "path";
56419
56419
  function getVersion() {
56420
56420
  try {
56421
- if ("2.14.0")
56422
- return "2.14.0";
56421
+ if ("2.15.0")
56422
+ return "2.15.0";
56423
56423
  } catch {}
56424
56424
  const dirsToTry = [];
56425
56425
  try {
@@ -70117,7 +70117,7 @@ function TaskLoop({ opts }) {
70117
70117
 
70118
70118
  // apps/cli/src/components/AgentMode.tsx
70119
70119
  var import_react57 = __toESM(require_react(), 1);
70120
- import { join as join16, relative, dirname as dirname4 } from "path";
70120
+ import { join as join16, dirname as dirname4 } from "path";
70121
70121
  import { homedir as homedir3 } from "os";
70122
70122
  import { appendFile, mkdir as mkdir4 } from "fs/promises";
70123
70123
 
@@ -72314,6 +72314,52 @@ function prLabel(prUrl) {
72314
72314
  return m ? `#${m[1]}` : "PR";
72315
72315
  }
72316
72316
  var HYPERLINKS_SUPPORTED = !process.env["TMUX"];
72317
+ function LabeledBox({
72318
+ label,
72319
+ labelNode,
72320
+ labelVisualWidth,
72321
+ borderColor = "gray",
72322
+ width,
72323
+ children,
72324
+ ...rest2
72325
+ }) {
72326
+ const innerWidth = Math.max(0, width - 2);
72327
+ const visualLen = labelVisualWidth ?? (label ? label.length + 2 : 0);
72328
+ const dashes = Math.max(0, innerWidth - visualLen);
72329
+ const left = Math.floor(dashes / 2);
72330
+ const right = dashes - left;
72331
+ return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72332
+ flexDirection: "column",
72333
+ width,
72334
+ children: [
72335
+ labelNode ? /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72336
+ flexDirection: "row",
72337
+ children: [
72338
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72339
+ color: borderColor,
72340
+ children: `\u256D${"\u2500".repeat(left)}`
72341
+ }, undefined, false, undefined, this),
72342
+ labelNode,
72343
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72344
+ color: borderColor,
72345
+ children: `${"\u2500".repeat(right)}\u256E`
72346
+ }, undefined, false, undefined, this)
72347
+ ]
72348
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72349
+ color: borderColor,
72350
+ children: `\u256D${"\u2500".repeat(left)} ${label ?? ""} ${"\u2500".repeat(right)}\u256E`
72351
+ }, undefined, false, undefined, this),
72352
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72353
+ borderStyle: "round",
72354
+ borderTop: false,
72355
+ borderColor,
72356
+ width,
72357
+ ...rest2,
72358
+ children
72359
+ }, undefined, false, undefined, this)
72360
+ ]
72361
+ }, undefined, true, undefined, this);
72362
+ }
72317
72363
  function Link({ url, label, color }) {
72318
72364
  if (!HYPERLINKS_SUPPORTED)
72319
72365
  return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
@@ -72364,7 +72410,7 @@ function modeBadge(mode) {
72364
72410
  case "fresh":
72365
72411
  return { text: "NEW", color: "cyan" };
72366
72412
  case "resume":
72367
- return { text: "RESUME", color: "yellow" };
72413
+ return { text: "RES", color: "yellow" };
72368
72414
  case "conflict-fix":
72369
72415
  return { text: "FIX", color: "magenta" };
72370
72416
  default:
@@ -72653,36 +72699,32 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72653
72699
  return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72654
72700
  flexDirection: "column",
72655
72701
  children: [
72656
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Static, {
72657
- items: logs,
72658
- children: (line) => line.color ? /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72702
+ logs.length > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
72703
+ label: "LOGS",
72704
+ borderColor: "gray",
72705
+ flexDirection: "column",
72706
+ paddingX: 1,
72707
+ width: termWidth,
72708
+ children: logs.slice(-5).map((line) => line.color ? /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72659
72709
  color: line.color,
72660
72710
  children: line.text
72661
72711
  }, line.id, false, undefined, this) : /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72662
72712
  children: line.text
72663
- }, line.id, false, undefined, this)
72713
+ }, line.id, false, undefined, this))
72664
72714
  }, undefined, false, undefined, this),
72665
72715
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72666
72716
  flexDirection: "column",
72667
- marginTop: 1,
72717
+ marginTop: 0,
72668
72718
  children: [
72669
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72670
- borderStyle: "round",
72719
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
72720
+ label: "\u25C8 RALPH AGENT",
72671
72721
  borderColor: "blue",
72672
- flexDirection: "column",
72673
- paddingX: 1,
72674
72722
  width: termWidth,
72723
+ paddingX: 1,
72724
+ flexDirection: "column",
72675
72725
  children: [
72676
72726
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72677
72727
  children: [
72678
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72679
- bold: true,
72680
- color: "cyan",
72681
- children: [
72682
- "\u25C8 RALPH AGENT",
72683
- " "
72684
- ]
72685
- }, undefined, true, undefined, this),
72686
72728
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72687
72729
  dimColor: true,
72688
72730
  children: [
@@ -72782,206 +72824,176 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72782
72824
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72783
72825
  flexDirection: "row",
72784
72826
  gap: 1,
72785
- marginTop: 1,
72827
+ marginTop: 0,
72786
72828
  width: termWidth,
72787
72829
  children: [
72788
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72789
- borderStyle: "round",
72830
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
72831
+ label: "POLL STATUS",
72790
72832
  borderColor: "gray",
72791
- flexDirection: "column",
72833
+ width: termWidth - 30,
72792
72834
  paddingX: 1,
72793
- flexGrow: 1,
72794
- children: [
72795
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72796
- dimColor: true,
72797
- bold: true,
72798
- children: "POLL STATUS"
72799
- }, undefined, false, undefined, this),
72800
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72801
- gap: 2,
72802
- marginTop: 0,
72803
- children: [
72804
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72805
- color: "gray",
72806
- children: spinnerFrame
72807
- }, undefined, false, undefined, this),
72808
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72809
- children: pollStatus.state === "polling" ? "Polling Linear\u2026" : pollStatus.lastAt !== null ? "Idle" : "Starting\u2026"
72810
- }, undefined, false, undefined, this),
72811
- pollStatus.lastAt !== null && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
72812
- children: [
72813
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72814
- dimColor: true,
72815
- children: "\u2502"
72816
- }, undefined, false, undefined, this),
72817
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72818
- dimColor: true,
72819
- children: "found"
72820
- }, undefined, false, undefined, this),
72821
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72822
- color: "white",
72823
- children: pollStatus.lastFound
72824
- }, undefined, false, undefined, this),
72825
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72826
- dimColor: true,
72827
- children: "\u2502"
72828
- }, undefined, false, undefined, this),
72829
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72830
- dimColor: true,
72831
- children: "new"
72832
- }, undefined, false, undefined, this),
72833
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72834
- color: pollStatus.lastAdded > 0 ? "green" : "white",
72835
- children: pollStatus.lastAdded
72836
- }, undefined, false, undefined, this),
72837
- secsToNextPoll !== null && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
72838
- children: [
72839
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72840
- dimColor: true,
72841
- children: "\u2502"
72842
- }, undefined, false, undefined, this),
72843
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72844
- dimColor: true,
72845
- children: "next in"
72846
- }, undefined, false, undefined, this),
72847
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72848
- color: "gray",
72849
- children: [
72850
- secsToNextPoll,
72851
- "s"
72852
- ]
72853
- }, undefined, true, undefined, this)
72854
- ]
72855
- }, undefined, true, undefined, this)
72856
- ]
72857
- }, undefined, true, undefined, this)
72858
- ]
72859
- }, undefined, true, undefined, this)
72860
- ]
72861
- }, undefined, true, undefined, this),
72862
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72863
- borderStyle: "round",
72864
- borderColor: "gray",
72865
72835
  flexDirection: "column",
72836
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72837
+ gap: 2,
72838
+ children: [
72839
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72840
+ color: "gray",
72841
+ children: spinnerFrame
72842
+ }, undefined, false, undefined, this),
72843
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72844
+ children: pollStatus.state === "polling" ? "Polling Linear\u2026" : pollStatus.lastAt !== null ? "Idle" : "Starting\u2026"
72845
+ }, undefined, false, undefined, this),
72846
+ pollStatus.lastAt !== null && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
72847
+ children: [
72848
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72849
+ dimColor: true,
72850
+ children: "\u2502"
72851
+ }, undefined, false, undefined, this),
72852
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72853
+ dimColor: true,
72854
+ children: "found"
72855
+ }, undefined, false, undefined, this),
72856
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72857
+ color: "white",
72858
+ children: pollStatus.lastFound
72859
+ }, undefined, false, undefined, this),
72860
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72861
+ dimColor: true,
72862
+ children: "\u2502"
72863
+ }, undefined, false, undefined, this),
72864
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72865
+ dimColor: true,
72866
+ children: "new"
72867
+ }, undefined, false, undefined, this),
72868
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72869
+ color: pollStatus.lastAdded > 0 ? "green" : "white",
72870
+ children: pollStatus.lastAdded
72871
+ }, undefined, false, undefined, this),
72872
+ secsToNextPoll !== null && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
72873
+ children: [
72874
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72875
+ dimColor: true,
72876
+ children: "\u2502"
72877
+ }, undefined, false, undefined, this),
72878
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72879
+ dimColor: true,
72880
+ children: "next in"
72881
+ }, undefined, false, undefined, this),
72882
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72883
+ color: "gray",
72884
+ children: [
72885
+ secsToNextPoll,
72886
+ "s"
72887
+ ]
72888
+ }, undefined, true, undefined, this)
72889
+ ]
72890
+ }, undefined, true, undefined, this)
72891
+ ]
72892
+ }, undefined, true, undefined, this)
72893
+ ]
72894
+ }, undefined, true, undefined, this)
72895
+ }, undefined, false, undefined, this),
72896
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
72897
+ label: "WORKERS",
72898
+ borderColor: "gray",
72899
+ width: 29,
72866
72900
  paddingX: 1,
72867
- minWidth: 28,
72868
- children: [
72869
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72870
- dimColor: true,
72871
- bold: true,
72872
- children: "WORKERS"
72873
- }, undefined, false, undefined, this),
72874
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72875
- gap: 3,
72876
- marginTop: 0,
72877
- children: [
72878
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72879
- gap: 1,
72880
- children: [
72881
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72882
- dimColor: true,
72883
- children: "active"
72884
- }, undefined, false, undefined, this),
72885
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72886
- color: activeCount > 0 ? "cyan" : "gray",
72887
- bold: true,
72888
- children: activeCount
72889
- }, undefined, false, undefined, this)
72890
- ]
72891
- }, undefined, true, undefined, this),
72892
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72893
- gap: 1,
72894
- children: [
72895
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72896
- dimColor: true,
72897
- children: "queued"
72898
- }, undefined, false, undefined, this),
72899
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72900
- color: coord?.queuedCount ?? 0 > 0 ? "yellow" : "gray",
72901
- bold: true,
72902
- children: coord?.queuedCount ?? 0
72903
- }, undefined, false, undefined, this)
72904
- ]
72905
- }, undefined, true, undefined, this)
72906
- ]
72907
- }, undefined, true, undefined, this)
72908
- ]
72909
- }, undefined, true, undefined, this)
72901
+ flexDirection: "column",
72902
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72903
+ gap: 3,
72904
+ children: [
72905
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72906
+ gap: 1,
72907
+ children: [
72908
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72909
+ dimColor: true,
72910
+ children: "active"
72911
+ }, undefined, false, undefined, this),
72912
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72913
+ color: activeCount > 0 ? "cyan" : "gray",
72914
+ bold: true,
72915
+ children: activeCount
72916
+ }, undefined, false, undefined, this)
72917
+ ]
72918
+ }, undefined, true, undefined, this),
72919
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72920
+ gap: 1,
72921
+ children: [
72922
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72923
+ dimColor: true,
72924
+ children: "queued"
72925
+ }, undefined, false, undefined, this),
72926
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72927
+ color: coord?.queuedCount ?? 0 > 0 ? "yellow" : "gray",
72928
+ bold: true,
72929
+ children: coord?.queuedCount ?? 0
72930
+ }, undefined, false, undefined, this)
72931
+ ]
72932
+ }, undefined, true, undefined, this)
72933
+ ]
72934
+ }, undefined, true, undefined, this)
72935
+ }, undefined, false, undefined, this)
72910
72936
  ]
72911
72937
  }, undefined, true, undefined, this),
72912
- activeCount > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72913
- borderStyle: "round",
72938
+ activeCount > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
72939
+ label: `TASKS${activeCount > 1 ? " Tab/\u2190 \u2192 \xB7 1-9" : ""}`,
72914
72940
  borderColor: "gray",
72915
- flexDirection: "column",
72916
- paddingX: 1,
72917
- marginTop: 1,
72918
72941
  width: termWidth,
72919
- children: [
72920
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72921
- gap: 1,
72922
- children: [
72923
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72924
- dimColor: true,
72925
- bold: true,
72926
- children: "TASKS"
72927
- }, undefined, false, undefined, this),
72928
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72929
- dimColor: true,
72930
- children: activeCount > 1 ? " Tab/\u2190 \u2192 to switch \xB7 1-9 jump" : ""
72931
- }, undefined, false, undefined, this)
72932
- ]
72933
- }, undefined, true, undefined, this),
72934
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72935
- gap: 3,
72936
- flexWrap: "wrap",
72937
- children: coord?.activeWorkers.map((w, idx) => {
72938
- const meta = workerMetaRef.current.get(w.changeName);
72939
- const phase = meta?.phase ?? "working";
72940
- const pBadge = priorityBadge(w.issue.priority);
72941
- const isFocused = idx === safeFocusedIdx;
72942
- return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72943
- gap: 1,
72944
- children: [
72945
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72946
- color: isFocused ? "white" : "gray",
72947
- bold: isFocused,
72948
- children: [
72949
- "[",
72950
- idx + 1,
72951
- "]"
72952
- ]
72953
- }, undefined, true, undefined, this),
72954
- pBadge.label && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72955
- color: pBadge.color,
72956
- children: pBadge.text
72957
- }, undefined, false, undefined, this),
72958
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72959
- color: isFocused ? "cyan" : "gray",
72960
- bold: isFocused,
72961
- children: w.issueIdentifier
72962
- }, undefined, false, undefined, this),
72963
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72964
- color: phaseColor(phase),
72965
- dimColor: !isFocused,
72966
- children: phase
72967
- }, undefined, false, undefined, this),
72968
- isFocused && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72969
- color: "white",
72970
- children: "\u25C0"
72971
- }, undefined, false, undefined, this)
72972
- ]
72973
- }, w.changeName, true, undefined, this);
72974
- })
72975
- }, undefined, false, undefined, this)
72976
- ]
72977
- }, undefined, true, undefined, this),
72942
+ paddingX: 1,
72943
+ flexDirection: "column",
72944
+ children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72945
+ gap: 3,
72946
+ flexWrap: "wrap",
72947
+ children: coord?.activeWorkers.map((w, idx) => {
72948
+ const meta = workerMetaRef.current.get(w.changeName);
72949
+ const phase = meta?.phase ?? "working";
72950
+ const pBadge = priorityBadge(w.issue.priority);
72951
+ const isFocused = idx === safeFocusedIdx;
72952
+ return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72953
+ gap: 1,
72954
+ children: [
72955
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72956
+ color: isFocused ? "white" : "gray",
72957
+ bold: isFocused,
72958
+ children: [
72959
+ "[",
72960
+ idx + 1,
72961
+ "]"
72962
+ ]
72963
+ }, undefined, true, undefined, this),
72964
+ pBadge.label && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72965
+ color: pBadge.color,
72966
+ children: [
72967
+ pBadge.text,
72968
+ " ",
72969
+ pBadge.label
72970
+ ]
72971
+ }, undefined, true, undefined, this),
72972
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
72973
+ url: w.issue.url,
72974
+ label: w.issueIdentifier,
72975
+ color: isFocused ? "cyan" : "gray"
72976
+ }, undefined, false, undefined, this),
72977
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72978
+ color: phaseColor(phase),
72979
+ dimColor: !isFocused,
72980
+ children: phase
72981
+ }, undefined, false, undefined, this),
72982
+ isFocused && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
72983
+ color: "white",
72984
+ children: "\u25C0"
72985
+ }, undefined, false, undefined, this)
72986
+ ]
72987
+ }, w.changeName, true, undefined, this);
72988
+ })
72989
+ }, undefined, false, undefined, this)
72990
+ }, undefined, false, undefined, this),
72978
72991
  coord?.activeWorkers.map((w, idx) => {
72979
72992
  const isFocused = idx === safeFocusedIdx;
72980
72993
  const meta = workerMetaRef.current.get(w.changeName);
72981
72994
  const elapsed = meta ? fmtElapsed(now2 - meta.startedAt) : "\u2013";
72982
72995
  const iter = meta?.iter ?? 0;
72983
72996
  const phase = meta?.phase ?? "working";
72984
- const phaseElapsed = meta ? fmtElapsed(now2 - meta.phaseStartedAt) : "\u2013";
72985
72997
  const phaseDetail = meta?.phaseDetail ?? "";
72986
72998
  const cmd = meta?.currentCmd;
72987
72999
  const cmdElapsed = cmd ? fmtElapsed(now2 - cmd.startedAt) : null;
@@ -72994,11 +73006,38 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
72994
73006
  const bColor = isFocused ? workerBorderColor(phase) : "gray";
72995
73007
  const visibleTailLines = isFocused ? focusedTailLines : compactTailLines;
72996
73008
  if (!isFocused && activeCount > 1) {
72997
- return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
72998
- borderStyle: "round",
73009
+ const cardLabelWidth2 = (prUrl ? prLabel(prUrl).length + 3 : 0) + w.issueIdentifier.length + 2;
73010
+ const cardLabelNode2 = /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
73011
+ children: [
73012
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73013
+ color: "gray",
73014
+ children: " "
73015
+ }, undefined, false, undefined, this),
73016
+ prUrl && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
73017
+ url: prUrl,
73018
+ label: prLabel(prUrl),
73019
+ color: "green"
73020
+ }, undefined, false, undefined, this),
73021
+ prUrl && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73022
+ color: "gray",
73023
+ children: " \xB7 "
73024
+ }, undefined, false, undefined, this),
73025
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
73026
+ url: w.issue.url,
73027
+ label: w.issueIdentifier,
73028
+ color: "cyan"
73029
+ }, undefined, false, undefined, this),
73030
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73031
+ color: "gray",
73032
+ children: " "
73033
+ }, undefined, false, undefined, this)
73034
+ ]
73035
+ }, undefined, true, undefined, this);
73036
+ return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
73037
+ labelNode: cardLabelNode2,
73038
+ labelVisualWidth: cardLabelWidth2,
72999
73039
  borderColor: "gray",
73000
73040
  paddingX: 1,
73001
- marginTop: 1,
73002
73041
  gap: 2,
73003
73042
  width: termWidth,
73004
73043
  children: [
@@ -73069,12 +73108,39 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73069
73108
  ]
73070
73109
  }, w.changeName, true, undefined, this);
73071
73110
  }
73072
- return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73073
- borderStyle: "round",
73111
+ const cardLabelWidth = (prUrl ? prLabel(prUrl).length + 3 : 0) + w.issueIdentifier.length + 2;
73112
+ const cardLabelNode = /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
73113
+ children: [
73114
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73115
+ color: bColor,
73116
+ children: " "
73117
+ }, undefined, false, undefined, this),
73118
+ prUrl && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
73119
+ url: prUrl,
73120
+ label: prLabel(prUrl),
73121
+ color: "green"
73122
+ }, undefined, false, undefined, this),
73123
+ prUrl && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73124
+ color: bColor,
73125
+ children: " \xB7 "
73126
+ }, undefined, false, undefined, this),
73127
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
73128
+ url: w.issue.url,
73129
+ label: w.issueIdentifier,
73130
+ color: "cyan"
73131
+ }, undefined, false, undefined, this),
73132
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73133
+ color: bColor,
73134
+ children: " "
73135
+ }, undefined, false, undefined, this)
73136
+ ]
73137
+ }, undefined, true, undefined, this);
73138
+ return /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
73139
+ labelNode: cardLabelNode,
73140
+ labelVisualWidth: cardLabelWidth,
73074
73141
  borderColor: bColor,
73075
73142
  flexDirection: "column",
73076
73143
  paddingX: 1,
73077
- marginTop: 1,
73078
73144
  width: termWidth,
73079
73145
  children: [
73080
73146
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
@@ -73083,23 +73149,10 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73083
73149
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73084
73150
  children: spinnerFrame
73085
73151
  }, undefined, false, undefined, this),
73086
- pBadge.label && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73087
- color: pBadge.color,
73088
- children: [
73089
- pBadge.text,
73090
- " ",
73091
- pBadge.label
73092
- ]
73093
- }, undefined, true, undefined, this),
73094
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73095
- color: "cyan",
73096
- bold: true,
73097
- children: w.issueIdentifier
73098
- }, undefined, false, undefined, this),
73099
73152
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73100
73153
  color: "white",
73101
73154
  bold: true,
73102
- children: trunc(w.issue.title, Math.max(30, termWidth - 60))
73155
+ children: trunc(w.issue.title, Math.max(20, termWidth - 55))
73103
73156
  }, undefined, false, undefined, this),
73104
73157
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73105
73158
  color: mBadge.color,
@@ -73111,12 +73164,16 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73111
73164
  ]
73112
73165
  }, undefined, true, undefined, this),
73113
73166
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73114
- dimColor: true,
73115
- children: "\u2502"
73116
- }, undefined, false, undefined, this),
73167
+ color: pColor,
73168
+ bold: true,
73169
+ children: [
73170
+ phase,
73171
+ phaseDetail ? ` (${phaseDetail})` : ""
73172
+ ]
73173
+ }, undefined, true, undefined, this),
73117
73174
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73118
73175
  dimColor: true,
73119
- children: "elapsed"
73176
+ children: "\u2502"
73120
73177
  }, undefined, false, undefined, this),
73121
73178
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73122
73179
  color: "white",
@@ -73128,49 +73185,24 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73128
73185
  }, undefined, false, undefined, this),
73129
73186
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73130
73187
  dimColor: true,
73131
- children: "iter"
73188
+ children: "\u21BA"
73132
73189
  }, undefined, false, undefined, this),
73133
73190
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73134
73191
  color: "white",
73135
73192
  bold: true,
73136
73193
  children: iter
73194
+ }, undefined, false, undefined, this),
73195
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73196
+ dimColor: true,
73197
+ children: "\u2502"
73198
+ }, undefined, false, undefined, this),
73199
+ meta?.logFile && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
73200
+ url: `file://${meta.logFile}`,
73201
+ label: "LOG",
73202
+ color: "gray"
73137
73203
  }, undefined, false, undefined, this)
73138
73204
  ]
73139
73205
  }, undefined, true, undefined, this),
73140
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73141
- gap: 3,
73142
- marginTop: 0,
73143
- children: [
73144
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73145
- gap: 1,
73146
- children: [
73147
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73148
- dimColor: true,
73149
- children: "\u2197 LINEAR"
73150
- }, undefined, false, undefined, this),
73151
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
73152
- url: w.issue.url,
73153
- label: w.issueIdentifier,
73154
- color: "blue"
73155
- }, undefined, false, undefined, this)
73156
- ]
73157
- }, undefined, true, undefined, this),
73158
- prUrl && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73159
- gap: 1,
73160
- children: [
73161
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73162
- dimColor: true,
73163
- children: "\u2197 PR"
73164
- }, undefined, false, undefined, this),
73165
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Link, {
73166
- url: prUrl,
73167
- label: prLabel(prUrl),
73168
- color: "green"
73169
- }, undefined, false, undefined, this)
73170
- ]
73171
- }, undefined, true, undefined, this)
73172
- ]
73173
- }, undefined, true, undefined, this),
73174
73206
  currentTask && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73175
73207
  gap: 1,
73176
73208
  marginTop: 0,
@@ -73186,62 +73218,22 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73186
73218
  }, undefined, false, undefined, this)
73187
73219
  ]
73188
73220
  }, undefined, true, undefined, this),
73189
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73190
- gap: 3,
73221
+ cmd && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73222
+ gap: 1,
73191
73223
  marginTop: 0,
73192
- flexWrap: "wrap",
73193
73224
  children: [
73194
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73195
- gap: 1,
73196
- children: [
73197
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73198
- dimColor: true,
73199
- children: "PHASE"
73200
- }, undefined, false, undefined, this),
73201
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73202
- color: pColor,
73203
- bold: true,
73204
- children: [
73205
- phase,
73206
- phaseDetail ? ` (${phaseDetail})` : ""
73207
- ]
73208
- }, undefined, true, undefined, this),
73209
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73210
- dimColor: true,
73211
- children: phaseElapsed
73212
- }, undefined, false, undefined, this)
73213
- ]
73214
- }, undefined, true, undefined, this),
73215
- cmd && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73216
- gap: 1,
73217
- children: [
73218
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73219
- color: "yellow",
73220
- children: "\u23F5 CMD"
73221
- }, undefined, false, undefined, this),
73222
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73223
- color: "yellow",
73224
- children: fmtCmd(cmd.argv)
73225
- }, undefined, false, undefined, this),
73226
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73227
- dimColor: true,
73228
- children: cmdElapsed
73229
- }, undefined, false, undefined, this)
73230
- ]
73231
- }, undefined, true, undefined, this),
73232
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73233
- gap: 1,
73234
- children: [
73235
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73236
- dimColor: true,
73237
- children: "LOG"
73238
- }, undefined, false, undefined, this),
73239
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73240
- dimColor: true,
73241
- children: trunc(meta?.logFile ? relative(process.cwd(), meta.logFile) : "\u2013", 40)
73242
- }, undefined, false, undefined, this)
73243
- ]
73244
- }, undefined, true, undefined, this)
73225
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73226
+ color: "yellow",
73227
+ children: "\u23F5 CMD"
73228
+ }, undefined, false, undefined, this),
73229
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73230
+ color: "yellow",
73231
+ children: fmtCmd(cmd.argv)
73232
+ }, undefined, false, undefined, this),
73233
+ /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73234
+ dimColor: true,
73235
+ children: cmdElapsed
73236
+ }, undefined, false, undefined, this)
73245
73237
  ]
73246
73238
  }, undefined, true, undefined, this),
73247
73239
  tail2.length > 0 && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neriros/ralphy",
3
- "version": "2.14.0",
3
+ "version": "2.15.0",
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",