dsh-agy-link 0.4.66 → 0.4.70

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.
@@ -21,6 +21,19 @@ Deliberate v1 boundaries and upstream-behavior notes.
21
21
  persists a rotated access token and restores the primary. Only identity
22
22
  SWITCHES serialize — a switcher registers its claim BEFORE queueing, and
23
23
  new same-identity joins are refused while a different identity waits.
24
+ - **The slot is held only until agy has READ it (v0.4.68).** Measured on agy
25
+ 1.4.3 with a live 14-minute run: print mode resolves its credential once at
26
+ startup (`printmode.go:403 "not authenticated, trying silent auth"` →
27
+ `:405 "silent auth succeeded"` at +3.2s) and performs zero further
28
+ token/auth work for the rest of the run. The adapter therefore arms
29
+ `armSlotHandoff` before the spawn and releases the lease on the child's
30
+ FIRST output line (45s ceiling for a slow startup) instead of holding the
31
+ machine-wide slot for the whole run. Different accounts now overlap: the
32
+ 2026-10-22 design parked two sessions for 15 minutes behind another
33
+ project's 14-minute run; the exclusive window is now a few seconds.
34
+ Residual exposure (unchanged in kind, now diagnosable): a mid-run 401 that
35
+ forces a re-auth would read whatever identity is installed at that moment —
36
+ the hand-off logs when it fires so that case is visible instead of silent.
24
37
  - `SlotUnavailableError` aborts a run instead of letting it silently spend
25
38
  the wrong account when the primary cannot be verified.
26
39
  - Remaining boundary: the mutex is **per process**, so two DSH hosts (web +
@@ -34,15 +47,37 @@ injection (each account's HOME carries its own credential, no global slot, no
34
47
  mutex, identical on macOS/Linux/Windows). It is NOT available in the current
35
48
  agy build — measured, not assumed:
36
49
 
37
- - **The per-HOME token file is a BACKUP, not the source.** A fresh isolated
38
- HOME containing a deliberately bogus
50
+ - **The per-HOME token file is a FALLBACK, not the source (re-measured
51
+ 2026-10-23).** With an entry in the keyring the file is ignored: a fresh
52
+ isolated HOME containing a deliberately bogus
39
53
  `.gemini/antigravity-cli/antigravity-oauth-token` still authenticated from the
40
54
  machine keyring and completed a prompt (exit 0, `OK`), and the bogus file was
41
- left untouched. With the keyring present, writing per-account token files
42
- does not isolate identities. (`fileTokenStorage` exists but is only a
43
- fallback when keyring save/load times out or is unavailable.)
55
+ left untouched.
56
+ - **But with the keyring entry ABSENT, agy DOES read the per-HOME file.**
57
+ Probe: delete `gemini:antigravity`, isolate a HOME whose token file holds
58
+ `ya29.BOGUS_FROM_HOME_FILE`, run a prompt → `Eligibility check failed:
59
+ UNAUTHENTICATED (code 401)`. The bogus file was the only credential in play,
60
+ so the load path really did come from the file.
61
+ - That is *not* enough for a lock-free design, because the keyring is
62
+ keyring-first on the SAVE side too (`Failed to save token to keyring,
63
+ falling back to file` — the file is only written when the keyring write
64
+ fails). Any successful run therefore repopulates the single global entry,
65
+ and the next spawn on a different account would inherit it. (Inferred from
66
+ the binary's strings; not yet reproduced with a live token save.)
67
+ - Net: per-account credential isolation is read-path only. The machine-wide
68
+ entry still needs an owner, so identity SWITCHES stay serialized — but only
69
+ until the child has read the credential (see above), not for the whole run.
44
70
  - **No credential CLI flag**: `agy --help` exposes no `--api-key` /
45
71
  `--credential*` / `--token*` option.
72
+ - **`JETSKI_OAUTH_TOKEN` exists in the binary but is IGNORED (re-measured
73
+ 2026-10-22).** `agy.exe` contains the string pair
74
+ `JETSKI_OAUTH_TOKEN` + `Using OAuth token from environment variable`, so it
75
+ looked like the per-process injection route. Probing it directly: a brand-new
76
+ isolated HOME with `JETSKI_OAUTH_TOKEN=bogus-token-should-fail` still
77
+ completed a prompt (`exit 0`, `PROBE_OK`) — the variable is not consulted on
78
+ this build (1.4.3), and with no per-HOME token file either, the credential
79
+ could only have come from the machine keyring. The string belongs to another
80
+ auth product in the same binary.
46
81
  - **Documented env routes are different auth products**: `AGY_ADC_AUTH`
47
82
  (Application Default Credentials / Agent Platform), and
48
83
  `GEMINI_API_KEY` + `"modelProvider": "gemini"` in `settings.json` (the Gemini
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-agy-link",
3
- "version": "0.4.66",
3
+ "version": "0.4.70",
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",
@@ -97,6 +97,7 @@
97
97
  "build": "tsdown",
98
98
  "check": "tsc --noEmit",
99
99
  "test": "node --experimental-transform-types --test --test-concurrency=1 \"test/**/*.test.ts\"",
100
+ "test:fast": "node scripts/fast-test.mjs",
100
101
  "prepare": "npm run build",
101
102
  "prepack": "npm run build"
102
103
  },