agent-yes 1.128.0 → 1.129.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.
@@ -0,0 +1,8 @@
1
+ import "./ts-D21pYxoi.js";
2
+ import "./logger-B9h0djqx.js";
3
+ import "./versionChecker-VKD48fzV.js";
4
+ import "./pidStore-CGKIhaJO.js";
5
+ import "./globalPidIndex-C7r2m6s7.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-CRiTrZVs.js";
7
+
8
+ export { SUPPORTED_CLIS };
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-blmSvxN5.js";
1
+ import { t as CLIS_CONFIG } from "./ts-D21pYxoi.js";
2
2
 
3
3
  //#region ts/SUPPORTED_CLIS.ts
4
4
  const SUPPORTED_CLIS = Object.keys(CLIS_CONFIG);
5
5
 
6
6
  //#endregion
7
7
  export { SUPPORTED_CLIS as t };
8
- //# sourceMappingURL=SUPPORTED_CLIS-C3hbWNlY.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-CRiTrZVs.js.map
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  import { n as logger } from "./logger-B9h0djqx.js";
3
- import { i as versionString, n as displayVersion, r as getInstalledPackage, t as checkAndAutoUpdate } from "./versionChecker-BmttWH-a.js";
3
+ import { i as versionString, n as displayVersion, r as getInstalledPackage, t as checkAndAutoUpdate } from "./versionChecker-VKD48fzV.js";
4
4
  import { argv } from "process";
5
5
  import { execFileSync, spawn } from "child_process";
6
6
  import ms from "ms";
@@ -482,7 +482,7 @@ function buildRustArgs(argv, cliFromScript, supportedClis) {
482
482
  {
483
483
  const rawArg = process.argv[2];
484
484
  const isHelpFlag = rawArg === "-h" || rawArg === "--help";
485
- const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-DA0MhdpJ.js");
485
+ const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-BLUX23IJ.js");
486
486
  if (isHelpFlag && process.argv.length === 3) {
487
487
  cmdHelp();
488
488
  process.exit(0);
@@ -515,7 +515,7 @@ if (config.useRust) {
515
515
  }
516
516
  }
517
517
  if (rustBinary) {
518
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-9oihdzOp.js");
518
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-BEGaVwg2.js");
519
519
  const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
520
520
  if (config.verbose) {
521
521
  console.log(`[rust] Using binary: ${rustBinary}`);
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-blmSvxN5.js";
1
+ import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-D21pYxoi.js";
2
2
  import "./logger-B9h0djqx.js";
3
- import "./versionChecker-BmttWH-a.js";
3
+ import "./versionChecker-VKD48fzV.js";
4
4
  import "./pidStore-CGKIhaJO.js";
5
5
  import "./globalPidIndex-C7r2m6s7.js";
6
6
 
@@ -1,9 +1,9 @@
1
- import "./ts-blmSvxN5.js";
1
+ import "./ts-D21pYxoi.js";
2
2
  import "./logger-B9h0djqx.js";
3
- import "./versionChecker-BmttWH-a.js";
3
+ import "./versionChecker-VKD48fzV.js";
4
4
  import "./pidStore-CGKIhaJO.js";
5
5
  import "./globalPidIndex-C7r2m6s7.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-C3hbWNlY.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-CRiTrZVs.js";
7
7
  import { n as resolveSpawnCwd } from "./workspaceConfig-BJO4fzEn.js";
8
8
  import { createHash } from "node:crypto";
9
9
 
@@ -141,4 +141,4 @@ async function cmdSchedule(rest) {
141
141
 
142
142
  //#endregion
143
143
  export { cmdSchedule };
144
- //# sourceMappingURL=schedule-CNhFqdnP.js.map
144
+ //# sourceMappingURL=schedule-QakndFJf.js.map
@@ -1,13 +1,13 @@
1
- import "./ts-blmSvxN5.js";
1
+ import "./ts-D21pYxoi.js";
2
2
  import "./logger-B9h0djqx.js";
3
- import { r as getInstalledPackage } from "./versionChecker-BmttWH-a.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-VKD48fzV.js";
4
4
  import "./pidStore-CGKIhaJO.js";
5
5
  import { a as updateGlobalPidStatus } from "./globalPidIndex-C7r2m6s7.js";
6
6
  import { t as pgidForWrapper } from "./reaper-BkjPN7mw.js";
7
7
  import "./configShared-C5QaNPnz.js";
8
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-C3hbWNlY.js";
8
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-CRiTrZVs.js";
9
9
  import "./remotes-D8GvSbhf.js";
10
- import { f as readNotes, g as snapshotStatus, m as resolveOne, o as extractTaskCounts, p as renderRawLog, r as controlCodeFromName, u as listRecords, v as writeToIpc } from "./subcommands-7ZNa2rCG.js";
10
+ import { d as listRecords, g as resolveOne, i as controlCodeFromName, m as renderRawLog, p as readNotes, s as extractTaskCounts, x as writeToIpc, y as snapshotStatus } from "./subcommands-D1floyWA.js";
11
11
  import yargs from "yargs";
12
12
  import { mkdir, open, readFile, stat, writeFile } from "fs/promises";
13
13
  import { homedir, hostname, userInfo } from "os";
@@ -1134,4 +1134,4 @@ Options:
1134
1134
 
1135
1135
  //#endregion
1136
1136
  export { cmdServe };
1137
- //# sourceMappingURL=serve-CgHUyl6K.js.map
1137
+ //# sourceMappingURL=serve-DpBmExxp.js.map
@@ -32,7 +32,7 @@ async function cmdSetup(rest) {
32
32
  if (!existsSync(abs)) process.stderr.write(` note: that directory doesn't exist yet — create it, or agents spawned there will fail\n`);
33
33
  if (noShare) return 0;
34
34
  process.stdout.write(`\nsharing this machine to agent-yes.com…\n`);
35
- const { cmdServe } = await import("./serve-CgHUyl6K.js");
35
+ const { cmdServe } = await import("./serve-DpBmExxp.js");
36
36
  return cmdServe([
37
37
  "install",
38
38
  "--share",
@@ -42,4 +42,4 @@ async function cmdSetup(rest) {
42
42
 
43
43
  //#endregion
44
44
  export { cmdSetup };
45
- //# sourceMappingURL=setup-Bituq_if.js.map
45
+ //# sourceMappingURL=setup-DCisWuHB.js.map
@@ -0,0 +1,7 @@
1
+ import "./logger-B9h0djqx.js";
2
+ import "./globalPidIndex-C7r2m6s7.js";
3
+ import "./configShared-C5QaNPnz.js";
4
+ import "./remotes-D8GvSbhf.js";
5
+ import { _ as resolveReadWindow, a as cursorAbs, b as stopTipForCli, c as finalizedLines, d as listRecords, f as matchKeyword, g as resolveOne, h as renderRawLogLines, i as controlCodeFromName, l as isPidAlive, m as renderRawLog, n as READ_PAGE_DEFAULT, o as extractNeedsInput, p as readNotes, r as cmdHelp, s as extractTaskCounts, t as GRACEFUL_EXIT_COMMANDS, u as isSubcommand, v as runSubcommand, x as writeToIpc, y as snapshotStatus } from "./subcommands-D1floyWA.js";
6
+
7
+ export { cmdHelp, isSubcommand, runSubcommand };
@@ -524,15 +524,15 @@ async function runSubcommand(argv) {
524
524
  case "restart": return await cmdRestart(rest);
525
525
  case "note": return await cmdNote(rest);
526
526
  case "serve": {
527
- const { cmdServe } = await import("./serve-CgHUyl6K.js");
527
+ const { cmdServe } = await import("./serve-DpBmExxp.js");
528
528
  return cmdServe(rest);
529
529
  }
530
530
  case "setup": {
531
- const { cmdSetup } = await import("./setup-Bituq_if.js");
531
+ const { cmdSetup } = await import("./setup-DCisWuHB.js");
532
532
  return cmdSetup(rest);
533
533
  }
534
534
  case "schedule": {
535
- const { cmdSchedule } = await import("./schedule-CNhFqdnP.js");
535
+ const { cmdSchedule } = await import("./schedule-QakndFJf.js");
536
536
  return cmdSchedule(rest);
537
537
  }
538
538
  case "remote": {
@@ -552,7 +552,7 @@ async function runSubcommand(argv) {
552
552
  }
553
553
  }
554
554
  function cmdHelp() {
555
- process.stdout.write("ay - agent-yes CLI\n\nManagement:\n ay ls [keyword] list running agents\n ay tail [-f] <keyword> stream output (Ctrl-C to stop)\n ay cat <keyword> full log\n ay head <keyword> first N lines\n ay send <keyword> <msg> send a message\n ay attach <keyword> interactive attach (detach: Ctrl-\\)\n ay stop <keyword> graceful shutdown (/exit for claude/codex)\n ay status <keyword> agent status snapshot\n ay result <keyword> [--wait] pull an agent's structured result envelope\n ay result set '<json>' (inside an agent) deposit your result envelope\n ay reap kill process groups leaked by dead agents\n\nRemote:\n ay setup guided setup: pick a workspace, share to agent-yes.com\n ay schedule <when> <cli> -- <msg> run an agent on a schedule (HH:MM or cron)\n ay serve [--port N] start HTTP API server (prints token)\n ay serve status show serve daemon/server status\n ay remote add <alias> http://<token>@<host>:<port>\n ay remote ls / rm <alias> manage saved remotes\n ay ls <token>@<host>:<port> connect inline (no alias needed)\n ay send <token>@<host>:<port>:<kw> <msg>\n\nRun an agent:\n ay [claude|codex|gemini|...] [options] -- [prompt]\n ay claude -- \"fix the bug in auth.ts\"\n ay claude --help full agent-runner options\n\nLabs (examples at https://github.com/snomiao/agent-yes/tree/main/lab):\n local-role-play/ designer + builder on one machine\n http-remote/ ay serve remote access demo\n p2p-pairing/ libp2p P2P (needs: cargo build --features swarm)\n");
555
+ process.stdout.write("ay - agent-yes CLI\n\nManagement:\n ay ls [keyword] list running agents\n ay tail [-f] [-n N] <keyword> last N lines (96), -f to follow\n ay read <keyword> [page opts] paginate: --last/--head N, --range A:B,\n --before-line L [--limit N]\n ay cat <keyword> full log\n ay head <keyword> first N lines\n ay send <keyword> <msg> send a message\n ay attach <keyword> interactive attach (detach: Ctrl-\\)\n ay stop <keyword> graceful shutdown (/exit for claude/codex)\n ay status <keyword> agent status snapshot\n ay result <keyword> [--wait] pull an agent's structured result envelope\n ay result set '<json>' (inside an agent) deposit your result envelope\n ay reap kill process groups leaked by dead agents\n\nRemote:\n ay setup guided setup: pick a workspace, share to agent-yes.com\n ay schedule <when> <cli> -- <msg> run an agent on a schedule (HH:MM or cron)\n ay serve [--port N] start HTTP API server (prints token)\n ay serve status show serve daemon/server status\n ay remote add <alias> http://<token>@<host>:<port>\n ay remote ls / rm <alias> manage saved remotes\n ay ls <token>@<host>:<port> connect inline (no alias needed)\n ay send <token>@<host>:<port>:<kw> <msg>\n\nRun an agent:\n ay [claude|codex|gemini|...] [options] -- [prompt]\n ay claude -- \"fix the bug in auth.ts\"\n ay claude --help full agent-runner options\n\nLabs (examples at https://github.com/snomiao/agent-yes/tree/main/lab):\n local-role-play/ designer + builder on one machine\n http-remote/ ay serve remote access demo\n p2p-pairing/ libp2p P2P (needs: cargo build --features swarm)\n");
556
556
  return 0;
557
557
  }
558
558
  function matchKeyword(record, keyword) {
@@ -1153,7 +1153,7 @@ function truncate(s, n) {
1153
1153
  return s.slice(0, n - 1) + "…";
1154
1154
  }
1155
1155
  async function cmdRead(rest, { mode }) {
1156
- const argv = await yargs(rest).usage("Usage: ay read/cat/tail/head <keyword> [options]").option("follow", {
1156
+ const argv = await yargs(rest).usage("Usage: ay read/cat/tail/head <keyword> [options]\n\nPagination (static read; render the log once, window the rendered lines):\n --last N | --head N last / first N lines\n --range A:B lines A..B (1-indexed, inclusive)\n --before-line L [--limit N] the page of N lines ending just above line L").option("follow", {
1157
1157
  alias: "f",
1158
1158
  type: "boolean",
1159
1159
  default: false,
@@ -1161,6 +1161,21 @@ async function cmdRead(rest, { mode }) {
1161
1161
  }).option("n", {
1162
1162
  type: "number",
1163
1163
  description: "Number of lines (default: 96 for tail/head)"
1164
+ }).option("last", {
1165
+ type: "number",
1166
+ description: "Show the last N rendered lines"
1167
+ }).option("head", {
1168
+ type: "number",
1169
+ description: "Show the first N rendered lines"
1170
+ }).option("range", {
1171
+ type: "string",
1172
+ description: "Show rendered lines A:B (1-indexed, inclusive)"
1173
+ }).option("before-line", {
1174
+ type: "number",
1175
+ description: "Paginate: show the page of lines ending just above line L"
1176
+ }).option("limit", {
1177
+ type: "number",
1178
+ description: "Page size for --before-line (default 96)"
1164
1179
  }).option("plain", {
1165
1180
  type: "boolean",
1166
1181
  default: false,
@@ -1214,22 +1229,41 @@ async function cmdRead(rest, { mode }) {
1214
1229
  }
1215
1230
  if (!stats.isFile()) throw new Error(`pid ${record.pid}: log path is not a file: ${logPath}`);
1216
1231
  const buf = await readFile(logPath);
1217
- const rendered = await renderRawLog(buf, {
1218
- mode,
1219
- n
1220
- });
1221
1232
  const noteLabel = (await readNotes()).get(record.pid);
1222
1233
  const header = noteLabel ? `[pid ${record.pid} ${shortenPath(record.cwd)} * ${noteLabel}]` : `[pid ${record.pid} ${shortenPath(record.cwd)}]`;
1223
- process.stderr.write(header + "\n");
1224
- process.stdout.write(rendered);
1225
- if (!rendered.endsWith("\n")) process.stdout.write("\n");
1226
1234
  if (follow) {
1235
+ const rendered = await renderRawLog(buf, {
1236
+ mode,
1237
+ n
1238
+ });
1239
+ process.stderr.write(header + "\n");
1240
+ process.stdout.write(rendered);
1241
+ if (!rendered.endsWith("\n")) process.stdout.write("\n");
1227
1242
  setInterval(() => void recordRead(reader.key, record.pid), 3e4).unref?.();
1228
1243
  return plain ? followPlainLocal(logPath, buf) : followRawLocal(logPath, buf);
1229
1244
  }
1230
- process.stderr.write(`
1231
- ay ls # list all agents
1232
- ay tail -f ${record.pid} # follow live output\n ay send ${record.pid} "next: ..." # send a prompt\n ay send ${record.pid} "" --code=ctrl-c # interrupt\n`);
1245
+ const allLines = await renderRawLogLines(buf);
1246
+ const total = allLines.length;
1247
+ const win = resolveReadWindow({
1248
+ total,
1249
+ mode,
1250
+ n: argv.n,
1251
+ last: argv.last,
1252
+ head: argv.head,
1253
+ range: argv.range,
1254
+ beforeLine: argv["before-line"],
1255
+ limit: argv.limit
1256
+ });
1257
+ const rendered = allLines.slice(win.start, win.end).join("\n");
1258
+ process.stderr.write(header + "\n");
1259
+ process.stdout.write(rendered);
1260
+ if (!rendered.endsWith("\n")) process.stdout.write("\n");
1261
+ const firstVisible = win.start + 1;
1262
+ const shown = win.end - win.start;
1263
+ const hints = [`\n`, ` ay ls # list all agents\n`];
1264
+ if (win.start > 0) hints.push(` ay read ${record.pid} --before-line ${firstVisible} --limit ${shown || READ_PAGE_DEFAULT} # older lines (page up)\n`);
1265
+ hints.push(` ay read ${record.pid} --range A:B # lines A..B of ${total}\n`, ` ay tail -f ${record.pid} # follow live output\n`, ` ay send ${record.pid} "next: ..." # send a prompt\n`);
1266
+ process.stderr.write(hints.join(""));
1233
1267
  return 0;
1234
1268
  }
1235
1269
  /**
@@ -1394,9 +1428,23 @@ async function followPlainLocal(logPath, buf) {
1394
1428
  * Same approach as koho's renderTerminalBuffer + agent-yes's XtermProxy.
1395
1429
  */
1396
1430
  async function renderRawLog(buf, { mode, n }) {
1431
+ const lines = await renderRawLogLines(buf);
1432
+ if (mode === "cat") return lines.join("\n");
1433
+ if (mode === "tail") return lines.slice(Math.max(0, lines.length - n)).join("\n");
1434
+ return lines.slice(0, n).join("\n");
1435
+ }
1436
+ /**
1437
+ * Render the raw PTY byte stream to its full array of scrollback lines (trailing
1438
+ * blanks trimmed). This is the substrate `renderRawLog` slices by mode and that
1439
+ * pagination (`resolveReadWindow`) indexes into — slicing the FINAL rendered
1440
+ * state is sound, but rendering from an arbitrary mid-stream offset is not (PTY
1441
+ * cursor moves / clears / wraps), so we always render the whole buffer once and
1442
+ * window the resulting lines.
1443
+ */
1444
+ async function renderRawLogLines(buf) {
1397
1445
  const cols = 200;
1398
1446
  const rows = 50;
1399
- const scrollback = Math.max(5e4, n + rows + 100);
1447
+ const scrollback = 5e4;
1400
1448
  try {
1401
1449
  const { Terminal } = await import("@xterm/headless");
1402
1450
  const term = new Terminal({
@@ -1413,18 +1461,73 @@ async function renderRawLog(buf, { mode, n }) {
1413
1461
  lines.push(line ? line.translateToString(false).trimEnd() : "");
1414
1462
  }
1415
1463
  while (lines.length > 0 && lines[lines.length - 1] === "") lines.pop();
1416
- if (mode === "cat") return lines.join("\n");
1417
- if (mode === "tail") return lines.slice(Math.max(0, lines.length - n)).join("\n");
1418
- return lines.slice(0, n).join("\n");
1464
+ return lines;
1419
1465
  } catch {
1420
1466
  let text = new TextDecoder().decode(buf);
1421
1467
  text = text.replace(/\x1b\[[0-?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b[@-Z\\-_]/g, "").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, "");
1422
1468
  const lines = text.split("\n");
1423
- if (mode === "cat") return lines.join("\n");
1424
- if (mode === "tail") return lines.slice(Math.max(0, lines.length - n)).join("\n");
1425
- return lines.slice(0, n).join("\n");
1469
+ while (lines.length > 0 && lines[lines.length - 1] === "") lines.pop();
1470
+ return lines;
1426
1471
  }
1427
1472
  }
1473
+ const READ_PAGE_DEFAULT = 96;
1474
+ /**
1475
+ * Resolve which rendered lines to show. Precedence (first match wins):
1476
+ * 1. `range` "A:B" — explicit 1-indexed inclusive window
1477
+ * 2. `beforeLine` (+limit)— the page of `limit` lines ending just ABOVE line L
1478
+ * (the pagination cursor `ay read` prints in its footer)
1479
+ * 3. `head` / `last` — explicit first/last N rendered lines
1480
+ * 4. mode preset + `-n` — tail/head default to the last/first N (96); cat = all
1481
+ * Indices are clamped to `[0, total]`; an empty / non-matching `range` falls through.
1482
+ */
1483
+ function resolveReadWindow(opts) {
1484
+ const total = Math.max(0, Math.floor(opts.total));
1485
+ const clamp = (v) => Math.max(0, Math.min(total, Math.floor(v)));
1486
+ const pos = (v) => v != null && Number.isFinite(v) && v > 0 ? Math.floor(v) : void 0;
1487
+ const range = opts.range?.trim();
1488
+ if (range) {
1489
+ const m = /^(\d+):(\d+)$/.exec(range);
1490
+ if (m) {
1491
+ const a = parseInt(m[1], 10);
1492
+ const b = parseInt(m[2], 10);
1493
+ return {
1494
+ start: clamp(Math.min(a, b) - 1),
1495
+ end: clamp(Math.max(a, b))
1496
+ };
1497
+ }
1498
+ }
1499
+ if (opts.beforeLine != null && Number.isFinite(opts.beforeLine)) {
1500
+ const limit = pos(opts.limit) ?? READ_PAGE_DEFAULT;
1501
+ const end = clamp(opts.beforeLine - 1);
1502
+ return {
1503
+ start: clamp(end - limit),
1504
+ end
1505
+ };
1506
+ }
1507
+ const head = pos(opts.head);
1508
+ if (head != null) return {
1509
+ start: 0,
1510
+ end: clamp(head)
1511
+ };
1512
+ const last = pos(opts.last);
1513
+ if (last != null) return {
1514
+ start: clamp(total - last),
1515
+ end: total
1516
+ };
1517
+ const n = pos(opts.n);
1518
+ if (opts.mode === "head") return {
1519
+ start: 0,
1520
+ end: clamp(n ?? READ_PAGE_DEFAULT)
1521
+ };
1522
+ if (opts.mode === "tail") return {
1523
+ start: clamp(total - (n ?? READ_PAGE_DEFAULT)),
1524
+ end: total
1525
+ };
1526
+ return {
1527
+ start: 0,
1528
+ end: total
1529
+ };
1530
+ }
1428
1531
  /**
1429
1532
  * Extract a one-line activity summary from a raw log file.
1430
1533
  * Reads only the last 32 KB for speed, renders via xterm for clean output.
@@ -2303,5 +2406,5 @@ async function cmdResultSet(rest) {
2303
2406
  }
2304
2407
 
2305
2408
  //#endregion
2306
- export { stopTipForCli as _, extractNeedsInput as a, isPidAlive as c, matchKeyword as d, readNotes as f, snapshotStatus as g, runSubcommand as h, cursorAbs as i, isSubcommand as l, resolveOne as m, cmdHelp as n, extractTaskCounts as o, renderRawLog as p, controlCodeFromName as r, finalizedLines as s, GRACEFUL_EXIT_COMMANDS as t, listRecords as u, writeToIpc as v };
2307
- //# sourceMappingURL=subcommands-7ZNa2rCG.js.map
2409
+ export { resolveReadWindow as _, cursorAbs as a, stopTipForCli as b, finalizedLines as c, listRecords as d, matchKeyword as f, resolveOne as g, renderRawLogLines as h, controlCodeFromName as i, isPidAlive as l, renderRawLog as m, READ_PAGE_DEFAULT as n, extractNeedsInput as o, readNotes as p, cmdHelp as r, extractTaskCounts as s, GRACEFUL_EXIT_COMMANDS as t, isSubcommand as u, runSubcommand as v, writeToIpc as x, snapshotStatus as y };
2410
+ //# sourceMappingURL=subcommands-D1floyWA.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as logger, t as addTransport } from "./logger-B9h0djqx.js";
2
- import { r as getInstalledPackage } from "./versionChecker-BmttWH-a.js";
2
+ import { r as getInstalledPackage } from "./versionChecker-VKD48fzV.js";
3
3
  import { t as agentYesHome } from "./agentYesHome-BvaUOzCV.js";
4
4
  import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-CJxsoGdb.js";
5
5
  import { t as PidStore } from "./pidStore-CGKIhaJO.js";
@@ -1787,4 +1787,4 @@ function sleep(ms) {
1787
1787
 
1788
1788
  //#endregion
1789
1789
  export { removeControlCharacters as a, AgentContext as i, agentYes as n, config as r, CLIS_CONFIG as t };
1790
- //# sourceMappingURL=ts-blmSvxN5.js.map
1790
+ //# sourceMappingURL=ts-D21pYxoi.js.map
@@ -7,7 +7,7 @@ import { fileURLToPath } from "url";
7
7
 
8
8
  //#region package.json
9
9
  var name = "agent-yes";
10
- var version = "1.128.0";
10
+ var version = "1.129.0";
11
11
 
12
12
  //#endregion
13
13
  //#region ts/versionChecker.ts
@@ -215,4 +215,4 @@ async function displayVersion() {
215
215
 
216
216
  //#endregion
217
217
  export { versionString as i, displayVersion as n, getInstalledPackage as r, checkAndAutoUpdate as t };
218
- //# sourceMappingURL=versionChecker-BmttWH-a.js.map
218
+ //# sourceMappingURL=versionChecker-VKD48fzV.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.128.0",
3
+ "version": "1.129.0",
4
4
  "description": "A wrapper tool that automates interactions with various AI CLI tools by automatically handling common prompts and responses.",
5
5
  "keywords": [
6
6
  "ai",
@@ -1253,3 +1253,74 @@ describe("subcommands.listRecords merges per-cwd TS file with global", () => {
1253
1253
  }
1254
1254
  });
1255
1255
  });
1256
+
1257
+ describe("subcommands.resolveReadWindow", () => {
1258
+ const total = 100;
1259
+
1260
+ it("defaults: tail = last 96, head = first 96, cat = all", async () => {
1261
+ const { resolveReadWindow } = await loadModule();
1262
+ expect(resolveReadWindow({ total: 200, mode: "tail" })).toEqual({ start: 104, end: 200 });
1263
+ expect(resolveReadWindow({ total: 200, mode: "head" })).toEqual({ start: 0, end: 96 });
1264
+ expect(resolveReadWindow({ total: 200, mode: "cat" })).toEqual({ start: 0, end: 200 });
1265
+ });
1266
+
1267
+ it("respects -n for tail/head; cat ignores -n (stays whole)", async () => {
1268
+ const { resolveReadWindow } = await loadModule();
1269
+ expect(resolveReadWindow({ total, mode: "tail", n: 10 })).toEqual({ start: 90, end: 100 });
1270
+ expect(resolveReadWindow({ total, mode: "head", n: 10 })).toEqual({ start: 0, end: 10 });
1271
+ expect(resolveReadWindow({ total, mode: "cat", n: 10 })).toEqual({ start: 0, end: 100 });
1272
+ });
1273
+
1274
+ it("--last / --head override the mode", async () => {
1275
+ const { resolveReadWindow } = await loadModule();
1276
+ expect(resolveReadWindow({ total, mode: "cat", last: 5 })).toEqual({ start: 95, end: 100 });
1277
+ expect(resolveReadWindow({ total, mode: "tail", head: 5 })).toEqual({ start: 0, end: 5 });
1278
+ });
1279
+
1280
+ it("--range A:B is 1-indexed inclusive and order-insensitive", async () => {
1281
+ const { resolveReadWindow } = await loadModule();
1282
+ expect(resolveReadWindow({ total, mode: "cat", range: "10:20" })).toEqual({
1283
+ start: 9,
1284
+ end: 20,
1285
+ });
1286
+ expect(resolveReadWindow({ total, mode: "cat", range: "20:10" })).toEqual({
1287
+ start: 9,
1288
+ end: 20,
1289
+ });
1290
+ });
1291
+
1292
+ it("--before-line L shows the page of `limit` lines ending just above L", async () => {
1293
+ const { resolveReadWindow } = await loadModule();
1294
+ // page-up cursor: lines strictly before line 51, limit 10 -> [41..50] (0-idx 40..50)
1295
+ expect(resolveReadWindow({ total, mode: "cat", beforeLine: 51, limit: 10 })).toEqual({
1296
+ start: 40,
1297
+ end: 50,
1298
+ });
1299
+ // round-trip: first-visible of the above is line 41; paging up again from 41
1300
+ expect(resolveReadWindow({ total, mode: "cat", beforeLine: 41, limit: 10 })).toEqual({
1301
+ start: 30,
1302
+ end: 40,
1303
+ });
1304
+ });
1305
+
1306
+ it("clamps out-of-range indices", async () => {
1307
+ const { resolveReadWindow } = await loadModule();
1308
+ expect(resolveReadWindow({ total: 5, mode: "tail", n: 999 })).toEqual({ start: 0, end: 5 });
1309
+ expect(resolveReadWindow({ total: 5, mode: "cat", range: "3:999" })).toEqual({
1310
+ start: 2,
1311
+ end: 5,
1312
+ });
1313
+ expect(resolveReadWindow({ total: 5, mode: "cat", beforeLine: 2, limit: 999 })).toEqual({
1314
+ start: 0,
1315
+ end: 1,
1316
+ });
1317
+ });
1318
+
1319
+ it("ignores a malformed --range and falls through to the mode default", async () => {
1320
+ const { resolveReadWindow } = await loadModule();
1321
+ expect(resolveReadWindow({ total, mode: "head", range: "not-a-range" })).toEqual({
1322
+ start: 0,
1323
+ end: 96,
1324
+ });
1325
+ });
1326
+ });
package/ts/subcommands.ts CHANGED
Binary file
@@ -1,8 +0,0 @@
1
- import "./ts-blmSvxN5.js";
2
- import "./logger-B9h0djqx.js";
3
- import "./versionChecker-BmttWH-a.js";
4
- import "./pidStore-CGKIhaJO.js";
5
- import "./globalPidIndex-C7r2m6s7.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-C3hbWNlY.js";
7
-
8
- export { SUPPORTED_CLIS };
@@ -1,7 +0,0 @@
1
- import "./logger-B9h0djqx.js";
2
- import "./globalPidIndex-C7r2m6s7.js";
3
- import "./configShared-C5QaNPnz.js";
4
- import "./remotes-D8GvSbhf.js";
5
- import { _ as stopTipForCli, a as extractNeedsInput, c as isPidAlive, d as matchKeyword, f as readNotes, g as snapshotStatus, h as runSubcommand, i as cursorAbs, l as isSubcommand, m as resolveOne, n as cmdHelp, o as extractTaskCounts, p as renderRawLog, r as controlCodeFromName, s as finalizedLines, t as GRACEFUL_EXIT_COMMANDS, u as listRecords, v as writeToIpc } from "./subcommands-7ZNa2rCG.js";
6
-
7
- export { cmdHelp, isSubcommand, runSubcommand };