@hydra-acp/browser 0.1.26 → 0.1.28
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 +49 -33
- package/dist/hydra/client.js +24 -1
- package/dist/hydra/client.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/server/push-store.js +97 -0
- package/dist/server/push-store.js.map +1 -0
- package/dist/server/routes-push.js +33 -0
- package/dist/server/routes-push.js.map +1 -0
- package/dist/server/routes-root.js +22 -9
- package/dist/server/routes-root.js.map +1 -1
- package/dist/server/routes-sessions.js +13 -0
- package/dist/server/routes-sessions.js.map +1 -1
- package/dist/server/session-visibility.js +34 -0
- package/dist/server/session-visibility.js.map +1 -0
- package/dist/server/turn-notify-callback.js +159 -0
- package/dist/server/turn-notify-callback.js.map +1 -0
- package/dist/server/ws-bridge.js +127 -1
- package/dist/server/ws-bridge.js.map +1 -1
- package/dist/setup/conf-writer.js +86 -0
- package/dist/setup/conf-writer.js.map +1 -0
- package/dist/setup/tailscale-wizard.js +229 -0
- package/dist/setup/tailscale-wizard.js.map +1 -0
- package/dist/ui/index.html +119 -30
- package/dist/ui/sw.js +38 -11
- package/dist/util/paths.js +3 -0
- package/dist/util/paths.js.map +1 -1
- package/package.json +3 -1
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Tracks whether any currently-open browser WS connection is actively
|
|
2
|
+
// looking at a given session, so turn-notify-callback.ts can skip a
|
|
3
|
+
// push when the answer is already on screen. Kept as its own module
|
|
4
|
+
// (rather than living in ws-bridge.ts) because turn-notify-callback.ts
|
|
5
|
+
// needs to read it and ws-bridge.ts needs to write it — importing
|
|
6
|
+
// ws-bridge.ts from turn-notify-callback.ts would be circular, since
|
|
7
|
+
// ws-bridge.ts already imports registerForPush from there.
|
|
8
|
+
const visibleConnections = new Map();
|
|
9
|
+
export function setConnectionVisible(sessionId, connId, visible) {
|
|
10
|
+
const existing = visibleConnections.get(sessionId);
|
|
11
|
+
if (visible) {
|
|
12
|
+
if (existing) {
|
|
13
|
+
existing.add(connId);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
visibleConnections.set(sessionId, new Set([connId]));
|
|
17
|
+
}
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (!existing)
|
|
21
|
+
return;
|
|
22
|
+
existing.delete(connId);
|
|
23
|
+
if (existing.size === 0) {
|
|
24
|
+
visibleConnections.delete(sessionId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function clearConnection(sessionId, connId) {
|
|
28
|
+
setConnectionVisible(sessionId, connId, false);
|
|
29
|
+
}
|
|
30
|
+
export function isSessionVisible(sessionId) {
|
|
31
|
+
const set = visibleConnections.get(sessionId);
|
|
32
|
+
return !!set && set.size > 0;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=session-visibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-visibility.js","sourceRoot":"","sources":["../../src/server/session-visibility.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,oEAAoE;AACpE,uEAAuE;AACvE,kEAAkE;AAClE,qEAAqE;AACrE,2DAA2D;AAE3D,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAuB,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,MAAc,EAAE,OAAgB;IACtF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,MAAc;IAC/D,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Receives the daemon's turn-notify webhook (cli's turn-notify.ts) and
|
|
2
|
+
// turns it into a Web Push delivery. Runs its own tiny loopback-only
|
|
3
|
+
// HTTP server rather than a route on the main Fastify app: the daemon's
|
|
4
|
+
// callback fetch has to land in plain HTTP even when the main app is
|
|
5
|
+
// TLS-only for LAN/Tailscale access (self-signed certs aren't in the
|
|
6
|
+
// daemon's trust store), and since the daemon and this extension always
|
|
7
|
+
// run on the same host, a 127.0.0.1-bound listener is reachable either
|
|
8
|
+
// way without needing a cert at all — same trust boundary as the
|
|
9
|
+
// existing authenticated daemon<->extension traffic, just one hop
|
|
10
|
+
// shorter.
|
|
11
|
+
import { createServer } from "node:http";
|
|
12
|
+
import { createHmac, randomBytes, timingSafeEqual } from "node:crypto";
|
|
13
|
+
import { HydraRestClient } from "../hydra/client.js";
|
|
14
|
+
import { sendPushToEndpoint } from "./push-store.js";
|
|
15
|
+
import { isSessionVisible } from "./session-visibility.js";
|
|
16
|
+
import { logger } from "../util/log.js";
|
|
17
|
+
const log = logger("turn-notify");
|
|
18
|
+
const pending = new Map();
|
|
19
|
+
let serverPort;
|
|
20
|
+
export async function startTurnNotifyCallbackServer() {
|
|
21
|
+
const server = createServer((req, res) => {
|
|
22
|
+
if (req.method !== "POST") {
|
|
23
|
+
res.writeHead(404).end();
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const chunks = [];
|
|
27
|
+
req.on("data", (c) => chunks.push(c));
|
|
28
|
+
req.on("end", () => {
|
|
29
|
+
void handleDelivery(Buffer.concat(chunks).toString("utf8"), req.headers);
|
|
30
|
+
res.writeHead(200).end();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
await new Promise((resolve) => {
|
|
34
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
35
|
+
});
|
|
36
|
+
const addr = server.address();
|
|
37
|
+
serverPort = typeof addr === "object" && addr ? addr.port : undefined;
|
|
38
|
+
if (!serverPort) {
|
|
39
|
+
throw new Error("turn-notify callback server failed to bind");
|
|
40
|
+
}
|
|
41
|
+
return serverPort;
|
|
42
|
+
}
|
|
43
|
+
function isLoopback(url) {
|
|
44
|
+
try {
|
|
45
|
+
const host = new URL(url).hostname;
|
|
46
|
+
return host === "127.0.0.1" || host === "localhost" || host === "::1";
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Registers a one-shot callback for this messageId's turn completion.
|
|
53
|
+
// `sessionTitle` is captured now (best-effort session lookup at the
|
|
54
|
+
// caller) since the delivery payload only carries
|
|
55
|
+
// sessionId/messageId/stopReason — nothing to build a friendly
|
|
56
|
+
// notification off of on its own.
|
|
57
|
+
export async function registerForPush(config, sessionId, messageId, sessionTitle, endpoint) {
|
|
58
|
+
if (!serverPort || !isLoopback(config.hydraDaemonUrl)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const secret = randomBytes(32).toString("hex");
|
|
62
|
+
pending.set(messageId, { secret, sessionId, sessionTitle, endpoint });
|
|
63
|
+
const callbackUrl = `http://127.0.0.1:${serverPort}/turn-notify`;
|
|
64
|
+
const client = HydraRestClient.forRequest(config.hydraDaemonUrl, config.hydraToken);
|
|
65
|
+
try {
|
|
66
|
+
const result = await client.registerTurnNotify(sessionId, messageId, callbackUrl, secret);
|
|
67
|
+
log.info(`registered turn-notify session=${sessionId} messageId=${messageId} status=${result.status}`);
|
|
68
|
+
if (result.status === "already_terminal") {
|
|
69
|
+
pending.delete(messageId);
|
|
70
|
+
await deliverPush(sessionId, sessionTitle, result.stopReason, endpoint);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
pending.delete(messageId);
|
|
75
|
+
log.warn(`registerTurnNotify failed for ${sessionId}/${messageId}: ${err.message}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function handleDelivery(rawBody, headers) {
|
|
79
|
+
let payload;
|
|
80
|
+
try {
|
|
81
|
+
payload = JSON.parse(rawBody);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
log.warn("turn-notify callback: unparseable body");
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const messageId = payload.messageId;
|
|
88
|
+
if (!messageId)
|
|
89
|
+
return;
|
|
90
|
+
const entry = pending.get(messageId);
|
|
91
|
+
if (!entry) {
|
|
92
|
+
log.warn(`turn-notify callback: no pending registration for ${messageId}`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const signature = headers["x-hydra-turn-notify-signature"];
|
|
96
|
+
const provided = Array.isArray(signature) ? signature[0] : signature;
|
|
97
|
+
const expected = createHmac("sha256", entry.secret).update(rawBody).digest("hex");
|
|
98
|
+
if (!provided || !safeEqualHex(provided, expected)) {
|
|
99
|
+
log.warn(`turn-notify callback: bad signature for ${messageId}`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
pending.delete(messageId);
|
|
103
|
+
log.info(`turn-notify delivered session=${entry.sessionId} messageId=${messageId} stopReason=${payload.stopReason}`);
|
|
104
|
+
await deliverPush(entry.sessionId, entry.sessionTitle, payload.stopReason, entry.endpoint);
|
|
105
|
+
}
|
|
106
|
+
// Skips the push when a browser WS is currently open on this session
|
|
107
|
+
// with the tab visible and focused — the answer's already on screen,
|
|
108
|
+
// and the foreground notification path (notifications.ts) already
|
|
109
|
+
// covers "tab open but not looked at" on its own. Delivery otherwise
|
|
110
|
+
// targets only the device that submitted the prompt (`endpoint`), not
|
|
111
|
+
// every subscribed device — a turn started on desktop shouldn't buzz a
|
|
112
|
+
// phone that had nothing to do with it.
|
|
113
|
+
async function deliverPush(sessionId, sessionTitle, stopReason, endpoint) {
|
|
114
|
+
if (isSessionVisible(sessionId)) {
|
|
115
|
+
log.info(`session=${sessionId} currently visible — suppressing push`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (!endpoint) {
|
|
119
|
+
log.info(`session=${sessionId} originating device has no push subscription — skipping push`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
await sendPushToEndpoint(endpoint, buildPayload(sessionId, sessionTitle, stopReason));
|
|
123
|
+
}
|
|
124
|
+
// iOS/Safari auto-appends "from <site name>" under every web push
|
|
125
|
+
// notification as OS-level origin disclosure — not something the
|
|
126
|
+
// payload can suppress — so a title that's also just "Hydra" reads as
|
|
127
|
+
// redundant ("Hydra" / "from Hydra"). Use the session's own title
|
|
128
|
+
// instead, which is actually useful on a lock screen with several
|
|
129
|
+
// sessions finishing around the same time.
|
|
130
|
+
function buildPayload(sessionId, sessionTitle, stopReason) {
|
|
131
|
+
return {
|
|
132
|
+
title: sessionTitle,
|
|
133
|
+
body: describeStopReason(stopReason),
|
|
134
|
+
url: `/#/session/${encodeURIComponent(sessionId)}`,
|
|
135
|
+
tag: `hydra-acp-turn-${sessionId}`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function safeEqualHex(a, b) {
|
|
139
|
+
const bufA = Buffer.from(a, "hex");
|
|
140
|
+
const bufB = Buffer.from(b, "hex");
|
|
141
|
+
if (bufA.length !== bufB.length)
|
|
142
|
+
return false;
|
|
143
|
+
return timingSafeEqual(bufA, bufB);
|
|
144
|
+
}
|
|
145
|
+
function describeStopReason(stopReason) {
|
|
146
|
+
switch (stopReason) {
|
|
147
|
+
case "cancelled":
|
|
148
|
+
return "Cancelled.";
|
|
149
|
+
case "interrupted":
|
|
150
|
+
return "Interrupted.";
|
|
151
|
+
case "max_tokens":
|
|
152
|
+
return "Stopped: max tokens reached.";
|
|
153
|
+
case "refusal":
|
|
154
|
+
return "Stopped: refused.";
|
|
155
|
+
default:
|
|
156
|
+
return "Turn finished.";
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=turn-notify-callback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turn-notify-callback.js","sourceRoot":"","sources":["../../src/server/turn-notify-callback.ts"],"names":[],"mappings":"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"}
|
package/dist/server/ws-bridge.js
CHANGED
|
@@ -3,6 +3,10 @@ import { logger } from "../util/log.js";
|
|
|
3
3
|
import { UpstreamConnection, isNotification, isRequest, isResponse, runInitialize, } from "../hydra/ws.js";
|
|
4
4
|
import { COOKIE_NAME, parseCookies, } from "./auth.js";
|
|
5
5
|
import { checkStateChanging } from "../util/csrf.js";
|
|
6
|
+
import { HydraRestClient } from "../hydra/client.js";
|
|
7
|
+
import { hasSubscriptions } from "./push-store.js";
|
|
8
|
+
import { registerForPush } from "./turn-notify-callback.js";
|
|
9
|
+
import { clearConnection, setConnectionVisible } from "./session-visibility.js";
|
|
6
10
|
const log = logger("ws-bridge");
|
|
7
11
|
const ALLOWED_BROWSER_REQUEST_METHODS = new Set([
|
|
8
12
|
"session/prompt",
|
|
@@ -39,6 +43,12 @@ const ALLOWED_BROWSER_REQUEST_METHODS = new Set([
|
|
|
39
43
|
const ALLOWED_BROWSER_NOTIFICATION_METHODS = new Set([
|
|
40
44
|
"session/cancel",
|
|
41
45
|
]);
|
|
46
|
+
// How long to keep the daemon connection open after the browser WS
|
|
47
|
+
// closes, when a just-sent session/prompt hasn't been paired with its
|
|
48
|
+
// messageId yet (see cleanup()). prompt_received fires as soon as the
|
|
49
|
+
// daemon accepts the prompt, well before the turn itself finishes, so
|
|
50
|
+
// this only needs to outlast that brief window.
|
|
51
|
+
const OWN_PROMPT_GRACE_MS = 20_000;
|
|
42
52
|
const SHORT_CIRCUIT_AGENT_REQUEST_METHODS = new Set([
|
|
43
53
|
"fs/read_text_file",
|
|
44
54
|
"fs/write_text_file",
|
|
@@ -95,6 +105,18 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
95
105
|
daemonWsUrl: ctx.config.hydraWsUrl,
|
|
96
106
|
token: sessionToken,
|
|
97
107
|
});
|
|
108
|
+
// Identity for this connection's entry in the session-visibility
|
|
109
|
+
// registry (see bridge/visibility handling below). Deliberately NOT
|
|
110
|
+
// pre-marked visible: a reconnect that happens while the app is
|
|
111
|
+
// already backgrounded (its own retry logic, a brief network blip)
|
|
112
|
+
// opens a fresh WS without any visibility change on the client to
|
|
113
|
+
// report — no visibilitychange event fires because nothing changed —
|
|
114
|
+
// so a "connecting implies visible" default would sit there wrongly
|
|
115
|
+
// suppressing pushes for as long as that connection lives. bridge.ts's
|
|
116
|
+
// reportVisibility() sends the real state right after bridge/ready,
|
|
117
|
+
// so genuine foreground opens still get marked visible within
|
|
118
|
+
// milliseconds; this only changes the (safer) assumption in between.
|
|
119
|
+
const connId = Symbol("ws-bridge-conn");
|
|
98
120
|
// Track ids of outstanding upstream→browser requests so we can validate
|
|
99
121
|
// browser-supplied responses (and reject responses for unknown ids,
|
|
100
122
|
// which would otherwise be a path for a compromised tab to spoof
|
|
@@ -121,6 +143,44 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
121
143
|
// while armed; set to null once flushed. Mirrors cli's tui/app.ts
|
|
122
144
|
// reconnectReplayBuffer.
|
|
123
145
|
let handshakeBuffer = [];
|
|
146
|
+
// This connection's own clientId, learned from the attach response —
|
|
147
|
+
// used to recognize our own submissions on prompt_queue/added (see
|
|
148
|
+
// below), which fans out every client's prompts on the session, not
|
|
149
|
+
// just this connection's. Undefined until doHandshake completes.
|
|
150
|
+
let ownClientId;
|
|
151
|
+
// This connection's own Web Push subscription endpoint, reported by the
|
|
152
|
+
// browser over bridge/push-endpoint (mirrors bridge/visibility below).
|
|
153
|
+
// Undefined if this device has turn-end notifications off. Threaded
|
|
154
|
+
// into maybeRegisterPush so a delivered push targets only the device
|
|
155
|
+
// that submitted the prompt, not every subscribed device — see
|
|
156
|
+
// turn-notify-callback.ts.
|
|
157
|
+
let ownPushEndpoint;
|
|
158
|
+
// Count of session/prompt requests forwarded upstream that haven't
|
|
159
|
+
// been resolved by a matching prompt_queue/added yet (see
|
|
160
|
+
// maybeRegisterPush below). Used only to decide whether cleanup()
|
|
161
|
+
// needs to hold the upstream connection open a little longer.
|
|
162
|
+
let pendingOwnPrompts = 0;
|
|
163
|
+
// Web Push registration for this connection's own prompts, mirroring
|
|
164
|
+
// the foreground own-turn-end scope in notifications.ts (a
|
|
165
|
+
// peer-submitted turn finishing isn't "browser initiated"). Only
|
|
166
|
+
// fires when at least one device has subscribed — otherwise this is
|
|
167
|
+
// a no-op REST call to the daemon for every prompt, for nobody.
|
|
168
|
+
async function maybeRegisterPush(messageId) {
|
|
169
|
+
if (!(await hasSubscriptions())) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
let title = "Hydra";
|
|
173
|
+
try {
|
|
174
|
+
const info = await HydraRestClient.forRequest(ctx.config.hydraDaemonUrl, ctx.config.hydraToken).getSession(sessionId);
|
|
175
|
+
if (info.title) {
|
|
176
|
+
title = info.title;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
// Best-effort — fall back to the generic title below.
|
|
181
|
+
}
|
|
182
|
+
await registerForPush(ctx.config, sessionId, messageId, title, ownPushEndpoint);
|
|
183
|
+
}
|
|
124
184
|
upstream.on("open", () => {
|
|
125
185
|
void doHandshake().catch((err) => {
|
|
126
186
|
log.warn(`handshake failed for ${sessionId}: ${err.message}`);
|
|
@@ -129,6 +189,27 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
129
189
|
});
|
|
130
190
|
});
|
|
131
191
|
upstream.on("notification", (n) => {
|
|
192
|
+
// prompt_queue/added is the accept-time signal (fires the instant
|
|
193
|
+
// hydra enqueues the prompt) and, unlike prompt_received/turn_complete,
|
|
194
|
+
// is NOT excluded from the originating connection — PROTOCOL.md is
|
|
195
|
+
// explicit that only prompt_received/turn_complete skip the sender.
|
|
196
|
+
// An earlier version of this hooked prompt_received instead, which
|
|
197
|
+
// meant it could never fire for our own prompts at all. Match by
|
|
198
|
+
// originator.clientId (not FIFO position) since queue/added fans out
|
|
199
|
+
// every client's submissions on this same connection, not just ours.
|
|
200
|
+
if (n.method === "hydra-acp/prompt_queue/added") {
|
|
201
|
+
const params = (n.params ?? {});
|
|
202
|
+
const originatorClientId = params.originator && typeof params.originator === "object"
|
|
203
|
+
? params.originator.clientId
|
|
204
|
+
: undefined;
|
|
205
|
+
if (typeof params.messageId === "string" &&
|
|
206
|
+
ownClientId !== undefined &&
|
|
207
|
+
originatorClientId === ownClientId &&
|
|
208
|
+
pendingOwnPrompts > 0) {
|
|
209
|
+
pendingOwnPrompts -= 1;
|
|
210
|
+
void maybeRegisterPush(params.messageId);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
132
213
|
// Permission resolution during the display-delay window cancels
|
|
133
214
|
// the pending forward. The UI never saw the request so dropping
|
|
134
215
|
// the resolved notification too is correct — there's nothing for
|
|
@@ -211,6 +292,33 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
211
292
|
log.warn(`browser parse error: ${err.message}`);
|
|
212
293
|
return;
|
|
213
294
|
}
|
|
295
|
+
// Local-only signal (see notifications.ts's reportVisibility) — never
|
|
296
|
+
// forwarded upstream, doesn't go through ALLOWED_BROWSER_*_METHODS.
|
|
297
|
+
// Lets turn-notify-callback.ts skip a push when the answer is
|
|
298
|
+
// already on screen.
|
|
299
|
+
if (isNotification(parsed) && parsed.method === "bridge/visibility") {
|
|
300
|
+
const params = (parsed.params ?? {});
|
|
301
|
+
setConnectionVisible(sessionId, connId, params.visible === true);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Local-only signal (see bridge.ts's reportPushEndpoint) — never
|
|
305
|
+
// forwarded upstream. Lets maybeRegisterPush target a turn-end push
|
|
306
|
+
// at this connection's own device instead of every subscribed one.
|
|
307
|
+
if (isNotification(parsed) && parsed.method === "bridge/push-endpoint") {
|
|
308
|
+
const params = (parsed.params ?? {});
|
|
309
|
+
ownPushEndpoint = typeof params.endpoint === "string" ? params.endpoint : undefined;
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
// Application-level heartbeat (see bridge.ts's sendPing). Local-only,
|
|
313
|
+
// like bridge/visibility above — answering here, immediately, rather
|
|
314
|
+
// than round-tripping through the daemon is the whole point: it's
|
|
315
|
+
// testing whether the browser<->extension leg of the connection is
|
|
316
|
+
// actually alive, which is exactly the leg that can go quietly dead
|
|
317
|
+
// (bad wifi, cell handoff) while readyState still says otherwise.
|
|
318
|
+
if (isNotification(parsed) && parsed.method === "bridge/ping") {
|
|
319
|
+
sendBrowserFrame({ jsonrpc: "2.0", method: "bridge/pong" });
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
214
322
|
handleBrowserFrame(parsed);
|
|
215
323
|
});
|
|
216
324
|
browserWs.on("close", () => {
|
|
@@ -241,6 +349,9 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
241
349
|
const params = msg.params && typeof msg.params === "object"
|
|
242
350
|
? { ...msg.params, sessionId }
|
|
243
351
|
: { sessionId };
|
|
352
|
+
if (msg.method === "session/prompt") {
|
|
353
|
+
pendingOwnPrompts += 1;
|
|
354
|
+
}
|
|
244
355
|
upstream.sendRaw({
|
|
245
356
|
jsonrpc: "2.0",
|
|
246
357
|
id: msg.id,
|
|
@@ -355,6 +466,7 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
355
466
|
const readyParams = { sessionId };
|
|
356
467
|
if (typeof attachResp?.clientId === "string") {
|
|
357
468
|
readyParams.clientId = attachResp.clientId;
|
|
469
|
+
ownClientId = attachResp.clientId;
|
|
358
470
|
}
|
|
359
471
|
// configOptions (model/mode/agent plus whatever the agent advertises,
|
|
360
472
|
// e.g. effort) rides at the top level of the attach response, not
|
|
@@ -390,7 +502,21 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
390
502
|
}
|
|
391
503
|
}
|
|
392
504
|
function cleanup() {
|
|
393
|
-
|
|
505
|
+
clearConnection(sessionId, connId);
|
|
506
|
+
// If a session/prompt we just forwarded hasn't produced its
|
|
507
|
+
// prompt_queue/added yet, don't tear down the daemon connection
|
|
508
|
+
// immediately — backgrounding the app right after hitting send (the
|
|
509
|
+
// literal case Web Push exists for) closes the browser WS within a
|
|
510
|
+
// second or two on iOS, possibly before the notification lands.
|
|
511
|
+
// Killing upstream here would silently drop the turn-notify
|
|
512
|
+
// registration every time. Give it a short grace window instead.
|
|
513
|
+
if (pendingOwnPrompts > 0) {
|
|
514
|
+
log.info(`browser gone with ${pendingOwnPrompts} own prompt(s) unresolved for session=${sessionId} — holding upstream ${OWN_PROMPT_GRACE_MS}ms for prompt_queue/added`);
|
|
515
|
+
setTimeout(() => upstream.stop(), OWN_PROMPT_GRACE_MS);
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
upstream.stop();
|
|
519
|
+
}
|
|
394
520
|
for (const timer of pendingPermissionFrames.values()) {
|
|
395
521
|
clearTimeout(timer);
|
|
396
522
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-bridge.js","sourceRoot":"","sources":["../../src/server/ws-bridge.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ws-bridge.js","sourceRoot":"","sources":["../../src/server/ws-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { paths } from "../util/paths.js";
|
|
4
|
+
export const CONF_PATH = paths.configFile();
|
|
5
|
+
function parseLines(text) {
|
|
6
|
+
return text.split(/\r?\n/).map((raw) => {
|
|
7
|
+
const trimmed = raw.trim();
|
|
8
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
9
|
+
return { raw };
|
|
10
|
+
const eq = raw.indexOf("=");
|
|
11
|
+
if (eq === -1)
|
|
12
|
+
return { raw };
|
|
13
|
+
const key = raw.slice(0, eq).trim();
|
|
14
|
+
let value = raw.slice(eq + 1).trim();
|
|
15
|
+
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
16
|
+
(value.startsWith("'") && value.endsWith("'"))) {
|
|
17
|
+
value = value.slice(1, -1);
|
|
18
|
+
}
|
|
19
|
+
return { raw, key, value };
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function readExisting(path) {
|
|
23
|
+
if (!existsSync(path))
|
|
24
|
+
return { text: "", map: new Map() };
|
|
25
|
+
const text = readFileSync(path, "utf8");
|
|
26
|
+
const map = new Map();
|
|
27
|
+
for (const line of parseLines(text)) {
|
|
28
|
+
if (line.key !== undefined && line.value !== undefined)
|
|
29
|
+
map.set(line.key, line.value);
|
|
30
|
+
}
|
|
31
|
+
return { text, map };
|
|
32
|
+
}
|
|
33
|
+
const HEADER = `# hydra-acp-browser config — written by 'hydra-acp-browser tailscale setup'.
|
|
34
|
+
# Lock this file: chmod 600.
|
|
35
|
+
`;
|
|
36
|
+
function quoteIfNeeded(value) {
|
|
37
|
+
if (/[\s#'"]/.test(value))
|
|
38
|
+
return `"${value.replace(/"/g, '\\"')}"`;
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
export function mergeConf(existing, updates) {
|
|
42
|
+
const lines = parseLines(existing);
|
|
43
|
+
const remaining = new Map();
|
|
44
|
+
for (const [k, v] of Object.entries(updates)) {
|
|
45
|
+
if (v !== undefined)
|
|
46
|
+
remaining.set(k, v);
|
|
47
|
+
}
|
|
48
|
+
const out = [];
|
|
49
|
+
for (const line of lines) {
|
|
50
|
+
if (line.key && remaining.has(line.key)) {
|
|
51
|
+
const newVal = remaining.get(line.key);
|
|
52
|
+
out.push(`${line.key}=${quoteIfNeeded(newVal)}`);
|
|
53
|
+
remaining.delete(line.key);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
out.push(line.raw);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (!existing) {
|
|
60
|
+
out.length = 0;
|
|
61
|
+
out.push(HEADER.trimEnd());
|
|
62
|
+
out.push("");
|
|
63
|
+
}
|
|
64
|
+
while (out.length > 0 && out[out.length - 1] === "")
|
|
65
|
+
out.pop();
|
|
66
|
+
if (remaining.size > 0) {
|
|
67
|
+
if (out.length > 0)
|
|
68
|
+
out.push("");
|
|
69
|
+
for (const [k, v] of remaining)
|
|
70
|
+
out.push(`${k}=${quoteIfNeeded(v)}`);
|
|
71
|
+
}
|
|
72
|
+
return out.join("\n") + "\n";
|
|
73
|
+
}
|
|
74
|
+
export function writeConf(path, updates) {
|
|
75
|
+
const { text } = readExisting(path);
|
|
76
|
+
const merged = mergeConf(text, updates);
|
|
77
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
78
|
+
writeFileSync(path, merged, { encoding: "utf8" });
|
|
79
|
+
try {
|
|
80
|
+
chmodSync(path, 0o600);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// chmod isn't meaningful on Windows; ignore.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=conf-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conf-writer.js","sourceRoot":"","sources":["../../src/setup/conf-writer.ts"],"names":[],"mappings":"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"}
|