@neriros/ralphy 2.20.2 → 2.20.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -245,7 +245,7 @@ Both scripts log failures but never block the loop. **`appendPrompt`** (or `--pr
245
245
 
246
246
  ### Dashboard and logs
247
247
 
248
- The terminal dashboard shows three always-visible panels: **RALPH AGENT** (engine/model, concurrency, poll interval, active limits, feature flags, Linear filter), **POLL STATUS + WORKERS** (last-poll bucket breakdown — `found N │ todo · resume · conflict · review · mention` (each colored when non-zero) plus `↺ Ns` next-poll countdown, active/queued worker totals), and **TASKS tab bar** (numbered worker tabs — `Tab` / `← →` / `1-9` to switch).
248
+ The terminal dashboard shows three always-visible panels: **RALPH AGENT** (engine/model, concurrency, poll interval, active limits, feature flags, Linear filter), **POLL STATUS + WORKERS** (last-poll bucket breakdown — `todo · res · conf · rev · @` (each colored when non-zero) plus `↺ Ns` next-poll countdown, active/queued worker totals), and **TASKS tab bar** (numbered worker tabs — `Tab` / `← →` / `1-9` to switch).
249
249
 
250
250
  Each worker card shows: priority badge + identifier + title + mode badge, `↗ LINEAR`, `↗ PR`, `▶ TASK` (first unchecked task from `tasks.md`, refreshed every second), `PHASE` with color + elapsed time, `⏵ CMD` when a shell command is in flight, `LOG` path for `tail -f`, and `─ OUTPUT ─` with live stdout/stderr.
251
251
 
package/dist/cli/index.js CHANGED
@@ -35029,8 +35029,8 @@ import { readFileSync as readFileSync2 } from "fs";
35029
35029
  import { resolve } from "path";
35030
35030
  function getVersion() {
35031
35031
  try {
35032
- if ("2.20.2")
35033
- return "2.20.2";
35032
+ if ("2.20.4")
35033
+ return "2.20.4";
35034
35034
  } catch {}
35035
35035
  const dirsToTry = [];
35036
35036
  try {
@@ -61310,24 +61310,7 @@ function buildAgentCoordinator(input) {
61310
61310
  teamId = fetched;
61311
61311
  teamIdCache.set(t, teamId);
61312
61312
  }
61313
- const colonIdx = name.indexOf(":");
61314
- let parentId;
61315
- let childName = name;
61316
- if (colonIdx > 0) {
61317
- const groupName = name.slice(0, colonIdx);
61318
- childName = name.slice(colonIdx + 1);
61319
- const existingGroup = map2.get(groupName.toLowerCase());
61320
- if (existingGroup) {
61321
- parentId = existingGroup;
61322
- } else {
61323
- const groupId = await createIssueLabel(apiKey, teamId, groupName);
61324
- if (groupId) {
61325
- map2.set(groupName.toLowerCase(), groupId);
61326
- parentId = groupId;
61327
- }
61328
- }
61329
- }
61330
- const newId = await createIssueLabel(apiKey, teamId, childName, parentId);
61313
+ const newId = await createIssueLabel(apiKey, teamId, name);
61331
61314
  if (!newId)
61332
61315
  return null;
61333
61316
  map2.set(name.toLowerCase(), newId);
@@ -62296,13 +62279,46 @@ async function runAgentJson({
62296
62279
  };
62297
62280
  tick();
62298
62281
  await new Promise((resolve2) => {
62282
+ let shuttingDown = false;
62299
62283
  const onSig = () => {
62284
+ if (shuttingDown) {
62285
+ process.exit(130);
62286
+ }
62287
+ shuttingDown = true;
62300
62288
  cancelled = true;
62301
62289
  emit({ type: "stopped" });
62302
62290
  coord.stop();
62303
62291
  if (pollTimer)
62304
62292
  clearTimeout(pollTimer);
62305
- resolve2();
62293
+ const start = Date.now();
62294
+ let warned = false;
62295
+ const wait = setInterval(() => {
62296
+ const active = coord.activeCount;
62297
+ const elapsed = Date.now() - start;
62298
+ if (active === 0) {
62299
+ clearInterval(wait);
62300
+ resolve2();
62301
+ return;
62302
+ }
62303
+ if (!warned && elapsed >= 5000) {
62304
+ warned = true;
62305
+ emit({
62306
+ type: "log",
62307
+ text: `! ${active} worker(s) still running after 5s \u2014 forcing exit at 10s`,
62308
+ level: "warn"
62309
+ });
62310
+ }
62311
+ if (elapsed >= 1e4) {
62312
+ clearInterval(wait);
62313
+ emit({
62314
+ type: "log",
62315
+ text: `! ${active} worker(s) did not exit within 10s \u2014 forcing process exit`,
62316
+ level: "warn"
62317
+ });
62318
+ resolve2();
62319
+ setTimeout(() => process.exit(1), 50);
62320
+ }
62321
+ }, 100);
62306
62322
  };
62307
62323
  process.once("SIGINT", onSig);
62308
62324
  process.once("SIGTERM", onSig);
@@ -73383,13 +73399,38 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73383
73399
  tick();
73384
73400
  }
73385
73401
  init2();
73402
+ let shuttingDown = false;
73386
73403
  const onSig = () => {
73404
+ if (shuttingDown) {
73405
+ process.exit(130);
73406
+ }
73407
+ shuttingDown = true;
73387
73408
  cancelled = true;
73388
73409
  appendLog("stopping agent \u2014 sending SIGTERM to workers", "yellow");
73389
73410
  coordRef.current?.stop();
73390
73411
  if (pollTimer)
73391
73412
  clearTimeout(pollTimer);
73392
- exit();
73413
+ const start = Date.now();
73414
+ let warned = false;
73415
+ const waitForWorkers = setInterval(() => {
73416
+ const active = coordRef.current?.activeCount ?? 0;
73417
+ const elapsed = Date.now() - start;
73418
+ if (active === 0) {
73419
+ clearInterval(waitForWorkers);
73420
+ exit();
73421
+ setTimeout(() => process.exit(0), 200);
73422
+ return;
73423
+ }
73424
+ if (!warned && elapsed >= 5000) {
73425
+ warned = true;
73426
+ appendLog(`! ${active} worker${active === 1 ? "" : "s"} still running after 5s \u2014 forcing exit at 10s (press Ctrl-C again to exit now)`, "red");
73427
+ }
73428
+ if (elapsed >= 1e4) {
73429
+ clearInterval(waitForWorkers);
73430
+ appendLog(`! ${active} worker${active === 1 ? "" : "s"} did not exit within 10s \u2014 forcing process exit`, "red");
73431
+ setTimeout(() => process.exit(1), 50);
73432
+ }
73433
+ }, 100);
73393
73434
  };
73394
73435
  process.on("SIGINT", onSig);
73395
73436
  process.on("SIGTERM", onSig);
@@ -73603,7 +73644,7 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73603
73644
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
73604
73645
  label: "POLL STATUS",
73605
73646
  borderColor: "gray",
73606
- width: termWidth - 30,
73647
+ width: termWidth - 13,
73607
73648
  paddingX: 1,
73608
73649
  flexDirection: "column",
73609
73650
  children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
@@ -73618,18 +73659,6 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73618
73659
  }, undefined, false, undefined, this),
73619
73660
  pollStatus.lastAt !== null && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
73620
73661
  children: [
73621
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73622
- dimColor: true,
73623
- children: "\u2502"
73624
- }, undefined, false, undefined, this),
73625
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73626
- dimColor: true,
73627
- children: "found"
73628
- }, undefined, false, undefined, this),
73629
- /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73630
- color: "white",
73631
- children: pollStatus.lastFound
73632
- }, undefined, false, undefined, this),
73633
73662
  pollStatus.lastBuckets && /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(jsx_dev_runtime9.Fragment, {
73634
73663
  children: [
73635
73664
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
@@ -73650,7 +73679,7 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73650
73679
  }, undefined, false, undefined, this),
73651
73680
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73652
73681
  dimColor: true,
73653
- children: "resume"
73682
+ children: "res"
73654
73683
  }, undefined, false, undefined, this),
73655
73684
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73656
73685
  color: pollStatus.lastBuckets.inProgress > 0 ? "cyan" : "white",
@@ -73662,7 +73691,7 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73662
73691
  }, undefined, false, undefined, this),
73663
73692
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73664
73693
  dimColor: true,
73665
- children: "conflict"
73694
+ children: "conf"
73666
73695
  }, undefined, false, undefined, this),
73667
73696
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73668
73697
  color: pollStatus.lastBuckets.conflicted > 0 ? "red" : "white",
@@ -73674,7 +73703,7 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73674
73703
  }, undefined, false, undefined, this),
73675
73704
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73676
73705
  dimColor: true,
73677
- children: "review"
73706
+ children: "rev"
73678
73707
  }, undefined, false, undefined, this),
73679
73708
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73680
73709
  color: pollStatus.lastBuckets.review > 0 ? "yellow" : "white",
@@ -73686,7 +73715,7 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73686
73715
  }, undefined, false, undefined, this),
73687
73716
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73688
73717
  dimColor: true,
73689
- children: "mention"
73718
+ children: "@"
73690
73719
  }, undefined, false, undefined, this),
73691
73720
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73692
73721
  color: pollStatus.lastBuckets.mentions > 0 ? "magenta" : "white",
@@ -73721,18 +73750,18 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73721
73750
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(LabeledBox, {
73722
73751
  label: "WORKERS",
73723
73752
  borderColor: "gray",
73724
- width: 29,
73753
+ width: 12,
73725
73754
  paddingX: 1,
73726
73755
  flexDirection: "column",
73727
73756
  children: /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73728
- gap: 3,
73757
+ gap: 2,
73729
73758
  children: [
73730
73759
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Box_default, {
73731
73760
  gap: 1,
73732
73761
  children: [
73733
73762
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73734
73763
  dimColor: true,
73735
- children: "active"
73764
+ children: "A"
73736
73765
  }, undefined, false, undefined, this),
73737
73766
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73738
73767
  color: activeCount > 0 ? "cyan" : "gray",
@@ -73746,7 +73775,7 @@ function AgentMode({ args, projectRoot, statesDir, tasksDir }) {
73746
73775
  children: [
73747
73776
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73748
73777
  dimColor: true,
73749
- children: "queued"
73778
+ children: "Q"
73750
73779
  }, undefined, false, undefined, this),
73751
73780
  /* @__PURE__ */ jsx_dev_runtime9.jsxDEV(Text, {
73752
73781
  color: coord?.queuedCount ?? 0 > 0 ? "yellow" : "gray",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neriros/ralphy",
3
- "version": "2.20.2",
3
+ "version": "2.20.4",
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",