dsh-agy-link 0.2.0 → 0.2.2
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 +20 -1
- package/README.md +59 -9
- package/dist/index.js +77 -11
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.2 (2026-08-19)
|
|
4
|
+
|
|
5
|
+
- README: dedicated Prerequisites section (DSH, Node >= 24, the agy CLI with Google's official install guide link, first-run login, subscription note), a "how it works" intro paragraph, and an honest "what it cannot do" list in both languages - onboarding now covers first-time users.
|
|
6
|
+
## 0.2.1 (2026-08-19)
|
|
7
|
+
|
|
8
|
+
- Cross-platform hardening (Linux / macOS / Windows):
|
|
9
|
+
- binary discovery is platform-aware: agy / agy.exe / .cmd / .bat across
|
|
10
|
+
PATH, ~/.local/bin, /usr/local/bin, /opt/homebrew/bin,
|
|
11
|
+
%LOCALAPPDATA%\Programs, and the npm shim dir; a real executable is
|
|
12
|
+
always preferred over a cmd shim
|
|
13
|
+
- Windows .cmd/.bat shims spawn through cmd.exe with cross-spawn-style
|
|
14
|
+
argument quoting (unit-tested)
|
|
15
|
+
- tree-kill uses taskkill /T /F on Windows (Unix process groups do not
|
|
16
|
+
exist there); detached sessions are POSIX-only so no console window
|
|
17
|
+
flashes on Windows
|
|
18
|
+
- CRLF stdout is normalized (trailing \r stripped per line)
|
|
19
|
+
- the MCP bridge script path resolves via fileURLToPath (URL.pathname
|
|
20
|
+
would yield /C:/... on Windows and break the spawn)
|
|
21
|
+
- 5 new cross-platform tests (56 total).
|
|
22
|
+
|
|
3
23
|
## 0.2.0 (2026-08-19)
|
|
4
24
|
|
|
5
25
|
- Multimodal (path-based): DSH image attachments are staged to a local media
|
|
@@ -25,4 +45,3 @@
|
|
|
25
45
|
- README restructured into a single bilingual page: Chinese first, then
|
|
26
46
|
English (README.zh.md removed; package files list updated).
|
|
27
47
|
- Releases now publish to npm automatically (NPM_TOKEN secret configured).
|
|
28
|
-
|
package/README.md
CHANGED
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
`agy` CLI 驱动,完整支持对话输出、思考(thinking)、工具活动与 token
|
|
24
24
|
用量,全部走你的 Antigravity 订阅。
|
|
25
25
|
|
|
26
|
+
**它是怎么工作的**:在 `/model` 选择器里挑一个 Antigravity 模型,之后每一轮对话,插件都会在你的工作区启动一个短生命周期的官方 `agy` 进程(`agy -p --output-format stream-json`),解析它输出的 NDJSON 事件流,把文本、思考、工具活动逐块映射回 DSH。多轮对话通过把 DSH 会话绑定到 agy 原生会话(`--conversation`)实现——agy 自己保存历史,每轮只发最新消息。**插件只启动官方未修改的 agy 二进制**:不逆向它的数据库、不解码 protobuf、不碰你的 OAuth token。
|
|
27
|
+
|
|
26
28
|
## ✨ 你能得到什么
|
|
27
29
|
|
|
28
30
|
| 能力 | 说明 |
|
|
@@ -39,18 +41,34 @@
|
|
|
39
41
|
| 🌉 **MCP 反向桥(v0.2 实验)** | `mcpBridge: true` 开启后 agy 可直接调 DSH 侧工具(回环 + token 守卫端点 + 零依赖 stdio MCP 服务器,`.mcp.json` 合并写入/禁用还原) |
|
|
40
42
|
| 😴 **休眠安全** | 没装 agy?没登录?插件照常加载并告诉你怎么修 |
|
|
41
43
|
|
|
44
|
+
## 📋 前置要求
|
|
45
|
+
|
|
46
|
+
装插件**之前**,先把这三样备齐(缺一样插件也能装,但会休眠并提示你补什么):
|
|
47
|
+
|
|
48
|
+
| 前置 | 怎么装 / 怎么验证 |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| **1. DeepSeek Harness(DSH)** | 你正在用的就是;`dsh --version` 可验证 |
|
|
51
|
+
| **2. Node.js ≥ 24** | DSH 本身就要求 Node 24+,通常已满足;`node --version` 验证 |
|
|
52
|
+
| **3. Google Antigravity 的 `agy` CLI** | 按 [Google 官方安装指南](https://antigravity.google/docs/cli/install)装(Linux / macOS / Windows 都有),然后**在终端跑一次 `agy`**,按提示完成 Google 登录。`agy --version` 能出版本号、`agy models` 能列模型就算就绪 |
|
|
53
|
+
|
|
54
|
+
> **什么是 agy?** Google Antigravity 的官方命令行智能体(类似 Claude Code / Gemini CLI)。本插件不替代它,而是驱动它——所以你需要一份有效的 **Antigravity 订阅**(免费额度也行)。
|
|
55
|
+
>
|
|
56
|
+
> 没登录也能先装:插件自带的 `/agy auth` 会给你授权 URL + 二维码,在 GUI 里完成登录。
|
|
57
|
+
|
|
42
58
|
## 🚀 快速开始
|
|
43
59
|
|
|
44
60
|
```bash
|
|
45
|
-
#
|
|
61
|
+
# 0. 确认前置要求满足(见上一节):agy --version 有输出
|
|
62
|
+
|
|
63
|
+
# 1. 安装插件(npm 官方包,预构建产物,无需构建许可):
|
|
46
64
|
dsh plugin --profile web add dsh-agy-link
|
|
47
65
|
# 升级:
|
|
48
66
|
# dsh plugin --profile web update dsh-agy-link --latest
|
|
49
67
|
|
|
50
68
|
# 2. 重启 DSH Web GUI,输入框执行:
|
|
51
|
-
# /agy status ←
|
|
69
|
+
# /agy status ← 应显示 agy 版本号;没装好会告诉你缺什么
|
|
52
70
|
|
|
53
|
-
# 3.
|
|
71
|
+
# 3. 登录(一次性;终端里已经跑过 agy 登录过的可跳过):
|
|
54
72
|
# /agy auth ← 打开授权 URL,批准并复制授权码
|
|
55
73
|
# /agy auth-code <授权码> ← 或直接用侧栏面板的二维码 + 粘贴框
|
|
56
74
|
|
|
@@ -59,6 +77,8 @@ dsh plugin --profile web add dsh-agy-link
|
|
|
59
77
|
|
|
60
78
|
> 插件绝不读取/复制/移动 `~/.gemini/antigravity-cli/antigravity-oauth-token`;登录完全通过官方 CLI 自己的流程完成。
|
|
61
79
|
|
|
80
|
+
> 🖥 **跨平台**:Linux / macOS / Windows 均受支持——bin 探测按平台查找 `agy`/`agy.exe`(PATH、`~/.local/bin`、`/usr/local/bin`、`/opt/homebrew/bin`、`%LOCALAPPDATA%\Programs`,npm `.cmd` shim 自动经 cmd.exe 安全引号包裹启动);中断/超时杀树在 Windows 走 `taskkill /T /F`;CRLF 输出统一剥离;媒体目录与 MCP 桥路径全部 `fileURLToPath`/`join` 构造。
|
|
81
|
+
|
|
62
82
|
## ⚙️ 配置
|
|
63
83
|
|
|
64
84
|
配置在 `agy-link` 插件条目里(`/plugin` 或 profile patch 层编辑),环境变量优先:
|
|
@@ -87,9 +107,14 @@ DSH 侧的工具与权限不受影响——这里只约束 agy 子进程在自
|
|
|
87
107
|
|
|
88
108
|
一次 DSH 模型调用 = 一个短生命周期 `agy -p --output-format stream-json` 进程。NDJSON 事件流被解析、归一化并映射为 DSH StreamChunk:思考 → reasoning 块,文本 → text 块,工具活动 → 注记 reasoning 块,结果信封 → usage + finish。会话 id 优先取自流本身,conversations 目录快照对比兜底。**不逆向数据库、不解码 protobuf、不碰 token 文件**——只启动官方未修改的 agy 二进制。
|
|
89
109
|
|
|
90
|
-
## 📋
|
|
110
|
+
## 📋 它做不到什么(诚实清单)
|
|
111
|
+
|
|
112
|
+
- **图片不是真多模态**——agy 的 print 模式没有图片入参,插件走的是“落盘 + 路径引用”方案(v0.2 起):图片写进本地媒体目录,prompt 里给绝对路径,agy 用它自己的看图工具查看。能用,但和原生多模态不同。
|
|
113
|
+
- **agy 的文件编辑不经过 DSH 审批**——它直接落盘,DSH 的 inline diff 审查不介入(想要只读就 `/agy mode plan`)。
|
|
114
|
+
- **DSH 工具默认不暴露给 agy**——agy 跑自己的封闭工具循环;v0.2 的 MCP 反向桥(实验性,`mcpBridge: true`)可以打通,但有递归/扇出成本。
|
|
115
|
+
- **结构化输出只在 `agy_ask` 里**——`schema` 参数走 `--json-schema`;DSH 原生工具调用生成还没接(上游没有对应字段)。
|
|
91
116
|
|
|
92
|
-
|
|
117
|
+
完整清单见 [docs/KNOWN-GAPS.md](docs/KNOWN-GAPS.md)。
|
|
93
118
|
|
|
94
119
|
## ⚠️ 免责与风险提示
|
|
95
120
|
|
|
@@ -109,6 +134,8 @@ MIT
|
|
|
109
134
|
|
|
110
135
|
Bring **Google Antigravity models into DeepSeek Harness (DSH)** — chat, thinking, tool activity, and token usage from your Antigravity subscription, driven by the official `agy` CLI.
|
|
111
136
|
|
|
137
|
+
**How it works**: pick an Antigravity model in the `/model` picker; for every turn the plugin spawns a short-lived, official `agy` process in your workspace (`agy -p --output-format stream-json`), parses its NDJSON event stream, and maps text, thinking, and tool activity back into DSH chunk by chunk. Multi-turn rides a binding between the DSH session and a native agy conversation (`--conversation`) — agy keeps its own history, so only the latest message is sent each turn. **The plugin only ever spawns the official, unmodified agy binary**: no database reverse-engineering, no protobuf decoding, no touching your OAuth token.
|
|
138
|
+
|
|
112
139
|
## ✨ What you get
|
|
113
140
|
|
|
114
141
|
| Capability | Description |
|
|
@@ -125,18 +152,34 @@ Bring **Google Antigravity models into DeepSeek Harness (DSH)** — chat, thinki
|
|
|
125
152
|
| 📎 **File inlining + structured output (v0.2)** | `agy_ask` gains `readPaths` (inline text files) and `schema` (enforced via `--json-schema`) |
|
|
126
153
|
| 🌉 **MCP reverse bridge (v0.2, experimental)** | with `mcpBridge: true`, agy calls DSH-side tools directly (loopback token-guarded endpoint + zero-dep stdio MCP server merged into `.mcp.json`, restored on disable) |
|
|
127
154
|
|
|
155
|
+
## 📋 Prerequisites
|
|
156
|
+
|
|
157
|
+
Before installing, have these three ready (the plugin installs fine without them, but stays dormant and tells you what to fix):
|
|
158
|
+
|
|
159
|
+
| Requirement | How to install / verify |
|
|
160
|
+
| --- | --- |
|
|
161
|
+
| **1. DeepSeek Harness (DSH)** | You are using it; `dsh --version` verifies |
|
|
162
|
+
| **2. Node.js ≥ 24** | DSH already requires Node 24+; `node --version` verifies |
|
|
163
|
+
| **3. Google Antigravity's `agy` CLI** | Follow [Google's official install guide](https://antigravity.google/docs/cli/install) (Linux / macOS / Windows), then **run `agy` once in a terminal** and complete the Google login. `agy --version` printing a version and `agy models` listing models means you are ready |
|
|
164
|
+
|
|
165
|
+
> **What is agy?** Google Antigravity's official command-line agent (think Claude Code / Gemini CLI). This plugin does not replace it — it drives it, so you need an active **Antigravity subscription** (the free tier works).
|
|
166
|
+
>
|
|
167
|
+
> Not logged in yet? Install anyway: the built-in `/agy auth` gives you a consent URL + QR code to finish login inside the GUI.
|
|
168
|
+
|
|
128
169
|
## 🚀 Quick start
|
|
129
170
|
|
|
130
171
|
```bash
|
|
172
|
+
# 0. Confirm the prerequisites (previous section): agy --version prints something
|
|
173
|
+
|
|
131
174
|
# 1. Install (npm, prebuilt — no build approval needed):
|
|
132
175
|
dsh plugin --profile web add dsh-agy-link
|
|
133
176
|
# Upgrade:
|
|
134
177
|
# dsh plugin --profile web update dsh-agy-link --latest
|
|
135
178
|
|
|
136
179
|
# 2. Restart the DSH Web GUI, then in the composer:
|
|
137
|
-
# /agy status <-
|
|
180
|
+
# /agy status <- should show the agy version; tells you what is missing otherwise
|
|
138
181
|
|
|
139
|
-
# 3. Login (one time):
|
|
182
|
+
# 3. Login (one time; skip if you already ran agy in a terminal):
|
|
140
183
|
# /agy auth <- open the consent URL, approve, copy the code
|
|
141
184
|
# /agy auth-code <code> <- or use the sidebar panel (QR + paste box)
|
|
142
185
|
|
|
@@ -145,6 +188,8 @@ dsh plugin --profile web add dsh-agy-link
|
|
|
145
188
|
|
|
146
189
|
> The plugin never reads, copies, or moves `~/.gemini/antigravity-cli/antigravity-oauth-token`; login is driven entirely through the official CLI's own flow.
|
|
147
190
|
|
|
191
|
+
> 🖥 **Cross-platform**: Linux / macOS / Windows — platform-aware binary discovery (`agy` / `agy.exe` across PATH, `~/.local/bin`, `/usr/local/bin`, `/opt/homebrew/bin`, `%LOCALAPPDATA%\Programs`; npm `.cmd` shims spawn through cmd.exe with safe quoting), tree-kill via `taskkill /T /F` on Windows, CRLF output normalized, media and bridge paths built with `fileURLToPath`/`join`.
|
|
192
|
+
|
|
148
193
|
## ⚙️ Configuration
|
|
149
194
|
|
|
150
195
|
Config lives in the `agy-link` plugin entry (edit via `/plugin` or the profile patch layer). Environment variables override the file:
|
|
@@ -173,9 +218,14 @@ DSH-side tools and permissions are unaffected — this only governs what the spa
|
|
|
173
218
|
|
|
174
219
|
One DSH model call = one short-lived `agy -p --output-format stream-json` process. The NDJSON event stream is parsed, normalized, and mapped to DSH StreamChunks: thinking → reasoning blocks, text → text blocks, tool activity → annotated reasoning blocks, and the result envelope → usage + finish. Conversation ids come from the stream itself, with a conversations-directory snapshot diff as fallback. **No reverse-engineered database scraping, no protobuf decoding, no token-file access** — only the official unmodified agy binary is spawned.
|
|
175
220
|
|
|
176
|
-
## 📋
|
|
221
|
+
## 📋 What it cannot do (honest list)
|
|
222
|
+
|
|
223
|
+
- **Images are not true multimodal** — agy print mode has no image input flag; since v0.2 the bridge stages images to a local media directory and references them by absolute path, with agy viewing them via its own tools. Workable, but not native multimodality.
|
|
224
|
+
- **agy's file edits bypass DSH review** — they land directly on disk; DSH's inline diff review does not engage (`/agy mode plan` for read-only).
|
|
225
|
+
- **DSH tools are not exposed to agy by default** — agy runs its own closed tool loop; the v0.2 MCP reverse bridge (experimental, `mcpBridge: true`) can bridge that, at a recursion/fan-out cost.
|
|
226
|
+
- **Structured output only inside `agy_ask`** — the `schema` parameter rides `--json-schema`; DSH-native tool-call generation is not wired (no upstream field to map onto).
|
|
177
227
|
|
|
178
|
-
|
|
228
|
+
Full list in [docs/KNOWN-GAPS.md](docs/KNOWN-GAPS.md).
|
|
179
229
|
|
|
180
230
|
## ⚠️ Disclaimer & risk note
|
|
181
231
|
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { execFileSync, spawn } from "node:child_process";
|
|
|
7
7
|
import { defineTool } from "@deepseek-ai/dsh-tools";
|
|
8
8
|
import { createServer } from "node:http";
|
|
9
9
|
import { randomBytes } from "node:crypto";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
10
11
|
//#region src/common/types.ts
|
|
11
12
|
const PROVIDER_ID = "antigravity";
|
|
12
13
|
const PLUGIN_ID = "agy-link";
|
|
@@ -1015,20 +1016,51 @@ async function sweepDir(dir, ttlMs, now = Date.now()) {
|
|
|
1015
1016
|
function defaultMediaDir(stateDir) {
|
|
1016
1017
|
return join(stateDir, "media");
|
|
1017
1018
|
}
|
|
1019
|
+
//#endregion
|
|
1020
|
+
//#region src/host/runner.ts
|
|
1021
|
+
const IS_WIN = process.platform === "win32";
|
|
1022
|
+
/** Executable candidates for one PATH entry, per-platform. Exported for tests. */
|
|
1023
|
+
function binCandidates(dir, platform = process.platform) {
|
|
1024
|
+
return (platform === "win32" ? [
|
|
1025
|
+
".exe",
|
|
1026
|
+
".cmd",
|
|
1027
|
+
".bat"
|
|
1028
|
+
] : [""]).map((e) => join(dir, "agy" + e));
|
|
1029
|
+
}
|
|
1030
|
+
/** True when the resolved bin is a Windows cmd shim (needs shell wrapping). */
|
|
1031
|
+
function isCmdShim(bin) {
|
|
1032
|
+
return /\.(cmd|bat)$/i.test(bin);
|
|
1033
|
+
}
|
|
1034
|
+
/** cmd.exe argument quoting (cross-spawn rules). Exported for tests. */
|
|
1035
|
+
function windowsQuote(arg) {
|
|
1036
|
+
if (/[ \t\n\v"]/.test(arg) === false) return arg;
|
|
1037
|
+
let escaped = arg.replace(/(\\+)\"/g, "$1$1\\\"").replace(/(\\+)$/, "$1$1");
|
|
1038
|
+
escaped = "\"" + escaped.replace(/"/g, "\\\"") + "\"";
|
|
1039
|
+
return escaped;
|
|
1040
|
+
}
|
|
1018
1041
|
function resolveAgyBin(cfg) {
|
|
1019
1042
|
const candidates = [];
|
|
1020
1043
|
if (cfg.agyBin !== "") candidates.push(cfg.agyBin);
|
|
1021
1044
|
const pathEnv = process.env.PATH ?? "";
|
|
1022
|
-
for (const dir of pathEnv.split(delimiter)) if (dir !== "") candidates.push(
|
|
1023
|
-
|
|
1024
|
-
|
|
1045
|
+
for (const dir of pathEnv.split(delimiter)) if (dir !== "") candidates.push(...binCandidates(dir));
|
|
1046
|
+
if (IS_WIN) {
|
|
1047
|
+
const local = process.env.LOCALAPPDATA ?? "";
|
|
1048
|
+
if (local !== "") candidates.push(join(local, "Programs", "agy", "agy.exe"));
|
|
1049
|
+
candidates.push(join(homedir(), ".local", "bin", "agy.exe"));
|
|
1050
|
+
candidates.push(join(homedir(), "AppData", "Roaming", "npm", "agy.cmd"));
|
|
1051
|
+
} else {
|
|
1052
|
+
candidates.push(join(homedir(), ".local", "bin", "agy"));
|
|
1053
|
+
candidates.push("/usr/local/bin/agy");
|
|
1054
|
+
candidates.push("/opt/homebrew/bin/agy");
|
|
1055
|
+
}
|
|
1056
|
+
const hits = [];
|
|
1025
1057
|
for (const c of candidates) try {
|
|
1026
|
-
accessSync(c, constants.
|
|
1027
|
-
|
|
1058
|
+
accessSync(c, constants.F_OK);
|
|
1059
|
+
hits.push(c);
|
|
1028
1060
|
} catch {
|
|
1029
1061
|
continue;
|
|
1030
1062
|
}
|
|
1031
|
-
return null;
|
|
1063
|
+
return hits.find((h) => !isCmdShim(h)) ?? hits[0] ?? null;
|
|
1032
1064
|
}
|
|
1033
1065
|
function compareVersions(a, b) {
|
|
1034
1066
|
const pa = a.split(/\./).map(Number);
|
|
@@ -1045,6 +1077,24 @@ function parseVersion(out) {
|
|
|
1045
1077
|
}
|
|
1046
1078
|
function killTree(child) {
|
|
1047
1079
|
if (child.pid === void 0) return;
|
|
1080
|
+
if (IS_WIN) {
|
|
1081
|
+
try {
|
|
1082
|
+
spawn("taskkill", [
|
|
1083
|
+
"/pid",
|
|
1084
|
+
String(child.pid),
|
|
1085
|
+
"/T",
|
|
1086
|
+
"/F"
|
|
1087
|
+
], {
|
|
1088
|
+
stdio: "ignore",
|
|
1089
|
+
windowsHide: true
|
|
1090
|
+
});
|
|
1091
|
+
} catch {
|
|
1092
|
+
try {
|
|
1093
|
+
child.kill();
|
|
1094
|
+
} catch {}
|
|
1095
|
+
}
|
|
1096
|
+
return;
|
|
1097
|
+
}
|
|
1048
1098
|
try {
|
|
1049
1099
|
process.kill(-child.pid, "SIGTERM");
|
|
1050
1100
|
} catch {
|
|
@@ -1055,15 +1105,31 @@ function killTree(child) {
|
|
|
1055
1105
|
}
|
|
1056
1106
|
function startAgyProcess(opts) {
|
|
1057
1107
|
const started = Date.now();
|
|
1058
|
-
const child =
|
|
1108
|
+
const child = IS_WIN && isCmdShim(opts.bin) ? spawn(process.env.ComSpec ?? "cmd.exe", [
|
|
1109
|
+
"/d",
|
|
1110
|
+
"/s",
|
|
1111
|
+
"/c",
|
|
1112
|
+
[opts.bin, ...opts.args].map(windowsQuote).join(" ")
|
|
1113
|
+
], {
|
|
1059
1114
|
cwd: opts.cwd,
|
|
1060
1115
|
env: process.env,
|
|
1061
|
-
detached: true,
|
|
1062
1116
|
stdio: [
|
|
1063
1117
|
"pipe",
|
|
1064
1118
|
"pipe",
|
|
1065
1119
|
"pipe"
|
|
1066
|
-
]
|
|
1120
|
+
],
|
|
1121
|
+
windowsVerbatimArguments: true,
|
|
1122
|
+
windowsHide: true
|
|
1123
|
+
}) : spawn(opts.bin, opts.args, {
|
|
1124
|
+
cwd: opts.cwd,
|
|
1125
|
+
env: process.env,
|
|
1126
|
+
detached: !IS_WIN,
|
|
1127
|
+
stdio: [
|
|
1128
|
+
"pipe",
|
|
1129
|
+
"pipe",
|
|
1130
|
+
"pipe"
|
|
1131
|
+
],
|
|
1132
|
+
windowsHide: true
|
|
1067
1133
|
});
|
|
1068
1134
|
let stdout = "";
|
|
1069
1135
|
let stderr = "";
|
|
@@ -1088,7 +1154,7 @@ function startAgyProcess(opts) {
|
|
|
1088
1154
|
pending += chunk;
|
|
1089
1155
|
let nl;
|
|
1090
1156
|
while ((nl = pending.indexOf("\n")) >= 0) {
|
|
1091
|
-
const line = pending.slice(0, nl);
|
|
1157
|
+
const line = pending.slice(0, nl).replace(/\r$/, "");
|
|
1092
1158
|
pending = pending.slice(nl + 1);
|
|
1093
1159
|
opts.onLine?.(line);
|
|
1094
1160
|
}
|
|
@@ -2715,7 +2781,7 @@ function apply(ctx, entryConfig = {}) {
|
|
|
2715
2781
|
const want = cfg.mcpBridge && cfg.enabled;
|
|
2716
2782
|
if (want && bridgeState.bridge === null) (async () => {
|
|
2717
2783
|
try {
|
|
2718
|
-
const script = new URL("./bridge.mjs", import.meta.url)
|
|
2784
|
+
const script = fileURLToPath(new URL("./bridge.mjs", import.meta.url));
|
|
2719
2785
|
const toolsSvc = ctx.get("tools");
|
|
2720
2786
|
const bridge = await startMcpBridge({
|
|
2721
2787
|
bridgeScript: script,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-agy-link",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
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",
|