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.
- package/dist/{SUPPORTED_CLIS-AzChegaJ.js → SUPPORTED_CLIS-BIlQQJa6.js} +3 -3
- package/dist/{SUPPORTED_CLIS-sxjBFTrE.js → SUPPORTED_CLIS-Ct9reIJH.js} +2 -2
- package/dist/{agentShare-CDOvU64K.js → agentShare-uzFuaLUH.js} +4 -4
- package/dist/{callback-DBOgmPV6.js → callback-BxTZx3xJ.js} +3 -3
- package/dist/{callback-Dr5rqkUu.js → callback-DRrURxmb.js} +4 -4
- package/dist/cli.js +7 -7
- package/dist/{cmdPs-DKuMlynW.js → cmdPs-BGIWbeBM.js} +4 -4
- package/dist/index.js +2 -2
- package/dist/{notifyDaemon-Ceyhz4el.js → notifyDaemon-EEbnpoYp.js} +4 -4
- package/dist/{parentPingLoop-C0hekeg6.js → parentPingLoop-C1XXpKK7.js} +2 -2
- package/dist/remotes-BDMnvGI6.js +5 -0
- package/dist/{remotes-5P__pAXA.js → remotes-DrYe_nfw.js} +101 -18
- package/dist/{rustBinary-BW3BGZ4y.js → rustBinary--pof-MTj.js} +2 -2
- package/dist/{rustBinary-0cD4pQIE.js → rustBinary-B7rq3nuz.js} +2 -2
- package/dist/{schedule-BRC5cDkf.js → schedule-BFUe9-Mf.js} +4 -4
- package/dist/{serve-BD-7GaKa.js → serve-Q4dnZc5l.js} +40 -21
- package/dist/{setup-Dad2A_-o.js → setup-aEuGSFjB.js} +3 -3
- package/dist/shareCmd-DkITELaM.js +415 -0
- package/dist/{subcommands--9gcc0ew.js → subcommands-CUWPMI_r.js} +36 -22
- package/dist/{subcommands-ClQCwxvk.js → subcommands-CuRZt3X6.js} +3 -3
- package/dist/{systemPathLink-VV-Vm6y2.js → systemPathLink-DoyBuRQq.js} +1 -1
- package/dist/{terminal-Bam4XVWi.js → terminal-CUn1_oPd.js} +2 -2
- package/dist/{todoCli-BDttv8mk.js → todoCli-DwYlxIAY.js} +1 -1
- package/dist/{tray-DWWsVS7Y.js → tray-BcpHVeMk.js} +1 -1
- package/dist/{trayApp-DOgsH0en.js → trayApp-BHwAJFzl.js} +2 -2
- package/dist/trayApp-ucuB_j5l.js +5 -0
- package/dist/{ts-BePSXUQl.js → ts-oIxnyQbE.js} +3 -3
- package/dist/{versionChecker-D6zM6Pdv.js → versionChecker-DOgDaagD.js} +2 -2
- package/dist/{webrtcLink-CnQf9pmu.js → webrtcLink-DFRyWNMs.js} +2 -2
- package/dist/{webrtcRemote-0RGrSwqd.js → webrtcRemote-Cd4vTrgv.js} +2 -2
- package/dist/{widget-DJgiOfgE.js → widget-CuagzQwz.js} +3 -3
- package/dist/{ws-Covfyaxn.js → ws-DcJBGzQP.js} +2 -2
- package/dist/{ws-DjGQGPCq.js → ws-ID7-zDiJ.js} +4 -4
- package/lab/ui/index.html +9 -3
- package/package.json +1 -1
- package/ts/remotes.ts +128 -13
- package/ts/serve.ts +22 -0
- package/ts/shareCmd.ts +369 -0
- package/ts/shareCore.spec.ts +236 -0
- package/ts/shareCore.ts +148 -0
- package/ts/subcommands.spec.ts +19 -0
- package/ts/subcommands.ts +33 -5
- package/ts/webrtcLink.ts +3 -1
- package/dist/remotes-CY69MeQB.js +0 -5
- 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-
|
|
11
|
-
import {
|
|
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([
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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
|
|
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-
|
|
11
|
-
import "./remotes-
|
|
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 };
|
|
@@ -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-
|
|
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-
|
|
138
|
+
//# sourceMappingURL=terminal-CUn1_oPd.js.map
|