@oharness/engine 0.7.1 → 0.9.0

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.
Files changed (91) hide show
  1. package/dist/agent/agent.d.ts +1 -0
  2. package/dist/agent/agent.js +5 -0
  3. package/dist/agent/agent.js.map +1 -1
  4. package/dist/agent/permissions.js +8 -0
  5. package/dist/agent/permissions.js.map +1 -1
  6. package/dist/auth/manager.d.ts +8 -1
  7. package/dist/auth/manager.js +26 -4
  8. package/dist/auth/manager.js.map +1 -1
  9. package/dist/auth/providers/official.js +3 -2
  10. package/dist/auth/providers/official.js.map +1 -1
  11. package/dist/auth/store.d.ts +14 -8
  12. package/dist/auth/store.js +87 -3
  13. package/dist/auth/store.js.map +1 -1
  14. package/dist/browser/cdp.d.ts +75 -0
  15. package/dist/browser/cdp.js +136 -0
  16. package/dist/browser/cdp.js.map +1 -0
  17. package/dist/browser/chrome.d.ts +19 -0
  18. package/dist/browser/chrome.js +306 -0
  19. package/dist/browser/chrome.js.map +1 -0
  20. package/dist/browser/extension.d.ts +35 -0
  21. package/dist/browser/extension.js +297 -0
  22. package/dist/browser/extension.js.map +1 -0
  23. package/dist/browser/host-manifest.d.ts +78 -0
  24. package/dist/browser/host-manifest.js +166 -0
  25. package/dist/browser/host-manifest.js.map +1 -0
  26. package/dist/browser/host.d.ts +27 -0
  27. package/dist/browser/host.js +311 -0
  28. package/dist/browser/host.js.map +1 -0
  29. package/dist/browser/index.d.ts +26 -0
  30. package/dist/browser/index.js +15 -0
  31. package/dist/browser/index.js.map +1 -0
  32. package/dist/browser/login-import.d.ts +98 -0
  33. package/dist/browser/login-import.js +244 -0
  34. package/dist/browser/login-import.js.map +1 -0
  35. package/dist/browser/plugin.d.ts +109 -0
  36. package/dist/browser/plugin.js +22 -0
  37. package/dist/browser/plugin.js.map +1 -0
  38. package/dist/browser/presence.d.ts +29 -0
  39. package/dist/browser/presence.js +54 -0
  40. package/dist/browser/presence.js.map +1 -0
  41. package/dist/browser/provider.d.ts +17 -0
  42. package/dist/browser/provider.js +13 -0
  43. package/dist/browser/provider.js.map +1 -0
  44. package/dist/browser/screencast.d.ts +42 -0
  45. package/dist/browser/screencast.js +99 -0
  46. package/dist/browser/screencast.js.map +1 -0
  47. package/dist/browser/session.d.ts +320 -0
  48. package/dist/browser/session.js +837 -0
  49. package/dist/browser/session.js.map +1 -0
  50. package/dist/browser/snapshot.d.ts +49 -0
  51. package/dist/browser/snapshot.js +145 -0
  52. package/dist/browser/snapshot.js.map +1 -0
  53. package/dist/browser/socket.d.ts +15 -0
  54. package/dist/browser/socket.js +32 -0
  55. package/dist/browser/socket.js.map +1 -0
  56. package/dist/browser/target.d.ts +112 -0
  57. package/dist/browser/target.js +20 -0
  58. package/dist/browser/target.js.map +1 -0
  59. package/dist/browser/tools.d.ts +3 -0
  60. package/dist/browser/tools.js +537 -0
  61. package/dist/browser/tools.js.map +1 -0
  62. package/dist/config.d.ts +14 -0
  63. package/dist/config.js.map +1 -1
  64. package/dist/core/errors.d.ts +12 -0
  65. package/dist/core/errors.js +14 -1
  66. package/dist/core/errors.js.map +1 -1
  67. package/dist/harness.d.ts +49 -0
  68. package/dist/harness.js +100 -4
  69. package/dist/harness.js.map +1 -1
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.js +1 -0
  72. package/dist/index.js.map +1 -1
  73. package/dist/mcp/builtin.d.ts +65 -8
  74. package/dist/mcp/builtin.js +66 -35
  75. package/dist/mcp/builtin.js.map +1 -1
  76. package/dist/mcp/ottoport-updates.d.ts +90 -0
  77. package/dist/mcp/ottoport-updates.js +228 -0
  78. package/dist/mcp/ottoport-updates.js.map +1 -0
  79. package/dist/providers/piai.js +7 -2
  80. package/dist/providers/piai.js.map +1 -1
  81. package/dist/runtime-plugins/builtin/studio.d.ts +87 -16
  82. package/dist/runtime-plugins/builtin/studio.js +374 -62
  83. package/dist/runtime-plugins/builtin/studio.js.map +1 -1
  84. package/dist/runtime-plugins/host.js +8 -2
  85. package/dist/runtime-plugins/host.js.map +1 -1
  86. package/dist/tools/define.d.ts +1 -0
  87. package/dist/tools/define.js +3 -0
  88. package/dist/tools/define.js.map +1 -1
  89. package/dist/tools/types.d.ts +11 -0
  90. package/dist/tools/types.js.map +1 -1
  91. package/package.json +4 -8
@@ -0,0 +1,311 @@
1
+ import { createServer } from "node:net";
2
+ import { mkdir, stat, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { extensionSocketPath } from "./socket.js";
5
+ /**
6
+ * The native messaging host: a relay, and deliberately nothing more.
7
+ *
8
+ * Chrome starts this process when the extension connects to it, hands it the
9
+ * extension's messages on stdin, and reads replies from stdout. The harness is
10
+ * somewhere else entirely and may not be running yet, so this end listens on a
11
+ * local socket and the harness connects when a browser tool is first called.
12
+ * That direction matters: Chrome decides when the host exists, so the host
13
+ * cannot be the one doing the connecting.
14
+ *
15
+ * It knows CDP only as envelopes. The relay itself stays in the extension; what
16
+ * lives here is the one thing the extension cannot do, which is tell several
17
+ * harnesses apart. A desktop window, a web server and a terminal can each have
18
+ * conversations driving the same browser, and each numbers its requests from
19
+ * one. So every request is renumbered on the way in and put back on the way
20
+ * out, and a tab's events go to the harnesses attached to that tab. Nothing
21
+ * else about a message is read.
22
+ *
23
+ * Framing differs on the two sides and that is the whole of the work here.
24
+ * Chrome uses a four-byte little-endian length ahead of each UTF-8 JSON
25
+ * document; the socket side uses newline-delimited JSON, because a socket
26
+ * consumer in the harness is already reading lines.
27
+ *
28
+ * The streams are arguments rather than `process.stdin`/`process.stdout`, and
29
+ * that is not a testing convenience. stdout here *is* the protocol, and the
30
+ * engine is not allowed to own a process's standard streams — a library that
31
+ * printed to them could not be driven by a web UI or a scheduled run. So the
32
+ * binary in the CLI package hands its own streams in, and this stays mechanism.
33
+ */
34
+ /** Chrome refuses anything larger, in either direction. */
35
+ const MAX_MESSAGE = 64 * 1024 * 1024;
36
+ /** What Chrome itself accepts from a host. Frames have to fit inside it. */
37
+ const CHROME_LIMIT = 1024 * 1024;
38
+ /** Split Chrome's length-prefixed stream into messages. */
39
+ export class NativeMessageFramer {
40
+ buffer = Buffer.alloc(0);
41
+ push(chunk, onMessage, onError) {
42
+ this.buffer = this.buffer.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffer, chunk]);
43
+ for (;;) {
44
+ if (this.buffer.length < 4)
45
+ return;
46
+ const length = this.buffer.readUInt32LE(0);
47
+ if (length > MAX_MESSAGE) {
48
+ // Unrecoverable: the stream position is no longer trustworthy.
49
+ onError?.(`native message of ${length} bytes is beyond anything Chrome sends`);
50
+ this.buffer = Buffer.alloc(0);
51
+ return;
52
+ }
53
+ if (this.buffer.length < 4 + length)
54
+ return;
55
+ const body = this.buffer.subarray(4, 4 + length).toString("utf8");
56
+ this.buffer = this.buffer.subarray(4 + length);
57
+ try {
58
+ onMessage(JSON.parse(body));
59
+ }
60
+ catch {
61
+ onError?.("the extension sent something that is not JSON");
62
+ }
63
+ }
64
+ }
65
+ }
66
+ export function encodeNativeMessage(message) {
67
+ const body = Buffer.from(JSON.stringify(message), "utf8");
68
+ const header = Buffer.alloc(4);
69
+ header.writeUInt32LE(body.length, 0);
70
+ return Buffer.concat([header, body]);
71
+ }
72
+ export async function runBrowserHost(opts) {
73
+ const socketPath = opts.socketPath ?? extensionSocketPath();
74
+ const { input, output } = opts;
75
+ const warn = opts.warn ?? (() => { });
76
+ // A socket left behind by a host that was killed would refuse to bind. It is
77
+ // safe to remove: only one host can be useful at a time, and Chrome starts a
78
+ // fresh one each time the extension connects.
79
+ if (!socketPath.startsWith("\\\\")) {
80
+ await unlink(socketPath).catch(() => { });
81
+ // Chrome may start the host before OHarness has ever run and made its
82
+ // directory, and a socket cannot be created in a directory that is not there.
83
+ await mkdir(path.dirname(socketPath), { recursive: true });
84
+ }
85
+ const clients = new Set();
86
+ /**
87
+ * The OHarness servers that said where they are (see presence.ts), for the
88
+ * extension's side panel. Held only in memory, like the tokens in them.
89
+ */
90
+ const servers = new Map();
91
+ /** Keyed by the id the extension sees, which is never one a harness chose. */
92
+ const inFlight = new Map();
93
+ /** Which harnesses are attached to which tab, so a tab's events reach them all. */
94
+ const tabs = new Map();
95
+ let nextId = 1;
96
+ const framer = new NativeMessageFramer();
97
+ const toExtension = (message) => {
98
+ const encoded = encodeNativeMessage(message);
99
+ if (encoded.length > CHROME_LIMIT) {
100
+ warn(`dropping a ${encoded.length} byte message: Chrome's limit is ${CHROME_LIMIT}`);
101
+ return;
102
+ }
103
+ output.write(encoded);
104
+ };
105
+ const toClient = (client, message) => {
106
+ if (!client.destroyed)
107
+ client.write(`${JSON.stringify(message)}\n`);
108
+ };
109
+ // So the extension can say whether anything is using it, and where the
110
+ // OHarness pages are. Informational: an extension that predates it ignores
111
+ // a message type it does not know.
112
+ const announce = () => toExtension({ t: "host", clients: clients.size, servers: [...servers.values()] });
113
+ const holders = (tabId) => {
114
+ let set = tabs.get(tabId);
115
+ if (!set)
116
+ tabs.set(tabId, (set = new Set()));
117
+ return set;
118
+ };
119
+ /** Let go of a tab for one harness; the debugger stays while anyone still holds it. */
120
+ const release = (client, tabId) => {
121
+ const set = tabs.get(tabId);
122
+ if (!set)
123
+ return true;
124
+ set.delete(client);
125
+ if (set.size > 0)
126
+ return false;
127
+ tabs.delete(tabId);
128
+ return true;
129
+ };
130
+ const fromClient = (client, message) => {
131
+ if (typeof message !== "object" || message === null)
132
+ return;
133
+ const envelope = message;
134
+ const { t, id } = envelope;
135
+ if (t === "register") {
136
+ const { url, token, kind, pid } = envelope;
137
+ if (typeof url !== "string" || typeof token !== "string")
138
+ return;
139
+ // Loopback only: this is a page the extension will open with a token
140
+ // in it, and nothing but this machine's own OHarness belongs there.
141
+ if (!/^http:\/\/(?:127\.0\.0\.1|localhost|\[::1\])(?::\d+)?\/?$/.test(url))
142
+ return;
143
+ servers.set(client, {
144
+ url: url.replace(/\/$/, ""),
145
+ token,
146
+ kind: kind === "desktop" ? "desktop" : "web",
147
+ ...(typeof pid === "number" ? { pid } : {}),
148
+ });
149
+ announce();
150
+ return;
151
+ }
152
+ if (t !== "cdp" && t !== "ctl")
153
+ return;
154
+ if (t === "ctl") {
155
+ const op = typeof envelope["op"] === "string" ? envelope["op"] : "";
156
+ const tabId = envelope["tabId"] === undefined ? undefined : String(envelope["tabId"]);
157
+ // A tab another harness already attached needs no second debugger —
158
+ // Chrome would refuse one anyway. This harness just starts hearing it.
159
+ if (op === "attach" && tabId && (tabs.get(tabId)?.size ?? 0) > 0) {
160
+ holders(tabId).add(client);
161
+ toClient(client, { t: "ctl", id, result: { ok: true } });
162
+ return;
163
+ }
164
+ if (op === "detach" && tabId && !release(client, tabId)) {
165
+ toClient(client, { t: "ctl", id, result: { ok: true } });
166
+ return;
167
+ }
168
+ if (op === "closeTab" && tabId)
169
+ tabs.delete(tabId);
170
+ const hostId = nextId++;
171
+ inFlight.set(hostId, { client, id, op, ...(tabId ? { tabId } : {}) });
172
+ toExtension({ ...envelope, id: hostId });
173
+ return;
174
+ }
175
+ // CDP without an id is an event, and harnesses do not send events.
176
+ if (id === undefined)
177
+ return;
178
+ const hostId = nextId++;
179
+ inFlight.set(hostId, { client, id });
180
+ toExtension({ ...envelope, id: hostId });
181
+ };
182
+ const fromExtension = (message) => {
183
+ if (typeof message !== "object" || message === null)
184
+ return;
185
+ const envelope = message;
186
+ const { t, id } = envelope;
187
+ if (typeof id === "number" && (t === "cdp" || t === "ctl")) {
188
+ const request = inFlight.get(id);
189
+ if (!request)
190
+ return;
191
+ inFlight.delete(id);
192
+ const { client } = request;
193
+ if (!client)
194
+ return;
195
+ if (t === "ctl" && request.op === "attach" && request.tabId && envelope["error"] === undefined) {
196
+ holders(request.tabId).add(client);
197
+ }
198
+ toClient(client, { ...envelope, id: request.id });
199
+ return;
200
+ }
201
+ if (t === "cdp") {
202
+ const sessionId = envelope["sessionId"];
203
+ if (sessionId === undefined) {
204
+ for (const client of clients)
205
+ toClient(client, envelope);
206
+ return;
207
+ }
208
+ const tabId = String(sessionId);
209
+ const set = tabs.get(tabId);
210
+ if (!set)
211
+ return;
212
+ for (const client of set)
213
+ toClient(client, envelope);
214
+ // The debugger is gone — the person closed the banner or the tab — so
215
+ // nobody holds this tab any more.
216
+ if (envelope["method"] === "Inspector.detached")
217
+ tabs.delete(tabId);
218
+ }
219
+ };
220
+ input.on("data", (chunk) => framer.push(chunk, fromExtension, warn));
221
+ const server = createServer((socket) => {
222
+ clients.add(socket);
223
+ announce();
224
+ let buffer = "";
225
+ socket.setEncoding("utf8");
226
+ socket.on("data", (chunk) => {
227
+ buffer += chunk;
228
+ let newline;
229
+ while ((newline = buffer.indexOf("\n")) !== -1) {
230
+ const line = buffer.slice(0, newline).trim();
231
+ buffer = buffer.slice(newline + 1);
232
+ if (line === "")
233
+ continue;
234
+ let parsed;
235
+ try {
236
+ parsed = JSON.parse(line);
237
+ }
238
+ catch {
239
+ warn("the harness sent something that is not JSON");
240
+ continue;
241
+ }
242
+ fromClient(socket, parsed);
243
+ }
244
+ });
245
+ let gone = false;
246
+ const drop = () => {
247
+ if (gone)
248
+ return;
249
+ gone = true;
250
+ clients.delete(socket);
251
+ servers.delete(socket);
252
+ for (const [hostId, request] of inFlight) {
253
+ if (request.client === socket)
254
+ inFlight.delete(hostId);
255
+ }
256
+ // A harness that went away without detaching — killed, crashed, its
257
+ // laptop lid shut — must not leave a banner on the person's tabs.
258
+ for (const tabId of [...tabs.keys()]) {
259
+ if (!tabs.get(tabId)?.has(socket))
260
+ continue;
261
+ if (!release(socket, tabId))
262
+ continue;
263
+ const hostId = nextId++;
264
+ inFlight.set(hostId, { client: undefined, id: undefined });
265
+ toExtension({ t: "ctl", id: hostId, op: "detach", tabId: Number(tabId) });
266
+ }
267
+ announce();
268
+ };
269
+ socket.on("close", drop);
270
+ socket.on("error", drop);
271
+ });
272
+ await new Promise((resolve, reject) => {
273
+ server.once("error", reject);
274
+ server.listen(socketPath, () => {
275
+ server.removeListener("error", reject);
276
+ resolve();
277
+ });
278
+ });
279
+ // Which file is ours. Chrome starts a new host whenever the extension's
280
+ // worker restarts, often before the old one has noticed its stdin close; the
281
+ // new one takes the path over, and the old one must not delete it on the way
282
+ // out, or the host that is still running becomes one nobody can reach.
283
+ const ours = socketPath.startsWith("\\\\") ? undefined : await stat(socketPath).then((s) => s.ino, () => undefined);
284
+ // The first thing the extension hears, and its sign the host really started:
285
+ // connecting a native port succeeds even when the host then fails to launch.
286
+ announce();
287
+ // Chrome closing stdin is how a host is told the extension went away.
288
+ let stopping;
289
+ const shutdown = () => (stopping ??= (async () => {
290
+ for (const client of clients)
291
+ client.end();
292
+ const current = ours === undefined ? undefined : await stat(socketPath).then((s) => s.ino, () => undefined);
293
+ if (ours !== undefined && current !== ours) {
294
+ // Closing a unix socket server unlinks its path, and the path is now
295
+ // the newer host's. Stop listening without closing; the process running
296
+ // this exits explicitly (see RunningHost.closed), which leaves it be.
297
+ server.unref();
298
+ return;
299
+ }
300
+ await new Promise((resolve) => server.close(() => resolve()));
301
+ if (ours !== undefined)
302
+ await unlink(socketPath).catch(() => { });
303
+ })());
304
+ let settle;
305
+ const closed = new Promise((resolve) => (settle = resolve));
306
+ const close = () => shutdown().then(settle);
307
+ input.on("end", () => void close());
308
+ input.on("close", () => void close());
309
+ return { socketPath, closed, close };
310
+ }
311
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/browser/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export { BrowserSession, originOf } from "./session.ts";
2
+ export type { BrowserSessionOptions, ConsoleEntry, NetworkEntry } from "./session.ts";
3
+ export { createBrowserTools } from "./tools.ts";
4
+ export { findChrome, launchChrome } from "./chrome.ts";
5
+ export type { LaunchChromeOptions } from "./chrome.ts";
6
+ export { CdpConnection, NulFramer } from "./cdp.ts";
7
+ export type { CdpMessage } from "./cdp.ts";
8
+ export { buildSnapshot } from "./snapshot.ts";
9
+ export type { AxNode, Snapshot, SnapshotOptions } from "./snapshot.ts";
10
+ export type { BrowserInputEvent, BrowserPage, BrowserTarget, BrowserTargetFactory, FrameOptions, BrowserTargetContext, } from "./target.ts";
11
+ export { createBrowserUsePlugin } from "./plugin.ts";
12
+ export type { BrowserUsePlugin, BrowserUseSession, BrowserUseSessionContext, DefaultBrowserUsePluginOptions } from "./plugin.ts";
13
+ export { browserProviderFor, builtinBrowserProvider, extensionBrowserProvider } from "./provider.ts";
14
+ export type { BrowserProviderPlugin } from "./provider.ts";
15
+ export { connectExtensionChannel, extensionTarget } from "./extension.ts";
16
+ export { extensionHostReachable, extensionSocketPath } from "./socket.ts";
17
+ export { announcePresence } from "./presence.ts";
18
+ export type { Presence, PresenceInfo } from "./presence.ts";
19
+ export type { ExtensionChannel } from "./extension.ts";
20
+ export { NativeMessageFramer, encodeNativeMessage, runBrowserHost } from "./host.ts";
21
+ export type { HostOptions, RunningHost } from "./host.ts";
22
+ export { EXTENSION_ID, EXTENSION_INSTALL_URL, HOST_NAME, hostLauncher, installNativeHost, nativeHostManifest, nativeHostTargets, windowsRegistryKeys, } from "./host-manifest.ts";
23
+ export type { InstallOptions, InstallResult, NativeHostManifest } from "./host-manifest.ts";
24
+ export { ScreencastHub } from "./screencast.ts";
25
+ export { LoginImportMemory, cookieInSite, cookieParam, groupSites, hostInSite, normalizeSite, readSiteLoginState } from "./login-import.ts";
26
+ export type { CookieParam, ExternalSite, ImportedSite, SiteLoginState } from "./login-import.ts";
@@ -0,0 +1,15 @@
1
+ export { BrowserSession, originOf } from "./session.js";
2
+ export { createBrowserTools } from "./tools.js";
3
+ export { findChrome, launchChrome } from "./chrome.js";
4
+ export { CdpConnection, NulFramer } from "./cdp.js";
5
+ export { buildSnapshot } from "./snapshot.js";
6
+ export { createBrowserUsePlugin } from "./plugin.js";
7
+ export { browserProviderFor, builtinBrowserProvider, extensionBrowserProvider } from "./provider.js";
8
+ export { connectExtensionChannel, extensionTarget } from "./extension.js";
9
+ export { extensionHostReachable, extensionSocketPath } from "./socket.js";
10
+ export { announcePresence } from "./presence.js";
11
+ export { NativeMessageFramer, encodeNativeMessage, runBrowserHost } from "./host.js";
12
+ export { EXTENSION_ID, EXTENSION_INSTALL_URL, HOST_NAME, hostLauncher, installNativeHost, nativeHostManifest, nativeHostTargets, windowsRegistryKeys, } from "./host-manifest.js";
13
+ export { ScreencastHub } from "./screencast.js";
14
+ export { LoginImportMemory, cookieInSite, cookieParam, groupSites, hostInSite, normalizeSite, readSiteLoginState } from "./login-import.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAU9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAErG,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAErF,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,98 @@
1
+ import type { BrowserTarget } from "./target.ts";
2
+ /**
3
+ * Moving a site's sign-in from the person's own browser into the built-in one.
4
+ *
5
+ * The external browser is only ever reached through the OHarness extension —
6
+ * the same sanctioned relay extension mode drives — so nothing here reads
7
+ * another browser's cookie database off disk or asks the keychain for its key.
8
+ * Chrome shows its "being debugged" banner while a tab is read, which is the
9
+ * disclosure this deserves.
10
+ *
11
+ * The unit is a site, not a browser. Copying a whole cookie jar would hand the
12
+ * agent every account the person has, for the sake of the one it needed; a site
13
+ * is what the person can reason about in a confirmation dialog, and what the
14
+ * dialog names. Nothing in this module runs without that confirmation: the
15
+ * server only calls `readSiteLoginState` from the dialog's import action.
16
+ */
17
+ /** A cookie as `Network.setCookies` accepts it. */
18
+ export type CookieParam = Record<string, unknown> & {
19
+ name: string;
20
+ value: string;
21
+ };
22
+ export interface SiteLoginState {
23
+ site: string;
24
+ cookies: CookieParam[];
25
+ /** localStorage per origin, read from the site's open tabs. */
26
+ origins: Array<{
27
+ origin: string;
28
+ url: string;
29
+ localStorage: Array<[string, string]>;
30
+ }>;
31
+ }
32
+ export interface ExternalSite {
33
+ site: string;
34
+ /** The most useful page to reopen in the built-in browser. */
35
+ url: string;
36
+ title?: string;
37
+ tabs: number;
38
+ }
39
+ export interface ImportedSite {
40
+ site: string;
41
+ cookies: number;
42
+ localStorage: number;
43
+ url?: string;
44
+ }
45
+ /**
46
+ * The site a URL or typed domain names: lower-case host, `www.` dropped so
47
+ * `github.com` and `www.github.com` are one choice in the dialog.
48
+ */
49
+ export declare function normalizeSite(input: string): string | undefined;
50
+ /** Whether a host belongs to a site: the site itself or any subdomain of it. */
51
+ export declare function hostInSite(host: string, site: string): boolean;
52
+ /**
53
+ * Whether a cookie is part of signing in to `site`.
54
+ *
55
+ * Its own and its subdomains' cookies, and the parent domain's too: signing in
56
+ * to `mail.example.com` often lives in a cookie set on `.example.com`. A public
57
+ * suffix can never carry a cookie, so the parent walk cannot reach `.com`.
58
+ */
59
+ export declare function cookieInSite(domain: string, site: string): boolean;
60
+ /** The http(s) sites open in a browser, grouped the way the dialog lists them. */
61
+ export declare function groupSites(tabs: Array<{
62
+ url: string;
63
+ title?: string;
64
+ }>): ExternalSite[];
65
+ /** Which browser the extension lives in, for the dialog. Older extensions cannot say. */
66
+ export declare function externalBrowserName(target: BrowserTarget): Promise<string>;
67
+ export declare function listExternalSites(target: BrowserTarget): Promise<ExternalSite[]>;
68
+ /**
69
+ * Read one site's cookies and localStorage from the external browser.
70
+ *
71
+ * Cookies come from the browser-wide store, so any attached tab can answer;
72
+ * localStorage only exists inside a page of its own origin, so it is read from
73
+ * the site's open tabs and is simply absent for a site with none.
74
+ */
75
+ export declare function readSiteLoginState(target: BrowserTarget, site: string): Promise<SiteLoginState>;
76
+ /**
77
+ * A read cookie, rewritten as one `Network.setCookies` will store identically.
78
+ *
79
+ * A host-only cookie is reported with a bare domain, and passing that back as
80
+ * `domain` would widen it to every subdomain (and make a `__Host-` cookie
81
+ * invalid). So host-only cookies are set by `url`, domain cookies by `domain`.
82
+ * Partitioning and source-port fields are left out: their shapes differ across
83
+ * Chromium versions, and the embedded one rejects what it does not know.
84
+ */
85
+ export declare function cookieParam(cookie: Record<string, unknown>): CookieParam | undefined;
86
+ /**
87
+ * Sites the person already answered for — imported, or told the suggestion to
88
+ * go away. The built-in profile is shared and persistent, so the answer is too:
89
+ * asking again in the next conversation would be asking the same question.
90
+ */
91
+ export declare class LoginImportMemory {
92
+ private readonly file;
93
+ private loaded?;
94
+ constructor(file?: string);
95
+ private sites;
96
+ has(site: string): Promise<boolean>;
97
+ add(site: string): Promise<void>;
98
+ }