latchkey 0.1.3 → 0.2.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/LICENSE +1 -1
- package/README.md +21 -5
- package/dist/integrations/SKILL.md +71 -0
- package/dist/package.json +67 -0
- package/dist/scripts/recordBrowserSession.js +1 -1
- package/dist/scripts/recordBrowserSession.js.map +1 -1
- package/dist/src/apiCredentials.d.ts +83 -1
- package/dist/src/apiCredentials.d.ts.map +1 -1
- package/dist/src/apiCredentials.js +83 -1
- package/dist/src/apiCredentials.js.map +1 -1
- package/dist/src/browserConfig.d.ts +30 -27
- package/dist/src/browserConfig.d.ts.map +1 -1
- package/dist/src/browserConfig.js +125 -94
- package/dist/src/browserConfig.js.map +1 -1
- package/dist/src/cli.js +2 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +171 -18
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/config.d.ts +1 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +5 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/oauthUtils.d.ts +49 -0
- package/dist/src/oauthUtils.d.ts.map +1 -0
- package/dist/src/oauthUtils.js +183 -0
- package/dist/src/oauthUtils.js.map +1 -0
- package/dist/src/playwrightDownload.d.ts +44 -0
- package/dist/src/playwrightDownload.d.ts.map +1 -0
- package/dist/src/playwrightDownload.js +222 -0
- package/dist/src/playwrightDownload.js.map +1 -0
- package/dist/src/playwrightUtils.d.ts +15 -2
- package/dist/src/playwrightUtils.d.ts.map +1 -1
- package/dist/src/playwrightUtils.js +39 -16
- package/dist/src/playwrightUtils.js.map +1 -1
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +2 -2
- package/dist/src/registry.js.map +1 -1
- package/dist/src/services/base.d.ts +32 -5
- package/dist/src/services/base.d.ts.map +1 -1
- package/dist/src/services/base.js +14 -10
- package/dist/src/services/base.js.map +1 -1
- package/dist/src/services/discord.d.ts +2 -0
- package/dist/src/services/discord.d.ts.map +1 -1
- package/dist/src/services/discord.js +3 -0
- package/dist/src/services/discord.js.map +1 -1
- package/dist/src/services/dropbox.d.ts +3 -1
- package/dist/src/services/dropbox.d.ts.map +1 -1
- package/dist/src/services/dropbox.js +7 -5
- package/dist/src/services/dropbox.js.map +1 -1
- package/dist/src/services/github.d.ts +3 -1
- package/dist/src/services/github.d.ts.map +1 -1
- package/dist/src/services/github.js +18 -8
- package/dist/src/services/github.js.map +1 -1
- package/dist/src/services/google.d.ts +35 -0
- package/dist/src/services/google.d.ts.map +1 -0
- package/dist/src/services/google.js +358 -0
- package/dist/src/services/google.js.map +1 -0
- package/dist/src/services/index.d.ts +2 -0
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +2 -0
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/linear.d.ts +3 -1
- package/dist/src/services/linear.d.ts.map +1 -1
- package/dist/src/services/linear.js +7 -6
- package/dist/src/services/linear.js.map +1 -1
- package/dist/src/services/notion.d.ts +30 -0
- package/dist/src/services/notion.d.ts.map +1 -0
- package/dist/src/services/notion.js +121 -0
- package/dist/src/services/notion.js.map +1 -0
- package/dist/src/services/slack.d.ts +2 -0
- package/dist/src/services/slack.d.ts.map +1 -1
- package/dist/src/services/slack.js +3 -0
- package/dist/src/services/slack.js.map +1 -1
- package/dist/src/skillMd.d.ts +2 -0
- package/dist/src/skillMd.d.ts.map +1 -0
- package/dist/src/skillMd.js +19 -0
- package/dist/src/skillMd.js.map +1 -0
- package/dist/tests/cli.test.js +53 -3
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/playwrightDownload.test.d.ts +2 -0
- package/dist/tests/playwrightDownload.test.d.ts.map +1 -0
- package/dist/tests/playwrightDownload.test.js +131 -0
- package/dist/tests/playwrightDownload.test.js.map +1 -0
- package/dist/tests/registry.test.js +16 -3
- package/dist/tests/registry.test.js.map +1 -1
- package/package.json +5 -6
|
@@ -7,11 +7,22 @@ export interface BrowserWithContext {
|
|
|
7
7
|
readonly browser: Browser;
|
|
8
8
|
readonly context: BrowserContext;
|
|
9
9
|
}
|
|
10
|
+
export interface BrowserLaunchOptions {
|
|
11
|
+
/** Path to the browser executable. If not provided, Playwright's default is used. */
|
|
12
|
+
executablePath?: string;
|
|
13
|
+
/** Path to the encrypted browser state file for persisting cookies/storage. */
|
|
14
|
+
browserStatePath?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate a random Latchkey-prefixed app name.
|
|
18
|
+
* Used for creating unique names when registering API keys, apps, or tokens.
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateLatchkeyAppName(): string;
|
|
10
21
|
/**
|
|
11
22
|
* Run a callback with a browser context initialized from encrypted storage state.
|
|
12
23
|
* After the callback completes, persists browser state back to encrypted storage.
|
|
13
24
|
*/
|
|
14
|
-
export declare function withTempBrowserContext<T>(encryptedStorage: EncryptedStorage,
|
|
25
|
+
export declare function withTempBrowserContext<T>(encryptedStorage: EncryptedStorage, options: BrowserLaunchOptions, callback: (state: BrowserWithContext) => Promise<T>): Promise<T>;
|
|
15
26
|
/**
|
|
16
27
|
* Type text character by character with random delays to simulate human typing.
|
|
17
28
|
*
|
|
@@ -22,6 +33,8 @@ export declare function typeLikeHuman(page: Page, locator: Locator, text: string
|
|
|
22
33
|
/**
|
|
23
34
|
* Show a spinner overlay that hides page content from the user.
|
|
24
35
|
* The overlay persists across page navigations within the browser context.
|
|
36
|
+
*
|
|
37
|
+
* Can be disabled by setting LATCHKEY_DISABLE_SPINNER=1 environment variable.
|
|
25
38
|
*/
|
|
26
|
-
export declare function showSpinnerPage(context: BrowserContext,
|
|
39
|
+
export declare function showSpinnerPage(context: BrowserContext, message: string): Promise<void>;
|
|
27
40
|
//# sourceMappingURL=playwrightUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightUtils.d.ts","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"playwrightUtils.d.ts","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAiB,MAAM,YAAY,CAAC;AAExF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,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,IAAI,MAAM,CAIhD;AAED;;;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,CA2CZ;AAMD;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7F;AAsDD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7F"}
|
|
@@ -1,37 +1,52 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Playwright utility functions for browser automation.
|
|
3
3
|
*/
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
4
5
|
import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
5
6
|
import { tmpdir } from 'node:os';
|
|
6
7
|
import { join } from 'node:path';
|
|
8
|
+
import { chromium } from 'playwright';
|
|
9
|
+
/**
|
|
10
|
+
* Generate a random Latchkey-prefixed app name.
|
|
11
|
+
* Used for creating unique names when registering API keys, apps, or tokens.
|
|
12
|
+
*/
|
|
13
|
+
export function generateLatchkeyAppName() {
|
|
14
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
15
|
+
const randomSuffix = randomUUID().slice(0, 4);
|
|
16
|
+
return `Latchkey-${date}-${randomSuffix}`;
|
|
17
|
+
}
|
|
7
18
|
/**
|
|
8
19
|
* Run a callback with a browser context initialized from encrypted storage state.
|
|
9
20
|
* After the callback completes, persists browser state back to encrypted storage.
|
|
10
21
|
*/
|
|
11
|
-
export async function withTempBrowserContext(encryptedStorage,
|
|
22
|
+
export async function withTempBrowserContext(encryptedStorage, options, callback) {
|
|
12
23
|
const tempDir = mkdtempSync(join(tmpdir(), 'latchkey-browser-state-'));
|
|
13
24
|
const tempFilePath = join(tempDir, 'browser_state.json');
|
|
14
25
|
let initialStorageState;
|
|
15
|
-
if (existsSync(browserStatePath)) {
|
|
16
|
-
const content = encryptedStorage.readFile(browserStatePath);
|
|
26
|
+
if (options.browserStatePath && existsSync(options.browserStatePath)) {
|
|
27
|
+
const content = encryptedStorage.readFile(options.browserStatePath);
|
|
17
28
|
if (content !== null) {
|
|
18
29
|
writeFileSync(tempFilePath, content, { encoding: 'utf-8', mode: 0o600 });
|
|
19
30
|
initialStorageState = tempFilePath;
|
|
20
31
|
}
|
|
21
32
|
}
|
|
22
|
-
const {
|
|
23
|
-
|
|
33
|
+
const playwrightLaunchOptions = { headless: false };
|
|
34
|
+
if (options.executablePath) {
|
|
35
|
+
playwrightLaunchOptions.executablePath = options.executablePath;
|
|
36
|
+
}
|
|
37
|
+
const browser = await chromium.launch(playwrightLaunchOptions);
|
|
24
38
|
try {
|
|
25
|
-
const contextOptions = {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
39
|
+
const contextOptions = {
|
|
40
|
+
storageState: initialStorageState,
|
|
41
|
+
};
|
|
29
42
|
const context = await browser.newContext(contextOptions);
|
|
30
43
|
const result = await callback({ browser, context });
|
|
31
44
|
// Persist browser state back to encrypted storage
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
45
|
+
if (options.browserStatePath) {
|
|
46
|
+
await context.storageState({ path: tempFilePath });
|
|
47
|
+
const content = readFileSync(tempFilePath, 'utf-8');
|
|
48
|
+
encryptedStorage.writeFile(options.browserStatePath, content);
|
|
49
|
+
}
|
|
35
50
|
return result;
|
|
36
51
|
}
|
|
37
52
|
finally {
|
|
@@ -63,7 +78,7 @@ export async function typeLikeHuman(page, locator, text) {
|
|
|
63
78
|
}
|
|
64
79
|
}
|
|
65
80
|
// Script that creates the spinner overlay, designed to run in browser context
|
|
66
|
-
function createSpinnerOverlayScript(
|
|
81
|
+
function createSpinnerOverlayScript(message) {
|
|
67
82
|
return `
|
|
68
83
|
(() => {
|
|
69
84
|
if (document.getElementById('latchkey-spinner-overlay')) return;
|
|
@@ -98,13 +113,16 @@ function createSpinnerOverlayScript(serviceName) {
|
|
|
98
113
|
margin-top: 20px;
|
|
99
114
|
color: #555;
|
|
100
115
|
font-size: 16px;
|
|
116
|
+
text-align: center;
|
|
117
|
+
max-width: 80%;
|
|
118
|
+
white-space: pre-line;
|
|
101
119
|
}
|
|
102
120
|
@keyframes latchkey-spin {
|
|
103
121
|
to { transform: rotate(360deg); }
|
|
104
122
|
}
|
|
105
123
|
</style>
|
|
106
124
|
<div class="spinner"></div>
|
|
107
|
-
<div class="message"
|
|
125
|
+
<div class="message">${message}</div>
|
|
108
126
|
\`;
|
|
109
127
|
document.body.appendChild(overlay);
|
|
110
128
|
})()
|
|
@@ -113,10 +131,15 @@ function createSpinnerOverlayScript(serviceName) {
|
|
|
113
131
|
/**
|
|
114
132
|
* Show a spinner overlay that hides page content from the user.
|
|
115
133
|
* The overlay persists across page navigations within the browser context.
|
|
134
|
+
*
|
|
135
|
+
* Can be disabled by setting LATCHKEY_DISABLE_SPINNER=1 environment variable.
|
|
116
136
|
*/
|
|
117
|
-
export async function showSpinnerPage(context,
|
|
137
|
+
export async function showSpinnerPage(context, message) {
|
|
138
|
+
if (process.env.LATCHKEY_DISABLE_SPINNER === '1') {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
118
141
|
const spinnerPage = await context.newPage();
|
|
119
|
-
await spinnerPage.evaluate(createSpinnerOverlayScript(
|
|
142
|
+
await spinnerPage.evaluate(createSpinnerOverlayScript(message));
|
|
120
143
|
await spinnerPage.bringToFront();
|
|
121
144
|
}
|
|
122
145
|
//# sourceMappingURL=playwrightUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"playwrightUtils.js","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"playwrightUtils.js","sourceRoot":"","sources":["../../src/playwrightUtils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAetC;;;GAGG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO,YAAY,IAAI,IAAI,YAAY,EAAE,CAAC;AAC5C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,gBAAkC,EAClC,OAA6B,EAC7B,QAAmD;IAEnD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAEzD,IAAI,mBAAuC,CAAC;IAC5C,IAAI,OAAO,CAAC,gBAAgB,IAAI,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrE,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzE,mBAAmB,GAAG,YAAY,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,uBAAuB,GAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACnE,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,uBAAuB,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAClE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAE/D,IAAI,CAAC;QACH,MAAM,cAAc,GAA8B;YAChD,YAAY,EAAE,mBAAmB;SAClC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEpD,kDAAkD;QAClD,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACpD,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAU,EAAE,OAAgB,EAAE,IAAY;IAC5E,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,GAAG,mBAAmB,GAAG,CAAC,CAAC,CAAC;YAC3E,mBAAmB,CAAC;QACtB,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,0BAA0B,CAAC,OAAe;IACjD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA2CkB,OAAO;;;;CAIjC,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAuB,EAAE,OAAe;IAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;QACjD,OAAO;IACT,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5C,MAAM,WAAW,CAAC,QAAQ,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,MAAM,WAAW,CAAC,YAAY,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,EAQR,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,QAAQ;IACnB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;gBAE1B,QAAQ,EAAE,SAAS,OAAO,EAAE;IAIxC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IASvC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;CAUtC;AAED,eAAO,MAAM,QAAQ,UAA0E,CAAC"}
|
package/dist/src/registry.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Service registry for looking up services by name or URL.
|
|
3
3
|
*/
|
|
4
|
-
import { SLACK, DISCORD, DROPBOX, GITHUB, LINEAR } from './services/index.js';
|
|
4
|
+
import { SLACK, DISCORD, DROPBOX, GITHUB, LINEAR, NOTION, GOOGLE, } from './services/index.js';
|
|
5
5
|
export class Registry {
|
|
6
6
|
services;
|
|
7
7
|
constructor(services) {
|
|
@@ -26,5 +26,5 @@ export class Registry {
|
|
|
26
26
|
return null;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
export const REGISTRY = new Registry([SLACK, DISCORD, DROPBOX, GITHUB, LINEAR]);
|
|
29
|
+
export const REGISTRY = new Registry([SLACK, DISCORD, DROPBOX, GITHUB, LINEAR, NOTION, GOOGLE]);
|
|
30
30
|
//# sourceMappingURL=registry.js.map
|
package/dist/src/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,MAAM,EACN,MAAM,GACP,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,QAAQ;IACV,QAAQ,CAAqB;IAEtC,YAAY,QAA4B;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC/B,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -4,19 +4,26 @@
|
|
|
4
4
|
import type { Browser, BrowserContext, Response } from 'playwright';
|
|
5
5
|
import { ApiCredentialStatus, ApiCredentials } from '../apiCredentials.js';
|
|
6
6
|
import { EncryptedStorage } from '../encryptedStorage.js';
|
|
7
|
+
import { type BrowserLaunchOptions } from '../playwrightUtils.js';
|
|
7
8
|
export declare class LoginCancelledError extends Error {
|
|
8
9
|
constructor(message?: string);
|
|
9
10
|
}
|
|
10
11
|
export declare class LoginFailedError extends Error {
|
|
11
12
|
constructor(message?: string);
|
|
12
13
|
}
|
|
14
|
+
export declare function isBrowserClosedError(error: Error): boolean;
|
|
13
15
|
/**
|
|
14
16
|
* Base interface for a service that latchkey can authenticate with.
|
|
15
17
|
*/
|
|
16
18
|
export interface Service {
|
|
17
19
|
readonly name: string;
|
|
20
|
+
readonly displayName: string;
|
|
18
21
|
readonly baseApiUrls: readonly string[];
|
|
19
22
|
readonly loginUrl: string;
|
|
23
|
+
/**
|
|
24
|
+
* Developer notes about this service for agents and users.
|
|
25
|
+
*/
|
|
26
|
+
readonly info: string;
|
|
20
27
|
/**
|
|
21
28
|
* Check if the given API credentials are valid for this service.
|
|
22
29
|
*/
|
|
@@ -29,6 +36,18 @@ export interface Service {
|
|
|
29
36
|
* Get a new session for the login flow.
|
|
30
37
|
*/
|
|
31
38
|
getSession(): ServiceSession;
|
|
39
|
+
/**
|
|
40
|
+
* Optional preparation stage.
|
|
41
|
+
* Services can implement this to perform additional preparation steps.
|
|
42
|
+
*/
|
|
43
|
+
prepare?(encryptedStorage: EncryptedStorage, launchOptions?: BrowserLaunchOptions): Promise<ApiCredentials>;
|
|
44
|
+
/**
|
|
45
|
+
* Optional method to refresh expired credentials.
|
|
46
|
+
* Services can implement this to refresh access tokens without user interaction.
|
|
47
|
+
* @param apiCredentials - The expired credentials
|
|
48
|
+
* @returns New credentials if refresh succeeded, null otherwise
|
|
49
|
+
*/
|
|
50
|
+
refreshCredentials?(apiCredentials: ApiCredentials): Promise<ApiCredentials | null>;
|
|
32
51
|
}
|
|
33
52
|
/**
|
|
34
53
|
* Base class for service sessions that handle the login flow.
|
|
@@ -47,8 +66,11 @@ export declare abstract class ServiceSession {
|
|
|
47
66
|
/**
|
|
48
67
|
* Finalize credentials after the headful login phase.
|
|
49
68
|
* Receives the browser and context from the login phase, which are still open.
|
|
69
|
+
* @param browser - Browser instance
|
|
70
|
+
* @param context - Browser context
|
|
71
|
+
* @param oldCredentials - Optional existing credentials to reuse
|
|
50
72
|
*/
|
|
51
|
-
protected abstract finalizeCredentials(browser: Browser, context: BrowserContext): Promise<ApiCredentials | null>;
|
|
73
|
+
protected abstract finalizeCredentials(browser: Browser, context: BrowserContext, oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
52
74
|
/**
|
|
53
75
|
* Wait until the browser login phase is complete.
|
|
54
76
|
*/
|
|
@@ -64,8 +86,11 @@ export declare abstract class ServiceSession {
|
|
|
64
86
|
protected diagnoseTimeoutError(_context: BrowserContext, _originalError: Error): Promise<Error | null>;
|
|
65
87
|
/**
|
|
66
88
|
* Perform the login flow and return the extracted credentials.
|
|
89
|
+
* @param encryptedStorage - Storage for managing credentials
|
|
90
|
+
* @param launchOptions - Browser launch options
|
|
91
|
+
* @param oldCredentials - Optional existing credentials to reuse (e.g., client ID/secret)
|
|
67
92
|
*/
|
|
68
|
-
login(encryptedStorage: EncryptedStorage,
|
|
93
|
+
login(encryptedStorage: EncryptedStorage, launchOptions?: BrowserLaunchOptions, oldCredentials?: ApiCredentials): Promise<ApiCredentials>;
|
|
69
94
|
}
|
|
70
95
|
/**
|
|
71
96
|
* Simple service session where credentials are extracted by observing requests during login.
|
|
@@ -78,7 +103,7 @@ export declare abstract class SimpleServiceSession extends ServiceSession {
|
|
|
78
103
|
protected abstract getApiCredentialsFromResponse(response: Response): Promise<ApiCredentials | null>;
|
|
79
104
|
onResponse(response: Response): void;
|
|
80
105
|
protected isLoginComplete(): boolean;
|
|
81
|
-
protected finalizeCredentials(_browser: Browser, _context: BrowserContext): Promise<ApiCredentials | null>;
|
|
106
|
+
protected finalizeCredentials(_browser: Browser, _context: BrowserContext, _oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
82
107
|
}
|
|
83
108
|
/**
|
|
84
109
|
* Service session that requires a browser followup to finalize credentials.
|
|
@@ -91,8 +116,10 @@ export declare abstract class BrowserFollowupServiceSession extends ServiceSessi
|
|
|
91
116
|
/**
|
|
92
117
|
* Perform actions in the browser to finalize and extract API credentials.
|
|
93
118
|
* This runs in the same browser session used for login.
|
|
119
|
+
* @param context - Browser context
|
|
120
|
+
* @param oldCredentials - Optional existing credentials to reuse
|
|
94
121
|
*/
|
|
95
|
-
protected abstract performBrowserFollowup(context: BrowserContext): Promise<ApiCredentials | null>;
|
|
96
|
-
protected finalizeCredentials(_browser: Browser, context: BrowserContext): Promise<ApiCredentials | null>;
|
|
122
|
+
protected abstract performBrowserFollowup(context: BrowserContext, oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
123
|
+
protected finalizeCredentials(_browser: Browser, context: BrowserContext, oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
97
124
|
}
|
|
98
125
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/services/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAQ,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/services/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Base classes and interfaces for service implementations.
|
|
3
3
|
*/
|
|
4
|
-
import { showSpinnerPage, withTempBrowserContext } from '../playwrightUtils.js';
|
|
4
|
+
import { showSpinnerPage, withTempBrowserContext, } from '../playwrightUtils.js';
|
|
5
5
|
export class LoginCancelledError extends Error {
|
|
6
6
|
constructor(message = 'Login was cancelled because the browser was closed.') {
|
|
7
7
|
super(message);
|
|
@@ -14,13 +14,14 @@ export class LoginFailedError extends Error {
|
|
|
14
14
|
this.name = 'LoginFailedError';
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
-
function isBrowserClosedError(error) {
|
|
17
|
+
export function isBrowserClosedError(error) {
|
|
18
18
|
const message = error.message.toLowerCase();
|
|
19
19
|
return (message.includes('target closed') ||
|
|
20
20
|
message.includes('browser closed') ||
|
|
21
21
|
message.includes('browser has been closed') ||
|
|
22
22
|
message.includes('context has been closed') ||
|
|
23
|
-
message.includes('page has been closed')
|
|
23
|
+
message.includes('page has been closed') ||
|
|
24
|
+
message.includes('net::err_aborted'));
|
|
24
25
|
}
|
|
25
26
|
function isTimeoutError(error) {
|
|
26
27
|
return error.name === 'TimeoutError';
|
|
@@ -54,9 +55,12 @@ export class ServiceSession {
|
|
|
54
55
|
}
|
|
55
56
|
/**
|
|
56
57
|
* Perform the login flow and return the extracted credentials.
|
|
58
|
+
* @param encryptedStorage - Storage for managing credentials
|
|
59
|
+
* @param launchOptions - Browser launch options
|
|
60
|
+
* @param oldCredentials - Optional existing credentials to reuse (e.g., client ID/secret)
|
|
57
61
|
*/
|
|
58
|
-
async login(encryptedStorage,
|
|
59
|
-
return withTempBrowserContext(encryptedStorage,
|
|
62
|
+
async login(encryptedStorage, launchOptions = {}, oldCredentials) {
|
|
63
|
+
return withTempBrowserContext(encryptedStorage, launchOptions, async ({ browser, context }) => {
|
|
60
64
|
const page = await context.newPage();
|
|
61
65
|
page.on('response', (response) => {
|
|
62
66
|
this.onResponse(response);
|
|
@@ -73,7 +77,7 @@ export class ServiceSession {
|
|
|
73
77
|
}
|
|
74
78
|
let apiCredentials;
|
|
75
79
|
try {
|
|
76
|
-
apiCredentials = await this.finalizeCredentials(browser, context);
|
|
80
|
+
apiCredentials = await this.finalizeCredentials(browser, context, oldCredentials);
|
|
77
81
|
}
|
|
78
82
|
catch (error) {
|
|
79
83
|
if (error instanceof Error && isBrowserClosedError(error)) {
|
|
@@ -117,7 +121,7 @@ export class SimpleServiceSession extends ServiceSession {
|
|
|
117
121
|
isLoginComplete() {
|
|
118
122
|
return this.apiCredentials !== null;
|
|
119
123
|
}
|
|
120
|
-
finalizeCredentials(_browser, _context) {
|
|
124
|
+
finalizeCredentials(_browser, _context, _oldCredentials) {
|
|
121
125
|
return Promise.resolve(this.apiCredentials);
|
|
122
126
|
}
|
|
123
127
|
}
|
|
@@ -129,9 +133,9 @@ export class SimpleServiceSession extends ServiceSession {
|
|
|
129
133
|
* (e.g., navigating to settings and creating an API key).
|
|
130
134
|
*/
|
|
131
135
|
export class BrowserFollowupServiceSession extends ServiceSession {
|
|
132
|
-
async finalizeCredentials(_browser, context) {
|
|
133
|
-
await showSpinnerPage(context, this.service.
|
|
134
|
-
return this.performBrowserFollowup(context);
|
|
136
|
+
async finalizeCredentials(_browser, context, oldCredentials) {
|
|
137
|
+
await showSpinnerPage(context, `Finalizing ${this.service.displayName} login...`);
|
|
138
|
+
return this.performBrowserFollowup(context, oldCredentials);
|
|
135
139
|
}
|
|
136
140
|
}
|
|
137
141
|
//# sourceMappingURL=base.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/services/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/services/base.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,10 @@ declare class DiscordServiceSession extends SimpleServiceSession {
|
|
|
9
9
|
}
|
|
10
10
|
export declare class Discord implements Service {
|
|
11
11
|
readonly name = "discord";
|
|
12
|
+
readonly displayName = "Discord";
|
|
12
13
|
readonly baseApiUrls: readonly ["https://discord.com/api/"];
|
|
13
14
|
readonly loginUrl = "https://discord.com/login";
|
|
15
|
+
readonly info: string;
|
|
14
16
|
readonly credentialCheckCurlArguments: readonly ["https://discord.com/api/v9/users/@me"];
|
|
15
17
|
getSession(): DiscordServiceSession;
|
|
16
18
|
checkApiCredentials(apiCredentials: ApiCredentials): ApiCredentialStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../src/services/discord.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAqB,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE1D,cAAM,qBAAsB,SAAQ,oBAAoB;cACtC,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAsBlC;AAED,qBAAa,OAAQ,YAAW,OAAO;IACrC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,wCAAyC;IAC7D,QAAQ,CAAC,QAAQ,+BAA+B;
|
|
1
|
+
{"version":3,"file":"discord.d.ts","sourceRoot":"","sources":["../../../src/services/discord.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAqB,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE1D,cAAM,qBAAsB,SAAQ,oBAAoB;cACtC,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAsBlC;AAED,qBAAa,OAAQ,YAAW,OAAO;IACrC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IACjC,QAAQ,CAAC,WAAW,wCAAyC;IAC7D,QAAQ,CAAC,QAAQ,+BAA+B;IAChD,QAAQ,CAAC,IAAI,SAEyD;IAEtE,QAAQ,CAAC,4BAA4B,oDAAqD;IAE1F,UAAU,IAAI,qBAAqB;IAInC,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB;CAuBzE;AAED,eAAO,MAAM,OAAO,SAAgB,CAAC"}
|
|
@@ -26,8 +26,11 @@ class DiscordServiceSession extends SimpleServiceSession {
|
|
|
26
26
|
}
|
|
27
27
|
export class Discord {
|
|
28
28
|
name = 'discord';
|
|
29
|
+
displayName = 'Discord';
|
|
29
30
|
baseApiUrls = ['https://discord.com/api/'];
|
|
30
31
|
loginUrl = 'https://discord.com/login';
|
|
32
|
+
info = 'https://discord.com/developers/docs/reference. ' +
|
|
33
|
+
'Credentials are extracted from the user session, not a bot token.';
|
|
31
34
|
credentialCheckCurlArguments = ['https://discord.com/api/v9/users/@me'];
|
|
32
35
|
getSession() {
|
|
33
36
|
return new DiscordServiceSession(this);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/services/discord.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAkB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAW,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,qBAAsB,SAAQ,oBAAoB;IAC5C,KAAK,CAAC,6BAA6B,CAC3C,QAAkB;QAElB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oEAAoE;QACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/D,OAAO,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,OAAO,OAAO;IACT,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,CAAC,0BAA0B,CAAU,CAAC;IACpD,QAAQ,GAAG,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"discord.js","sourceRoot":"","sources":["../../../src/services/discord.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,mBAAmB,EAAkB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAW,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE1D,MAAM,qBAAsB,SAAQ,oBAAoB;IAC5C,KAAK,CAAC,6BAA6B,CAC3C,QAAkB;QAElB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE1B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oEAAoE;QACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC5C,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/D,OAAO,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,OAAO,OAAO;IACT,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,SAAS,CAAC;IACxB,WAAW,GAAG,CAAC,0BAA0B,CAAU,CAAC;IACpD,QAAQ,GAAG,2BAA2B,CAAC;IACvC,IAAI,GACX,iDAAiD;QACjD,mEAAmE,CAAC;IAE7D,4BAA4B,GAAG,CAAC,sCAAsC,CAAU,CAAC;IAE1F,UAAU;QACR,OAAO,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,mBAAmB,CAAC,cAA8B;QAChD,IAAI,CAAC,CAAC,cAAc,YAAY,iBAAiB,CAAC,EAAE,CAAC;YACnD,OAAO,mBAAmB,CAAC,OAAO,CAAC;QACrC,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CACxB;YACE,IAAI;YACJ,IAAI;YACJ,WAAW;YACX,IAAI;YACJ,cAAc;YACd,GAAG,cAAc,CAAC,eAAe,EAAE;YACnC,GAAG,IAAI,CAAC,4BAA4B;SACrC,EACD,EAAE,CACH,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO,mBAAmB,CAAC,KAAK,CAAC;QACnC,CAAC;QACD,OAAO,mBAAmB,CAAC,OAAO,CAAC;IACrC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -8,12 +8,14 @@ declare class DropboxServiceSession extends BrowserFollowupServiceSession {
|
|
|
8
8
|
private isLoggedIn;
|
|
9
9
|
onResponse(response: Response): void;
|
|
10
10
|
protected isLoginComplete(): boolean;
|
|
11
|
-
protected performBrowserFollowup(context: BrowserContext): Promise<ApiCredentials | null>;
|
|
11
|
+
protected performBrowserFollowup(context: BrowserContext, _oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
12
12
|
}
|
|
13
13
|
export declare class Dropbox implements Service {
|
|
14
14
|
readonly name = "dropbox";
|
|
15
|
+
readonly displayName = "Dropbox";
|
|
15
16
|
readonly baseApiUrls: readonly ["https://api.dropboxapi.com/", "https://content.dropboxapi.com/", "https://notify.dropboxapi.com/"];
|
|
16
17
|
readonly loginUrl = "https://www.dropbox.com/login";
|
|
18
|
+
readonly info: string;
|
|
17
19
|
readonly credentialCheckCurlArguments: readonly ["-X", "POST", "https://api.dropboxapi.com/2/users/get_current_account"];
|
|
18
20
|
getSession(): DropboxServiceSession;
|
|
19
21
|
checkApiCredentials(apiCredentials: ApiCredentials): ApiCredentialStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropbox.d.ts","sourceRoot":"","sources":["../../../src/services/dropbox.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"dropbox.d.ts","sourceRoot":"","sources":["../../../src/services/dropbox.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAuB,MAAM,sBAAsB,CAAC;AAGhG,OAAO,EAAE,OAAO,EAAE,6BAA6B,EAAoB,MAAM,WAAW,CAAC;AAIrF,cAAM,qBAAsB,SAAQ,6BAA6B;IAC/D,OAAO,CAAC,UAAU,CAAS;IAE3B,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IA0BpC,SAAS,CAAC,eAAe,IAAI,OAAO;cAIpB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,cAAc,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAgFlC;AAED,qBAAa,OAAQ,YAAW,OAAO;IACrC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IACjC,QAAQ,CAAC,WAAW,gHAIT;IACX,QAAQ,CAAC,QAAQ,mCAAmC;IACpD,QAAQ,CAAC,IAAI,SAE8F;IAE3G,QAAQ,CAAC,4BAA4B,oFAI1B;IAEX,UAAU,IAAI,qBAAqB;IAInC,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB;CAuBzE;AAED,eAAO,MAAM,OAAO,SAAgB,CAAC"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dropbox service implementation.
|
|
3
3
|
*/
|
|
4
|
-
import { randomUUID } from 'node:crypto';
|
|
5
4
|
import { ApiCredentialStatus, AuthorizationBearer } from '../apiCredentials.js';
|
|
6
5
|
import { runCaptured } from '../curl.js';
|
|
7
|
-
import { typeLikeHuman } from '../playwrightUtils.js';
|
|
6
|
+
import { generateLatchkeyAppName, typeLikeHuman } from '../playwrightUtils.js';
|
|
8
7
|
import { BrowserFollowupServiceSession, LoginFailedError } from './base.js';
|
|
9
8
|
const DEFAULT_TIMEOUT_MS = 8000;
|
|
10
9
|
class DropboxServiceSession extends BrowserFollowupServiceSession {
|
|
@@ -33,7 +32,7 @@ class DropboxServiceSession extends BrowserFollowupServiceSession {
|
|
|
33
32
|
isLoginComplete() {
|
|
34
33
|
return this.isLoggedIn;
|
|
35
34
|
}
|
|
36
|
-
async performBrowserFollowup(context) {
|
|
35
|
+
async performBrowserFollowup(context, _oldCredentials) {
|
|
37
36
|
const page = context.pages()[0];
|
|
38
37
|
if (!page) {
|
|
39
38
|
throw new LoginFailedError('No page available in browser context.');
|
|
@@ -45,11 +44,11 @@ class DropboxServiceSession extends BrowserFollowupServiceSession {
|
|
|
45
44
|
const fullPermissionsInput = page.locator('input#full_permissions');
|
|
46
45
|
await fullPermissionsInput.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
47
46
|
await fullPermissionsInput.click();
|
|
48
|
-
const appName =
|
|
47
|
+
const appName = generateLatchkeyAppName();
|
|
49
48
|
const appNameInput = page.locator('input#app-name');
|
|
50
49
|
await appNameInput.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
51
50
|
await typeLikeHuman(page, appNameInput, appName);
|
|
52
|
-
const createButton = page.
|
|
51
|
+
const createButton = page.locator('//*[@id="create-button" and not(@disabled)]');
|
|
53
52
|
await createButton.waitFor({ timeout: DEFAULT_TIMEOUT_MS });
|
|
54
53
|
await createButton.click();
|
|
55
54
|
await page.waitForURL(/https:\/\/www\.dropbox\.com\/developers\/apps\/info\//, {
|
|
@@ -99,12 +98,15 @@ class DropboxServiceSession extends BrowserFollowupServiceSession {
|
|
|
99
98
|
}
|
|
100
99
|
export class Dropbox {
|
|
101
100
|
name = 'dropbox';
|
|
101
|
+
displayName = 'Dropbox';
|
|
102
102
|
baseApiUrls = [
|
|
103
103
|
'https://api.dropboxapi.com/',
|
|
104
104
|
'https://content.dropboxapi.com/',
|
|
105
105
|
'https://notify.dropboxapi.com/',
|
|
106
106
|
];
|
|
107
107
|
loginUrl = 'https://www.dropbox.com/login';
|
|
108
|
+
info = 'https://www.dropbox.com/developers/documentation/http/documentation. ' +
|
|
109
|
+
'Use api.dropboxapi.com for RPC-style endpoints and content.dropboxapi.com for content upload/download.';
|
|
108
110
|
credentialCheckCurlArguments = [
|
|
109
111
|
'-X',
|
|
110
112
|
'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropbox.js","sourceRoot":"","sources":["../../../src/services/dropbox.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"dropbox.js","sourceRoot":"","sources":["../../../src/services/dropbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,12 +8,14 @@ declare class GithubServiceSession extends BrowserFollowupServiceSession {
|
|
|
8
8
|
private isLoggedIn;
|
|
9
9
|
onResponse(response: Response): void;
|
|
10
10
|
protected isLoginComplete(): boolean;
|
|
11
|
-
protected performBrowserFollowup(context: BrowserContext): Promise<ApiCredentials | null>;
|
|
11
|
+
protected performBrowserFollowup(context: BrowserContext, _oldCredentials?: ApiCredentials): Promise<ApiCredentials | null>;
|
|
12
12
|
}
|
|
13
13
|
export declare class Github implements Service {
|
|
14
14
|
readonly name = "github";
|
|
15
|
+
readonly displayName = "GitHub";
|
|
15
16
|
readonly baseApiUrls: readonly ["https://api.github.com/"];
|
|
16
17
|
readonly loginUrl = "https://github.com/settings/tokens/new";
|
|
18
|
+
readonly info: string;
|
|
17
19
|
readonly credentialCheckCurlArguments: readonly ["https://api.github.com/user"];
|
|
18
20
|
getSession(): GithubServiceSession;
|
|
19
21
|
checkApiCredentials(apiCredentials: ApiCredentials): ApiCredentialStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/services/github.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/services/github.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAuB,MAAM,sBAAsB,CAAC;AAGhG,OAAO,EAAE,OAAO,EAAE,6BAA6B,EAAoB,MAAM,WAAW,CAAC;AA6BrF,cAAM,oBAAqB,SAAQ,6BAA6B;IAC9D,OAAO,CAAC,UAAU,CAAS;IAE3B,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAqBpC,SAAS,CAAC,eAAe,IAAI,OAAO;cAIpB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,cAAc,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAwClC;AAED,qBAAa,MAAO,YAAW,OAAO;IACpC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,WAAW,uCAAwC;IAC5D,QAAQ,CAAC,QAAQ,4CAAwB;IACzC,QAAQ,CAAC,IAAI,SAE+D;IAE5E,QAAQ,CAAC,4BAA4B,2CAA4C;IAEjF,UAAU,IAAI,oBAAoB;IAIlC,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,mBAAmB;CAuBzE;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
|