@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.
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +3 -10
- package/dist/auth.js.map +1 -1
- package/dist/executable.d.ts.map +1 -1
- package/dist/executable.js +33 -8
- package/dist/executable.js.map +1 -1
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +18 -7
- package/dist/hooks.js.map +1 -1
- package/node_modules/provider-chatgpt/dist/chatgpt.d.ts.map +1 -1
- package/node_modules/provider-chatgpt/dist/chatgpt.js +22 -3
- package/node_modules/provider-chatgpt/dist/chatgpt.js.map +1 -1
- package/node_modules/provider-chatgpt/src/chatgpt.ts +20 -3
- package/node_modules/provider-gmail/dist/gmail.d.ts.map +1 -1
- package/node_modules/provider-gmail/dist/gmail.js +2 -0
- package/node_modules/provider-gmail/dist/gmail.js.map +1 -1
- package/node_modules/provider-gmail/src/gmail.ts +1 -0
- package/node_modules/provider-google-docs/dist/google-docs.d.ts.map +1 -1
- package/node_modules/provider-google-docs/dist/google-docs.js +9 -6
- package/node_modules/provider-google-docs/dist/google-docs.js.map +1 -1
- package/node_modules/provider-google-docs/src/google-docs.ts +10 -7
- package/node_modules/provider-notion/dist/notion-sync.d.ts +1 -1
- package/node_modules/provider-notion/dist/notion-sync.d.ts.map +1 -1
- package/node_modules/provider-notion/dist/notion-sync.js +41 -12
- package/node_modules/provider-notion/dist/notion-sync.js.map +1 -1
- package/node_modules/provider-notion/dist/notion.js +1 -1
- package/node_modules/provider-notion/dist/notion.js.map +1 -1
- package/node_modules/provider-notion/src/notion-sync.ts +41 -12
- package/node_modules/provider-notion/src/notion.ts +1 -1
- package/node_modules/wire-core/dist/core/transform.d.ts +1 -0
- package/node_modules/wire-core/dist/core/transform.d.ts.map +1 -1
- package/node_modules/wire-core/dist/core/transform.js +4 -0
- package/node_modules/wire-core/dist/core/transform.js.map +1 -1
- package/node_modules/wire-core/dist/operations.d.ts.map +1 -1
- package/node_modules/wire-core/dist/operations.js +8 -6
- package/node_modules/wire-core/dist/operations.js.map +1 -1
- package/node_modules/wire-core/dist/runtime/chrome.d.ts +1 -0
- package/node_modules/wire-core/dist/runtime/chrome.d.ts.map +1 -1
- package/node_modules/wire-core/dist/runtime/chrome.js +64 -79
- package/node_modules/wire-core/dist/runtime/chrome.js.map +1 -1
- package/node_modules/wire-core/src/core/transform.ts +5 -1
- package/node_modules/wire-core/src/operations.ts +8 -6
- package/node_modules/wire-core/src/runtime/chrome.ts +69 -75
- package/package.json +1 -1
- package/src/auth.ts +3 -9
- package/src/executable.ts +33 -8
- 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(
|
|
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
|
|
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
|
-
|
|
272
|
-
if (extraction.
|
|
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 (
|
|
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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAKzC,SAAS,gBAAgB,CAAC,WAA4B,EAAE,IAAY;IAClE,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IAC3F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,WAA4B;IAC5D,OAAO,GAAG,gBAAgB,CAAC,WAAW,EAAE,MAAM,CAAC,0CAA0C,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAA4B,EAAE,QAAgB;IACxF,MAAM,WAAW,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,mBAAmB,WAAW,EAAE;QAChC,2BAA2B;QAC3B,gBAAgB;QAChB,4BAA4B;QAC5B,wBAAwB;QACxB,QAAQ;KACT,CAAC,CAAC;AACL,CAAC;AAED,MAAM,gBAAgB,GAAG,8DAA8D,CAAC;AA0BxF,MAAM,gBAAgB;IACX,MAAM,CAAY;IAClB,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IACpD,MAAM,GAAG,CAAC,CAAC;IACX,MAAM,GAAG,KAAK,CAAC;IAEf,YAAY,GAAW;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,aAAa,GAAG,GAAG,EAAE;YACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACvE,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACrB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAAE,KAAK,MAAM,KAAK,IAAI,MAAM;oBAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3F,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAA0G,CAAC;YAC3J,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC/C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;wBACzB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAG,CAAC;wBAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;4BAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBAC5D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAO,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC;gBACD,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;;gBAC5D,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,SAA4C,EAAE;QACpE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACvB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAc;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF;AAED,SAAS,WAAW,CAAC,MAA6B;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YAClC,QAAQ,IAAI,KAAK,CAAC;YAClB,MAAM,KAAK,GAAG,uCAAuC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrE,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,wHAAwH,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IACnM,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAgC,EAAE,UAA4B,EAAE,cAAiC;IAC1H,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,IAAI,cAAc,KAAK,SAAS;QAAE,cAAc,CAAC,KAAK,EAAE,CAAC;IACzD,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAI,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,MAAM,CAAC;AACf,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,OAA0B;IAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,GAAG,YAAY,CAAC;IACjC,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;IACrB,QAAQ,CAAC,IAAI,GAAG,EAAE,CAAC;IACnB,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAuG,CAAC;IAC1J,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAE,CAAC,oBAAoB,CAAC;AAC5M,CAAC;AAED,SAAS,aAAa,CAAC,MAA+B,EAAE,OAA0B;IAChF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QACvK,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;QAChD,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;QAC5D,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC,CAAC,CAAC;AACP,CAAC;AAkBD,KAAK,UAAU,gBAAgB;IAC7B,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,qCAAqC,CAAC,CAAC;IAC9E,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,WAA4B;IAClE,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC,mBAAmB,iBAAiB,CAAC,WAAW,CAAC,EAAE,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACrQ,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,MAAO,CAAC,CAAC,CAAC;IAC3E,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,UAA4B,EAAE,OAA0B;IAC1F,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,EAAE,GAAG,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5L,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAyC,CAAC;IACtG,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACrG,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,CAAC;QACV,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvE,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;QACnF,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7E,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;KACpF,CAAC,CAAC,CAAC;IACJ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,UAAU,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;AAC3G,CAAC;AAED,KAAK,UAAU,4BAA4B,CAAC,WAA4B,EAAE,UAAkC;IAC1G,MAAM,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IACzD,MAAM,oBAAoB,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAChE,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC,mBAAmB,iBAAiB,CAAC,WAAW,CAAC,EAAE,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9N,MAAM,CAAC,KAAK,CAAC,eAAe,UAAU,CAAC,OAAO,yGAAyG,CAAC,CAAC;IACzJ,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,WAAW,GAAG,IAAI,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAI,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAyC,CAAC;IAC9G,MAAM,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAClE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,CAAC,OAAO,4EAA4E,CAAC,CAAC;IACnJ,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAA4B,EAAE,UAAkC;IACzG,IAAI,UAAU,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO,4BAA4B,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACpK,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,eAAsD,CAAC;IAC3D,IAAI,gBAAgB,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,GAAG,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,IAAI,cAA+D,CAAC;IACpE,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,IAAI,CAAC,WAAW,IAAI,YAAY,IAAI,eAAe,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS;YAAE,OAAO;QAC1G,YAAY,GAAG,IAAI,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACtC,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpH,gBAAgB,EAAE,CAAC;IACrB,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,WAAW,GAAG,IAAI,CAAC;QACnB,KAAK,gBAAgB,EAAE,CAAC;IAC1B,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,MAAO,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;IAC1B,MAAM,cAAc,GAAG,UAAU,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,MAAM,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7J,IAAI,cAAc,KAAK,SAAS;QAAE,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;IAChE,IAAI,cAAc,KAAK,SAAS;QAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACtF,MAAM,aAAa,GAAG,KAAK,IAAiC,EAAE;QAC5D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAyC,CAAC;QACtG,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,QAAQ,GAAqC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,UAAU,CAAC,kBAAkB,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YAChF,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,kBAAkB,EAAE,aAAa,EAAE,IAAI,EAAE,CAAmD,CAAC;YAC1L,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,cAAc,GAAG,aAAa,CAAC;IAC/B,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,iBAAiB,GAAG,KAAK,IAA6C,EAAE;QAC5E,IAAI,eAAe,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACpD,MAAM,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjC,IAAI,eAAe,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACjE,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC;IACF,SAAS,CAAC;QACR,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,MAAM,YAAY,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAC/C,IAAI,YAAY,KAAK,SAAS;YAAE,OAAO,YAAY,CAAC;QACpD,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAqC,MAAM,CAAC,QAAQ,CAAC;YACnE,IAAI,UAAU,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBAChD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;oBACpD,MAAM,yBAAyB,GAAG,MAAM,iBAAiB,EAAE,CAAC;oBAC5D,IAAI,yBAAyB,KAAK,SAAS;wBAAE,OAAO,yBAAyB,CAAC;oBAC9E,SAAS;gBACX,CAAC;YACH,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7G,MAAM,uBAAuB,GAAG,MAAM,iBAAiB,EAAE,CAAC;gBAC1D,IAAI,uBAAuB,KAAK,SAAS;oBAAE,OAAO,uBAAuB,CAAC;gBAC1E,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBACpD,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,EAAE,CAAC;gBACzD,IAAI,sBAAsB,KAAK,SAAS;oBAAE,OAAO,sBAAsB,CAAC;gBACxE,SAAS;YACX,CAAC;YACD,MAAM,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACjC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACpD,MAAM,sBAAsB,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACzD,IAAI,sBAAsB,KAAK,SAAS;YAAE,OAAO,sBAAsB,CAAC;IAC1E,CAAC;AACH,CAAC"}
|
|
@@ -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
|
|
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 (
|
|
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
|
|
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(
|
|
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
|
|
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
|
-
|
|
309
|
-
if (extraction.
|
|
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 (
|
|
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
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"],
|
|
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"])),
|