dsh-agy-link 0.4.59 → 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.
@@ -8,17 +8,59 @@ Deliberate v1 boundaries and upstream-behavior notes.
8
8
  slot over (issue #45)** — agy on Windows resolves its Google credential from
9
9
  ONE process-global Credential Manager slot `gemini:antigravity`
10
10
  (go-keyring); `HOME`/`USERPROFILE`/`GEMINI_CLI_HOME` move files only. Rather
11
- than pretending the pool is isolated, the plugin now owns the slot: the
12
- primary credential is kept in a durable, identity-verified store
11
+ than pretending the pool is isolated, the plugin owns the slot: the primary
12
+ credential is kept in a durable, identity-verified store
13
13
  (`agy-accounts/.primary-credential.json`), and every run acquires the slot
14
- through `acquireCredentialSlot` — a process-wide FIFO mutex that writes the
15
- target account's verified credential into the slot, then restores the
16
- primary's on release. `SlotUnavailableError` aborts a run instead of letting
17
- it silently spend the wrong account when the primary cannot be verified.
18
- Remaining boundary: the mutex is **per process**, so two DSH hosts (web +
19
- headless) running agy at the same moment can still interleave slot writes;
20
- keep `maxConcurrent` at 1 on Windows and avoid driving two hosts at once.
21
- A cleaner upstream fix would be per-HOME keyring namespacing in agy.
14
+ through `acquireCredentialSlot`.
15
+ - **Same-identity runs are parallel (v0.4.60).** The installed identity is
16
+ reference-counted: the first run on an account performs the handoff and
17
+ keeps the mutex, later runs on the same grant join as fast leases (each
18
+ verifies the slot still carries that grant), and runs already QUEUED for
19
+ the slot join too — they poll every 100ms and take a lease as soon as their
20
+ own grant is installed, so a backlog drains in parallel. The LAST holder
21
+ persists a rotated access token and restores the primary. Only identity
22
+ SWITCHES serialize — a switcher registers its claim BEFORE queueing, and
23
+ new same-identity joins are refused while a different identity waits.
24
+ - `SlotUnavailableError` aborts a run instead of letting it silently spend
25
+ the wrong account when the primary cannot be verified.
26
+ - Remaining boundary: the mutex is **per process**, so two DSH hosts (web +
27
+ headless) running agy at the same moment can still interleave slot writes;
28
+ avoid driving two hosts at once.
29
+
30
+ ## Credential injection: what agy actually supports (verified 2026-10-17)
31
+
32
+ The clean fix for the Windows boundary above would be per-process credential
33
+ injection (each account's HOME carries its own credential, no global slot, no
34
+ mutex, identical on macOS/Linux/Windows). It is NOT available in the current
35
+ agy build — measured, not assumed:
36
+
37
+ - **The per-HOME token file is a BACKUP, not the source.** A fresh isolated
38
+ HOME containing a deliberately bogus
39
+ `.gemini/antigravity-cli/antigravity-oauth-token` still authenticated from the
40
+ 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.)
44
+ - **No credential CLI flag**: `agy --help` exposes no `--api-key` /
45
+ `--credential*` / `--token*` option.
46
+ - **Documented env routes are different auth products**: `AGY_ADC_AUTH`
47
+ (Application Default Credentials / Agent Platform), and
48
+ `GEMINI_API_KEY` + `"modelProvider": "gemini"` in `settings.json` (the Gemini
49
+ API, not Antigravity subscription quota).
50
+ - `AGY_ACCOUNT` selects among *plugin/manager* accounts, not CLI sign-ins.
51
+
52
+ Therefore a true fix must come from agy itself, either of:
53
+
54
+ 1. **Namespace the keyring entry by HOME** — derive the go-keyring
55
+ service/user from the resolved home (e.g. `gemini:antigravity:<hash>`), so
56
+ an isolated HOME really is an isolated credential space. Needs a migration
57
+ path for the existing single entry.
58
+ 2. **Accept a per-process credential** — a `--credential-file` flag (or a
59
+ documented env var) that points at the account's token document, bypassing
60
+ the keyring entirely.
61
+
62
+ Either one retires `credential-slot.ts` and the dispatch queue; until then the
63
+ reference-counted slot is the strongest isolation the plugin can provide.
22
64
 
23
65
  ## Not forwarded to agy
24
66
 
Binary file
Binary file
Binary file
package/icon.svg ADDED
@@ -0,0 +1,54 @@
1
+ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <defs>
3
+ <!-- Core Orb Gradient -->
4
+ <linearGradient id="agy-orb-gradient" x1="12" y1="11" x2="25" y2="25" gradientUnits="userSpaceOnUse">
5
+ <stop offset="0%" stop-color="#38BDF8"/>
6
+ <stop offset="45%" stop-color="#6366F1"/>
7
+ <stop offset="85%" stop-color="#9333EA"/>
8
+ <stop offset="100%" stop-color="#C026D3"/>
9
+ </linearGradient>
10
+
11
+ <!-- Front Orbit Ring Gradient (Glowing Vibrant Gradient) -->
12
+ <linearGradient id="agy-ring-front" x1="6" y1="24" x2="31" y2="12" gradientUnits="userSpaceOnUse">
13
+ <stop offset="0%" stop-color="#00D2FF"/>
14
+ <stop offset="40%" stop-color="#38BDF8"/>
15
+ <stop offset="70%" stop-color="#818CF8"/>
16
+ <stop offset="100%" stop-color="#F43F5E"/>
17
+ </linearGradient>
18
+
19
+ <!-- Back Orbit Ring Gradient (Subtle Occluded Depth) -->
20
+ <linearGradient id="agy-ring-back" x1="7" y1="12" x2="29" y2="24" gradientUnits="userSpaceOnUse">
21
+ <stop offset="0%" stop-color="#38BDF8" stop-opacity="0.35"/>
22
+ <stop offset="100%" stop-color="#A855F7" stop-opacity="0.35"/>
23
+ </linearGradient>
24
+
25
+ <!-- Specular Highlight Curve -->
26
+ <linearGradient id="agy-highlight-grad" x1="14" y1="12" x2="19" y2="18" gradientUnits="userSpaceOnUse">
27
+ <stop offset="0%" stop-color="#FFFFFF" stop-opacity="0.6"/>
28
+ <stop offset="100%" stop-color="#FFFFFF" stop-opacity="0.05"/>
29
+ </linearGradient>
30
+ </defs>
31
+
32
+ <!-- Back Segment of Orbit Ring (passes behind central sphere) -->
33
+ <path d="M 6.8 14.2 C 8.2 9.6 17.8 7.2 26.2 10.8 C 28.0 11.6 29.3 12.6 30.2 13.8"
34
+ stroke="url(#agy-ring-back)" stroke-width="2.4" stroke-linecap="round"/>
35
+
36
+ <!-- Central Antigravity Sphere -->
37
+ <circle cx="18" cy="18" r="7.5" fill="url(#agy-orb-gradient)"/>
38
+
39
+ <!-- Elegant Crescent Specular Highlight (adds glass/liquid depth) -->
40
+ <path d="M 13.2 15.2 A 5.5 5.5 0 0 1 21.0 13.0 A 6.2 6.2 0 0 0 14.0 18.0 Z"
41
+ fill="url(#agy-highlight-grad)"/>
42
+
43
+ <!-- Front Segment of Orbit Ring (sweeps in front with vibrant glow) -->
44
+ <path d="M 30.2 13.8 C 31.4 18.2 21.8 26.2 12.8 24.2 C 9.4 23.4 7.4 21.8 6.6 19.6"
45
+ stroke="url(#agy-ring-front)" stroke-width="2.6" stroke-linecap="round"/>
46
+
47
+ <!-- Left Satellite Node (DSH Cyan Anchor) -->
48
+ <circle cx="8.2" cy="18.2" r="2.2" fill="#00D2FF"/>
49
+ <circle cx="8.2" cy="18.2" r="1.0" fill="#FFFFFF"/>
50
+
51
+ <!-- Right Satellite Node (Antigravity Magenta Particle) -->
52
+ <circle cx="28.4" cy="20.4" r="1.8" fill="#F43F5E"/>
53
+ <circle cx="28.4" cy="20.4" r="0.8" fill="#FFFFFF"/>
54
+ </svg>
package/locale/en.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Antigravity Link",
4
+ "description": "Stream Gemini / Claude / GPT-OSS subscriptions from Google Antigravity (agy CLI) into DSH — multi-account pool, live quota dashboards, thinking, tool activity and in-GUI Google OAuth."
5
+ }
6
+ }
package/locale/es.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Antigravity Link",
4
+ "description": "Conecta las suscripciones Gemini / Claude / GPT-OSS de Google Antigravity (agy CLI) en DSH: pool multiejecución, panel de cuotas en vivo, razonamiento, actividad de herramientas y OAuth de Google en la GUI."
5
+ }
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Antigravity Link",
4
+ "description": "Traz as assinaturas Gemini / Claude / GPT-OSS do Google Antigravity (agy CLI) para o DSH: pool multi-conta, painel de cotas ao vivo, raciocínio, atividade de ferramentas e OAuth do Google na GUI."
5
+ }
6
+ }
package/locale/zh.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "meta": {
3
+ "title": "Antigravity 桥接",
4
+ "description": "把 Google Antigravity(agy CLI)的 Gemini / Claude / GPT-OSS 订阅接入 DSH:多账号池、实时额度大盘、思考流、工具活动与 GUI 内 Google 登录。"
5
+ }
6
+ }
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "dsh-agy-link",
3
- "version": "0.4.59",
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",
7
+ "icon": "./assets/icon.svg",
7
8
  "keywords": [
8
9
  "dsh-plugin",
9
10
  "dsh",
@@ -21,7 +22,10 @@
21
22
  },
22
23
  "./client": "./dist/client.js",
23
24
  "./cordis.patch.yml": "./cordis.patch.yml",
24
- "./package.json": "./package.json"
25
+ "./package.json": "./package.json",
26
+ "./locale/*.json": "./locale/*.json",
27
+ "./icon": "./assets/icon.svg",
28
+ "./icon.svg": "./icon.svg"
25
29
  },
26
30
  "dependencies": {
27
31
  "qrcode": "^1.5.4"
@@ -81,6 +85,8 @@
81
85
  "files": [
82
86
  "dist",
83
87
  "assets",
88
+ "locale",
89
+ "icon.svg",
84
90
  "cordis.patch.yml",
85
91
  "README.md",
86
92
  "LICENSE",