agent-yes 1.128.0 → 1.130.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.
- package/dist/SUPPORTED_CLIS-BD3Ly7re.js +8 -0
- package/dist/{SUPPORTED_CLIS-C3hbWNlY.js → SUPPORTED_CLIS-DgpRWiWM.js} +2 -2
- package/dist/cli.js +3 -3
- package/dist/index.js +2 -2
- package/dist/{schedule-CNhFqdnP.js → schedule-8L8M2WD3.js} +4 -4
- package/dist/{serve-CgHUyl6K.js → serve-DYcTukF5.js} +16 -8
- package/dist/{setup-Bituq_if.js → setup-Ba4q-a7V.js} +2 -2
- package/dist/{subcommands-7ZNa2rCG.js → subcommands-BjxWxxGq.js} +127 -24
- package/dist/subcommands-D9CFDaVM.js +7 -0
- package/dist/{ts-blmSvxN5.js → ts-BcbPKaqz.js} +2 -2
- package/dist/{versionChecker-BmttWH-a.js → versionChecker-Bty629vj.js} +2 -2
- package/lab/ui/index.html +35 -27
- package/package.json +2 -2
- package/scripts/build-rs.ts +88 -0
- package/ts/serve.ts +30 -10
- package/ts/subcommands.spec.ts +71 -0
- package/ts/subcommands.ts +0 -0
- package/dist/SUPPORTED_CLIS-9oihdzOp.js +0 -8
- package/dist/subcommands-DA0MhdpJ.js +0 -7
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import "./ts-BcbPKaqz.js";
|
|
2
|
+
import "./logger-B9h0djqx.js";
|
|
3
|
+
import "./versionChecker-Bty629vj.js";
|
|
4
|
+
import "./pidStore-CGKIhaJO.js";
|
|
5
|
+
import "./globalPidIndex-C7r2m6s7.js";
|
|
6
|
+
import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DgpRWiWM.js";
|
|
7
|
+
|
|
8
|
+
export { SUPPORTED_CLIS };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { t as CLIS_CONFIG } from "./ts-
|
|
1
|
+
import { t as CLIS_CONFIG } from "./ts-BcbPKaqz.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-
|
|
8
|
+
//# sourceMappingURL=SUPPORTED_CLIS-DgpRWiWM.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-
|
|
3
|
+
import { i as versionString, n as displayVersion, r as getInstalledPackage, t as checkAndAutoUpdate } from "./versionChecker-Bty629vj.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-
|
|
485
|
+
const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-D9CFDaVM.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-
|
|
518
|
+
const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-BD3Ly7re.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-
|
|
1
|
+
import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-BcbPKaqz.js";
|
|
2
2
|
import "./logger-B9h0djqx.js";
|
|
3
|
-
import "./versionChecker-
|
|
3
|
+
import "./versionChecker-Bty629vj.js";
|
|
4
4
|
import "./pidStore-CGKIhaJO.js";
|
|
5
5
|
import "./globalPidIndex-C7r2m6s7.js";
|
|
6
6
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import "./ts-
|
|
1
|
+
import "./ts-BcbPKaqz.js";
|
|
2
2
|
import "./logger-B9h0djqx.js";
|
|
3
|
-
import "./versionChecker-
|
|
3
|
+
import "./versionChecker-Bty629vj.js";
|
|
4
4
|
import "./pidStore-CGKIhaJO.js";
|
|
5
5
|
import "./globalPidIndex-C7r2m6s7.js";
|
|
6
|
-
import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-
|
|
6
|
+
import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DgpRWiWM.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-
|
|
144
|
+
//# sourceMappingURL=schedule-8L8M2WD3.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import "./ts-
|
|
1
|
+
import "./ts-BcbPKaqz.js";
|
|
2
2
|
import "./logger-B9h0djqx.js";
|
|
3
|
-
import { r as getInstalledPackage } from "./versionChecker-
|
|
3
|
+
import { r as getInstalledPackage } from "./versionChecker-Bty629vj.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-
|
|
8
|
+
import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DgpRWiWM.js";
|
|
9
9
|
import "./remotes-D8GvSbhf.js";
|
|
10
|
-
import {
|
|
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-BjxWxxGq.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";
|
|
@@ -308,6 +308,8 @@ async function cmdServeDaemon(sub, args) {
|
|
|
308
308
|
DAEMON_NAME,
|
|
309
309
|
"--interpreter",
|
|
310
310
|
"none",
|
|
311
|
+
"--exp-backoff-restart-delay",
|
|
312
|
+
"200",
|
|
311
313
|
"--",
|
|
312
314
|
...serveArgv.slice(1)
|
|
313
315
|
];
|
|
@@ -1052,11 +1054,17 @@ Options:
|
|
|
1052
1054
|
};
|
|
1053
1055
|
let server = null;
|
|
1054
1056
|
if (wantHttp) {
|
|
1055
|
-
try {
|
|
1057
|
+
for (let attempt = 0;; attempt++) try {
|
|
1056
1058
|
server = Bun.serve(serverOpts);
|
|
1059
|
+
break;
|
|
1057
1060
|
} catch (e) {
|
|
1058
|
-
|
|
1059
|
-
|
|
1061
|
+
const inUse = e.code === "EADDRINUSE";
|
|
1062
|
+
if (inUse && attempt < 5) {
|
|
1063
|
+
await Bun.sleep(Math.min(2e3, 250 * 2 ** attempt));
|
|
1064
|
+
continue;
|
|
1065
|
+
}
|
|
1066
|
+
if (inUse) {
|
|
1067
|
+
process.stderr.write(`ay serve: port ${port} is still in use after retries — pick another with --port N,\nor run a port-free WebRTC-only share with: ay serve --webrtc\n`);
|
|
1060
1068
|
return 1;
|
|
1061
1069
|
}
|
|
1062
1070
|
throw e;
|
|
@@ -1134,4 +1142,4 @@ Options:
|
|
|
1134
1142
|
|
|
1135
1143
|
//#endregion
|
|
1136
1144
|
export { cmdServe };
|
|
1137
|
-
//# sourceMappingURL=serve-
|
|
1145
|
+
//# sourceMappingURL=serve-DYcTukF5.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-
|
|
35
|
+
const { cmdServe } = await import("./serve-DYcTukF5.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-
|
|
45
|
+
//# sourceMappingURL=setup-Ba4q-a7V.js.map
|
|
@@ -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-
|
|
527
|
+
const { cmdServe } = await import("./serve-DYcTukF5.js");
|
|
528
528
|
return cmdServe(rest);
|
|
529
529
|
}
|
|
530
530
|
case "setup": {
|
|
531
|
-
const { cmdSetup } = await import("./setup-
|
|
531
|
+
const { cmdSetup } = await import("./setup-Ba4q-a7V.js");
|
|
532
532
|
return cmdSetup(rest);
|
|
533
533
|
}
|
|
534
534
|
case "schedule": {
|
|
535
|
-
const { cmdSchedule } = await import("./schedule-
|
|
535
|
+
const { cmdSchedule } = await import("./schedule-8L8M2WD3.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>
|
|
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
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
1424
|
-
|
|
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 {
|
|
2307
|
-
//# sourceMappingURL=subcommands-
|
|
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-BjxWxxGq.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-BjxWxxGq.js";
|
|
6
|
+
|
|
7
|
+
export { cmdHelp, isSubcommand, runSubcommand };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as logger, t as addTransport } from "./logger-B9h0djqx.js";
|
|
2
|
-
import { r as getInstalledPackage } from "./versionChecker-
|
|
2
|
+
import { r as getInstalledPackage } from "./versionChecker-Bty629vj.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-
|
|
1790
|
+
//# sourceMappingURL=ts-BcbPKaqz.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.
|
|
10
|
+
var version = "1.130.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-
|
|
218
|
+
//# sourceMappingURL=versionChecker-Bty629vj.js.map
|
package/lab/ui/index.html
CHANGED
|
@@ -2958,38 +2958,46 @@
|
|
|
2958
2958
|
// and re-assert our size to the agent so the stream always reflows to OUR
|
|
2959
2959
|
// viewport (see the visibilitychange hook in startPolling). Push-if-different
|
|
2960
2960
|
// inside fitAndSync keeps an already-matching agent from a redundant SIGWINCH.
|
|
2961
|
+
// Returns the in-flight sync promise so the initial open can await it
|
|
2962
|
+
// before starting the tail (below); tab-reactivation callers ignore it.
|
|
2961
2963
|
resyncTerm = () => {
|
|
2962
2964
|
if (sel !== selKey || !term) return;
|
|
2963
|
-
tx
|
|
2965
|
+
return tx
|
|
2966
|
+
.fetchJSON("/api/size/" + encodeURIComponent(pid))
|
|
2964
2967
|
.then(fitAndSync)
|
|
2965
2968
|
.catch(() => fitAndSync(null));
|
|
2966
2969
|
};
|
|
2967
|
-
|
|
2968
|
-
|
|
2969
|
-
//
|
|
2970
|
-
//
|
|
2971
|
-
//
|
|
2972
|
-
//
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
"
|
|
2977
|
-
(
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2970
|
+
|
|
2971
|
+
// Start the raw replay only AFTER the initial size sync (fit + resize
|
|
2972
|
+
// push) settles. /api/tail?raw=1 is absolute-cursor-positioned for the
|
|
2973
|
+
// agent's grid; writing it into xterm before fit.fit()/resize would land
|
|
2974
|
+
// the initial snapshot on a wrong-size grid that no later resize can
|
|
2975
|
+
// repair (garbled, overlapping, dim-bleed output). First event is an
|
|
2976
|
+
// xterm-rendered tail snapshot; later events are incremental deltas.
|
|
2977
|
+
const startTail = () => {
|
|
2978
|
+
if (sel !== selKey || !term) return; // switched away during size sync
|
|
2979
|
+
$("livedot").className = "dot idle";
|
|
2980
|
+
$("livetxt").textContent = "connecting…";
|
|
2981
|
+
const close = tx.subscribe(
|
|
2982
|
+
"/api/tail/" + encodeURIComponent(pid) + "?raw=1",
|
|
2983
|
+
(raw) => {
|
|
2984
|
+
if (term) {
|
|
2985
|
+
term.write(raw);
|
|
2986
|
+
perfNote("out", raw?.length ?? 0);
|
|
2987
|
+
}
|
|
2988
|
+
},
|
|
2989
|
+
() => {
|
|
2990
|
+
$("livedot").className = "dot active";
|
|
2991
|
+
$("livetxt").textContent = "live";
|
|
2992
|
+
},
|
|
2993
|
+
() => {
|
|
2994
|
+
$("livedot").className = "dot stopped";
|
|
2995
|
+
$("livetxt").textContent = "disconnected";
|
|
2996
|
+
},
|
|
2997
|
+
);
|
|
2998
|
+
es = { close };
|
|
2999
|
+
};
|
|
3000
|
+
Promise.resolve(resyncTerm()).finally(startTail);
|
|
2993
3001
|
}
|
|
2994
3002
|
|
|
2995
3003
|
$("list").addEventListener("click", (ev) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-yes",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.130.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",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"build": "tsdown",
|
|
82
82
|
"check:e2e": "bun scripts/check-e2e.ts",
|
|
83
83
|
"cf": "bun scripts/cf.ts",
|
|
84
|
-
"build:rs": "
|
|
84
|
+
"build:rs": "bun ./scripts/build-rs.ts",
|
|
85
85
|
"postbuild": "bun ./ts/postbuild.ts",
|
|
86
86
|
"demo": "bun run build && bun link && claude-yes -- demo",
|
|
87
87
|
"dev": "bun ts/index.ts",
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// Build + install the Rust binary.
|
|
3
|
+
//
|
|
4
|
+
// On Windows a running `agent-yes.exe` holds its own image file locked, so
|
|
5
|
+
// `cargo install` fails with "Access is denied" when it tries to remove/
|
|
6
|
+
// overwrite the old binary. Windows DOES permit *renaming* a running .exe
|
|
7
|
+
// (the live process keeps using the renamed image), so we move any locked
|
|
8
|
+
// binary aside as `agent-yes.old-<ts>.exe` before building and let cargo write
|
|
9
|
+
// a fresh one. This makes rebuilds lock-free without killing live sessions.
|
|
10
|
+
//
|
|
11
|
+
// On macOS/Linux a running binary can be replaced directly, so this is a no-op
|
|
12
|
+
// there and we just run cargo.
|
|
13
|
+
import { spawnSync } from "child_process";
|
|
14
|
+
import { existsSync, readdirSync, renameSync, rmSync } from "fs";
|
|
15
|
+
import os from "os";
|
|
16
|
+
import path from "path";
|
|
17
|
+
|
|
18
|
+
const repoRoot = path.resolve(import.meta.dirname, "..");
|
|
19
|
+
const cargoHome = process.env.CARGO_HOME || path.join(os.homedir(), ".cargo");
|
|
20
|
+
|
|
21
|
+
// Both binaries cargo touches: the build output and the installed copy.
|
|
22
|
+
const targets = [
|
|
23
|
+
path.join(repoRoot, "rs", "target", "release", "agent-yes.exe"),
|
|
24
|
+
path.join(cargoHome, "bin", "agent-yes.exe"),
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
function moveLockedBinariesAside(): Array<{ original: string; aside: string }> {
|
|
28
|
+
const moved: Array<{ original: string; aside: string }> = [];
|
|
29
|
+
for (const exe of targets) {
|
|
30
|
+
const dir = path.dirname(exe);
|
|
31
|
+
if (!existsSync(dir)) continue;
|
|
32
|
+
const base = path.basename(exe, ".exe");
|
|
33
|
+
|
|
34
|
+
// Sweep stale .old- files from earlier rebuilds. Any still locked by a
|
|
35
|
+
// live process will fail to delete — that's fine, skip and move on.
|
|
36
|
+
for (const f of readdirSync(dir)) {
|
|
37
|
+
if (f.startsWith(`${base}.old-`) && f.endsWith(".exe")) {
|
|
38
|
+
try {
|
|
39
|
+
rmSync(path.join(dir, f));
|
|
40
|
+
} catch {
|
|
41
|
+
/* still running — leave it */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Move the current (possibly locked) binary aside so cargo can write fresh.
|
|
47
|
+
if (existsSync(exe)) {
|
|
48
|
+
const aside = path.join(dir, `${base}.old-${Date.now()}.exe`);
|
|
49
|
+
try {
|
|
50
|
+
renameSync(exe, aside);
|
|
51
|
+
moved.push({ original: exe, aside });
|
|
52
|
+
console.log(`[build-rs] moved locked binary aside: ${path.basename(aside)}`);
|
|
53
|
+
} catch {
|
|
54
|
+
// Not locked (or rename unsupported) — try a plain delete instead.
|
|
55
|
+
try {
|
|
56
|
+
rmSync(exe);
|
|
57
|
+
} catch (e) {
|
|
58
|
+
console.warn(`[build-rs] WARNING: could not free ${exe}: ${e}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return moved;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const moved = process.platform === "win32" ? moveLockedBinariesAside() : [];
|
|
67
|
+
|
|
68
|
+
const args = ["install", "--path", "rs", "--features", "swarm", ...process.argv.slice(2)];
|
|
69
|
+
console.log(`[build-rs] cargo ${args.join(" ")}`);
|
|
70
|
+
const result = spawnSync("cargo", args, { cwd: repoRoot, stdio: "inherit" });
|
|
71
|
+
|
|
72
|
+
// On failure cargo never wrote the fresh originals, so restore anything we
|
|
73
|
+
// moved aside — otherwise a build error would leave agent-yes.exe missing
|
|
74
|
+
// from PATH until the next successful build.
|
|
75
|
+
if (result.status !== 0) {
|
|
76
|
+
for (const { original, aside } of moved) {
|
|
77
|
+
if (!existsSync(original) && existsSync(aside)) {
|
|
78
|
+
try {
|
|
79
|
+
renameSync(aside, original);
|
|
80
|
+
console.warn(`[build-rs] build failed — restored ${path.basename(original)}`);
|
|
81
|
+
} catch {
|
|
82
|
+
/* best effort */
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
process.exit(result.status ?? 1);
|
package/ts/serve.ts
CHANGED
|
@@ -447,6 +447,13 @@ async function cmdServeDaemon(sub: string, args: string[]): Promise<number> {
|
|
|
447
447
|
DAEMON_NAME,
|
|
448
448
|
"--interpreter",
|
|
449
449
|
"none",
|
|
450
|
+
// Exponential restart backoff: a persistent crash (e.g. a port held
|
|
451
|
+
// by a stale instance) must NOT hammer-restart. pm2's default is an
|
|
452
|
+
// instant respawn, which storms — hundreds of restarts/min, each
|
|
453
|
+
// briefly grabbing window focus. exp-backoff grows the delay on
|
|
454
|
+
// repeated quick crashes and resets once the process stays up.
|
|
455
|
+
"--exp-backoff-restart-delay",
|
|
456
|
+
"200",
|
|
450
457
|
"--",
|
|
451
458
|
...serveArgv.slice(1),
|
|
452
459
|
];
|
|
@@ -1453,17 +1460,30 @@ export async function cmdServe(rest: string[]): Promise<number> {
|
|
|
1453
1460
|
|
|
1454
1461
|
let server: ReturnType<typeof Bun.serve> | null = null;
|
|
1455
1462
|
if (wantHttp) {
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
);
|
|
1464
|
-
|
|
1463
|
+
// A daemon restart can race the previous instance's port release (TIME_WAIT
|
|
1464
|
+
// / slow shutdown), so a single Bun.serve would EADDRINUSE and the daemon
|
|
1465
|
+
// would exit 1 straight into another restart. Retry with backoff first so a
|
|
1466
|
+
// restart self-heals; only give up (and let the manager back off) if the
|
|
1467
|
+
// port stays held — e.g. by an unrelated/stale process.
|
|
1468
|
+
for (let attempt = 0; ; attempt++) {
|
|
1469
|
+
try {
|
|
1470
|
+
server = Bun.serve(serverOpts);
|
|
1471
|
+
break;
|
|
1472
|
+
} catch (e) {
|
|
1473
|
+
const inUse = (e as { code?: string }).code === "EADDRINUSE";
|
|
1474
|
+
if (inUse && attempt < 5) {
|
|
1475
|
+
await Bun.sleep(Math.min(2000, 250 * 2 ** attempt));
|
|
1476
|
+
continue;
|
|
1477
|
+
}
|
|
1478
|
+
if (inUse) {
|
|
1479
|
+
process.stderr.write(
|
|
1480
|
+
`ay serve: port ${port} is still in use after retries — pick another with --port N,\n` +
|
|
1481
|
+
`or run a port-free WebRTC-only share with: ay serve --webrtc\n`,
|
|
1482
|
+
);
|
|
1483
|
+
return 1;
|
|
1484
|
+
}
|
|
1485
|
+
throw e;
|
|
1465
1486
|
}
|
|
1466
|
-
throw e;
|
|
1467
1487
|
}
|
|
1468
1488
|
|
|
1469
1489
|
const uiHost = host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host;
|
package/ts/subcommands.spec.ts
CHANGED
|
@@ -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 };
|