agent-yes 1.142.0 → 1.144.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 CHANGED
@@ -136,6 +136,22 @@ gemini-yes -- debug this code
136
136
  # Use Auggie directly
137
137
  auggie-yes -- analyze code patterns
138
138
 
139
+ # Use GLM (Z.AI) directly — runs Claude Code against Z.AI's
140
+ # Anthropic-compatible endpoint. Set ZAI_API_KEY first
141
+ # (https://z.ai/manage-apikey/apikey-list).
142
+ ZAI_API_KEY=... glm-yes -- help me with this code
143
+
144
+ # Use OpenRouter directly — runs Claude Code against OpenRouter's
145
+ # Anthropic-compatible endpoint. Set OPENROUTER_API_KEY first
146
+ # (https://openrouter.ai/keys). `orcy` is the short alias
147
+ # (openrouter-claude-yes) and defaults to the z-ai/glm-5.2 model
148
+ # (override via ANTHROPIC_DEFAULT_*_MODEL or ~/.claude/settings.json).
149
+ OPENROUTER_API_KEY=... orcy -- help me with this code
150
+
151
+ # Use Pi directly — minimal multi-provider coding agent
152
+ # (https://github.com/earendil-works/pi)
153
+ pi-yes -- refactor this module
154
+
139
155
  claude-yes "help me with this code"
140
156
  claude-yes "optimize performance"
141
157
  ```
@@ -94,6 +94,11 @@
94
94
  "type": "string",
95
95
  "description": "Actual binary name if different from CLI name (e.g., 'cursor-agent' for cursor)"
96
96
  },
97
+ "env": {
98
+ "type": "object",
99
+ "additionalProperties": { "type": "string" },
100
+ "description": "Environment variables injected into the spawned agent process (e.g. GLM points the `claude` binary at Z.AI). Values support ${VAR} expansion against the launching environment; an entry whose variable is unset is skipped so it can't blank out an inherited value."
101
+ },
97
102
  "defaultArgs": {
98
103
  "type": "array",
99
104
  "items": { "type": "string" },
@@ -76,6 +76,198 @@ clis:
76
76
  bunx: true
77
77
  defaultArgs: []
78
78
 
79
+ # GLM (Z.AI) — runs the `claude` binary against Z.AI's Anthropic-compatible
80
+ # endpoint, so it inherits every claude marker (ready/working/enter/autoRetry…)
81
+ # while talking to GLM models. Set ZAI_API_KEY (from
82
+ # https://z.ai/manage-apikey/apikey-list) before launching. Override the model
83
+ # via ~/.claude/settings.json (ANTHROPIC_DEFAULT_*_MODEL) or by exporting the
84
+ # same env vars; unset → Z.AI's default (GLM-4.7). See
85
+ # https://docs.z.ai/devpack/tool/claude
86
+ glm:
87
+ binary: claude
88
+ # ${VAR} entries expand against the launching environment at spawn time; an
89
+ # entry whose variable is unset is skipped (so it can't blank out an
90
+ # inherited value). Static values are passed through verbatim.
91
+ env:
92
+ ANTHROPIC_BASE_URL: https://api.z.ai/api/anthropic
93
+ ANTHROPIC_AUTH_TOKEN: ${ZAI_API_KEY}
94
+ API_TIMEOUT_MS: "3000000"
95
+ promptArg: last-arg
96
+ systemPrompt: --append-system-prompt
97
+ yesArgs:
98
+ - --dangerously-skip-permissions
99
+ install:
100
+ powershell: 'powershell -Command "irm https://claude.ai/install.ps1 | iex"'
101
+ bash: "curl -fsSL https://claude.ai/install.sh | bash"
102
+ npm: "npm i -g @anthropic-ai/claude-code@latest"
103
+ ready:
104
+ - '\? for shortcuts'
105
+ - ' Try "'
106
+ - '^\? for shortcuts'
107
+ - "^>[ ]"
108
+ - "──────────+"
109
+ working:
110
+ - esc to interrupt
111
+ - to run in background
112
+ needsInput:
113
+ - pattern: '❯ ?\d+\.'
114
+ flags: m
115
+ typingRespond:
116
+ "1\n":
117
+ - '│ Do you want to use this API key\?'
118
+ enter:
119
+ - pattern: ' > 1\. Yes, I trust this folder'
120
+ flags: m
121
+ - pattern: '❯ ?1\. ?Dark mode ?✔'
122
+ flags: m
123
+ - pattern: '❯ ?1\. ?Auto \(match terminal\)'
124
+ flags: m
125
+ - pattern: '❯ ?1\. ?Yes'
126
+ flags: m
127
+ - pattern: '^.{0,4} ?1\. ?Dark mode ?✔'
128
+ flags: m
129
+ - pattern: '^.{0,4} ?1\. ?Auto \(match terminal\)'
130
+ flags: m
131
+ - pattern: '^.{0,4} ?1\. ?Yes'
132
+ flags: m
133
+ - pattern: Press Enter to continue
134
+ flags: m
135
+ fatal:
136
+ - "^error: unknown option"
137
+ autoRetry:
138
+ - pattern: "API Error.*Overloaded"
139
+ flags: i
140
+ - Overloaded
141
+ - pattern: 'API Error.{0,4}5\d\d'
142
+ flags: i
143
+ - Claude usage limit reached
144
+ - hit your usage limit
145
+ - pattern: "rate.?limit"
146
+ flags: i
147
+ - pattern: "session limit"
148
+ flags: i
149
+ restoreArgs:
150
+ - --continue
151
+ restartWithoutContinueArg:
152
+ - No conversation found to continue
153
+ exitCommands:
154
+ - /exit
155
+ bunx: true
156
+ defaultArgs: []
157
+
158
+ # OpenRouter — runs the `claude` binary against OpenRouter's Anthropic-compatible
159
+ # endpoint, inheriting every claude marker while routing to OpenRouter models.
160
+ # Set OPENROUTER_API_KEY (from https://openrouter.ai/keys). ANTHROPIC_API_KEY is
161
+ # pinned to "" so Claude Code doesn't fall back to a first-party Anthropic
162
+ # account. The native skin targets Anthropic models by default; pick another via
163
+ # ~/.claude/settings.json (ANTHROPIC_DEFAULT_*_MODEL = an OpenRouter slug like
164
+ # "anthropic/claude-sonnet-4"). See
165
+ # https://openrouter.ai/docs/cookbook/coding-agents/claude-code-integration
166
+ openrouter:
167
+ binary: claude
168
+ env:
169
+ ANTHROPIC_BASE_URL: https://openrouter.ai/api
170
+ ANTHROPIC_AUTH_TOKEN: ${OPENROUTER_API_KEY}
171
+ ANTHROPIC_API_KEY: ""
172
+ # Default to GLM 5.2 (verified to work through OpenRouter's Anthropic skin).
173
+ # `${VAR:-default}` keeps it overridable: export ANTHROPIC_DEFAULT_*_MODEL or
174
+ # ANTHROPIC_MODEL (or set them in ~/.claude/settings.json) to use another
175
+ # OpenRouter slug. Reachable as `orcy` (openrouter-claude-yes).
176
+ ANTHROPIC_DEFAULT_SONNET_MODEL: ${ANTHROPIC_DEFAULT_SONNET_MODEL:-z-ai/glm-5.2}
177
+ ANTHROPIC_DEFAULT_OPUS_MODEL: ${ANTHROPIC_DEFAULT_OPUS_MODEL:-z-ai/glm-5.2}
178
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: ${ANTHROPIC_DEFAULT_HAIKU_MODEL:-z-ai/glm-5.2}
179
+ promptArg: last-arg
180
+ systemPrompt: --append-system-prompt
181
+ yesArgs:
182
+ - --dangerously-skip-permissions
183
+ install:
184
+ powershell: 'powershell -Command "irm https://claude.ai/install.ps1 | iex"'
185
+ bash: "curl -fsSL https://claude.ai/install.sh | bash"
186
+ npm: "npm i -g @anthropic-ai/claude-code@latest"
187
+ ready:
188
+ - '\? for shortcuts'
189
+ - ' Try "'
190
+ - '^\? for shortcuts'
191
+ - "^>[ ]"
192
+ - "──────────+"
193
+ working:
194
+ - esc to interrupt
195
+ - to run in background
196
+ needsInput:
197
+ - pattern: '❯ ?\d+\.'
198
+ flags: m
199
+ typingRespond:
200
+ "1\n":
201
+ - '│ Do you want to use this API key\?'
202
+ enter:
203
+ - pattern: ' > 1\. Yes, I trust this folder'
204
+ flags: m
205
+ - pattern: '❯ ?1\. ?Dark mode ?✔'
206
+ flags: m
207
+ - pattern: '❯ ?1\. ?Auto \(match terminal\)'
208
+ flags: m
209
+ - pattern: '❯ ?1\. ?Yes'
210
+ flags: m
211
+ - pattern: '^.{0,4} ?1\. ?Dark mode ?✔'
212
+ flags: m
213
+ - pattern: '^.{0,4} ?1\. ?Auto \(match terminal\)'
214
+ flags: m
215
+ - pattern: '^.{0,4} ?1\. ?Yes'
216
+ flags: m
217
+ - pattern: Press Enter to continue
218
+ flags: m
219
+ fatal:
220
+ - "^error: unknown option"
221
+ autoRetry:
222
+ - pattern: "API Error.*Overloaded"
223
+ flags: i
224
+ - Overloaded
225
+ - pattern: 'API Error.{0,4}5\d\d'
226
+ flags: i
227
+ - Claude usage limit reached
228
+ - hit your usage limit
229
+ - pattern: "rate.?limit"
230
+ flags: i
231
+ - pattern: "session limit"
232
+ flags: i
233
+ restoreArgs:
234
+ - --continue
235
+ restartWithoutContinueArg:
236
+ - No conversation found to continue
237
+ exitCommands:
238
+ - /exit
239
+ bunx: true
240
+ defaultArgs: []
241
+
242
+ # Pi — minimal multi-provider coding agent (https://github.com/earendil-works/pi).
243
+ # Interactive TUI: a bordered input box with a footer status line showing the
244
+ # context-usage gauge (e.g. "0.0%/272k") + model. Pi has NO tool-permission
245
+ # popups by design (run it in a container), so there's no "yolo" flag to map
246
+ # `-y` to — yesArgs is intentionally omitted. Pass the provider/model via
247
+ # PI_* env vars or --provider/--model; default provider is google.
248
+ pi:
249
+ binary: pi
250
+ promptArg: last-arg
251
+ systemPrompt: --append-system-prompt
252
+ help: https://github.com/earendil-works/pi
253
+ install:
254
+ npm: "npm install -g --ignore-scripts @earendil-works/pi-coding-agent"
255
+ # The footer context-usage gauge is re-rendered every time pi returns to the
256
+ # prompt, so it doubles as the "ready for input" marker. Idle detection also
257
+ # requires output quiescence, so a streaming response (gauge still updating)
258
+ # is not mis-read as idle.
259
+ ready:
260
+ - '%/\d+k'
261
+ - clear/exit
262
+ - "──────────+"
263
+ fatal:
264
+ - "^error: unknown option"
265
+ restoreArgs:
266
+ - --continue
267
+ exitCommands:
268
+ - /quit
269
+ defaultArgs: []
270
+
79
271
  gemini:
80
272
  install:
81
273
  npm: "npm install -g @google/gemini-cli@latest"
@@ -0,0 +1,8 @@
1
+ import "./ts-Qh0Z7nsZ.js";
2
+ import "./logger-CDIsZ-Pp.js";
3
+ import "./versionChecker-BjKAfiI-.js";
4
+ import "./pidStore-fqXqTKkh.js";
5
+ import "./globalPidIndex-DlmmJlO8.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-D0dDlvLS.js";
7
+
8
+ export { SUPPORTED_CLIS };
@@ -1,8 +1,8 @@
1
- import { t as CLIS_CONFIG } from "./ts-DkAVuuIK.js";
1
+ import { t as CLIS_CONFIG } from "./ts-Qh0Z7nsZ.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-C03sKqhu.js.map
8
+ //# sourceMappingURL=SUPPORTED_CLIS-D0dDlvLS.js.map
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
- import { t as invokedCliName } from "./invokedCli-zdFbz1ST.js";
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, r as getInstalledPackage, t as checkAndAutoUpdate } from "./versionChecker-Dl2LrFFo.js";
4
+ import { i as versionString, n as displayVersion, r as getInstalledPackage, t as checkAndAutoUpdate } from "./versionChecker-BjKAfiI-.js";
5
5
  import { argv } from "process";
6
6
  import { execFileSync, spawn } from "child_process";
7
7
  import ms from "ms";
@@ -480,7 +480,7 @@ function buildRustArgs(argv, cliFromScript, supportedClis) {
480
480
  const rawArg = process.argv[2];
481
481
  const managerCommands = !invokedCliName(process.argv);
482
482
  const isHelpFlag = rawArg === "-h" || rawArg === "--help";
483
- const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-DyhY1zTt.js");
483
+ const { isSubcommand, runSubcommand, cmdHelp } = await import("./subcommands-_raQNJO3.js");
484
484
  if (isHelpFlag && process.argv.length === 3) {
485
485
  cmdHelp(managerCommands);
486
486
  process.exit(0);
@@ -513,7 +513,7 @@ if (config.useRust) {
513
513
  }
514
514
  }
515
515
  if (rustBinary) {
516
- const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-BKX1tigt.js");
516
+ const { SUPPORTED_CLIS } = await import("./SUPPORTED_CLIS-CwWcK6Fl.js");
517
517
  const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
518
518
  if (config.verbose) {
519
519
  console.log(`[rust] Using binary: ${rustBinary}`);
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+ import { existsSync } from "node:fs";
3
+ import { join, dirname } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const root = join(dirname(fileURLToPath(import.meta.url)), "..");
6
+ if (typeof Bun !== "undefined" && existsSync(join(root, ".git"))) {
7
+ await import("../ts/cli.ts");
8
+ } else {
9
+ await import("./cli.js");
10
+ }
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-DkAVuuIK.js";
1
+ import { a as removeControlCharacters, i as AgentContext, n as agentYes, r as config, t as CLIS_CONFIG } from "./ts-Qh0Z7nsZ.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-Dl2LrFFo.js";
3
+ import "./versionChecker-BjKAfiI-.js";
4
4
  import "./pidStore-fqXqTKkh.js";
5
5
  import "./globalPidIndex-DlmmJlO8.js";
6
6
 
@@ -10,7 +10,10 @@
10
10
  * resolves to `undefined`. Callers use that `undefined` to tell "the agent-yes
11
11
  * manager" apart from "a cli-bound runner alias".
12
12
  */
13
- const CLI_ALIASES = { cy: "claude" };
13
+ const CLI_ALIASES = {
14
+ cy: "claude",
15
+ orcy: "openrouter"
16
+ };
14
17
  /**
15
18
  * The agent CLI implied by argv[1] (cy / claude-yes → "claude", codex-yes →
16
19
  * "codex", …), or `undefined` for the generic `ay` / `agent-yes` / `cli` entry.
@@ -22,4 +25,4 @@ function invokedCliName(argv) {
22
25
 
23
26
  //#endregion
24
27
  export { invokedCliName as t };
25
- //# sourceMappingURL=invokedCli-zdFbz1ST.js.map
28
+ //# sourceMappingURL=invokedCli-uqM2YYA7.js.map
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+ import { existsSync } from "node:fs";
3
+ import { join, dirname } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const root = join(dirname(fileURLToPath(import.meta.url)), "..");
6
+ if (typeof Bun !== "undefined" && existsSync(join(root, ".git"))) {
7
+ await import("../ts/cli.ts");
8
+ } else {
9
+ await import("./cli.js");
10
+ }
package/dist/orcy.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+ import { existsSync } from "node:fs";
3
+ import { join, dirname } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const root = join(dirname(fileURLToPath(import.meta.url)), "..");
6
+ if (typeof Bun !== "undefined" && existsSync(join(root, ".git"))) {
7
+ await import("../ts/cli.ts");
8
+ } else {
9
+ await import("./cli.js");
10
+ }
package/dist/pi-yes.js ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+ import { existsSync } from "node:fs";
3
+ import { join, dirname } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const root = join(dirname(fileURLToPath(import.meta.url)), "..");
6
+ if (typeof Bun !== "undefined" && existsSync(join(root, ".git"))) {
7
+ await import("../ts/cli.ts");
8
+ } else {
9
+ await import("./cli.js");
10
+ }
@@ -1,9 +1,9 @@
1
- import "./ts-DkAVuuIK.js";
1
+ import "./ts-Qh0Z7nsZ.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-Dl2LrFFo.js";
3
+ import "./versionChecker-BjKAfiI-.js";
4
4
  import "./pidStore-fqXqTKkh.js";
5
5
  import "./globalPidIndex-DlmmJlO8.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-C03sKqhu.js";
6
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-D0dDlvLS.js";
7
7
  import { n as resolveSpawnCwd } from "./workspaceConfig-BCOqRBEW.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-BB_gXj7p.js.map
144
+ //# sourceMappingURL=schedule-BKyOLSSe.js.map
@@ -1,13 +1,13 @@
1
- import "./ts-DkAVuuIK.js";
1
+ import "./ts-Qh0Z7nsZ.js";
2
2
  import "./logger-CDIsZ-Pp.js";
3
- import { r as getInstalledPackage } from "./versionChecker-Dl2LrFFo.js";
3
+ import { r as getInstalledPackage } from "./versionChecker-BjKAfiI-.js";
4
4
  import "./pidStore-fqXqTKkh.js";
5
5
  import { a as updateGlobalPidStatus } from "./globalPidIndex-DlmmJlO8.js";
6
6
  import { t as pgidForWrapper } from "./reaper-C-eWAxIj.js";
7
7
  import "./configShared-C1C04bbq.js";
8
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-C03sKqhu.js";
8
+ import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-D0dDlvLS.js";
9
9
  import "./remotes-PKKjfTI1.js";
10
- import { S as snapshotStatus, _ as renderRawLog, c as extractTaskCounts, g as readNotes, i as controlCodeFromName, m as listRecords, o as deriveLiveStatus, w as writeToIpc, y as resolveOne } from "./subcommands-OKH2CsBu.js";
10
+ import { S as snapshotStatus, _ as renderRawLog, c as extractTaskCounts, g as readNotes, i as controlCodeFromName, m as listRecords, o as deriveLiveStatus, w as writeToIpc, y as resolveOne } from "./subcommands-o3WRyHb9.js";
11
11
  import yargs from "yargs";
12
12
  import { mkdir, open, readFile, stat, writeFile } from "fs/promises";
13
13
  import { homedir, hostname, userInfo } from "os";
@@ -77,7 +77,8 @@ const SESSION_PIN_ENV = new Set([
77
77
  "CLAUDE_CODE_SSE_PORT",
78
78
  "CLAUDE_CODE_SESSION_ID",
79
79
  "CLAUDE_CODE_CHILD_SESSION",
80
- "CLAUDE_CODE_ENTRYPOINT"
80
+ "CLAUDE_CODE_ENTRYPOINT",
81
+ "AGENT_YES_PID"
81
82
  ]);
82
83
  function freshAgentEnv() {
83
84
  const env = {};
@@ -499,6 +500,7 @@ Options:
499
500
  const hint = stray.includes("share") ? " (did you mean --share?)" : "";
500
501
  process.stderr.write(`ay serve: ignoring unknown argument${stray.length > 1 ? "s" : ""}: ${stray.join(" ")}${hint}\n`);
501
502
  }
503
+ delete process.env.AGENT_YES_PID;
502
504
  const port = argv.port ?? DEFAULT_PORT;
503
505
  const host = argv.host ?? "127.0.0.1";
504
506
  const tokenFlag = typeof argv.token === "string" ? argv.token : void 0;
@@ -1175,4 +1177,4 @@ Options:
1175
1177
 
1176
1178
  //#endregion
1177
1179
  export { cmdServe };
1178
- //# sourceMappingURL=serve-B8tHXvH2.js.map
1180
+ //# sourceMappingURL=serve-QXNICu0K.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-B8tHXvH2.js");
35
+ const { cmdServe } = await import("./serve-QXNICu0K.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-DKF0uPs6.js.map
45
+ //# sourceMappingURL=setup-dJlAGJEz.js.map
@@ -2,6 +2,6 @@ import "./logger-CDIsZ-Pp.js";
2
2
  import "./globalPidIndex-DlmmJlO8.js";
3
3
  import "./configShared-C1C04bbq.js";
4
4
  import "./remotes-PKKjfTI1.js";
5
- import { C as stopTipForCli, S as snapshotStatus, _ as renderRawLog, a as cursorAbs, b as resolveReadWindow, c as extractTaskCounts, d as isExitRequest, f as isPidAlive, g as readNotes, h as matchKeyword, i as controlCodeFromName, l as finalizedLines, m as listRecords, n as READ_PAGE_DEFAULT, o as deriveLiveStatus, p as isSubcommand, r as cmdHelp, s as extractNeedsInput, t as GRACEFUL_EXIT_COMMANDS, u as isAgentStuck, v as renderRawLogLines, w as writeToIpc, x as runSubcommand, y as resolveOne } from "./subcommands-OKH2CsBu.js";
5
+ import { C as stopTipForCli, S as snapshotStatus, _ as renderRawLog, a as cursorAbs, b as resolveReadWindow, c as extractTaskCounts, d as isExitRequest, f as isPidAlive, g as readNotes, h as matchKeyword, i as controlCodeFromName, l as finalizedLines, m as listRecords, n as READ_PAGE_DEFAULT, o as deriveLiveStatus, p as isSubcommand, r as cmdHelp, s as extractNeedsInput, t as GRACEFUL_EXIT_COMMANDS, u as isAgentStuck, v as renderRawLogLines, w as writeToIpc, x as runSubcommand, y as resolveOne } from "./subcommands-o3WRyHb9.js";
6
6
 
7
7
  export { cmdHelp, isSubcommand, runSubcommand };
@@ -1,4 +1,4 @@
1
- import { t as invokedCliName } from "./invokedCli-zdFbz1ST.js";
1
+ import { t as invokedCliName } from "./invokedCli-uqM2YYA7.js";
2
2
  import { t as agentYesHome } from "./agentYesHome-_eJa3DaX.js";
3
3
  import { a as updateGlobalPidStatus, i as readGlobalPids } from "./globalPidIndex-DlmmJlO8.js";
4
4
  import { t as loadSharedCliDefaults } from "./configShared-C1C04bbq.js";
@@ -553,15 +553,15 @@ async function runSubcommand(argv) {
553
553
  case "restart": return await cmdRestart(rest);
554
554
  case "note": return await cmdNote(rest);
555
555
  case "serve": {
556
- const { cmdServe } = await import("./serve-B8tHXvH2.js");
556
+ const { cmdServe } = await import("./serve-QXNICu0K.js");
557
557
  return cmdServe(rest);
558
558
  }
559
559
  case "setup": {
560
- const { cmdSetup } = await import("./setup-DKF0uPs6.js");
560
+ const { cmdSetup } = await import("./setup-dJlAGJEz.js");
561
561
  return cmdSetup(rest);
562
562
  }
563
563
  case "schedule": {
564
- const { cmdSchedule } = await import("./schedule-BB_gXj7p.js");
564
+ const { cmdSchedule } = await import("./schedule-BKyOLSSe.js");
565
565
  return cmdSchedule(rest);
566
566
  }
567
567
  case "remote": {
@@ -2581,4 +2581,4 @@ async function cmdResultSet(rest) {
2581
2581
 
2582
2582
  //#endregion
2583
2583
  export { stopTipForCli as C, snapshotStatus as S, renderRawLog as _, cursorAbs as a, resolveReadWindow as b, extractTaskCounts as c, isExitRequest as d, isPidAlive as f, readNotes as g, matchKeyword as h, controlCodeFromName as i, finalizedLines as l, listRecords as m, READ_PAGE_DEFAULT as n, deriveLiveStatus as o, isSubcommand as p, cmdHelp as r, extractNeedsInput as s, GRACEFUL_EXIT_COMMANDS as t, isAgentStuck as u, renderRawLogLines as v, writeToIpc as w, runSubcommand as x, resolveOne as y };
2584
- //# sourceMappingURL=subcommands-OKH2CsBu.js.map
2584
+ //# sourceMappingURL=subcommands-o3WRyHb9.js.map
@@ -1,5 +1,5 @@
1
1
  import { n as logger, t as addTransport } from "./logger-CDIsZ-Pp.js";
2
- import { r as getInstalledPackage } from "./versionChecker-Dl2LrFFo.js";
2
+ import { r as getInstalledPackage } from "./versionChecker-BjKAfiI-.js";
3
3
  import { t as agentYesHome } from "./agentYesHome-_eJa3DaX.js";
4
4
  import { i as shouldUseLock, r as releaseLock, t as acquireLock } from "./runningLock-V4qvXgAw.js";
5
5
  import { t as PidStore } from "./pidStore-fqXqTKkh.js";
@@ -1216,6 +1216,18 @@ async function agentYes({ cli, cliArgs = [], skipPermissions = false, prompt, ro
1216
1216
  const inheritedAyPid = Number(ptyEnv.AGENT_YES_PID);
1217
1217
  const parentPid = Number.isInteger(inheritedAyPid) && inheritedAyPid > 0 ? inheritedAyPid : void 0;
1218
1218
  ptyEnv.AGENT_YES_PID = String(process.pid);
1219
+ if (cliConf?.env) for (const [key, raw] of Object.entries(cliConf.env)) {
1220
+ let unresolved = false;
1221
+ const value = raw.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g, (_, name, fallback) => {
1222
+ const v = ptyEnv[name];
1223
+ if (v !== void 0 && v !== "") return v;
1224
+ if (fallback !== void 0) return fallback;
1225
+ unresolved = true;
1226
+ return "";
1227
+ });
1228
+ if (unresolved) continue;
1229
+ ptyEnv[key] = value;
1230
+ }
1219
1231
  const ptyOptions = {
1220
1232
  name: "xterm-color",
1221
1233
  ...getTerminalDimensions(),
@@ -1788,4 +1800,4 @@ function sleep(ms) {
1788
1800
 
1789
1801
  //#endregion
1790
1802
  export { removeControlCharacters as a, AgentContext as i, agentYes as n, config as r, CLIS_CONFIG as t };
1791
- //# sourceMappingURL=ts-DkAVuuIK.js.map
1803
+ //# sourceMappingURL=ts-Qh0Z7nsZ.js.map
@@ -7,7 +7,7 @@ import { fileURLToPath } from "url";
7
7
 
8
8
  //#region package.json
9
9
  var name = "agent-yes";
10
- var version = "1.142.0";
10
+ var version = "1.144.0";
11
11
 
12
12
  //#endregion
13
13
  //#region ts/versionChecker.ts
@@ -215,4 +215,4 @@ async function displayVersion() {
215
215
 
216
216
  //#endregion
217
217
  export { versionString as i, displayVersion as n, getInstalledPackage as r, checkAndAutoUpdate as t };
218
- //# sourceMappingURL=versionChecker-Dl2LrFFo.js.map
218
+ //# sourceMappingURL=versionChecker-BjKAfiI-.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-yes",
3
- "version": "1.142.0",
3
+ "version": "1.144.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",
@@ -39,9 +39,13 @@
39
39
  "cursor-yes": "./dist/cursor-yes.js",
40
40
  "cy": "./dist/cy.js",
41
41
  "gemini-yes": "./dist/gemini-yes.js",
42
+ "glm-yes": "./dist/glm-yes.js",
42
43
  "grok-yes": "./dist/grok-yes.js",
43
44
  "opencode-yes": "./dist/opencode-yes.js",
44
- "qwen-yes": "./dist/qwen-yes.js"
45
+ "qwen-yes": "./dist/qwen-yes.js",
46
+ "pi-yes": "./dist/pi-yes.js",
47
+ "openrouter-yes": "./dist/openrouter-yes.js",
48
+ "orcy": "./dist/orcy.js"
45
49
  },
46
50
  "directories": {
47
51
  "doc": "docs"
@@ -4,6 +4,9 @@ import { buildRustArgs } from "./buildRustArgs";
4
4
 
5
5
  const SUPPORTED_CLIS = [
6
6
  "claude",
7
+ "glm",
8
+ "openrouter",
9
+ "pi",
7
10
  "gemini",
8
11
  "codex",
9
12
  "copilot",
package/ts/index.ts CHANGED
@@ -43,6 +43,10 @@ export type AgentCliConfig = {
43
43
  | { powershell?: string; bash?: string; npm?: string; unix?: string; windows?: string }; // hint user for install command if not installed
44
44
  version?: string; // hint user for version command to check if installed
45
45
  binary?: string; // actual binary name if different from cli, e.g. cursor -> cursor-agent
46
+ // Env vars injected into the spawned agent (e.g. glm points `claude` at Z.AI).
47
+ // Values support ${VAR} expansion against the launching env; an entry whose
48
+ // variable is unset is skipped so it can't blank out an inherited value.
49
+ env?: Record<string, string>;
46
50
  defaultArgs?: string[]; // function to ensure certain args are present
47
51
  yesArgs?: string[]; // appended when `-y`/--yes is passed: the per-CLI "yolo" flag (claude: --dangerously-skip-permissions; codex: --dangerously-bypass-approvals-and-sandbox)
48
52
  help?: string; // documentation/help URL for the CLI
@@ -369,6 +373,28 @@ export default async function agentYes({
369
373
  const parentPid =
370
374
  Number.isInteger(inheritedAyPid) && inheritedAyPid > 0 ? inheritedAyPid : undefined;
371
375
  ptyEnv.AGENT_YES_PID = String(process.pid);
376
+ // Inject per-CLI env (e.g. glm → Z.AI endpoint). Expand ${VAR} against the
377
+ // launching env; skip entries whose vars are unset so we never blank out an
378
+ // inherited value (e.g. ANTHROPIC_AUTH_TOKEN when ZAI_API_KEY isn't exported).
379
+ // `${VAR:-default}` falls back to `default` when VAR is unset/empty — used for
380
+ // overridable defaults like the model (openrouter → z-ai/glm-5.2).
381
+ if (cliConf?.env) {
382
+ for (const [key, raw] of Object.entries(cliConf.env)) {
383
+ let unresolved = false;
384
+ const value = raw.replace(
385
+ /\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g,
386
+ (_, name, fallback) => {
387
+ const v = ptyEnv[name];
388
+ if (v !== undefined && v !== "") return v;
389
+ if (fallback !== undefined) return fallback;
390
+ unresolved = true;
391
+ return "";
392
+ },
393
+ );
394
+ if (unresolved) continue;
395
+ ptyEnv[key] = value;
396
+ }
397
+ }
372
398
  const ptyOptions = {
373
399
  name: "xterm-color",
374
400
  ...getTerminalDimensions(),
package/ts/invokedCli.ts CHANGED
@@ -11,7 +11,8 @@
11
11
  */
12
12
 
13
13
  // Short aliases → target CLI. Must match the alias wrappers postbuild.ts emits.
14
- export const CLI_ALIASES: Record<string, string> = { cy: "claude" };
14
+ // orcy = "openrouter-claude-yes" (claude binary routed through OpenRouter).
15
+ export const CLI_ALIASES: Record<string, string> = { cy: "claude", orcy: "openrouter" };
15
16
 
16
17
  /**
17
18
  * The agent CLI implied by argv[1] (cy / claude-yes → "claude", codex-yes →
package/ts/postbuild.ts CHANGED
@@ -13,7 +13,7 @@ const cliNames = [...Object.keys(CLIS_CONFIG), "agent"];
13
13
  const suffixes = ["-yes"];
14
14
 
15
15
  // Short aliases: maps alias name → target CLI name (alias resolves in parseCliArgs.ts)
16
- const shortAliases: Record<string, string> = { cy: "claude" };
16
+ const shortAliases: Record<string, string> = { cy: "claude", orcy: "openrouter" };
17
17
 
18
18
  // Under Bun (dev via `bun link`), run TypeScript source directly — no build needed.
19
19
  // Under Node (published install or CI), use the compiled dist/cli.js.
package/ts/serve.ts CHANGED
@@ -111,6 +111,13 @@ const SESSION_PIN_ENV = new Set([
111
111
  "CLAUDE_CODE_SESSION_ID",
112
112
  "CLAUDE_CODE_CHILD_SESSION",
113
113
  "CLAUDE_CODE_ENTRYPOINT",
114
+ // The agent-yes wrapper pid of the agent that launched `ay serve`. A daemon
115
+ // started from inside an agent's shell carries that agent's AGENT_YES_PID for
116
+ // its whole lifetime; without stripping it, every console-spawned agent would
117
+ // inherit it and be recorded with parent_pid = that stale agent, mis-rooting
118
+ // the whole subagent tree under an unrelated agent. Dropping it makes console
119
+ // spawns clean top-level agents (parent_pid = None).
120
+ "AGENT_YES_PID",
114
121
  ]);
115
122
 
116
123
  // Env for a console-spawned agent, minus only the session-pinning vars above. If
@@ -731,6 +738,14 @@ export async function cmdServe(rest: string[]): Promise<number> {
731
738
  );
732
739
  }
733
740
 
741
+ // Drop the AGENT_YES_PID we may have inherited from the shell/agent that
742
+ // launched us. A serve daemon outlives that agent, but the env var sticks for
743
+ // our whole lifetime; if left in place, freshAgentEnv() aside, any descendant
744
+ // we spawn would be recorded with parent_pid = that long-dead agent, mis-rooting
745
+ // the subagent tree. Clearing it once at startup makes console spawns clean
746
+ // top-level agents regardless of the spawn path.
747
+ delete process.env.AGENT_YES_PID;
748
+
734
749
  const port = (argv.port as number) ?? DEFAULT_PORT;
735
750
  const host = (argv.host as string) ?? "127.0.0.1";
736
751
  const tokenFlag = typeof argv.token === "string" ? argv.token : undefined;
package/ts/subcommands.ts CHANGED
Binary file
@@ -1,8 +0,0 @@
1
- import "./ts-DkAVuuIK.js";
2
- import "./logger-CDIsZ-Pp.js";
3
- import "./versionChecker-Dl2LrFFo.js";
4
- import "./pidStore-fqXqTKkh.js";
5
- import "./globalPidIndex-DlmmJlO8.js";
6
- import { t as SUPPORTED_CLIS } from "./SUPPORTED_CLIS-C03sKqhu.js";
7
-
8
- export { SUPPORTED_CLIS };