agent-yes 1.178.0 → 1.180.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.
@@ -0,0 +1,8 @@
1
+ import "./ts-DHfLvqs_.js";
2
+ import "./logger-CDIsZ-Pp.js";
3
+ import "./versionChecker-BpVojVKc.js";
4
+ import "./pidStore-BIvsBQ8X.js";
5
+ import "./globalPidIndex-CoNr7tS8.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-Dnjsd2rP.js";
7
+
8
+ export { SUPPORTED_CLIS };
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-gy-o1vtp.js";
1
+ import { t as CLIS_CONFIG } from "./ts-DHfLvqs_.js";
2
2
 
3
3
  //#region ts/SUPPORTED_CLIS.ts
4
4
  const SUPPORTED_CLIS = Object.keys(CLIS_CONFIG);
5
5
 
6
6
  //#endregion
7
7
  export { SUPPORTED_CLIS as t };
8
- //# sourceMappingURL=SUPPORTED_CLIS-Cwcgc-Ld.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-Dnjsd2rP.js.map
@@ -1,7 +1,7 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
2
  import "./globalPidIndex-CoNr7tS8.js";
3
3
  import "./configShared-0MnIQ652.js";
4
- import { j as resolveOne } from "./subcommands-CXQItN00.js";
4
+ import { j as resolveOne } from "./subcommands-CmBR4VO1.js";
5
5
  import "./e2e-BeKjLhmO.js";
6
6
  import "./webrtcLink-BG0Xc4-W.js";
7
7
  import "./remotes-DsTnQhyx.js";
@@ -228,4 +228,4 @@ function transformEvent(rawEvent, agentId, forwarded) {
228
228
 
229
229
  //#endregion
230
230
  export { createScopedShare, listShares, revokeAllShares, revokeShare };
231
- //# sourceMappingURL=agentShare-DMJ1FHni.js.map
231
+ //# sourceMappingURL=agentShare-3UnX86C0.js.map
package/dist/cli.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env bun
2
2
  import { t as invokedCliName } from "./invokedCli-uqM2YYA7.js";
3
3
  import { n as logger } from "./logger-CDIsZ-Pp.js";
4
- import { i as versionString, n as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-DQles-2H.js";
5
- import { n as getRustBinary } from "./rustBinary-DgWayfTH.js";
4
+ import { i as versionString, n as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-BpVojVKc.js";
5
+ import { n as getRustBinary } from "./rustBinary-WVFA8nBv.js";
6
6
  import { argv } from "process";
7
7
  import { spawn } from "child_process";
8
8
  import ms from "ms";
@@ -285,7 +285,7 @@ function buildRustArgs(argv, cliFromScript, supportedClis) {
285
285
  const rawArg = process.argv[2];
286
286
  const managerCommands = !invokedCliName(process.argv);
287
287
  const isHelpFlag = rawArg === "-h" || rawArg === "--help";
288
- const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-C2Mb8L-F.js");
288
+ const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-CN3U4oAZ.js");
289
289
  if (isHelpFlag && process.argv.length === 3) {
290
290
  await cmdHelp(managerCommands);
291
291
  process.exit(0);
@@ -327,7 +327,7 @@ if (config.useRust) {
327
327
  }
328
328
  }
329
329
  if (rustBinary) {
330
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-C-iyDN8o.js");
330
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-CL4MbVUV.js");
331
331
  const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
332
332
  if (config.verbose) {
333
333
  console.log(`[rust] Using binary: ${rustBinary}`);
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-gy-o1vtp.js";
1
+ import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-DHfLvqs_.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-DQles-2H.js";
3
+ import "./versionChecker-BpVojVKc.js";
4
4
  import "./pidStore-BIvsBQ8X.js";
5
5
  import "./globalPidIndex-CoNr7tS8.js";
6
6
 
@@ -1,7 +1,7 @@
1
1
  import { n as logger } from "./logger-CDIsZ-Pp.js";
2
2
  import "./globalPidIndex-CoNr7tS8.js";
3
3
  import "./configShared-0MnIQ652.js";
4
- import { G as hostId, J as readInbox, K as listInboxParents, O as renderLogTailLines, Q as notifyDir, S as listRecords, U as appendEvent, W as gcInboxes, X as daemonLockDir, Y as shouldStealLock, Z as daemonLockOwnerPath, _ as isPidAlive, c as deriveLiveState, q as liveWatchers } from "./subcommands-CXQItN00.js";
4
+ import { G as hostId, J as readInbox, K as listInboxParents, O as renderLogTailLines, Q as notifyDir, S as listRecords, U as appendEvent, W as gcInboxes, X as daemonLockDir, Y as shouldStealLock, Z as daemonLockOwnerPath, _ as isPidAlive, c as deriveLiveState, q as liveWatchers } from "./subcommands-CmBR4VO1.js";
5
5
  import "./e2e-BeKjLhmO.js";
6
6
  import "./webrtcLink-BG0Xc4-W.js";
7
7
  import "./remotes-DsTnQhyx.js";
@@ -588,4 +588,4 @@ async function ensureDaemon() {
588
588
 
589
589
  //#endregion
590
590
  export { daemonStatus, ensureDaemon, requestDaemonStop, runDaemon };
591
- //# sourceMappingURL=notifyDaemon-DoJetoUO.js.map
591
+ //# sourceMappingURL=notifyDaemon-DpZX5_Hv.js.map
@@ -1,4 +1,4 @@
1
- import { r as getInstalledPackage } from "./versionChecker-DQles-2H.js";
1
+ import { r as getInstalledPackage } from "./versionChecker-BpVojVKc.js";
2
2
  import { execFileSync } from "child_process";
3
3
  import { existsSync, mkdirSync, unlinkSync } from "fs";
4
4
  import { chmod, copyFile } from "fs/promises";
@@ -225,4 +225,4 @@ async function getRustBinary(options = {}) {
225
225
 
226
226
  //#endregion
227
227
  export { getRustBinary as n, findSpawnHiddenLauncher as t };
228
- //# sourceMappingURL=rustBinary-DgWayfTH.js.map
228
+ //# sourceMappingURL=rustBinary-WVFA8nBv.js.map
@@ -1,9 +1,9 @@
1
- import "./ts-gy-o1vtp.js";
1
+ import "./ts-DHfLvqs_.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-DQles-2H.js";
3
+ import "./versionChecker-BpVojVKc.js";
4
4
  import "./pidStore-BIvsBQ8X.js";
5
5
  import "./globalPidIndex-CoNr7tS8.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-Cwcgc-Ld.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-Dnjsd2rP.js";
7
7
  import { d as resolveSpawnCwd } from "./workspaceConfig-DKd6UvVm.js";
8
8
  import { createHash } from "node:crypto";
9
9
 
@@ -141,4 +141,4 @@ async function cmdSchedule(rest) {
141
141
 
142
142
  //#endregion
143
143
  export { cmdSchedule };
144
- //# sourceMappingURL=schedule-Ft35Itlt.js.map
144
+ //# sourceMappingURL=schedule-DLXWkR0z.js.map
@@ -1,13 +1,13 @@
1
- import "./ts-gy-o1vtp.js";
1
+ import "./ts-DHfLvqs_.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import { r as getInstalledPackage } from "./versionChecker-DQles-2H.js";
4
- import { t as findSpawnHiddenLauncher } from "./rustBinary-DgWayfTH.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-BpVojVKc.js";
4
+ import { t as findSpawnHiddenLauncher } from "./rustBinary-WVFA8nBv.js";
5
5
  import "./pidStore-BIvsBQ8X.js";
6
6
  import { a as updateGlobalPidStatus } from "./globalPidIndex-CoNr7tS8.js";
7
7
  import { t as pgidForWrapper } from "./reaper-CWF2_ATd.js";
8
8
  import "./configShared-0MnIQ652.js";
9
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-Cwcgc-Ld.js";
10
- import { $ as TYPING_BADGE, D as recentReadEdges, E as readPtysize, H as writeToIpc, I as snapshotStatus, S as listRecords, T as readNotes, b as isUserTyping, f as extractNeedsInput, j as resolveOne, k as renderRawLog, l as deriveLiveStatus, o as controlCodeFromName, p as extractTaskCounts, u as extractBadges } from "./subcommands-CXQItN00.js";
9
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-Dnjsd2rP.js";
10
+ import { $ as TYPING_BADGE, D as recentReadEdges, E as readPtysize, H as writeToIpc, I as snapshotStatus, O as renderLogTailLines, S as listRecords, T as readNotes, b as isUserTyping, f as extractNeedsInput, j as resolveOne, k as renderRawLog, l as deriveLiveStatus, o as controlCodeFromName, p as extractTaskCounts, u as extractBadges } from "./subcommands-CmBR4VO1.js";
11
11
  import "./e2e-BeKjLhmO.js";
12
12
  import "./webrtcLink-BG0Xc4-W.js";
13
13
  import "./remotes-DsTnQhyx.js";
@@ -781,6 +781,26 @@ Options:
781
781
  return null;
782
782
  }
783
783
  };
784
+ const previewCache = /* @__PURE__ */ new Map();
785
+ const SECRETISH = /(api[-_]?key|secret|token|password|passwd|bearer|authorization|private[-_]?key)\s*[=:]/i;
786
+ const logPreviewLines = async (logFile) => {
787
+ if (!logFile) return null;
788
+ try {
789
+ const { size, mtimeMs } = await stat(logFile);
790
+ const hit = previewCache.get(logFile);
791
+ if (hit && hit.size === size && hit.mtimeMs === mtimeMs) return hit.lines;
792
+ const lines = (await renderLogTailLines(logFile, 12))?.map((ln) => SECRETISH.test(ln) ? "···" : ln.replace(/[A-Za-z0-9+/_-]{40,}/g, "····").slice(0, 160)) ?? null;
793
+ while (lines?.length && !lines[lines.length - 1].trim()) lines.pop();
794
+ previewCache.set(logFile, {
795
+ size,
796
+ mtimeMs,
797
+ lines
798
+ });
799
+ return lines;
800
+ } catch {
801
+ return null;
802
+ }
803
+ };
784
804
  const taskCache = /* @__PURE__ */ new Map();
785
805
  const logTasks = async (logFile) => {
786
806
  if (!logFile) return null;
@@ -1094,7 +1114,22 @@ Options:
1094
1114
  };
1095
1115
  const byWrapper = new Map(records.map((r) => [r.wrapper_pid ?? r.pid, r.pid]));
1096
1116
  const nid = (pid) => `${ns}/${pid}`;
1097
- const nodes = records.map((r, i) => ({
1117
+ const embedBase = `${url.protocol}//${url.host}`;
1118
+ const hintsOf = async (r) => {
1119
+ const embed = { url: `${embedBase}/r/#node=${r.pid}&embed&k=${encodeURIComponent(token)}` };
1120
+ const lines = await logPreviewLines(r.log_file);
1121
+ if (!lines?.length) return { embed };
1122
+ return {
1123
+ embed,
1124
+ preview: {
1125
+ kind: "terminal",
1126
+ title: await logTitle(r.log_file) ?? `${r.cli} #${r.pid}`,
1127
+ status: r.status,
1128
+ lines
1129
+ }
1130
+ };
1131
+ };
1132
+ const nodes = await Promise.all(records.map(async (r, i) => ({
1098
1133
  id: nid(r.pid),
1099
1134
  app: "agent-yes",
1100
1135
  type: `${r.cli}-agent`,
@@ -1112,8 +1147,9 @@ Options:
1112
1147
  h: 128
1113
1148
  },
1114
1149
  inputs: [textIn],
1115
- outputs: [textOut]
1116
- }));
1150
+ outputs: [textOut],
1151
+ renderHints: await hintsOf(r)
1152
+ })));
1117
1153
  const codex = records.filter((r) => r.cli === "codex").sort((a, b) => (b.last_active_at ?? 0) - (a.last_active_at ?? 0))[0];
1118
1154
  nodes.push({
1119
1155
  id: "ay://agent-yes/codex-agent",
@@ -1133,7 +1169,8 @@ Options:
1133
1169
  h: 128
1134
1170
  },
1135
1171
  inputs: [textIn],
1136
- outputs: [textOut]
1172
+ outputs: [textOut],
1173
+ renderHints: codex ? await hintsOf(codex) : void 0
1137
1174
  });
1138
1175
  const present = new Set(nodes.map((n) => n.id));
1139
1176
  const edges = (await recentReadEdges()).filter((e) => e.by !== e.target && present.has(nid(e.target)) && present.has(nid(e.by))).map((e) => ({
@@ -1699,7 +1736,7 @@ Options:
1699
1736
  const perm = body.perm ?? "r";
1700
1737
  if (perm !== "r" && perm !== "rw") return new Response(`invalid perm ${perm} (want r or rw)`, { status: 400 });
1701
1738
  try {
1702
- const { createScopedShare } = await import("./agentShare-DMJ1FHni.js");
1739
+ const { createScopedShare } = await import("./agentShare-3UnX86C0.js");
1703
1740
  const share = await createScopedShare({
1704
1741
  agent: body.agent,
1705
1742
  perm,
@@ -1714,12 +1751,12 @@ Options:
1714
1751
  }
1715
1752
  }
1716
1753
  if (req.method === "GET" && p === "/api/shares") {
1717
- const { listShares } = await import("./agentShare-DMJ1FHni.js");
1754
+ const { listShares } = await import("./agentShare-3UnX86C0.js");
1718
1755
  return Response.json(listShares());
1719
1756
  }
1720
1757
  const revokeM = /^\/api\/share\/([^/]+)$/.exec(p);
1721
1758
  if (req.method === "DELETE" && revokeM) {
1722
- const { revokeShare } = await import("./agentShare-DMJ1FHni.js");
1759
+ const { revokeShare } = await import("./agentShare-3UnX86C0.js");
1723
1760
  const ok = revokeShare(decodeURIComponent(revokeM[1]));
1724
1761
  return new Response(ok ? "revoked" : "no such share", { status: ok ? 200 : 404 });
1725
1762
  }
@@ -1740,11 +1777,12 @@ Options:
1740
1777
  "worker-src 'self'",
1741
1778
  "manifest-src 'self'"
1742
1779
  ].join("; ");
1743
- const serveUiFile = async (name, type) => {
1780
+ const RGUI_CSP = CONSOLE_CSP.replace("frame-ancestors 'none'", "frame-ancestors *");
1781
+ const serveUiFile = async (name, type, csp = CONSOLE_CSP) => {
1744
1782
  try {
1745
1783
  const buf = await readFile(path.join(uiDir, name));
1746
1784
  const headers = { "Content-Type": type };
1747
- if (type.includes("text/html")) headers["Content-Security-Policy"] = CONSOLE_CSP;
1785
+ if (type.includes("text/html")) headers["Content-Security-Policy"] = csp;
1748
1786
  return new Response(buf, { headers });
1749
1787
  } catch {
1750
1788
  return new Response("UI assets not found in this install — use the /api endpoints", { status: 404 });
@@ -1753,6 +1791,10 @@ Options:
1753
1791
  const httpFetch = async (req) => {
1754
1792
  const p = new URL(req.url).pathname;
1755
1793
  if (req.method === "GET" && (p === "/" || p === "/index.html")) return serveUiFile("index.html", "text/html; charset=utf-8");
1794
+ if (req.method === "GET" && p === "/r") return Response.redirect("/r/", 302);
1795
+ if (req.method === "GET" && (p === "/r/" || p === "/r/index.html")) return serveUiFile("rgui/dist/index.html", "text/html; charset=utf-8", RGUI_CSP);
1796
+ if (req.method === "GET" && p === "/r/main.js") return serveUiFile("rgui/dist/main.js", "text/javascript; charset=utf-8");
1797
+ if (req.method === "GET" && p === "/r/main.js.map") return serveUiFile("rgui/dist/main.js.map", "application/json");
1756
1798
  if (req.method === "GET" && p === "/room-client.js") return serveUiFile("room-client.js", "text/javascript; charset=utf-8");
1757
1799
  if (req.method === "GET" && p === "/console-logic.js") return serveUiFile("console-logic.js", "text/javascript; charset=utf-8");
1758
1800
  if (req.method === "GET" && p === "/e2e.js") return serveUiFile("e2e.js", "text/javascript; charset=utf-8");
@@ -1859,7 +1901,7 @@ Options:
1859
1901
  const shutdown = (resolve) => {
1860
1902
  if (heartbeat) clearInterval(heartbeat);
1861
1903
  closeShare?.();
1862
- import("./agentShare-DMJ1FHni.js").then((m) => m.revokeAllShares()).catch(() => {});
1904
+ import("./agentShare-3UnX86C0.js").then((m) => m.revokeAllShares()).catch(() => {});
1863
1905
  server?.stop();
1864
1906
  resolve();
1865
1907
  };
@@ -1872,4 +1914,4 @@ Options:
1872
1914
 
1873
1915
  //#endregion
1874
1916
  export { cmdServe };
1875
- //# sourceMappingURL=serve-1qYQnCKT.js.map
1917
+ //# sourceMappingURL=serve-B0k-MNB1.js.map
@@ -32,7 +32,7 @@ async function cmdSetup(rest) {
32
32
  if (!existsSync(abs)) process.stderr.write(` note: that directory doesn't exist yet — create it, or agents spawned there will fail\n`);
33
33
  if (noShare) return 0;
34
34
  process.stdout.write(`\nsharing this machine to agent-yes.com…\n`);
35
- const { cmdServe } = await import("./serve-1qYQnCKT.js");
35
+ const { cmdServe } = await import("./serve-B0k-MNB1.js");
36
36
  return cmdServe([
37
37
  "install",
38
38
  "--share",
@@ -42,4 +42,4 @@ async function cmdSetup(rest) {
42
42
 
43
43
  //#endregion
44
44
  export { cmdSetup };
45
- //# sourceMappingURL=setup-CwCLuCJ2.js.map
45
+ //# sourceMappingURL=setup-DSaBdB74.js.map
@@ -1,7 +1,7 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
2
  import "./globalPidIndex-CoNr7tS8.js";
3
3
  import "./configShared-0MnIQ652.js";
4
- import { A as renderRawLogLines, B as waitForLogQuiet, C as matchKeyword, D as recentReadEdges, E as readPtysize, F as runSubcommand, H as writeToIpc, I as snapshotStatus, L as stdinActivityPath, M as resolveReadWindow, N as resolveResumeArgs, O as renderLogTailLines, P as restartHintLines, R as stopTipForCli, S as listRecords, T as readNotes, V as writeKeysPaced, _ as isPidAlive, a as cmdHelp, b as isUserTyping, c as deriveLiveState, d as extractMenu, f as extractNeedsInput, g as isExitRequest, h as isAgentStuck, i as backoffWhileTyping, j as resolveOne, k as renderRawLog, l as deriveLiveStatus, m as finalizedLines, n as READ_PAGE_DEFAULT, o as controlCodeFromName, p as extractTaskCounts, r as TYPING_WINDOW_MS, s as cursorAbs, t as GRACEFUL_EXIT_COMMANDS, u as extractBadges, v as isSlashCommand, w as menuSelectKeys, x as lastStdinAt, y as isSubcommand, z as submitAndConfirm } from "./subcommands-CXQItN00.js";
4
+ import { A as renderRawLogLines, B as waitForLogQuiet, C as matchKeyword, D as recentReadEdges, E as readPtysize, F as runSubcommand, H as writeToIpc, I as snapshotStatus, L as stdinActivityPath, M as resolveReadWindow, N as resolveResumeArgs, O as renderLogTailLines, P as restartHintLines, R as stopTipForCli, S as listRecords, T as readNotes, V as writeKeysPaced, _ as isPidAlive, a as cmdHelp, b as isUserTyping, c as deriveLiveState, d as extractMenu, f as extractNeedsInput, g as isExitRequest, h as isAgentStuck, i as backoffWhileTyping, j as resolveOne, k as renderRawLog, l as deriveLiveStatus, m as finalizedLines, n as READ_PAGE_DEFAULT, o as controlCodeFromName, p as extractTaskCounts, r as TYPING_WINDOW_MS, s as cursorAbs, t as GRACEFUL_EXIT_COMMANDS, u as extractBadges, v as isSlashCommand, w as menuSelectKeys, x as lastStdinAt, y as isSubcommand, z as submitAndConfirm } from "./subcommands-CmBR4VO1.js";
5
5
  import "./e2e-BeKjLhmO.js";
6
6
  import "./webrtcLink-BG0Xc4-W.js";
7
7
  import "./remotes-DsTnQhyx.js";
@@ -1145,15 +1145,15 @@ async function runSubcommand(argv) {
1145
1145
  case "restart": return await cmdRestart(rest);
1146
1146
  case "note": return await cmdNote(rest);
1147
1147
  case "serve": {
1148
- const { cmdServe } = await import("./serve-1qYQnCKT.js");
1148
+ const { cmdServe } = await import("./serve-B0k-MNB1.js");
1149
1149
  return cmdServe(rest);
1150
1150
  }
1151
1151
  case "setup": {
1152
- const { cmdSetup } = await import("./setup-CwCLuCJ2.js");
1152
+ const { cmdSetup } = await import("./setup-DSaBdB74.js");
1153
1153
  return cmdSetup(rest);
1154
1154
  }
1155
1155
  case "schedule": {
1156
- const { cmdSchedule } = await import("./schedule-Ft35Itlt.js");
1156
+ const { cmdSchedule } = await import("./schedule-DLXWkR0z.js");
1157
1157
  return cmdSchedule(rest);
1158
1158
  }
1159
1159
  case "remote": {
@@ -3991,7 +3991,7 @@ async function cmdNotify(rest) {
3991
3991
  }
3992
3992
  const ensure = async () => {
3993
3993
  if (!argv["ensure-daemon"]) return;
3994
- const { ensureDaemon } = await import("./notifyDaemon-DoJetoUO.js");
3994
+ const { ensureDaemon } = await import("./notifyDaemon-DpZX5_Hv.js");
3995
3995
  await ensureDaemon().catch(() => null);
3996
3996
  };
3997
3997
  await heartbeatWatcher(parent, selfStartedAt);
@@ -4065,7 +4065,7 @@ async function cmdNotifyCursor(args) {
4065
4065
  }
4066
4066
  async function cmdNotifyd(rest) {
4067
4067
  const sub = rest[0] ?? "status";
4068
- const daemon = await import("./notifyDaemon-DoJetoUO.js");
4068
+ const daemon = await import("./notifyDaemon-DpZX5_Hv.js");
4069
4069
  switch (sub) {
4070
4070
  case "run": return daemon.runDaemon();
4071
4071
  case "once": return daemon.runDaemon({ once: true });
@@ -4092,4 +4092,4 @@ async function cmdNotifyd(rest) {
4092
4092
 
4093
4093
  //#endregion
4094
4094
  export { TYPING_BADGE as $, renderRawLogLines as A, waitForLogQuiet as B, matchKeyword as C, recentReadEdges as D, readPtysize as E, runSubcommand as F, hostId as G, writeToIpc as H, snapshotStatus as I, readInbox as J, listInboxParents as K, stdinActivityPath as L, resolveReadWindow as M, resolveResumeArgs as N, renderLogTailLines as O, restartHintLines as P, notifyDir as Q, stopTipForCli as R, listRecords as S, readNotes as T, appendEvent as U, writeKeysPaced as V, gcInboxes as W, daemonLockDir as X, shouldStealLock as Y, daemonLockOwnerPath as Z, isPidAlive as _, cmdHelp as a, isUserTyping as b, deriveLiveState as c, extractMenu as d, extractNeedsInput as f, isExitRequest as g, isAgentStuck as h, backoffWhileTyping as i, resolveOne as j, renderRawLog as k, deriveLiveStatus as l, finalizedLines as m, READ_PAGE_DEFAULT as n, controlCodeFromName as o, extractTaskCounts as p, liveWatchers as q, TYPING_WINDOW_MS as r, cursorAbs as s, GRACEFUL_EXIT_COMMANDS as t, extractBadges as u, isSlashCommand as v, menuSelectKeys as w, lastStdinAt as x, isSubcommand as y, submitAndConfirm as z };
4095
- //# sourceMappingURL=subcommands-CXQItN00.js.map
4095
+ //# sourceMappingURL=subcommands-CmBR4VO1.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as logger, t as addTransport } from "./logger-CDIsZ-Pp.js";
2
- import { r as getInstalledPackage } from "./versionChecker-DQles-2H.js";
2
+ import { r as getInstalledPackage } from "./versionChecker-BpVojVKc.js";
3
3
  import { t as agentYesHome } from "./agentYesHome-CtHb5b71.js";
4
4
  import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-CNMl13dC.js";
5
5
  import { t as PidStore } from "./pidStore-BIvsBQ8X.js";
@@ -1824,4 +1824,4 @@ function sleep(ms) {
1824
1824
 
1825
1825
  //#endregion
1826
1826
  export { removeControlCharacters as a, AgentContext as i, agentYes as n, config as r, CLIS_CONFIG as t };
1827
- //# sourceMappingURL=ts-gy-o1vtp.js.map
1827
+ //# sourceMappingURL=ts-DHfLvqs_.js.map
@@ -7,7 +7,7 @@ import { fileURLToPath } from "url";
7
7
 
8
8
  //#region package.json
9
9
  var name = "agent-yes";
10
- var version = "1.178.0";
10
+ var version = "1.180.0";
11
11
 
12
12
  //#endregion
13
13
  //#region ts/versionChecker.ts
@@ -215,4 +215,4 @@ async function displayVersion() {
215
215
 
216
216
  //#endregion
217
217
  export { versionString as i, displayVersion as n, getInstalledPackage as r, checkAndAutoUpdate as t };
218
- //# sourceMappingURL=versionChecker-DQles-2H.js.map
218
+ //# sourceMappingURL=versionChecker-BpVojVKc.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.178.0",
3
+ "version": "1.180.0",
4
4
  "description": "A wrapper tool that automates interactions with various AI CLI tools by automatically handling common prompts and responses.",
5
5
  "keywords": [
6
6
  "ai",
package/ts/serve.ts CHANGED
@@ -17,6 +17,7 @@ import {
17
17
  readNotes,
18
18
  readPtysize,
19
19
  recentReadEdges,
20
+ renderLogTailLines,
20
21
  renderRawLog,
21
22
  resolveOne,
22
23
  snapshotStatus,
@@ -1139,6 +1140,33 @@ export async function cmdServe(rest: string[]): Promise<number> {
1139
1140
  }
1140
1141
  };
1141
1142
 
1143
+ // Per-agent federated terminal preview: last ~12 rendered TUI lines for the
1144
+ // /api/graph feed's renderHints.preview (rgui draws them as a real TUI card —
1145
+ // see lib/rgui src/render/terminalPreview.ts). Cached per (size, mtime) like
1146
+ // logTitle so a 5s feed poll over a big fleet stays cheap. Coarse redaction at
1147
+ // the SOURCE: secret-shaped lines are dropped to "···" and long credential-ish
1148
+ // blobs masked — the feed is token-gated, but tails travel to other rgui hosts.
1149
+ const previewCache = new Map<string, { size: number; mtimeMs: number; lines: string[] | null }>();
1150
+ const SECRETISH = /(api[-_]?key|secret|token|password|passwd|bearer|authorization|private[-_]?key)\s*[=:]/i;
1151
+ const logPreviewLines = async (logFile: string | null | undefined): Promise<string[] | null> => {
1152
+ if (!logFile) return null;
1153
+ try {
1154
+ const { size, mtimeMs } = await stat(logFile);
1155
+ const hit = previewCache.get(logFile);
1156
+ if (hit && hit.size === size && hit.mtimeMs === mtimeMs) return hit.lines;
1157
+ const raw = await renderLogTailLines(logFile, 12);
1158
+ const lines =
1159
+ raw?.map((ln) =>
1160
+ SECRETISH.test(ln) ? "···" : ln.replace(/[A-Za-z0-9+/_-]{40,}/g, "····").slice(0, 160),
1161
+ ) ?? null;
1162
+ while (lines?.length && !lines[lines.length - 1]!.trim()) lines.pop();
1163
+ previewCache.set(logFile, { size, mtimeMs, lines });
1164
+ return lines;
1165
+ } catch {
1166
+ return null;
1167
+ }
1168
+ };
1169
+
1142
1170
  // Per-agent task progress ({done,total}) parsed from the agent's rendered TUI
1143
1171
  // screen (the durable raw log). Cached per (size, mtime) exactly like logTitle:
1144
1172
  // re-parse only when the log grew, so the 1s tick stays cheap even though each
@@ -1618,20 +1646,40 @@ export async function cmdServe(rest: string[]): Promise<number> {
1618
1646
  const textOut = { id: "text-out", label: "text", kind: "text" };
1619
1647
  const byWrapper = new Map(records.map((r) => [r.wrapper_pid ?? r.pid, r.pid]));
1620
1648
  const nid = (pid: number) => `${ns}/${pid}`;
1621
- const nodes = records.map((r, i) => ({
1622
- id: nid(r.pid),
1623
- app: "agent-yes",
1624
- type: `${r.cli}-agent`,
1625
- title: `${r.cli} #${r.pid}`,
1626
- category: "agent-yes",
1627
- owner: `agent-yes:${origin}`,
1628
- status: r.status,
1629
- parent: r.parent_pid && byWrapper.has(r.parent_pid) ? nid(byWrapper.get(r.parent_pid)!) : undefined,
1630
- pos: { x: (i % 8) * 320, y: Math.floor(i / 8) * 200 },
1631
- size: { w: 256, h: 128 },
1632
- inputs: [textIn],
1633
- outputs: [textOut],
1634
- }));
1649
+ // renderHints.preview: the REAL agent TUI tail (redacted in
1650
+ // logPreviewLines), drawn by rgui's federatedTerminalPreview as a live
1651
+ // terminal card on the mirroring host
1652
+ // renderHints.embed: the publisher's own single-agent live view — the
1653
+ // consumer iframes it over the node rect (preview stays the LOD
1654
+ // fallback). Carries the serve token: the feed itself is gated by the
1655
+ // same token, so its consumers hold it already.
1656
+ const embedBase = `${url.protocol}//${url.host}`;
1657
+ const hintsOf = async (r: (typeof records)[number]) => {
1658
+ const embed = {
1659
+ url: `${embedBase}/r/#node=${r.pid}&embed&k=${encodeURIComponent(token)}`,
1660
+ };
1661
+ const lines = await logPreviewLines(r.log_file);
1662
+ if (!lines?.length) return { embed };
1663
+ const title = (await logTitle(r.log_file)) ?? `${r.cli} #${r.pid}`;
1664
+ return { embed, preview: { kind: "terminal", title, status: r.status, lines } };
1665
+ };
1666
+ const nodes = await Promise.all(
1667
+ records.map(async (r, i) => ({
1668
+ id: nid(r.pid),
1669
+ app: "agent-yes",
1670
+ type: `${r.cli}-agent`,
1671
+ title: `${r.cli} #${r.pid}`,
1672
+ category: "agent-yes",
1673
+ owner: `agent-yes:${origin}`,
1674
+ status: r.status,
1675
+ parent: r.parent_pid && byWrapper.has(r.parent_pid) ? nid(byWrapper.get(r.parent_pid)!) : undefined,
1676
+ pos: { x: (i % 8) * 320, y: Math.floor(i / 8) * 200 },
1677
+ size: { w: 256, h: 128 },
1678
+ inputs: [textIn],
1679
+ outputs: [textOut],
1680
+ renderHints: await hintsOf(r),
1681
+ })),
1682
+ );
1635
1683
  const codex = records
1636
1684
  .filter((r) => r.cli === "codex")
1637
1685
  .sort((a, b) => (b.last_active_at ?? 0) - (a.last_active_at ?? 0))[0];
@@ -1648,6 +1696,7 @@ export async function cmdServe(rest: string[]): Promise<number> {
1648
1696
  size: { w: 256, h: 128 },
1649
1697
  inputs: [textIn],
1650
1698
  outputs: [textOut],
1699
+ renderHints: codex ? await hintsOf(codex) : undefined,
1651
1700
  });
1652
1701
  const present = new Set(nodes.map((n) => n.id));
1653
1702
  const edges = (await recentReadEdges())
@@ -2565,11 +2614,15 @@ export async function cmdServe(rest: string[]): Promise<number> {
2565
2614
  "worker-src 'self'",
2566
2615
  "manifest-src 'self'",
2567
2616
  ].join("; ");
2568
- const serveUiFile = async (name: string, type: string): Promise<Response> => {
2617
+ // The /r (rgui) page is embeddable: its #node=<pid>&embed view is the
2618
+ // federation renderHints.embed target, iframed by OTHER rgui hosts over the
2619
+ // node rect — so frame-ancestors opens up, unlike the console's 'none'.
2620
+ const RGUI_CSP = CONSOLE_CSP.replace("frame-ancestors 'none'", "frame-ancestors *");
2621
+ const serveUiFile = async (name: string, type: string, csp = CONSOLE_CSP): Promise<Response> => {
2569
2622
  try {
2570
2623
  const buf = await readFile(path.join(uiDir, name));
2571
2624
  const headers: Record<string, string> = { "Content-Type": type };
2572
- if (type.includes("text/html")) headers["Content-Security-Policy"] = CONSOLE_CSP;
2625
+ if (type.includes("text/html")) headers["Content-Security-Policy"] = csp;
2573
2626
  return new Response(buf, { headers });
2574
2627
  } catch {
2575
2628
  return new Response("UI assets not found in this install — use the /api endpoints", {
@@ -2581,6 +2634,16 @@ export async function cmdServe(rest: string[]): Promise<number> {
2581
2634
  const p = new URL(req.url).pathname;
2582
2635
  if (req.method === "GET" && (p === "/" || p === "/index.html"))
2583
2636
  return serveUiFile("index.html", "text/html; charset=utf-8");
2637
+ // /r — the rgui forest page (built to lab/ui/rgui/dist by scripts/build-rgui.ts),
2638
+ // served here so renderHints.embed URLs work with no extra host. Relative
2639
+ // asset paths need the trailing slash, so bare /r redirects.
2640
+ if (req.method === "GET" && p === "/r") return Response.redirect("/r/", 302);
2641
+ if (req.method === "GET" && (p === "/r/" || p === "/r/index.html"))
2642
+ return serveUiFile("rgui/dist/index.html", "text/html; charset=utf-8", RGUI_CSP);
2643
+ if (req.method === "GET" && p === "/r/main.js")
2644
+ return serveUiFile("rgui/dist/main.js", "text/javascript; charset=utf-8");
2645
+ if (req.method === "GET" && p === "/r/main.js.map")
2646
+ return serveUiFile("rgui/dist/main.js.map", "application/json");
2584
2647
  if (req.method === "GET" && p === "/room-client.js")
2585
2648
  return serveUiFile("room-client.js", "text/javascript; charset=utf-8");
2586
2649
  if (req.method === "GET" && p === "/console-logic.js")
@@ -1,8 +0,0 @@
1
- import "./ts-gy-o1vtp.js";
2
- import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-DQles-2H.js";
4
- import "./pidStore-BIvsBQ8X.js";
5
- import "./globalPidIndex-CoNr7tS8.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-Cwcgc-Ld.js";
7
-
8
- export { SUPPORTED_CLIS };