latchkey 3.7.0 → 3.8.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.
- package/dist/src/playwrightUtils.d.ts +57 -0
- package/dist/src/playwrightUtils.d.ts.map +1 -1
- package/dist/src/playwrightUtils.js +247 -8
- package/dist/src/playwrightUtils.js.map +1 -1
- package/dist/src/services/core/base.d.ts +55 -16
- package/dist/src/services/core/base.d.ts.map +1 -1
- package/dist/src/services/core/base.js +119 -31
- package/dist/src/services/core/base.js.map +1 -1
- package/dist/src/services/github.d.ts +2 -1
- package/dist/src/services/github.d.ts.map +1 -1
- package/dist/src/services/github.js +13 -0
- package/dist/src/services/github.js.map +1 -1
- package/dist/src/services/huggingface.d.ts +2 -1
- package/dist/src/services/huggingface.d.ts.map +1 -1
- package/dist/src/services/huggingface.js +13 -0
- package/dist/src/services/huggingface.js.map +1 -1
- package/dist/src/services/linear.d.ts +2 -1
- package/dist/src/services/linear.d.ts.map +1 -1
- package/dist/src/services/linear.js +14 -0
- package/dist/src/services/linear.js.map +1 -1
- package/dist/src/services/ngrok.d.ts +2 -1
- package/dist/src/services/ngrok.d.ts.map +1 -1
- package/dist/src/services/ngrok.js +12 -0
- package/dist/src/services/ngrok.js.map +1 -1
- package/dist/src/services/openrouter.d.ts +2 -1
- package/dist/src/services/openrouter.d.ts.map +1 -1
- package/dist/src/services/openrouter.js +12 -0
- package/dist/src/services/openrouter.js.map +1 -1
- package/dist/src/services/tailscale.d.ts +2 -1
- package/dist/src/services/tailscale.d.ts.map +1 -1
- package/dist/src/services/tailscale.js +18 -0
- package/dist/src/services/tailscale.js.map +1 -1
- package/dist/src/services/todoist.d.ts +2 -1
- package/dist/src/services/todoist.d.ts.map +1 -1
- package/dist/src/services/todoist.js +6 -0
- package/dist/src/services/todoist.js.map +1 -1
- package/dist/src/services/zoom.d.ts +2 -1
- package/dist/src/services/zoom.d.ts.map +1 -1
- package/dist/src/services/zoom.js +55 -55
- package/dist/src/services/zoom.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tests/lint.test.js +1 -1
- package/dist/tests/manualCompletion.test.d.ts +10 -0
- package/dist/tests/manualCompletion.test.d.ts.map +1 -0
- package/dist/tests/manualCompletion.test.js +221 -0
- package/dist/tests/manualCompletion.test.js.map +1 -0
- package/dist/tests/manualCredentialForms.test.d.ts +8 -0
- package/dist/tests/manualCredentialForms.test.d.ts.map +1 -0
- package/dist/tests/manualCredentialForms.test.js +64 -0
- package/dist/tests/manualCredentialForms.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -45,6 +45,14 @@ export declare function withTempBrowserContext<T>(encryptedStorage: EncryptedSto
|
|
|
45
45
|
* unlike fill() which sets the value directly.
|
|
46
46
|
*/
|
|
47
47
|
export declare function typeLikeHuman(page: Page, locator: Locator, text: string): Promise<void>;
|
|
48
|
+
/** One value the user can paste back when the automation could not get it. */
|
|
49
|
+
export interface CredentialFormField {
|
|
50
|
+
/** Key the submitted value appears under. */
|
|
51
|
+
readonly name: string;
|
|
52
|
+
readonly label: string;
|
|
53
|
+
/** Example or explanation shown under the input. */
|
|
54
|
+
readonly hint?: string;
|
|
55
|
+
}
|
|
48
56
|
/**
|
|
49
57
|
* Show a spinner overlay that hides page content from the user.
|
|
50
58
|
* The overlay persists across page navigations within the browser context.
|
|
@@ -59,4 +67,53 @@ export declare function typeLikeHuman(page: Page, locator: Locator, text: string
|
|
|
59
67
|
* type, so longer explanations do not read like a ragged centered block.
|
|
60
68
|
*/
|
|
61
69
|
export declare function showSpinnerPage(context: BrowserContext, message: string, details?: string): Promise<Page | null>;
|
|
70
|
+
export declare class CredentialFormFieldMissingError extends Error {
|
|
71
|
+
constructor(fieldName: string);
|
|
72
|
+
}
|
|
73
|
+
/** Non-empty values the user submitted, keyed by field name. */
|
|
74
|
+
export declare class CredentialFormValues {
|
|
75
|
+
private readonly values;
|
|
76
|
+
constructor(values: ReadonlyMap<string, string>);
|
|
77
|
+
get(fieldName: string): string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Turn what the form handed over into values, or null if it is not a complete
|
|
81
|
+
* set. The form checks completeness too; this is the Node-side half of that,
|
|
82
|
+
* so callers can rely on every field having a value.
|
|
83
|
+
*/
|
|
84
|
+
export declare function parseSubmittedCredentialValues(submitted: unknown, fields: readonly CredentialFormField[]): CredentialFormValues | null;
|
|
85
|
+
/** What the caller makes of a submission: a result, or a problem to report back. */
|
|
86
|
+
export type CredentialFormDecision<T> = {
|
|
87
|
+
readonly accepted: T;
|
|
88
|
+
} | {
|
|
89
|
+
readonly problem: string;
|
|
90
|
+
};
|
|
91
|
+
export interface CredentialRequest<T> {
|
|
92
|
+
readonly context: BrowserContext;
|
|
93
|
+
/**
|
|
94
|
+
* Page to show the request on, typically the spinner the user has been
|
|
95
|
+
* staring at. A page is opened when there is none (or it is already gone).
|
|
96
|
+
*/
|
|
97
|
+
readonly spinnerPage: Page | null;
|
|
98
|
+
readonly message: string;
|
|
99
|
+
readonly details: string;
|
|
100
|
+
readonly fields: readonly CredentialFormField[];
|
|
101
|
+
/**
|
|
102
|
+
* Decides what a submission is worth, e.g. by checking the credentials it
|
|
103
|
+
* builds against the service. A returned problem is shown in the form, which
|
|
104
|
+
* then lets the user correct and submit again.
|
|
105
|
+
*/
|
|
106
|
+
readonly decide: (values: CredentialFormValues) => Promise<CredentialFormDecision<T>>;
|
|
107
|
+
/** How long the request stays up before it is given up on. */
|
|
108
|
+
readonly timeoutMs: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Ask the user to paste in credentials the automation could not get, and wait
|
|
112
|
+
* for them to submit something acceptable.
|
|
113
|
+
*
|
|
114
|
+
* Returns null when nothing usable arrived: the user closed the browser, or the
|
|
115
|
+
* request timed out. There is no polling — the page calls in when the user
|
|
116
|
+
* submits, and its "checking..." state is resolved by what `decide` says.
|
|
117
|
+
*/
|
|
118
|
+
export declare function requestCredentialsFromUser<T>(request: CredentialRequest<T>): Promise<T | null>;
|
|
62
119
|
//# sourceMappingURL=playwrightUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightUtils.d.ts","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAED,qBAAa,iCAAkC,SAAQ,KAAK;;CAQ3D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAUjD;AAED,qBAAa,6BAA8B,SAAQ,KAAK;gBAC1C,WAAW,EAAE,MAAM,EAAE,cAAc,GAAE,KAAK,GAAG,YAAoB;CAM9E;AAMD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAiB,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAItF;AA2CD;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAClD,OAAO,CAAC,CAAC,CAAC,CAoEZ;AAMD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7F;
|
|
1
|
+
{"version":3,"file":"playwrightUtils.d.ts","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -176,11 +176,18 @@ export async function typeLikeHuman(page, locator, text) {
|
|
|
176
176
|
await page.waitForTimeout(delay);
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
|
-
|
|
180
|
-
|
|
179
|
+
/**
|
|
180
|
+
* Script that creates the latchkey overlay, designed to run in browser context.
|
|
181
|
+
*
|
|
182
|
+
* The texts are injected as JSON literals and assigned as text rather than
|
|
183
|
+
* markup, so an error message that happens to contain a backtick or an angle
|
|
184
|
+
* bracket cannot break the script or the page.
|
|
185
|
+
*/
|
|
186
|
+
function createOverlayScript(content) {
|
|
187
|
+
const { message, details, showSpinner, formFields } = content;
|
|
181
188
|
return `
|
|
182
189
|
(() => {
|
|
183
|
-
|
|
190
|
+
document.getElementById('latchkey-spinner-overlay')?.remove();
|
|
184
191
|
const overlay = document.createElement('div');
|
|
185
192
|
overlay.id = 'latchkey-spinner-overlay';
|
|
186
193
|
overlay.innerHTML = \`
|
|
@@ -215,6 +222,10 @@ function createSpinnerOverlayScript(message, details) {
|
|
|
215
222
|
text-align: center;
|
|
216
223
|
max-width: 80%;
|
|
217
224
|
white-space: pre-line;
|
|
225
|
+
/* The text is there to be read from and copied (URLs, mostly), which
|
|
226
|
+
needs the pointer to reach it — the overlay itself stays inert. */
|
|
227
|
+
pointer-events: auto;
|
|
228
|
+
user-select: text;
|
|
218
229
|
}
|
|
219
230
|
#latchkey-spinner-overlay .details {
|
|
220
231
|
margin-top: 44px;
|
|
@@ -222,16 +233,140 @@ function createSpinnerOverlayScript(message, details) {
|
|
|
222
233
|
font-size: 13px;
|
|
223
234
|
line-height: 1.6;
|
|
224
235
|
text-align: left;
|
|
225
|
-
max-width:
|
|
236
|
+
max-width: 460px;
|
|
237
|
+
white-space: pre-line;
|
|
238
|
+
pointer-events: auto;
|
|
239
|
+
user-select: text;
|
|
240
|
+
}
|
|
241
|
+
#latchkey-spinner-overlay form {
|
|
242
|
+
margin-top: 28px;
|
|
243
|
+
width: 460px;
|
|
244
|
+
max-width: 80%;
|
|
245
|
+
display: flex;
|
|
246
|
+
flex-direction: column;
|
|
247
|
+
gap: 14px;
|
|
248
|
+
pointer-events: auto;
|
|
249
|
+
font-size: 13px;
|
|
250
|
+
color: #555;
|
|
251
|
+
}
|
|
252
|
+
#latchkey-spinner-overlay form label {
|
|
253
|
+
display: block;
|
|
254
|
+
margin-bottom: 4px;
|
|
255
|
+
}
|
|
256
|
+
#latchkey-spinner-overlay form input {
|
|
257
|
+
width: 100%;
|
|
258
|
+
box-sizing: border-box;
|
|
259
|
+
padding: 8px 10px;
|
|
260
|
+
border: 1px solid #cfcfcf;
|
|
261
|
+
border-radius: 4px;
|
|
262
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
263
|
+
font-size: 13px;
|
|
264
|
+
background: #fff;
|
|
265
|
+
}
|
|
266
|
+
#latchkey-spinner-overlay form .hint {
|
|
267
|
+
margin-top: 4px;
|
|
268
|
+
color: #8a8a8a;
|
|
269
|
+
font-size: 12px;
|
|
270
|
+
}
|
|
271
|
+
#latchkey-spinner-overlay form button {
|
|
272
|
+
align-self: flex-start;
|
|
273
|
+
padding: 8px 16px;
|
|
274
|
+
border: none;
|
|
275
|
+
border-radius: 4px;
|
|
276
|
+
background: #007bff;
|
|
277
|
+
color: #fff;
|
|
278
|
+
font-size: 13px;
|
|
279
|
+
cursor: pointer;
|
|
280
|
+
}
|
|
281
|
+
#latchkey-spinner-overlay form button:disabled {
|
|
282
|
+
background: #9dc7f5;
|
|
283
|
+
cursor: default;
|
|
284
|
+
}
|
|
285
|
+
#latchkey-spinner-overlay .form-status {
|
|
286
|
+
color: #c0392b;
|
|
287
|
+
font-size: 13px;
|
|
288
|
+
min-height: 18px;
|
|
289
|
+
white-space: pre-line;
|
|
290
|
+
}
|
|
291
|
+
#latchkey-spinner-overlay .form-status.accepted {
|
|
292
|
+
color: #1e7e34;
|
|
226
293
|
}
|
|
227
294
|
@keyframes latchkey-spin {
|
|
228
295
|
to { transform: rotate(360deg); }
|
|
229
296
|
}
|
|
230
297
|
</style>
|
|
231
|
-
<div class="spinner"></div>
|
|
232
|
-
<div class="message"
|
|
233
|
-
|
|
298
|
+
${showSpinner ? '<div class="spinner"></div>' : ''}
|
|
299
|
+
<div class="message"></div>
|
|
300
|
+
<div class="details"></div>
|
|
234
301
|
\`;
|
|
302
|
+
overlay.querySelector('.message').textContent = ${JSON.stringify(message)};
|
|
303
|
+
const detailsText = ${JSON.stringify(details)};
|
|
304
|
+
const detailsElement = overlay.querySelector('.details');
|
|
305
|
+
if (detailsText === '') {
|
|
306
|
+
detailsElement.remove();
|
|
307
|
+
} else {
|
|
308
|
+
detailsElement.textContent = detailsText;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const fields = ${JSON.stringify(formFields)};
|
|
312
|
+
if (fields.length > 0) {
|
|
313
|
+
const form = document.createElement('form');
|
|
314
|
+
const inputs = fields.map((field) => {
|
|
315
|
+
const wrapper = document.createElement('div');
|
|
316
|
+
const label = document.createElement('label');
|
|
317
|
+
label.textContent = field.label;
|
|
318
|
+
const input = document.createElement('input');
|
|
319
|
+
input.type = 'text';
|
|
320
|
+
input.autocomplete = 'off';
|
|
321
|
+
input.spellcheck = false;
|
|
322
|
+
label.appendChild(input);
|
|
323
|
+
wrapper.appendChild(label);
|
|
324
|
+
if (field.hint) {
|
|
325
|
+
const hint = document.createElement('div');
|
|
326
|
+
hint.className = 'hint';
|
|
327
|
+
hint.textContent = field.hint;
|
|
328
|
+
wrapper.appendChild(hint);
|
|
329
|
+
}
|
|
330
|
+
form.appendChild(wrapper);
|
|
331
|
+
return { name: field.name, input: input };
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
const status = document.createElement('div');
|
|
335
|
+
status.className = 'form-status';
|
|
336
|
+
const submit = document.createElement('button');
|
|
337
|
+
submit.type = 'submit';
|
|
338
|
+
submit.textContent = 'Use these credentials';
|
|
339
|
+
form.appendChild(submit);
|
|
340
|
+
form.appendChild(status);
|
|
341
|
+
|
|
342
|
+
form.addEventListener('submit', async (event) => {
|
|
343
|
+
event.preventDefault();
|
|
344
|
+
const values = {};
|
|
345
|
+
for (const entry of inputs) {
|
|
346
|
+
values[entry.name] = entry.input.value.trim();
|
|
347
|
+
}
|
|
348
|
+
const isComplete = inputs.every((entry) => values[entry.name] !== '');
|
|
349
|
+
if (!isComplete) {
|
|
350
|
+
status.textContent = 'Please fill in every field.';
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
status.className = 'form-status';
|
|
354
|
+
status.textContent = 'Checking the credentials...';
|
|
355
|
+
submit.disabled = true;
|
|
356
|
+
const decision = await window['${SUBMIT_CREDENTIALS_BINDING}'](values);
|
|
357
|
+
if (decision && decision.problem) {
|
|
358
|
+
status.textContent = decision.problem;
|
|
359
|
+
submit.disabled = false;
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
status.className = 'form-status accepted';
|
|
363
|
+
status.textContent = 'Credentials accepted. This window can be closed.';
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
overlay.appendChild(form);
|
|
367
|
+
setTimeout(() => { inputs[0].input.focus(); }, 0);
|
|
368
|
+
}
|
|
369
|
+
|
|
235
370
|
document.body.appendChild(overlay);
|
|
236
371
|
})()
|
|
237
372
|
`;
|
|
@@ -254,8 +389,112 @@ export async function showSpinnerPage(context, message, details = '') {
|
|
|
254
389
|
return null;
|
|
255
390
|
}
|
|
256
391
|
const spinnerPage = await context.newPage();
|
|
257
|
-
await spinnerPage.evaluate(
|
|
392
|
+
await spinnerPage.evaluate(createOverlayScript({ message, details, showSpinner: true, formFields: [] }));
|
|
258
393
|
await spinnerPage.bringToFront();
|
|
259
394
|
return spinnerPage;
|
|
260
395
|
}
|
|
396
|
+
/** Name the credential form calls to hand what the user typed back to latchkey. */
|
|
397
|
+
const SUBMIT_CREDENTIALS_BINDING = '__latchkeySubmitCredentials';
|
|
398
|
+
export class CredentialFormFieldMissingError extends Error {
|
|
399
|
+
constructor(fieldName) {
|
|
400
|
+
super(`The credential form did not provide a value for '${fieldName}'.`);
|
|
401
|
+
this.name = 'CredentialFormFieldMissingError';
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/** Non-empty values the user submitted, keyed by field name. */
|
|
405
|
+
export class CredentialFormValues {
|
|
406
|
+
values;
|
|
407
|
+
constructor(values) {
|
|
408
|
+
this.values = values;
|
|
409
|
+
}
|
|
410
|
+
get(fieldName) {
|
|
411
|
+
const value = this.values.get(fieldName);
|
|
412
|
+
if (value === undefined) {
|
|
413
|
+
throw new CredentialFormFieldMissingError(fieldName);
|
|
414
|
+
}
|
|
415
|
+
return value;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Turn what the form handed over into values, or null if it is not a complete
|
|
420
|
+
* set. The form checks completeness too; this is the Node-side half of that,
|
|
421
|
+
* so callers can rely on every field having a value.
|
|
422
|
+
*/
|
|
423
|
+
export function parseSubmittedCredentialValues(submitted, fields) {
|
|
424
|
+
if (typeof submitted !== 'object' || submitted === null) {
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
const submittedValues = submitted;
|
|
428
|
+
const values = new Map();
|
|
429
|
+
for (const field of fields) {
|
|
430
|
+
const value = submittedValues[field.name];
|
|
431
|
+
if (typeof value !== 'string' || value === '') {
|
|
432
|
+
return null;
|
|
433
|
+
}
|
|
434
|
+
values.set(field.name, value);
|
|
435
|
+
}
|
|
436
|
+
return new CredentialFormValues(values);
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Ask the user to paste in credentials the automation could not get, and wait
|
|
440
|
+
* for them to submit something acceptable.
|
|
441
|
+
*
|
|
442
|
+
* Returns null when nothing usable arrived: the user closed the browser, or the
|
|
443
|
+
* request timed out. There is no polling — the page calls in when the user
|
|
444
|
+
* submits, and its "checking..." state is resolved by what `decide` says.
|
|
445
|
+
*/
|
|
446
|
+
export async function requestCredentialsFromUser(request) {
|
|
447
|
+
const { context, spinnerPage, message, details, fields, decide, timeoutMs } = request;
|
|
448
|
+
const page = spinnerPage !== null && !spinnerPage.isClosed() ? spinnerPage : await context.newPage();
|
|
449
|
+
let resolveAccepted = () => {
|
|
450
|
+
/* replaced below */
|
|
451
|
+
};
|
|
452
|
+
const accepted = new Promise((resolve) => {
|
|
453
|
+
resolveAccepted = resolve;
|
|
454
|
+
});
|
|
455
|
+
// Listened for before the form goes up: a browser closed while it is being
|
|
456
|
+
// rendered should end the wait just the same.
|
|
457
|
+
const abandoned = new Promise((resolve) => {
|
|
458
|
+
const giveUp = () => {
|
|
459
|
+
resolve(null);
|
|
460
|
+
};
|
|
461
|
+
page.on('close', giveUp);
|
|
462
|
+
context.on('close', giveUp);
|
|
463
|
+
context.browser()?.on('disconnected', giveUp);
|
|
464
|
+
});
|
|
465
|
+
await page.exposeFunction(SUBMIT_CREDENTIALS_BINDING, async (submitted) => {
|
|
466
|
+
const values = parseSubmittedCredentialValues(submitted, fields);
|
|
467
|
+
if (values === null) {
|
|
468
|
+
return { problem: 'Please fill in every field.' };
|
|
469
|
+
}
|
|
470
|
+
let decision;
|
|
471
|
+
try {
|
|
472
|
+
decision = await decide(values);
|
|
473
|
+
}
|
|
474
|
+
catch (error) {
|
|
475
|
+
// The page is waiting for an answer, so failures are reported as
|
|
476
|
+
// problems rather than left to become an unhandled rejection there.
|
|
477
|
+
return { problem: error instanceof Error ? error.message : 'These values cannot be used.' };
|
|
478
|
+
}
|
|
479
|
+
if ('problem' in decision) {
|
|
480
|
+
return { problem: decision.problem };
|
|
481
|
+
}
|
|
482
|
+
resolveAccepted(decision.accepted);
|
|
483
|
+
return { accepted: true };
|
|
484
|
+
});
|
|
485
|
+
await page.evaluate(createOverlayScript({ message, details, showSpinner: false, formFields: fields }));
|
|
486
|
+
await page.bringToFront();
|
|
487
|
+
let timer;
|
|
488
|
+
const timedOut = new Promise((resolve) => {
|
|
489
|
+
timer = setTimeout(() => {
|
|
490
|
+
resolve(null);
|
|
491
|
+
}, timeoutMs);
|
|
492
|
+
});
|
|
493
|
+
try {
|
|
494
|
+
return await Promise.race([accepted, abandoned, timedOut]);
|
|
495
|
+
}
|
|
496
|
+
finally {
|
|
497
|
+
clearTimeout(timer);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
261
500
|
//# sourceMappingURL=playwrightUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightUtils.js","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"playwrightUtils.js","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,25 @@ import type { Browser, BrowserContext, Page, Response } from 'playwright';
|
|
|
5
5
|
import type { z, ZodError, ZodTypeAny } from 'zod';
|
|
6
6
|
import { ApiCredentialStatus, ApiCredentials } from '../../apiCredentials/base.js';
|
|
7
7
|
import { EncryptedStorage } from '../../encryptedStorage.js';
|
|
8
|
-
import { type BrowserLaunchOptions } from '../../playwrightUtils.js';
|
|
8
|
+
import { type BrowserLaunchOptions, type CredentialFormField, type CredentialFormValues } from '../../playwrightUtils.js';
|
|
9
|
+
/**
|
|
10
|
+
* Way out of a failed automation: the values the user can produce by hand and
|
|
11
|
+
* paste back, and how to turn them into credentials.
|
|
12
|
+
*
|
|
13
|
+
* The build step only shapes the values; whether they actually work is decided
|
|
14
|
+
* by the service's credential check, which runs before they are accepted.
|
|
15
|
+
*/
|
|
16
|
+
export interface ManualCredentialForm {
|
|
17
|
+
/**
|
|
18
|
+
* What the user can do by hand, e.g. "create a token in Settings →
|
|
19
|
+
* Developer". Shown above the fields, so it should read as instructions
|
|
20
|
+
* rather than as a description. Don't forget that the breakage might have
|
|
21
|
+
* occurred in the middle of the process (not necessarily at the start).
|
|
22
|
+
*/
|
|
23
|
+
readonly instructions: string;
|
|
24
|
+
readonly fields: readonly CredentialFormField[];
|
|
25
|
+
buildCredentials(values: CredentialFormValues): ApiCredentials;
|
|
26
|
+
}
|
|
9
27
|
export declare class NoCurlCredentialsNotSupportedError extends Error {
|
|
10
28
|
constructor(serviceName: string);
|
|
11
29
|
}
|
|
@@ -193,15 +211,6 @@ export declare abstract class ServiceSession {
|
|
|
193
211
|
* Wait until the browser login phase is complete.
|
|
194
212
|
*/
|
|
195
213
|
private waitForLoginComplete;
|
|
196
|
-
/**
|
|
197
|
-
* Optionally diagnose a timeout error that occurred during credential finalization.
|
|
198
|
-
*
|
|
199
|
-
* Services can override this to inspect the page state and return a more
|
|
200
|
-
* specific error (e.g., checking for permission denied messages).
|
|
201
|
-
* If this returns an error, it will be thrown instead of the generic
|
|
202
|
-
* LoginFailedError. If it returns null, the original timeout error message is used.
|
|
203
|
-
*/
|
|
204
|
-
protected diagnoseTimeoutError(_context: BrowserContext, _originalError: Error): Promise<Error | null>;
|
|
205
214
|
/**
|
|
206
215
|
* Optional preparation step before login.
|
|
207
216
|
* Services can override this to perform setup (e.g., creating OAuth clients).
|
|
@@ -270,16 +279,26 @@ export declare function buildFollowupSpinnerDetails(displayName: string, followu
|
|
|
270
279
|
* (e.g., navigating to settings and creating an API key).
|
|
271
280
|
*/
|
|
272
281
|
export declare abstract class BrowserFollowupServiceSession extends ServiceSession {
|
|
273
|
-
private followupSpinnerPage;
|
|
274
282
|
/** What the followup does in the user's account, shown on the spinner page. */
|
|
275
283
|
protected abstract readonly followupWork: FollowupWork;
|
|
276
284
|
/**
|
|
277
|
-
*
|
|
278
|
-
* or
|
|
279
|
-
* a
|
|
280
|
-
*
|
|
285
|
+
* Page hiding the automation from the user, for sessions that show one, or
|
|
286
|
+
* null while none is up (or when the spinner is disabled). It doubles as the
|
|
287
|
+
* place where a failure is explained to the user.
|
|
288
|
+
*
|
|
289
|
+
* Subclasses that temporarily surface a real page to the user (e.g. to have
|
|
290
|
+
* terms accepted) bring this page back to the front afterwards.
|
|
281
291
|
*/
|
|
282
|
-
protected
|
|
292
|
+
protected spinnerPage: Page | null;
|
|
293
|
+
/**
|
|
294
|
+
* Form shown on the failure notice for the user to paste the credentials they
|
|
295
|
+
* created by hand into.
|
|
296
|
+
*
|
|
297
|
+
* Public so the fields and instructions can be inspected without running a
|
|
298
|
+
* browser — which is how the tests check that every session that should offer
|
|
299
|
+
* one does, and that its builder agrees with its field names.
|
|
300
|
+
*/
|
|
301
|
+
readonly manualCredentialForm?: ManualCredentialForm;
|
|
283
302
|
/**
|
|
284
303
|
* Perform actions in the browser to finalize and extract API credentials.
|
|
285
304
|
* This runs in the same browser session used for login.
|
|
@@ -288,5 +307,25 @@ export declare abstract class BrowserFollowupServiceSession extends ServiceSessi
|
|
|
288
307
|
*/
|
|
289
308
|
protected abstract performBrowserFollowup(context: BrowserContext, oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
290
309
|
protected finalizeCredentials(_browser: Browser, context: BrowserContext, oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
310
|
+
/**
|
|
311
|
+
* Turn a failed followup into an error the user can act on, without taking
|
|
312
|
+
* the browser away from them.
|
|
313
|
+
*
|
|
314
|
+
* A broken automation usually means the service changed, which is precisely
|
|
315
|
+
* the situation where the flow is still perfectly doable by hand: the browser
|
|
316
|
+
* is signed in and sitting on the right page. So the spinner is replaced by
|
|
317
|
+
* an explanation of what failed and what to do about it, and the window stays
|
|
318
|
+
* open for a while, waiting for the user to paste the credentials in.
|
|
319
|
+
*
|
|
320
|
+
* This needs somewhere to put them, so sessions without a
|
|
321
|
+
* {@link manualCredentialForm} report the failure straight away rather than
|
|
322
|
+
* asking for work latchkey could not accept.
|
|
323
|
+
*/
|
|
324
|
+
private recoverFromFailedFollowup;
|
|
325
|
+
/**
|
|
326
|
+
* Turn submitted values into credentials, refusing them with a reason the form
|
|
327
|
+
* can show if the service does not accept them.
|
|
328
|
+
*/
|
|
329
|
+
private decideOnSubmittedCredentials;
|
|
291
330
|
}
|
|
292
331
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/services/core/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,cAAc,EAEf,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../../src/services/core/base.ts"],"names":[],"mappings":"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"}
|