agent-yes 1.118.1 → 1.119.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.
@@ -23,10 +23,14 @@ clis:
23
23
  flags: m
24
24
  - pattern: '❯ ?1\. ?Dark mode ?✔'
25
25
  flags: m
26
+ - pattern: '❯ ?1\. ?Auto \(match terminal\)'
27
+ flags: m
26
28
  - pattern: '❯ ?1\. ?Yes'
27
29
  flags: m
28
30
  - pattern: '^.{0,4} ?1\. ?Dark mode ?✔'
29
31
  flags: m
32
+ - pattern: '^.{0,4} ?1\. ?Auto \(match terminal\)'
33
+ flags: m
30
34
  - pattern: '^.{0,4} ?1\. ?Yes'
31
35
  flags: m
32
36
  - pattern: Press Enter to continue
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-DSvAXKGk.js";
1
+ import { t as CLIS_CONFIG } from "./ts-CU-rtV2g.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-FpD7Ea6s.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-By1zXrJN.js.map
@@ -0,0 +1,8 @@
1
+ import "./ts-CU-rtV2g.js";
2
+ import "./logger-B9h0djqx.js";
3
+ import "./versionChecker-Bx0n92RQ.js";
4
+ import "./pidStore-B5vBu8Px.js";
5
+ import "./globalPidIndex-gZuTvTBs.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-By1zXrJN.js";
7
+
8
+ export { SUPPORTED_CLIS };
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-C40LF9-T.js";
3
+ import { i as versionString, n as displayVersion, r as getInstalledPackage, t as checkAndAutoUpdate } from "./versionChecker-Bx0n92RQ.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-Ca1GYIB2.js");
485
+ const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-B0WN8evc.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-Bx3xCmVR.js");
518
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-Cv8SOkyd.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-DSvAXKGk.js";
1
+ import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-CU-rtV2g.js";
2
2
  import "./logger-B9h0djqx.js";
3
- import "./versionChecker-C40LF9-T.js";
3
+ import "./versionChecker-Bx0n92RQ.js";
4
4
  import "./pidStore-B5vBu8Px.js";
5
5
  import "./globalPidIndex-gZuTvTBs.js";
6
6
 
@@ -1,11 +1,11 @@
1
- import "./ts-DSvAXKGk.js";
1
+ import "./ts-CU-rtV2g.js";
2
2
  import "./logger-B9h0djqx.js";
3
- import { r as getInstalledPackage } from "./versionChecker-C40LF9-T.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-Bx0n92RQ.js";
4
4
  import "./pidStore-B5vBu8Px.js";
5
5
  import "./globalPidIndex-gZuTvTBs.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-FpD7Ea6s.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-By1zXrJN.js";
7
7
  import "./remotes-BufkGk0e.js";
8
- import { c as listRecords, d as renderRawLog, f as resolveOne, g as writeToIpc, m as snapshotStatus, r as controlCodeFromName, u as readNotes } from "./subcommands-3oALzYZW.js";
8
+ import { c as listRecords, d as renderRawLog, f as resolveOne, g as writeToIpc, m as snapshotStatus, r as controlCodeFromName, u as readNotes } from "./subcommands-B3Y6r5Wd.js";
9
9
  import yargs from "yargs";
10
10
  import { mkdir, open, readFile, writeFile } from "fs/promises";
11
11
  import { homedir, hostname, userInfo } from "os";
@@ -67,13 +67,48 @@ function freshAgentEnv() {
67
67
  return env;
68
68
  }
69
69
  const DAEMON_NAME = "agent-yes";
70
- async function ensureBootAutostart(oxmgrBin) {
70
+ function resolveDaemonManager() {
71
+ const oxmgr = Bun.which("oxmgr");
72
+ const pm2 = Bun.which("pm2");
73
+ const override = process.env.AGENT_YES_DAEMON_MANAGER?.toLowerCase();
74
+ if (override === "pm2") return pm2 ? {
75
+ id: "pm2",
76
+ bin: pm2
77
+ } : null;
78
+ if (override === "oxmgr") return oxmgr ? {
79
+ id: "oxmgr",
80
+ bin: oxmgr
81
+ } : null;
82
+ return (process.platform === "win32" ? [pm2 && {
83
+ id: "pm2",
84
+ bin: pm2
85
+ }, oxmgr && {
86
+ id: "oxmgr",
87
+ bin: oxmgr
88
+ }] : [oxmgr && {
89
+ id: "oxmgr",
90
+ bin: oxmgr
91
+ }, pm2 && {
92
+ id: "pm2",
93
+ bin: pm2
94
+ }]).find((m) => !!m) ?? null;
95
+ }
96
+ function ayServeArgv(args) {
97
+ const ayBin = Bun.which("ay");
98
+ return [
99
+ ...ayBin ? process.platform === "win32" ? [ayBin] : [process.execPath, ayBin] : ["ay"],
100
+ "serve",
101
+ ...args
102
+ ];
103
+ }
104
+ async function ensureBootAutostart(mgr) {
71
105
  try {
72
- return await Bun.spawn([
73
- oxmgrBin,
106
+ const cmd = mgr.id === "oxmgr" ? [
107
+ mgr.bin,
74
108
  "service",
75
109
  "install"
76
- ], { stdio: [
110
+ ] : [mgr.bin, "save"];
111
+ return await Bun.spawn(cmd, { stdio: [
77
112
  "ignore",
78
113
  "ignore",
79
114
  "ignore"
@@ -93,22 +128,34 @@ async function spawnExit(cmd) {
93
128
  return 1;
94
129
  }
95
130
  }
96
- async function readDaemonServeArgs(oxmgrBin) {
131
+ async function readDaemonServeArgs(mgr) {
97
132
  try {
98
- const p = Bun.spawn([
99
- oxmgrBin,
100
- "status",
101
- DAEMON_NAME
102
- ], {
133
+ if (mgr.id === "oxmgr") {
134
+ const p = Bun.spawn([
135
+ mgr.bin,
136
+ "status",
137
+ DAEMON_NAME
138
+ ], {
139
+ stdout: "pipe",
140
+ stderr: "ignore"
141
+ });
142
+ const out = await new Response(p.stdout).text();
143
+ if (await p.exited !== 0) return null;
144
+ const m = /Command:\s*(.+)/.exec(out);
145
+ if (!m) return null;
146
+ const after = /\bserve\b\s*(.*)$/.exec(m[1].trim());
147
+ return after ? after[1].split(/\s+/).filter(Boolean) : [];
148
+ }
149
+ const p = Bun.spawn([mgr.bin, "jlist"], {
103
150
  stdout: "pipe",
104
151
  stderr: "ignore"
105
152
  });
106
153
  const out = await new Response(p.stdout).text();
107
154
  if (await p.exited !== 0) return null;
108
- const m = /Command:\s*(.+)/.exec(out);
109
- if (!m) return null;
110
- const after = /\bserve\b\s*(.*)$/.exec(m[1].trim());
111
- return after ? after[1].split(/\s+/).filter(Boolean) : [];
155
+ const proc = JSON.parse(out).find((x) => x.name === DAEMON_NAME);
156
+ if (!proc) return null;
157
+ const a = proc.pm2_env?.args ?? [];
158
+ return a[0] === "serve" ? a.slice(1) : a;
112
159
  } catch {
113
160
  return null;
114
161
  }
@@ -130,61 +177,68 @@ async function fetchDaemonVersion(port, token) {
130
177
  }
131
178
  }
132
179
  async function cmdServeDaemon(sub, args) {
133
- const oxmgrBin = Bun.which("oxmgr");
134
- if (!oxmgrBin) {
135
- process.stderr.write("ay serve install: oxmgr not found\n install with: cargo install oxmgr\n or: bun add -g oxmgr\n");
180
+ const mgr = resolveDaemonManager();
181
+ if (!mgr) {
182
+ process.stderr.write("ay serve install: no process manager found (need pm2 or oxmgr)\n install with: bun add -g pm2\n or: cargo install oxmgr\n");
136
183
  return 1;
137
184
  }
138
185
  if (sub === "install") {
139
186
  const token = await loadOrCreateToken(void 0);
140
- const priorArgs = await readDaemonServeArgs(oxmgrBin);
187
+ const priorArgs = await readDaemonServeArgs(mgr);
141
188
  const effArgs = args.length ? args : priorArgs ?? [];
142
189
  const current = getInstalledPackage().version;
143
190
  if (priorArgs !== null) {
144
191
  const runningVer = await fetchDaemonVersion(portFromArgs(effArgs), token);
145
192
  if (runningVer === current) {
146
- await ensureBootAutostart(oxmgrBin);
193
+ await ensureBootAutostart(mgr);
147
194
  process.stdout.write(`'${DAEMON_NAME}' already running v${current} (up to date)\n`);
148
195
  return 0;
149
196
  }
150
197
  process.stdout.write(`rolling '${DAEMON_NAME}' ${runningVer ? `v${runningVer}` : "(unknown)"} → v${current}…\n`);
151
198
  await spawnExit([
152
- oxmgrBin,
199
+ mgr.bin,
153
200
  "stop",
154
201
  DAEMON_NAME
155
202
  ]);
156
203
  await spawnExit([
157
- oxmgrBin,
204
+ mgr.bin,
158
205
  "delete",
159
206
  DAEMON_NAME
160
207
  ]);
161
208
  }
162
- const ayBin = Bun.which("ay");
163
- const serveCmd = [
164
- ...ayBin ? [process.execPath, ayBin] : ["ay"],
165
- "serve",
166
- ...effArgs
167
- ].join(" ");
168
- const code = await Bun.spawn([
169
- oxmgrBin,
209
+ const serveArgv = ayServeArgv(effArgs);
210
+ const startArgv = mgr.id === "oxmgr" ? [
211
+ mgr.bin,
170
212
  "start",
171
- serveCmd,
213
+ serveArgv.join(" "),
172
214
  "--name",
173
215
  DAEMON_NAME,
174
216
  "--restart",
175
217
  "always"
176
- ], { stdio: [
218
+ ] : [
219
+ mgr.bin,
220
+ "start",
221
+ serveArgv[0],
222
+ "--name",
223
+ DAEMON_NAME,
224
+ "--interpreter",
225
+ "none",
226
+ "--",
227
+ ...serveArgv.slice(1)
228
+ ];
229
+ const code = await Bun.spawn(startArgv, { stdio: [
177
230
  "ignore",
178
231
  "inherit",
179
232
  "inherit"
180
233
  ] }).exited;
181
234
  if (code === 0) {
182
- const onBoot = await ensureBootAutostart(oxmgrBin);
235
+ const onBoot = await ensureBootAutostart(mgr);
183
236
  const port = portFromArgs(effArgs);
184
237
  const webrtcish = effArgs.some((a) => a.startsWith("--webrtc") || a.startsWith("--share"));
185
238
  const httpish = effArgs.some((a) => a.startsWith("--http") || a.startsWith("--share")) || !effArgs.some((a) => a.startsWith("--webrtc"));
186
- process.stdout.write(`\n${priorArgs !== null ? `rolled '${DAEMON_NAME}' forward to` : `installed '${DAEMON_NAME}' as a daemon via oxmgr —`} v${current}\n`);
187
- process.stdout.write(onBoot ? `start-on-boot: enabled (oxmgr registered with the system init)\n` : `start-on-boot: not registered — run \`oxmgr service install\` to enable\n`);
239
+ process.stdout.write(`\n${priorArgs !== null ? `rolled '${DAEMON_NAME}' forward to` : `installed '${DAEMON_NAME}' as a daemon via ${mgr.id} —`} v${current}\n`);
240
+ if (mgr.id === "oxmgr") process.stdout.write(onBoot ? `start-on-boot: enabled (oxmgr registered with the system init)\n` : `start-on-boot: not registered — run \`oxmgr service install\` to enable\n`);
241
+ else process.stdout.write(onBoot ? `start-on-boot: pm2 list saved (run \`pm2 startup\` once for boot resurrect)\n` : `start-on-boot: \`pm2 save\` failed — run it manually to persist across reboots\n`);
188
242
  process.stdout.write(`token: ${token}\n\n`);
189
243
  if (httpish) {
190
244
  process.stdout.write(` ay ls ${token}@<host>:${port}\n`);
@@ -196,17 +250,25 @@ async function cmdServeDaemon(sub, args) {
196
250
  }
197
251
  return code ?? 1;
198
252
  }
199
- if (sub === "uninstall") return await Bun.spawn([
200
- oxmgrBin,
201
- "delete",
202
- DAEMON_NAME
203
- ], { stdio: [
204
- "ignore",
205
- "inherit",
206
- "inherit"
207
- ] }).exited ?? 1;
253
+ if (sub === "uninstall") {
254
+ const code = await Bun.spawn([
255
+ mgr.bin,
256
+ "delete",
257
+ DAEMON_NAME
258
+ ], { stdio: [
259
+ "ignore",
260
+ "inherit",
261
+ "inherit"
262
+ ] }).exited ?? 1;
263
+ if (mgr.id === "pm2" && code === 0) await Bun.spawn([mgr.bin, "save"], { stdio: [
264
+ "ignore",
265
+ "ignore",
266
+ "ignore"
267
+ ] }).exited;
268
+ return code;
269
+ }
208
270
  if (sub === "logs") return await Bun.spawn([
209
- oxmgrBin,
271
+ mgr.bin,
210
272
  "logs",
211
273
  DAEMON_NAME,
212
274
  ...args
@@ -234,7 +296,7 @@ Modes (default: --http):
234
296
  --share [URL] Legacy alias for --http --webrtc
235
297
 
236
298
  Options:
237
- --port N Port to listen on (default: ${DEFAULT_PORT})\n --host HOST Interface to bind (default: 127.0.0.1; use 0.0.0.0 to expose)\n --token TOKEN Auth token (auto-generated and saved if omitted)\n -d, --daemon Install these flags as a background daemon via oxmgr\n (same as: ay serve install <flags>)\n --allow-spawn Deprecated no-op — the console can always spawn agents\n --tls-cert FILE TLS certificate PEM\n --tls-key FILE TLS private key PEM\n\nSubcommands:\n ay serve install install as background daemon via oxmgr\n ay serve uninstall remove daemon\n ay serve logs view daemon logs\n\nOnce running, connect from another machine:\n ay ls <token>@<host>:${DEFAULT_PORT}\n ay remote add <alias> http://<token>@<host>:${DEFAULT_PORT}\n`);
299
+ --port N Port to listen on (default: ${DEFAULT_PORT})\n --host HOST Interface to bind (default: 127.0.0.1; use 0.0.0.0 to expose)\n --token TOKEN Auth token (auto-generated and saved if omitted)\n -d, --daemon Install these flags as a background daemon (pm2/oxmgr)\n (same as: ay serve install <flags>)\n --allow-spawn Deprecated no-op — the console can always spawn agents\n --tls-cert FILE TLS certificate PEM\n --tls-key FILE TLS private key PEM\n\nSubcommands:\n ay serve install install as background daemon (pm2 on Windows, else oxmgr)\n ay serve uninstall remove daemon\n ay serve logs view daemon logs\n\nOnce running, connect from another machine:\n ay ls <token>@<host>:${DEFAULT_PORT}\n ay remote add <alias> http://<token>@<host>:${DEFAULT_PORT}\n`);
238
300
  return 0;
239
301
  }
240
302
  const sub = rest[0];
@@ -269,7 +331,7 @@ Options:
269
331
  alias: "d",
270
332
  type: "boolean",
271
333
  default: false,
272
- description: "Install as a background daemon via oxmgr (same as: ay serve install <flags>)"
334
+ description: "Install as a background daemon (same as: ay serve install <flags>)"
273
335
  }).option("allow-spawn", {
274
336
  type: "boolean",
275
337
  default: false,
@@ -758,7 +820,7 @@ Options:
758
820
  const webrtcVal = argv.webrtc ?? argv.share;
759
821
  const explicitUrl = typeof webrtcVal === "string" && webrtcVal.startsWith("webrtc://") ? webrtcVal : void 0;
760
822
  try {
761
- const { startShare, loadOrCreateShareRoom } = await import("./share-BM-H85FE.js");
823
+ const { startShare, loadOrCreateShareRoom } = await import("./share-DmT_gDbf.js");
762
824
  const { link, close } = await startShare({
763
825
  url: explicitUrl ?? await loadOrCreateShareRoom(),
764
826
  localFetch: apiFetch,
@@ -789,4 +851,4 @@ Options:
789
851
 
790
852
  //#endregion
791
853
  export { cmdServe };
792
- //# sourceMappingURL=serve-CBvx2LeV.js.map
854
+ //# sourceMappingURL=serve-DQ6V7e1I.js.map
@@ -69,7 +69,7 @@ async function cmdSetup(rest) {
69
69
  if (!existsSync$1(abs)) process.stderr.write(` note: that directory doesn't exist yet — create it, or agents spawned there will fail\n`);
70
70
  if (noShare) return 0;
71
71
  process.stdout.write(`\nsharing this machine to agent-yes.com…\n`);
72
- const { cmdServe } = await import("./serve-CBvx2LeV.js");
72
+ const { cmdServe } = await import("./serve-DQ6V7e1I.js");
73
73
  return cmdServe([
74
74
  "install",
75
75
  "--share",
@@ -79,4 +79,4 @@ async function cmdSetup(rest) {
79
79
 
80
80
  //#endregion
81
81
  export { cmdSetup };
82
- //# sourceMappingURL=setup-C7BNSEaG.js.map
82
+ //# sourceMappingURL=setup-B6Fus6JD.js.map
@@ -31,27 +31,53 @@ function parseShareUrl(s) {
31
31
  host: m[3]
32
32
  };
33
33
  }
34
+ async function linkFromBunCache() {
35
+ const { existsSync, symlinkSync, mkdirSync, readdirSync } = await import("fs");
36
+ const path = (await import("path")).default;
37
+ const { createRequire } = await import("module");
38
+ const require = createRequire(import.meta.url);
39
+ const pkg = path.dirname(require.resolve("node-datachannel/package.json"));
40
+ const bin = path.join(pkg, "build", "Release", "node_datachannel.node");
41
+ const cacheRoot = path.join((await import("os")).homedir(), ".bun", "install", "cache");
42
+ if (existsSync(bin) && existsSync(cacheRoot)) for (const d of readdirSync(cacheRoot)) {
43
+ if (!d.startsWith("node-datachannel@")) continue;
44
+ const dst = path.join(cacheRoot, d, "build", "Release");
45
+ mkdirSync(dst, { recursive: true });
46
+ const link = path.join(dst, "node_datachannel.node");
47
+ if (!existsSync(link)) symlinkSync(bin, link);
48
+ }
49
+ }
50
+ async function fetchPrebuiltAddon() {
51
+ try {
52
+ const path = (await import("path")).default;
53
+ const { createRequire } = await import("module");
54
+ const require = createRequire(import.meta.url);
55
+ const ndDir = path.dirname(require.resolve("node-datachannel/package.json"));
56
+ const binJs = require.resolve("prebuild-install/bin.js", { paths: [ndDir] });
57
+ const { spawnSync } = await import("child_process");
58
+ process.stderr.write("fetching node-datachannel prebuilt binary (one-time)…\n");
59
+ return spawnSync(process.execPath, [
60
+ binJs,
61
+ "-r",
62
+ "napi"
63
+ ], {
64
+ cwd: ndDir,
65
+ stdio: "ignore"
66
+ }).status === 0;
67
+ } catch {
68
+ return false;
69
+ }
70
+ }
34
71
  async function importRTC() {
35
72
  try {
36
73
  return (await import("node-datachannel/polyfill")).RTCPeerConnection;
37
- } catch {
74
+ } catch (firstErr) {
75
+ await linkFromBunCache().catch(() => {});
38
76
  try {
39
- const { existsSync, symlinkSync, mkdirSync, readdirSync } = await import("fs");
40
- const path = (await import("path")).default;
41
- const { createRequire } = await import("module");
42
- const require = createRequire(import.meta.url);
43
- const pkg = path.dirname(require.resolve("node-datachannel/package.json"));
44
- const bin = path.join(pkg, "build", "Release", "node_datachannel.node");
45
- const cacheRoot = path.join((await import("os")).homedir(), ".bun", "install", "cache");
46
- if (existsSync(bin) && existsSync(cacheRoot)) for (const d of readdirSync(cacheRoot)) {
47
- if (!d.startsWith("node-datachannel@")) continue;
48
- const dst = path.join(cacheRoot, d, "build", "Release");
49
- mkdirSync(dst, { recursive: true });
50
- const link = path.join(dst, "node_datachannel.node");
51
- if (!existsSync(link)) symlinkSync(bin, link);
52
- }
77
+ return (await import("node-datachannel/polyfill")).RTCPeerConnection;
53
78
  } catch {}
54
- return (await import("node-datachannel/polyfill")).RTCPeerConnection;
79
+ if (await fetchPrebuiltAddon()) return (await import("node-datachannel/polyfill")).RTCPeerConnection;
80
+ throw firstErr;
55
81
  }
56
82
  }
57
83
  /** Start the share bridge. Resolves once signaling is connected; runs until the
@@ -215,4 +241,4 @@ async function startShare(opts) {
215
241
 
216
242
  //#endregion
217
243
  export { loadOrCreateShareRoom, startShare };
218
- //# sourceMappingURL=share-BM-H85FE.js.map
244
+ //# sourceMappingURL=share-DmT_gDbf.js.map
@@ -1,6 +1,6 @@
1
1
  import "./logger-B9h0djqx.js";
2
2
  import "./globalPidIndex-gZuTvTBs.js";
3
3
  import "./remotes-BufkGk0e.js";
4
- import { a as finalizedLines, c as listRecords, d as renderRawLog, f as resolveOne, g as writeToIpc, h as stopTipForCli, i as cursorAbs, l as matchKeyword, m as snapshotStatus, n as cmdHelp, o as isPidAlive, p as runSubcommand, r as controlCodeFromName, s as isSubcommand, t as GRACEFUL_EXIT_COMMANDS, u as readNotes } from "./subcommands-3oALzYZW.js";
4
+ import { a as finalizedLines, c as listRecords, d as renderRawLog, f as resolveOne, g as writeToIpc, h as stopTipForCli, i as cursorAbs, l as matchKeyword, m as snapshotStatus, n as cmdHelp, o as isPidAlive, p as runSubcommand, r as controlCodeFromName, s as isSubcommand, t as GRACEFUL_EXIT_COMMANDS, u as readNotes } from "./subcommands-B3Y6r5Wd.js";
5
5
 
6
6
  export { cmdHelp, isSubcommand, runSubcommand };
@@ -231,11 +231,11 @@ async function runSubcommand(argv) {
231
231
  case "restart": return await cmdRestart(rest);
232
232
  case "note": return await cmdNote(rest);
233
233
  case "serve": {
234
- const { cmdServe } = await import("./serve-CBvx2LeV.js");
234
+ const { cmdServe } = await import("./serve-DQ6V7e1I.js");
235
235
  return cmdServe(rest);
236
236
  }
237
237
  case "setup": {
238
- const { cmdSetup } = await import("./setup-C7BNSEaG.js");
238
+ const { cmdSetup } = await import("./setup-B6Fus6JD.js");
239
239
  return cmdSetup(rest);
240
240
  }
241
241
  case "remote": {
@@ -1680,4 +1680,4 @@ async function cmdStatus(rest) {
1680
1680
 
1681
1681
  //#endregion
1682
1682
  export { finalizedLines as a, listRecords as c, renderRawLog as d, resolveOne as f, writeToIpc as g, stopTipForCli as h, cursorAbs as i, matchKeyword as l, snapshotStatus as m, cmdHelp as n, isPidAlive as o, runSubcommand as p, controlCodeFromName as r, isSubcommand as s, GRACEFUL_EXIT_COMMANDS as t, readNotes as u };
1683
- //# sourceMappingURL=subcommands-3oALzYZW.js.map
1683
+ //# sourceMappingURL=subcommands-B3Y6r5Wd.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-C40LF9-T.js";
2
+ import { r as getInstalledPackage } from "./versionChecker-Bx0n92RQ.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-B5vBu8Px.js";
@@ -1715,4 +1715,4 @@ function sleep(ms) {
1715
1715
 
1716
1716
  //#endregion
1717
1717
  export { removeControlCharacters as a, AgentContext as i, agentYes as n, config as r, CLIS_CONFIG as t };
1718
- //# sourceMappingURL=ts-DSvAXKGk.js.map
1718
+ //# sourceMappingURL=ts-CU-rtV2g.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.118.1";
10
+ var version = "1.119.0";
11
11
 
12
12
  //#endregion
13
13
  //#region ts/versionChecker.ts
@@ -221,4 +221,4 @@ async function displayVersion() {
221
221
 
222
222
  //#endregion
223
223
  export { versionString as i, displayVersion as n, getInstalledPackage as r, checkAndAutoUpdate as t };
224
- //# sourceMappingURL=versionChecker-C40LF9-T.js.map
224
+ //# sourceMappingURL=versionChecker-Bx0n92RQ.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.118.1",
3
+ "version": "1.119.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",
package/ts/serve.ts CHANGED
@@ -98,20 +98,53 @@ function freshAgentEnv(): Record<string, string> {
98
98
 
99
99
  const DAEMON_NAME = "agent-yes";
100
100
 
101
- // Register the oxmgr daemon with the platform init system (launchd on macOS,
102
- // systemd on Linux, Task Scheduler on Windows) so managed processes — including
103
- // the agent-yes daemon come back after a *reboot*, not just a crash. Idempotent:
104
- // a no-op if the service is already installed. Best-effort: returns false on any
105
- // failure (e.g. a system-level systemd unit that needs sudo) without aborting the
106
- // install the process is still managed, just not boot-persistent.
107
- async function ensureBootAutostart(oxmgrBin: string): Promise<boolean> {
101
+ type DaemonManager = { id: "oxmgr" | "pm2"; bin: string };
102
+
103
+ // Pick the process manager used to daemonize `ay serve`. oxmgr's daemon talks
104
+ // over a fixed TCP port; on Windows a crashed daemon routinely leaves the
105
+ // socket orphaned on a dead PID, which wedges every subsequent oxmgr command
106
+ // with "daemon did not become ready in time". pm2's named-pipe daemon does not
107
+ // have that failure mode, so we prefer pm2 on Windows. Elsewhere oxmgr stays
108
+ // the default. AGENT_YES_DAEMON_MANAGER=pm2|oxmgr forces a choice.
109
+ function resolveDaemonManager(): DaemonManager | null {
110
+ const oxmgr = Bun.which("oxmgr");
111
+ const pm2 = Bun.which("pm2");
112
+ const override = process.env.AGENT_YES_DAEMON_MANAGER?.toLowerCase();
113
+ if (override === "pm2") return pm2 ? { id: "pm2", bin: pm2 } : null;
114
+ if (override === "oxmgr") return oxmgr ? { id: "oxmgr", bin: oxmgr } : null;
115
+ const order: Array<DaemonManager | null> =
116
+ process.platform === "win32"
117
+ ? [pm2 && { id: "pm2", bin: pm2 }, oxmgr && { id: "oxmgr", bin: oxmgr }]
118
+ : [oxmgr && { id: "oxmgr", bin: oxmgr }, pm2 && { id: "pm2", bin: pm2 }];
119
+ return order.find((m): m is DaemonManager => !!m) ?? null;
120
+ }
121
+
122
+ // Resolve the argv that launches `ay serve …` from the daemon. The daemon's
123
+ // environment may not have ~/.bun/bin on PATH, so we use an absolute path.
124
+ // On Windows the `ay` bin is a self-contained launcher (ay.exe) we exec
125
+ // directly; on POSIX it's a `#!/usr/bin/env bun` script we run through bun.
126
+ function ayServeArgv(args: string[]): string[] {
127
+ const ayBin = Bun.which("ay");
128
+ const launcher = ayBin
129
+ ? process.platform === "win32"
130
+ ? [ayBin]
131
+ : [process.execPath, ayBin]
132
+ : ["ay"];
133
+ return [...launcher, "serve", ...args];
134
+ }
135
+
136
+ // Register the daemon with the platform init system so it comes back after a
137
+ // *reboot*, not just a crash. oxmgr wires launchd/systemd/Task Scheduler via
138
+ // `oxmgr service install`; pm2 persists its process list with `pm2 save` (a
139
+ // once-installed `pm2 startup` hook then resurrects it on boot). Idempotent and
140
+ // best-effort: returns false on any failure without aborting the install — the
141
+ // process is still crash-managed, just not guaranteed boot-persistent.
142
+ async function ensureBootAutostart(mgr: DaemonManager): Promise<boolean> {
108
143
  try {
109
- // --system defaults to "auto" (launchd/systemd/Task Scheduler by platform);
110
- // it's a `service`-level flag, so passing it after `install` is rejected.
111
- const svc = Bun.spawn([oxmgrBin, "service", "install"], {
112
- stdio: ["ignore", "ignore", "ignore"],
113
- });
114
- return (await svc.exited) === 0;
144
+ // oxmgr's --system defaults to "auto" (launchd/systemd/Task Scheduler); it's
145
+ // a `service`-level flag, so it goes before the subcommand, not after.
146
+ const cmd = mgr.id === "oxmgr" ? [mgr.bin, "service", "install"] : [mgr.bin, "save"];
147
+ return (await Bun.spawn(cmd, { stdio: ["ignore", "ignore", "ignore"] }).exited) === 0;
115
148
  } catch {
116
149
  return false;
117
150
  }
@@ -125,18 +158,29 @@ async function spawnExit(cmd: string[]): Promise<number> {
125
158
  }
126
159
  }
127
160
 
128
- // The `serve` args the running daemon was started with, parsed out of oxmgr's
129
- // stored command line (`… ay serve --share --port 7433`). null when no daemon is
130
- // registered. Lets a bare `ay serve install` re-launch with the SAME args.
131
- async function readDaemonServeArgs(oxmgrBin: string): Promise<string[] | null> {
161
+ // The `serve` args the running daemon was started with, so a bare
162
+ // `ay serve install` can re-launch with the SAME args. null when no daemon is
163
+ // registered. oxmgr stores the full command line (`… ay serve --share`); pm2
164
+ // keeps the post-`--` argv in pm2_env.args (with a leading "serve" we strip).
165
+ async function readDaemonServeArgs(mgr: DaemonManager): Promise<string[] | null> {
132
166
  try {
133
- const p = Bun.spawn([oxmgrBin, "status", DAEMON_NAME], { stdout: "pipe", stderr: "ignore" });
167
+ if (mgr.id === "oxmgr") {
168
+ const p = Bun.spawn([mgr.bin, "status", DAEMON_NAME], { stdout: "pipe", stderr: "ignore" });
169
+ const out = await new Response(p.stdout).text();
170
+ if ((await p.exited) !== 0) return null;
171
+ const m = /Command:\s*(.+)/.exec(out);
172
+ if (!m) return null;
173
+ const after = /\bserve\b\s*(.*)$/.exec(m[1]!.trim());
174
+ return after ? after[1]!.split(/\s+/).filter(Boolean) : [];
175
+ }
176
+ const p = Bun.spawn([mgr.bin, "jlist"], { stdout: "pipe", stderr: "ignore" });
134
177
  const out = await new Response(p.stdout).text();
135
178
  if ((await p.exited) !== 0) return null;
136
- const m = /Command:\s*(.+)/.exec(out);
137
- if (!m) return null;
138
- const after = /\bserve\b\s*(.*)$/.exec(m[1]!.trim());
139
- return after ? after[1]!.split(/\s+/).filter(Boolean) : [];
179
+ const list = JSON.parse(out) as Array<{ name?: string; pm2_env?: { args?: string[] } }>;
180
+ const proc = list.find((x) => x.name === DAEMON_NAME);
181
+ if (!proc) return null;
182
+ const a = proc.pm2_env?.args ?? [];
183
+ return a[0] === "serve" ? a.slice(1) : a;
140
184
  } catch {
141
185
  return null;
142
186
  }
@@ -164,12 +208,12 @@ async function fetchDaemonVersion(port: number, token: string): Promise<string |
164
208
  }
165
209
 
166
210
  async function cmdServeDaemon(sub: string, args: string[]): Promise<number> {
167
- const oxmgrBin = Bun.which("oxmgr");
168
- if (!oxmgrBin) {
211
+ const mgr = resolveDaemonManager();
212
+ if (!mgr) {
169
213
  process.stderr.write(
170
- "ay serve install: oxmgr not found\n" +
171
- " install with: cargo install oxmgr\n" +
172
- " or: bun add -g oxmgr\n",
214
+ "ay serve install: no process manager found (need pm2 or oxmgr)\n" +
215
+ " install with: bun add -g pm2\n" +
216
+ " or: cargo install oxmgr\n",
173
217
  );
174
218
  return 1;
175
219
  }
@@ -181,7 +225,7 @@ async function cmdServeDaemon(sub: string, args: string[]): Promise<number> {
181
225
  // started with (so a bare `ay serve install` stays "the same daemon"), unless
182
226
  // new args are given. The persisted room + token mean the share link is
183
227
  // unchanged across the restart.
184
- const priorArgs = await readDaemonServeArgs(oxmgrBin);
228
+ const priorArgs = await readDaemonServeArgs(mgr);
185
229
  const effArgs = args.length ? args : (priorArgs ?? []);
186
230
  const current = getInstalledPackage().version;
187
231
 
@@ -189,34 +233,42 @@ async function cmdServeDaemon(sub: string, args: string[]): Promise<number> {
189
233
  // A daemon already exists — only disturb it if it's actually outdated.
190
234
  const runningVer = await fetchDaemonVersion(portFromArgs(effArgs), token);
191
235
  if (runningVer === current) {
192
- await ensureBootAutostart(oxmgrBin);
236
+ await ensureBootAutostart(mgr);
193
237
  process.stdout.write(`'${DAEMON_NAME}' already running v${current} (up to date)\n`);
194
238
  return 0;
195
239
  }
196
240
  // Outdated (or unreachable/too-old to report) → graceful roll-forward.
197
- // `oxmgr stop` sends SIGTERM, which cmdServe handles cleanly (closing share
241
+ // `stop` sends SIGTERM, which cmdServe handles cleanly (closing share
198
242
  // peers so browsers reconnect fast), then we re-create with the new binary.
199
243
  process.stdout.write(
200
244
  `rolling '${DAEMON_NAME}' ${runningVer ? `v${runningVer}` : "(unknown)"} → v${current}…\n`,
201
245
  );
202
- await spawnExit([oxmgrBin, "stop", DAEMON_NAME]);
203
- await spawnExit([oxmgrBin, "delete", DAEMON_NAME]);
246
+ await spawnExit([mgr.bin, "stop", DAEMON_NAME]);
247
+ await spawnExit([mgr.bin, "delete", DAEMON_NAME]);
204
248
  }
205
249
 
206
- // Build the ay serve command with forwarded args (port, host, --webrtc, etc.).
207
- // Absolute paths: oxmgr's daemon environment may not have ~/.bun/bin in
208
- // PATH, so a bare `ay` (or its `#!/usr/bin/env bun` shebang) fails to spawn.
209
- const ayBin = Bun.which("ay");
210
- const serveCmd = [...(ayBin ? [process.execPath, ayBin] : ["ay"]), "serve", ...effArgs].join(
211
- " ",
212
- );
213
- const proc = Bun.spawn(
214
- [oxmgrBin, "start", serveCmd, "--name", DAEMON_NAME, "--restart", "always"],
215
- { stdio: ["ignore", "inherit", "inherit"] },
216
- );
250
+ // oxmgr takes the command as one string; pm2 takes the binary plus its
251
+ // args after `--`. Both auto-restart on crash by default (pm2) / via the
252
+ // explicit flag (oxmgr).
253
+ const serveArgv = ayServeArgv(effArgs);
254
+ const startArgv =
255
+ mgr.id === "oxmgr"
256
+ ? [mgr.bin, "start", serveArgv.join(" "), "--name", DAEMON_NAME, "--restart", "always"]
257
+ : [
258
+ mgr.bin,
259
+ "start",
260
+ serveArgv[0]!,
261
+ "--name",
262
+ DAEMON_NAME,
263
+ "--interpreter",
264
+ "none",
265
+ "--",
266
+ ...serveArgv.slice(1),
267
+ ];
268
+ const proc = Bun.spawn(startArgv, { stdio: ["ignore", "inherit", "inherit"] });
217
269
  const code = await proc.exited;
218
270
  if (code === 0) {
219
- const onBoot = await ensureBootAutostart(oxmgrBin);
271
+ const onBoot = await ensureBootAutostart(mgr);
220
272
  const port = portFromArgs(effArgs);
221
273
  // Mirror cmdServe's mode resolution: webrtc-only daemons open no HTTP port.
222
274
  const webrtcish = effArgs.some((a) => a.startsWith("--webrtc") || a.startsWith("--share"));
@@ -224,13 +276,20 @@ async function cmdServeDaemon(sub: string, args: string[]): Promise<number> {
224
276
  effArgs.some((a) => a.startsWith("--http") || a.startsWith("--share")) ||
225
277
  !effArgs.some((a) => a.startsWith("--webrtc"));
226
278
  process.stdout.write(
227
- `\n${priorArgs !== null ? `rolled '${DAEMON_NAME}' forward to` : `installed '${DAEMON_NAME}' as a daemon via oxmgr —`} v${current}\n`,
228
- );
229
- process.stdout.write(
230
- onBoot
231
- ? `start-on-boot: enabled (oxmgr registered with the system init)\n`
232
- : `start-on-boot: not registered — run \`oxmgr service install\` to enable\n`,
279
+ `\n${priorArgs !== null ? `rolled '${DAEMON_NAME}' forward to` : `installed '${DAEMON_NAME}' as a daemon via ${mgr.id} —`} v${current}\n`,
233
280
  );
281
+ if (mgr.id === "oxmgr")
282
+ process.stdout.write(
283
+ onBoot
284
+ ? `start-on-boot: enabled (oxmgr registered with the system init)\n`
285
+ : `start-on-boot: not registered — run \`oxmgr service install\` to enable\n`,
286
+ );
287
+ else
288
+ process.stdout.write(
289
+ onBoot
290
+ ? `start-on-boot: pm2 list saved (run \`pm2 startup\` once for boot resurrect)\n`
291
+ : `start-on-boot: \`pm2 save\` failed — run it manually to persist across reboots\n`,
292
+ );
234
293
  process.stdout.write(`token: ${token}\n\n`);
235
294
  if (httpish) {
236
295
  process.stdout.write(` ay ls ${token}@<host>:${port}\n`);
@@ -249,14 +308,18 @@ async function cmdServeDaemon(sub: string, args: string[]): Promise<number> {
249
308
  }
250
309
 
251
310
  if (sub === "uninstall") {
252
- const proc = Bun.spawn([oxmgrBin, "delete", DAEMON_NAME], {
311
+ const proc = Bun.spawn([mgr.bin, "delete", DAEMON_NAME], {
253
312
  stdio: ["ignore", "inherit", "inherit"],
254
313
  });
255
- return (await proc.exited) ?? 1;
314
+ const code = (await proc.exited) ?? 1;
315
+ // Drop it from the persisted pm2 list too, so `pm2 resurrect` won't revive it.
316
+ if (mgr.id === "pm2" && code === 0)
317
+ await Bun.spawn([mgr.bin, "save"], { stdio: ["ignore", "ignore", "ignore"] }).exited;
318
+ return code;
256
319
  }
257
320
 
258
321
  if (sub === "logs") {
259
- const proc = Bun.spawn([oxmgrBin, "logs", DAEMON_NAME, ...args], {
322
+ const proc = Bun.spawn([mgr.bin, "logs", DAEMON_NAME, ...args], {
260
323
  stdio: ["ignore", "inherit", "inherit"],
261
324
  });
262
325
  return (await proc.exited) ?? 1;
@@ -287,13 +350,13 @@ export async function cmdServe(rest: string[]): Promise<number> {
287
350
  ` --port N Port to listen on (default: ${DEFAULT_PORT})\n` +
288
351
  ` --host HOST Interface to bind (default: 127.0.0.1; use 0.0.0.0 to expose)\n` +
289
352
  ` --token TOKEN Auth token (auto-generated and saved if omitted)\n` +
290
- ` -d, --daemon Install these flags as a background daemon via oxmgr\n` +
353
+ ` -d, --daemon Install these flags as a background daemon (pm2/oxmgr)\n` +
291
354
  ` (same as: ay serve install <flags>)\n` +
292
355
  ` --allow-spawn Deprecated no-op — the console can always spawn agents\n` +
293
356
  ` --tls-cert FILE TLS certificate PEM\n` +
294
357
  ` --tls-key FILE TLS private key PEM\n\n` +
295
358
  `Subcommands:\n` +
296
- ` ay serve install install as background daemon via oxmgr\n` +
359
+ ` ay serve install install as background daemon (pm2 on Windows, else oxmgr)\n` +
297
360
  ` ay serve uninstall remove daemon\n` +
298
361
  ` ay serve logs view daemon logs\n\n` +
299
362
  `Once running, connect from another machine:\n` +
@@ -337,7 +400,7 @@ export async function cmdServe(rest: string[]): Promise<number> {
337
400
  alias: "d",
338
401
  type: "boolean",
339
402
  default: false,
340
- description: "Install as a background daemon via oxmgr (same as: ay serve install <flags>)",
403
+ description: "Install as a background daemon (same as: ay serve install <flags>)",
341
404
  })
342
405
  .option("allow-spawn", {
343
406
  type: "boolean",
@@ -350,7 +413,7 @@ export async function cmdServe(rest: string[]): Promise<number> {
350
413
 
351
414
  const argv = await y.parseAsync();
352
415
 
353
- // --daemon/-d: install these exact flags as the oxmgr daemon instead of
416
+ // --daemon/-d: install these exact flags as the background daemon instead of
354
417
  // serving in the foreground (sugar for `ay serve install <flags>`).
355
418
  if (argv.daemon) {
356
419
  const fwd = rest.filter((a) => a !== "--daemon" && a !== "-d");
package/ts/share.ts CHANGED
@@ -60,31 +60,63 @@ function parseShareUrl(s: string): { room: string; token: string; host: string }
60
60
  // from the global cache where the prebuilt .node isn't linked; this best-effort
61
61
  // shim symlinks it in before we import. In a normal npm/bunx install the binary
62
62
  // resolves from node_modules and the first import just works.
63
+ async function linkFromBunCache(): Promise<void> {
64
+ const { existsSync, symlinkSync, mkdirSync, readdirSync } = await import("fs");
65
+ const path = (await import("path")).default;
66
+ const { createRequire } = await import("module");
67
+ const require = createRequire(import.meta.url);
68
+ const pkg = path.dirname(require.resolve("node-datachannel/package.json"));
69
+ const bin = path.join(pkg, "build", "Release", "node_datachannel.node");
70
+ const cacheRoot = path.join((await import("os")).homedir(), ".bun", "install", "cache");
71
+ if (existsSync(bin) && existsSync(cacheRoot)) {
72
+ for (const d of readdirSync(cacheRoot)) {
73
+ if (!d.startsWith("node-datachannel@")) continue;
74
+ const dst = path.join(cacheRoot, d, "build", "Release");
75
+ mkdirSync(dst, { recursive: true });
76
+ const link = path.join(dst, "node_datachannel.node");
77
+ if (!existsSync(link)) symlinkSync(bin, link);
78
+ }
79
+ }
80
+ }
81
+
82
+ // `bunx agent-yes` / `bun add -g agent-yes` skip node-datachannel's install
83
+ // script (bun only honors trustedDependencies from the *root* package, and there
84
+ // agent-yes is a dependency), so the prebuilt .node is never downloaded and
85
+ // `--webrtc`/`--share` can't load the addon. Fetch it on demand with the
86
+ // prebuild-install CLI that ships in node-datachannel's dependency tree — the
87
+ // same `prebuild-install -r napi` its install script would have run.
88
+ async function fetchPrebuiltAddon(): Promise<boolean> {
89
+ try {
90
+ const path = (await import("path")).default;
91
+ const { createRequire } = await import("module");
92
+ const require = createRequire(import.meta.url);
93
+ const ndDir = path.dirname(require.resolve("node-datachannel/package.json"));
94
+ const binJs = require.resolve("prebuild-install/bin.js", { paths: [ndDir] });
95
+ const { spawnSync } = await import("child_process");
96
+ process.stderr.write("fetching node-datachannel prebuilt binary (one-time)…\n");
97
+ // process.execPath is bun (or node) — both execute the prebuild-install CLI.
98
+ const res = spawnSync(process.execPath, [binJs, "-r", "napi"], { cwd: ndDir, stdio: "ignore" });
99
+ return res.status === 0;
100
+ } catch {
101
+ return false;
102
+ }
103
+ }
104
+
63
105
  async function importRTC(): Promise<any> {
64
106
  try {
65
107
  return (await import("node-datachannel/polyfill")).RTCPeerConnection;
66
- } catch {
108
+ } catch (firstErr) {
109
+ // Heal 1: symlink a built .node from the bun global cache into the resolved pkg.
110
+ await linkFromBunCache().catch(() => {});
67
111
  try {
68
- const { existsSync, symlinkSync, mkdirSync, readdirSync } = await import("fs");
69
- const path = (await import("path")).default;
70
- const { createRequire } = await import("module");
71
- const require = createRequire(import.meta.url);
72
- const pkg = path.dirname(require.resolve("node-datachannel/package.json"));
73
- const bin = path.join(pkg, "build", "Release", "node_datachannel.node");
74
- const cacheRoot = path.join((await import("os")).homedir(), ".bun", "install", "cache");
75
- if (existsSync(bin) && existsSync(cacheRoot)) {
76
- for (const d of readdirSync(cacheRoot)) {
77
- if (!d.startsWith("node-datachannel@")) continue;
78
- const dst = path.join(cacheRoot, d, "build", "Release");
79
- mkdirSync(dst, { recursive: true });
80
- const link = path.join(dst, "node_datachannel.node");
81
- if (!existsSync(link)) symlinkSync(bin, link);
82
- }
83
- }
112
+ return (await import("node-datachannel/polyfill")).RTCPeerConnection;
84
113
  } catch {
85
- /* fall throughrethrow the original import error below */
114
+ /* still missingtry downloading the prebuilt binary below */
86
115
  }
87
- return (await import("node-datachannel/polyfill")).RTCPeerConnection;
116
+ // Heal 2: the prebuilt binary was never downloaded — fetch it, then retry.
117
+ if (await fetchPrebuiltAddon())
118
+ return (await import("node-datachannel/polyfill")).RTCPeerConnection;
119
+ throw firstErr;
88
120
  }
89
121
  }
90
122
 
package/ts/subcommands.ts CHANGED
Binary file
@@ -1,8 +0,0 @@
1
- import "./ts-DSvAXKGk.js";
2
- import "./logger-B9h0djqx.js";
3
- import "./versionChecker-C40LF9-T.js";
4
- import "./pidStore-B5vBu8Px.js";
5
- import "./globalPidIndex-gZuTvTBs.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-FpD7Ea6s.js";
7
-
8
- export { SUPPORTED_CLIS };