agent-yes 1.298.1 → 1.299.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.
Files changed (45) hide show
  1. package/dist/{SUPPORTED_CLIS-AzChegaJ.js → SUPPORTED_CLIS-BIlQQJa6.js} +3 -3
  2. package/dist/{SUPPORTED_CLIS-sxjBFTrE.js → SUPPORTED_CLIS-Ct9reIJH.js} +2 -2
  3. package/dist/{agentShare-CDOvU64K.js → agentShare-uzFuaLUH.js} +4 -4
  4. package/dist/{callback-DBOgmPV6.js → callback-BxTZx3xJ.js} +3 -3
  5. package/dist/{callback-Dr5rqkUu.js → callback-DRrURxmb.js} +4 -4
  6. package/dist/cli.js +7 -7
  7. package/dist/{cmdPs-DKuMlynW.js → cmdPs-BGIWbeBM.js} +4 -4
  8. package/dist/index.js +2 -2
  9. package/dist/{notifyDaemon-Ceyhz4el.js → notifyDaemon-EEbnpoYp.js} +4 -4
  10. package/dist/{parentPingLoop-C0hekeg6.js → parentPingLoop-C1XXpKK7.js} +2 -2
  11. package/dist/remotes-BDMnvGI6.js +5 -0
  12. package/dist/{remotes-5P__pAXA.js → remotes-DrYe_nfw.js} +101 -18
  13. package/dist/{rustBinary-BW3BGZ4y.js → rustBinary--pof-MTj.js} +2 -2
  14. package/dist/{rustBinary-0cD4pQIE.js → rustBinary-B7rq3nuz.js} +2 -2
  15. package/dist/{schedule-BRC5cDkf.js → schedule-BFUe9-Mf.js} +4 -4
  16. package/dist/{serve-BD-7GaKa.js → serve-Q4dnZc5l.js} +40 -21
  17. package/dist/{setup-Dad2A_-o.js → setup-aEuGSFjB.js} +3 -3
  18. package/dist/shareCmd-DkITELaM.js +415 -0
  19. package/dist/{subcommands--9gcc0ew.js → subcommands-CUWPMI_r.js} +36 -22
  20. package/dist/{subcommands-ClQCwxvk.js → subcommands-CuRZt3X6.js} +3 -3
  21. package/dist/{systemPathLink-VV-Vm6y2.js → systemPathLink-DoyBuRQq.js} +1 -1
  22. package/dist/{terminal-Bam4XVWi.js → terminal-CUn1_oPd.js} +2 -2
  23. package/dist/{todoCli-BDttv8mk.js → todoCli-DwYlxIAY.js} +1 -1
  24. package/dist/{tray-DWWsVS7Y.js → tray-BcpHVeMk.js} +1 -1
  25. package/dist/{trayApp-DOgsH0en.js → trayApp-BHwAJFzl.js} +2 -2
  26. package/dist/trayApp-ucuB_j5l.js +5 -0
  27. package/dist/{ts-BePSXUQl.js → ts-oIxnyQbE.js} +3 -3
  28. package/dist/{versionChecker-D6zM6Pdv.js → versionChecker-DOgDaagD.js} +2 -2
  29. package/dist/{webrtcLink-CnQf9pmu.js → webrtcLink-DFRyWNMs.js} +2 -2
  30. package/dist/{webrtcRemote-0RGrSwqd.js → webrtcRemote-Cd4vTrgv.js} +2 -2
  31. package/dist/{widget-DJgiOfgE.js → widget-CuagzQwz.js} +3 -3
  32. package/dist/{ws-Covfyaxn.js → ws-DcJBGzQP.js} +2 -2
  33. package/dist/{ws-DjGQGPCq.js → ws-ID7-zDiJ.js} +4 -4
  34. package/lab/ui/index.html +9 -3
  35. package/package.json +1 -1
  36. package/ts/remotes.ts +128 -13
  37. package/ts/serve.ts +22 -0
  38. package/ts/shareCmd.ts +369 -0
  39. package/ts/shareCore.spec.ts +236 -0
  40. package/ts/shareCore.ts +148 -0
  41. package/ts/subcommands.spec.ts +19 -0
  42. package/ts/subcommands.ts +33 -5
  43. package/ts/webrtcLink.ts +3 -1
  44. package/dist/remotes-CY69MeQB.js +0 -5
  45. package/dist/trayApp-s2VuJUP4.js +0 -5
@@ -0,0 +1,415 @@
1
+ import { networkInterfaces } from "node:os";
2
+ import { stdin, stdout } from "node:process";
3
+ import { createInterface } from "node:readline/promises";
4
+
5
+ //#region ts/shareCore.ts
6
+ const SHARE_MODES = [
7
+ "local",
8
+ "portless",
9
+ "lan",
10
+ "tailscale",
11
+ "webrtc"
12
+ ];
13
+ const DEFAULT_SHARE_PORT = 7432;
14
+ const DEFAULT_TS_PATH = "/ay";
15
+ function flagValue(args, flag) {
16
+ for (let i = 0; i < args.length; i++) {
17
+ const a = args[i];
18
+ if (a === flag) return args[i + 1];
19
+ if (a.startsWith(`${flag}=`)) return a.slice(flag.length + 1);
20
+ }
21
+ }
22
+ function hasFlag(args, flag) {
23
+ return args.some((a) => a === flag || a.startsWith(`${flag}=`));
24
+ }
25
+ function dropFlagWithValue(args, flag) {
26
+ const out = [];
27
+ for (let i = 0; i < args.length; i++) {
28
+ const a = args[i];
29
+ if (a === flag) {
30
+ i++;
31
+ continue;
32
+ }
33
+ if (a.startsWith(`${flag}=`)) continue;
34
+ out.push(a);
35
+ }
36
+ return out;
37
+ }
38
+ /**
39
+ * The daemon args a mode needs, built on top of whatever the daemon already runs
40
+ * with (so sharing over one more way never drops an existing one). `prior` null =
41
+ * no daemon installed. Returns `prior` unchanged when it already fits.
42
+ */
43
+ function planDaemonArgs(prior, mode, defaultPort = DEFAULT_SHARE_PORT) {
44
+ let args = [...prior ?? []];
45
+ const hasWebrtc = hasFlag(args, "--webrtc") || hasFlag(args, "--share");
46
+ const hasHttp = hasFlag(args, "--http") || hasFlag(args, "--share") || !hasWebrtc;
47
+ if (mode === "webrtc") {
48
+ if (!hasWebrtc) {
49
+ if (prior !== null && hasHttp && !hasFlag(args, "--http")) args.push("--http");
50
+ args.push("--webrtc");
51
+ }
52
+ return args;
53
+ }
54
+ if (!hasHttp) args.push("--http");
55
+ if (mode === "portless") return dropFlagWithValue(args, "--port");
56
+ if (flagValue(args, "--port") === void 0) args.push("--port", String(defaultPort));
57
+ if (mode === "lan" && flagValue(args, "--host") !== "0.0.0.0") {
58
+ args = dropFlagWithValue(args, "--host");
59
+ args.push("--host", "0.0.0.0");
60
+ }
61
+ return args;
62
+ }
63
+ /** First private-range IPv4 (not loopback, not Tailscale's 100.64/10 CGNAT). */
64
+ function pickLanIp(ifaces) {
65
+ for (const list of Object.values(ifaces)) for (const a of list ?? []) {
66
+ if (a.family !== "IPv4" || a.internal) continue;
67
+ const [x, y] = a.address.split(".").map(Number);
68
+ if (x === 10 || x === 192 && y === 168 || x === 172 && y >= 16 && y <= 31) return a.address;
69
+ }
70
+ return null;
71
+ }
72
+ /** MagicDNS name of this node from `tailscale status --json`, or null when not up. */
73
+ function tailscaleDnsName(status) {
74
+ if (!status || status.BackendState !== "Running") return null;
75
+ return String(status.Self?.DNSName ?? "").replace(/\.$/, "") || null;
76
+ }
77
+ /**
78
+ * Is `https://<dns>/<mount>` already proxied to our loopback port? Tailscale
79
+ * strips the mount before forwarding, so the target must be the port's root.
80
+ */
81
+ function findTailscaleRoute(serveStatus, dns, mount, port) {
82
+ const handlers = serveStatus?.Web?.[`${dns}:443`]?.Handlers ?? {};
83
+ const want = mount.replace(/\/+$/, "");
84
+ for (const [p, h] of Object.entries(handlers)) {
85
+ if (p.replace(/\/+$/, "") !== want) continue;
86
+ const proxy = String(h?.Proxy ?? "");
87
+ const m = /^(?:https?:\/\/)?(?:127\.0\.0\.1|localhost|\[::1\]):(\d+)(\/.*)?$/.exec(proxy);
88
+ if (m && Number(m[1]) === port && (!m[2] || m[2] === "/")) return { status: "ok" };
89
+ return {
90
+ status: "conflict",
91
+ proxy
92
+ };
93
+ }
94
+ return { status: "missing" };
95
+ }
96
+ function tailscaleServeArgv(mount, port) {
97
+ return [
98
+ "tailscale",
99
+ "serve",
100
+ "--bg",
101
+ "--https=443",
102
+ `--set-path=${mount}`,
103
+ `http://127.0.0.1:${port}`
104
+ ];
105
+ }
106
+ function tailscaleServeOffArgv(mount) {
107
+ return [
108
+ "tailscale",
109
+ "serve",
110
+ "--https=443",
111
+ `--set-path=${mount}`,
112
+ "off"
113
+ ];
114
+ }
115
+ /** How to install portless with what's on PATH (npm first, as its docs say). */
116
+ function portlessInstallArgv(has) {
117
+ if (has("npm")) return [
118
+ "npm",
119
+ "install",
120
+ "-g",
121
+ "portless"
122
+ ];
123
+ if (has("bun")) return [
124
+ "bun",
125
+ "add",
126
+ "-g",
127
+ "portless"
128
+ ];
129
+ return null;
130
+ }
131
+ /** The one URL for the web console AND `ay connect` (HTTP modes). */
132
+ function httpShareUrl(base, token) {
133
+ return `${base.replace(/\/+$/, "")}/#k=${encodeURIComponent(token)}`;
134
+ }
135
+
136
+ //#endregion
137
+ //#region ts/shareCmd.ts
138
+ async function runJson(cmd, timeoutMs = 4e3) {
139
+ try {
140
+ const p = Bun.spawn(cmd, {
141
+ stdout: "pipe",
142
+ stderr: "ignore"
143
+ });
144
+ let timer;
145
+ const text = await Promise.race([new Response(p.stdout).text(), new Promise((r) => timer = setTimeout(() => r(null), timeoutMs))]);
146
+ clearTimeout(timer);
147
+ if (text === null) {
148
+ p.kill();
149
+ return null;
150
+ }
151
+ return JSON.parse(text);
152
+ } catch {
153
+ return null;
154
+ }
155
+ }
156
+ async function detectTailscale() {
157
+ if (!Bun.which("tailscale")) return null;
158
+ const dns = tailscaleDnsName(await runJson([
159
+ "tailscale",
160
+ "status",
161
+ "--json"
162
+ ]));
163
+ if (!dns) return null;
164
+ return {
165
+ dns,
166
+ serveStatus: await runJson([
167
+ "tailscale",
168
+ "serve",
169
+ "status",
170
+ "--json"
171
+ ])
172
+ };
173
+ }
174
+ async function ask(q) {
175
+ const rl = createInterface({
176
+ input: stdin,
177
+ output: stdout
178
+ });
179
+ try {
180
+ return (await rl.question(q)).trim();
181
+ } finally {
182
+ rl.close();
183
+ }
184
+ }
185
+ const showCmd = (argv) => argv.map((a) => /[\s'"$]/.test(a) ? `'${a}'` : a).join(" ");
186
+ /**
187
+ * Print the exact commands, then ask [y/N] (default NO). `--yes` answers yes;
188
+ * without a TTY and without --yes it's a no, and the caller prints the manual
189
+ * steps. Returns whether the user approved.
190
+ */
191
+ async function confirmRun(why, cmds, yes) {
192
+ process.stderr.write(`\n${why}\n${cmds.map((c) => ` $ ${showCmd(c)}\n`).join("")}`);
193
+ if (yes) {
194
+ process.stderr.write(`(--yes: running it)\n`);
195
+ return true;
196
+ }
197
+ if (!(stdin.isTTY && stdout.isTTY)) return false;
198
+ return /^y(es)?$/i.test(await ask(`run ${cmds.length > 1 ? "these" : "this"}? [y/N]: `));
199
+ }
200
+ async function runInherit(argv) {
201
+ try {
202
+ return await Bun.spawn(argv, { stdio: [
203
+ "inherit",
204
+ "inherit",
205
+ "inherit"
206
+ ] }).exited ?? 1;
207
+ } catch (e) {
208
+ process.stderr.write(`failed to run ${argv[0]}: ${e.message}\n`);
209
+ return 1;
210
+ }
211
+ }
212
+ /** GET <base>/api/version with the token — the end-to-end health check. */
213
+ async function probe(base, token) {
214
+ try {
215
+ const r = await fetch(`${base}/api/version`, {
216
+ headers: { Authorization: `Bearer ${token}` },
217
+ signal: AbortSignal.timeout(8e3)
218
+ });
219
+ return r.ok ? null : `HTTP ${r.status}`;
220
+ } catch (e) {
221
+ return e.message;
222
+ }
223
+ }
224
+ const HELP = `Usage: ay share [local|portless|lan|tailscale|webrtc] [options]
225
+ ay share status
226
+
227
+ Make this machine's agents reachable and print ONE share URL: open it in a
228
+ browser for the web console, or pass it to \`ay connect\` on another machine.
229
+ With no mode (in a terminal) it asks which way to share.
230
+
231
+ Modes:
232
+ local http://127.0.0.1:<port> — this machine only
233
+ portless https://agent-yes.localhost — this machine, via portless (3rd-party)
234
+ lan http://<lan-ip>:<port> — anyone on your network (plain HTTP)
235
+ tailscale https://<machine>.<tailnet>.ts.net/ay/ — your tailnet devices,
236
+ via \`tailscale serve\` (3rd-party)
237
+ webrtc https://agent-yes.com/w/#… — anywhere, end-to-end encrypted
238
+ through the agent-yes.com signaling server
239
+
240
+ Every command ay would run for you (daemon install, tailscale, portless) is
241
+ shown first and needs a y at a [y/N] prompt.
242
+
243
+ Options:
244
+ --port N HTTP port (default: ${DEFAULT_SHARE_PORT}, or the daemon's)\n --path /ay tailscale mount path (default: ${DEFAULT_TS_PATH})\n -y, --yes approve the shown commands without prompting\n --json print {mode, url} as JSON\n\nThe URL carries this host's serve token: whoever holds it can read and steer\nevery agent here. Rotate: rm ~/.agent-yes/.serve-token && ay serve install\n`;
245
+ async function cmdShareStatus(mount) {
246
+ const { inspectServeDaemon } = await import("./serve-Q4dnZc5l.js");
247
+ const [d, ts] = await Promise.all([inspectServeDaemon(), detectTailscale()]);
248
+ const line = (k, v) => process.stdout.write(`${k.padEnd(11)}${v}\n`);
249
+ if (d.args === null) {
250
+ line("daemon:", "not installed — run `ay share`");
251
+ return 1;
252
+ }
253
+ line("daemon:", `ay serve ${d.args.join(" ") || "(defaults: portless)"}`);
254
+ const webrtc = hasFlag(d.args, "--webrtc") || hasFlag(d.args, "--share");
255
+ line("http:", d.port ? d.httpUp ? `up on 127.0.0.1:${d.port}` : `DOWN (127.0.0.1:${d.port})` : "off");
256
+ if (d.consoleUrl) line("portless:", d.httpUp ? d.consoleUrl.replace(/#.*/, "") : "DOWN");
257
+ line("webrtc:", webrtc ? "on (agent-yes.com room)" : "off");
258
+ if (!ts) {
259
+ line("tailscale:", Bun.which("tailscale") ? "not running" : "not installed");
260
+ return d.httpUp || webrtc ? 0 : 1;
261
+ }
262
+ const route = d.port ? findTailscaleRoute(ts.serveStatus, ts.dns, mount, d.port) : { status: "missing" };
263
+ if (route.status !== "ok") {
264
+ line("tailscale:", route.status === "conflict" ? `${mount} → ${route.proxy} (not ay)` : `no ${mount} route`);
265
+ return d.httpUp || webrtc ? 0 : 1;
266
+ }
267
+ const base = `https://${ts.dns}${mount}`;
268
+ const err = await probe(base, d.token);
269
+ line("tailscale:", err ? `route ok, but ${base}/ FAILS: ${err}` : `${base}/ ok`);
270
+ return err ? 1 : 0;
271
+ }
272
+ async function cmdShare(rest) {
273
+ if (rest.includes("-h") || rest.includes("--help")) {
274
+ process.stdout.write(HELP);
275
+ return 0;
276
+ }
277
+ const json = rest.includes("--json");
278
+ const yes = rest.includes("-y") || rest.includes("--yes");
279
+ const portArg = flagValue(rest, "--port");
280
+ const mount = "/" + (flagValue(rest, "--path") ?? DEFAULT_TS_PATH).replace(/^\/+|\/+$/g, "");
281
+ const valueIdx = new Set(["--port", "--path"].map((f) => rest.indexOf(f)).filter((i) => i >= 0).map((i) => i + 1));
282
+ const positional = rest.filter((a, i) => !a.startsWith("-") && !valueIdx.has(i));
283
+ const say = (s) => (json ? process.stderr : process.stdout).write(s);
284
+ if (positional[0] === "status") return cmdShareStatus(mount);
285
+ let mode = positional[0];
286
+ if (mode && !SHARE_MODES.includes(mode)) {
287
+ process.stderr.write(`ay share: unknown mode '${mode}' — one of ${SHARE_MODES.join(", ")}\n`);
288
+ return 1;
289
+ }
290
+ const { inspectServeDaemon, cmdServe } = await import("./serve-Q4dnZc5l.js");
291
+ const [daemon, ts] = await Promise.all([inspectServeDaemon(), detectTailscale()]);
292
+ const lanIp = pickLanIp(networkInterfaces());
293
+ if (!mode) {
294
+ const opts = [
295
+ {
296
+ mode: "local",
297
+ desc: "http://127.0.0.1 — this machine only",
298
+ ok: true
299
+ },
300
+ {
301
+ mode: "portless",
302
+ desc: "https://agent-yes.localhost — this machine (3rd-party portless)",
303
+ ok: true
304
+ },
305
+ {
306
+ mode: "lan",
307
+ desc: lanIp ? `http://${lanIp}:<port> — your network, plain HTTP` : "no LAN address found",
308
+ ok: !!lanIp
309
+ },
310
+ {
311
+ mode: "tailscale",
312
+ desc: ts ? `https://${ts.dns}${mount}/ — your tailnet` : "tailscale not installed/running",
313
+ ok: !!ts
314
+ },
315
+ {
316
+ mode: "webrtc",
317
+ desc: "agent-yes.com link — anywhere, e2e encrypted",
318
+ ok: true
319
+ }
320
+ ];
321
+ const def = ts ? 4 : 1;
322
+ if (!(stdin.isTTY && stdout.isTTY)) {
323
+ process.stderr.write(`ay share: pick a mode — ${SHARE_MODES.join(" | ")}\n\n` + HELP);
324
+ return 1;
325
+ }
326
+ say(`How should this machine be shared?\n`);
327
+ opts.forEach((o, i) => say(` ${i + 1}) ${o.mode.padEnd(10)} ${o.desc}${o.ok ? "" : " (unavailable)"}\n`));
328
+ const ans = await ask(`choose [${def}]: `);
329
+ const picked = opts[(ans ? Number(ans) : def) - 1] ?? opts.find((o) => o.mode === ans);
330
+ if (!picked || !picked.ok) {
331
+ process.stderr.write(`ay share: '${ans}' is not an available choice\n`);
332
+ return 1;
333
+ }
334
+ mode = picked.mode;
335
+ }
336
+ if (mode === "lan" && !lanIp) {
337
+ process.stderr.write(`ay share: no private LAN IPv4 address found on this machine\n`);
338
+ return 1;
339
+ }
340
+ if (mode === "tailscale" && !ts) {
341
+ process.stderr.write("ay share: tailscale isn't running here — install it and `tailscale up` first\n https://tailscale.com/download\n");
342
+ return 1;
343
+ }
344
+ if (mode === "portless" && !Bun.which("portless")) {
345
+ const argv = portlessInstallArgv((b) => !!Bun.which(b));
346
+ if (!argv) {
347
+ process.stderr.write(`ay share: portless isn't installed and neither npm nor bun is on PATH\n`);
348
+ return 1;
349
+ }
350
+ if (!await confirmRun("portless (third-party) isn't installed. To install it:", [argv], yes)) {
351
+ process.stderr.write(`not installed — run it yourself, then \`ay share portless\`\n`);
352
+ return 1;
353
+ }
354
+ if (await runInherit(argv) !== 0 || !Bun.which("portless")) {
355
+ process.stderr.write(`ay share: installing portless failed\n`);
356
+ return 1;
357
+ }
358
+ }
359
+ const want = planDaemonArgs(daemon.args, mode, portArg ? Number(portArg) : void 0);
360
+ if (portArg && mode !== "webrtc" && mode !== "portless" && flagValue(want, "--port") !== portArg) want.splice(0, want.length, ...dropFlagWithValue(want, "--port"), "--port", portArg);
361
+ const changed = JSON.stringify(want) !== JSON.stringify(daemon.args);
362
+ const down = mode !== "webrtc" && !daemon.httpUp;
363
+ let state = daemon;
364
+ if (changed || down) {
365
+ if (!await confirmRun((daemon.args === null ? `no serve daemon yet — sharing needs one:` : changed ? `the serve daemon runs \`ay serve ${daemon.args.join(" ") || "(defaults)"}\`; ${mode} needs:` : `the serve daemon isn't answering — restart it:`) + (mode === "portless" ? `\n(the daemon then runs under third-party portless: \`portless agent-yes ay serve …\`)` : ""), [[
366
+ "ay",
367
+ "serve",
368
+ "install",
369
+ ...want
370
+ ]], yes)) {
371
+ process.stderr.write(`not changed — run the command above, then \`ay share ${mode}\`\n`);
372
+ return 1;
373
+ }
374
+ const code = await cmdServe(["install", ...want]);
375
+ if (code !== 0) return code;
376
+ state = await inspectServeDaemon();
377
+ }
378
+ let url;
379
+ const port = state.port ?? (portArg ? Number(portArg) : DEFAULT_SHARE_PORT);
380
+ if (mode === "webrtc") {
381
+ const { loadOrCreateShareRoom, shareLinkFromRoomUrl } = await import("./share-Bmnd_qT0.js");
382
+ url = shareLinkFromRoomUrl(await loadOrCreateShareRoom());
383
+ } else if (mode === "portless") url = state.consoleUrl ?? httpShareUrl("https://agent-yes.localhost", state.token);
384
+ else if (mode === "local") url = httpShareUrl(`http://127.0.0.1:${port}`, state.token);
385
+ else if (mode === "lan") url = httpShareUrl(`http://${lanIp}:${port}`, state.token);
386
+ else {
387
+ const base = `https://${ts.dns}${mount}`;
388
+ url = httpShareUrl(base, state.token);
389
+ const route = findTailscaleRoute(ts.serveStatus, ts.dns, mount, port);
390
+ if (route.status !== "ok") {
391
+ const cmds = [...route.status === "conflict" ? [tailscaleServeOffArgv(mount)] : [], tailscaleServeArgv(mount, port)];
392
+ if (await confirmRun((route.status === "conflict" ? `${mount} on your tailnet already proxies to ${route.proxy}; to point it at ay instead` : `to route https://${ts.dns}${mount}/ to ay (tailnet-only, TLS by tailscale)`) + `, ay will run third-party tailscale:`, cmds, yes)) {
393
+ for (const c of cmds) if (await runInherit(c) !== 0) {
394
+ process.stderr.write(`ay share: \`${showCmd(c)}\` failed. "Access denied"? allow your user once:\n sudo tailscale set --operator=$USER\n`);
395
+ return 1;
396
+ }
397
+ } else process.stderr.write(`not changed — run the command(s) above yourself, then \`ay share status\`\n`);
398
+ }
399
+ const err = await probe(base, state.token);
400
+ say(err ? `\nhealth: ${base}/ not reachable yet (${err}) — check \`ay share status\`\n` : `\nhealth: ${base}/ ok\n`);
401
+ }
402
+ if (json) {
403
+ process.stdout.write(JSON.stringify({
404
+ mode,
405
+ url
406
+ }) + "\n");
407
+ return 0;
408
+ }
409
+ say(`\nshare URL (web console + CLI, same token):\n ${url}\n\nopen it in a browser, or from another machine:\n ay connect '${url}'\n` + (mode === "lan" ? `\nnote: plain HTTP — the token is visible to anyone sniffing this network.\n` : ``) + `anyone with this URL can read and steer every agent here.\n`);
410
+ return 0;
411
+ }
412
+
413
+ //#endregion
414
+ export { cmdShare };
415
+ //# sourceMappingURL=shareCmd-DkITELaM.js.map
@@ -7,8 +7,8 @@ import { t as loadSharedCliDefaults } from "./configShared-DKTgiz7K.js";
7
7
  import { n as localHost, r as localUser, t as formatIdentity } from "./identity-CKRuYUFi.js";
8
8
  import { n as isWorkingScreen, r as parseMenu, t as classifyNeedsInput } from "./needsInput-BHopZGM8.js";
9
9
  import { S as postmortemStartedAt, _ as filterSinceSeq, a as getCursor, b as maxSeq, f as readInbox, o as heartbeatWatcher, p as setCursor, r as clearWatcher, s as hostId, v as filterSinceTs, y as filterUnread } from "./notifyStore-2SWKGwZI.js";
10
- import { n as isWebrtcSpec } from "./webrtcLink-CnQf9pmu.js";
11
- import { a as resolveRemoteSpec, i as readRemotes } from "./remotes-5P__pAXA.js";
10
+ import { n as isWebrtcSpec } from "./webrtcLink-DFRyWNMs.js";
11
+ import { c as resolveRemoteSpec, s as readRemotes } from "./remotes-DrYe_nfw.js";
12
12
  import { execFile } from "child_process";
13
13
  import ms from "ms";
14
14
  import yargs from "yargs";
@@ -1454,7 +1454,12 @@ const SUBCOMMANDS = new Set([
1454
1454
  "dsh-legacy",
1455
1455
  "help"
1456
1456
  ]);
1457
- const MANAGER_SUBCOMMANDS = new Set(["setup", "ws"]);
1457
+ const MANAGER_SUBCOMMANDS = new Set([
1458
+ "setup",
1459
+ "ws",
1460
+ "share",
1461
+ "connect"
1462
+ ]);
1458
1463
  const IDLE_THRESHOLD_MS = 60 * 1e3;
1459
1464
  const STUCK_THRESHOLD_MS = (() => {
1460
1465
  const n = Number(process.env.AGENT_YES_STUCK_MS);
@@ -1680,7 +1685,7 @@ async function runSubcommand(argv) {
1680
1685
  switch (sub) {
1681
1686
  case "ls":
1682
1687
  case "list": return await cmdLs(rest);
1683
- case "ps": return await (await import("./cmdPs-DKuMlynW.js")).cmdPs(rest);
1688
+ case "ps": return await (await import("./cmdPs-BGIWbeBM.js")).cmdPs(rest);
1684
1689
  case "status": return await cmdStatus(rest);
1685
1690
  case "whoami": return await cmdWhoami(rest);
1686
1691
  case "result": return await cmdResult(rest);
@@ -1718,7 +1723,7 @@ async function runSubcommand(argv) {
1718
1723
  return sub === "ask" ? await runAskSubcommand(rest, deps) : await runAnswerSubcommand(rest, deps);
1719
1724
  }
1720
1725
  case "todo": {
1721
- const { runTodoSubcommand } = await import("./todoCli-BDttv8mk.js");
1726
+ const { runTodoSubcommand } = await import("./todoCli-DwYlxIAY.js");
1722
1727
  return runTodoSubcommand(rest);
1723
1728
  }
1724
1729
  case "ch":
@@ -1727,47 +1732,55 @@ async function runSubcommand(argv) {
1727
1732
  return cmdCh(rest);
1728
1733
  }
1729
1734
  case "term": {
1730
- const { cmdTerm } = await import("./terminal-Bam4XVWi.js");
1735
+ const { cmdTerm } = await import("./terminal-CUn1_oPd.js");
1731
1736
  return cmdTerm(rest);
1732
1737
  }
1733
1738
  case "widget": {
1734
- const { cmdWidget } = await import("./widget-DJgiOfgE.js");
1739
+ const { cmdWidget } = await import("./widget-CuagzQwz.js");
1735
1740
  return cmdWidget(rest);
1736
1741
  }
1737
1742
  case "mint": {
1738
- const { cmdMint } = await import("./widget-DJgiOfgE.js");
1743
+ const { cmdMint } = await import("./widget-CuagzQwz.js");
1739
1744
  return cmdMint(rest);
1740
1745
  }
1741
1746
  case "serve": {
1742
- const { cmdServe } = await import("./serve-BD-7GaKa.js");
1747
+ const { cmdServe } = await import("./serve-Q4dnZc5l.js");
1743
1748
  return cmdServe(rest);
1744
1749
  }
1745
1750
  case "tray": {
1746
- const { cmdTray } = await import("./trayApp-s2VuJUP4.js");
1751
+ const { cmdTray } = await import("./trayApp-ucuB_j5l.js");
1747
1752
  return cmdTray(rest);
1748
1753
  }
1749
1754
  case "setup": {
1750
- const { cmdSetup } = await import("./setup-Dad2A_-o.js");
1755
+ const { cmdSetup } = await import("./setup-aEuGSFjB.js");
1751
1756
  return cmdSetup(rest);
1752
1757
  }
1753
1758
  case "ws": {
1754
- const { cmdWs } = await import("./ws-DjGQGPCq.js");
1759
+ const { cmdWs } = await import("./ws-ID7-zDiJ.js");
1755
1760
  return cmdWs(rest);
1756
1761
  }
1757
1762
  case "schedule": {
1758
- const { cmdSchedule } = await import("./schedule-BRC5cDkf.js");
1763
+ const { cmdSchedule } = await import("./schedule-BFUe9-Mf.js");
1759
1764
  return cmdSchedule(rest);
1760
1765
  }
1761
1766
  case "remote": {
1762
- const { cmdRemote } = await import("./remotes-CY69MeQB.js");
1767
+ const { cmdRemote } = await import("./remotes-BDMnvGI6.js");
1763
1768
  return cmdRemote(rest);
1764
1769
  }
1770
+ case "share": {
1771
+ const { cmdShare } = await import("./shareCmd-DkITELaM.js");
1772
+ return cmdShare(rest);
1773
+ }
1774
+ case "connect": {
1775
+ const { cmdConnect } = await import("./remotes-BDMnvGI6.js");
1776
+ return cmdConnect(rest);
1777
+ }
1765
1778
  case "expose": {
1766
1779
  const { cmdExpose } = await import("./expose-BlddYYx9.js");
1767
1780
  return cmdExpose(rest);
1768
1781
  }
1769
1782
  case "callback": {
1770
- const { cmdCallback } = await import("./callback-Dr5rqkUu.js");
1783
+ const { cmdCallback } = await import("./callback-DRrURxmb.js");
1771
1784
  return cmdCallback(rest);
1772
1785
  }
1773
1786
  case "reap":
@@ -1778,7 +1791,7 @@ async function runSubcommand(argv) {
1778
1791
  return await cmdDsh(rest);
1779
1792
  }
1780
1793
  case "gc": {
1781
- const { gcOldBinaryDirs } = await import("./rustBinary-0cD4pQIE.js");
1794
+ const { gcOldBinaryDirs } = await import("./rustBinary-B7rq3nuz.js");
1782
1795
  const { gcLogs } = await import("./globalPidIndex-DC93JhHQ.js");
1783
1796
  const bins = gcOldBinaryDirs();
1784
1797
  const logs = await gcLogs();
@@ -1837,9 +1850,10 @@ As an agent, you can:
1837
1850
  async function cmdHelp(managerCommands = true) {
1838
1851
  const setupLine = managerCommands ? ` ay setup guided setup: pick a workspace, share to agent-yes.com\n` : ``;
1839
1852
  const wsLines = managerCommands ? " ay ws ls [--status] list <owner>/<repo>/tree/<branch> workspaces\n ay ws new <owner>/<repo>[@branch] clone/refresh a workspace (ay ws help for more)\n" : ``;
1853
+ const shareAliasNote = managerCommands ? `` : ` (\`ay\` only — \`cy share\`/\`cy connect\` are prompts)\n`;
1840
1854
  const self = process.env.AGENT_YES_PID ? await resolveSender() : null;
1841
1855
  const agentSection = self ? await buildAgentContextSection(self) : "";
1842
- process.stdout.write(agentSection + "ay - agent-yes CLI\n\nManagement:\n ay ls [keyword] list running agents\n ay ps [keyword] per-agent CPU/RSS, rolled up over each\n agent's whole process tree, + box vitals\n ay tail [-f] [-n N] <keyword> last N lines (96), -f to follow\n ay tail <keyword> --until TEXT block until TEXT is printed, then exit 0\n [--timeout 10m] [-q] [--regex] (1 = agent exited without it, 2 = no match,\n [--fail-on TEXT] [--count N] 3 = --fail-on hit first)\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 hist [-n 6] [--all] [--json] past agent conversations (claude/codex\n transcripts, incl. exited sessions);\n this cwd unless --all\n ay send <keyword> <msg> send a message (keyword '.' = agent in this cwd)\n ay msgs [keyword] [--in|--out] inter-agent message log (sent + received)\n ay ch mk|join|send|read|tail <topic> local-first E2E channels: AI ↔ humans on a topic (ay ch help)\n ay term embed <pid> <script> to embed a live read-only agent terminal in a page (ay term help)\n ay widget ls | read selection|dom read an opted-in page widget's context (selection/DOM) (ay widget help)\n ay mint <target> --caps ... mint a scoped, short-TTL capability token (embeddable in a page)\n ay key <keyword> <key...> send raw keystrokes (down/up/enter/esc/…) — drives menus\n ay select <keyword> <N> pick option N of a needs_input selection menu\n ay attach <keyword> interactive attach (detach: Ctrl-\\)\n ay stop <keyword> graceful shutdown (/exit for claude/codex)\n ay exit <keyword> [reason] graceful shutdown, recording who/why (= 'ay send <kw> exit')\n ay restart <keyword> [--fresh] stop (if live) + relaunch resuming the session; --fresh replays the prompt\n ay status <keyword> agent status snapshot\n ay notify watch --unread get notified when sub-agents finish/stuck/crash (writes to inbox)\n ay whoami [--json] (inside an agent) your own registry identity + reply address\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 ay gc reclaim old-version binary cache dirs + stale session logs\n ay dsh-legacy [args...] launch the DeepSeek Harness terminal client (dsh-tui)\n" + wsLines + "\nRemote:\n" + setupLine + " 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 expose <port> share localhost:<port> at https://<id>.agent-yes.com (private link)\n ay callback --expires 7d mint an embeddable message-me widget for one agent\n ay ls <token>@<host>:<port> connect inline (no alias needed)\n ay send <token>@<host>:<port>:<kw> <msg>\n\nRun an agent (naming a CLI is what launches one — bare 'ay' shows this help):\n ay <claude|codex|...> [options] -- [prompt]\n ay claude -- \"fix the bug in auth.ts\"\n cy [options] -- [prompt] shortcut for 'ay claude' (bare 'cy' starts claude)\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");
1856
+ process.stdout.write(agentSection + "ay - agent-yes CLI\n\nManagement:\n ay ls [keyword] list running agents\n ay ps [keyword] per-agent CPU/RSS, rolled up over each\n agent's whole process tree, + box vitals\n ay tail [-f] [-n N] <keyword> last N lines (96), -f to follow\n ay tail <keyword> --until TEXT block until TEXT is printed, then exit 0\n [--timeout 10m] [-q] [--regex] (1 = agent exited without it, 2 = no match,\n [--fail-on TEXT] [--count N] 3 = --fail-on hit first)\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 hist [-n 6] [--all] [--json] past agent conversations (claude/codex\n transcripts, incl. exited sessions);\n this cwd unless --all\n ay send <keyword> <msg> send a message (keyword '.' = agent in this cwd)\n ay msgs [keyword] [--in|--out] inter-agent message log (sent + received)\n ay ch mk|join|send|read|tail <topic> local-first E2E channels: AI ↔ humans on a topic (ay ch help)\n ay term embed <pid> <script> to embed a live read-only agent terminal in a page (ay term help)\n ay widget ls | read selection|dom read an opted-in page widget's context (selection/DOM) (ay widget help)\n ay mint <target> --caps ... mint a scoped, short-TTL capability token (embeddable in a page)\n ay key <keyword> <key...> send raw keystrokes (down/up/enter/esc/…) — drives menus\n ay select <keyword> <N> pick option N of a needs_input selection menu\n ay attach <keyword> interactive attach (detach: Ctrl-\\)\n ay stop <keyword> graceful shutdown (/exit for claude/codex)\n ay exit <keyword> [reason] graceful shutdown, recording who/why (= 'ay send <kw> exit')\n ay restart <keyword> [--fresh] stop (if live) + relaunch resuming the session; --fresh replays the prompt\n ay status <keyword> agent status snapshot\n ay notify watch --unread get notified when sub-agents finish/stuck/crash (writes to inbox)\n ay whoami [--json] (inside an agent) your own registry identity + reply address\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 ay gc reclaim old-version binary cache dirs + stale session logs\n ay dsh-legacy [args...] launch the DeepSeek Harness terminal client (dsh-tui)\n" + wsLines + "\nRemote:\n" + setupLine + " ay share [local|lan|tailscale|webrtc] share this machine: one URL for web console + CLI\n ay connect <share-url> [alias] save another machine's share URL as a remote\n" + shareAliasNote + " 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 expose <port> share localhost:<port> at https://<id>.agent-yes.com (private link)\n ay callback --expires 7d mint an embeddable message-me widget for one agent\n ay ls <token>@<host>:<port> connect inline (no alias needed)\n ay send <token>@<host>:<port>:<kw> <msg>\n\nRun an agent (naming a CLI is what launches one — bare 'ay' shows this help):\n ay <claude|codex|...> [options] -- [prompt]\n ay claude -- \"fix the bug in auth.ts\"\n cy [options] -- [prompt] shortcut for 'ay claude' (bare 'cy' starts claude)\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");
1843
1857
  return 0;
1844
1858
  }
1845
1859
  function matchKeyword(record, keyword) {
@@ -2332,7 +2346,7 @@ async function fetchRemoteRecordsRaw(url, token, opts, onReachable) {
2332
2346
  let base = url;
2333
2347
  let bearer = token;
2334
2348
  if (isWebrtcSpec(url)) {
2335
- const { startWebrtcBridge } = await import("./webrtcRemote-0RGrSwqd.js");
2349
+ const { startWebrtcBridge } = await import("./webrtcRemote-Cd4vTrgv.js");
2336
2350
  bridge = await startWebrtcBridge(url);
2337
2351
  base = bridge.baseUrl;
2338
2352
  bearer = bridge.token;
@@ -4879,7 +4893,7 @@ async function cmdAttach(rest) {
4879
4893
  const winsizeDir = path.join(ayHome, "winsize");
4880
4894
  await mkdir(winsizeDir, { recursive: true });
4881
4895
  const winsizePath = path.join(winsizeDir, String(record.pid));
4882
- const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-BD-7GaKa.js");
4896
+ const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-Q4dnZc5l.js");
4883
4897
  const daemonBase = await resolveDaemonHttpBase().catch(() => null);
4884
4898
  const daemonToken = daemonBase ? await loadTokenReadOnly().catch(() => null) ?? "" : "";
4885
4899
  const capViewer = `attach:${process.pid}`;
@@ -5606,7 +5620,7 @@ async function cmdNotify(rest) {
5606
5620
  }
5607
5621
  const ensure = async () => {
5608
5622
  if (!argv["ensure-daemon"]) return;
5609
- const { ensureDaemon } = await import("./notifyDaemon-Ceyhz4el.js");
5623
+ const { ensureDaemon } = await import("./notifyDaemon-EEbnpoYp.js");
5610
5624
  await ensureDaemon().catch(() => null);
5611
5625
  };
5612
5626
  await heartbeatWatcher(parent, selfStartedAt);
@@ -5680,7 +5694,7 @@ async function cmdNotifyCursor(args) {
5680
5694
  }
5681
5695
  async function cmdNotifyd(rest) {
5682
5696
  const sub = rest[0] ?? "status";
5683
- const daemon = await import("./notifyDaemon-Ceyhz4el.js");
5697
+ const daemon = await import("./notifyDaemon-EEbnpoYp.js");
5684
5698
  switch (sub) {
5685
5699
  case "run": return daemon.runDaemon();
5686
5700
  case "once": return daemon.runDaemon({ once: true });
@@ -5707,4 +5721,4 @@ async function cmdNotifyd(rest) {
5707
5721
 
5708
5722
  //#endregion
5709
5723
  export { sendPayloadCapError as $, isUnknownManagerToken as A, readLogForRender as B, finalizedLines as C, isPidAlive as D, isExitRequest as E, listRecords as F, renderLogTailLines as G, readPtysize as H, matchKeyword as I, resolveOne as J, renderRawLog as K, menuSelectKeys as L, isUserTyping as M, lastReadAt as N, isSlashCommand as O, lastStdinAt as P, runSubcommand as Q, probeStdinReachable as R, extractTaskCounts as S, isBareManagerInvocation as T, recentMessageEdges as U, readNotes as V, recentReadEdges as W, resolveResumeArgs as X, resolveReadWindow as Y, restartHintLines as Z, envelopeAttribution as _, SEND_BODY_MAX_CHARS as a, writeKeysPaced as at, extractMenu as b, backoffWhileTyping as c, framePaste as ct, cmdHelp as d, buildAgentForest as dt, snapshotStatus as et, confirmStdinUnreachable as f, flattenForest as ft, deriveLiveStatus as g, deriveLiveState as h, READ_WINDOW_MS as i, waitForLogQuiet as it, isUnreachableWriteErrno as j, isSubcommand as k, buildEnvelope as l, shouldFramePaste as lt, cursorAbs as m, MAX_RENDER_BYTES as n, stopTipForCli as nt, SEND_EXIT_UNREACHABLE as o, writeToIpc as ot, controlCodeFromName as p, renderRawLogLines as q, READ_PAGE_DEFAULT as r, submitAndConfirm as rt, TYPING_WINDOW_MS as s, withIpcLock as st, GRACEFUL_EXIT_COMMANDS as t, stdinActivityPath as tt, cliDefaults as u, TYPING_BADGE as ut, envelopeCostFor as v, isAgentStuck as w, extractNeedsInput as x, extractBadges as y, readAgentPtysize as z };
5710
- //# sourceMappingURL=subcommands--9gcc0ew.js.map
5724
+ //# sourceMappingURL=subcommands-CUWPMI_r.js.map
@@ -5,9 +5,9 @@ import "./pidStore-DXWqzTSz.js";
5
5
  import "./messageLog-Brx3w6zT.js";
6
6
  import "./e2e-z1xpwSAg.js";
7
7
  import "./configShared-DKTgiz7K.js";
8
- import { $ as sendPayloadCapError, A as isUnknownManagerToken, B as readLogForRender, C as finalizedLines, D as isPidAlive, E as isExitRequest, F as listRecords, G as renderLogTailLines, H as readPtysize, I as matchKeyword, J as resolveOne, K as renderRawLog, L as menuSelectKeys, M as isUserTyping, N as lastReadAt, O as isSlashCommand, P as lastStdinAt, Q as runSubcommand, R as probeStdinReachable, S as extractTaskCounts, T as isBareManagerInvocation, U as recentMessageEdges, V as readNotes, W as recentReadEdges, X as resolveResumeArgs, Y as resolveReadWindow, Z as restartHintLines, _ as envelopeAttribution, a as SEND_BODY_MAX_CHARS, at as writeKeysPaced, b as extractMenu, c as backoffWhileTyping, d as cmdHelp, et as snapshotStatus, f as confirmStdinUnreachable, g as deriveLiveStatus, h as deriveLiveState, i as READ_WINDOW_MS, it as waitForLogQuiet, j as isUnreachableWriteErrno, k as isSubcommand, l as buildEnvelope, m as cursorAbs, n as MAX_RENDER_BYTES, nt as stopTipForCli, o as SEND_EXIT_UNREACHABLE, ot as writeToIpc, p as controlCodeFromName, q as renderRawLogLines, r as READ_PAGE_DEFAULT, rt as submitAndConfirm, s as TYPING_WINDOW_MS, t as GRACEFUL_EXIT_COMMANDS, tt as stdinActivityPath, u as cliDefaults, v as envelopeCostFor, w as isAgentStuck, x as extractNeedsInput, y as extractBadges, z as readAgentPtysize } from "./subcommands--9gcc0ew.js";
8
+ import { $ as sendPayloadCapError, A as isUnknownManagerToken, B as readLogForRender, C as finalizedLines, D as isPidAlive, E as isExitRequest, F as listRecords, G as renderLogTailLines, H as readPtysize, I as matchKeyword, J as resolveOne, K as renderRawLog, L as menuSelectKeys, M as isUserTyping, N as lastReadAt, O as isSlashCommand, P as lastStdinAt, Q as runSubcommand, R as probeStdinReachable, S as extractTaskCounts, T as isBareManagerInvocation, U as recentMessageEdges, V as readNotes, W as recentReadEdges, X as resolveResumeArgs, Y as resolveReadWindow, Z as restartHintLines, _ as envelopeAttribution, a as SEND_BODY_MAX_CHARS, at as writeKeysPaced, b as extractMenu, c as backoffWhileTyping, d as cmdHelp, et as snapshotStatus, f as confirmStdinUnreachable, g as deriveLiveStatus, h as deriveLiveState, i as READ_WINDOW_MS, it as waitForLogQuiet, j as isUnreachableWriteErrno, k as isSubcommand, l as buildEnvelope, m as cursorAbs, n as MAX_RENDER_BYTES, nt as stopTipForCli, o as SEND_EXIT_UNREACHABLE, ot as writeToIpc, p as controlCodeFromName, q as renderRawLogLines, r as READ_PAGE_DEFAULT, rt as submitAndConfirm, s as TYPING_WINDOW_MS, t as GRACEFUL_EXIT_COMMANDS, tt as stdinActivityPath, u as cliDefaults, v as envelopeCostFor, w as isAgentStuck, x as extractNeedsInput, y as extractBadges, z as readAgentPtysize } from "./subcommands-CUWPMI_r.js";
9
9
  import "./notifyStore-2SWKGwZI.js";
10
- import "./webrtcLink-CnQf9pmu.js";
11
- import "./remotes-5P__pAXA.js";
10
+ import "./webrtcLink-DFRyWNMs.js";
11
+ import "./remotes-DrYe_nfw.js";
12
12
 
13
13
  export { READ_WINDOW_MS, cmdHelp, isBareManagerInvocation, isSubcommand, isUnknownManagerToken, lastReadAt, runSubcommand };
@@ -88,4 +88,4 @@ function linkBunBinsToSystemPath(opts) {
88
88
 
89
89
  //#endregion
90
90
  export { linkBunBinsToSystemPath };
91
- //# sourceMappingURL=systemPathLink-VV-Vm6y2.js.map
91
+ //# sourceMappingURL=systemPathLink-DoyBuRQq.js.map
@@ -98,7 +98,7 @@ async function cmdTermMint(args) {
98
98
  if (flags.ro && flags.interactive) throw new Error("--ro and --interactive are mutually exclusive");
99
99
  const ttlSec = parseTtlSec(typeof flags.ttl === "string" ? flags.ttl : "15m");
100
100
  const canSend = flags.interactive === true;
101
- const { mintScopedTermToken } = await import("./serve-BD-7GaKa.js");
101
+ const { mintScopedTermToken } = await import("./serve-Q4dnZc5l.js");
102
102
  const r = await mintScopedTermToken(pid, {
103
103
  ttlSec,
104
104
  canSend
@@ -135,4 +135,4 @@ async function cmdTerm(args) {
135
135
 
136
136
  //#endregion
137
137
  export { cmdTerm };
138
- //# sourceMappingURL=terminal-Bam4XVWi.js.map
138
+ //# sourceMappingURL=terminal-CUn1_oPd.js.map
@@ -583,4 +583,4 @@ async function runTodoSubcommand(rest0) {
583
583
 
584
584
  //#endregion
585
585
  export { runTodoSubcommand };
586
- //# sourceMappingURL=todoCli-BDttv8mk.js.map
586
+ //# sourceMappingURL=todoCli-DwYlxIAY.js.map
@@ -187,4 +187,4 @@ async function startTray() {
187
187
 
188
188
  //#endregion
189
189
  export { ensureTray, startTray };
190
- //# sourceMappingURL=tray-DWWsVS7Y.js.map
190
+ //# sourceMappingURL=tray-BcpHVeMk.js.map