agent-yes 1.255.1 → 1.256.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 (29) hide show
  1. package/dist/{SUPPORTED_CLIS-BwRdGQ4I.js → SUPPORTED_CLIS-DCgfUvkk.js} +2 -2
  2. package/dist/{SUPPORTED_CLIS-Cuzio132.js → SUPPORTED_CLIS-FQCbUoI-.js} +3 -3
  3. package/dist/{agentShare-BwDxVzaX.js → agentShare-B-UFJIE3.js} +2 -2
  4. package/dist/{browser-DV0CLEwt.js → browser-jKmGe4_X.js} +24 -4
  5. package/dist/{callback-DiQBhFZn.js → callback-DsimZsq6.js} +2 -2
  6. package/dist/{callback-CLZb8HWd.js → callback-FHEnYbFh.js} +3 -3
  7. package/dist/cli.js +5 -5
  8. package/dist/index.js +2 -2
  9. package/dist/{notifyDaemon-Bebw4D7u.js → notifyDaemon-CnhKvdl7.js} +2 -2
  10. package/dist/{rustBinary-Cqb_HJrr.js → rustBinary-B7kmq5S0.js} +2 -2
  11. package/dist/{schedule-DZrXiDPD.js → schedule-D8TWPJuH.js} +4 -4
  12. package/dist/{serve-DWtw6ok5.js → serve-89Gzlv9n.js} +14 -14
  13. package/dist/{setup-CXr_Y5vj.js → setup-B-ufpyWj.js} +2 -2
  14. package/dist/{subcommands-D9W74Jbd.js → subcommands-COp2OWcx.js} +1 -1
  15. package/dist/{subcommands-Cz7ZYodJ.js → subcommands-Cz_tHj4P.js} +13 -13
  16. package/dist/{terminal-B8X6SZ4k.js → terminal-83v9Uzt1.js} +2 -2
  17. package/dist/terminal.js +1 -1
  18. package/dist/trayApp-00UdHVbe.js +5 -0
  19. package/dist/{trayApp-i93_GeIf.js → trayApp-ChsZpZyQ.js} +2 -2
  20. package/dist/{ts-C_4nEOJ9.js → ts-B4LZq-x9.js} +2 -2
  21. package/dist/{versionChecker-DgDRyB3n.js → versionChecker-CKSvRBvj.js} +2 -2
  22. package/dist/{widget-pcjAYbkh.js → widget-DcPvYum4.js} +3 -3
  23. package/dist/widgets.js +1 -1
  24. package/dist/{ws-BdEmGmYi.js → ws-DXmR5W2s.js} +2 -2
  25. package/lab/ui/index.html +104 -5
  26. package/package.json +1 -1
  27. package/ts/subcommands.spec.ts +3 -1
  28. package/ts/terminal/browser.ts +28 -3
  29. package/dist/trayApp-Zta691q9.js +0 -5
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-C_4nEOJ9.js";
1
+ import { t as CLIS_CONFIG } from "./ts-B4LZq-x9.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-BwRdGQ4I.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-DCgfUvkk.js.map
@@ -1,11 +1,11 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./versionChecker-DgDRyB3n.js";
3
- import "./ts-C_4nEOJ9.js";
2
+ import "./versionChecker-CKSvRBvj.js";
3
+ import "./ts-B4LZq-x9.js";
4
4
  import "./todoAutomation-BQRW614S.js";
5
5
  import "./JsonlStore-CPGIR0Wy.js";
6
6
  import "./globalPidIndex-D9DOSd-c.js";
7
7
  import "./pidStore-vnX0bgra.js";
8
8
  import "./messageLog-C-YIzhRj.js";
9
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BwRdGQ4I.js";
9
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DCgfUvkk.js";
10
10
 
11
11
  export { SUPPORTED_CLIS };
@@ -3,7 +3,7 @@ import "./globalPidIndex-D9DOSd-c.js";
3
3
  import "./messageLog-C-YIzhRj.js";
4
4
  import "./e2e-CEIdJGZ7.js";
5
5
  import "./configShared-IBbnn9b8.js";
6
- import { P as resolveOne } from "./subcommands-Cz7ZYodJ.js";
6
+ import { P as resolveOne } from "./subcommands-Cz_tHj4P.js";
7
7
  import "./webrtcLink-BMYneHbu.js";
8
8
  import "./remotes-a0bGDae9.js";
9
9
  import { a as startShare } from "./share-BGl3wutJ.js";
@@ -229,4 +229,4 @@ function transformEvent(rawEvent, agentId, forwarded) {
229
229
 
230
230
  //#endregion
231
231
  export { createScopedShare, listShares, revokeAllShares, revokeShare };
232
- //# sourceMappingURL=agentShare-BwDxVzaX.js.map
232
+ //# sourceMappingURL=agentShare-B-UFJIE3.js.map
@@ -13379,7 +13379,16 @@ var AyTerminal = class {
13379
13379
  const rec = await res.json();
13380
13380
  const rich = richTitle(rec);
13381
13381
  if (rich && titleEl) {
13382
- titleEl.textContent = rich;
13382
+ const nameEl = titleEl.querySelector?.("#titlename") ?? titleEl;
13383
+ const cwdEl = titleEl.querySelector?.("#titlecwd");
13384
+ const cwdLeadEl = titleEl.querySelector?.("#titlecwdlead");
13385
+ const cwdPathEl = titleEl.querySelector?.("#titlecwdpath");
13386
+ nameEl.textContent = rich;
13387
+ const cwd = rec.cwd ?? "";
13388
+ const cwdLead = cwd.startsWith("/") ? "/" : "";
13389
+ if (cwdEl) cwdEl.style.display = cwd ? "flex" : "none";
13390
+ if (cwdLeadEl) cwdLeadEl.textContent = cwdLead;
13391
+ if (cwdPathEl) cwdPathEl.textContent = cwd.slice(cwdLead.length);
13383
13392
  titleEl.title = `#${this.pid}${rec.cwd ? " · " + rec.cwd : ""}`;
13384
13393
  this.title = rich;
13385
13394
  }
@@ -13458,7 +13467,13 @@ function widgetHtml(o) {
13458
13467
  <button id="min" data-ctl title="Minimize">_</button>
13459
13468
  <button id="max" data-ctl title="Maximize">□</button>
13460
13469
  </span>`;
13461
- const titleSpan = `<span class="title" id="title">${esc(o.title)}</span>`;
13470
+ const titleSpan = `<div class="title" id="title">
13471
+ <span class="titlename" id="titlename">${esc(o.title)}</span>
13472
+ <span class="titlecwd" id="titlecwd"
13473
+ ><span class="titlecwd-lead" id="titlecwdlead"></span
13474
+ ><span class="titlecwd-path" id="titlecwdpath"></span
13475
+ ></span>
13476
+ </div>`;
13462
13477
  const header = !o.inline && o.side === "left" ? `${controls}${titleSpan}${badge}` : `${titleSpan}${badge}${controls}`;
13463
13478
  return `
13464
13479
  <style>
@@ -13489,7 +13504,12 @@ function widgetHtml(o) {
13489
13504
  #titlebar { padding: 6px 10px; background: #161b22; display: flex; align-items: center; gap: 8px;
13490
13505
  font: 600 12px ui-monospace, SFMono-Regular, Menlo, monospace; color: #c9d1d9; user-select: none; }
13491
13506
  #panel.transparent #titlebar { background: rgba(22,27,34,.7); }
13492
- .title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
13507
+ .title { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; justify-content: center; }
13508
+ .titlename { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
13509
+ .titlecwd { display: none; min-width: 0; font-size: 10px; opacity: .6; font-weight: 400; } /* JS flips to flex once cwd is known */
13510
+ .titlecwd-lead { flex: none; }
13511
+ .titlecwd-path { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
13512
+ direction: rtl; text-align: left; } /* ellipsize the boring prefix, not the tail */
13493
13513
  .ro { font-size: 10px; opacity: .7; background: #30363d; border-radius: 9px; padding: 1px 7px; }
13494
13514
  .rw { font-size: 10px; background: #1f6feb; color: #fff; border-radius: 9px; padding: 1px 7px; }
13495
13515
  .ctl { display: inline-flex; align-items: center; gap: 6px; flex: none; }
@@ -13545,4 +13565,4 @@ const XTERM_CSS = `
13545
13565
 
13546
13566
  //#endregion
13547
13567
  export { AyTerminal as t };
13548
- //# sourceMappingURL=browser-DV0CLEwt.js.map
13568
+ //# sourceMappingURL=browser-jKmGe4_X.js.map
@@ -3,10 +3,10 @@ import "./globalPidIndex-D9DOSd-c.js";
3
3
  import "./messageLog-C-YIzhRj.js";
4
4
  import "./e2e-CEIdJGZ7.js";
5
5
  import "./configShared-IBbnn9b8.js";
6
- import "./subcommands-Cz7ZYodJ.js";
6
+ import "./subcommands-Cz_tHj4P.js";
7
7
  import "./webrtcLink-BMYneHbu.js";
8
8
  import "./remotes-a0bGDae9.js";
9
9
  import "./callbackCore-Dd28_cBM.js";
10
- import { i as loadOrCreateCallbackSecret, n as isCallbackRevoked, r as loadCallbackSecretReadOnly, t as cmdCallback } from "./callback-CLZb8HWd.js";
10
+ import { i as loadOrCreateCallbackSecret, n as isCallbackRevoked, r as loadCallbackSecretReadOnly, t as cmdCallback } from "./callback-FHEnYbFh.js";
11
11
 
12
12
  export { cmdCallback };
@@ -1,5 +1,5 @@
1
1
  import { t as agentYesHome } from "./agentYesHome-CtmsY6I-.js";
2
- import { P as resolveOne } from "./subcommands-Cz7ZYodJ.js";
2
+ import { P as resolveOne } from "./subcommands-Cz_tHj4P.js";
3
3
  import { a as mintCapability, o as parseExpires } from "./callbackCore-Dd28_cBM.js";
4
4
  import { randomBytes } from "node:crypto";
5
5
  import { chmodSync, readFileSync, renameSync, writeFileSync } from "node:fs";
@@ -72,7 +72,7 @@ async function resolveBase(flag) {
72
72
  if (flag) return flag;
73
73
  if (process.env.AGENT_YES_CALLBACK_BASE) return process.env.AGENT_YES_CALLBACK_BASE;
74
74
  try {
75
- const { resolveLocalServeUrl } = await import("./serve-DWtw6ok5.js");
75
+ const { resolveLocalServeUrl } = await import("./serve-89Gzlv9n.js");
76
76
  const url = await resolveLocalServeUrl();
77
77
  if (url) return url;
78
78
  } catch {}
@@ -187,4 +187,4 @@ async function cmdCallback(rest) {
187
187
 
188
188
  //#endregion
189
189
  export { loadOrCreateCallbackSecret as i, isCallbackRevoked as n, loadCallbackSecretReadOnly as r, cmdCallback as t };
190
- //# sourceMappingURL=callback-CLZb8HWd.js.map
190
+ //# sourceMappingURL=callback-FHEnYbFh.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-DgDRyB3n.js";
5
- import { r as getRustBinary } from "./rustBinary-Cqb_HJrr.js";
4
+ import { i as versionString, n as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-CKSvRBvj.js";
5
+ import { r as getRustBinary } from "./rustBinary-B7kmq5S0.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, isUnknownManagerToken } = await import("./subcommands-D9W74Jbd.js");
288
+ const { isSubcommand, runSubcommand, cmdHelp, isUnknownManagerToken } = await import("./subcommands-COp2OWcx.js");
289
289
  if (isHelpFlag && process.argv.length === 3) {
290
290
  await cmdHelp(managerCommands);
291
291
  process.exit(0);
@@ -295,7 +295,7 @@ function buildRustArgs(argv, cliFromScript, supportedClis) {
295
295
  process.exit(code ?? 0);
296
296
  }
297
297
  {
298
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-Cuzio132.js");
298
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-FQCbUoI-.js");
299
299
  if (isUnknownManagerToken(rawArg, managerCommands, SUPPORTED_CLIS)) {
300
300
  process.stderr.write(`ay: unknown subcommand or CLI '${rawArg}'.\n See 'ay help' for subcommands. To run an agent, name a CLI:\n 'ay <cli> …' (e.g. 'ay claude …') or 'ay --cli <cli> …'.\n`);
301
301
  process.exit(1);
@@ -346,7 +346,7 @@ if (config.useRust) {
346
346
  }
347
347
  }
348
348
  if (rustBinary) {
349
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-Cuzio132.js");
349
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-FQCbUoI-.js");
350
350
  const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
351
351
  if (config.verbose) {
352
352
  console.log(`[rust] Using binary: ${rustBinary}`);
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./versionChecker-DgDRyB3n.js";
3
- import { a as hasTodoStore, i as answerAsk, l as AgentContext, n as agentYes, o as listAsks, r as config, s as listAsksForProject, t as CLIS_CONFIG } from "./ts-C_4nEOJ9.js";
2
+ import "./versionChecker-CKSvRBvj.js";
3
+ import { a as hasTodoStore, i as answerAsk, l as AgentContext, n as agentYes, o as listAsks, r as config, s as listAsksForProject, t as CLIS_CONFIG } from "./ts-B4LZq-x9.js";
4
4
  import { _ as isKnownKind, a as renderTree, b as statesOf, c as monitorHint, d as openStore, f as DONE_STATE, g as initialState, h as canTransition, i as renderDigest, l as CycleError, m as ORPHANED_STATE, o as unblockedTasks, p as LIFECYCLES, r as openBlockers, s as describeBlock, t as reconcileTodos, u as TodoStore, v as nextStates, x as removeControlCharacters, y as requiredGate } from "./todoAutomation-BQRW614S.js";
5
5
  import "./JsonlStore-CPGIR0Wy.js";
6
6
  import "./globalPidIndex-D9DOSd-c.js";
@@ -3,7 +3,7 @@ import "./globalPidIndex-D9DOSd-c.js";
3
3
  import "./messageLog-C-YIzhRj.js";
4
4
  import "./e2e-CEIdJGZ7.js";
5
5
  import "./configShared-IBbnn9b8.js";
6
- import { $ as shouldStealLock, C as listRecords, J as hostId, K as appendEvent, Q as readInbox, X as listInboxParents, Z as liveWatchers, _ as isPidAlive, c as deriveLiveState, et as daemonLockDir, j as renderLogTailLines, nt as notifyDir, q as gcInboxes, tt as daemonLockOwnerPath } from "./subcommands-Cz7ZYodJ.js";
6
+ import { $ as shouldStealLock, C as listRecords, J as hostId, K as appendEvent, Q as readInbox, X as listInboxParents, Z as liveWatchers, _ as isPidAlive, c as deriveLiveState, et as daemonLockDir, j as renderLogTailLines, nt as notifyDir, q as gcInboxes, tt as daemonLockOwnerPath } from "./subcommands-Cz_tHj4P.js";
7
7
  import "./webrtcLink-BMYneHbu.js";
8
8
  import "./remotes-a0bGDae9.js";
9
9
  import { mkdir, readFile, rename, rm, stat, writeFile } from "fs/promises";
@@ -836,4 +836,4 @@ async function ensureDaemon() {
836
836
 
837
837
  //#endregion
838
838
  export { daemonStatus, ensureDaemon, requestDaemonStop, runDaemon };
839
- //# sourceMappingURL=notifyDaemon-Bebw4D7u.js.map
839
+ //# sourceMappingURL=notifyDaemon-CnhKvdl7.js.map
@@ -1,4 +1,4 @@
1
- import { r as getInstalledPackage } from "./versionChecker-DgDRyB3n.js";
1
+ import { r as getInstalledPackage } from "./versionChecker-CKSvRBvj.js";
2
2
  import { execFileSync } from "child_process";
3
3
  import { existsSync, mkdirSync, unlinkSync } from "fs";
4
4
  import { chmod, copyFile } from "fs/promises";
@@ -243,4 +243,4 @@ async function getRustBinary(options = {}) {
243
243
 
244
244
  //#endregion
245
245
  export { findTrayLauncher as n, getRustBinary as r, findSpawnHiddenLauncher as t };
246
- //# sourceMappingURL=rustBinary-Cqb_HJrr.js.map
246
+ //# sourceMappingURL=rustBinary-B7kmq5S0.js.map
@@ -1,12 +1,12 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import "./versionChecker-DgDRyB3n.js";
3
- import "./ts-C_4nEOJ9.js";
2
+ import "./versionChecker-CKSvRBvj.js";
3
+ import "./ts-B4LZq-x9.js";
4
4
  import "./todoAutomation-BQRW614S.js";
5
5
  import "./JsonlStore-CPGIR0Wy.js";
6
6
  import "./globalPidIndex-D9DOSd-c.js";
7
7
  import "./pidStore-vnX0bgra.js";
8
8
  import "./messageLog-C-YIzhRj.js";
9
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BwRdGQ4I.js";
9
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DCgfUvkk.js";
10
10
  import { f as resolveSpawnCwd } from "./workspaceConfig-CpilQzMY.js";
11
11
  import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-BtL6Oo1o.js";
12
12
  import { createHash } from "node:crypto";
@@ -153,4 +153,4 @@ async function cmdSchedule(rest) {
153
153
 
154
154
  //#endregion
155
155
  export { cmdSchedule };
156
- //# sourceMappingURL=schedule-DZrXiDPD.js.map
156
+ //# sourceMappingURL=schedule-D8TWPJuH.js.map
@@ -1,7 +1,7 @@
1
1
  import "./logger-CDIsZ-Pp.js";
2
- import { r as getInstalledPackage } from "./versionChecker-DgDRyB3n.js";
3
- import { t as findSpawnHiddenLauncher } from "./rustBinary-Cqb_HJrr.js";
4
- import { c as permissionBadge, i as answerAsk, o as listAsks, u as CLAUDE_SESSION_PIN_ENV } from "./ts-C_4nEOJ9.js";
2
+ import { r as getInstalledPackage } from "./versionChecker-CKSvRBvj.js";
3
+ import { t as findSpawnHiddenLauncher } from "./rustBinary-B7kmq5S0.js";
4
+ import { c as permissionBadge, i as answerAsk, o as listAsks, u as CLAUDE_SESSION_PIN_ENV } from "./ts-B4LZq-x9.js";
5
5
  import { t as agentYesHome$1 } from "./agentYesHome-CtmsY6I-.js";
6
6
  import { x as removeControlCharacters } from "./todoAutomation-BQRW614S.js";
7
7
  import "./JsonlStore-CPGIR0Wy.js";
@@ -11,16 +11,16 @@ import { r as recordInbox } from "./messageLog-C-YIzhRj.js";
11
11
  import { t as pgidForWrapper } from "./reaper-DP49VCKx.js";
12
12
  import "./e2e-CEIdJGZ7.js";
13
13
  import "./configShared-IBbnn9b8.js";
14
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BwRdGQ4I.js";
15
- import { A as recentReadEdges, C as listRecords, D as readNotes, G as writeToIpc, M as renderRawLog, N as renderRawLogLines, O as readPtysize, P as resolveOne, Y as isTransientLockMkdirError, f as extractNeedsInput, j as renderLogTailLines, k as recentMessageEdges, l as deriveLiveStatus, o as controlCodeFromName, p as extractTaskCounts, rt as TYPING_BADGE, u as extractBadges, x as isUserTyping, z as snapshotStatus } from "./subcommands-Cz7ZYodJ.js";
14
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-DCgfUvkk.js";
15
+ import { A as recentReadEdges, C as listRecords, D as readNotes, G as writeToIpc, M as renderRawLog, N as renderRawLogLines, O as readPtysize, P as resolveOne, Y as isTransientLockMkdirError, f as extractNeedsInput, j as renderLogTailLines, k as recentMessageEdges, l as deriveLiveStatus, o as controlCodeFromName, p as extractTaskCounts, rt as TYPING_BADGE, u as extractBadges, x as isUserTyping, z as snapshotStatus } from "./subcommands-Cz_tHj4P.js";
16
16
  import "./webrtcLink-BMYneHbu.js";
17
17
  import "./remotes-a0bGDae9.js";
18
18
  import { i as frameVisitorMessage, s as verifyCapability, t as MAX_CALLBACK_MSG_BYTES } from "./callbackCore-Dd28_cBM.js";
19
- import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-CLZb8HWd.js";
19
+ import { n as isCallbackRevoked, r as loadCallbackSecretReadOnly } from "./callback-FHEnYbFh.js";
20
20
  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-CpilQzMY.js";
21
21
  import { n as liveEnv, t as ensureNodeRuntime } from "./nodeRuntime-BtL6Oo1o.js";
22
22
  import { r as spawnRejectionReason } from "./spawnGate-BFJPdHCQ.js";
23
- import { i as launchTray } from "./trayApp-i93_GeIf.js";
23
+ import { i as launchTray } from "./trayApp-ChsZpZyQ.js";
24
24
  import yargs from "yargs";
25
25
  import { appendFile, mkdir, open, readFile, readdir, rename, rm, stat, unlink, writeFile } from "fs/promises";
26
26
  import { arch, cpus, freemem, homedir, hostname, loadavg, platform, totalmem, uptime, userInfo } from "os";
@@ -2367,7 +2367,7 @@ Options:
2367
2367
  }
2368
2368
  });
2369
2369
  if (req.method === "GET" && p === "/api/ws") {
2370
- const ws = await import("./ws-BdEmGmYi.js");
2370
+ const ws = await import("./ws-DXmR5W2s.js");
2371
2371
  try {
2372
2372
  await ws.loadProvision();
2373
2373
  } catch (e) {
@@ -2387,7 +2387,7 @@ Options:
2387
2387
  if (req.method === "GET" && p === "/api/ws/status") {
2388
2388
  const dirRaw = url.searchParams.get("path");
2389
2389
  if (!dirRaw) return new Response("missing ?path=<workspace dir>", { status: 400 });
2390
- const ws = await import("./ws-BdEmGmYi.js");
2390
+ const ws = await import("./ws-DXmR5W2s.js");
2391
2391
  let prov;
2392
2392
  try {
2393
2393
  prov = await ws.loadProvision();
@@ -3144,7 +3144,7 @@ Options:
3144
3144
  const perm = body.perm ?? "r";
3145
3145
  if (perm !== "r" && perm !== "rw") return new Response(`invalid perm ${perm} (want r or rw)`, { status: 400 });
3146
3146
  try {
3147
- const { createScopedShare } = await import("./agentShare-BwDxVzaX.js");
3147
+ const { createScopedShare } = await import("./agentShare-B-UFJIE3.js");
3148
3148
  const share = await createScopedShare({
3149
3149
  agent: body.agent,
3150
3150
  perm,
@@ -3159,12 +3159,12 @@ Options:
3159
3159
  }
3160
3160
  }
3161
3161
  if (req.method === "GET" && p === "/api/shares") {
3162
- const { listShares } = await import("./agentShare-BwDxVzaX.js");
3162
+ const { listShares } = await import("./agentShare-B-UFJIE3.js");
3163
3163
  return Response.json(listShares());
3164
3164
  }
3165
3165
  const revokeM = /^\/api\/share\/([^/]+)$/.exec(p);
3166
3166
  if (req.method === "DELETE" && revokeM) {
3167
- const { revokeShare } = await import("./agentShare-BwDxVzaX.js");
3167
+ const { revokeShare } = await import("./agentShare-B-UFJIE3.js");
3168
3168
  const ok = revokeShare(decodeURIComponent(revokeM[1]));
3169
3169
  return new Response(ok ? "revoked" : "no such share", { status: ok ? 200 : 404 });
3170
3170
  }
@@ -3466,7 +3466,7 @@ Options:
3466
3466
  const shutdown = (resolve) => {
3467
3467
  if (heartbeat) clearInterval(heartbeat);
3468
3468
  closeShare?.();
3469
- import("./agentShare-BwDxVzaX.js").then((m) => m.revokeAllShares()).catch(() => {});
3469
+ import("./agentShare-B-UFJIE3.js").then((m) => m.revokeAllShares()).catch(() => {});
3470
3470
  server?.stop();
3471
3471
  Promise.resolve(releaseHostLock?.()).catch(() => {}).then(resolve);
3472
3472
  };
@@ -3479,4 +3479,4 @@ Options:
3479
3479
 
3480
3480
  //#endregion
3481
3481
  export { cmdServe, loadTokenReadOnly, mintScopedTermToken, resolveDaemonHttpBase, resolveLocalServeUrl };
3482
- //# sourceMappingURL=serve-DWtw6ok5.js.map
3482
+ //# sourceMappingURL=serve-89Gzlv9n.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-DWtw6ok5.js");
35
+ const { cmdServe } = await import("./serve-89Gzlv9n.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-CXr_Y5vj.js.map
45
+ //# sourceMappingURL=setup-B-ufpyWj.js.map
@@ -3,7 +3,7 @@ import "./globalPidIndex-D9DOSd-c.js";
3
3
  import "./messageLog-C-YIzhRj.js";
4
4
  import "./e2e-CEIdJGZ7.js";
5
5
  import "./configShared-IBbnn9b8.js";
6
- import { A as recentReadEdges, B as stdinActivityPath, C as listRecords, D as readNotes, E as readAgentPtysize, F as resolveReadWindow, G as writeToIpc, H as submitAndConfirm, I as resolveResumeArgs, L as restartHintLines, M as renderRawLog, N as renderRawLogLines, O as readPtysize, P as resolveOne, R as runSubcommand, S as lastStdinAt, T as menuSelectKeys, U as waitForLogQuiet, V as stopTipForCli, W as writeKeysPaced, _ as isPidAlive, a as cmdHelp, b as isUnknownManagerToken, c as deriveLiveState, d as extractMenu, f as extractNeedsInput, g as isExitRequest, h as isAgentStuck, i as backoffWhileTyping, j as renderLogTailLines, k as recentMessageEdges, 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 matchKeyword, x as isUserTyping, y as isSubcommand, z as snapshotStatus } from "./subcommands-Cz7ZYodJ.js";
6
+ import { A as recentReadEdges, B as stdinActivityPath, C as listRecords, D as readNotes, E as readAgentPtysize, F as resolveReadWindow, G as writeToIpc, H as submitAndConfirm, I as resolveResumeArgs, L as restartHintLines, M as renderRawLog, N as renderRawLogLines, O as readPtysize, P as resolveOne, R as runSubcommand, S as lastStdinAt, T as menuSelectKeys, U as waitForLogQuiet, V as stopTipForCli, W as writeKeysPaced, _ as isPidAlive, a as cmdHelp, b as isUnknownManagerToken, c as deriveLiveState, d as extractMenu, f as extractNeedsInput, g as isExitRequest, h as isAgentStuck, i as backoffWhileTyping, j as renderLogTailLines, k as recentMessageEdges, 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 matchKeyword, x as isUserTyping, y as isSubcommand, z as snapshotStatus } from "./subcommands-Cz_tHj4P.js";
7
7
  import "./webrtcLink-BMYneHbu.js";
8
8
  import "./remotes-a0bGDae9.js";
9
9
 
@@ -1394,35 +1394,35 @@ async function runSubcommand(argv) {
1394
1394
  return cmdCh(rest);
1395
1395
  }
1396
1396
  case "term": {
1397
- const { cmdTerm } = await import("./terminal-B8X6SZ4k.js");
1397
+ const { cmdTerm } = await import("./terminal-83v9Uzt1.js");
1398
1398
  return cmdTerm(rest);
1399
1399
  }
1400
1400
  case "widget": {
1401
- const { cmdWidget } = await import("./widget-pcjAYbkh.js");
1401
+ const { cmdWidget } = await import("./widget-DcPvYum4.js");
1402
1402
  return cmdWidget(rest);
1403
1403
  }
1404
1404
  case "mint": {
1405
- const { cmdMint } = await import("./widget-pcjAYbkh.js");
1405
+ const { cmdMint } = await import("./widget-DcPvYum4.js");
1406
1406
  return cmdMint(rest);
1407
1407
  }
1408
1408
  case "serve": {
1409
- const { cmdServe } = await import("./serve-DWtw6ok5.js");
1409
+ const { cmdServe } = await import("./serve-89Gzlv9n.js");
1410
1410
  return cmdServe(rest);
1411
1411
  }
1412
1412
  case "tray": {
1413
- const { cmdTray } = await import("./trayApp-Zta691q9.js");
1413
+ const { cmdTray } = await import("./trayApp-00UdHVbe.js");
1414
1414
  return cmdTray(rest);
1415
1415
  }
1416
1416
  case "setup": {
1417
- const { cmdSetup } = await import("./setup-CXr_Y5vj.js");
1417
+ const { cmdSetup } = await import("./setup-B-ufpyWj.js");
1418
1418
  return cmdSetup(rest);
1419
1419
  }
1420
1420
  case "ws": {
1421
- const { cmdWs } = await import("./ws-BdEmGmYi.js");
1421
+ const { cmdWs } = await import("./ws-DXmR5W2s.js");
1422
1422
  return cmdWs(rest);
1423
1423
  }
1424
1424
  case "schedule": {
1425
- const { cmdSchedule } = await import("./schedule-DZrXiDPD.js");
1425
+ const { cmdSchedule } = await import("./schedule-D8TWPJuH.js");
1426
1426
  return cmdSchedule(rest);
1427
1427
  }
1428
1428
  case "remote": {
@@ -1434,7 +1434,7 @@ async function runSubcommand(argv) {
1434
1434
  return cmdExpose(rest);
1435
1435
  }
1436
1436
  case "callback": {
1437
- const { cmdCallback } = await import("./callback-DiQBhFZn.js");
1437
+ const { cmdCallback } = await import("./callback-DsimZsq6.js");
1438
1438
  return cmdCallback(rest);
1439
1439
  }
1440
1440
  case "reap":
@@ -3844,7 +3844,7 @@ async function cmdAttach(rest) {
3844
3844
  const winsizeDir = path.join(ayHome, "winsize");
3845
3845
  await mkdir(winsizeDir, { recursive: true });
3846
3846
  const winsizePath = path.join(winsizeDir, String(record.pid));
3847
- const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-DWtw6ok5.js");
3847
+ const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-89Gzlv9n.js");
3848
3848
  const daemonBase = await resolveDaemonHttpBase().catch(() => null);
3849
3849
  const daemonToken = daemonBase ? await loadTokenReadOnly().catch(() => null) ?? "" : "";
3850
3850
  const capViewer = `attach:${process.pid}`;
@@ -4554,7 +4554,7 @@ async function cmdNotify(rest) {
4554
4554
  }
4555
4555
  const ensure = async () => {
4556
4556
  if (!argv["ensure-daemon"]) return;
4557
- const { ensureDaemon } = await import("./notifyDaemon-Bebw4D7u.js");
4557
+ const { ensureDaemon } = await import("./notifyDaemon-CnhKvdl7.js");
4558
4558
  await ensureDaemon().catch(() => null);
4559
4559
  };
4560
4560
  await heartbeatWatcher(parent, selfStartedAt);
@@ -4628,7 +4628,7 @@ async function cmdNotifyCursor(args) {
4628
4628
  }
4629
4629
  async function cmdNotifyd(rest) {
4630
4630
  const sub = rest[0] ?? "status";
4631
- const daemon = await import("./notifyDaemon-Bebw4D7u.js");
4631
+ const daemon = await import("./notifyDaemon-CnhKvdl7.js");
4632
4632
  switch (sub) {
4633
4633
  case "run": return daemon.runDaemon();
4634
4634
  case "once": return daemon.runDaemon({ once: true });
@@ -4655,4 +4655,4 @@ async function cmdNotifyd(rest) {
4655
4655
 
4656
4656
  //#endregion
4657
4657
  export { shouldStealLock as $, recentReadEdges as A, stdinActivityPath as B, listRecords as C, readNotes as D, readAgentPtysize as E, resolveReadWindow as F, writeToIpc as G, submitAndConfirm as H, resolveResumeArgs as I, hostId as J, appendEvent as K, restartHintLines as L, renderRawLog as M, renderRawLogLines as N, readPtysize as O, resolveOne as P, readInbox as Q, runSubcommand as R, lastStdinAt as S, menuSelectKeys as T, waitForLogQuiet as U, stopTipForCli as V, writeKeysPaced as W, listInboxParents as X, isTransientLockMkdirError as Y, liveWatchers as Z, isPidAlive as _, cmdHelp as a, isUnknownManagerToken as b, deriveLiveState as c, extractMenu as d, daemonLockDir as et, extractNeedsInput as f, isExitRequest as g, isAgentStuck as h, backoffWhileTyping as i, renderLogTailLines as j, recentMessageEdges as k, deriveLiveStatus as l, finalizedLines as m, READ_PAGE_DEFAULT as n, notifyDir as nt, controlCodeFromName as o, extractTaskCounts as p, gcInboxes as q, TYPING_WINDOW_MS as r, TYPING_BADGE as rt, cursorAbs as s, GRACEFUL_EXIT_COMMANDS as t, daemonLockOwnerPath as tt, extractBadges as u, isSlashCommand as v, matchKeyword as w, isUserTyping as x, isSubcommand as y, snapshotStatus as z };
4658
- //# sourceMappingURL=subcommands-Cz7ZYodJ.js.map
4658
+ //# sourceMappingURL=subcommands-Cz_tHj4P.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-DWtw6ok5.js");
101
+ const { mintScopedTermToken } = await import("./serve-89Gzlv9n.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-B8X6SZ4k.js.map
138
+ //# sourceMappingURL=terminal-83v9Uzt1.js.map
package/dist/terminal.js CHANGED
@@ -1,3 +1,3 @@
1
- import { t as AyTerminal } from "./browser-DV0CLEwt.js";
1
+ import { t as AyTerminal } from "./browser-jKmGe4_X.js";
2
2
 
3
3
  export { AyTerminal, AyTerminal as default };
@@ -0,0 +1,5 @@
1
+ import "./versionChecker-CKSvRBvj.js";
2
+ import "./rustBinary-B7kmq5S0.js";
3
+ import { a as trayHiddenMarker, i as launchTray, n as hasDesktop, r as isTrayHidden, t as cmdTray } from "./trayApp-ChsZpZyQ.js";
4
+
5
+ export { cmdTray };
@@ -1,4 +1,4 @@
1
- import { n as findTrayLauncher } from "./rustBinary-Cqb_HJrr.js";
1
+ import { n as findTrayLauncher } from "./rustBinary-B7kmq5S0.js";
2
2
  import { t as agentYesHome } from "./agentYesHome-CtmsY6I-.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-i93_GeIf.js.map
100
+ //# sourceMappingURL=trayApp-ChsZpZyQ.js.map
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin, r as __exportAll } from "./chunk-cZBX9HZv.js";
2
2
  import { n as logger, t as addTransport } from "./logger-CDIsZ-Pp.js";
3
- import { r as getInstalledPackage } from "./versionChecker-DgDRyB3n.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-CKSvRBvj.js";
4
4
  import { t as agentYesHome } from "./agentYesHome-CtmsY6I-.js";
5
5
  import { d as openStore, p as LIFECYCLES, x as removeControlCharacters } from "./todoAutomation-BQRW614S.js";
6
6
  import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-DBoONoM-.js";
@@ -2155,4 +2155,4 @@ function sleep(ms) {
2155
2155
 
2156
2156
  //#endregion
2157
2157
  export { hasTodoStore as a, permissionBadge as c, answerAsk as i, AgentContext as l, agentYes as n, listAsks as o, config as r, listAsksForProject as s, CLIS_CONFIG as t, CLAUDE_SESSION_PIN_ENV as u };
2158
- //# sourceMappingURL=ts-C_4nEOJ9.js.map
2158
+ //# sourceMappingURL=ts-B4LZq-x9.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.255.1";
10
+ var version = "1.256.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-DgDRyB3n.js.map
218
+ //# sourceMappingURL=versionChecker-CKSvRBvj.js.map
@@ -28,7 +28,7 @@ function parseFlags(args, known) {
28
28
  }
29
29
  /** Resolve the local daemon base URL + token (flags override discovery). */
30
30
  async function daemonTarget(flags) {
31
- const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-DWtw6ok5.js");
31
+ const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-89Gzlv9n.js");
32
32
  const base = typeof flags.base === "string" ? flags.base : await resolveDaemonHttpBase();
33
33
  if (!base) throw new Error("no running ay serve daemon found — start `ay serve` or pass --base <url> (e.g. http://127.0.0.1:PORT)");
34
34
  const token = typeof flags.token === "string" ? flags.token : await loadTokenReadOnly() ?? "";
@@ -186,7 +186,7 @@ async function cmdMint(args) {
186
186
  const bad = caps.filter((c) => !KNOWN_CAPS.has(c));
187
187
  if (bad.length) throw new Error(`unknown cap(s): ${bad.join(", ")} (valid: ${[...KNOWN_CAPS].join(", ")})`);
188
188
  const ttlSec = parseTtlSec(typeof flags.ttl === "string" ? flags.ttl : "15m");
189
- const { mintScopedTermToken } = await import("./serve-DWtw6ok5.js");
189
+ const { mintScopedTermToken } = await import("./serve-89Gzlv9n.js");
190
190
  const r = await mintScopedTermToken(target, {
191
191
  ttlSec,
192
192
  caps
@@ -202,4 +202,4 @@ async function cmdMint(args) {
202
202
 
203
203
  //#endregion
204
204
  export { cmdMint, cmdWidget };
205
- //# sourceMappingURL=widget-pcjAYbkh.js.map
205
+ //# sourceMappingURL=widget-DcPvYum4.js.map
package/dist/widgets.js CHANGED
@@ -2,7 +2,7 @@ import "./e2e-CEIdJGZ7.js";
2
2
  import "./channels-BiGUYTuz.js";
3
3
  import "./peer-B5JKF4BP.js";
4
4
  import { t as AyChannel } from "./browser-B3dOptjL.js";
5
- import { t as AyTerminal } from "./browser-DV0CLEwt.js";
5
+ import { t as AyTerminal } from "./browser-jKmGe4_X.js";
6
6
  import { AyWidget } from "./widget.js";
7
7
 
8
8
  export { AyChannel, AyTerminal, AyWidget };
@@ -3,7 +3,7 @@ import "./globalPidIndex-D9DOSd-c.js";
3
3
  import "./messageLog-C-YIzhRj.js";
4
4
  import "./e2e-CEIdJGZ7.js";
5
5
  import "./configShared-IBbnn9b8.js";
6
- import { C as listRecords } from "./subcommands-Cz7ZYodJ.js";
6
+ import { C as listRecords } from "./subcommands-Cz_tHj4P.js";
7
7
  import "./webrtcLink-BMYneHbu.js";
8
8
  import "./remotes-a0bGDae9.js";
9
9
  import { a as getProvisionRoot } from "./workspaceConfig-CpilQzMY.js";
@@ -419,4 +419,4 @@ async function cmdWs(args) {
419
419
 
420
420
  //#endregion
421
421
  export { WS_JSON_SCHEMA, cmdWs, collectWorkspaces, isPathInside, loadProvision, workspaceStatus };
422
- //# sourceMappingURL=ws-BdEmGmYi.js.map
422
+ //# sourceMappingURL=ws-DXmR5W2s.js.map
package/lab/ui/index.html CHANGED
@@ -1365,6 +1365,35 @@
1365
1365
  text-overflow: ellipsis;
1366
1366
  white-space: nowrap;
1367
1367
  }
1368
+ .rowcwd {
1369
+ display: flex;
1370
+ font-family: var(--mono);
1371
+ color: var(--muted);
1372
+ font-size: 11px;
1373
+ min-width: 0;
1374
+ }
1375
+ .rowcwd .tbranch {
1376
+ /* Invisible spacer matching the row's own tree-rail prefix, so the cwd
1377
+ line indents under the name column at any nesting depth instead of
1378
+ a magic constant that only lines up at depth 0. */
1379
+ visibility: hidden;
1380
+ }
1381
+ .rowcwd .rowcwd-lead {
1382
+ flex: none;
1383
+ }
1384
+ .rowcwd .rowcwd-path {
1385
+ flex: 1;
1386
+ min-width: 0;
1387
+ overflow: hidden;
1388
+ text-overflow: ellipsis;
1389
+ white-space: nowrap;
1390
+ /* Absolute paths share a long, boring prefix (/Users/x/ws/…) — the
1391
+ informative part is the tail, so ellipsize from the left/start
1392
+ instead of the (default) end. Characters stay in reading order
1393
+ (this only flips which end gets clipped, via the bidi algorithm). */
1394
+ direction: rtl;
1395
+ text-align: left;
1396
+ }
1368
1397
  .rowtitle {
1369
1398
  color: var(--fg);
1370
1399
  font-size: 12.5px;
@@ -1381,12 +1410,19 @@
1381
1410
  text-overflow: ellipsis;
1382
1411
  white-space: nowrap;
1383
1412
  }
1384
- /* compact view: one line per agent — dot + cli + live title (or prompt), age */
1413
+ /* compact view: dot + cli + live title (or prompt), age — plus the agent's
1414
+ cwd as a 2nd line (.rowcwd) underneath. */
1385
1415
  .row.crow {
1416
+ display: flex;
1417
+ flex-direction: column;
1418
+ gap: 2px;
1419
+ padding: 6px 18px;
1420
+ }
1421
+ .crow1 {
1386
1422
  display: flex;
1387
1423
  align-items: center;
1388
1424
  gap: 8px;
1389
- padding: 6px 18px;
1425
+ min-width: 0;
1390
1426
  }
1391
1427
  /* Tree branch prefix for nested (sub)agents — monospace so the box-drawing
1392
1428
  glyphs line up into continuous │ ├ └ rails across rows. */
@@ -1499,6 +1535,19 @@
1499
1535
  align-items: center;
1500
1536
  gap: 10px;
1501
1537
  }
1538
+ .rnamewrap {
1539
+ display: flex;
1540
+ flex-direction: column;
1541
+ flex: 0 1 auto;
1542
+ min-width: 0;
1543
+ gap: 2px;
1544
+ }
1545
+ .rnameline {
1546
+ display: flex;
1547
+ align-items: center;
1548
+ gap: 10px;
1549
+ min-width: 0;
1550
+ }
1502
1551
  .rhead .name {
1503
1552
  font-size: 15px;
1504
1553
  /* shrink + ellipsis so a long agent title can't shove the live/⋯
@@ -1509,6 +1558,27 @@
1509
1558
  text-overflow: ellipsis;
1510
1559
  white-space: nowrap;
1511
1560
  }
1561
+ .rcwd {
1562
+ display: flex;
1563
+ font-family: var(--mono);
1564
+ font-size: 11px;
1565
+ color: var(--muted);
1566
+ min-width: 0;
1567
+ }
1568
+ .rcwd-lead {
1569
+ flex: none;
1570
+ }
1571
+ .rcwd-path {
1572
+ flex: 1;
1573
+ min-width: 0;
1574
+ overflow: hidden;
1575
+ text-overflow: ellipsis;
1576
+ white-space: nowrap;
1577
+ /* Ellipsize the boring home/ws prefix, not the informative tail — see
1578
+ the matching comment on .rowcwd-path. */
1579
+ direction: rtl;
1580
+ text-align: left;
1581
+ }
1512
1582
  /* back-to-list affordance — only surfaces in the single-column mobile view */
1513
1583
  .rback {
1514
1584
  display: none;
@@ -1982,8 +2052,16 @@
1982
2052
  <div class="right">
1983
2053
  <div class="rhead" id="rhead" style="display: none">
1984
2054
  <button class="rback" id="rback" title="back to list" aria-label="back to list">‹</button>
1985
- <span class="dot" id="rdot"></span>
1986
- <span class="name" id="rname"></span>
2055
+ <div class="rnamewrap">
2056
+ <div class="rnameline">
2057
+ <span class="dot" id="rdot"></span>
2058
+ <span class="name" id="rname"></span>
2059
+ </div>
2060
+ <div class="rcwd" id="rcwd">
2061
+ <span class="rcwd-lead" id="rcwdlead"></span
2062
+ ><span class="rcwd-path" id="rcwdpath"></span>
2063
+ </div>
2064
+ </div>
1987
2065
  <span class="badge" id="rpid"></span>
1988
2066
  <span class="robadge" title="view-only share — you can watch but not steer this agent"
1989
2067
  >👁 read-only</span
@@ -5632,6 +5710,7 @@ my.translate = async (text, lang) => {
5632
5710
  const id = compactIdent(e, ctx, 3, r.parentEntry);
5633
5711
  const cli = cliLabel(e);
5634
5712
  return `<div class="row crow ${e._key === sel ? "sel" : ""}${rowFlags(e)}" data-key="${esc(e._key)}">
5713
+ <div class="crow1">
5635
5714
  ${r.branch ? `<span class="tbranch">${esc(r.branch)}</span>` : ""}
5636
5715
  ${pinMarkHtml(e)}
5637
5716
  <span class="dot ${esc(e.status)}"></span>
@@ -5643,7 +5722,19 @@ my.translate = async (text, lang) => {
5643
5722
  ${badgeChipsHtml(e)}
5644
5723
  ${gitChipHtml(e)}
5645
5724
  ${peerChipHtml(e)}
5646
- <span class="age">${age(e)}</span></div>`;
5725
+ <span class="age">${age(e)}</span></div>
5726
+ ${
5727
+ e.cwd
5728
+ ? // The leading "/" sits right at the bidi paragraph edge of the
5729
+ // rtl-ellipsis trick below and gets reordered to the far end —
5730
+ // pin it outside that span so only the actual path direction-flips.
5731
+ (() => {
5732
+ const lead = e.cwd.startsWith("/") ? "/" : "";
5733
+ const rest = e.cwd.slice(lead.length);
5734
+ return `<div class="rowcwd" title="${esc(e.cwd)}">${r.branch ? `<span class="tbranch">${esc(r.branch)}</span>` : ""}<span class="rowcwd-lead">${esc(lead)}</span><span class="rowcwd-path">${esc(rest)}</span></div>`;
5735
+ })()
5736
+ : ""
5737
+ }</div>`;
5647
5738
  })
5648
5739
  .join("") || `<div class="empty">no match</div>`;
5649
5740
  renderSendWires(); // rows were replaced — re-draw the overlay (see below)
@@ -5870,6 +5961,14 @@ my.translate = async (text, lang) => {
5870
5961
  $("rname").textContent = rname;
5871
5962
  refreshDocTitle(); // tab title follows the selected agent (name + status)
5872
5963
  $("rpid").textContent = "pid " + e.pid;
5964
+ // Split off the leading "/" before the rtl-ellipsis path span (see the
5965
+ // matching .rowcwd-lead comment) — it sits at the bidi paragraph edge
5966
+ // and would otherwise get reordered to the far end of the line.
5967
+ const cwd = e.cwd || "";
5968
+ const cwdLead = cwd.startsWith("/") ? "/" : "";
5969
+ $("rcwdlead").textContent = cwdLead;
5970
+ $("rcwdpath").textContent = cwd.slice(cwdLead.length);
5971
+ $("rcwd").title = cwd;
5873
5972
 
5874
5973
  // Render the agent's native TUI with xterm.js by feeding it the raw PTY
5875
5974
  // stream (ANSI/cursor control intact) — see /api/tail?raw=1.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.255.1",
3
+ "version": "1.256.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",
@@ -2643,7 +2643,9 @@ describe("subcommands.cmdWhoami", () => {
2643
2643
  const text = stdout2.join("");
2644
2644
  expect(text).toMatch(/agent {5}claude #\d+ {2}\(agent_id aaaa0000bbbb\)/);
2645
2645
  expect(text).toMatch(/reply {5}ay send aaaa0000bbbb/);
2646
- expect(text).toMatch(/<ay-msg from claude #\d+ @ \/repo\/alpha — reply: ay send aaaa0000bbbb "\.\.\.">/);
2646
+ expect(text).toMatch(
2647
+ /<ay-msg from claude #\d+ @ \/repo\/alpha — reply: ay send aaaa0000bbbb "\.\.\.">/,
2648
+ );
2647
2649
  });
2648
2650
  });
2649
2651
 
@@ -517,7 +517,19 @@ export class AyTerminal {
517
517
  const rec = (await res.json()) as { cwd?: string; cli?: string };
518
518
  const rich = richTitle(rec);
519
519
  if (rich && titleEl) {
520
- titleEl.textContent = rich;
520
+ const nameEl = titleEl.querySelector?.("#titlename") ?? titleEl;
521
+ const cwdEl = titleEl.querySelector?.("#titlecwd");
522
+ const cwdLeadEl = titleEl.querySelector?.("#titlecwdlead");
523
+ const cwdPathEl = titleEl.querySelector?.("#titlecwdpath");
524
+ nameEl.textContent = rich;
525
+ // Split off the leading "/" — it sits at the bidi paragraph edge of the
526
+ // rtl-ellipsis .titlecwd-path trick below and gets reordered to the far
527
+ // end of the line if left inside it.
528
+ const cwd = rec.cwd ?? "";
529
+ const cwdLead = cwd.startsWith("/") ? "/" : "";
530
+ if (cwdEl) cwdEl.style.display = cwd ? "flex" : "none";
531
+ if (cwdLeadEl) cwdLeadEl.textContent = cwdLead;
532
+ if (cwdPathEl) cwdPathEl.textContent = cwd.slice(cwdLead.length);
521
533
  titleEl.title = `#${this.pid}${rec.cwd ? " · " + rec.cwd : ""}`; // pid + full cwd tooltip
522
534
  this.title = rich;
523
535
  }
@@ -619,7 +631,15 @@ function widgetHtml(o: {
619
631
  <button id="min" data-ctl title="Minimize">_</button>
620
632
  <button id="max" data-ctl title="Maximize">□</button>
621
633
  </span>`;
622
- const titleSpan = `<span class="title" id="title">${esc(o.title)}</span>`;
634
+ // .title is a 2-line block: the rich name/summary on top, the agent's cwd
635
+ // underneath once applyRichTitle() learns it from /api/size.
636
+ const titleSpan = `<div class="title" id="title">
637
+ <span class="titlename" id="titlename">${esc(o.title)}</span>
638
+ <span class="titlecwd" id="titlecwd"
639
+ ><span class="titlecwd-lead" id="titlecwdlead"></span
640
+ ><span class="titlecwd-path" id="titlecwdpath"></span
641
+ ></span>
642
+ </div>`;
623
643
  const header =
624
644
  !o.inline && o.side === "left"
625
645
  ? `${controls}${titleSpan}${badge}`
@@ -656,7 +676,12 @@ function widgetHtml(o: {
656
676
  #titlebar { padding: 6px 10px; background: #161b22; display: flex; align-items: center; gap: 8px;
657
677
  font: 600 12px ui-monospace, SFMono-Regular, Menlo, monospace; color: #c9d1d9; user-select: none; }
658
678
  #panel.transparent #titlebar { background: rgba(22,27,34,.7); }
659
- .title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
679
+ .title { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; justify-content: center; }
680
+ .titlename { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
681
+ .titlecwd { display: none; min-width: 0; font-size: 10px; opacity: .6; font-weight: 400; } /* JS flips to flex once cwd is known */
682
+ .titlecwd-lead { flex: none; }
683
+ .titlecwd-path { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
684
+ direction: rtl; text-align: left; } /* ellipsize the boring prefix, not the tail */
660
685
  .ro { font-size: 10px; opacity: .7; background: #30363d; border-radius: 9px; padding: 1px 7px; }
661
686
  .rw { font-size: 10px; background: #1f6feb; color: #fff; border-radius: 9px; padding: 1px 7px; }
662
687
  .ctl { display: inline-flex; align-items: center; gap: 6px; flex: none; }
@@ -1,5 +0,0 @@
1
- import "./versionChecker-DgDRyB3n.js";
2
- import "./rustBinary-Cqb_HJrr.js";
3
- import { a as trayHiddenMarker, i as launchTray, n as hasDesktop, r as isTrayHidden, t as cmdTray } from "./trayApp-i93_GeIf.js";
4
-
5
- export { cmdTray };