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 +22 -0
- package/README.md +35 -0
- package/dist/index.js +110 -16
- package/package.json +1 -1
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
|
-
|
|
31576
|
-
|
|
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.
|
|
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",
|