agent-yes 1.272.0 → 1.274.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 (125) hide show
  1. package/README.md +9 -44
  2. package/agent-yes.config.schema.json +0 -1
  3. package/default.config.yaml +0 -138
  4. package/dist/{JsonlStore-CPGIR0Wy.js → JsonlStore-BqF7AQ6E.js} +1 -1
  5. package/dist/{SUPPORTED_CLIS-DFOStQkx.js → SUPPORTED_CLIS-CNrMN-89.js} +2 -2
  6. package/dist/SUPPORTED_CLIS-DibEQVjZ.js +12 -0
  7. package/dist/{agent-yes.config-2xKNJM5Y.js → agent-yes.config-C77SodMP.js} +2 -2
  8. package/dist/{agentShare-CLhjMsHZ.js → agentShare-YWrrxqN2.js} +10 -10
  9. package/dist/{agentYesHome-CtmsY6I-.js → agentYesHome-BNtn19J4.js} +1 -1
  10. package/dist/{askCli-Bbxt9Umz.js → askCli-DR9vhdcV.js} +6 -6
  11. package/dist/{browser-_2ndf80G.js → browser-XQnbPssj.js} +5 -5
  12. package/dist/{browser-CorYp8Yu.js → browser-oqC3Ln2a.js} +1 -1
  13. package/dist/callback-DK1hFHPw.js +13 -0
  14. package/dist/{callback-BVKHRbUE.js → callback-DwnU5Bnx.js} +6 -6
  15. package/dist/{callbackCore-Bbe7rpN2.js → callbackCore-Bl2gGcxg.js} +1 -1
  16. package/dist/{callbackCore-C0Cg9RbS.js → callbackCore-LDxJc8LY.js} +1 -1
  17. package/dist/{channels-CkaCyvEp.js → channels-C3w3eAES.js} +2 -2
  18. package/dist/{channels-3gz9gHP7.js → channels-hOG3-R_3.js} +6 -6
  19. package/dist/channels.js +5 -5
  20. package/dist/cli.js +14 -14
  21. package/dist/{cmdPs-Cu__YsO7.js → cmdPs-tpr2ARd3.js} +9 -9
  22. package/dist/{configShared-DYxlvrH0.js → configShared-DKTgiz7K.js} +1 -1
  23. package/dist/{cwdConflictWarn-Buy3r_qc.js → cwdConflictWarn-CqN5pJ-7.js} +2 -2
  24. package/dist/{cwdPassthroughHint-BlWO-h5w.js → cwdPassthroughHint-DxdqgwEN.js} +1 -1
  25. package/dist/{e2e-OLfcNxiv.js → e2e-z1xpwSAg.js} +1 -1
  26. package/dist/{expose-Bfo-dZdy.js → expose-DTxYWQeW.js} +1 -1
  27. package/dist/{forkNested-jc2ER9xn.js → forkNested-CZAvQj0y.js} +8 -5
  28. package/dist/{globalPidIndex-Dq4KY2IV.js → globalPidIndex-DoaKEUkO.js} +1 -1
  29. package/dist/{globalPidIndex-CQX_0JSB.js → globalPidIndex-yvWZXeWT.js} +1 -1
  30. package/dist/{hist-DiOYRXuD.js → hist-QkZZBp-y.js} +1 -1
  31. package/dist/{html2canvas-pro.esm-D19oTQeV.js → html2canvas-pro.esm-DbGFekkq.js} +1 -1
  32. package/dist/{identity-CLaJ9-uE.js → identity-CKRuYUFi.js} +1 -1
  33. package/dist/{identity-BmDYOuZE.js → identity-DFr3dfTO.js} +1 -1
  34. package/dist/index.js +8 -8
  35. package/dist/{initMsg-CTAIqBWF.js → initMsg-C8ISz_C7.js} +1 -1
  36. package/dist/{initMsg-Bat5PUDf.js → initMsg-DAwRS89d.js} +1 -1
  37. package/dist/{invokedCli-uqM2YYA7.js → invokedCli-zdFbz1ST.js} +2 -5
  38. package/dist/{messageLog-BYFwioFY.js → messageLog-DdjBNqgt.js} +1 -1
  39. package/dist/{needsInput-DhfIwxse.js → needsInput-BHopZGM8.js} +1 -1
  40. package/dist/{nodeRuntime-CKc1BN5J.js → nodeRuntime-C_LtZrpR.js} +2 -2
  41. package/dist/{notifyDaemon-BmtjtW5L.js → notifyDaemon-Dx5sjDIx.js} +9 -9
  42. package/dist/{notifyStore-Dus2D1XA.js → notifyStore-2SWKGwZI.js} +2 -2
  43. package/dist/{notifyStore-0hlFPa6z.js → notifyStore-CdsB3crt.js} +1 -1
  44. package/dist/{openBrowser-Dmg2Oi4q.js → openBrowser-B50Lhaob.js} +1 -1
  45. package/dist/{parentLink-DS-XflaJ.js → parentLink-i817PzXK.js} +2 -2
  46. package/dist/{parentLink-BwX4jaGD.js → parentLink-svMgYhEi.js} +2 -2
  47. package/dist/{parentPingLoop-BtggDU06.js → parentPingLoop-DV7fBiMN.js} +7 -7
  48. package/dist/{peer-Dr4zvtcd.js → peer-BZyUyCt3.js} +3 -3
  49. package/dist/peer-CGSJluSw.js +4 -0
  50. package/dist/{pidStore-DJqSZPJi.js → pidStore-B73xnAeT.js} +4 -4
  51. package/dist/pidStore-V51mbgZY.js +6 -0
  52. package/dist/{reaper-B231i49s.js → reaper-BDMiMfwK.js} +1 -1
  53. package/dist/{reaper-C4BvNylH.js → reaper-UimuuTfO.js} +2 -2
  54. package/dist/{remotes-IzQHupeo.js → remotes-Cdlaj7AP.js} +17 -9
  55. package/dist/{remotes-BiftUp09.js → remotes-gAI6-nv9.js} +3 -3
  56. package/dist/{runningLock-DBoONoM-.js → runningLock-BOIPD_Vs.js} +1 -1
  57. package/dist/rustBinary-B7cNTxWn.js +4 -0
  58. package/dist/{rustBinary-ISnNc7Uf.js → rustBinary-DDwz4LdD.js} +73 -6
  59. package/dist/{schedule-D37Q9LGO.js → schedule-Bc5tKPJi.js} +12 -12
  60. package/dist/{serve-Dw0x9Of9.js → serve-ClCAkuSj.js} +41 -41
  61. package/dist/{setup-BmBjOyza.js → setup-D6v3wsXq.js} +4 -4
  62. package/dist/{share-DTPZgbfH.js → share-BvU4I8BI.js} +2 -2
  63. package/dist/{share-RgJUhzqG.js → share-DTlaFn6s.js} +2 -2
  64. package/dist/spawnGate-CdewnL8m.js +5 -0
  65. package/dist/{spawnGate-CS3oFdJ9.js → spawnGate-DtC_ffme.js} +3 -3
  66. package/dist/{store-C7I2CAu9.js → store-CnxYGoia.js} +1 -1
  67. package/dist/{subcommands-DKqbwkvb.js → subcommands-D0TqxBxb.js} +67 -85
  68. package/dist/subcommands-DLqtyQdw.js +11 -0
  69. package/dist/{systemPathLink-DGVcx0fg.js → systemPathLink-Df_pstm2.js} +1 -1
  70. package/dist/{terminal-BQ79zaFa.js → terminal-Dzu-PTIU.js} +2 -2
  71. package/dist/terminal.js +1 -1
  72. package/dist/{todoAutomation-BETGOik9.js → todoAutomation-CbVVS4re.js} +2 -2
  73. package/dist/{todoCli-DUoxA1dh.js → todoCli-Cf0EHvfy.js} +6 -6
  74. package/dist/{todoIdentity-BffBxRHA.js → todoIdentity-NEceTmEe.js} +2 -2
  75. package/dist/{todoStore-Wk8U4zJ8.js → todoStore-DF6vxHgV.js} +2 -2
  76. package/dist/{tray-Bxq_sfvU.js → tray-BeIs4ffu.js} +2 -2
  77. package/dist/{trayApp-BsETHuMR.js → trayApp-DCG8CjCV.js} +3 -3
  78. package/dist/trayApp-kjebnTl9.js +5 -0
  79. package/dist/{ts-Bb-h7XQP.js → ts-BmGAFUb7.js} +15 -19
  80. package/dist/{versionChecker-D9LB-MW5.js → versionChecker-DzWZizq2.js} +3 -3
  81. package/dist/{webrtcLink-B72AQ2eb.js → webrtcLink-DLaJfTcB.js} +2 -2
  82. package/dist/{webrtcRemote-D68dkqFp.js → webrtcRemote-CIbq5Hdt.js} +3 -3
  83. package/dist/{widget-gRjJprB5.js → widget-hU12_Sog.js} +3 -3
  84. package/dist/widget.js +1 -1
  85. package/dist/widgets.js +5 -5
  86. package/dist/{workspaceConfig-EK7XNsgR.js → workspaceConfig-DctWuxUP.js} +2 -2
  87. package/dist/ws-jKReYJJw.js +12 -0
  88. package/dist/{ws-BFli3FKi.js → ws-pRbF59zo.js} +3 -3
  89. package/examples/.agent-yes.config.yaml +0 -9
  90. package/examples/spawn-notify.sh +1 -1
  91. package/lab/ui/index.html +123 -34
  92. package/lab/ui/landing.html +7 -8
  93. package/package.json +1 -6
  94. package/ts/buildRustArgs.spec.ts +8 -10
  95. package/ts/configLoader.spec.ts +2 -2
  96. package/ts/cwdConflictWarn.spec.ts +1 -1
  97. package/ts/cwdConflictWarn.ts +1 -1
  98. package/ts/forkNested.spec.ts +2 -0
  99. package/ts/forkNested.ts +5 -2
  100. package/ts/index.ts +2 -8
  101. package/ts/invokedCli.spec.ts +0 -1
  102. package/ts/invokedCli.ts +1 -2
  103. package/ts/needsInput.spec.ts +7 -3
  104. package/ts/needsInput.ts +1 -1
  105. package/ts/parseCliArgs.spec.ts +1 -1
  106. package/ts/parseCliArgs.ts +1 -1
  107. package/ts/postbuild.ts +1 -1
  108. package/ts/remotes.ts +24 -7
  109. package/ts/rustBinary.spec.ts +81 -0
  110. package/ts/rustBinary.ts +106 -9
  111. package/ts/subcommands.spec.ts +7 -9
  112. package/ts/subcommands.ts +90 -64
  113. package/ts/todoParse.ts +1 -1
  114. package/dist/SUPPORTED_CLIS-C1rgBiLd.js +0 -12
  115. package/dist/callback-C64-nP2U.js +0 -13
  116. package/dist/gemini-yes.js +0 -10
  117. package/dist/openrouter-yes.js +0 -10
  118. package/dist/orcy.js +0 -10
  119. package/dist/peer-u1AUAZeA.js +0 -4
  120. package/dist/pidStore-D-b8I6Qx.js +0 -6
  121. package/dist/spawnGate-C6YKlnmb.js +0 -5
  122. package/dist/subcommands-TAOmVCxo.js +0 -11
  123. package/dist/trayApp-BHx2FN2d.js +0 -5
  124. package/dist/ws-CklRMQwW.js +0 -12
  125. package/scripts/deepseek-codex.ts +0 -580
@@ -1,4 +1,4 @@
1
- import { u as parseSecret } from "./e2e-OLfcNxiv.js";
1
+ import { u as parseSecret } from "./e2e-z1xpwSAg.js";
2
2
 
3
3
  //#region ts/webrtcLink.ts
4
4
  const SIGNAL_SUBPROTOCOL = "ay-signal-1";
@@ -42,4 +42,4 @@ function isWebrtcSpec(spec) {
42
42
 
43
43
  //#endregion
44
44
  export { isWebrtcSpec as n, parseWebrtcLink as r, SIGNAL_SUBPROTOCOL as t };
45
- //# sourceMappingURL=webrtcLink-B72AQ2eb.js.map
45
+ //# sourceMappingURL=webrtcLink-DLaJfTcB.js.map
@@ -1,5 +1,5 @@
1
- import { a as computeTranscriptHash, c as open, d as randomHex, f as seal, l as packEnvelope, n as FLAG_CONFIRM, o as deriveAuthToken, p as unpackEnvelope, s as deriveDirKeys } from "./e2e-OLfcNxiv.js";
2
- import { n as isWebrtcSpec, r as parseWebrtcLink, t as SIGNAL_SUBPROTOCOL } from "./webrtcLink-B72AQ2eb.js";
1
+ import { a as computeTranscriptHash, c as open, d as randomHex, f as seal, l as packEnvelope, n as FLAG_CONFIRM, o as deriveAuthToken, p as unpackEnvelope, s as deriveDirKeys } from "./e2e-z1xpwSAg.js";
2
+ import { n as isWebrtcSpec, r as parseWebrtcLink, t as SIGNAL_SUBPROTOCOL } from "./webrtcLink-DLaJfTcB.js";
3
3
  import { RTCPeerConnection } from "node-datachannel/polyfill";
4
4
 
5
5
  //#region ts/webrtcRemote.ts
@@ -256,4 +256,4 @@ async function startWebrtcBridge(link) {
256
256
 
257
257
  //#endregion
258
258
  export { startWebrtcBridge };
259
- //# sourceMappingURL=webrtcRemote-D68dkqFp.js.map
259
+ //# sourceMappingURL=webrtcRemote-CIbq5Hdt.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-Dw0x9Of9.js");
31
+ const { resolveDaemonHttpBase, loadTokenReadOnly } = await import("./serve-ClCAkuSj.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-Dw0x9Of9.js");
189
+ const { mintScopedTermToken } = await import("./serve-ClCAkuSj.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-gRjJprB5.js.map
205
+ //# sourceMappingURL=widget-hU12_Sog.js.map
package/dist/widget.js CHANGED
@@ -142,7 +142,7 @@ var AyWidget = class {
142
142
  }
143
143
  async h2c(el, viewport, rect, unclipSelector) {
144
144
  const g = globalThis;
145
- const mod = await import("./html2canvas-pro.esm-D19oTQeV.js");
145
+ const mod = await import("./html2canvas-pro.esm-DbGFekkq.js");
146
146
  const html2canvas = mod.default ?? mod;
147
147
  const opts = {
148
148
  backgroundColor: viewport ? "#ffffff" : null,
package/dist/widgets.js CHANGED
@@ -1,8 +1,8 @@
1
- import "./e2e-OLfcNxiv.js";
2
- import "./channels-CkaCyvEp.js";
3
- import "./peer-Dr4zvtcd.js";
4
- import { t as AyChannel } from "./browser-_2ndf80G.js";
5
- import { t as AyTerminal } from "./browser-CorYp8Yu.js";
1
+ import "./e2e-z1xpwSAg.js";
2
+ import "./channels-C3w3eAES.js";
3
+ import "./peer-BZyUyCt3.js";
4
+ import { t as AyChannel } from "./browser-XQnbPssj.js";
5
+ import { t as AyTerminal } from "./browser-oqC3Ln2a.js";
6
6
  import { AyWidget } from "./widget.js";
7
7
 
8
8
  export { AyChannel, AyTerminal, AyWidget };
@@ -1,4 +1,4 @@
1
- import { t as agentYesHome } from "./agentYesHome-CtmsY6I-.js";
1
+ import { t as agentYesHome } from "./agentYesHome-BNtn19J4.js";
2
2
  import { lstatSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
3
3
  import { homedir } from "os";
4
4
  import path from "path";
@@ -215,4 +215,4 @@ function allowsSkipPermissions() {
215
215
 
216
216
  //#endregion
217
217
  export { getProvisionRoot as a, getWorkspaceRoot as c, isProvisionAllowed as d, resolveSpawnCwd as f, getProvisionHook as i, hasProvisionHook as l, getMaxAgents as n, getSpawnHook as o, setWorkspaceRoot as p, getMinFreeMb as r, getSpawnWaitMs as s, allowsSkipPermissions as t, hasSpawnHook as u };
218
- //# sourceMappingURL=workspaceConfig-EK7XNsgR.js.map
218
+ //# sourceMappingURL=workspaceConfig-DctWuxUP.js.map
@@ -0,0 +1,12 @@
1
+ import "./logger-CDIsZ-Pp.js";
2
+ import "./globalPidIndex-DoaKEUkO.js";
3
+ import "./messageLog-DdjBNqgt.js";
4
+ import "./e2e-z1xpwSAg.js";
5
+ import "./configShared-DKTgiz7K.js";
6
+ import "./subcommands-D0TqxBxb.js";
7
+ import "./notifyStore-2SWKGwZI.js";
8
+ import "./webrtcLink-DLaJfTcB.js";
9
+ import "./remotes-Cdlaj7AP.js";
10
+ import { a as isPathInside, c as walkWorkspaces, i as importProvisionModule, l as workspaceStatus, n as cmdWs, o as loadProvision, r as collectWorkspaces, s as resolveOperand, t as WS_JSON_SCHEMA } from "./ws-pRbF59zo.js";
11
+
12
+ export { WS_JSON_SCHEMA, cmdWs, collectWorkspaces, isPathInside, loadProvision, walkWorkspaces, workspaceStatus };
@@ -1,5 +1,5 @@
1
- import { O as listRecords } from "./subcommands-DKqbwkvb.js";
2
- import { a as getProvisionRoot } from "./workspaceConfig-EK7XNsgR.js";
1
+ import { D as listRecords } from "./subcommands-D0TqxBxb.js";
2
+ import { a as getProvisionRoot } from "./workspaceConfig-DctWuxUP.js";
3
3
  import { existsSync } from "fs";
4
4
  import { lstat, opendir } from "fs/promises";
5
5
  import path from "path";
@@ -424,4 +424,4 @@ async function cmdWs(args) {
424
424
 
425
425
  //#endregion
426
426
  export { isPathInside as a, walkWorkspaces as c, importProvisionModule as i, workspaceStatus as l, cmdWs as n, loadProvision as o, collectWorkspaces as r, resolveOperand as s, WS_JSON_SCHEMA as t };
427
- //# sourceMappingURL=ws-BFli3FKi.js.map
427
+ //# sourceMappingURL=ws-pRbF59zo.js.map
@@ -34,15 +34,6 @@ clis:
34
34
  - "> 1\\. Yes,"
35
35
  - "> 1\\. Approve and run now"
36
36
 
37
- # Gemini configuration
38
- gemini:
39
- ready:
40
- - "Type your message"
41
- enter:
42
- - "│ ● 1\\. Yes, allow once"
43
- restoreArgs:
44
- - --resume
45
-
46
37
  # Custom CLI example
47
38
  # my-custom-cli:
48
39
  # binary: my-cli-binary
@@ -13,7 +13,7 @@
13
13
  # outlives this waiter.
14
14
  #
15
15
  # Usage: spawn-notify <cwd> -- <task...>
16
- # Env: CLI=claude wrapped CLI (claude|codex|gemini|…)
16
+ # Env: CLI=claude wrapped CLI (claude|codex|…)
17
17
  # AY_FLAGS="-y" extra flags for `ay <cli>` (e.g. -y for yolo)
18
18
  # WAIT_MODE=--wait --wait → wake on idle|needs_input|stuck|stopped (recommended:
19
19
  # also catches a blocked AskUserQuestion menu)
package/lab/ui/index.html CHANGED
@@ -1091,6 +1091,49 @@
1091
1091
  color: var(--accent);
1092
1092
  border-color: var(--accent);
1093
1093
  }
1094
+ /* Settings (⚙) dropdown in the console toolbar — folds the view toggles
1095
+ (subs/state/stale/ports/graph) behind one trigger to declutter the bar. */
1096
+ .viewmenu {
1097
+ position: relative;
1098
+ }
1099
+ .viewmenupanel {
1100
+ position: absolute;
1101
+ top: 30px;
1102
+ right: 0;
1103
+ z-index: 15;
1104
+ background: var(--panel);
1105
+ border: 1px solid var(--line);
1106
+ border-radius: 8px;
1107
+ padding: 4px;
1108
+ min-width: 150px;
1109
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.25);
1110
+ }
1111
+ .viewmenupanel[hidden] {
1112
+ display: none;
1113
+ }
1114
+ .viewmenuitem {
1115
+ display: flex;
1116
+ align-items: center;
1117
+ gap: 7px;
1118
+ width: 100%;
1119
+ background: none;
1120
+ border: none;
1121
+ text-align: left;
1122
+ font: inherit;
1123
+ font-size: 12.5px;
1124
+ color: var(--muted);
1125
+ padding: 5px 8px;
1126
+ border-radius: 6px;
1127
+ cursor: pointer;
1128
+ white-space: nowrap;
1129
+ }
1130
+ .viewmenuitem:hover {
1131
+ background: var(--bg);
1132
+ color: var(--fg);
1133
+ }
1134
+ .viewmenuitem.on {
1135
+ color: var(--accent);
1136
+ }
1094
1137
  .lcard .nfield {
1095
1138
  margin-top: 12px;
1096
1139
  }
@@ -1986,27 +2029,56 @@
1986
2029
  <span id="count" class="count"></span>
1987
2030
  </span>
1988
2031
  <span class="metaright">
1989
- <button id="foldbtn" class="viewbtn" title="fold subagent trees">⊞ subs</button>
1990
- <button id="sortbtn" class="viewbtn" title="cycle sort order">⇅ state</button>
1991
- <button
1992
- id="stalebtn"
1993
- class="viewbtn"
1994
- role="checkbox"
1995
- aria-checked="false"
1996
- title="show stale stopped agents (exited over 5 minutes ago)"
1997
- >
1998
- ◌ stale
1999
- </button>
2000
- <button id="portsbtn" class="viewbtn" title="manage exposed localhost ports">
2001
- ⇄ ports
2002
- </button>
2003
- <button
2004
- id="rguibtn"
2005
- class="viewbtn"
2006
- title="open the agent graph view (/r/) for this fleet"
2007
- >
2008
- ⌗ graph
2009
- </button>
2032
+ <span class="viewmenu">
2033
+ <button
2034
+ id="viewmenubtn"
2035
+ class="viewbtn"
2036
+ title="view settings"
2037
+ aria-haspopup="true"
2038
+ aria-expanded="false"
2039
+ >
2040
+ ⚙ Settings ▾
2041
+ </button>
2042
+ <div class="viewmenupanel" id="viewmenupanel" hidden>
2043
+ <button
2044
+ id="foldbtn"
2045
+ class="viewmenuitem"
2046
+ type="button"
2047
+ title="fold subagent trees"
2048
+ >
2049
+ ⊞ subs
2050
+ </button>
2051
+ <button id="sortbtn" class="viewmenuitem" type="button" title="cycle sort order">
2052
+ ⇅ state
2053
+ </button>
2054
+ <button
2055
+ id="stalebtn"
2056
+ class="viewmenuitem"
2057
+ type="button"
2058
+ role="checkbox"
2059
+ aria-checked="false"
2060
+ title="show stale stopped agents (exited over 5 minutes ago)"
2061
+ >
2062
+ ◌ stale
2063
+ </button>
2064
+ <button
2065
+ id="portsbtn"
2066
+ class="viewmenuitem"
2067
+ type="button"
2068
+ title="manage exposed localhost ports"
2069
+ >
2070
+ ⇄ ports
2071
+ </button>
2072
+ <button
2073
+ id="rguibtn"
2074
+ class="viewmenuitem"
2075
+ type="button"
2076
+ title="open the agent graph view (/r/) for this fleet"
2077
+ >
2078
+ ⌗ graph
2079
+ </button>
2080
+ </div>
2081
+ </span>
2010
2082
  <button id="newbtn" class="newbtn" title="spawn a new agent on this fleet">
2011
2083
  + New agent
2012
2084
  </button>
@@ -4104,13 +4176,13 @@
4104
4176
 
4105
4177
  // Wire the ⋯ overflow menu and restore the saved HUD preference.
4106
4178
  // Recovery actions for the SELECTED agent, both confirmed first (destructive):
4107
- // Stop — graceful: send the CLI's exit command (claude/codex /exit, gemini
4108
- // /quit) + Enter over the existing /api/send stdin wire. (Ctrl+C / Ctrl+C×2
4179
+ // Stop — graceful: send the CLI's exit command (claude/codex /exit) + Enter
4180
+ // over the existing /api/send stdin wire. (Ctrl+C / Ctrl+C×2
4109
4181
  // you can already just type — and some agents rely on that pattern — so
4110
4182
  // we don't reinvent it here.)
4111
4183
  // Force — escalation a stuck agent can't ignore: a real SIGKILL of its process
4112
4184
  // GROUP, server-side via POST /api/kill. Use when /exit does nothing.
4113
- const GRACEFUL_EXIT = { claude: "/exit", codex: "/exit", gemini: "/quit" };
4185
+ const GRACEFUL_EXIT = { claude: "/exit", codex: "/exit" };
4114
4186
  // `ent` targets a specific agent (the Cmd+K /kill · /restart commands pass the
4115
4187
  // omnibox anchor); the ⋯-menu buttons omit it and act on the selected agent.
4116
4188
  async function stopAgent(force, ent) {
@@ -5328,6 +5400,27 @@ my.translate = async (text, lang) => {
5328
5400
  } catch {}
5329
5401
  setPerfHud(saved);
5330
5402
  })();
5403
+ (function viewMenuBoot() {
5404
+ const btn = $("viewmenubtn"),
5405
+ panel = $("viewmenupanel");
5406
+ const closePanel = () => {
5407
+ if (!panel) return;
5408
+ panel.hidden = true;
5409
+ btn?.setAttribute("aria-expanded", "false");
5410
+ };
5411
+ if (btn && panel) {
5412
+ btn.addEventListener("click", (ev) => {
5413
+ ev.stopPropagation();
5414
+ panel.hidden = !panel.hidden;
5415
+ btn.setAttribute("aria-expanded", String(!panel.hidden));
5416
+ });
5417
+ document.addEventListener("click", (ev) => {
5418
+ if (!panel.hidden && !panel.contains(ev.target) && ev.target !== btn) closePanel();
5419
+ });
5420
+ // Any item click closes the dropdown after the item's own handler runs.
5421
+ panel.addEventListener("click", closePanel);
5422
+ }
5423
+ })();
5331
5424
 
5332
5425
  // The local source is only worth polling when this page is actually backed
5333
5426
  // by an ay serve: localhost, or served by `ay serve --http` (which leaves a
@@ -8050,15 +8143,7 @@ my.translate = async (text, lang) => {
8050
8143
  // picker (options from /api/spawn-config `clis`), preselected from the
8051
8144
  // chain: selected agent's cli → last used cli → explicit user pick.
8052
8145
  const LAST_CLI_KEY = "ay.lastSpawnCli";
8053
- const CLI_FALLBACK = [
8054
- "claude",
8055
- "codex",
8056
- "gemini",
8057
- "copilot",
8058
- "cursor-agent",
8059
- "goose",
8060
- "aider",
8061
- ];
8146
+ const CLI_FALLBACK = ["claude", "codex", "copilot", "cursor-agent", "goose", "aider"];
8062
8147
  function cliOptions(clis, preferred) {
8063
8148
  const list = clis && clis.length ? clis : CLI_FALLBACK;
8064
8149
  const has = preferred && list.includes(preferred);
@@ -8208,7 +8293,11 @@ my.translate = async (text, lang) => {
8208
8293
  if (!cwdEl.disabled) cwdEl.dataset.userCwd = cwdEl.value;
8209
8294
  let br = ($("nf-branch")?.value || "").trim() || parsed.branch || "";
8210
8295
  if (!br && nfRemoteBranches) {
8211
- br = nfRemoteBranches.has("main") ? "main" : nfRemoteBranches.has("master") ? "master" : "";
8296
+ br = nfRemoteBranches.has("main")
8297
+ ? "main"
8298
+ : nfRemoteBranches.has("master")
8299
+ ? "master"
8300
+ : "";
8212
8301
  }
8213
8302
  cwdEl.disabled = true;
8214
8303
  cwdEl.value = `${nfWsRoot || "~/ws"}/${parsed.owner}/${parsed.repo}/tree/${br || "…"}`;
@@ -16,7 +16,7 @@
16
16
  <title>agent-yes — drive any AI coding CLI on autopilot</title>
17
17
  <meta
18
18
  name="description"
19
- content="agent-yes wraps Claude, Codex, Gemini and more, auto-answering their prompts so they run unattended — and ay serve streams a live, end-to-end-encrypted console to your browser."
19
+ content="agent-yes wraps Claude, Codex, Copilot and more, auto-answering their prompts so they run unattended — and ay serve streams a live, end-to-end-encrypted console to your browser."
20
20
  />
21
21
  <link
22
22
  rel="icon"
@@ -208,8 +208,8 @@
208
208
  <section class="hero">
209
209
  <h1>Drive any AI coding CLI on autopilot.</h1>
210
210
  <p class="sub">
211
- agent-yes wraps Claude, Codex, Gemini, Copilot and more — auto-answering their prompts so
212
- they keep working unattended. Then <code>ay serve</code>
211
+ agent-yes wraps Claude, Codex, Copilot and more — auto-answering their prompts so they
212
+ keep working unattended. Then <code>ay serve</code>
213
213
  streams a live, end-to-end-encrypted console to your browser so you can watch, steer, and
214
214
  spawn agents from anywhere.
215
215
  </p>
@@ -224,9 +224,8 @@
224
224
  # Windows (PowerShell)
225
225
  <span id="setup-ps">powershell -c "irm https://agent-yes.com/setup.ps1 | iex"</span></code></pre>
226
226
  <div class="clis">
227
- Wrappers: <b>claude-yes</b> · <b>codex-yes</b> · <b>gemini-yes</b> ·
228
- <b>copilot-yes</b> · <b>cursor-yes</b> · <b>qwen-yes</b> · <b>grok-yes</b> — or just
229
- <b>ay</b>.
227
+ Wrappers: <b>claude-yes</b> · <b>codex-yes</b> · <b>copilot-yes</b> ·
228
+ <b>cursor-yes</b> · <b>qwen-yes</b> · <b>grok-yes</b> — or just <b>ay</b>.
230
229
  </div>
231
230
  </div>
232
231
  </section>
@@ -256,8 +255,8 @@
256
255
  <div class="card">
257
256
  <h3>Many CLIs, one wrapper</h3>
258
257
  <p>
259
- One tool across Claude, Codex, Gemini, Copilot, Cursor, Qwen, Grok — same flags, same
260
- live console.
258
+ One tool across Claude, Codex, Copilot, Cursor, Qwen, Grok — same flags, same live
259
+ console.
261
260
  </p>
262
261
  </div>
263
262
  </section>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.272.0",
3
+ "version": "1.274.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",
@@ -13,7 +13,6 @@
13
13
  "codex",
14
14
  "copilot",
15
15
  "cursor",
16
- "gemini",
17
16
  "grok",
18
17
  "qwen",
19
18
  "wrapper"
@@ -40,12 +39,9 @@
40
39
  "copilot-yes": "./dist/copilot-yes.js",
41
40
  "cursor-yes": "./dist/cursor-yes.js",
42
41
  "cy": "./dist/cy.js",
43
- "gemini-yes": "./dist/gemini-yes.js",
44
42
  "glm-yes": "./dist/glm-yes.js",
45
43
  "grok-yes": "./dist/grok-yes.js",
46
44
  "opencode-yes": "./dist/opencode-yes.js",
47
- "openrouter-yes": "./dist/openrouter-yes.js",
48
- "orcy": "./dist/orcy.js",
49
45
  "pi-yes": "./dist/pi-yes.js",
50
46
  "powershell-yes": "./dist/powershell-yes.js",
51
47
  "qwen-yes": "./dist/qwen-yes.js"
@@ -108,7 +104,6 @@
108
104
  "registry": "https://registry.npmjs.org/"
109
105
  },
110
106
  "scripts": {
111
- "deepseek": "bun scripts/deepseek-codex.ts",
112
107
  "build": "tsdown",
113
108
  "check:e2e": "bun scripts/check-e2e.ts",
114
109
  "cf": "bun scripts/cf.ts",
@@ -5,9 +5,7 @@ import { buildRustArgs } from "./buildRustArgs";
5
5
  const SUPPORTED_CLIS = [
6
6
  "claude",
7
7
  "glm",
8
- "openrouter",
9
8
  "pi",
10
- "gemini",
11
9
  "codex",
12
10
  "copilot",
13
11
  "cursor",
@@ -118,26 +116,26 @@ describe("buildRustArgs", () => {
118
116
 
119
117
  it("skips --cli= when --cli= flag is already used", () => {
120
118
  const result = buildRustArgs(
121
- argv("--cli=gemini", "--timeout", "30s"),
119
+ argv("--cli=codex", "--timeout", "30s"),
122
120
  "claude",
123
121
  SUPPORTED_CLIS,
124
122
  );
125
- expect(result).toEqual(["--cli=gemini", "--timeout", "30s"]);
123
+ expect(result).toEqual(["--cli=codex", "--timeout", "30s"]);
126
124
  expect(result).not.toContain("--cli=claude");
127
125
  });
128
126
 
129
127
  it("skips --cli= when --cli flag is used (separate value)", () => {
130
128
  const result = buildRustArgs(
131
- argv("--cli", "gemini", "--timeout", "30s"),
129
+ argv("--cli", "codex", "--timeout", "30s"),
132
130
  "claude",
133
131
  SUPPORTED_CLIS,
134
132
  );
135
- expect(result).toEqual(["--cli", "gemini", "--timeout", "30s"]);
133
+ expect(result).toEqual(["--cli", "codex", "--timeout", "30s"]);
136
134
  expect(result).not.toContain("--cli=claude");
137
135
  });
138
136
 
139
137
  it("detects any supported CLI name in args", () => {
140
- for (const cli of ["gemini", "codex", "copilot", "cursor", "grok"]) {
138
+ for (const cli of ["codex", "copilot", "cursor", "grok"]) {
141
139
  const result = buildRustArgs(argv("--timeout", "1m", cli), "claude", SUPPORTED_CLIS);
142
140
  expect(result).not.toContain("--cli=claude");
143
141
  expect(result[0]).toBe(`--cli=${cli}`);
@@ -319,13 +317,13 @@ describe("buildRustArgs", () => {
319
317
  expect(result).not.toContain("--cli=claude");
320
318
  });
321
319
 
322
- it("gemini-yes --rust --timeout 2m --verbose -p 'hello'", () => {
320
+ it("codex-yes --rust --timeout 2m --verbose -p 'hello'", () => {
323
321
  const result = buildRustArgs(
324
322
  argv("--rust", "--timeout", "2m", "--verbose", "-p", "hello"),
325
- "gemini",
323
+ "codex",
326
324
  SUPPORTED_CLIS,
327
325
  );
328
- expect(result).toEqual(["--cli=gemini", "--timeout", "2m", "--verbose", "-p", "hello"]);
326
+ expect(result).toEqual(["--cli=codex", "--timeout", "2m", "--verbose", "-p", "hello"]);
329
327
  });
330
328
 
331
329
  it("claude-yes --rust --auto=no --timeout 10m", () => {
@@ -41,7 +41,7 @@ describe("configLoader", () => {
41
41
  `
42
42
  configDir: /custom/yaml/config
43
43
  clis:
44
- gemini:
44
+ codex:
45
45
  defaultArgs:
46
46
  - --resume
47
47
  `,
@@ -49,7 +49,7 @@ clis:
49
49
 
50
50
  const config = await loadCascadingConfig({ projectDir: testDir });
51
51
  expect(config.configDir).toBe("/custom/yaml/config");
52
- expect(config.clis?.gemini?.defaultArgs).toEqual(["--resume"]);
52
+ expect(config.clis?.codex?.defaultArgs).toEqual(["--resume"]);
53
53
  });
54
54
 
55
55
  it("should compile regex sources from YAML config", async () => {
@@ -31,7 +31,7 @@ describe("cwdConflictWarn.formatCwdConflictWarning", () => {
31
31
  });
32
32
 
33
33
  it("falls back to a placeholder when cwd has no basename or command is empty", () => {
34
- const msg = formatCwdConflictWarning([{ pid: 9, cli: "gemini" }], "/", " ")!;
34
+ const msg = formatCwdConflictWarning([{ pid: 9, cli: "codex" }], "/", " ")!;
35
35
  expect(msg).toContain("../agent-work"); // basename('/') is empty → 'agent'
36
36
  expect(msg).toContain("&& ay <cli> …"); // empty origCmd → placeholder
37
37
  });
@@ -82,7 +82,7 @@ export async function warnIfCwdOccupied(rawArgv: string[]): Promise<void> {
82
82
  const msg = formatCwdConflictWarning(occupants, here, origCmd);
83
83
  if (msg) {
84
84
  process.stderr.write(msg);
85
- // Interactive CLIs (claude/codex/gemini) switch to the alternate screen
85
+ // Interactive CLIs (claude/codex) switch to the alternate screen
86
86
  // buffer on startup, which clears the terminal — the warning would flash
87
87
  // and vanish before a human could read it. Hold briefly (only on a real
88
88
  // conflict, only when attached to a TTY) so they get a beat to Ctrl-C and
@@ -212,6 +212,8 @@ describe("buildSpawnTutorial", () => {
212
212
  expect(out).toContain("ay ls");
213
213
  expect(out).toContain("ay result get 4242");
214
214
  expect(out).toContain("ay exit 4242");
215
+ expect(out).toContain("ay notify watch --unread");
216
+ expect(out).toContain("Monitor (preferred");
215
217
  });
216
218
  });
217
219
 
package/ts/forkNested.ts CHANGED
@@ -47,8 +47,11 @@ export function buildSpawnTutorial(cli: string, pid: number): string {
47
47
  // ISN'T watching — and it steps aside automatically when you are (see
48
48
  // ts/parentWatching.ts), so listing both here doesn't create duplicates.
49
49
  `Two ways to keep up with it — use whichever fits your harness:`,
50
- ` Monitor (preferred if you have a monitor/polling loop):`,
51
- ` ay ls --watch --json # NDJSON stream of state changes across agents`,
50
+ ` Monitor (preferred, works even without a native monitor tool):`,
51
+ ` ay notify watch --unread # get notified when it finishes / goes idle / crashes`,
52
+ ` # (a background daemon polls liveness every 2s, so even a`,
53
+ ` # hard crash — this wrapper dies too — still reaches you)`,
54
+ ` ay ls --watch --json # PULL alternative: NDJSON stream of state changes`,
52
55
  ` ay status ${pid} # one-shot: working | idle | needs_input | stopped`,
53
56
  ` ay status ${pid} --wait-idle # block until it's done (add --timeout=Ns)`,
54
57
  ` Or do nothing: it was told to report back to you, and its wrapper will`,
package/ts/index.ts CHANGED
@@ -133,7 +133,7 @@ export type AgentCliConfig = {
133
133
  system?: string; // system prompt content to inject
134
134
 
135
135
  // status detect, and actions
136
- ready?: RegExp[]; // regex matcher for stdin ready, or line index for gemini. Set to empty array [] to disable ready check entirely.
136
+ ready?: RegExp[]; // regex matcher for stdin ready. Set to empty array [] to disable ready check entirely.
137
137
  fatal?: RegExp[]; // array of regex to match for fatal errors
138
138
  working?: RegExp[]; // regex matcher for working status
139
139
  updateAvailable?: RegExp[]; // regex matcher for update available banners
@@ -451,11 +451,6 @@ export default async function agentYes({
451
451
  // just add --continue flag for claude
452
452
  cliArgs = ["--continue", ...cliArgs];
453
453
  await logger.debug(`resume|adding --continue flag for claude`);
454
- } else if (cli === "gemini") {
455
- // Gemini supports session resume natively via --resume flag
456
- // Sessions are project/directory-specific by default (stored in ~/.gemini/tmp/<project_hash>/chats/)
457
- cliArgs = ["--resume", ...cliArgs];
458
- await logger.debug(`resume|adding --resume flag for gemini`);
459
454
  } else {
460
455
  throw new Error(
461
456
  `Resume option is not supported for cli: ${cli}, make a feature request if you want it. https://github.com/snomiao/agent-yes/issues`,
@@ -514,7 +509,7 @@ export default async function agentYes({
514
509
  // launching env; skip entries whose vars are unset so we never blank out an
515
510
  // inherited value (e.g. ANTHROPIC_AUTH_TOKEN when ZAI_API_KEY isn't exported).
516
511
  // `${VAR:-default}` falls back to `default` when VAR is unset/empty — used for
517
- // overridable defaults like the model (openrouter → z-ai/glm-5.2).
512
+ // overridable defaults like the model (glm → z-ai/glm-5.2).
518
513
  if (cliConf?.env) {
519
514
  for (const [key, raw] of Object.entries(cliConf.env)) {
520
515
  let unresolved = false;
@@ -1412,7 +1407,6 @@ export default async function agentYes({
1412
1407
  // ready matcher: if matched, mark stdin ready
1413
1408
  if (conf.ready?.some((rx: RegExp) => line.match(rx))) {
1414
1409
  logger.debug(`ready |${line}`);
1415
- if (cli === "gemini" && lineIndex <= 80) return; // gemini initial noise, only after many lines
1416
1410
  ctx.stdinReady.ready();
1417
1411
  ctx.stdinFirstReady.ready();
1418
1412
  }
@@ -9,7 +9,6 @@ describe("invokedCliName", () => {
9
9
  expect(invokedCliName(argv("/root/.bun/bin/cy"))).toBe("claude");
10
10
  expect(invokedCliName(argv("/usr/local/bin/claude-yes"))).toBe("claude");
11
11
  expect(invokedCliName(argv("/usr/local/bin/codex-yes"))).toBe("codex");
12
- expect(invokedCliName(argv("gemini-yes"))).toBe("gemini");
13
12
  });
14
13
 
15
14
  it("returns undefined for the generic manager entry", () => {
package/ts/invokedCli.ts CHANGED
@@ -11,8 +11,7 @@
11
11
  */
12
12
 
13
13
  // Short aliases → target CLI. Must match the alias wrappers postbuild.ts emits.
14
- // orcy = "openrouter-claude-yes" (claude binary routed through OpenRouter).
15
- export const CLI_ALIASES: Record<string, string> = { cy: "claude", orcy: "openrouter" };
14
+ export const CLI_ALIASES: Record<string, string> = { cy: "claude" };
16
15
 
17
16
  /**
18
17
  * The agent CLI implied by argv[1] (cy / claude-yes → "claude", codex-yes →
@@ -117,7 +117,7 @@ test("parseMenu: a 'N.M' version in an option label isn't mistaken for another o
117
117
  // Claude renders its permission / AskUserQuestion dialogs INSIDE a rounded box,
118
118
  // so every option row arrives with a leading "│" border (the shipped config's own
119
119
  // markers show this: a typingRespond keyed on '│ Do you want to use this API key\?'
120
- // and gemini `enter` rows like "│ ● 1. Yes, allow once"). Option rows must still be
120
+ // and `enter` rows like "│ ● 1. Yes, allow once"). Option rows must still be
121
121
  // collected through that border — otherwise `ay select N` can only ever pick the
122
122
  // option the cursor already sits on.
123
123
  test("parseMenu: collects options through a box border (claude permission dialog)", () => {
@@ -134,7 +134,7 @@ test("parseMenu: collects options through a box border (claude permission dialog
134
134
  expect(menu!.options).toEqual([1, 2, 3]);
135
135
  });
136
136
 
137
- test("parseMenu: collects boxed bullet rows (gemini '│ ● 1. Yes, allow once')", () => {
137
+ test("parseMenu: collects boxed bullet rows ('│ ● 1. Yes, allow once')", () => {
138
138
  const screen = [
139
139
  "│ Apply this change? │",
140
140
  "│ ❯ 1. Yes, allow once │",
@@ -147,7 +147,11 @@ test("parseMenu: collects boxed bullet rows (gemini '│ ● 1. Yes, allow once'
147
147
  });
148
148
 
149
149
  test("parseMenu: a boxed 'N.M' version still isn't mistaken for an option", () => {
150
- const screen = ["│ Cleanup? │", "│ ❯ 1. Delete 3.5GB │", "│ 2. Keep │"];
150
+ const screen = [
151
+ "│ Cleanup? │",
152
+ "│ ❯ 1. Delete 3.5GB │",
153
+ "│ 2. Keep │",
154
+ ];
151
155
  const menu = parseMenu(screen, claude);
152
156
  expect(menu!.options).toEqual([1, 2]);
153
157
  });