@hydra-acp/browser 0.1.13 → 0.1.15
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/README.md +16 -16
- package/dist/config.js +1 -1
- package/dist/hydra/ws.js +1 -0
- package/dist/hydra/ws.js.map +1 -1
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -1
- package/dist/ui/index.html +77 -12
- package/dist/util/paths.js +11 -2
- package/dist/util/paths.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ with a separate per-host authkey instead.
|
|
|
19
19
|
hydra WSS <----------> | |
|
|
20
20
|
/acp +-------------------+
|
|
21
21
|
|
|
|
22
|
-
~/.hydra-acp
|
|
22
|
+
~/.hydra-acp/browser/
|
|
23
23
|
authkey
|
|
24
24
|
link
|
|
25
25
|
```
|
|
@@ -97,17 +97,17 @@ The extension exposes:
|
|
|
97
97
|
|
|
98
98
|
On startup, hydra spawns hydra-acp-browser with these env vars set:
|
|
99
99
|
`HYDRA_ACP_DAEMON_URL`, `HYDRA_ACP_TOKEN`, `HYDRA_ACP_WS_URL`. The
|
|
100
|
-
first launch generates `~/.hydra-acp
|
|
101
|
-
the open URL (with `?authkey=…`) to `~/.hydra-acp
|
|
100
|
+
first launch generates `~/.hydra-acp/browser/authkey` and writes
|
|
101
|
+
the open URL (with `?authkey=…`) to `~/.hydra-acp/browser/link`.
|
|
102
102
|
Stdout/stderr land in `~/.hydra-acp/extensions/hydra-acp-browser.log`.
|
|
103
103
|
Lifecycle is managed with
|
|
104
104
|
`hydra-acp extensions start|stop|restart hydra-acp-browser` —
|
|
105
105
|
`restart` is the right call after `npm run build`. Tail the log
|
|
106
|
-
with `hydra-acp extensions
|
|
106
|
+
with `hydra-acp extensions log hydra-acp-browser -f` (the open URL
|
|
107
107
|
shows up there on first launch).
|
|
108
108
|
|
|
109
109
|
3. **Run standalone (alternative).** Set `HYDRA_TOKEN` in
|
|
110
|
-
`~/.hydra-acp
|
|
110
|
+
`~/.hydra-acp/browser.conf` (or export `HYDRA_ACP_TOKEN`), then:
|
|
111
111
|
|
|
112
112
|
```sh
|
|
113
113
|
npm start
|
|
@@ -115,21 +115,21 @@ The extension exposes:
|
|
|
115
115
|
|
|
116
116
|
4. **Open the browser** to the URL printed on stderr. The first request
|
|
117
117
|
sets a cookie; subsequent requests are authenticated by the cookie
|
|
118
|
-
alone. The URL is also at `~/.hydra-acp
|
|
118
|
+
alone. The URL is also at `~/.hydra-acp/browser/link` for convenience.
|
|
119
119
|
|
|
120
120
|
## HTTPS
|
|
121
121
|
|
|
122
122
|
Optional on `127.0.0.1`, **required** for any non-loopback bind (the server
|
|
123
123
|
refuses otherwise — same rule as the hydra daemon). The simplest setup
|
|
124
|
-
is a self-signed cert in `~/.hydra-acp
|
|
124
|
+
is a self-signed cert in `~/.hydra-acp/browser/tls/`.
|
|
125
125
|
|
|
126
126
|
1. **Generate cert + key.** ECDSA P-256, 5-year validity, with a SAN
|
|
127
127
|
covering loopback. Add any extra hostnames you'll hit it from
|
|
128
128
|
(Tailscale name, LAN IP, etc.) to the SAN inline:
|
|
129
129
|
|
|
130
130
|
```sh
|
|
131
|
-
mkdir -p ~/.hydra-acp
|
|
132
|
-
cd ~/.hydra-acp
|
|
131
|
+
mkdir -p ~/.hydra-acp/browser/tls && chmod 700 ~/.hydra-acp/browser/tls
|
|
132
|
+
cd ~/.hydra-acp/browser/tls
|
|
133
133
|
|
|
134
134
|
SAN='subjectAltName=DNS:localhost,DNS:'"$(hostname)"',IP:127.0.0.1,IP:::1'
|
|
135
135
|
# ^ add ,DNS:my.tailnet.ts.net or ,IP:100.64.x.y if needed.
|
|
@@ -154,11 +154,11 @@ is a self-signed cert in `~/.hydra-acp-browser/tls/`.
|
|
|
154
154
|
Skipping `-addext "subjectAltName=…"` will make every browser reject
|
|
155
155
|
the cert with `NET::ERR_CERT_COMMON_NAME_INVALID`.
|
|
156
156
|
|
|
157
|
-
2. **Wire into config.** Append to `~/.hydra-acp
|
|
157
|
+
2. **Wire into config.** Append to `~/.hydra-acp/browser.conf`:
|
|
158
158
|
|
|
159
159
|
```sh
|
|
160
|
-
BROWSER_TLS_CERT=~/.hydra-acp
|
|
161
|
-
BROWSER_TLS_KEY=~/.hydra-acp
|
|
160
|
+
BROWSER_TLS_CERT=~/.hydra-acp/browser/tls/cert.pem
|
|
161
|
+
BROWSER_TLS_KEY=~/.hydra-acp/browser/tls/key.pem
|
|
162
162
|
```
|
|
163
163
|
|
|
164
164
|
To expose beyond loopback, also set:
|
|
@@ -178,7 +178,7 @@ is a self-signed cert in `~/.hydra-acp-browser/tls/`.
|
|
|
178
178
|
4. **Trust the cert.** Self-signed certs trip browser warnings.
|
|
179
179
|
- **Click-through:** open the URL, accept the warning. Per-site only.
|
|
180
180
|
- **Linux Chrome/Chromium:**
|
|
181
|
-
`certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n hydra-acp-browser -i ~/.hydra-acp
|
|
181
|
+
`certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n hydra-acp-browser -i ~/.hydra-acp/browser/tls/cert.pem`
|
|
182
182
|
- **macOS:** double-click `cert.pem`, add to System keychain, set
|
|
183
183
|
"Always Trust" in Get Info.
|
|
184
184
|
- **iOS:** AirDrop/email `cert.pem` to the device, install profile
|
|
@@ -197,7 +197,7 @@ HTTPS won't be sent over plain HTTP. Run
|
|
|
197
197
|
|
|
198
198
|
## Configuration keys
|
|
199
199
|
|
|
200
|
-
`~/.hydra-acp
|
|
200
|
+
`~/.hydra-acp/browser.conf` (KEY=VALUE). All keys are optional unless noted.
|
|
201
201
|
|
|
202
202
|
| Key | Default | Notes |
|
|
203
203
|
|------------------------------|----------------------------------------|-------|
|
|
@@ -205,8 +205,8 @@ HTTPS won't be sent over plain HTTP. Run
|
|
|
205
205
|
| `BROWSER_PORT` | `9099` | Listen port. |
|
|
206
206
|
| `BROWSER_TLS_CERT` | (none) | If set with `BROWSER_TLS_KEY`, listen on HTTPS. |
|
|
207
207
|
| `BROWSER_TLS_KEY` | (none) | Path to TLS key. |
|
|
208
|
-
| `BROWSER_AUTHKEY_FILE` | `~/.hydra-acp
|
|
209
|
-
| `BROWSER_LINK_FILE` | `~/.hydra-acp
|
|
208
|
+
| `BROWSER_AUTHKEY_FILE` | `~/.hydra-acp/browser/authkey` | Where the browser-side authkey lives. |
|
|
209
|
+
| `BROWSER_LINK_FILE` | `~/.hydra-acp/browser/link` | URL written for convenience. |
|
|
210
210
|
| `BROWSER_ALLOWED_HOSTS` | empty | Comma-sep extra Host values for DNS-rebind allowlist (e.g. Tailscale name). |
|
|
211
211
|
| `BROWSER_FILE_MAX_BYTES` | `262144` | Upper bound for `/api/files/read`. |
|
|
212
212
|
| `HYDRA_DAEMON_URL` | from env / `http://127.0.0.1:8765` | `HYDRA_ACP_DAEMON_URL` env wins. |
|
package/dist/config.js
CHANGED
|
@@ -72,7 +72,7 @@ export function loadConfig(path = paths.configFile()) {
|
|
|
72
72
|
`http://127.0.0.1:${DEFAULT_DAEMON_PORT}`;
|
|
73
73
|
const hydraToken = process.env.HYDRA_ACP_TOKEN ?? map.get("HYDRA_TOKEN") ?? "";
|
|
74
74
|
if (!hydraToken) {
|
|
75
|
-
throw new Error("Missing HYDRA_ACP_TOKEN env var (or HYDRA_TOKEN config key). When run as a hydra extension, hydra injects this automatically; otherwise set it in ~/.hydra-acp
|
|
75
|
+
throw new Error("Missing HYDRA_ACP_TOKEN env var (or HYDRA_TOKEN config key). When run as a hydra extension, hydra injects this automatically; otherwise set it in ~/.hydra-acp/browser.conf.");
|
|
76
76
|
}
|
|
77
77
|
const hydraWsUrl = process.env.HYDRA_ACP_WS_URL ??
|
|
78
78
|
map.get("HYDRA_WS_URL") ??
|
package/dist/hydra/ws.js
CHANGED
|
@@ -176,6 +176,7 @@ export async function runInitialize(conn, opts = {}) {
|
|
|
176
176
|
fs: { readTextFile: false, writeTextFile: false },
|
|
177
177
|
terminal: false,
|
|
178
178
|
},
|
|
179
|
+
clientInfo: { name: "hydra-acp-browser", version: pkg.version },
|
|
179
180
|
});
|
|
180
181
|
}
|
|
181
182
|
//# sourceMappingURL=ws.js.map
|
package/dist/hydra/ws.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/hydra/ws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC9C,CAAC;AAEzB,oEAAoE;AACpE,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AA6BtC,MAAM,UAAU,SAAS,CAAC,CAAiB;IACzC,OAAO,QAAQ,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAiB;IAC9C,OAAO,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAiB;IAC1C,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACvC,CAAC;AAyBD,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,8EAA8E;AAC9E,4EAA4E;AAC5E,MAAM,OAAO,kBAAmB,SAAQ,YAA4B;IAOrC;IANrB,EAAE,CAAwB;IAC1B,MAAM,GAAG,CAAC,CAAC;IACX,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC/C,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,IAAqB;QAChD,KAAK,EAAE,CAAC;QADmB,SAAI,GAAJ,IAAI,CAAiB;IAElD,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAC;IACrD,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO,CAAC;IAChD,CAAC;IAED,KAAK;QACH,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,mBAAmB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtE,IAAI,EAAa,CAAC;QAClB,IAAI,CAAC;YACH,EAAE,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAY,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;YAClC,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;gBAClD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,gBAAiB,GAAa,CAAC,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACrB,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YAC9B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,CAAC;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAc,MAAc,EAAE,MAAgB;QACzD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,GAAG,GAAmB;YAC1B,OAAO,EAAE,KAAK;YACd,EAAE;YACF,MAAM;YACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACnB,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAChB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACf,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACjE,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,MAAW,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBACD,MAAM;aACP,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,MAAc,EAAE,MAAgB;QACrC,MAAM,GAAG,GAAwB;YAC/B,OAAO,EAAE,KAAK;YACd,MAAM;YACN,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,EAAa,EAAE,MAAe;QAClC,MAAM,GAAG,GAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,EAAa,EAAE,IAAY,EAAE,OAAe;QACrD,MAAM,GAAG,GAAoB;YAC3B,OAAO,EAAE,KAAK;YACd,EAAE;YACF,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SACzB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,0EAA0E;IAC1E,4EAA4E;IAC5E,OAAO,CAAC,KAAqB;QAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,GAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,GAAG,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAEO,SAAS,CAAC,CAAiB;QACjC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,EAAE,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACf,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;CACF;AAOD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAwB,EACxB,OAAyB,EAAE;IAE3B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;QACtC,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,oBAAoB;QAC7D,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI;YAC7C,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE;YACjD,QAAQ,EAAE,KAAK;SAChB;
|
|
1
|
+
{"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/hydra/ws.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { registerFileRoutes } from "./server/routes-files.js";
|
|
|
10
10
|
import { registerRootRoutes } from "./server/routes-root.js";
|
|
11
11
|
import { registerConfigRoutes } from "./server/routes-config.js";
|
|
12
12
|
import { attachWsBridge } from "./server/ws-bridge.js";
|
|
13
|
+
import { UpstreamConnection, runInitialize } from "./hydra/ws.js";
|
|
13
14
|
import { logger, setDebug } from "./util/log.js";
|
|
14
15
|
const log = logger("main");
|
|
15
16
|
function ensureLoopbackOrTls(host, hasTls) {
|
|
@@ -42,6 +43,10 @@ async function main(argv) {
|
|
|
42
43
|
registerConfigRoutes(app, ctx);
|
|
43
44
|
await app.listen({ host: config.browserHost, port: config.browserPort });
|
|
44
45
|
attachWsBridge(app.server, ctx);
|
|
46
|
+
// Register this process's version with the daemon using its own token so
|
|
47
|
+
// `hydra extension list` can show the version column. Fire-and-forget —
|
|
48
|
+
// a failure here is not fatal.
|
|
49
|
+
void registerVersion(config.hydraWsUrl, config.hydraToken);
|
|
45
50
|
const scheme = config.tls ? "https" : "http";
|
|
46
51
|
const url = `${scheme}://${displayHost(config.browserHost)}:${config.browserPort}/`;
|
|
47
52
|
writeLinkFile(config.linkFile, url);
|
|
@@ -62,6 +67,30 @@ async function main(argv) {
|
|
|
62
67
|
process.on("SIGINT", () => void shutdown("SIGINT"));
|
|
63
68
|
process.on("SIGTERM", () => void shutdown("SIGTERM"));
|
|
64
69
|
}
|
|
70
|
+
// Open a short-lived WS connection using the extension's own process token
|
|
71
|
+
// to call initialize and let the daemon record our version. This is separate
|
|
72
|
+
// from the per-session bridges that use user session tokens.
|
|
73
|
+
async function registerVersion(wsUrl, token) {
|
|
74
|
+
const conn = new UpstreamConnection({ daemonWsUrl: wsUrl, token });
|
|
75
|
+
await new Promise((resolve) => {
|
|
76
|
+
conn.once("open", () => resolve());
|
|
77
|
+
conn.once("error", () => resolve());
|
|
78
|
+
conn.once("close", () => resolve());
|
|
79
|
+
conn.start();
|
|
80
|
+
});
|
|
81
|
+
if (!conn.isConnected) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
await runInitialize(conn);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
void 0;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
conn.stop();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
65
94
|
function displayHost(host) {
|
|
66
95
|
if (host === "0.0.0.0") {
|
|
67
96
|
return "127.0.0.1";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/index.html
CHANGED
|
@@ -10793,6 +10793,9 @@ pre code { background: transparent; padding: 0; }
|
|
|
10793
10793
|
messageId
|
|
10794
10794
|
};
|
|
10795
10795
|
state.current.queueByMessageId.set(messageId, entry);
|
|
10796
|
+
if (position === 0) {
|
|
10797
|
+
state.current.currentHeadMessageId = messageId;
|
|
10798
|
+
}
|
|
10796
10799
|
state.current.log.push({
|
|
10797
10800
|
kind: "stream",
|
|
10798
10801
|
role: "user",
|
|
@@ -11399,6 +11402,7 @@ pre code { background: transparent; padding: 0; }
|
|
|
11399
11402
|
if (frame.method === "bridge/ready") {
|
|
11400
11403
|
state.current.ready = true;
|
|
11401
11404
|
state.banner = null;
|
|
11405
|
+
state.current.reconnectAttempt = 0;
|
|
11402
11406
|
const params = frame.params ?? {};
|
|
11403
11407
|
if (typeof params.clientId === "string") {
|
|
11404
11408
|
state.current.ownClientId = params.clientId;
|
|
@@ -11482,6 +11486,8 @@ pre code { background: transparent; padding: 0; }
|
|
|
11482
11486
|
}
|
|
11483
11487
|
|
|
11484
11488
|
// src/ui/routing.ts
|
|
11489
|
+
var RECONNECT_DELAYS_MS = [1e3, 2e3, 4e3, 8e3, 16e3, 3e4];
|
|
11490
|
+
var RECONNECT_BANNER_ESCALATE_AT = 5;
|
|
11485
11491
|
function buildSessionHash(sessionId, load) {
|
|
11486
11492
|
const id = encodeURIComponent(sessionId);
|
|
11487
11493
|
return load ? `#/session/${id}?load=true` : `#/session/${id}`;
|
|
@@ -11566,16 +11572,21 @@ pre code { background: transparent; padding: 0; }
|
|
|
11566
11572
|
idleListeners: [],
|
|
11567
11573
|
readyListeners: [],
|
|
11568
11574
|
currentPlanEntry: null,
|
|
11569
|
-
daemonSupportsAmend: false
|
|
11575
|
+
daemonSupportsAmend: false,
|
|
11576
|
+
loadOnConnect: load,
|
|
11577
|
+
reconnectAttempt: 0
|
|
11570
11578
|
};
|
|
11571
11579
|
state.current = initial;
|
|
11572
11580
|
setState({ view: "chat" });
|
|
11581
|
+
connectChatSocket(initial);
|
|
11582
|
+
}
|
|
11583
|
+
function connectChatSocket(chat) {
|
|
11573
11584
|
const url = new URL("/ws", location.href);
|
|
11574
11585
|
url.protocol = location.protocol === "https:" ? "wss:" : "ws:";
|
|
11575
|
-
url.searchParams.set("session", sessionId);
|
|
11576
|
-
if (
|
|
11586
|
+
url.searchParams.set("session", chat.sessionId);
|
|
11587
|
+
if (chat.loadOnConnect) url.searchParams.set("load", "true");
|
|
11577
11588
|
const ws = new WebSocket(url.toString());
|
|
11578
|
-
|
|
11589
|
+
chat.ws = ws;
|
|
11579
11590
|
ws.addEventListener("open", () => {
|
|
11580
11591
|
});
|
|
11581
11592
|
ws.addEventListener("message", (ev) => {
|
|
@@ -11588,25 +11599,79 @@ pre code { background: transparent; padding: 0; }
|
|
|
11588
11599
|
handleFrame(parsed);
|
|
11589
11600
|
});
|
|
11590
11601
|
ws.addEventListener("close", () => {
|
|
11591
|
-
if (state.current
|
|
11592
|
-
|
|
11593
|
-
cancelAllQueued(state.current);
|
|
11594
|
-
setState({
|
|
11595
|
-
banner: { kind: "warn", text: "Disconnected from session." }
|
|
11596
|
-
});
|
|
11602
|
+
if (!state.current || state.current.ws !== ws) {
|
|
11603
|
+
return;
|
|
11597
11604
|
}
|
|
11605
|
+
scheduleReconnect(state.current);
|
|
11598
11606
|
});
|
|
11599
11607
|
ws.addEventListener("error", () => {
|
|
11600
|
-
setState({ banner: { kind: "bad", text: "Connection error." } });
|
|
11601
11608
|
});
|
|
11602
11609
|
}
|
|
11610
|
+
function scheduleReconnect(chat) {
|
|
11611
|
+
chat.ready = false;
|
|
11612
|
+
cancelAllQueued(chat);
|
|
11613
|
+
const attempt = chat.reconnectAttempt ?? 0;
|
|
11614
|
+
const delay = RECONNECT_DELAYS_MS[Math.min(attempt, RECONNECT_DELAYS_MS.length - 1)];
|
|
11615
|
+
const escalate = attempt >= RECONNECT_BANNER_ESCALATE_AT;
|
|
11616
|
+
setState({
|
|
11617
|
+
banner: escalate ? { kind: "bad", text: "Still disconnected \u2014 retrying\u2026" } : { kind: "warn", text: "Reconnecting\u2026" }
|
|
11618
|
+
});
|
|
11619
|
+
chat.reconnectTimer = setTimeout(() => {
|
|
11620
|
+
if (!state.current || state.current !== chat) {
|
|
11621
|
+
return;
|
|
11622
|
+
}
|
|
11623
|
+
chat.reconnectTimer = void 0;
|
|
11624
|
+
chat.reconnectAttempt = attempt + 1;
|
|
11625
|
+
resetChatStateForReconnect(chat);
|
|
11626
|
+
render();
|
|
11627
|
+
connectChatSocket(chat);
|
|
11628
|
+
}, delay);
|
|
11629
|
+
}
|
|
11630
|
+
function resetChatStateForReconnect(chat) {
|
|
11631
|
+
chat.ws = null;
|
|
11632
|
+
chat.ready = false;
|
|
11633
|
+
chat.log = [];
|
|
11634
|
+
chat.toolCalls = /* @__PURE__ */ new Map();
|
|
11635
|
+
chat.pendingPermissions = /* @__PURE__ */ new Map();
|
|
11636
|
+
chat.pendingRequestById = /* @__PURE__ */ new Map();
|
|
11637
|
+
chat.responseHandlers = /* @__PURE__ */ new Map();
|
|
11638
|
+
chat.spinner = null;
|
|
11639
|
+
chat.plan = null;
|
|
11640
|
+
chat.mode = null;
|
|
11641
|
+
chat.model = null;
|
|
11642
|
+
chat.modes = [];
|
|
11643
|
+
chat.models = [];
|
|
11644
|
+
chat.contextUsed = null;
|
|
11645
|
+
chat.contextSize = null;
|
|
11646
|
+
chat.cost = null;
|
|
11647
|
+
chat.busy = false;
|
|
11648
|
+
chat.recentOwnPrompts = [];
|
|
11649
|
+
chat.promptQueue = [];
|
|
11650
|
+
chat.queueByMessageId = /* @__PURE__ */ new Map();
|
|
11651
|
+
chat.ownPromptIds = /* @__PURE__ */ new Set();
|
|
11652
|
+
chat.inTurn = false;
|
|
11653
|
+
chat.idleListeners = [];
|
|
11654
|
+
chat.readyListeners = [];
|
|
11655
|
+
chat.currentPlanEntry = null;
|
|
11656
|
+
chat.daemonSupportsAmend = false;
|
|
11657
|
+
chat.ownClientId = void 0;
|
|
11658
|
+
chat.currentHeadMessageId = void 0;
|
|
11659
|
+
chat.nextId = void 0;
|
|
11660
|
+
}
|
|
11603
11661
|
function closeChat() {
|
|
11604
11662
|
setLocationHash("");
|
|
11605
11663
|
closeChatSocket();
|
|
11606
11664
|
setState({ view: "list", current: null });
|
|
11607
11665
|
}
|
|
11608
11666
|
function closeChatSocket() {
|
|
11609
|
-
if (state.current
|
|
11667
|
+
if (!state.current) {
|
|
11668
|
+
return;
|
|
11669
|
+
}
|
|
11670
|
+
if (state.current.reconnectTimer) {
|
|
11671
|
+
clearTimeout(state.current.reconnectTimer);
|
|
11672
|
+
state.current.reconnectTimer = void 0;
|
|
11673
|
+
}
|
|
11674
|
+
if (state.current.ws) {
|
|
11610
11675
|
try {
|
|
11611
11676
|
state.current.ws.close();
|
|
11612
11677
|
} catch {
|
package/dist/util/paths.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
1
2
|
import { homedir } from "node:os";
|
|
2
3
|
import { resolve } from "node:path";
|
|
3
|
-
const HOME_DIR =
|
|
4
|
+
const HOME_DIR = resolve(homedir(), ".hydra-acp", "browser");
|
|
5
|
+
const PRIMARY_CONF = resolve(homedir(), ".hydra-acp", "browser.conf");
|
|
6
|
+
const LEGACY_CONF = resolve(homedir(), ".hydra-acp-browser.conf");
|
|
4
7
|
export function expandHome(p) {
|
|
5
8
|
if (p.startsWith("~/")) {
|
|
6
9
|
return resolve(homedir(), p.slice(2));
|
|
@@ -15,7 +18,13 @@ export const paths = {
|
|
|
15
18
|
return `${HOME_DIR}/link`;
|
|
16
19
|
},
|
|
17
20
|
configFile() {
|
|
18
|
-
|
|
21
|
+
if (existsSync(PRIMARY_CONF)) {
|
|
22
|
+
return PRIMARY_CONF;
|
|
23
|
+
}
|
|
24
|
+
if (existsSync(LEGACY_CONF)) {
|
|
25
|
+
return LEGACY_CONF;
|
|
26
|
+
}
|
|
27
|
+
return PRIMARY_CONF;
|
|
19
28
|
},
|
|
20
29
|
};
|
|
21
30
|
//# sourceMappingURL=paths.js.map
|
package/dist/util/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,QAAQ,GAAG,GAAG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;AACtE,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,yBAAyB,CAAC,CAAC;AAElE,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,IAAI;QACF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,QAAQ;QACN,OAAO,GAAG,QAAQ,OAAO,CAAC;IAC5B,CAAC;IACD,UAAU;QACR,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;CACF,CAAC"}
|