agent-yes 1.129.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-CRiTrZVs.js → SUPPORTED_CLIS-DgpRWiWM.js} +2 -2
- package/dist/cli.js +3 -3
- package/dist/index.js +2 -2
- package/dist/{schedule-QakndFJf.js → schedule-8L8M2WD3.js} +4 -4
- package/dist/{serve-DpBmExxp.js → serve-DYcTukF5.js} +16 -8
- package/dist/{setup-DCisWuHB.js → setup-Ba4q-a7V.js} +2 -2
- package/dist/{subcommands-D1floyWA.js → subcommands-BjxWxxGq.js} +4 -4
- package/dist/{subcommands-BLUX23IJ.js → subcommands-D9CFDaVM.js} +1 -1
- package/dist/{ts-D21pYxoi.js → ts-BcbPKaqz.js} +2 -2
- package/dist/{versionChecker-VKD48fzV.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/dist/SUPPORTED_CLIS-BEGaVwg2.js +0 -8
|
@@ -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 { 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-
|
|
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": {
|
|
@@ -2407,4 +2407,4 @@ async function cmdResultSet(rest) {
|
|
|
2407
2407
|
|
|
2408
2408
|
//#endregion
|
|
2409
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-
|
|
2410
|
+
//# sourceMappingURL=subcommands-BjxWxxGq.js.map
|
|
@@ -2,6 +2,6 @@ import "./logger-B9h0djqx.js";
|
|
|
2
2
|
import "./globalPidIndex-C7r2m6s7.js";
|
|
3
3
|
import "./configShared-C5QaNPnz.js";
|
|
4
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-
|
|
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
6
|
|
|
7
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;
|
|
@@ -1,8 +0,0 @@
|
|
|
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 };
|