dsh-agy-link 0.4.65 → 0.4.66

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/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.66 (2026-10-19)
4
+
5
+ ### English
6
+
7
+ - **Fix: Residual Windows console flash from agy's own auto-updater (Fixes #49).**
8
+ - Root cause confirmed on agy 1.4.2: `--bg-updater` is spawned *inside* agy, and its `agy --version` grandchild allocates a fresh visible console. The parent's `windowsHide` and `AGY_CLI_DISABLE_AUTO_UPDATE=1` therefore apply too late — the window is already on screen (this invalidates the #23 assumption).
9
+ - New `src/host/auto-updater.ts` pre-empts the check instead of the child: agy's 15-minute fast path (`auto_updater.go:281 Last check was less than 15 minutes ago, skipping update (fast path)`) only stats `<agy home>/last_check.timestamp`, so the plugin refreshes that mtime immediately before every spawn. The `--bg-updater` chain is then never created.
10
+ - Covers every spawn path: turns, boot `--version`/`models` probes, model-picker `listModels` refresh, login probes and auxiliary oneshot calls. Verified end-to-end against agy 1.4.2: the run logs `skipping update (fast path)` and spawns no child.
11
+ - Isolated accounts are respected — the timestamp is resolved through the same `ANTIGRAVITY_APP_DATA_DIR` / `GEMINI_CLI_HOME` / `HOME` / `USERPROFILE` chain the plugin spawns with, so pooled homes are never mixed and the real profile is only touched for the system account.
12
+ - New config `suppressAgyAutoUpdate` (env `DSH_AGY_SUPPRESS_AUTOUPDATE`), default `true` on Windows and `false` elsewhere; `false` restores agy's own auto-update behaviour. Pre-emption is best-effort and never fails a run.
13
+ - `/agy doctor` now reports the auto-updater suppression state, and the FAQ documents both this fix and the read-only `update.lock` workaround for older versions.
14
+
15
+ ### 中文
16
+
17
+ - **修复:agy 自身自动更新链导致的 Windows 残留闪窗(修复 #49)。**
18
+ - 在 agy 1.4.2 上实锤根因:`--bg-updater` 是 **agy 内部** spawn 的,它再拉起的 `agy --version` 孙进程会自行分配可见控制台,因此父进程的 `windowsHide` 与 `AGY_CLI_DISABLE_AUTO_UPDATE=1` 都来不及生效(#23 的假设在此版本不成立)。
19
+ - 新增 `src/host/auto-updater.ts`,改从「阻止检查」下手:agy 的 15 分钟 fast path(`auto_updater.go:281 Last check was less than 15 minutes ago, skipping update (fast path)`)只 stat `<agy home>/last_check.timestamp`,插件在每次 spawn 前刷新该文件 mtime,`--bg-updater` 链便完全不产生。
20
+ - 覆盖全部 spawn 路径:对话轮次、启动 `--version` / `models` 探测、模型选择器的 `listModels` 刷新、登录探测与 oneshot 辅助调用。已用真实 agy 1.4.2 端到端验证:日志为 `skipping update (fast path)`,无任何子进程。
21
+ - 隔离账号同样生效——时间戳按插件 spawn 时使用的 `ANTIGRAVITY_APP_DATA_DIR` / `GEMINI_CLI_HOME` / `HOME` / `USERPROFILE` 链路解析,号池目录互不串扰,只有系统主账号才会碰到真实 profile。
22
+ - 新增配置 `suppressAgyAutoUpdate`(环境变量 `DSH_AGY_SUPPRESS_AUTOUPDATE`),Windows 默认 `true`、其他平台默认 `false`;设为 `false` 即恢复 agy 原本的自动更新行为。拦截为 best-effort,失败绝不影响对话。
23
+ - `/agy doctor` 增加自动更新拦截状态行;FAQ 同时补充本修复说明与旧版本可用的只读 `update.lock` workaround。
24
+
3
25
  ## 0.4.65 (2026-10-19)
4
26
 
5
27
  ### English
package/README.md CHANGED
@@ -151,6 +151,7 @@ dsh plugin --profile web add dsh-agy-link
151
151
  | `timeoutMs` | `DSH_AGY_TIMEOUT_MS` | `600000` | 单轮活跃看门狗超时(毫秒) |
152
152
  | `longToolIdleMinutes` | `DSH_AGY_LONG_TOOL_IDLE_MINUTES` | `240` | 存在未完成工具步骤(ACTIVE)时的空闲预算(分钟);`0` = 不抬高预算,卡死的工具按 `timeoutMs` 快速失败 |
153
153
  | `workspaceRoot` | `DSH_AGY_WORKSPACE_ROOT` | 会话 cwd | agy 工作区根目录(默认跟随当前会话工作区) |
154
+ | `suppressAgyAutoUpdate` | `DSH_AGY_SUPPRESS_AUTOUPDATE` | Windows `true`,其他平台 `false` | 每次 spawn 前刷新 agy 的更新检查时间戳,阻断 `--bg-updater` 子进程链(Windows 闪窗根因)。关闭后 agy 恢复自动更新检查 |
154
155
 
155
156
  ---
156
157
 
@@ -175,6 +176,16 @@ dsh plugin --profile web add dsh-agy-link
175
176
  3. 点击右下角 **保存 (Save)**。
176
177
  4. **完全退出并重启 DSH**(使新启动的主进程应用更新后的控制台委托注册表),黑框闪烁即可彻底消除。
177
178
 
179
+ ### agy 自己的自动更新子进程也会闪窗(0.4.66 修复)
180
+ 除了上面那种控制台委托导致的闪窗,`agy` **自己**还会在距上次更新检查满 15 分钟后派生一条 `--bg-updater` → `agy --version` 的子进程链,**这条链由 agy 内部创建,会自行分配可见控制台**,父进程的 `windowsHide` 和 `AGY_CLI_DISABLE_AUTO_UPDATE=1` 都来不及生效(这就是 Issue #49 实测确认的结论)。
181
+
182
+ 0.4.66 起的处理方式:每次 spawn agy 之前,插件把 agy 更新检查的 fast-path 时间戳(`<agy home>/last_check.timestamp`)刷新为当前时间。agy 的检查逻辑是「距上次检查 < 15 分钟就直接跳过且不派生子进程」,于是这条可见窗口链根本不会被创建——对话、冷启动探测、模型选择器刷新、登录探测全部覆盖。
183
+
184
+ - **代价**:插件所使用的那个 agy home 不再自动检查更新;手动 `agy update` 完全不受影响。
185
+ - **开关**:`suppressAgyAutoUpdate`(环境变量 `DSH_AGY_SUPPRESS_AUTOUPDATE`)。Windows 上默认开启,其他平台默认关闭;设为 `false` 即回到 agy 原本的自动更新行为。
186
+ - **旧版本用户的手动 workaround**:把 `%USERPROFILE%\.gemini\antigravity-cli\updater\update.lock` 设为只读(`attrib +R ...`),agy 拿不到更新锁就会跳过检查。代价是手动 `agy update` 会报 `update already in progress`,需要先 `attrib -R`。
187
+
188
+
178
189
  ---
179
190
 
180
191
  ## 🙏 参考与致谢
@@ -318,6 +329,7 @@ dsh plugin --profile web add dsh-agy-link
318
329
  | `timeoutMs` | `DSH_AGY_TIMEOUT_MS` | `600000` | Activity watchdog timeout in milliseconds |
319
330
  | `longToolIdleMinutes` | `DSH_AGY_LONG_TOOL_IDLE_MINUTES` | `240` | Idle budget while a tool step is ACTIVE (minutes); `0` keeps the normal `timeoutMs` budget so wedged tools fail fast |
320
331
  | `workspaceRoot` | `DSH_AGY_WORKSPACE_ROOT` | session cwd | Working directory root |
332
+ | `suppressAgyAutoUpdate` | `DSH_AGY_SUPPRESS_AUTOUPDATE` | `true` on Windows, `false` elsewhere | Refreshes agy's update-check timestamp before every spawn so its `--bg-updater` child chain (the Windows console-flash root cause) never starts. `false` restores agy's own auto-update checks |
321
333
 
322
334
  ---
323
335
 
@@ -348,6 +360,29 @@ you explicitly accept unattended tool execution.
348
360
  3. Click **Save** in the bottom-right corner.
349
361
  4. **Completely exit and restart DSH** so the running host process picks up the updated console delegation setting.
350
362
 
363
+ ### agy's own auto-updater also flashes a window (fixed in 0.4.66)
364
+ On top of the console-delegation flash above, `agy` itself spawns a
365
+ `--bg-updater` → `agy --version` child chain once its last update check is more
366
+ than 15 minutes old. **That chain is created inside agy and allocates its own
367
+ visible console**, so the parent's `windowsHide` and `AGY_CLI_DISABLE_AUTO_UPDATE=1`
368
+ both apply too late — the exact conclusion of the measurements recorded in issue #49.
369
+
370
+ Since 0.4.66 the plugin refreshes agy's fast-path timestamp
371
+ (`<agy home>/last_check.timestamp`) right before every spawn. agy skips the
372
+ check entirely when it is under 15 minutes old and spawns nothing, so the
373
+ visible window chain never starts — for turns, boot probes, model-picker
374
+ refreshes and login probes alike.
375
+
376
+ - **Cost**: the agy home used by this plugin stops auto-checking for updates;
377
+ a manual `agy update` still works normally.
378
+ - **Switch**: `suppressAgyAutoUpdate` (env `DSH_AGY_SUPPRESS_AUTOUPDATE`).
379
+ On by default on Windows, off elsewhere; set `false` to restore agy's own behaviour.
380
+ - **Manual workaround on older versions**: make
381
+ `%USERPROFILE%\.gemini\antigravity-cli\updater\update.lock` read-only
382
+ (`attrib +R ...`). agy then fails to acquire the update lock and skips the
383
+ check — at the price of `agy update` reporting `update already in progress`
384
+ until you run `attrib -R`.
385
+
351
386
  ---
352
387
 
353
388
  ## ⚠️ Disclaimer
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { execFile, execFileSync, spawn } from "node:child_process";
3
3
  import path, { delimiter, dirname, extname, isAbsolute, join, relative, resolve } from "node:path";
4
- import { accessSync, chmodSync, constants, copyFileSync, createReadStream, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
4
+ import { accessSync, chmodSync, constants, copyFileSync, createReadStream, existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, unlinkSync, utimesSync, writeFileSync } from "node:fs";
5
5
  import { homedir, tmpdir } from "node:os";
6
6
  import * as dshLlm from "@deepseek-ai/dsh-llm";
7
7
  import { LlmAdapter, LlmError } from "@deepseek-ai/dsh-llm";
@@ -136,7 +136,8 @@ function defaultConfig() {
136
136
  logRetentionDays: 7,
137
137
  disableTelemetry: true,
138
138
  quotaPollIntervalMs: 9e5,
139
- proxyUrl: ""
139
+ proxyUrl: "",
140
+ suppressAgyAutoUpdate: process.platform === "win32"
140
141
  };
141
142
  }
142
143
  /**
@@ -456,7 +457,8 @@ function resolveConfig(entry, env = process.env, overrides = readOverrides()) {
456
457
  logRetentionDays: asNum(get("logRetentionDays")) ?? base.logRetentionDays,
457
458
  disableTelemetry: asBool(get("disableTelemetry")) ?? base.disableTelemetry,
458
459
  quotaPollIntervalMs: asNum(get("quotaPollIntervalMs")) ?? base.quotaPollIntervalMs,
459
- proxyUrl: asString(get("proxyUrl")) ?? base.proxyUrl
460
+ proxyUrl: asString(get("proxyUrl")) ?? base.proxyUrl,
461
+ suppressAgyAutoUpdate: asBool(get("suppressAgyAutoUpdate")) ?? base.suppressAgyAutoUpdate
460
462
  };
461
463
  if (env.DSH_AGY_ENABLED !== void 0) cfg.enabled = asBool(env.DSH_AGY_ENABLED) ?? cfg.enabled;
462
464
  if (env.DSH_AGY_BIN) cfg.agyBin = env.DSH_AGY_BIN;
@@ -515,6 +517,10 @@ function resolveConfig(entry, env = process.env, overrides = readOverrides()) {
515
517
  if (q && q >= 6e4) cfg.quotaPollIntervalMs = q;
516
518
  }
517
519
  if (env.DSH_AGY_PROXY_URL) cfg.proxyUrl = env.DSH_AGY_PROXY_URL;
520
+ if (env.DSH_AGY_SUPPRESS_AUTOUPDATE !== void 0) {
521
+ const sa = asBool(env.DSH_AGY_SUPPRESS_AUTOUPDATE);
522
+ if (sa !== void 0) cfg.suppressAgyAutoUpdate = sa;
523
+ }
518
524
  return cfg;
519
525
  }
520
526
  //#endregion
@@ -2771,6 +2777,85 @@ async function sweepDir(dir, ttlMs, now = Date.now()) {
2771
2777
  function defaultMediaDir(stateDir) {
2772
2778
  return join(stateDir, "media");
2773
2779
  }
2780
+ function nonBlank(v) {
2781
+ return (v ?? "").trim();
2782
+ }
2783
+ /**
2784
+ * agy's application data directory for a given spawn environment.
2785
+ *
2786
+ * The plugin isolates pooled accounts by rewriting HOME / USERPROFILE /
2787
+ * GEMINI_CLI_HOME / ANTIGRAVITY_APP_DATA_DIR (see `isolatedHomeEnv`), and agy
2788
+ * resolves its data dir from exactly those variables — an isolated spawn was
2789
+ * verified to write `<home>/.gemini/antigravity-cli/last_check.timestamp`.
2790
+ */
2791
+ function agyAppDataDir(env = process.env) {
2792
+ const explicit = nonBlank(env.ANTIGRAVITY_APP_DATA_DIR);
2793
+ if (explicit !== "") return explicit;
2794
+ const geminiDir = nonBlank(env.GEMINI_CLI_HOME);
2795
+ if (geminiDir !== "") return join(geminiDir, "antigravity-cli");
2796
+ let home = nonBlank(env.HOME);
2797
+ if (home === "") home = nonBlank(env.USERPROFILE);
2798
+ if (home === "") try {
2799
+ home = homedir();
2800
+ } catch {
2801
+ home = "";
2802
+ }
2803
+ if (home === "") return null;
2804
+ return join(home, ".gemini", "antigravity-cli");
2805
+ }
2806
+ /**
2807
+ * Candidate `last_check.timestamp` locations for one spawn environment.
2808
+ *
2809
+ * The issue reporter observed `<appData>/updater/last_check.timestamp` on
2810
+ * Windows while macOS uses `<appData>/last_check.timestamp`. Refreshing both is
2811
+ * cheap and keeps the fix independent of agy's per-platform path choice.
2812
+ */
2813
+ function agyUpdateCheckPaths(env = process.env) {
2814
+ const appData = agyAppDataDir(env);
2815
+ if (appData === null) return [];
2816
+ return [join(appData, "last_check.timestamp"), join(appData, "updater", "last_check.timestamp")];
2817
+ }
2818
+ /**
2819
+ * Refresh agy's update-check timestamp so the next spawn takes the fast path.
2820
+ * Best-effort: a read-only or missing profile must never fail a run.
2821
+ */
2822
+ function preemptAgyAutoUpdate(env = process.env, now = Date.now()) {
2823
+ const result = {
2824
+ touched: [],
2825
+ failures: []
2826
+ };
2827
+ const seconds = Math.floor(now / 1e3);
2828
+ for (const path of agyUpdateCheckPaths(env)) try {
2829
+ mkdirSync(dirname(path), { recursive: true });
2830
+ if (!existsSync(path)) writeFileSync(path, "");
2831
+ utimesSync(path, seconds, seconds);
2832
+ result.touched.push(path);
2833
+ } catch (err) {
2834
+ result.failures.push({
2835
+ path,
2836
+ error: err instanceof Error ? err.message : String(err)
2837
+ });
2838
+ }
2839
+ return result;
2840
+ }
2841
+ /** Age (ms) of the most recent recorded update check, or null when none exists. */
2842
+ function agyUpdateCheckAgeMs(env = process.env, now = Date.now()) {
2843
+ let freshest = null;
2844
+ for (const path of agyUpdateCheckPaths(env)) try {
2845
+ const age = now - statSync(path).mtimeMs;
2846
+ if (freshest === null || age < freshest) freshest = age;
2847
+ } catch {}
2848
+ return freshest;
2849
+ }
2850
+ /** One-line `/agy doctor` summary of the auto-update suppression state. */
2851
+ function describeAgyAutoUpdate(env = process.env, now = Date.now()) {
2852
+ if (agyUpdateCheckPaths(env).length === 0) return "unknown — no agy home directory in the spawn env";
2853
+ const age = agyUpdateCheckAgeMs(env, now);
2854
+ if (age === null) return "armed — no agy update check recorded yet; the next spawn pre-empts it";
2855
+ const minutes = Math.max(0, Math.round(age / 6e4));
2856
+ if (age < 9e5) return "suppressed — last check " + minutes + "m ago (agy fast path < 15m)";
2857
+ return "stale — last check " + minutes + "m ago; the next spawn pre-empts it";
2858
+ }
2774
2859
  //#endregion
2775
2860
  //#region src/host/runner.ts
2776
2861
  const IS_WIN$2 = process.platform === "win32";
@@ -3366,6 +3451,7 @@ function startAgyProcess(opts) {
3366
3451
  const viaCmd = IS_WIN$2 && isCmdShim(opts.bin);
3367
3452
  const isNode = IS_WIN$2 && /\.(mjs|js|cjs)$/i.test(opts.bin);
3368
3453
  const env = withAgyQuietEnv(opts.env ?? process.env);
3454
+ if (opts.preemptAutoUpdate !== false && !isNode) preemptAgyAutoUpdate(env);
3369
3455
  const child = viaCmd ? spawn(process.env.ComSpec ?? "cmd.exe", [
3370
3456
  "/d",
3371
3457
  "/s",
@@ -3500,13 +3586,14 @@ function startAgyProcess(opts) {
3500
3586
  };
3501
3587
  }
3502
3588
  /** Simple one-shot helper for --version / models probes. */
3503
- async function probeProcess(bin, args, timeoutMs = 3e4, signal, env) {
3589
+ async function probeProcess(bin, args, timeoutMs = 3e4, signal, env, preemptAutoUpdate) {
3504
3590
  return startAgyProcess({
3505
3591
  bin,
3506
3592
  args,
3507
3593
  timeoutMs,
3508
3594
  signal,
3509
- env
3595
+ env,
3596
+ preemptAutoUpdate
3510
3597
  }).outcome;
3511
3598
  }
3512
3599
  //#endregion
@@ -30818,6 +30905,7 @@ var AgyAdapter = class AgyAdapter extends LlmAdapter {
30818
30905
  signal: options.signal,
30819
30906
  env,
30820
30907
  stdinPayload,
30908
+ preemptAutoUpdate: cfg.suppressAgyAutoUpdate,
30821
30909
  stderrKeepalive: true,
30822
30910
  onLine: (line) => {
30823
30911
  sawAnyEvent = true;
@@ -31301,6 +31389,7 @@ async function runAgyOnce(deps, req) {
31301
31389
  timeoutMs,
31302
31390
  signal: req.signal,
31303
31391
  stdinPayload,
31392
+ preemptAutoUpdate: cfg.suppressAgyAutoUpdate,
31304
31393
  onLine: (line) => {
31305
31394
  for (const ev of parser.feed(line + "\n")) {
31306
31395
  if (ev.kind === "init" && ev.conversationId) conversationId = ev.conversationId;
@@ -31479,6 +31568,7 @@ const URL_WAIT_MS = 2e4;
31479
31568
  const CODE_SETTLE_MS = 9e4;
31480
31569
  var AuthHelper = class {
31481
31570
  bin;
31571
+ preemptAutoUpdate;
31482
31572
  state = { phase: "idle" };
31483
31573
  probe = null;
31484
31574
  capturedUrl = null;
@@ -31490,8 +31580,9 @@ var AuthHelper = class {
31490
31580
  beginSeq = 0;
31491
31581
  signedInCache = null;
31492
31582
  signedInFlight = null;
31493
- constructor(bin) {
31583
+ constructor(bin, preemptAutoUpdate = () => true) {
31494
31584
  this.bin = bin;
31585
+ this.preemptAutoUpdate = preemptAutoUpdate;
31495
31586
  }
31496
31587
  status() {
31497
31588
  return { ...this.state };
@@ -31518,7 +31609,7 @@ var AuthHelper = class {
31518
31609
  ...process.env,
31519
31610
  HOME: homeDir
31520
31611
  } : process.env;
31521
- const out = await probeProcess(bin, ["models"], 15e3, void 0, env);
31612
+ const out = await probeProcess(bin, ["models"], 15e3, void 0, env, this.preemptAutoUpdate());
31522
31613
  const tail = out.stderrTail + "\n" + out.stdout.slice(0, 2e3);
31523
31614
  if (out.code === 0 && !looksLikeAuthFailure(out.stdout)) value = true;
31524
31615
  else if (out.code !== 0 && looksLikeAuthFailure(tail)) value = false;
@@ -31559,6 +31650,11 @@ var AuthHelper = class {
31559
31650
  this.cancel();
31560
31651
  this.capturedUrl = null;
31561
31652
  if (homeDir) ensureIsolatedKeychain(homeDir);
31653
+ const env = {
31654
+ ...process.env,
31655
+ ...homeDir ? isolatedHomeEnv(homeDir) : {},
31656
+ ...proxyEnvFor(proxyUrl || detectSystemProxy())
31657
+ };
31562
31658
  const proc = startAgyProcess({
31563
31659
  bin,
31564
31660
  args: [
@@ -31572,11 +31668,8 @@ var AuthHelper = class {
31572
31668
  timeoutMs: 3e5,
31573
31669
  keepStdin: true,
31574
31670
  stderrKeepalive: true,
31575
- env: {
31576
- ...process.env,
31577
- ...homeDir ? isolatedHomeEnv(homeDir) : {},
31578
- ...proxyEnvFor(proxyUrl || detectSystemProxy())
31579
- },
31671
+ preemptAutoUpdate: this.preemptAutoUpdate(),
31672
+ env,
31580
31673
  onLine: (line) => {
31581
31674
  if (this.capturedUrl) return;
31582
31675
  const url = extractAuthUrl(line);
@@ -31795,6 +31888,7 @@ function writeDoctorReport(deps) {
31795
31888
  lines.push("- generated: " + (/* @__PURE__ */ new Date()).toISOString());
31796
31889
  lines.push("- agy binary: " + (deps.bin() ?? "NOT FOUND"));
31797
31890
  lines.push("- agy version: " + (deps.version() ?? "unknown"));
31891
+ lines.push("- agy auto-updater: " + (cfg.suppressAgyAutoUpdate ? describeAgyAutoUpdate() : "not suppressed (suppressAgyAutoUpdate=false)"));
31798
31892
  const cfgDump = {
31799
31893
  ...cfg,
31800
31894
  extraArgs: cfg.extraArgs.length
@@ -33675,11 +33769,11 @@ function apply(ctx, entryConfig = {}) {
33675
33769
  const poolData = pool.getPoolData();
33676
33770
  const primaryAcc = poolData.primaryAccountId ? pool.getAccount(poolData.primaryAccountId) : void 0;
33677
33771
  const candidateAccount = primaryAcc && primaryAcc.enabled && !primaryAcc.authRequired ? primaryAcc : pool.getAccounts().find((a) => a.enabled && !a.authRequired);
33678
- let out = await probeProcess(b, ["models"], 3e4, signal, getDiscoveryEnv(candidateAccount));
33772
+ let out = await probeProcess(b, ["models"], 3e4, signal, getDiscoveryEnv(candidateAccount), getConfig().suppressAgyAutoUpdate);
33679
33773
  if ((out.code !== 0 || out.stdout.includes("Please sign in") || /sign in|auth|not logged in/i.test(out.stderrTail)) && (!candidateAccount || !candidateAccount.dir)) {
33680
33774
  const secondary = pool.getAccounts().find((a) => a.enabled && !a.authRequired && a.dir);
33681
33775
  if (secondary) {
33682
- const secondaryOut = await probeProcess(b, ["models"], 3e4, signal, getDiscoveryEnv(secondary));
33776
+ const secondaryOut = await probeProcess(b, ["models"], 3e4, signal, getDiscoveryEnv(secondary), getConfig().suppressAgyAutoUpdate);
33683
33777
  if (secondaryOut.code === 0 && secondaryOut.stdout.trim() !== "") out = secondaryOut;
33684
33778
  }
33685
33779
  }
@@ -33689,7 +33783,7 @@ function apply(ctx, entryConfig = {}) {
33689
33783
  stderr: out.stderrTail
33690
33784
  };
33691
33785
  }, getConfig().fallbackModels, getConfig().modelsCacheTtlMs, notifyPicker);
33692
- const auth = new AuthHelper(bin);
33786
+ const auth = new AuthHelper(bin, () => getConfig().suppressAgyAutoUpdate);
33693
33787
  const poolAuth = new PoolAuthFlow(pool, quota, log);
33694
33788
  const runs = new RunRegistry();
33695
33789
  try {
@@ -33832,7 +33926,7 @@ function apply(ctx, entryConfig = {}) {
33832
33926
  return;
33833
33927
  }
33834
33928
  try {
33835
- versionCache = parseVersion((await probeProcess(currentBin, ["--version"], 1e4)).stdout);
33929
+ versionCache = parseVersion((await probeProcess(currentBin, ["--version"], 1e4, void 0, void 0, getConfig().suppressAgyAutoUpdate)).stdout);
33836
33930
  if (versionCache && compareVersions(versionCache, "1.1.8") < 0) {
33837
33931
  dormantReason = "agy " + versionCache + " is older than 1.1.8 — run: agy update";
33838
33932
  log("dormant: " + dormantReason);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-agy-link",
3
- "version": "0.4.65",
3
+ "version": "0.4.66",
4
4
  "description": "Google Antigravity (agy CLI) models for DeepSeek Harness — stream Gemini/Claude/GPT-OSS subscriptions into DSH with thinking, tool activity, token usage and in-GUI Google OAuth login.",
5
5
  "type": "module",
6
6
  "license": "MIT",