@hydra-acp/browser 0.1.26 → 0.1.27
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 +101 -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 +152 -0
- package/dist/server/turn-notify-callback.js.map +1 -0
- package/dist/server/ws-bridge.js +112 -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,152 @@
|
|
|
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 { sendPushToAll } 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) {
|
|
58
|
+
if (!serverPort || !isLoopback(config.hydraDaemonUrl)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const secret = randomBytes(32).toString("hex");
|
|
62
|
+
pending.set(messageId, { secret, sessionId, sessionTitle });
|
|
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);
|
|
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);
|
|
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.
|
|
110
|
+
async function deliverPush(sessionId, sessionTitle, stopReason) {
|
|
111
|
+
if (isSessionVisible(sessionId)) {
|
|
112
|
+
log.info(`session=${sessionId} currently visible — suppressing push`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
await sendPushToAll(buildPayload(sessionId, sessionTitle, stopReason));
|
|
116
|
+
}
|
|
117
|
+
// iOS/Safari auto-appends "from <site name>" under every web push
|
|
118
|
+
// notification as OS-level origin disclosure — not something the
|
|
119
|
+
// payload can suppress — so a title that's also just "Hydra" reads as
|
|
120
|
+
// redundant ("Hydra" / "from Hydra"). Use the session's own title
|
|
121
|
+
// instead, which is actually useful on a lock screen with several
|
|
122
|
+
// sessions finishing around the same time.
|
|
123
|
+
function buildPayload(sessionId, sessionTitle, stopReason) {
|
|
124
|
+
return {
|
|
125
|
+
title: sessionTitle,
|
|
126
|
+
body: describeStopReason(stopReason),
|
|
127
|
+
url: `/#/session/${encodeURIComponent(sessionId)}`,
|
|
128
|
+
tag: `hydra-acp-turn-${sessionId}`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function safeEqualHex(a, b) {
|
|
132
|
+
const bufA = Buffer.from(a, "hex");
|
|
133
|
+
const bufB = Buffer.from(b, "hex");
|
|
134
|
+
if (bufA.length !== bufB.length)
|
|
135
|
+
return false;
|
|
136
|
+
return timingSafeEqual(bufA, bufB);
|
|
137
|
+
}
|
|
138
|
+
function describeStopReason(stopReason) {
|
|
139
|
+
switch (stopReason) {
|
|
140
|
+
case "cancelled":
|
|
141
|
+
return "Cancelled.";
|
|
142
|
+
case "interrupted":
|
|
143
|
+
return "Interrupted.";
|
|
144
|
+
case "max_tokens":
|
|
145
|
+
return "Stopped: max tokens reached.";
|
|
146
|
+
case "refusal":
|
|
147
|
+
return "Stopped: refused.";
|
|
148
|
+
default:
|
|
149
|
+
return "Turn finished.";
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# 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,37 @@ 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
|
+
// Count of session/prompt requests forwarded upstream that haven't
|
|
152
|
+
// been resolved by a matching prompt_queue/added yet (see
|
|
153
|
+
// maybeRegisterPush below). Used only to decide whether cleanup()
|
|
154
|
+
// needs to hold the upstream connection open a little longer.
|
|
155
|
+
let pendingOwnPrompts = 0;
|
|
156
|
+
// Web Push registration for this connection's own prompts, mirroring
|
|
157
|
+
// the foreground own-turn-end scope in notifications.ts (a
|
|
158
|
+
// peer-submitted turn finishing isn't "browser initiated"). Only
|
|
159
|
+
// fires when at least one device has subscribed — otherwise this is
|
|
160
|
+
// a no-op REST call to the daemon for every prompt, for nobody.
|
|
161
|
+
async function maybeRegisterPush(messageId) {
|
|
162
|
+
if (!(await hasSubscriptions())) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
let title = "Hydra";
|
|
166
|
+
try {
|
|
167
|
+
const info = await HydraRestClient.forRequest(ctx.config.hydraDaemonUrl, ctx.config.hydraToken).getSession(sessionId);
|
|
168
|
+
if (info.title) {
|
|
169
|
+
title = info.title;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
// Best-effort — fall back to the generic title below.
|
|
174
|
+
}
|
|
175
|
+
await registerForPush(ctx.config, sessionId, messageId, title);
|
|
176
|
+
}
|
|
124
177
|
upstream.on("open", () => {
|
|
125
178
|
void doHandshake().catch((err) => {
|
|
126
179
|
log.warn(`handshake failed for ${sessionId}: ${err.message}`);
|
|
@@ -129,6 +182,27 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
129
182
|
});
|
|
130
183
|
});
|
|
131
184
|
upstream.on("notification", (n) => {
|
|
185
|
+
// prompt_queue/added is the accept-time signal (fires the instant
|
|
186
|
+
// hydra enqueues the prompt) and, unlike prompt_received/turn_complete,
|
|
187
|
+
// is NOT excluded from the originating connection — PROTOCOL.md is
|
|
188
|
+
// explicit that only prompt_received/turn_complete skip the sender.
|
|
189
|
+
// An earlier version of this hooked prompt_received instead, which
|
|
190
|
+
// meant it could never fire for our own prompts at all. Match by
|
|
191
|
+
// originator.clientId (not FIFO position) since queue/added fans out
|
|
192
|
+
// every client's submissions on this same connection, not just ours.
|
|
193
|
+
if (n.method === "hydra-acp/prompt_queue/added") {
|
|
194
|
+
const params = (n.params ?? {});
|
|
195
|
+
const originatorClientId = params.originator && typeof params.originator === "object"
|
|
196
|
+
? params.originator.clientId
|
|
197
|
+
: undefined;
|
|
198
|
+
if (typeof params.messageId === "string" &&
|
|
199
|
+
ownClientId !== undefined &&
|
|
200
|
+
originatorClientId === ownClientId &&
|
|
201
|
+
pendingOwnPrompts > 0) {
|
|
202
|
+
pendingOwnPrompts -= 1;
|
|
203
|
+
void maybeRegisterPush(params.messageId);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
132
206
|
// Permission resolution during the display-delay window cancels
|
|
133
207
|
// the pending forward. The UI never saw the request so dropping
|
|
134
208
|
// the resolved notification too is correct — there's nothing for
|
|
@@ -211,6 +285,25 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
211
285
|
log.warn(`browser parse error: ${err.message}`);
|
|
212
286
|
return;
|
|
213
287
|
}
|
|
288
|
+
// Local-only signal (see notifications.ts's reportVisibility) — never
|
|
289
|
+
// forwarded upstream, doesn't go through ALLOWED_BROWSER_*_METHODS.
|
|
290
|
+
// Lets turn-notify-callback.ts skip a push when the answer is
|
|
291
|
+
// already on screen.
|
|
292
|
+
if (isNotification(parsed) && parsed.method === "bridge/visibility") {
|
|
293
|
+
const params = (parsed.params ?? {});
|
|
294
|
+
setConnectionVisible(sessionId, connId, params.visible === true);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
// Application-level heartbeat (see bridge.ts's sendPing). Local-only,
|
|
298
|
+
// like bridge/visibility above — answering here, immediately, rather
|
|
299
|
+
// than round-tripping through the daemon is the whole point: it's
|
|
300
|
+
// testing whether the browser<->extension leg of the connection is
|
|
301
|
+
// actually alive, which is exactly the leg that can go quietly dead
|
|
302
|
+
// (bad wifi, cell handoff) while readyState still says otherwise.
|
|
303
|
+
if (isNotification(parsed) && parsed.method === "bridge/ping") {
|
|
304
|
+
sendBrowserFrame({ jsonrpc: "2.0", method: "bridge/pong" });
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
214
307
|
handleBrowserFrame(parsed);
|
|
215
308
|
});
|
|
216
309
|
browserWs.on("close", () => {
|
|
@@ -241,6 +334,9 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
241
334
|
const params = msg.params && typeof msg.params === "object"
|
|
242
335
|
? { ...msg.params, sessionId }
|
|
243
336
|
: { sessionId };
|
|
337
|
+
if (msg.method === "session/prompt") {
|
|
338
|
+
pendingOwnPrompts += 1;
|
|
339
|
+
}
|
|
244
340
|
upstream.sendRaw({
|
|
245
341
|
jsonrpc: "2.0",
|
|
246
342
|
id: msg.id,
|
|
@@ -355,6 +451,7 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
355
451
|
const readyParams = { sessionId };
|
|
356
452
|
if (typeof attachResp?.clientId === "string") {
|
|
357
453
|
readyParams.clientId = attachResp.clientId;
|
|
454
|
+
ownClientId = attachResp.clientId;
|
|
358
455
|
}
|
|
359
456
|
// configOptions (model/mode/agent plus whatever the agent advertises,
|
|
360
457
|
// e.g. effort) rides at the top level of the attach response, not
|
|
@@ -390,7 +487,21 @@ function handleConnection(browserWs, _req, ctx, sessionId, sessionToken, load, a
|
|
|
390
487
|
}
|
|
391
488
|
}
|
|
392
489
|
function cleanup() {
|
|
393
|
-
|
|
490
|
+
clearConnection(sessionId, connId);
|
|
491
|
+
// If a session/prompt we just forwarded hasn't produced its
|
|
492
|
+
// prompt_queue/added yet, don't tear down the daemon connection
|
|
493
|
+
// immediately — backgrounding the app right after hitting send (the
|
|
494
|
+
// literal case Web Push exists for) closes the browser WS within a
|
|
495
|
+
// second or two on iOS, possibly before the notification lands.
|
|
496
|
+
// Killing upstream here would silently drop the turn-notify
|
|
497
|
+
// registration every time. Give it a short grace window instead.
|
|
498
|
+
if (pendingOwnPrompts > 0) {
|
|
499
|
+
log.info(`browser gone with ${pendingOwnPrompts} own prompt(s) unresolved for session=${sessionId} — holding upstream ${OWN_PROMPT_GRACE_MS}ms for prompt_queue/added`);
|
|
500
|
+
setTimeout(() => upstream.stop(), OWN_PROMPT_GRACE_MS);
|
|
501
|
+
}
|
|
502
|
+
else {
|
|
503
|
+
upstream.stop();
|
|
504
|
+
}
|
|
394
505
|
for (const timer of pendingPermissionFrames.values()) {
|
|
395
506
|
clearTimeout(timer);
|
|
396
507
|
}
|
|
@@ -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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"}
|