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.
- package/README.md +9 -44
- package/agent-yes.config.schema.json +0 -1
- package/default.config.yaml +0 -138
- package/dist/{JsonlStore-CPGIR0Wy.js → JsonlStore-BqF7AQ6E.js} +1 -1
- package/dist/{SUPPORTED_CLIS-DFOStQkx.js → SUPPORTED_CLIS-CNrMN-89.js} +2 -2
- package/dist/SUPPORTED_CLIS-DibEQVjZ.js +12 -0
- package/dist/{agent-yes.config-2xKNJM5Y.js → agent-yes.config-C77SodMP.js} +2 -2
- package/dist/{agentShare-CLhjMsHZ.js → agentShare-YWrrxqN2.js} +10 -10
- package/dist/{agentYesHome-CtmsY6I-.js → agentYesHome-BNtn19J4.js} +1 -1
- package/dist/{askCli-Bbxt9Umz.js → askCli-DR9vhdcV.js} +6 -6
- package/dist/{browser-_2ndf80G.js → browser-XQnbPssj.js} +5 -5
- package/dist/{browser-CorYp8Yu.js → browser-oqC3Ln2a.js} +1 -1
- package/dist/callback-DK1hFHPw.js +13 -0
- package/dist/{callback-BVKHRbUE.js → callback-DwnU5Bnx.js} +6 -6
- package/dist/{callbackCore-Bbe7rpN2.js → callbackCore-Bl2gGcxg.js} +1 -1
- package/dist/{callbackCore-C0Cg9RbS.js → callbackCore-LDxJc8LY.js} +1 -1
- package/dist/{channels-CkaCyvEp.js → channels-C3w3eAES.js} +2 -2
- package/dist/{channels-3gz9gHP7.js → channels-hOG3-R_3.js} +6 -6
- package/dist/channels.js +5 -5
- package/dist/cli.js +14 -14
- package/dist/{cmdPs-Cu__YsO7.js → cmdPs-tpr2ARd3.js} +9 -9
- package/dist/{configShared-DYxlvrH0.js → configShared-DKTgiz7K.js} +1 -1
- package/dist/{cwdConflictWarn-Buy3r_qc.js → cwdConflictWarn-CqN5pJ-7.js} +2 -2
- package/dist/{cwdPassthroughHint-BlWO-h5w.js → cwdPassthroughHint-DxdqgwEN.js} +1 -1
- package/dist/{e2e-OLfcNxiv.js → e2e-z1xpwSAg.js} +1 -1
- package/dist/{expose-Bfo-dZdy.js → expose-DTxYWQeW.js} +1 -1
- package/dist/{forkNested-jc2ER9xn.js → forkNested-CZAvQj0y.js} +8 -5
- package/dist/{globalPidIndex-Dq4KY2IV.js → globalPidIndex-DoaKEUkO.js} +1 -1
- package/dist/{globalPidIndex-CQX_0JSB.js → globalPidIndex-yvWZXeWT.js} +1 -1
- package/dist/{hist-DiOYRXuD.js → hist-QkZZBp-y.js} +1 -1
- package/dist/{html2canvas-pro.esm-D19oTQeV.js → html2canvas-pro.esm-DbGFekkq.js} +1 -1
- package/dist/{identity-CLaJ9-uE.js → identity-CKRuYUFi.js} +1 -1
- package/dist/{identity-BmDYOuZE.js → identity-DFr3dfTO.js} +1 -1
- package/dist/index.js +8 -8
- package/dist/{initMsg-CTAIqBWF.js → initMsg-C8ISz_C7.js} +1 -1
- package/dist/{initMsg-Bat5PUDf.js → initMsg-DAwRS89d.js} +1 -1
- package/dist/{invokedCli-uqM2YYA7.js → invokedCli-zdFbz1ST.js} +2 -5
- package/dist/{messageLog-BYFwioFY.js → messageLog-DdjBNqgt.js} +1 -1
- package/dist/{needsInput-DhfIwxse.js → needsInput-BHopZGM8.js} +1 -1
- package/dist/{nodeRuntime-CKc1BN5J.js → nodeRuntime-C_LtZrpR.js} +2 -2
- package/dist/{notifyDaemon-BmtjtW5L.js → notifyDaemon-Dx5sjDIx.js} +9 -9
- package/dist/{notifyStore-Dus2D1XA.js → notifyStore-2SWKGwZI.js} +2 -2
- package/dist/{notifyStore-0hlFPa6z.js → notifyStore-CdsB3crt.js} +1 -1
- package/dist/{openBrowser-Dmg2Oi4q.js → openBrowser-B50Lhaob.js} +1 -1
- package/dist/{parentLink-DS-XflaJ.js → parentLink-i817PzXK.js} +2 -2
- package/dist/{parentLink-BwX4jaGD.js → parentLink-svMgYhEi.js} +2 -2
- package/dist/{parentPingLoop-BtggDU06.js → parentPingLoop-DV7fBiMN.js} +7 -7
- package/dist/{peer-Dr4zvtcd.js → peer-BZyUyCt3.js} +3 -3
- package/dist/peer-CGSJluSw.js +4 -0
- package/dist/{pidStore-DJqSZPJi.js → pidStore-B73xnAeT.js} +4 -4
- package/dist/pidStore-V51mbgZY.js +6 -0
- package/dist/{reaper-B231i49s.js → reaper-BDMiMfwK.js} +1 -1
- package/dist/{reaper-C4BvNylH.js → reaper-UimuuTfO.js} +2 -2
- package/dist/{remotes-IzQHupeo.js → remotes-Cdlaj7AP.js} +17 -9
- package/dist/{remotes-BiftUp09.js → remotes-gAI6-nv9.js} +3 -3
- package/dist/{runningLock-DBoONoM-.js → runningLock-BOIPD_Vs.js} +1 -1
- package/dist/rustBinary-B7cNTxWn.js +4 -0
- package/dist/{rustBinary-ISnNc7Uf.js → rustBinary-DDwz4LdD.js} +73 -6
- package/dist/{schedule-D37Q9LGO.js → schedule-Bc5tKPJi.js} +12 -12
- package/dist/{serve-Dw0x9Of9.js → serve-ClCAkuSj.js} +41 -41
- package/dist/{setup-BmBjOyza.js → setup-D6v3wsXq.js} +4 -4
- package/dist/{share-DTPZgbfH.js → share-BvU4I8BI.js} +2 -2
- package/dist/{share-RgJUhzqG.js → share-DTlaFn6s.js} +2 -2
- package/dist/spawnGate-CdewnL8m.js +5 -0
- package/dist/{spawnGate-CS3oFdJ9.js → spawnGate-DtC_ffme.js} +3 -3
- package/dist/{store-C7I2CAu9.js → store-CnxYGoia.js} +1 -1
- package/dist/{subcommands-DKqbwkvb.js → subcommands-D0TqxBxb.js} +67 -85
- package/dist/subcommands-DLqtyQdw.js +11 -0
- package/dist/{systemPathLink-DGVcx0fg.js → systemPathLink-Df_pstm2.js} +1 -1
- package/dist/{terminal-BQ79zaFa.js → terminal-Dzu-PTIU.js} +2 -2
- package/dist/terminal.js +1 -1
- package/dist/{todoAutomation-BETGOik9.js → todoAutomation-CbVVS4re.js} +2 -2
- package/dist/{todoCli-DUoxA1dh.js → todoCli-Cf0EHvfy.js} +6 -6
- package/dist/{todoIdentity-BffBxRHA.js → todoIdentity-NEceTmEe.js} +2 -2
- package/dist/{todoStore-Wk8U4zJ8.js → todoStore-DF6vxHgV.js} +2 -2
- package/dist/{tray-Bxq_sfvU.js → tray-BeIs4ffu.js} +2 -2
- package/dist/{trayApp-BsETHuMR.js → trayApp-DCG8CjCV.js} +3 -3
- package/dist/trayApp-kjebnTl9.js +5 -0
- package/dist/{ts-Bb-h7XQP.js → ts-BmGAFUb7.js} +15 -19
- package/dist/{versionChecker-D9LB-MW5.js → versionChecker-DzWZizq2.js} +3 -3
- package/dist/{webrtcLink-B72AQ2eb.js → webrtcLink-DLaJfTcB.js} +2 -2
- package/dist/{webrtcRemote-D68dkqFp.js → webrtcRemote-CIbq5Hdt.js} +3 -3
- package/dist/{widget-gRjJprB5.js → widget-hU12_Sog.js} +3 -3
- package/dist/widget.js +1 -1
- package/dist/widgets.js +5 -5
- package/dist/{workspaceConfig-EK7XNsgR.js → workspaceConfig-DctWuxUP.js} +2 -2
- package/dist/ws-jKReYJJw.js +12 -0
- package/dist/{ws-BFli3FKi.js → ws-pRbF59zo.js} +3 -3
- package/examples/.agent-yes.config.yaml +0 -9
- package/examples/spawn-notify.sh +1 -1
- package/lab/ui/index.html +123 -34
- package/lab/ui/landing.html +7 -8
- package/package.json +1 -6
- package/ts/buildRustArgs.spec.ts +8 -10
- package/ts/configLoader.spec.ts +2 -2
- package/ts/cwdConflictWarn.spec.ts +1 -1
- package/ts/cwdConflictWarn.ts +1 -1
- package/ts/forkNested.spec.ts +2 -0
- package/ts/forkNested.ts +5 -2
- package/ts/index.ts +2 -8
- package/ts/invokedCli.spec.ts +0 -1
- package/ts/invokedCli.ts +1 -2
- package/ts/needsInput.spec.ts +7 -3
- package/ts/needsInput.ts +1 -1
- package/ts/parseCliArgs.spec.ts +1 -1
- package/ts/parseCliArgs.ts +1 -1
- package/ts/postbuild.ts +1 -1
- package/ts/remotes.ts +24 -7
- package/ts/rustBinary.spec.ts +81 -0
- package/ts/rustBinary.ts +106 -9
- package/ts/subcommands.spec.ts +7 -9
- package/ts/subcommands.ts +90 -64
- package/ts/todoParse.ts +1 -1
- package/dist/SUPPORTED_CLIS-C1rgBiLd.js +0 -12
- package/dist/callback-C64-nP2U.js +0 -13
- package/dist/gemini-yes.js +0 -10
- package/dist/openrouter-yes.js +0 -10
- package/dist/orcy.js +0 -10
- package/dist/peer-u1AUAZeA.js +0 -4
- package/dist/pidStore-D-b8I6Qx.js +0 -6
- package/dist/spawnGate-C6YKlnmb.js +0 -5
- package/dist/subcommands-TAOmVCxo.js +0 -11
- package/dist/trayApp-BHx2FN2d.js +0 -5
- package/dist/ws-CklRMQwW.js +0 -12
- package/scripts/deepseek-codex.ts +0 -580
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { u as parseSecret } from "./e2e-
|
|
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-
|
|
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-
|
|
2
|
-
import { n as isWebrtcSpec, r as parseWebrtcLink, t as SIGNAL_SUBPROTOCOL } from "./webrtcLink-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
2
|
-
import "./channels-
|
|
3
|
-
import "./peer-
|
|
4
|
-
import { t as AyChannel } from "./browser-
|
|
5
|
-
import { t as AyTerminal } from "./browser-
|
|
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-
|
|
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-
|
|
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 {
|
|
2
|
-
import { a as getProvisionRoot } from "./workspaceConfig-
|
|
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-
|
|
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
|
package/examples/spawn-notify.sh
CHANGED
|
@@ -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
|
|
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
|
-
<
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
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
|
|
4108
|
-
//
|
|
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"
|
|
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")
|
|
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 || "…"}`;
|
package/lab/ui/landing.html
CHANGED
|
@@ -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,
|
|
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,
|
|
212
|
-
|
|
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>
|
|
228
|
-
<b>
|
|
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,
|
|
260
|
-
|
|
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.
|
|
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",
|
package/ts/buildRustArgs.spec.ts
CHANGED
|
@@ -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=
|
|
119
|
+
argv("--cli=codex", "--timeout", "30s"),
|
|
122
120
|
"claude",
|
|
123
121
|
SUPPORTED_CLIS,
|
|
124
122
|
);
|
|
125
|
-
expect(result).toEqual(["--cli=
|
|
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", "
|
|
129
|
+
argv("--cli", "codex", "--timeout", "30s"),
|
|
132
130
|
"claude",
|
|
133
131
|
SUPPORTED_CLIS,
|
|
134
132
|
);
|
|
135
|
-
expect(result).toEqual(["--cli", "
|
|
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 ["
|
|
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("
|
|
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
|
-
"
|
|
323
|
+
"codex",
|
|
326
324
|
SUPPORTED_CLIS,
|
|
327
325
|
);
|
|
328
|
-
expect(result).toEqual(["--cli=
|
|
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", () => {
|
package/ts/configLoader.spec.ts
CHANGED
|
@@ -41,7 +41,7 @@ describe("configLoader", () => {
|
|
|
41
41
|
`
|
|
42
42
|
configDir: /custom/yaml/config
|
|
43
43
|
clis:
|
|
44
|
-
|
|
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?.
|
|
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: "
|
|
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
|
});
|
package/ts/cwdConflictWarn.ts
CHANGED
|
@@ -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
|
|
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
|
package/ts/forkNested.spec.ts
CHANGED
|
@@ -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
|
|
51
|
-
` ay
|
|
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
|
|
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 (
|
|
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
|
}
|
package/ts/invokedCli.spec.ts
CHANGED
|
@@ -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
|
-
|
|
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 →
|
package/ts/needsInput.spec.ts
CHANGED
|
@@ -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
|
|
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 (
|
|
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 = [
|
|
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
|
});
|