@kamilio/wire 0.1.3 → 0.1.4

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 (47) hide show
  1. package/dist/auth.d.ts.map +1 -1
  2. package/dist/auth.js +3 -10
  3. package/dist/auth.js.map +1 -1
  4. package/dist/executable.d.ts.map +1 -1
  5. package/dist/executable.js +33 -8
  6. package/dist/executable.js.map +1 -1
  7. package/dist/hooks.d.ts.map +1 -1
  8. package/dist/hooks.js +18 -7
  9. package/dist/hooks.js.map +1 -1
  10. package/node_modules/provider-chatgpt/dist/chatgpt.d.ts.map +1 -1
  11. package/node_modules/provider-chatgpt/dist/chatgpt.js +22 -3
  12. package/node_modules/provider-chatgpt/dist/chatgpt.js.map +1 -1
  13. package/node_modules/provider-chatgpt/src/chatgpt.ts +20 -3
  14. package/node_modules/provider-gmail/dist/gmail.d.ts.map +1 -1
  15. package/node_modules/provider-gmail/dist/gmail.js +2 -0
  16. package/node_modules/provider-gmail/dist/gmail.js.map +1 -1
  17. package/node_modules/provider-gmail/src/gmail.ts +1 -0
  18. package/node_modules/provider-google-docs/dist/google-docs.d.ts.map +1 -1
  19. package/node_modules/provider-google-docs/dist/google-docs.js +9 -6
  20. package/node_modules/provider-google-docs/dist/google-docs.js.map +1 -1
  21. package/node_modules/provider-google-docs/src/google-docs.ts +10 -7
  22. package/node_modules/provider-notion/dist/notion-sync.d.ts +1 -1
  23. package/node_modules/provider-notion/dist/notion-sync.d.ts.map +1 -1
  24. package/node_modules/provider-notion/dist/notion-sync.js +41 -12
  25. package/node_modules/provider-notion/dist/notion-sync.js.map +1 -1
  26. package/node_modules/provider-notion/dist/notion.js +1 -1
  27. package/node_modules/provider-notion/dist/notion.js.map +1 -1
  28. package/node_modules/provider-notion/src/notion-sync.ts +41 -12
  29. package/node_modules/provider-notion/src/notion.ts +1 -1
  30. package/node_modules/wire-core/dist/core/transform.d.ts +1 -0
  31. package/node_modules/wire-core/dist/core/transform.d.ts.map +1 -1
  32. package/node_modules/wire-core/dist/core/transform.js +4 -0
  33. package/node_modules/wire-core/dist/core/transform.js.map +1 -1
  34. package/node_modules/wire-core/dist/operations.d.ts.map +1 -1
  35. package/node_modules/wire-core/dist/operations.js +8 -6
  36. package/node_modules/wire-core/dist/operations.js.map +1 -1
  37. package/node_modules/wire-core/dist/runtime/chrome.d.ts +1 -0
  38. package/node_modules/wire-core/dist/runtime/chrome.d.ts.map +1 -1
  39. package/node_modules/wire-core/dist/runtime/chrome.js +64 -79
  40. package/node_modules/wire-core/dist/runtime/chrome.js.map +1 -1
  41. package/node_modules/wire-core/src/core/transform.ts +5 -1
  42. package/node_modules/wire-core/src/operations.ts +8 -6
  43. package/node_modules/wire-core/src/runtime/chrome.ts +69 -75
  44. package/package.json +1 -1
  45. package/src/auth.ts +3 -9
  46. package/src/executable.ts +33 -8
  47. package/src/hooks.ts +16 -6
@@ -22,6 +22,7 @@ export async function chromeLaunchArguments(environment, startUrl) {
22
22
  startUrl,
23
23
  ]);
24
24
  }
25
+ const chromeExecutable = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
25
26
  class ChromeConnection {
26
27
  socket;
27
28
  pending = new Map();
@@ -108,7 +109,7 @@ function devtoolsUrl(stderr) {
108
109
  if (match !== null)
109
110
  resolve(match[1]);
110
111
  });
111
- stderr.on("end", () => reject(new Error(contents)));
112
+ stderr.on("end", () => reject(new Error(contents === "" ? "Chrome exited before DevTools started. A Wire Chrome window is already open from a previous login; close it and retry." : contents)));
112
113
  });
113
114
  }
114
115
  async function closeChrome(chrome, connection, pageConnection) {
@@ -128,54 +129,6 @@ async function pageDevtoolsUrl(browserUrl, domains) {
128
129
  const targets = await (await fetch(endpoint)).json();
129
130
  return targets.find((target) => target.type === "page" && domains.some((domain) => new URL(target.url).hostname === domain || new URL(target.url).hostname.endsWith(`.${domain}`))).webSocketDebuggerUrl;
130
131
  }
131
- async function chatgptBrowserMetadata(pageConnection) {
132
- const evaluation = await pageConnection.request("Runtime.evaluate", {
133
- expression: `new Promise((resolve) => {
134
- (async () => {
135
- if (location.hostname !== "chatgpt.com") {
136
- resolve({ ok: false });
137
- return;
138
- }
139
- const response = await fetch("/api/auth/session", { cache: "no-store" });
140
- const text = await response.text();
141
- if (!text.startsWith("{")) {
142
- resolve({ ok: false });
143
- return;
144
- }
145
- const session = JSON.parse(text);
146
- if (!("account" in session) || !("id" in session.account) || !("accessToken" in session) || "error" in session) {
147
- resolve({ ok: false });
148
- return;
149
- }
150
- const backend = await fetch("/backend-api/conversations?offset=0&limit=1&order=updated&is_archived=false&is_starred=false", {
151
- cache: "no-store",
152
- headers: {
153
- authorization: \`Bearer \${session.accessToken}\`,
154
- "chatgpt-account-id": session.account.id
155
- }
156
- });
157
- resolve({ ok: backend.ok, account_id: session.account.id });
158
- })().catch(() => resolve({ ok: false }));
159
- })`,
160
- awaitPromise: true,
161
- returnByValue: true,
162
- });
163
- const value = evaluation.result.value;
164
- if (value.ok !== true)
165
- return null;
166
- return Object.freeze({ account_id: value.account_id });
167
- }
168
- async function chatgptChallengeUrl(pageConnection) {
169
- const evaluation = await pageConnection.request("Runtime.evaluate", {
170
- expression: `(() => ({ href: location.href, title: document.title, text: document.body.innerText }))()`,
171
- returnByValue: true,
172
- });
173
- const value = evaluation.result.value;
174
- const pageText = `${value.href}\n${value.title}\n${value.text}`;
175
- if (/cdn-cgi\/challenge-platform|cf_chl|Just a moment|Verify you are human|Cloudflare/i.test(pageText))
176
- return value.href;
177
- return null;
178
- }
179
132
  function chromeCookies(values, domains) {
180
133
  return Object.freeze(values.filter((cookie) => domains.some((domain) => cookie.domain === domain || cookie.domain.endsWith(`.${domain}`))).map((cookie) => Object.freeze({
181
134
  domain: cookie.domain,
@@ -197,10 +150,67 @@ async function confirmSaveLogin() {
197
150
  function sleep(milliseconds) {
198
151
  return new Promise((resolve) => setTimeout(resolve, milliseconds));
199
152
  }
153
+ async function headlessChromeConnection(environment) {
154
+ const chrome = spawn(chromeExecutable, [`--user-data-dir=${chromeUserDataDir(environment)}`, "--remote-debugging-port=0", "--headless=new", "--no-first-run", "--no-default-browser-check", "about:blank"], { detached: true, stdio: ["ignore", "ignore", "pipe"] });
155
+ const connection = new ChromeConnection(await devtoolsUrl(chrome.stderr));
156
+ await connection.opened();
157
+ return Object.freeze({ chrome, connection });
158
+ }
159
+ async function expireServiceCookies(connection, domains) {
160
+ const serviceDomain = (domain) => { const bare = domain.startsWith(".") ? domain.slice(1) : domain; return domains.some((value) => bare === value || bare.endsWith(`.${value}`)); };
161
+ const stored = await connection.request("Storage.getCookies");
162
+ const expiredCopies = stored.cookies.filter((cookie) => serviceDomain(cookie.domain)).map((cookie) => ({
163
+ name: cookie.name,
164
+ value: "",
165
+ domain: cookie.domain,
166
+ path: cookie.path,
167
+ secure: cookie.secure,
168
+ httpOnly: cookie.httpOnly,
169
+ expires: 1,
170
+ ...(cookie.sameSite === undefined ? {} : { sameSite: cookie.sameSite }),
171
+ ...(cookie.sourceScheme === undefined ? {} : { sourceScheme: cookie.sourceScheme }),
172
+ ...(cookie.sourcePort === undefined ? {} : { sourcePort: cookie.sourcePort }),
173
+ ...(cookie.partitionKey === undefined ? {} : { partitionKey: cookie.partitionKey }),
174
+ }));
175
+ if (expiredCopies.length > 0)
176
+ await connection.request("Storage.setCookies", { cookies: expiredCopies });
177
+ }
178
+ async function extractDetachedChromeCookies(environment, extraction) {
179
+ await mkdir(chromeUserDataDir(environment), { recursive: true });
180
+ const prep = await headlessChromeConnection(environment);
181
+ await expireServiceCookies(prep.connection, extraction.domains);
182
+ await closeChrome(prep.chrome, prep.connection);
183
+ const chrome = spawn(chromeExecutable, [`--user-data-dir=${chromeUserDataDir(environment)}`, "--no-first-run", "--no-default-browser-check", extraction.startUrl], { detached: true, stdio: ["ignore", "ignore", "ignore"] });
184
+ stderr.write(`\nLog in to ${extraction.service} in the opened Chrome window, then quit Chrome (Cmd+Q). Wire picks up the session after Chrome exits.\n`);
185
+ let interrupted = false;
186
+ const interrupt = () => {
187
+ interrupted = true;
188
+ process.kill(-chrome.pid, "SIGTERM");
189
+ };
190
+ process.on("SIGINT", interrupt);
191
+ await new Promise((resolve) => chrome.once("exit", resolve));
192
+ process.off("SIGINT", interrupt);
193
+ await sleep(500);
194
+ const harvest = await headlessChromeConnection(environment);
195
+ const stored = await harvest.connection.request("Storage.getCookies");
196
+ await closeChrome(harvest.chrome, harvest.connection);
197
+ const cookies = chromeCookies(stored.cookies, extraction.domains);
198
+ if (interrupted) {
199
+ const save = await confirmSaveLogin();
200
+ if (!save)
201
+ throw new Error("Login not saved");
202
+ return Object.freeze({ cookies, metadata: Object.freeze({}), manual: true });
203
+ }
204
+ if (!extraction.ready(cookies))
205
+ throw new Error(`${extraction.service} login did not complete: the Chrome window was quit before login finished.`);
206
+ return Object.freeze({ cookies, metadata: Object.freeze({}) });
207
+ }
200
208
  export async function extractChromeCookies(environment, extraction) {
209
+ if (extraction.freshSession === true)
210
+ return extractDetachedChromeCookies(environment, extraction);
201
211
  const profile = chromeUserDataDir(environment);
202
212
  await mkdir(profile, { recursive: true });
203
- const chrome = spawn("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", [...await chromeLaunchArguments(environment, extraction.startUrl)], { detached: true, stdio: ["ignore", "ignore", "pipe"] });
213
+ const chrome = spawn(chromeExecutable, [...await chromeLaunchArguments(environment, extraction.startUrl)], { detached: true, stdio: ["ignore", "ignore", "pipe"] });
204
214
  let interrupted = false;
205
215
  let interrupting = false;
206
216
  let interruptResult;
@@ -224,7 +234,7 @@ export async function extractChromeCookies(environment, extraction) {
224
234
  const browserUrl = await devtoolsUrl(chrome.stderr);
225
235
  const connection = new ChromeConnection(browserUrl);
226
236
  await connection.opened();
227
- const pageConnection = extraction.metadataExpression === undefined && extraction.service !== "chatgpt" ? undefined : new ChromeConnection(await pageDevtoolsUrl(browserUrl, extraction.domains));
237
+ const pageConnection = extraction.metadataExpression === undefined ? undefined : new ChromeConnection(await pageDevtoolsUrl(browserUrl, extraction.domains));
228
238
  if (pageConnection !== undefined)
229
239
  await pageConnection.opened();
230
240
  if (pageConnection !== undefined)
@@ -252,38 +262,13 @@ export async function extractChromeCookies(environment, extraction) {
252
262
  return interruptResult;
253
263
  };
254
264
  for (;;) {
255
- if (extraction.service === "chatgpt") {
256
- const challengeUrl = await chatgptChallengeUrl(pageConnection);
257
- const manualResult = await interruptedResult();
258
- if (manualResult !== undefined)
259
- return manualResult;
260
- if (challengeUrl !== null) {
261
- await closeChrome(chrome, connection, pageConnection);
262
- process.off("SIGINT", interrupt);
263
- throw new Error(`ChatGPT login is stuck on an HTML challenge: ${challengeUrl}`);
264
- }
265
- }
266
265
  const result = await currentResult();
267
266
  const manualResult = await interruptedResult();
268
267
  if (manualResult !== undefined)
269
268
  return manualResult;
270
269
  if (extraction.ready(result.cookies)) {
271
- let metadata = result.metadata;
272
- if (extraction.service === "chatgpt") {
273
- const chatgptMetadata = await Promise.race([chatgptBrowserMetadata(pageConnection), interruptPromise.then(() => undefined)]);
274
- const interruptedChatgptResult = await interruptedResult();
275
- if (interruptedChatgptResult !== undefined)
276
- return interruptedChatgptResult;
277
- if (chatgptMetadata === undefined)
278
- continue;
279
- if (chatgptMetadata === null) {
280
- await closeChrome(chrome, connection, pageConnection);
281
- process.off("SIGINT", interrupt);
282
- throw new Error("ChatGPT login is blocked by an HTML challenge. Complete `wire chatgpt login` in the opened Chrome window, then retry.");
283
- }
284
- metadata = chatgptMetadata;
285
- }
286
- else if (extraction.metadataExpression !== undefined) {
270
+ const metadata = result.metadata;
271
+ if (extraction.metadataExpression !== undefined) {
287
272
  if (Object.keys(metadata).length === 0) {
288
273
  await Promise.race([sleep(1000), interruptPromise]);
289
274
  const interruptedMetadataResult = await interruptedResult();
@@ -292,7 +277,7 @@ export async function extractChromeCookies(environment, extraction) {
292
277
  continue;
293
278
  }
294
279
  }
295
- if (extraction.service !== "chatgpt" && !(await Promise.race([extraction.verify(result.cookies, metadata), interruptPromise.then(() => false)]))) {
280
+ if (!(await Promise.race([extraction.verify(result.cookies, metadata), interruptPromise.then(() => false)]))) {
296
281
  const interruptedVerifyResult = await interruptedResult();
297
282
  if (interruptedVerifyResult !== undefined)
298
283
  return interruptedVerifyResult;
@@ -1 +1 @@
1
- {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../src/runtime/chrome.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chrome.js","sourceRoot":"","sources":["../../src/runtime/chrome.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@ import { parseSourceUrl } from "./source.js";
5
5
  export type SlackMessage = Readonly<{ ts: string; text: string }>;
6
6
  export type GmailMimePart = Readonly<{
7
7
  mimeType: string;
8
- body?: Readonly<{ data: string }>;
8
+ body?: Readonly<{ data: string; attachmentId?: string }>;
9
9
  parts?: readonly GmailMimePart[];
10
10
  }>;
11
11
  export type AsanaTask = Readonly<{
@@ -102,6 +102,9 @@ function htmlText(html: string): string {
102
102
  }
103
103
 
104
104
  export function gmailMessageBody(payload: GmailMimePart): string {
105
+ if (payload.body?.attachmentId !== undefined) {
106
+ return "";
107
+ }
105
108
  if (payload.mimeType === "text/plain") {
106
109
  return decodeBase64Url(payload.body!.data);
107
110
  }
@@ -114,6 +117,7 @@ export function gmailMessageBody(payload: GmailMimePart): string {
114
117
  return payload.parts!
115
118
  .filter((part) => part.mimeType !== "application/octet-stream")
116
119
  .map(gmailMessageBody)
120
+ .filter((value) => value !== "")
117
121
  .join("\n");
118
122
  }
119
123
 
@@ -155,6 +155,11 @@ function markdownSnapshot(snapshot: JsonValue): string | null {
155
155
  return typeof markdown === "string" ? markdown : null;
156
156
  }
157
157
 
158
+ function storedSnapshot(fetched: FetchedDocument): JsonValue {
159
+ if (!jsonObject(fetched.data)) return fetched.data;
160
+ return { ...fetched.data, markdown: fetched.markdown };
161
+ }
162
+
158
163
  function pathLikeResourceValue(value: string): boolean {
159
164
  return value === "." || value === ".." || value.startsWith("./") || value.startsWith("../") || value.startsWith("/") || value.includes("/") || value.includes("\\") || value.endsWith(".md");
160
165
  }
@@ -217,7 +222,7 @@ export function composeWire<FetchInput>(dependencies: WireDependencies<FetchInpu
217
222
  ...(current?.data.filter((item) => item.namespace !== "wire" && !(item.namespace === source.service && item.key === "snapshot")) ?? []),
218
223
  { namespace: "wire", key: "title", value: fetched.title },
219
224
  { namespace: "wire", key: "synced_at", value: dependencies.now().toISOString() },
220
- { namespace: source.service, key: "snapshot", value: fetched.data },
225
+ { namespace: source.service, key: "snapshot", value: storedSnapshot(fetched) },
221
226
  ],
222
227
  relationships: extractRelationships(fetched.markdown, id, dependencies.catalog),
223
228
  };
@@ -241,11 +246,8 @@ export function composeWire<FetchInput>(dependencies: WireDependencies<FetchInpu
241
246
  const cleanPath = join(resolve(path), markdownFilename(fetched.title));
242
247
  let outputPath = cleanPath;
243
248
  if (await dependencies.filesystem.exists(cleanPath)) {
244
- const root = await dependencies.workspace.configuredRoot(cleanPath, dependencies.home);
245
- const current = root === null ? null : await existingResource(await dependencies.workspace.openRegistry(root, dependencies.home), source.service, source.identifier);
246
- const currentPrimaryPath = current === null ? null : join(dirname(root!), primaryLink(current).path);
247
249
  const existingMarkdown = await dependencies.filesystem.readText(cleanPath);
248
- if (currentPrimaryPath !== cleanPath && existingMarkdown !== fetched.markdown) outputPath = join(resolve(path), collisionFilename(fetched.title, source.service, source.identifier));
250
+ if (existingMarkdown !== fetched.markdown) outputPath = join(resolve(path), collisionFilename(fetched.title, source.service, source.identifier));
249
251
  }
250
252
  const previous = await dependencies.filesystem.exists(outputPath) ? await dependencies.filesystem.readText(outputPath) : "";
251
253
  await dependencies.filesystem.writeText(outputPath, fetched.markdown);
@@ -259,7 +261,7 @@ export function composeWire<FetchInput>(dependencies: WireDependencies<FetchInpu
259
261
  data: [
260
262
  { namespace: "wire", key: "title", value: fetched.title },
261
263
  { namespace: "wire", key: "synced_at", value: dependencies.now().toISOString() },
262
- { namespace: source.service, key: "snapshot", value: fetched.data },
264
+ { namespace: source.service, key: "snapshot", value: storedSnapshot(fetched) },
263
265
  ],
264
266
  relationships: extractRelationships(fetched.markdown, id, dependencies.catalog),
265
267
  };
@@ -28,6 +28,8 @@ export async function chromeLaunchArguments(environment: NodeEnvironment, startU
28
28
  ]);
29
29
  }
30
30
 
31
+ const chromeExecutable = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";
32
+
31
33
  interface ChromeCookie {
32
34
  readonly domain: string;
33
35
  readonly expires: number;
@@ -36,6 +38,10 @@ interface ChromeCookie {
36
38
  readonly path: string;
37
39
  readonly secure: boolean;
38
40
  readonly value: string;
41
+ readonly sameSite?: string;
42
+ readonly sourceScheme?: string;
43
+ readonly sourcePort?: number;
44
+ readonly partitionKey?: Readonly<Record<string, unknown>>;
39
45
  }
40
46
 
41
47
  interface PendingRequest {
@@ -133,7 +139,7 @@ function devtoolsUrl(stderr: NodeJS.ReadableStream): Promise<string> {
133
139
  const match = /DevTools listening on (ws:\/\/[^\s]+)/.exec(contents);
134
140
  if (match !== null) resolve(match[1]!);
135
141
  });
136
- stderr.on("end", () => reject(new Error(contents)));
142
+ stderr.on("end", () => reject(new Error(contents === "" ? "Chrome exited before DevTools started. A Wire Chrome window is already open from a previous login; close it and retry." : contents)));
137
143
  });
138
144
  }
139
145
 
@@ -155,54 +161,6 @@ async function pageDevtoolsUrl(browserUrl: string, domains: readonly string[]):
155
161
  return targets.find((target) => target.type === "page" && domains.some((domain) => new URL(target.url).hostname === domain || new URL(target.url).hostname.endsWith(`.${domain}`)))!.webSocketDebuggerUrl;
156
162
  }
157
163
 
158
- async function chatgptBrowserMetadata(pageConnection: ChromeConnection): Promise<Readonly<Record<string, string>> | null> {
159
- const evaluation = await pageConnection.request("Runtime.evaluate", {
160
- expression: `new Promise((resolve) => {
161
- (async () => {
162
- if (location.hostname !== "chatgpt.com") {
163
- resolve({ ok: false });
164
- return;
165
- }
166
- const response = await fetch("/api/auth/session", { cache: "no-store" });
167
- const text = await response.text();
168
- if (!text.startsWith("{")) {
169
- resolve({ ok: false });
170
- return;
171
- }
172
- const session = JSON.parse(text);
173
- if (!("account" in session) || !("id" in session.account) || !("accessToken" in session) || "error" in session) {
174
- resolve({ ok: false });
175
- return;
176
- }
177
- const backend = await fetch("/backend-api/conversations?offset=0&limit=1&order=updated&is_archived=false&is_starred=false", {
178
- cache: "no-store",
179
- headers: {
180
- authorization: \`Bearer \${session.accessToken}\`,
181
- "chatgpt-account-id": session.account.id
182
- }
183
- });
184
- resolve({ ok: backend.ok, account_id: session.account.id });
185
- })().catch(() => resolve({ ok: false }));
186
- })`,
187
- awaitPromise: true,
188
- returnByValue: true,
189
- }) as { result: { value?: { ok?: boolean; account_id?: string } } };
190
- const value = evaluation.result.value!;
191
- if (value.ok !== true) return null;
192
- return Object.freeze({ account_id: value.account_id! });
193
- }
194
-
195
- async function chatgptChallengeUrl(pageConnection: ChromeConnection): Promise<string | null> {
196
- const evaluation = await pageConnection.request("Runtime.evaluate", {
197
- expression: `(() => ({ href: location.href, title: document.title, text: document.body.innerText }))()`,
198
- returnByValue: true,
199
- }) as { result: { value?: { href: string; title: string; text: string } } };
200
- const value = evaluation.result.value!;
201
- const pageText = `${value.href}\n${value.title}\n${value.text}`;
202
- if (/cdn-cgi\/challenge-platform|cf_chl|Just a moment|Verify you are human|Cloudflare/i.test(pageText)) return value.href;
203
- return null;
204
- }
205
-
206
164
  function chromeCookies(values: readonly ChromeCookie[], domains: readonly string[]): readonly Cookie[] {
207
165
  return Object.freeze(values.filter((cookie) => domains.some((domain) => cookie.domain === domain || cookie.domain.endsWith(`.${domain}`))).map((cookie) => Object.freeze({
208
166
  domain: cookie.domain,
@@ -222,6 +180,7 @@ export interface ChromeCookieExtraction {
222
180
  readonly domains: readonly string[];
223
181
  readonly ready: (cookies: readonly Cookie[]) => boolean;
224
182
  readonly metadataExpression?: string;
183
+ readonly freshSession?: true;
225
184
  readonly verify: (cookies: readonly Cookie[], metadata: Readonly<Record<string, string>>) => Promise<boolean>;
226
185
  }
227
186
 
@@ -242,10 +201,66 @@ function sleep(milliseconds: number): Promise<void> {
242
201
  return new Promise((resolve) => setTimeout(resolve, milliseconds));
243
202
  }
244
203
 
204
+ async function headlessChromeConnection(environment: NodeEnvironment): Promise<Readonly<{ chrome: ReturnType<typeof spawn>; connection: ChromeConnection }>> {
205
+ const chrome = spawn(chromeExecutable, [`--user-data-dir=${chromeUserDataDir(environment)}`, "--remote-debugging-port=0", "--headless=new", "--no-first-run", "--no-default-browser-check", "about:blank"], { detached: true, stdio: ["ignore", "ignore", "pipe"] });
206
+ const connection = new ChromeConnection(await devtoolsUrl(chrome.stderr!));
207
+ await connection.opened();
208
+ return Object.freeze({ chrome, connection });
209
+ }
210
+
211
+ async function expireServiceCookies(connection: ChromeConnection, domains: readonly string[]): Promise<void> {
212
+ const serviceDomain = (domain: string) => { const bare = domain.startsWith(".") ? domain.slice(1) : domain; return domains.some((value) => bare === value || bare.endsWith(`.${value}`)); };
213
+ const stored = await connection.request("Storage.getCookies") as { cookies: readonly ChromeCookie[] };
214
+ const expiredCopies = stored.cookies.filter((cookie) => serviceDomain(cookie.domain)).map((cookie) => ({
215
+ name: cookie.name,
216
+ value: "",
217
+ domain: cookie.domain,
218
+ path: cookie.path,
219
+ secure: cookie.secure,
220
+ httpOnly: cookie.httpOnly,
221
+ expires: 1,
222
+ ...(cookie.sameSite === undefined ? {} : { sameSite: cookie.sameSite }),
223
+ ...(cookie.sourceScheme === undefined ? {} : { sourceScheme: cookie.sourceScheme }),
224
+ ...(cookie.sourcePort === undefined ? {} : { sourcePort: cookie.sourcePort }),
225
+ ...(cookie.partitionKey === undefined ? {} : { partitionKey: cookie.partitionKey }),
226
+ }));
227
+ if (expiredCopies.length > 0) await connection.request("Storage.setCookies", { cookies: expiredCopies });
228
+ }
229
+
230
+ async function extractDetachedChromeCookies(environment: NodeEnvironment, extraction: ChromeCookieExtraction): Promise<ChromeCookieResult> {
231
+ await mkdir(chromeUserDataDir(environment), { recursive: true });
232
+ const prep = await headlessChromeConnection(environment);
233
+ await expireServiceCookies(prep.connection, extraction.domains);
234
+ await closeChrome(prep.chrome, prep.connection);
235
+ const chrome = spawn(chromeExecutable, [`--user-data-dir=${chromeUserDataDir(environment)}`, "--no-first-run", "--no-default-browser-check", extraction.startUrl], { detached: true, stdio: ["ignore", "ignore", "ignore"] });
236
+ stderr.write(`\nLog in to ${extraction.service} in the opened Chrome window, then quit Chrome (Cmd+Q). Wire picks up the session after Chrome exits.\n`);
237
+ let interrupted = false;
238
+ const interrupt = () => {
239
+ interrupted = true;
240
+ process.kill(-chrome.pid!, "SIGTERM");
241
+ };
242
+ process.on("SIGINT", interrupt);
243
+ await new Promise((resolve) => chrome.once("exit", resolve));
244
+ process.off("SIGINT", interrupt);
245
+ await sleep(500);
246
+ const harvest = await headlessChromeConnection(environment);
247
+ const stored = await harvest.connection.request("Storage.getCookies") as { cookies: readonly ChromeCookie[] };
248
+ await closeChrome(harvest.chrome, harvest.connection);
249
+ const cookies = chromeCookies(stored.cookies, extraction.domains);
250
+ if (interrupted) {
251
+ const save = await confirmSaveLogin();
252
+ if (!save) throw new Error("Login not saved");
253
+ return Object.freeze({ cookies, metadata: Object.freeze({}), manual: true });
254
+ }
255
+ if (!extraction.ready(cookies)) throw new Error(`${extraction.service} login did not complete: the Chrome window was quit before login finished.`);
256
+ return Object.freeze({ cookies, metadata: Object.freeze({}) });
257
+ }
258
+
245
259
  export async function extractChromeCookies(environment: NodeEnvironment, extraction: ChromeCookieExtraction): Promise<ChromeCookieResult> {
260
+ if (extraction.freshSession === true) return extractDetachedChromeCookies(environment, extraction);
246
261
  const profile = chromeUserDataDir(environment);
247
262
  await mkdir(profile, { recursive: true });
248
- const chrome = spawn("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", [...await chromeLaunchArguments(environment, extraction.startUrl)], { detached: true, stdio: ["ignore", "ignore", "pipe"] });
263
+ const chrome = spawn(chromeExecutable, [...await chromeLaunchArguments(environment, extraction.startUrl)], { detached: true, stdio: ["ignore", "ignore", "pipe"] });
249
264
  let interrupted = false;
250
265
  let interrupting = false;
251
266
  let interruptResult: ChromeCookieResult | null | undefined;
@@ -268,7 +283,7 @@ export async function extractChromeCookies(environment: NodeEnvironment, extract
268
283
  const browserUrl = await devtoolsUrl(chrome.stderr!);
269
284
  const connection = new ChromeConnection(browserUrl);
270
285
  await connection.opened();
271
- const pageConnection = extraction.metadataExpression === undefined && extraction.service !== "chatgpt" ? undefined : new ChromeConnection(await pageDevtoolsUrl(browserUrl, extraction.domains));
286
+ const pageConnection = extraction.metadataExpression === undefined ? undefined : new ChromeConnection(await pageDevtoolsUrl(browserUrl, extraction.domains));
272
287
  if (pageConnection !== undefined) await pageConnection.opened();
273
288
  if (pageConnection !== undefined) await Promise.race([sleep(2000), interruptPromise]);
274
289
  const currentResult = async (): Promise<ChromeCookieResult> => {
@@ -291,33 +306,12 @@ export async function extractChromeCookies(environment: NodeEnvironment, extract
291
306
  return interruptResult;
292
307
  };
293
308
  for (;;) {
294
- if (extraction.service === "chatgpt") {
295
- const challengeUrl = await chatgptChallengeUrl(pageConnection!);
296
- const manualResult = await interruptedResult();
297
- if (manualResult !== undefined) return manualResult;
298
- if (challengeUrl !== null) {
299
- await closeChrome(chrome, connection, pageConnection);
300
- process.off("SIGINT", interrupt);
301
- throw new Error(`ChatGPT login is stuck on an HTML challenge: ${challengeUrl}`);
302
- }
303
- }
304
309
  const result = await currentResult();
305
310
  const manualResult = await interruptedResult();
306
311
  if (manualResult !== undefined) return manualResult;
307
312
  if (extraction.ready(result.cookies)) {
308
- let metadata: Readonly<Record<string, string>> = result.metadata;
309
- if (extraction.service === "chatgpt") {
310
- const chatgptMetadata = await Promise.race([chatgptBrowserMetadata(pageConnection!), interruptPromise.then(() => undefined)]);
311
- const interruptedChatgptResult = await interruptedResult();
312
- if (interruptedChatgptResult !== undefined) return interruptedChatgptResult;
313
- if (chatgptMetadata === undefined) continue;
314
- if (chatgptMetadata === null) {
315
- await closeChrome(chrome, connection, pageConnection);
316
- process.off("SIGINT", interrupt);
317
- throw new Error("ChatGPT login is blocked by an HTML challenge. Complete `wire chatgpt login` in the opened Chrome window, then retry.");
318
- }
319
- metadata = chatgptMetadata;
320
- } else if (extraction.metadataExpression !== undefined) {
313
+ const metadata: Readonly<Record<string, string>> = result.metadata;
314
+ if (extraction.metadataExpression !== undefined) {
321
315
  if (Object.keys(metadata).length === 0) {
322
316
  await Promise.race([sleep(1000), interruptPromise]);
323
317
  const interruptedMetadataResult = await interruptedResult();
@@ -325,7 +319,7 @@ export async function extractChromeCookies(environment: NodeEnvironment, extract
325
319
  continue;
326
320
  }
327
321
  }
328
- if (extraction.service !== "chatgpt" && !(await Promise.race([extraction.verify(result.cookies, metadata), interruptPromise.then(() => false)]))) {
322
+ if (!(await Promise.race([extraction.verify(result.cookies, metadata), interruptPromise.then(() => false)]))) {
329
323
  const interruptedVerifyResult = await interruptedResult();
330
324
  if (interruptedVerifyResult !== undefined) return interruptedVerifyResult;
331
325
  await Promise.race([sleep(1000), interruptPromise]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kamilio/wire",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Attach Notion, Google Docs, Slack, Gmail, Asana, ChatGPT, and Zoom resources as local Markdown you can sync.",
5
5
  "keywords": [
6
6
  "markdown",
package/src/auth.ts CHANGED
@@ -267,19 +267,13 @@ export function composeAuth(runtime: RuntimeCapabilities, environment: NodeEnvir
267
267
  await saveCookies(service, state.cookies, state.metadata);
268
268
  return state.result;
269
269
  };
270
- const extract = async (service: AuthService, startUrl: string, domains: readonly string[], ready: (values: readonly Cookie[]) => boolean, metadataExpression?: string) => {
271
- const extraction = { service, startUrl, domains, ready, verify: async (values: readonly Cookie[], metadata: Readonly<Record<string, string>>) => (await verifyCookieState(service, values, metadata)).result !== null, ...(metadataExpression === undefined ? {} : { metadataExpression }) };
270
+ const extract = async (service: AuthService, startUrl: string, domains: readonly string[], ready: (values: readonly Cookie[]) => boolean, metadataExpression?: string, freshSession?: true) => {
271
+ const extraction = { service, startUrl, domains, ready, verify: async (values: readonly Cookie[], metadata: Readonly<Record<string, string>>) => (await verifyCookieState(service, values, metadata)).result !== null, ...(metadataExpression === undefined ? {} : { metadataExpression }), ...(freshSession === undefined ? {} : { freshSession }) };
272
272
  const result = await extractCookies(environment, extraction);
273
273
  if (result.manual === true) {
274
274
  await saveCookies(service, result.cookies, result.metadata);
275
275
  return Object.freeze({ service, identity: Object.freeze({ saved: true }) });
276
276
  }
277
- if (service === "chatgpt") {
278
- await saveCookies(service, result.cookies, result.metadata);
279
- const accountId = result.metadata["account_id"];
280
- if (accountId === undefined) throw new Error("chatgpt cookie authentication failed. Run `wire chatgpt login` once; other commands reuse saved cookies.");
281
- return Object.freeze({ service, identity: Object.freeze({ account_id: accountId }) });
282
- }
283
277
  const verified = await verifyCookieState(service, result.cookies, result.metadata);
284
278
  if (verified.result === null) throw new Error(`${service} cookie authentication failed. Run \`wire ${service} login\` once; other commands reuse saved cookies.`);
285
279
  await saveCookies(service, verified.cookies, verified.metadata);
@@ -293,7 +287,7 @@ export function composeAuth(runtime: RuntimeCapabilities, environment: NodeEnvir
293
287
  return Object.freeze({ service, deleted: true });
294
288
  },
295
289
  extractAsana: () => extract("asana", "https://app.asana.com/", ["asana.com"], (values) => values.some((cookie) => cookie.domain === ".asana.com" || cookie.domain.endsWith(".asana.com"))),
296
- extractChatgpt: () => extract("chatgpt", "https://chatgpt.com/", ["chatgpt.com", "openai.com"], requiredReady(["oai-did", "__Secure-next-auth.session-token"])),
290
+ extractChatgpt: () => extract("chatgpt", "https://chatgpt.com/", ["chatgpt.com", "openai.com"], (values) => values.some((cookie) => cookie.name === "oai-did") && values.some((cookie) => cookie.name === "__Secure-next-auth.session-token" || cookie.name === "__Secure-next-auth.session-token.0"), undefined, true),
297
291
  extractGmail: () => extract("gmail", "https://mail.google.com/mail/u/0/", ["google.com"], googleReady),
298
292
  extractGoogleDocs: () => extract("google-docs", "https://docs.google.com/", ["google.com"], googleReady),
299
293
  extractNotion: () => extract("notion", "https://www.notion.so/login", ["notion.so", "notion.com"], requiredReady(["token_v2", "notion_user_id", "notion_users"])),