agent-yes 1.288.0 → 1.289.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 (56) hide show
  1. package/default.config.yaml +106 -0
  2. package/dist/{SUPPORTED_CLIS-BHowMgMY.js → SUPPORTED_CLIS-BlgVWZrM.js} +2 -2
  3. package/dist/{SUPPORTED_CLIS-ChhJyq4h.js → SUPPORTED_CLIS-C65PuIs6.js} +3 -3
  4. package/dist/{agentShare-T3RskvDT.js → agentShare-Cm15-dfZ.js} +3 -3
  5. package/dist/{callback-CuohbCJA.js → callback-Bbplrsbv.js} +3 -3
  6. package/dist/{callback-DeaETuHt.js → callback-Dwnkeqpz.js} +3 -3
  7. package/dist/cli.js +11 -11
  8. package/dist/cmdPs-BYBZQ0Vc.js +331 -0
  9. package/dist/{cwdConflictWarn-DIPD6HH5.js → cwdConflictWarn-BgXN56Jc.js} +1 -1
  10. package/dist/{cwdPassthroughHint-C0tfZlgZ.js → cwdPassthroughHint-CDEGVteh.js} +1 -1
  11. package/dist/{expose-Ds9aUFsq.js → expose-BlddYYx9.js} +1 -1
  12. package/dist/{forkNested-Dt5XP8ZH.js → forkNested-CJ7lQQCe.js} +1 -1
  13. package/dist/{hist-DSYaJEd3.js → hist-DZxq7NMA.js} +1 -1
  14. package/dist/index.js +2 -2
  15. package/dist/{initMsg-CeF4QNOM.js → initMsg-DoltWTZj.js} +1 -1
  16. package/dist/{initMsg-DejbYYjX.js → initMsg-axyQAPLK.js} +1 -1
  17. package/dist/{nodeRuntime-_zeWDISM.js → nodeRuntime-CipjIwfO.js} +1 -1
  18. package/dist/{notifyDaemon-BORqPeAl.js → notifyDaemon-Q3FF-WEZ.js} +47 -39
  19. package/dist/{openBrowser-BNP8xByu.js → openBrowser-THOzOGNm.js} +1 -1
  20. package/dist/{parentLink-Bv8ihRcu.js → parentLink-bpDGuQi6.js} +1 -1
  21. package/dist/{parentLink-HWunrH1s.js → parentLink-fdiuB13i.js} +1 -1
  22. package/dist/{parentPingLoop-COePRYr9.js → parentPingLoop-Dc7co5D7.js} +4 -4
  23. package/dist/{cmdPs-Bm4JG7hi.js → procStats-CyD8h5nx.js} +2 -329
  24. package/dist/{remotes-b6reVXzo.js → remotes-BjsglpjL.js} +2 -2
  25. package/dist/{remotes-BlHTR9ow.js → remotes-CAqtL_Ib.js} +1 -1
  26. package/dist/{rustBinary-BmXzqj5z.js → rustBinary-B57oRftk.js} +2 -2
  27. package/dist/{rustBinary-D12k7iOD.js → rustBinary-Dq0AytZ7.js} +2 -2
  28. package/dist/{schedule-DLoUmyJh.js → schedule-pim0Izhs.js} +6 -6
  29. package/dist/{serve-DaDlOtss.js → serve-CMsvjqPU.js} +174 -27
  30. package/dist/{setup-Cqy8nRrq.js → setup-BmxYINCx.js} +4 -4
  31. package/dist/{spawnGate-B2hA_2NQ.js → spawnGate-B26UnzqP.js} +2 -2
  32. package/dist/{spawnGate-FLwTAPW6.js → spawnGate-C8MSRt7X.js} +1 -1
  33. package/dist/{subcommands-DKTa3E6O.js → subcommands-CJBV06rg.js} +2 -2
  34. package/dist/{subcommands-BfiOyfz7.js → subcommands-CWDqhKQe.js} +21 -21
  35. package/dist/{systemPathLink-Dl2gJqeg.js → systemPathLink-BVdk48Vz.js} +1 -1
  36. package/dist/{terminal-C0tnGnrZ.js → terminal-CcmBzB3G.js} +2 -2
  37. package/dist/{todoCli-MWrejmdM.js → todoCli-azqbjBtz.js} +1 -1
  38. package/dist/{tray-BhPVpP_r.js → tray-CIt9mCKZ.js} +1 -1
  39. package/dist/trayApp-BovAZs7m.js +5 -0
  40. package/dist/{trayApp-DvL9qW6V.js → trayApp-DuZBkGl_.js} +2 -2
  41. package/dist/{ts-DJLp2_bv.js → ts-CSp4mJ7Z.js} +23 -9
  42. package/dist/{versionChecker-CkO7wYyV.js → versionChecker-CWCN4vwm.js} +2 -2
  43. package/dist/{webrtcRemote-H9Hok0_R.js → webrtcRemote-Bevc5ogS.js} +1 -1
  44. package/dist/{widget-CJqpScCG.js → widget-D2cCC8nz.js} +3 -3
  45. package/dist/{workspaceConfig-D6QndOCz.js → workspaceConfig-DTvPtr5j.js} +1 -1
  46. package/dist/{ws-DGENGNrr.js → ws-B5Qb2c-1.js} +3 -3
  47. package/dist/{ws-DzCKvzWD.js → ws-CyO9r4jx.js} +3 -3
  48. package/package.json +1 -1
  49. package/ts/agentNice.spec.ts +42 -2
  50. package/ts/index.ts +5 -4
  51. package/ts/notifyDaemon.spec.ts +16 -0
  52. package/ts/notifyDaemon.ts +22 -0
  53. package/ts/serve.ts +14 -0
  54. package/ts/serveSampler.spec.ts +390 -0
  55. package/ts/serveSampler.ts +218 -0
  56. package/dist/trayApp-BrAMlCY7.js +0 -5
@@ -1,7 +1,7 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import { i as getInstalledPackage } from "./versionChecker-CkO7wYyV.js";
3
- import { r as findSpawnHiddenLauncher } from "./rustBinary-BmXzqj5z.js";
4
- import { c as permissionBadge, i as answerAsk, o as listAsks, u as CLAUDE_SESSION_PIN_ENV } from "./ts-DJLp2_bv.js";
2
+ import { i as getInstalledPackage } from "./versionChecker-CWCN4vwm.js";
3
+ import { r as findSpawnHiddenLauncher } from "./rustBinary-B57oRftk.js";
4
+ import { c as permissionBadge, i as answerAsk, o as listAsks, u as CLAUDE_SESSION_PIN_ENV } from "./ts-CSp4mJ7Z.js";
5
5
  import { t as agentYesHome$1 } from "./agentYesHome-BNtn19J4.js";
6
6
  import { u as removeControlCharacters } from "./todoAutomation-CbVVS4re.js";
7
7
  import "./JsonlStore-BqF7AQ6E.js";
@@ -12,18 +12,19 @@ import { t as pgidForWrapper } from "./reaper-UimuuTfO.js";
12
12
  import "./todoStore-DF6vxHgV.js";
13
13
  import "./e2e-z1xpwSAg.js";
14
14
  import "./configShared-DKTgiz7K.js";
15
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BHowMgMY.js";
16
- import { D as listRecords, F as recentReadEdges, I as renderLogTailLines, L as renderRawLog, M as readNotes, N as readPtysize, P as recentMessageEdges, Q as TYPING_BADGE, R as renderRawLogLines, W as snapshotStatus, X as writeToIpc, Z as withIpcLock, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, h as extractTaskCounts, j as readLogForRender, m as extractNeedsInput, w as isUserTyping, z as resolveOne } from "./subcommands-BfiOyfz7.js";
15
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BlgVWZrM.js";
16
+ import { D as listRecords, F as recentReadEdges, I as renderLogTailLines, L as renderRawLog, M as readNotes, N as readPtysize, P as recentMessageEdges, Q as TYPING_BADGE, R as renderRawLogLines, W as snapshotStatus, X as writeToIpc, Z as withIpcLock, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, h as extractTaskCounts, j as readLogForRender, m as extractNeedsInput, w as isUserTyping, z as resolveOne } from "./subcommands-CWDqhKQe.js";
17
17
  import { c as isTransientLockMkdirError } from "./notifyStore-2SWKGwZI.js";
18
18
  import "./webrtcLink-DLaJfTcB.js";
19
- import "./remotes-b6reVXzo.js";
19
+ import "./remotes-BjsglpjL.js";
20
20
  import { i as frameVisitorMessage, s as verifyCapability, t as MAX_CALLBACK_MSG_BYTES } from "./callbackCore-Bl2gGcxg.js";
21
- import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-CuohbCJA.js";
22
- import { a as getProvisionRoot, d as isProvisionAllowed, f as resolveSpawnCwd, i as getProvisionHook, l as hasProvisionHook, o as getSpawnHook, t as allowsSkipPermissions, u as hasSpawnHook } from "./workspaceConfig-D6QndOCz.js";
23
- import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-_zeWDISM.js";
24
- import { i as importProvisionModule } from "./ws-DGENGNrr.js";
25
- import { r as spawnRejectionReason } from "./spawnGate-B2hA_2NQ.js";
26
- import { i as launchTray } from "./trayApp-DvL9qW6V.js";
21
+ import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-Bbplrsbv.js";
22
+ import { n as sampleTrees } from "./procStats-CyD8h5nx.js";
23
+ import { a as getProvisionRoot, d as isProvisionAllowed, f as resolveSpawnCwd, i as getProvisionHook, l as hasProvisionHook, o as getSpawnHook, t as allowsSkipPermissions, u as hasSpawnHook } from "./workspaceConfig-DTvPtr5j.js";
24
+ import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-CipjIwfO.js";
25
+ import { i as importProvisionModule } from "./ws-B5Qb2c-1.js";
26
+ import { r as spawnRejectionReason } from "./spawnGate-B26UnzqP.js";
27
+ import { i as launchTray } from "./trayApp-DuZBkGl_.js";
27
28
  import yargs from "yargs";
28
29
  import { appendFile, mkdir, open, readFile, readdir, rename, rm, stat, unlink, writeFile } from "fs/promises";
29
30
  import { arch, cpus, freemem, homedir, hostname, loadavg, platform, totalmem, uptime, userInfo } from "os";
@@ -124,6 +125,149 @@ function verifyTermToken(masterToken, tok, nowSec = Math.floor(Date.now() / 1e3)
124
125
  */
125
126
  const isTerminalReply = (s) => /^(?:\x1b\[(?:\??\d+(?:;\d+)*R|\?[\d;]*c|>[\d;]*c|\d*n))+$/.test(s);
126
127
 
128
+ //#endregion
129
+ //#region ts/serveSampler.ts
130
+ /**
131
+ * Periodic per-agent resource sampler for the console heatmaps — the TS twin of
132
+ * `rs/src/serve/sampler.rs` (see there for the shared design). The Rust daemon
133
+ * ships this already; this port lets the TS `ay serve` daemon — which is what
134
+ * actually serves the browser console — expose the SAME `res` / `resources`
135
+ * fields, so the console renders identically whichever host backs it.
136
+ *
137
+ * Reuses `ts/procStats.ts` (the `ay ps` machinery) for one full process-tree
138
+ * snapshot + rollup per sweep, bucketed into a per-agent rolling window.
139
+ * Best-effort throughout — a failed snapshot, an agent exited mid-sweep, or a
140
+ * non-/proc platform all degrade to "no data" (transparent) rather than breaking
141
+ * the serve path.
142
+ *
143
+ * Adaptive granularity (same rule as Rust):
144
+ * pass time < 1s → bucket = 60s, window = 60 buckets (1h)
145
+ * pass time >= 1s → bucket = 300s, window = 12 buckets (1h)
146
+ */
147
+ const BUCKET_FAST_SECS = 60;
148
+ const BUCKET_SLOW_SECS = 300;
149
+ const WINDOW_FAST = 60;
150
+ const WINDOW_SLOW = 12;
151
+ const PASS_THRESHOLD_MS = 1e3;
152
+ const SWEEP_WINDOW_MS = 120;
153
+ function windowLen(bucketSecs) {
154
+ return bucketSecs <= BUCKET_FAST_SECS ? WINDOW_FAST : WINDOW_SLOW;
155
+ }
156
+ function bucketOf(t, elapsedSeconds) {
157
+ return {
158
+ cpu_seconds: t.cpuPercent / 100 * elapsedSeconds,
159
+ rss: t.rss,
160
+ procs: t.procs
161
+ };
162
+ }
163
+ const state = {
164
+ snap: {
165
+ agents: /* @__PURE__ */ new Map(),
166
+ unattributed: {
167
+ cpu_seconds: 0,
168
+ rss: 0,
169
+ procs: 0
170
+ },
171
+ bucketSecs: 0
172
+ },
173
+ bucketSecs: 0
174
+ };
175
+ /**
176
+ * The per-agent resource window as the console's `entry.res` field (matching the
177
+ * Rust `/api/ls` `res` shape exactly): { bucket_secs, t[], cpu_seconds[], rss[],
178
+ * procs[] }. Null when the sampler has not yet recorded this agent.
179
+ */
180
+ function resField(pid) {
181
+ const series = state.snap.agents.get(pid);
182
+ if (!series || series.length === 0) return null;
183
+ return {
184
+ bucket_secs: state.snap.bucketSecs,
185
+ t: series.map(([t]) => t),
186
+ cpu_seconds: series.map(([, b]) => b.cpu_seconds),
187
+ rss: series.map(([, b]) => b.rss),
188
+ procs: series.map(([, b]) => b.procs)
189
+ };
190
+ }
191
+ /** The managed/unattributed split for the room line, matching the Rust shape. */
192
+ function resourcesField() {
193
+ let managedRss = 0;
194
+ let managedProcs = 0;
195
+ for (const series of state.snap.agents.values()) {
196
+ const last = series[series.length - 1];
197
+ if (last) {
198
+ managedRss += last[1].rss;
199
+ managedProcs += last[1].procs;
200
+ }
201
+ }
202
+ return {
203
+ bucket_secs: state.snap.bucketSecs,
204
+ managed_rss: managedRss,
205
+ managed_procs: managedProcs,
206
+ unattributed_rss: state.snap.unattributed.rss,
207
+ unattributed_procs: state.snap.unattributed.procs
208
+ };
209
+ }
210
+ /**
211
+ * Run one sweep against the given live root pids and bucket the result. Exposed so
212
+ * `serve.ts` drives it with its own notion of the live fleet (it already has
213
+ * `listRecords`). Returns the chosen bucket width (after the adaptive first pass).
214
+ */
215
+ async function sweep(roots) {
216
+ if (roots.length === 0) {
217
+ if (state.bucketSecs === 0) state.bucketSecs = BUCKET_FAST_SECS;
218
+ state.snap.bucketSecs = state.bucketSecs;
219
+ return state.bucketSecs;
220
+ }
221
+ const start = Date.now();
222
+ let result;
223
+ try {
224
+ result = await sampleTrees([...roots].reverse(), { windowMs: SWEEP_WINDOW_MS });
225
+ } catch {
226
+ return state.bucketSecs || BUCKET_FAST_SECS;
227
+ }
228
+ const pass = Date.now() - start;
229
+ if (state.bucketSecs === 0) state.bucketSecs = pass < PASS_THRESHOLD_MS ? BUCKET_FAST_SECS : BUCKET_SLOW_SECS;
230
+ const now = Date.now();
231
+ const max = windowLen(state.bucketSecs);
232
+ const elapsedSeconds = Math.max(.001, pass / 1e3);
233
+ for (const [pid, stats] of result.trees) {
234
+ const series = state.snap.agents.get(pid) ?? [];
235
+ series.push([now, bucketOf(stats, elapsedSeconds)]);
236
+ if (series.length > max) series.splice(0, series.length - max);
237
+ state.snap.agents.set(pid, series);
238
+ }
239
+ const un = result.unattributed;
240
+ state.snap.unattributed = {
241
+ cpu_seconds: un.cpuPercent / 100 * elapsedSeconds,
242
+ rss: un.rss,
243
+ procs: un.procs
244
+ };
245
+ state.snap.bucketSecs = state.bucketSecs;
246
+ return state.bucketSecs;
247
+ }
248
+ let started = false;
249
+ let timer = null;
250
+ /**
251
+ * Start the background sampler. Idempotent. `serve.ts` calls this once on startup;
252
+ * `getRoots` returns the live wrapper pids (it already reads them via listRecords).
253
+ * Self-schedules with setTimeout so the adaptive bucket width takes effect on the
254
+ * very next tick without interval re-arm gymnastics.
255
+ */
256
+ function startSampler(getRoots) {
257
+ if (started) return;
258
+ started = true;
259
+ const tick = async () => {
260
+ let width = state.bucketSecs || BUCKET_FAST_SECS;
261
+ try {
262
+ width = await sweep(await getRoots()) || width;
263
+ } catch {}
264
+ if (!started) return;
265
+ timer = setTimeout(tick, width * 1e3);
266
+ timer.unref?.();
267
+ };
268
+ tick();
269
+ }
270
+
127
271
  //#endregion
128
272
  //#region ts/statusText.ts
129
273
  /**
@@ -1279,7 +1423,7 @@ async function cmdServeDaemon(sub, args) {
1279
1423
  if (!webrtcDaemon) return;
1280
1424
  if (shareLink) {
1281
1425
  process.stdout.write(`\nshared over WebRTC — open this link (the token is eaten from the URL on open):\n ${shareLink}\n` + (shareLinkMinted ? ` (persistent room — same link across restarts; delete ~/.agent-yes/.share-room to rotate)\n` : ``));
1282
- const { offerOpenInBrowser } = await import("./openBrowser-BNP8xByu.js");
1426
+ const { offerOpenInBrowser } = await import("./openBrowser-THOzOGNm.js");
1283
1427
  await offerOpenInBrowser(shareLink);
1284
1428
  } else process.stdout.write("\nthe WebRTC share link carries a secret, so the daemon does NOT log it —\nread it from ~/.agent-yes/.share-link (mode 0600). The room persists in\n~/.agent-yes/.share-room, so the link survives restarts.\n");
1285
1429
  };
@@ -1846,7 +1990,8 @@ Options:
1846
1990
  status_text: status === "exited" ? null : await logStatusText(r.log_file),
1847
1991
  git: status === "exited" ? null : await gitStatus(r.cwd),
1848
1992
  tasks: status === "exited" ? null : await logTasks(r.log_file),
1849
- badges: status === "exited" ? [] : await logBadges(r.log_file).then(async (b) => await isUserTyping(r.pid) ? [...b, TYPING_BADGE.id] : b)
1993
+ badges: status === "exited" ? [] : await logBadges(r.log_file).then(async (b) => await isUserTyping(r.pid) ? [...b, TYPING_BADGE.id] : b),
1994
+ res: resField(r.pid)
1850
1995
  };
1851
1996
  };
1852
1997
  const presence = /* @__PURE__ */ new Map();
@@ -2426,6 +2571,7 @@ Options:
2426
2571
  free: freemem()
2427
2572
  },
2428
2573
  uptime: uptime(),
2574
+ resources: resourcesField(),
2429
2575
  caps: {
2430
2576
  send: true,
2431
2577
  kill: true,
@@ -2436,7 +2582,7 @@ Options:
2436
2582
  }
2437
2583
  });
2438
2584
  if (req.method === "GET" && p === "/api/ws") {
2439
- const ws = await import("./ws-DzCKvzWD.js");
2585
+ const ws = await import("./ws-CyO9r4jx.js");
2440
2586
  try {
2441
2587
  await ws.loadProvision();
2442
2588
  } catch (e) {
@@ -2456,7 +2602,7 @@ Options:
2456
2602
  if (req.method === "GET" && p === "/api/ws/status") {
2457
2603
  const dirRaw = url.searchParams.get("path");
2458
2604
  if (!dirRaw) return new Response("missing ?path=<workspace dir>", { status: 400 });
2459
- const ws = await import("./ws-DzCKvzWD.js");
2605
+ const ws = await import("./ws-CyO9r4jx.js");
2460
2606
  let prov;
2461
2607
  try {
2462
2608
  prov = await ws.loadProvision();
@@ -2478,7 +2624,7 @@ Options:
2478
2624
  }
2479
2625
  }
2480
2626
  if (req.method === "GET" && p === "/api/ws/repos") {
2481
- const ws = await import("./ws-DzCKvzWD.js");
2627
+ const ws = await import("./ws-CyO9r4jx.js");
2482
2628
  try {
2483
2629
  await ws.loadProvision();
2484
2630
  } catch (e) {
@@ -2559,7 +2705,7 @@ Options:
2559
2705
  const m = /^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/.exec(repoParam);
2560
2706
  if (!m || m[1] === "." || m[1] === ".." || m[2] === "." || m[2] === "..") return new Response("missing/invalid ?repo=<owner>/<repo>", { status: 400 });
2561
2707
  const [, owner, repo] = m;
2562
- const ws = await import("./ws-DzCKvzWD.js");
2708
+ const ws = await import("./ws-CyO9r4jx.js");
2563
2709
  let prov;
2564
2710
  try {
2565
2711
  prov = await ws.loadProvision();
@@ -3470,7 +3616,7 @@ Options:
3470
3616
  const perm = body.perm ?? "r";
3471
3617
  if (perm !== "r" && perm !== "rw") return new Response(`invalid perm ${perm} (want r or rw)`, { status: 400 });
3472
3618
  try {
3473
- const { createScopedShare } = await import("./agentShare-T3RskvDT.js");
3619
+ const { createScopedShare } = await import("./agentShare-Cm15-dfZ.js");
3474
3620
  const share = await createScopedShare({
3475
3621
  agent: body.agent,
3476
3622
  perm,
@@ -3485,12 +3631,12 @@ Options:
3485
3631
  }
3486
3632
  }
3487
3633
  if (req.method === "GET" && p === "/api/shares") {
3488
- const { listShares } = await import("./agentShare-T3RskvDT.js");
3634
+ const { listShares } = await import("./agentShare-Cm15-dfZ.js");
3489
3635
  return Response.json(listShares());
3490
3636
  }
3491
3637
  const revokeM = /^\/api\/share\/([^/]+)$/.exec(p);
3492
3638
  if (req.method === "DELETE" && revokeM) {
3493
- const { revokeShare } = await import("./agentShare-T3RskvDT.js");
3639
+ const { revokeShare } = await import("./agentShare-Cm15-dfZ.js");
3494
3640
  const ok = revokeShare(decodeURIComponent(revokeM[1]));
3495
3641
  return new Response(ok ? "revoked" : "no such share", { status: ok ? 200 : 404 });
3496
3642
  }
@@ -3504,7 +3650,7 @@ Options:
3504
3650
  const port = Number(body.port);
3505
3651
  if (!Number.isInteger(port) || port < 1 || port > 65535) return new Response("valid port required", { status: 400 });
3506
3652
  try {
3507
- const { ensureExposure } = await import("./expose-Ds9aUFsq.js");
3653
+ const { ensureExposure } = await import("./expose-BlddYYx9.js");
3508
3654
  const h = await ensureExposure(port, body.relay);
3509
3655
  return Response.json({
3510
3656
  id: h.id,
@@ -3518,12 +3664,12 @@ Options:
3518
3664
  }
3519
3665
  }
3520
3666
  if (req.method === "GET" && p === "/api/exposes") {
3521
- const { listExposures } = await import("./expose-Ds9aUFsq.js");
3667
+ const { listExposures } = await import("./expose-BlddYYx9.js");
3522
3668
  return Response.json(listExposures());
3523
3669
  }
3524
3670
  const unexposeM = /^\/api\/expose\/(\d+)$/.exec(p);
3525
3671
  if (req.method === "DELETE" && unexposeM) {
3526
- const { stopExposure } = await import("./expose-Ds9aUFsq.js");
3672
+ const { stopExposure } = await import("./expose-BlddYYx9.js");
3527
3673
  const ok = stopExposure(Number(unexposeM[1]));
3528
3674
  return new Response(ok ? "revoked" : "no such exposure", { status: ok ? 200 : 404 });
3529
3675
  }
@@ -3724,6 +3870,7 @@ Options:
3724
3870
  }
3725
3871
  throw e;
3726
3872
  }
3873
+ startSampler(async () => (await listRecords(void 0, defaultOpts({ all: true }))).map((r) => r.pid));
3727
3874
  if (server) {
3728
3875
  const listenPort = server.port;
3729
3876
  const uiHost = host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host;
@@ -3753,7 +3900,7 @@ Options:
3753
3900
  const persistNote = explicitUrl ? "\n" : ` (persistent room — same link across restarts; delete ~/.agent-yes/.share-room to rotate)\n\n`;
3754
3901
  process.stdout.write(`${wantHttp ? "\n" : ""}${lead}:\n ${link}\n` + persistNote);
3755
3902
  if (!rotated) {
3756
- const { offerOpenInBrowser } = await import("./openBrowser-BNP8xByu.js");
3903
+ const { offerOpenInBrowser } = await import("./openBrowser-THOzOGNm.js");
3757
3904
  await offerOpenInBrowser(link);
3758
3905
  }
3759
3906
  } else {
@@ -3795,7 +3942,7 @@ Options:
3795
3942
  const shutdown = (resolve) => {
3796
3943
  if (heartbeat) clearInterval(heartbeat);
3797
3944
  closeShare?.();
3798
- import("./agentShare-T3RskvDT.js").then((m) => m.revokeAllShares()).catch(() => {});
3945
+ import("./agentShare-Cm15-dfZ.js").then((m) => m.revokeAllShares()).catch(() => {});
3799
3946
  server?.stop();
3800
3947
  Promise.resolve(releaseHostLock?.()).catch(() => {}).then(resolve);
3801
3948
  };
@@ -3808,4 +3955,4 @@ Options:
3808
3955
 
3809
3956
  //#endregion
3810
3957
  export { cmdServe, loadTokenReadOnly, mintScopedTermToken, resolveDaemonHttpBase, resolveLocalServeUrl };
3811
- //# sourceMappingURL=serve-DaDlOtss.js.map
3958
+ //# sourceMappingURL=serve-CMsvjqPU.js.map
@@ -1,4 +1,4 @@
1
- import { c as getWorkspaceRoot, p as setWorkspaceRoot } from "./workspaceConfig-D6QndOCz.js";
1
+ import { c as getWorkspaceRoot, p as setWorkspaceRoot } from "./workspaceConfig-DTvPtr5j.js";
2
2
  import { existsSync } from "node:fs";
3
3
  import { stdin, stdout } from "node:process";
4
4
  import { createInterface } from "node:readline/promises";
@@ -31,7 +31,7 @@ async function cmdSetup(rest) {
31
31
  process.stdout.write(`workspace root: ${abs}\n`);
32
32
  if (!existsSync(abs)) process.stderr.write(` note: that directory doesn't exist yet — create it, or agents spawned there will fail\n`);
33
33
  try {
34
- const { linkBunBinsToSystemPath } = await import("./systemPathLink-Dl2gJqeg.js");
34
+ const { linkBunBinsToSystemPath } = await import("./systemPathLink-BVdk48Vz.js");
35
35
  const r = linkBunBinsToSystemPath();
36
36
  if (r && (r.linked.length || r.refreshed.length)) {
37
37
  const n = r.linked.length + r.refreshed.length;
@@ -40,7 +40,7 @@ async function cmdSetup(rest) {
40
40
  } catch {}
41
41
  if (noShare) return 0;
42
42
  process.stdout.write(`\nsharing this machine to agent-yes.com…\n`);
43
- const { cmdServe } = await import("./serve-DaDlOtss.js");
43
+ const { cmdServe } = await import("./serve-CMsvjqPU.js");
44
44
  return cmdServe([
45
45
  "install",
46
46
  "--share",
@@ -50,4 +50,4 @@ async function cmdSetup(rest) {
50
50
 
51
51
  //#endregion
52
52
  export { cmdSetup };
53
- //# sourceMappingURL=setup-Cqy8nRrq.js.map
53
+ //# sourceMappingURL=setup-BmxYINCx.js.map
@@ -1,5 +1,5 @@
1
1
  import { i as readGlobalPids } from "./globalPidIndex-DoaKEUkO.js";
2
- import { n as getMaxAgents, r as getMinFreeMb, s as getSpawnWaitMs } from "./workspaceConfig-D6QndOCz.js";
2
+ import { n as getMaxAgents, r as getMinFreeMb, s as getSpawnWaitMs } from "./workspaceConfig-DTvPtr5j.js";
3
3
  import { readFile } from "fs/promises";
4
4
 
5
5
  //#region ts/spawnGate.ts
@@ -104,4 +104,4 @@ async function waitForSpawnCapacity(opts) {
104
104
 
105
105
  //#endregion
106
106
  export { waitForSpawnCapacity as i, spawnGateEnabled as n, spawnRejectionReason as r, memAvailableMb as t };
107
- //# sourceMappingURL=spawnGate-B2hA_2NQ.js.map
107
+ //# sourceMappingURL=spawnGate-B26UnzqP.js.map
@@ -1,5 +1,5 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
2
  import "./globalPidIndex-DoaKEUkO.js";
3
- import { i as waitForSpawnCapacity, n as spawnGateEnabled, r as spawnRejectionReason, t as memAvailableMb } from "./spawnGate-B2hA_2NQ.js";
3
+ import { i as waitForSpawnCapacity, n as spawnGateEnabled, r as spawnRejectionReason, t as memAvailableMb } from "./spawnGate-B26UnzqP.js";
4
4
 
5
5
  export { waitForSpawnCapacity };
@@ -3,9 +3,9 @@ import "./globalPidIndex-DoaKEUkO.js";
3
3
  import "./messageLog-DdjBNqgt.js";
4
4
  import "./e2e-z1xpwSAg.js";
5
5
  import "./configShared-DKTgiz7K.js";
6
- import { A as readAgentPtysize, B as resolveReadWindow, C as isUnknownManagerToken, D as listRecords, E as lastStdinAt, F as recentReadEdges, G as stdinActivityPath, H as restartHintLines, I as renderLogTailLines, J as waitForLogQuiet, K as stopTipForCli, L as renderRawLog, M as readNotes, N as readPtysize, O as matchKeyword, P as recentMessageEdges, R as renderRawLogLines, S as isSubcommand, T as lastReadAt, U as runSubcommand, V as resolveResumeArgs, W as snapshotStatus, X as writeToIpc, Y as writeKeysPaced, _ as isAgentStuck, a as TYPING_WINDOW_MS, b as isPidAlive, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, g as finalizedLines, h as extractTaskCounts, i as READ_WINDOW_MS, j as readLogForRender, k as menuSelectKeys, l as cursorAbs, m as extractNeedsInput, n as MAX_RENDER_BYTES, o as backoffWhileTyping, p as extractMenu, q as submitAndConfirm, r as READ_PAGE_DEFAULT, s as cmdHelp, t as GRACEFUL_EXIT_COMMANDS, u as deriveLiveState, v as isBareManagerInvocation, w as isUserTyping, x as isSlashCommand, y as isExitRequest, z as resolveOne } from "./subcommands-BfiOyfz7.js";
6
+ import { A as readAgentPtysize, B as resolveReadWindow, C as isUnknownManagerToken, D as listRecords, E as lastStdinAt, F as recentReadEdges, G as stdinActivityPath, H as restartHintLines, I as renderLogTailLines, J as waitForLogQuiet, K as stopTipForCli, L as renderRawLog, M as readNotes, N as readPtysize, O as matchKeyword, P as recentMessageEdges, R as renderRawLogLines, S as isSubcommand, T as lastReadAt, U as runSubcommand, V as resolveResumeArgs, W as snapshotStatus, X as writeToIpc, Y as writeKeysPaced, _ as isAgentStuck, a as TYPING_WINDOW_MS, b as isPidAlive, c as controlCodeFromName, d as deriveLiveStatus, f as extractBadges, g as finalizedLines, h as extractTaskCounts, i as READ_WINDOW_MS, j as readLogForRender, k as menuSelectKeys, l as cursorAbs, m as extractNeedsInput, n as MAX_RENDER_BYTES, o as backoffWhileTyping, p as extractMenu, q as submitAndConfirm, r as READ_PAGE_DEFAULT, s as cmdHelp, t as GRACEFUL_EXIT_COMMANDS, u as deriveLiveState, v as isBareManagerInvocation, w as isUserTyping, x as isSlashCommand, y as isExitRequest, z as resolveOne } from "./subcommands-CWDqhKQe.js";
7
7
  import "./notifyStore-2SWKGwZI.js";
8
8
  import "./webrtcLink-DLaJfTcB.js";
9
- import "./remotes-b6reVXzo.js";
9
+ import "./remotes-BjsglpjL.js";
10
10
 
11
11
  export { READ_WINDOW_MS, cmdHelp, isBareManagerInvocation, isSubcommand, isUnknownManagerToken, lastReadAt, runSubcommand };
@@ -7,7 +7,7 @@ import { t as formatIdentity } from "./identity-CKRuYUFi.js";
7
7
  import { n as isWorkingScreen, r as parseMenu, t as classifyNeedsInput } from "./needsInput-BHopZGM8.js";
8
8
  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";
9
9
  import { n as isWebrtcSpec } from "./webrtcLink-DLaJfTcB.js";
10
- import { a as resolveRemoteSpec, i as readRemotes } from "./remotes-b6reVXzo.js";
10
+ import { a as resolveRemoteSpec, i as readRemotes } from "./remotes-BjsglpjL.js";
11
11
  import ms from "ms";
12
12
  import yargs from "yargs";
13
13
  import { appendFile, mkdir, open, readFile, stat, writeFile } from "fs/promises";
@@ -906,7 +906,7 @@ async function runSubcommand(argv) {
906
906
  switch (sub) {
907
907
  case "ls":
908
908
  case "list": return await cmdLs(rest);
909
- case "ps": return await (await import("./cmdPs-Bm4JG7hi.js")).cmdPs(rest);
909
+ case "ps": return await (await import("./cmdPs-BYBZQ0Vc.js")).cmdPs(rest);
910
910
  case "status": return await cmdStatus(rest);
911
911
  case "whoami": return await cmdWhoami(rest);
912
912
  case "result": return await cmdResult(rest);
@@ -917,7 +917,7 @@ async function runSubcommand(argv) {
917
917
  case "tail": return await cmdRead(rest, { mode: "tail" });
918
918
  case "head": return await cmdRead(rest, { mode: "head" });
919
919
  case "hist":
920
- case "history": return await (await import("./hist-DSYaJEd3.js")).cmdHist(rest);
920
+ case "history": return await (await import("./hist-DZxq7NMA.js")).cmdHist(rest);
921
921
  case "send": return await cmdSend(rest);
922
922
  case "msgs": return await cmdMsgs(rest);
923
923
  case "key": return await cmdKey(rest);
@@ -944,7 +944,7 @@ async function runSubcommand(argv) {
944
944
  return sub === "ask" ? await runAskSubcommand(rest, deps) : await runAnswerSubcommand(rest, deps);
945
945
  }
946
946
  case "todo": {
947
- const { runTodoSubcommand } = await import("./todoCli-MWrejmdM.js");
947
+ const { runTodoSubcommand } = await import("./todoCli-azqbjBtz.js");
948
948
  return runTodoSubcommand(rest);
949
949
  }
950
950
  case "ch":
@@ -953,47 +953,47 @@ async function runSubcommand(argv) {
953
953
  return cmdCh(rest);
954
954
  }
955
955
  case "term": {
956
- const { cmdTerm } = await import("./terminal-C0tnGnrZ.js");
956
+ const { cmdTerm } = await import("./terminal-CcmBzB3G.js");
957
957
  return cmdTerm(rest);
958
958
  }
959
959
  case "widget": {
960
- const { cmdWidget } = await import("./widget-CJqpScCG.js");
960
+ const { cmdWidget } = await import("./widget-D2cCC8nz.js");
961
961
  return cmdWidget(rest);
962
962
  }
963
963
  case "mint": {
964
- const { cmdMint } = await import("./widget-CJqpScCG.js");
964
+ const { cmdMint } = await import("./widget-D2cCC8nz.js");
965
965
  return cmdMint(rest);
966
966
  }
967
967
  case "serve": {
968
- const { cmdServe } = await import("./serve-DaDlOtss.js");
968
+ const { cmdServe } = await import("./serve-CMsvjqPU.js");
969
969
  return cmdServe(rest);
970
970
  }
971
971
  case "tray": {
972
- const { cmdTray } = await import("./trayApp-BrAMlCY7.js");
972
+ const { cmdTray } = await import("./trayApp-BovAZs7m.js");
973
973
  return cmdTray(rest);
974
974
  }
975
975
  case "setup": {
976
- const { cmdSetup } = await import("./setup-Cqy8nRrq.js");
976
+ const { cmdSetup } = await import("./setup-BmxYINCx.js");
977
977
  return cmdSetup(rest);
978
978
  }
979
979
  case "ws": {
980
- const { cmdWs } = await import("./ws-DzCKvzWD.js");
980
+ const { cmdWs } = await import("./ws-CyO9r4jx.js");
981
981
  return cmdWs(rest);
982
982
  }
983
983
  case "schedule": {
984
- const { cmdSchedule } = await import("./schedule-DLoUmyJh.js");
984
+ const { cmdSchedule } = await import("./schedule-pim0Izhs.js");
985
985
  return cmdSchedule(rest);
986
986
  }
987
987
  case "remote": {
988
- const { cmdRemote } = await import("./remotes-BlHTR9ow.js");
988
+ const { cmdRemote } = await import("./remotes-CAqtL_Ib.js");
989
989
  return cmdRemote(rest);
990
990
  }
991
991
  case "expose": {
992
- const { cmdExpose } = await import("./expose-Ds9aUFsq.js");
992
+ const { cmdExpose } = await import("./expose-BlddYYx9.js");
993
993
  return cmdExpose(rest);
994
994
  }
995
995
  case "callback": {
996
- const { cmdCallback } = await import("./callback-DeaETuHt.js");
996
+ const { cmdCallback } = await import("./callback-Dwnkeqpz.js");
997
997
  return cmdCallback(rest);
998
998
  }
999
999
  case "reap":
@@ -1004,7 +1004,7 @@ async function runSubcommand(argv) {
1004
1004
  return await cmdDsh(rest);
1005
1005
  }
1006
1006
  case "gc": {
1007
- const { gcOldBinaryDirs } = await import("./rustBinary-D12k7iOD.js");
1007
+ const { gcOldBinaryDirs } = await import("./rustBinary-Dq0AytZ7.js");
1008
1008
  const res = gcOldBinaryDirs();
1009
1009
  if (res.removed.length === 0) process.stdout.write("no old agent-yes binary cache dirs to remove\n");
1010
1010
  else {
@@ -1438,7 +1438,7 @@ async function fetchRemoteRecordsRaw(url, token, opts) {
1438
1438
  let base = url;
1439
1439
  let bearer = token;
1440
1440
  if (isWebrtcSpec(url)) {
1441
- const { startWebrtcBridge } = await import("./webrtcRemote-H9Hok0_R.js");
1441
+ const { startWebrtcBridge } = await import("./webrtcRemote-Bevc5ogS.js");
1442
1442
  bridge = await startWebrtcBridge(url);
1443
1443
  base = bridge.baseUrl;
1444
1444
  bearer = bridge.token;
@@ -3481,7 +3481,7 @@ async function cmdAttach(rest) {
3481
3481
  const winsizeDir = path.join(ayHome, "winsize");
3482
3482
  await mkdir(winsizeDir, { recursive: true });
3483
3483
  const winsizePath = path.join(winsizeDir, String(record.pid));
3484
- const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-DaDlOtss.js");
3484
+ const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-CMsvjqPU.js");
3485
3485
  const daemonBase = await resolveDaemonHttpBase().catch(() => null);
3486
3486
  const daemonToken = daemonBase ? await loadTokenReadOnly().catch(() => null) ?? "" : "";
3487
3487
  const capViewer = `attach:${process.pid}`;
@@ -4199,7 +4199,7 @@ async function cmdNotify(rest) {
4199
4199
  }
4200
4200
  const ensure = async () => {
4201
4201
  if (!argv["ensure-daemon"]) return;
4202
- const { ensureDaemon } = await import("./notifyDaemon-BORqPeAl.js");
4202
+ const { ensureDaemon } = await import("./notifyDaemon-Q3FF-WEZ.js");
4203
4203
  await ensureDaemon().catch(() => null);
4204
4204
  };
4205
4205
  await heartbeatWatcher(parent, selfStartedAt);
@@ -4273,7 +4273,7 @@ async function cmdNotifyCursor(args) {
4273
4273
  }
4274
4274
  async function cmdNotifyd(rest) {
4275
4275
  const sub = rest[0] ?? "status";
4276
- const daemon = await import("./notifyDaemon-BORqPeAl.js");
4276
+ const daemon = await import("./notifyDaemon-Q3FF-WEZ.js");
4277
4277
  switch (sub) {
4278
4278
  case "run": return daemon.runDaemon();
4279
4279
  case "once": return daemon.runDaemon({ once: true });
@@ -4300,4 +4300,4 @@ async function cmdNotifyd(rest) {
4300
4300
 
4301
4301
  //#endregion
4302
4302
  export { buildAgentForest as $, readAgentPtysize as A, resolveReadWindow as B, isUnknownManagerToken as C, listRecords as D, lastStdinAt as E, recentReadEdges as F, stdinActivityPath as G, restartHintLines as H, renderLogTailLines as I, waitForLogQuiet as J, stopTipForCli as K, renderRawLog as L, readNotes as M, readPtysize as N, matchKeyword as O, recentMessageEdges as P, TYPING_BADGE as Q, renderRawLogLines as R, isSubcommand as S, lastReadAt as T, runSubcommand as U, resolveResumeArgs as V, snapshotStatus as W, writeToIpc as X, writeKeysPaced as Y, withIpcLock as Z, isAgentStuck as _, TYPING_WINDOW_MS as a, isPidAlive as b, controlCodeFromName as c, deriveLiveStatus as d, flattenForest as et, extractBadges as f, finalizedLines as g, extractTaskCounts as h, READ_WINDOW_MS as i, readLogForRender as j, menuSelectKeys as k, cursorAbs as l, extractNeedsInput as m, MAX_RENDER_BYTES as n, backoffWhileTyping as o, extractMenu as p, submitAndConfirm as q, READ_PAGE_DEFAULT as r, cmdHelp as s, GRACEFUL_EXIT_COMMANDS as t, deriveLiveState as u, isBareManagerInvocation as v, isUserTyping as w, isSlashCommand as x, isExitRequest as y, resolveOne as z };
4303
- //# sourceMappingURL=subcommands-BfiOyfz7.js.map
4303
+ //# sourceMappingURL=subcommands-CWDqhKQe.js.map
@@ -88,4 +88,4 @@ function linkBunBinsToSystemPath(opts) {
88
88
 
89
89
  //#endregion
90
90
  export { linkBunBinsToSystemPath };
91
- //# sourceMappingURL=systemPathLink-Dl2gJqeg.js.map
91
+ //# sourceMappingURL=systemPathLink-BVdk48Vz.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-DaDlOtss.js");
101
+ const { mintScopedTermToken } = await import("./serve-CMsvjqPU.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-C0tnGnrZ.js.map
138
+ //# sourceMappingURL=terminal-CcmBzB3G.js.map
@@ -583,4 +583,4 @@ async function runTodoSubcommand(rest0) {
583
583
 
584
584
  //#endregion
585
585
  export { runTodoSubcommand };
586
- //# sourceMappingURL=todoCli-MWrejmdM.js.map
586
+ //# sourceMappingURL=todoCli-azqbjBtz.js.map
@@ -187,4 +187,4 @@ async function startTray() {
187
187
 
188
188
  //#endregion
189
189
  export { ensureTray, startTray };
190
- //# sourceMappingURL=tray-BhPVpP_r.js.map
190
+ //# sourceMappingURL=tray-CIt9mCKZ.js.map
@@ -0,0 +1,5 @@
1
+ import "./versionChecker-CWCN4vwm.js";
2
+ import "./rustBinary-B57oRftk.js";
3
+ import { a as trayHiddenMarker, i as launchTray, n as hasDesktop, r as isTrayHidden, t as cmdTray } from "./trayApp-DuZBkGl_.js";
4
+
5
+ export { cmdTray };
@@ -1,4 +1,4 @@
1
- import { i as findTrayLauncher } from "./rustBinary-BmXzqj5z.js";
1
+ import { i as findTrayLauncher } from "./rustBinary-B57oRftk.js";
2
2
  import { t as agentYesHome } from "./agentYesHome-BNtn19J4.js";
3
3
  import { existsSync } from "node:fs";
4
4
  import path from "node:path";
@@ -97,4 +97,4 @@ async function cmdTray(args) {
97
97
 
98
98
  //#endregion
99
99
  export { trayHiddenMarker as a, launchTray as i, hasDesktop as n, isTrayHidden as r, cmdTray as t };
100
- //# sourceMappingURL=trayApp-DvL9qW6V.js.map
100
+ //# sourceMappingURL=trayApp-DuZBkGl_.js.map