claude-yes 1.173.0 → 1.173.2

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-CFi-EoE8.js";
2
+ import "./logger-CDIsZ-Pp.js";
3
+ import "./versionChecker-BLOK0ZVF.js";
4
+ import "./pidStore-BIvsBQ8X.js";
5
+ import "./globalPidIndex-CoNr7tS8.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-m7NPWD_Z.js";
7
+
8
+ export { SUPPORTED_CLIS };
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-BWd_P2qD.js";
1
+ import { t as CLIS_CONFIG } from "./ts-CFi-EoE8.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-BGNIrPNN.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-m7NPWD_Z.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-CemZTLrY.js";
5
- import { n as getRustBinary } from "./rustBinary-DZc1nJ5b.js";
4
+ import { i as versionString, n as displayVersion, t as checkAndAutoUpdate } from "./versionChecker-BLOK0ZVF.js";
5
+ import { n as getRustBinary } from "./rustBinary-DV9V1IKU.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-61rF6KoP.js");
288
+ const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-DyjXEnJk.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-Dvng8mGV.js");
330
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-Bc1ovpmC.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-BWd_P2qD.js";
1
+ import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-CFi-EoE8.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-CemZTLrY.js";
3
+ import "./versionChecker-BLOK0ZVF.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 { D as renderLogTailLines, G as hostId, J as readInbox, K as listInboxParents, 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-Ifh1JJde.js";
4
+ import { D as renderLogTailLines, G as hostId, J as readInbox, K as listInboxParents, 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-DovUChYP.js";
5
5
  import "./e2e-jb0Hp43q.js";
6
6
  import "./webrtcLink-B7REGtK2.js";
7
7
  import "./remotes-CC-4GuJb.js";
@@ -588,4 +588,4 @@ async function ensureDaemon() {
588
588
 
589
589
  //#endregion
590
590
  export { daemonStatus, ensureDaemon, requestDaemonStop, runDaemon };
591
- //# sourceMappingURL=notifyDaemon-C_SMIYAH.js.map
591
+ //# sourceMappingURL=notifyDaemon-OSmxbw6p.js.map
@@ -1,4 +1,4 @@
1
- import { r as getInstalledPackage } from "./versionChecker-CemZTLrY.js";
1
+ import { r as getInstalledPackage } from "./versionChecker-BLOK0ZVF.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-DZc1nJ5b.js.map
228
+ //# sourceMappingURL=rustBinary-DV9V1IKU.js.map
@@ -1,9 +1,9 @@
1
- import "./ts-BWd_P2qD.js";
1
+ import "./ts-CFi-EoE8.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-CemZTLrY.js";
3
+ import "./versionChecker-BLOK0ZVF.js";
4
4
  import "./pidStore-BIvsBQ8X.js";
5
5
  import "./globalPidIndex-CoNr7tS8.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BGNIrPNN.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-m7NPWD_Z.js";
7
7
  import { d as resolveSpawnCwd } from "./workspaceConfig-BgqK-31W.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-BRAx-pDW.js.map
144
+ //# sourceMappingURL=schedule-CvSPWKJ3.js.map
@@ -1,13 +1,13 @@
1
- import "./ts-BWd_P2qD.js";
1
+ import "./ts-CFi-EoE8.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import { r as getInstalledPackage } from "./versionChecker-CemZTLrY.js";
4
- import { t as findSpawnHiddenLauncher } from "./rustBinary-DZc1nJ5b.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-BLOK0ZVF.js";
4
+ import { t as findSpawnHiddenLauncher } from "./rustBinary-DV9V1IKU.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-BGNIrPNN.js";
10
- import { A as resolveOne, E as readPtysize, F as snapshotStatus, H as TYPING_BADGE, O as renderRawLog, S as listRecords, T as readNotes, V as writeToIpc, b as isUserTyping, f as extractNeedsInput, l as deriveLiveStatus, o as controlCodeFromName, p as extractTaskCounts, u as extractBadges } from "./subcommands-Ifh1JJde.js";
9
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-m7NPWD_Z.js";
10
+ import { A as resolveOne, E as readPtysize, F as snapshotStatus, H as TYPING_BADGE, O as renderRawLog, S as listRecords, T as readNotes, V as writeToIpc, b as isUserTyping, f as extractNeedsInput, l as deriveLiveStatus, o as controlCodeFromName, p as extractTaskCounts, u as extractBadges } from "./subcommands-DovUChYP.js";
11
11
  import "./e2e-jb0Hp43q.js";
12
12
  import "./webrtcLink-B7REGtK2.js";
13
13
  import "./remotes-CC-4GuJb.js";
@@ -1577,4 +1577,4 @@ Options:
1577
1577
 
1578
1578
  //#endregion
1579
1579
  export { cmdServe };
1580
- //# sourceMappingURL=serve-DJFD_BAy.js.map
1580
+ //# sourceMappingURL=serve-CHgDiELn.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-DJFD_BAy.js");
35
+ const { cmdServe } = await import("./serve-CHgDiELn.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-BYY_C8IB.js.map
45
+ //# sourceMappingURL=setup-2MpD89vI.js.map
@@ -1126,15 +1126,15 @@ async function runSubcommand(argv) {
1126
1126
  case "restart": return await cmdRestart(rest);
1127
1127
  case "note": return await cmdNote(rest);
1128
1128
  case "serve": {
1129
- const { cmdServe } = await import("./serve-DJFD_BAy.js");
1129
+ const { cmdServe } = await import("./serve-CHgDiELn.js");
1130
1130
  return cmdServe(rest);
1131
1131
  }
1132
1132
  case "setup": {
1133
- const { cmdSetup } = await import("./setup-BYY_C8IB.js");
1133
+ const { cmdSetup } = await import("./setup-2MpD89vI.js");
1134
1134
  return cmdSetup(rest);
1135
1135
  }
1136
1136
  case "schedule": {
1137
- const { cmdSchedule } = await import("./schedule-BRAx-pDW.js");
1137
+ const { cmdSchedule } = await import("./schedule-CvSPWKJ3.js");
1138
1138
  return cmdSchedule(rest);
1139
1139
  }
1140
1140
  case "remote": {
@@ -2884,6 +2884,7 @@ async function cmdSend(rest) {
2884
2884
  }
2885
2885
  const trailing = controlCodeFromName(codeName);
2886
2886
  const record = await resolveOne(keyword, opts);
2887
+ if (!/^\d+$/.test(keyword)) process.stderr.write(`ay send → pid ${record.pid} ${record.cli} @ ${shortenPath(record.cwd)}\n`);
2887
2888
  const fifoPath = record.fifo_file;
2888
2889
  if (!fifoPath) throw new Error(`pid ${record.pid}: no fifo_file recorded — this agent didn't register a stdin FIFO (an older agent, or one not started with --stdpush). Restarting it (ay restart ${record.pid}) re-registers one.`);
2889
2890
  let body;
@@ -2900,7 +2901,8 @@ async function cmdSend(rest) {
2900
2901
  process.stdout.write(`pid ${record.pid} (${record.cli}): exit requested — sent ${strategy} (${reason})\n`);
2901
2902
  return 0;
2902
2903
  }
2903
- const fullBody = (sender.agent && !isSlashCommand(body) ? `[from ${sender.agent.cli} #${sender.agent.pid} @ ${shortenPath(sender.agent.cwd)} — reply: ay send ${sender.agent.pid} "..."]\n` : "") + body;
2904
+ const replyTarget = sender.agent?.agent_id || sender.agent?.pid;
2905
+ const fullBody = (sender.agent && !isSlashCommand(body) ? `[from ${sender.agent.cli} #${sender.agent.pid} @ ${shortenPath(sender.agent.cwd)} — reply: ay send ${replyTarget} "..."]\n` : "") + body;
2904
2906
  const noWait = Boolean(argv.noWait) || process.env.AGENT_YES_SEND_NO_WAIT === "1";
2905
2907
  if (fullBody && !noWait && !force) {
2906
2908
  const { clear, waitedMs } = await backoffWhileTyping(record.pid, SEND_TYPING_MAX_WAIT_MS);
@@ -2924,7 +2926,7 @@ async function cmdSend(rest) {
2924
2926
  const status = confirmed ? "sent" : "sent but NOT confirmed submitted";
2925
2927
  process.stdout.write(`${status} to pid ${record.pid} (${record.cli}): ${truncate(payload, 80)}\n`);
2926
2928
  if (!confirmed) process.stderr.write(`\nwarning: couldn't confirm the CLI acted on it after ${SEND_SUBMIT_MAX_RETRIES + 1} attempt(s) — it may still be sitting unsubmitted in the prompt. Last screen:\n` + lastScreen.slice(-8).map((l) => ` ${l}`).join("\n") + "\n");
2927
- const replyHint = sender.agent ? ` ay send ${sender.agent.pid} "..." # reply to sender\n` : "";
2929
+ const replyHint = sender.agent ? ` ay send ${replyTarget} "..." # reply to sender\n` : "";
2928
2930
  process.stderr.write(`\n` + replyHint + ` ay tail ${record.pid} # watch output\n ay ls # list all agents\n`);
2929
2931
  if (codeName === "ctrl-c" || codeName === "ctrlc") {
2930
2932
  const tip = stopTipForCli(record.cli, record.pid);
@@ -3559,7 +3561,11 @@ async function cmdRestart(rest) {
3559
3561
  "ignore",
3560
3562
  "ignore",
3561
3563
  "ignore"
3562
- ]
3564
+ ],
3565
+ env: record.agent_id ? {
3566
+ ...process.env,
3567
+ AGENT_YES_AGENT_ID: record.agent_id
3568
+ } : process.env
3563
3569
  });
3564
3570
  const { out, err } = restartHintLines(record.cli, record.cwd, strategy);
3565
3571
  process.stdout.write(out);
@@ -3963,7 +3969,7 @@ async function cmdNotify(rest) {
3963
3969
  }
3964
3970
  const ensure = async () => {
3965
3971
  if (!argv["ensure-daemon"]) return;
3966
- const { ensureDaemon } = await import("./notifyDaemon-C_SMIYAH.js");
3972
+ const { ensureDaemon } = await import("./notifyDaemon-OSmxbw6p.js");
3967
3973
  await ensureDaemon().catch(() => null);
3968
3974
  };
3969
3975
  await heartbeatWatcher(parent, selfStartedAt);
@@ -4037,7 +4043,7 @@ async function cmdNotifyCursor(args) {
4037
4043
  }
4038
4044
  async function cmdNotifyd(rest) {
4039
4045
  const sub = rest[0] ?? "status";
4040
- const daemon = await import("./notifyDaemon-C_SMIYAH.js");
4046
+ const daemon = await import("./notifyDaemon-OSmxbw6p.js");
4041
4047
  switch (sub) {
4042
4048
  case "run": return daemon.runDaemon();
4043
4049
  case "once": return daemon.runDaemon({ once: true });
@@ -4064,4 +4070,4 @@ async function cmdNotifyd(rest) {
4064
4070
 
4065
4071
  //#endregion
4066
4072
  export { resolveOne as A, writeKeysPaced as B, matchKeyword as C, renderLogTailLines as D, readPtysize as E, snapshotStatus as F, hostId as G, TYPING_BADGE as H, stdinActivityPath as I, readInbox as J, listInboxParents as K, stopTipForCli as L, resolveResumeArgs as M, restartHintLines as N, renderRawLog as O, runSubcommand as P, notifyDir as Q, submitAndConfirm as R, listRecords as S, readNotes as T, appendEvent as U, writeToIpc 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, resolveReadWindow as j, renderRawLogLines 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, waitForLogQuiet as z };
4067
- //# sourceMappingURL=subcommands-Ifh1JJde.js.map
4073
+ //# sourceMappingURL=subcommands-DovUChYP.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 resolveOne, B as writeKeysPaced, C as matchKeyword, D as renderLogTailLines, E as readPtysize, F as snapshotStatus, I as stdinActivityPath, L as stopTipForCli, M as resolveResumeArgs, N as restartHintLines, O as renderRawLog, P as runSubcommand, R as submitAndConfirm, S as listRecords, T as readNotes, V as writeToIpc, _ 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 resolveReadWindow, k as renderRawLogLines, 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 waitForLogQuiet } from "./subcommands-Ifh1JJde.js";
4
+ import { A as resolveOne, B as writeKeysPaced, C as matchKeyword, D as renderLogTailLines, E as readPtysize, F as snapshotStatus, I as stdinActivityPath, L as stopTipForCli, M as resolveResumeArgs, N as restartHintLines, O as renderRawLog, P as runSubcommand, R as submitAndConfirm, S as listRecords, T as readNotes, V as writeToIpc, _ 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 resolveReadWindow, k as renderRawLogLines, 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 waitForLogQuiet } from "./subcommands-DovUChYP.js";
5
5
  import "./e2e-jb0Hp43q.js";
6
6
  import "./webrtcLink-B7REGtK2.js";
7
7
  import "./remotes-CC-4GuJb.js";
@@ -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-CemZTLrY.js";
2
+ import { r as getInstalledPackage } from "./versionChecker-BLOK0ZVF.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-BWd_P2qD.js.map
1827
+ //# sourceMappingURL=ts-CFi-EoE8.js.map
@@ -7,7 +7,7 @@ import { fileURLToPath } from "url";
7
7
 
8
8
  //#region package.json
9
9
  var name = "claude-yes";
10
- var version = "1.173.0";
10
+ var version = "1.173.2";
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-CemZTLrY.js.map
218
+ //# sourceMappingURL=versionChecker-BLOK0ZVF.js.map
package/lab/ui/index.html CHANGED
@@ -4482,19 +4482,19 @@
4482
4482
  }
4483
4483
 
4484
4484
  // Auto-derive a branch name from the typed prompt for the Cmd+K fork action
4485
- // (editable at launch). Forks off a default branch get the flat `fork/`
4486
- // namespace, e.g. main + "fix the auth bug" → "fork/fix-the-auth-bug".
4487
- // Forks off any other branch dash-prefix the source to show lineage, so
4488
- // "def" forked from "feat-abc" reads as a stacked branch "feat-abc-def".
4485
+ // (editable at launch). The new branch dash-prefixes the source branch to
4486
+ // show lineage, e.g. main + "fix the auth bug" → "main-fix-the-auth-bug",
4487
+ // and "def" forked from "feat-abc" reads as a stacked branch "feat-abc-def".
4489
4488
  // We dash-join (not slash-nest "feat-abc/def") on purpose: git stores refs
4490
4489
  // as files, so `feat-abc/def` can't be created while `feat-abc` still
4491
4490
  // exists (D/F conflict) — and the source branch is normally still live when
4492
4491
  // we fork from it. Any slashes in the source (e.g. a prior "fork/x") are
4493
- // flattened to dashes so the new ref stays a single node.
4492
+ // flattened to dashes so the new ref stays a single node. Only when the
4493
+ // source branch is unknown do we fall back to the flat `fork/` namespace.
4494
4494
  function forkSlug(q, srcBranch) {
4495
4495
  const topic = branchSlug(q) || "wip";
4496
4496
  const base = branchSlug(srcBranch);
4497
- if (!base || /^(main|master)$/.test((srcBranch || "").trim())) return "fork/" + topic;
4497
+ if (!base) return "fork/" + topic;
4498
4498
  return base + "-" + topic;
4499
4499
  }
4500
4500
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-yes",
3
- "version": "1.173.0",
3
+ "version": "1.173.2",
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/subcommands.ts CHANGED
@@ -2874,6 +2874,19 @@ async function cmdSend(rest: string[]): Promise<number> {
2874
2874
  const trailing = controlCodeFromName(codeName);
2875
2875
 
2876
2876
  const record = await resolveOne(keyword, opts);
2877
+
2878
+ // Misdelivery guard: when the keyword isn't a plain pid (an exact identity),
2879
+ // it resolved by cwd/cli/prompt substring — which can silently land on an
2880
+ // unintended session in another tree (resolveOne returns a lone fuzzy match
2881
+ // with no prompt). Echo exactly where it resolved to stderr BEFORE injecting,
2882
+ // so the sender can catch a wrong target instead of only finding out when the
2883
+ // reply never comes. Numeric identity sends stay quiet.
2884
+ if (!/^\d+$/.test(keyword)) {
2885
+ process.stderr.write(
2886
+ `ay send → pid ${record.pid} ${record.cli} @ ${shortenPath(record.cwd)}\n`,
2887
+ );
2888
+ }
2889
+
2877
2890
  const fifoPath = record.fifo_file;
2878
2891
  if (!fifoPath) {
2879
2892
  throw new Error(
@@ -2910,14 +2923,20 @@ async function cmdSend(rest: string[]): Promise<number> {
2910
2923
  }
2911
2924
 
2912
2925
  // When an agent sends, prefix one line so the recipient knows who pinged it
2913
- // and exactly how to reply (to a resolvable pid — the sender's own). BUT a
2914
- // slash command is only recognized when `/` is the very first character of the
2915
- // submitted message; the prefix would bump it to line 2 and the CLI would type
2916
- // the command as plain text. So skip the prefix for a command body and send it
2917
- // verbatim attribution is dropped for the command, but it actually runs.
2926
+ // and exactly how to reply. Reply to the sender's stable agent_id, NOT its pid:
2927
+ // a pid is invalidated the moment the sender restarts (new pid), silently
2928
+ // breaking the reply route; the agent_id is preserved across restart (see
2929
+ // cmdRestart's AGENT_YES_AGENT_ID injection), so the route survives. The `#pid`
2930
+ // stays in the header for human readability. Fall back to the pid only for a
2931
+ // legacy agent with no recorded agent_id. BUT a slash command is only
2932
+ // recognized when `/` is the very first character of the submitted message; the
2933
+ // prefix would bump it to line 2 and the CLI would type the command as plain
2934
+ // text. So skip the prefix for a command body and send it verbatim —
2935
+ // attribution is dropped for the command, but it actually runs.
2936
+ const replyTarget = sender.agent?.agent_id || sender.agent?.pid;
2918
2937
  const prefix =
2919
2938
  sender.agent && !isSlashCommand(body)
2920
- ? `[from ${sender.agent.cli} #${sender.agent.pid} @ ${shortenPath(sender.agent.cwd)} — reply: ay send ${sender.agent.pid} "..."]\n`
2939
+ ? `[from ${sender.agent.cli} #${sender.agent.pid} @ ${shortenPath(sender.agent.cwd)} — reply: ay send ${replyTarget} "..."]\n`
2921
2940
  : "";
2922
2941
 
2923
2942
  const fullBody = prefix + body;
@@ -2983,7 +3002,7 @@ async function cmdSend(rest: string[]): Promise<number> {
2983
3002
  }
2984
3003
 
2985
3004
  const replyHint = sender.agent
2986
- ? ` ay send ${sender.agent.pid} "..." # reply to sender\n`
3005
+ ? ` ay send ${replyTarget} "..." # reply to sender\n`
2987
3006
  : "";
2988
3007
  process.stderr.write(
2989
3008
  `\n` +
@@ -3879,10 +3898,21 @@ async function cmdRestart(rest: string[]): Promise<number> {
3879
3898
 
3880
3899
  // Detached launcher; we deliberately don't track its pid — see restartHintLines
3881
3900
  // for why the resumed agent's pid isn't reportable synchronously.
3901
+ //
3902
+ // Carry the old record's agent_id into the relaunch so the resumed agent keeps
3903
+ // the SAME stable id (only the pid changes). Without this the wrapper mints a
3904
+ // fresh id and any `ay send <agent_id>` reply route breaks across a restart —
3905
+ // exactly the misdelivery that made a pinned-pid reply header no-match after
3906
+ // the sender restarted. The Rust/TS wrapper adopts AGENT_YES_AGENT_ID for its
3907
+ // own record and strips it from the wrapped CLI's env (pty_spawner.rs /
3908
+ // index.ts), so subagents don't collide on the id.
3882
3909
  Bun.spawn(["agent-yes", "--cli=" + record.cli, ...resumeArgs], {
3883
3910
  cwd: record.cwd,
3884
3911
  detached: true,
3885
3912
  stdio: ["ignore", "ignore", "ignore"],
3913
+ env: record.agent_id
3914
+ ? { ...process.env, AGENT_YES_AGENT_ID: record.agent_id }
3915
+ : process.env,
3886
3916
  });
3887
3917
 
3888
3918
  const { out, err } = restartHintLines(record.cli, record.cwd, strategy);
@@ -1,8 +0,0 @@
1
- import "./ts-BWd_P2qD.js";
2
- import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-CemZTLrY.js";
4
- import "./pidStore-BIvsBQ8X.js";
5
- import "./globalPidIndex-CoNr7tS8.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-BGNIrPNN.js";
7
-
8
- export { SUPPORTED_CLIS };