@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.
@@ -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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"}
@@ -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
- upstream.stop();
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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"}