latchkey 0.2.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +98 -57
  2. package/dist/integrations/SKILL.md +25 -19
  3. package/dist/package.json +2 -2
  4. package/dist/scripts/codegen/codeGenerator.d.ts +27 -0
  5. package/dist/scripts/codegen/codeGenerator.d.ts.map +1 -0
  6. package/dist/scripts/codegen/codeGenerator.js +220 -0
  7. package/dist/scripts/codegen/codeGenerator.js.map +1 -0
  8. package/dist/scripts/codegen/index.d.ts +27 -0
  9. package/dist/scripts/codegen/index.d.ts.map +1 -0
  10. package/dist/scripts/codegen/index.js +189 -0
  11. package/dist/scripts/codegen/index.js.map +1 -0
  12. package/dist/scripts/codegen/injectedScript.d.ts +6 -0
  13. package/dist/scripts/codegen/injectedScript.d.ts.map +1 -0
  14. package/dist/scripts/codegen/injectedScript.js +657 -0
  15. package/dist/scripts/codegen/injectedScript.js.map +1 -0
  16. package/dist/scripts/codegen/requestMetadataCollector.d.ts +15 -0
  17. package/dist/scripts/codegen/requestMetadataCollector.d.ts.map +1 -0
  18. package/dist/scripts/codegen/requestMetadataCollector.js +48 -0
  19. package/dist/scripts/codegen/requestMetadataCollector.js.map +1 -0
  20. package/dist/scripts/codegen/types.d.ts +77 -0
  21. package/dist/scripts/codegen/types.d.ts.map +1 -0
  22. package/dist/scripts/codegen/types.js +10 -0
  23. package/dist/scripts/codegen/types.js.map +1 -0
  24. package/dist/scripts/codegen.d.ts +24 -0
  25. package/dist/scripts/codegen.d.ts.map +1 -0
  26. package/dist/scripts/codegen.js +95 -0
  27. package/dist/scripts/codegen.js.map +1 -0
  28. package/dist/scripts/cryptFile.js +7 -2
  29. package/dist/scripts/cryptFile.js.map +1 -1
  30. package/dist/src/apiCredentialStore.d.ts +1 -0
  31. package/dist/src/apiCredentialStore.d.ts.map +1 -1
  32. package/dist/src/apiCredentialStore.js +12 -0
  33. package/dist/src/apiCredentialStore.js.map +1 -1
  34. package/dist/src/apiCredentials.d.ts +33 -0
  35. package/dist/src/apiCredentials.d.ts.map +1 -1
  36. package/dist/src/apiCredentials.js +36 -0
  37. package/dist/src/apiCredentials.js.map +1 -1
  38. package/dist/src/cli.js +3 -2
  39. package/dist/src/cli.js.map +1 -1
  40. package/dist/src/cliCommands.d.ts.map +1 -1
  41. package/dist/src/cliCommands.js +158 -126
  42. package/dist/src/cliCommands.js.map +1 -1
  43. package/dist/src/config.d.ts +13 -0
  44. package/dist/src/config.d.ts.map +1 -1
  45. package/dist/src/config.js +56 -16
  46. package/dist/src/config.js.map +1 -1
  47. package/dist/src/encryptedStorage.d.ts +1 -2
  48. package/dist/src/encryptedStorage.d.ts.map +1 -1
  49. package/dist/src/encryptedStorage.js +18 -38
  50. package/dist/src/encryptedStorage.js.map +1 -1
  51. package/dist/src/index.d.ts +2 -2
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +3 -3
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/keychain.d.ts +0 -4
  56. package/dist/src/keychain.d.ts.map +1 -1
  57. package/dist/src/keychain.js +0 -13
  58. package/dist/src/keychain.js.map +1 -1
  59. package/dist/src/oauthUtils.d.ts +1 -1
  60. package/dist/src/oauthUtils.d.ts.map +1 -1
  61. package/dist/src/playwrightUtils.d.ts +6 -0
  62. package/dist/src/playwrightUtils.d.ts.map +1 -1
  63. package/dist/src/playwrightUtils.js +12 -0
  64. package/dist/src/playwrightUtils.js.map +1 -1
  65. package/dist/src/registry.d.ts.map +1 -1
  66. package/dist/src/registry.js +20 -4
  67. package/dist/src/registry.js.map +1 -1
  68. package/dist/src/services/base.d.ts +20 -18
  69. package/dist/src/services/base.d.ts.map +1 -1
  70. package/dist/src/services/base.js +37 -1
  71. package/dist/src/services/base.js.map +1 -1
  72. package/dist/src/services/discord.d.ts +2 -3
  73. package/dist/src/services/discord.d.ts.map +1 -1
  74. package/dist/src/services/discord.js +3 -22
  75. package/dist/src/services/discord.js.map +1 -1
  76. package/dist/src/services/dropbox.d.ts +2 -3
  77. package/dist/src/services/dropbox.d.ts.map +1 -1
  78. package/dist/src/services/dropbox.js +3 -22
  79. package/dist/src/services/dropbox.js.map +1 -1
  80. package/dist/src/services/github.d.ts +2 -3
  81. package/dist/src/services/github.d.ts.map +1 -1
  82. package/dist/src/services/github.js +3 -22
  83. package/dist/src/services/github.js.map +1 -1
  84. package/dist/src/services/google.d.ts +3 -4
  85. package/dist/src/services/google.d.ts.map +1 -1
  86. package/dist/src/services/google.js +21 -43
  87. package/dist/src/services/google.js.map +1 -1
  88. package/dist/src/services/index.d.ts +2 -2
  89. package/dist/src/services/index.d.ts.map +1 -1
  90. package/dist/src/services/index.js +2 -1
  91. package/dist/src/services/index.js.map +1 -1
  92. package/dist/src/services/linear.d.ts +2 -3
  93. package/dist/src/services/linear.d.ts.map +1 -1
  94. package/dist/src/services/linear.js +3 -23
  95. package/dist/src/services/linear.js.map +1 -1
  96. package/dist/src/services/mailchimp.d.ts +11 -0
  97. package/dist/src/services/mailchimp.d.ts.map +1 -0
  98. package/dist/src/services/mailchimp.js +16 -0
  99. package/dist/src/services/mailchimp.js.map +1 -0
  100. package/dist/src/services/notion.d.ts +2 -3
  101. package/dist/src/services/notion.d.ts.map +1 -1
  102. package/dist/src/services/notion.js +3 -22
  103. package/dist/src/services/notion.js.map +1 -1
  104. package/dist/src/services/slack.d.ts +1 -1
  105. package/dist/src/services/slack.d.ts.map +1 -1
  106. package/dist/src/services/slack.js +2 -5
  107. package/dist/src/services/slack.js.map +1 -1
  108. package/dist/tests/apiCredentials.test.js +59 -1
  109. package/dist/tests/apiCredentials.test.js.map +1 -1
  110. package/dist/tests/cli.test.js +270 -128
  111. package/dist/tests/cli.test.js.map +1 -1
  112. package/dist/tests/playwrightDownload.test.js +2 -2
  113. package/dist/tests/playwrightDownload.test.js.map +1 -1
  114. package/dist/tests/registry.test.js +14 -2
  115. package/dist/tests/registry.test.js.map +1 -1
  116. package/dist/tests/servicesAgainstRecordings.test.js +3 -0
  117. package/dist/tests/servicesAgainstRecordings.test.js.map +1 -1
  118. package/package.json +2 -2
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Codegen module that records browser actions and generates TypeScript code:
3
+ * - Records user interactions (clicks, fills, navigations, etc.)
4
+ * - Always generates TypeScript code
5
+ * - Records all HTTP request metadata to a file
6
+ * - Includes a custom toolbar with additional buttons
7
+ *
8
+ * The session has two phases:
9
+ * - Pre-login: No recording, requests marked as pre-login
10
+ * - Post-login: User interactions are recorded, requests marked as post-login
11
+ */
12
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
13
+ import { dirname, join, resolve } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+ import { chromium } from 'playwright';
16
+ import { CodeGenerator } from './codeGenerator.js';
17
+ import { createInjectedScript } from './injectedScript.js';
18
+ import { RequestMetadataCollector } from './requestMetadataCollector.js';
19
+ // Get the directory of this module
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = dirname(__filename);
22
+ // Recordings directory relative to this module (scripts/recordings)
23
+ const RECORDINGS_DIRECTORY = resolve(__dirname, '..', 'recordings');
24
+ export { CodegenError } from './types.js';
25
+ /**
26
+ * Generate the prompt.txt content for creating a service definition.
27
+ */
28
+ function generatePromptContent(name) {
29
+ return `Create a new service definition for ${name} with browser login support.
30
+
31
+ Typically, in a browser login session, the user will need to log in manually, and then the automation kicks in to generate an API key. The code needs to detect when the login stage has finished, and then use the Playwright API to perform automatic interactions, and finally retrieve the API key.
32
+
33
+ To help you derive this logic, I have recorded a sample user session:
34
+
35
+ The metadata of all requests during the session is recorded in scripts/recordings/${name}/requests.json. Each element contains a "phase" field that tells you whether this is before or after login.
36
+ Note that because the phase is derived from the user clicking a button that says "I'm logged in", some requests immediately after logging in may be marked incorrectly as pre-login. Examine the difference between these two sets of data and try to derive the simplest possible criteria. Some good candidates are:
37
+
38
+ - A request to the original URL with a difference in HTTP status code (the pre-login one will be a redirection, the post-login one will be 200). Note that the post-login request is likely to be marked incorrectly as pre-login because it's the very first request after login. Use the timestamp to figure out if that's the case.
39
+
40
+ - The presence of some kind of "auth" or "user" header in the request header.
41
+
42
+ The actions for generating an API key after the user has logged in is recorded in scripts/recordings/${name}/actions.js. For each element, think about how to derive a stable selector that doesn't depend on the user's language. Usually this means using readable IDs or CSS classes, which are unlikely to change. Some elements, such as submit buttons, may already be unique when matched by the type. If everything fails, fall back to using role + label.
43
+
44
+ Reference other service implementations to understand which patterns we use.
45
+ `;
46
+ }
47
+ /**
48
+ * Run the codegen which opens a browser with recording enabled.
49
+ * Injects a custom toolbar and records user actions and HTTP request metadata.
50
+ *
51
+ * Creates a scripts/recordings/$name/ directory with:
52
+ * - actions.js: Recorded user actions
53
+ * - requests.json: HTTP request metadata
54
+ * - prompt.txt: Instructions for creating a service definition
55
+ *
56
+ * @returns Result containing the API key ancestry if selected by the user
57
+ */
58
+ export async function runCodegen(options) {
59
+ const { name, url } = options;
60
+ // Create recordings directory
61
+ const recordingsDirectory = join(RECORDINGS_DIRECTORY, name);
62
+ if (!existsSync(recordingsDirectory)) {
63
+ mkdirSync(recordingsDirectory, { recursive: true });
64
+ }
65
+ const actionsFile = join(recordingsDirectory, 'actions.js');
66
+ const requestsFile = join(recordingsDirectory, 'requests.json');
67
+ const promptFile = join(recordingsDirectory, 'prompt.txt');
68
+ // Write prompt.txt
69
+ writeFileSync(promptFile, generatePromptContent(name), 'utf-8');
70
+ const launchOptions = {
71
+ headless: false,
72
+ };
73
+ if (options.executablePath) {
74
+ launchOptions.executablePath = options.executablePath;
75
+ }
76
+ const browser = await chromium.launch(launchOptions);
77
+ const context = await browser.newContext();
78
+ const requestCollector = new RequestMetadataCollector(requestsFile);
79
+ const codeGenerator = new CodeGenerator(actionsFile);
80
+ // Session state
81
+ let currentPhase = 'pre-login';
82
+ let apiKeyAncestry;
83
+ // Track HTTP requests and responses
84
+ context.on('response', (response) => {
85
+ const request = response.request();
86
+ requestCollector.addRequest(request, response);
87
+ });
88
+ context.on('requestfailed', (request) => {
89
+ requestCollector.addRequest(request, null);
90
+ });
91
+ // Inject our combined recorder and toolbar script into every page
92
+ const injectedScript = createInjectedScript();
93
+ await context.addInitScript(injectedScript);
94
+ // Expose function to receive recorded actions from the page
95
+ // Only records actions during post-login phase
96
+ await context.exposeFunction('__latchkeyRecordAction', (action) => {
97
+ // Only record actions during post-login phase
98
+ if (currentPhase !== 'post-login') {
99
+ return;
100
+ }
101
+ codeGenerator.addAction({
102
+ type: action.type,
103
+ ancestry: action.ancestry,
104
+ value: action.value,
105
+ key: action.key,
106
+ url: action.url,
107
+ timestamp: Date.now(),
108
+ });
109
+ });
110
+ // Expose function to get current phase (called by toolbar)
111
+ await context.exposeFunction('__latchkeyGetPhase', () => {
112
+ return currentPhase;
113
+ });
114
+ // Expose function called when "I've logged in" button is clicked
115
+ await context.exposeFunction('__latchkeyTransitionToPostLogin', () => {
116
+ console.log('[Latchkey] Transitioning to post-login phase');
117
+ currentPhase = 'post-login';
118
+ requestCollector.setPhase('post-login');
119
+ });
120
+ // Expose function called when API key element is selected
121
+ await context.exposeFunction('__latchkeyApiKeyElementSelected', (ancestry) => {
122
+ console.log(`[Latchkey] API key element selected with ${String(ancestry.length)} ancestors`);
123
+ apiKeyAncestry = ancestry;
124
+ codeGenerator.setApiKeyAncestry(ancestry);
125
+ });
126
+ const page = await context.newPage();
127
+ // Helper function to inject script after page load (needed because addInitScript
128
+ // runs before DOM exists, so toolbar won't appear without this)
129
+ async function injectScriptIfNeeded(targetPage) {
130
+ try {
131
+ await targetPage.evaluate(injectedScript);
132
+ }
133
+ catch {
134
+ // Ignore errors (e.g., if page is closed or navigating)
135
+ }
136
+ }
137
+ // Navigate to initial URL
138
+ codeGenerator.setInitialUrl(url);
139
+ await page.goto(url);
140
+ // Inject script after page loads
141
+ await injectScriptIfNeeded(page);
142
+ // Re-inject script after navigations
143
+ page.on('load', () => {
144
+ void injectScriptIfNeeded(page);
145
+ });
146
+ // Track navigations (only during post-login phase)
147
+ page.on('framenavigated', (frame) => {
148
+ // Only track main frame navigations during post-login
149
+ if (frame === page.mainFrame() && currentPhase === 'post-login') {
150
+ const url = frame.url();
151
+ // Don't record about:blank
152
+ if (url && url !== 'about:blank') {
153
+ codeGenerator.addAction({
154
+ type: 'navigate',
155
+ url: url,
156
+ timestamp: Date.now(),
157
+ });
158
+ }
159
+ }
160
+ });
161
+ // Wait for browser to close
162
+ await new Promise((resolve) => {
163
+ const cleanup = () => {
164
+ resolve();
165
+ };
166
+ browser.on('disconnected', cleanup);
167
+ context.on('close', cleanup);
168
+ page.on('close', cleanup);
169
+ });
170
+ // Ensure browser is fully closed
171
+ try {
172
+ await browser.close();
173
+ }
174
+ catch {
175
+ // Browser may already be closed, ignore
176
+ }
177
+ // Final flush of collected data
178
+ requestCollector.flush();
179
+ codeGenerator.flush();
180
+ console.log(`\nRecording saved to ${recordingsDirectory}/`);
181
+ console.log(` - actions.js: Recorded user actions`);
182
+ console.log(` - requests.json: HTTP request metadata`);
183
+ console.log(` - prompt.txt: Instructions for creating a service definition`);
184
+ if (apiKeyAncestry) {
185
+ console.log(`\nAPI key element ancestry captured with ${String(apiKeyAncestry.length)} elements`);
186
+ }
187
+ return { apiKeyAncestry };
188
+ }
189
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../scripts/codegen/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Creates the combined script injected into pages.
3
+ * Contains both the interaction recorder and the toolbar UI.
4
+ */
5
+ export declare function createInjectedScript(): string;
6
+ //# sourceMappingURL=injectedScript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injectedScript.d.ts","sourceRoot":"","sources":["../../../scripts/codegen/injectedScript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CA2oB7C"}