latchkey 0.1.4 → 1.0.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.
Files changed (99) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +93 -56
  3. package/dist/integrations/SKILL.md +77 -0
  4. package/dist/package.json +67 -0
  5. package/dist/scripts/encryptFile.d.ts +21 -0
  6. package/dist/scripts/encryptFile.d.ts.map +1 -0
  7. package/dist/scripts/encryptFile.js +101 -0
  8. package/dist/scripts/encryptFile.js.map +1 -0
  9. package/dist/src/apiCredentialStore.d.ts +1 -0
  10. package/dist/src/apiCredentialStore.d.ts.map +1 -1
  11. package/dist/src/apiCredentialStore.js +12 -0
  12. package/dist/src/apiCredentialStore.js.map +1 -1
  13. package/dist/src/apiCredentials.d.ts +116 -1
  14. package/dist/src/apiCredentials.d.ts.map +1 -1
  15. package/dist/src/apiCredentials.js +119 -1
  16. package/dist/src/apiCredentials.js.map +1 -1
  17. package/dist/src/browserState.d.ts +8 -0
  18. package/dist/src/browserState.d.ts.map +1 -0
  19. package/dist/src/browserState.js +21 -0
  20. package/dist/src/browserState.js.map +1 -0
  21. package/dist/src/cli.js +5 -3
  22. package/dist/src/cli.js.map +1 -1
  23. package/dist/src/cliCommands.d.ts.map +1 -1
  24. package/dist/src/cliCommands.js +218 -81
  25. package/dist/src/cliCommands.js.map +1 -1
  26. package/dist/src/config.d.ts +13 -0
  27. package/dist/src/config.d.ts.map +1 -1
  28. package/dist/src/config.js +50 -4
  29. package/dist/src/config.js.map +1 -1
  30. package/dist/src/index.d.ts +1 -1
  31. package/dist/src/index.d.ts.map +1 -1
  32. package/dist/src/index.js +2 -2
  33. package/dist/src/index.js.map +1 -1
  34. package/dist/src/oauthUtils.d.ts +49 -0
  35. package/dist/src/oauthUtils.d.ts.map +1 -0
  36. package/dist/src/oauthUtils.js +183 -0
  37. package/dist/src/oauthUtils.js.map +1 -0
  38. package/dist/src/playwrightUtils.d.ts +14 -1
  39. package/dist/src/playwrightUtils.d.ts.map +1 -1
  40. package/dist/src/playwrightUtils.js +37 -8
  41. package/dist/src/playwrightUtils.js.map +1 -1
  42. package/dist/src/registry.d.ts.map +1 -1
  43. package/dist/src/registry.js +20 -4
  44. package/dist/src/registry.js.map +1 -1
  45. package/dist/src/services/base.d.ts +43 -15
  46. package/dist/src/services/base.d.ts.map +1 -1
  47. package/dist/src/services/base.js +49 -9
  48. package/dist/src/services/base.js.map +1 -1
  49. package/dist/src/services/discord.d.ts +4 -3
  50. package/dist/src/services/discord.d.ts.map +1 -1
  51. package/dist/src/services/discord.js +6 -22
  52. package/dist/src/services/discord.js.map +1 -1
  53. package/dist/src/services/dropbox.d.ts +5 -4
  54. package/dist/src/services/dropbox.d.ts.map +1 -1
  55. package/dist/src/services/dropbox.js +10 -27
  56. package/dist/src/services/dropbox.js.map +1 -1
  57. package/dist/src/services/github.d.ts +5 -4
  58. package/dist/src/services/github.d.ts.map +1 -1
  59. package/dist/src/services/github.js +21 -30
  60. package/dist/src/services/github.js.map +1 -1
  61. package/dist/src/services/google.d.ts +34 -0
  62. package/dist/src/services/google.d.ts.map +1 -0
  63. package/dist/src/services/google.js +336 -0
  64. package/dist/src/services/google.js.map +1 -0
  65. package/dist/src/services/index.d.ts +4 -2
  66. package/dist/src/services/index.d.ts.map +1 -1
  67. package/dist/src/services/index.js +4 -1
  68. package/dist/src/services/index.js.map +1 -1
  69. package/dist/src/services/linear.d.ts +5 -4
  70. package/dist/src/services/linear.d.ts.map +1 -1
  71. package/dist/src/services/linear.js +10 -29
  72. package/dist/src/services/linear.js.map +1 -1
  73. package/dist/src/services/mailchimp.d.ts +11 -0
  74. package/dist/src/services/mailchimp.d.ts.map +1 -0
  75. package/dist/src/services/mailchimp.js +16 -0
  76. package/dist/src/services/mailchimp.js.map +1 -0
  77. package/dist/src/services/notion.d.ts +29 -0
  78. package/dist/src/services/notion.d.ts.map +1 -0
  79. package/dist/src/services/notion.js +102 -0
  80. package/dist/src/services/notion.js.map +1 -0
  81. package/dist/src/services/slack.d.ts +3 -1
  82. package/dist/src/services/slack.d.ts.map +1 -1
  83. package/dist/src/services/slack.js +5 -5
  84. package/dist/src/services/slack.js.map +1 -1
  85. package/dist/src/skillMd.d.ts +2 -0
  86. package/dist/src/skillMd.d.ts.map +1 -0
  87. package/dist/src/skillMd.js +19 -0
  88. package/dist/src/skillMd.js.map +1 -0
  89. package/dist/tests/apiCredentials.test.js +59 -1
  90. package/dist/tests/apiCredentials.test.js.map +1 -1
  91. package/dist/tests/cli.test.js +283 -104
  92. package/dist/tests/cli.test.js.map +1 -1
  93. package/dist/tests/playwrightDownload.test.js +2 -2
  94. package/dist/tests/playwrightDownload.test.js.map +1 -1
  95. package/dist/tests/registry.test.js +28 -3
  96. package/dist/tests/registry.test.js.map +1 -1
  97. package/dist/tests/servicesAgainstRecordings.test.js +3 -0
  98. package/dist/tests/servicesAgainstRecordings.test.js.map +1 -1
  99. package/package.json +6 -6
@@ -4,13 +4,37 @@
4
4
  import { existsSync, unlinkSync } from 'node:fs';
5
5
  import { createInterface } from 'node:readline';
6
6
  import { ApiCredentialStore } from './apiCredentialStore.js';
7
- import { ApiCredentialStatus } from './apiCredentials.js';
7
+ import { ApiCredentialStatus, RawCurlCredentials } from './apiCredentials.js';
8
8
  import { BROWSER_SOURCES, BrowserNotFoundError, DEFAULT_BROWSER_SOURCES, ensureBrowser, loadBrowserConfig, } from './browserConfig.js';
9
9
  import { CONFIG } from './config.js';
10
+ import { BrowserDisabledError, BrowserFlowsNotSupportedError } from './playwrightUtils.js';
10
11
  import { EncryptedStorage } from './encryptedStorage.js';
11
12
  import { REGISTRY } from './registry.js';
12
13
  import { LoginCancelledError, LoginFailedError } from './services/index.js';
13
14
  import { run as curlRun } from './curl.js';
15
+ import { getSkillMdContent } from './skillMd.js';
16
+ /**
17
+ * Try to refresh expired credentials if the service supports it.
18
+ * Returns refreshed credentials if successful, otherwise returns the original credentials.
19
+ */
20
+ async function maybeRefreshCredentials(service, apiCredentials, apiCredentialStore) {
21
+ if (apiCredentials.isExpired() !== true || !service.refreshCredentials) {
22
+ return apiCredentials;
23
+ }
24
+ const refreshedCredentials = await service.refreshCredentials(apiCredentials);
25
+ if (refreshedCredentials !== null) {
26
+ apiCredentialStore.save(service.name, refreshedCredentials);
27
+ return refreshedCredentials;
28
+ }
29
+ return apiCredentials;
30
+ }
31
+ async function getCredentialStatus(service, credentials, apiCredentialStore) {
32
+ if (credentials === null) {
33
+ return ApiCredentialStatus.Missing;
34
+ }
35
+ const refreshed = await maybeRefreshCredentials(service, credentials, apiCredentialStore);
36
+ return service.checkApiCredentials(refreshed);
37
+ }
14
38
  // Curl flags that don't affect the HTTP request semantics but may not be supported by URL extraction.
15
39
  const CURL_PASSTHROUGH_FLAGS = new Set(['-v', '--verbose']);
16
40
  /**
@@ -115,7 +139,7 @@ function clearService(deps, serviceName) {
115
139
  const service = deps.registry.getByName(serviceName);
116
140
  if (service === null) {
117
141
  deps.errorLog(`Error: Unknown service: ${serviceName}`);
118
- deps.errorLog("Use 'latchkey services' to see available services.");
142
+ deps.errorLog("Use 'latchkey services list' to see available services.");
119
143
  deps.exit(1);
120
144
  }
121
145
  const encryptedStorage = createEncryptedStorageFromConfig(deps.config);
@@ -128,11 +152,22 @@ function clearService(deps, serviceName) {
128
152
  deps.log(`No API credentials found for ${serviceName}.`);
129
153
  }
130
154
  }
155
+ /**
156
+ * Check if browser login is disabled via environment variable.
157
+ * Exits with error if LATCHKEY_DISABLE_BROWSER is set.
158
+ */
159
+ function checkBrowserNotDisabledOrExit(deps) {
160
+ if (deps.config.browserDisabled) {
161
+ deps.errorLog(new BrowserDisabledError().message);
162
+ deps.exit(1);
163
+ }
164
+ }
131
165
  /**
132
166
  * Get the browser launch options from configuration, handling errors with CLI output.
133
- * Exits with error if no valid browser config exists.
167
+ * Exits with error if no valid browser config exists or if browser is disabled.
134
168
  */
135
169
  function getBrowserLaunchOptionsOrExit(deps) {
170
+ checkBrowserNotDisabledOrExit(deps);
136
171
  const browserConfig = loadBrowserConfig(deps.config.configPath);
137
172
  if (!browserConfig) {
138
173
  deps.errorLog("Error: No browser configured. Run 'latchkey ensure-browser' first.");
@@ -147,48 +182,44 @@ function getBrowserLaunchOptionsOrExit(deps) {
147
182
  * Register all CLI commands on the given program.
148
183
  */
149
184
  export function registerCommands(program, deps) {
150
- program
185
+ const servicesCommand = program
151
186
  .command('services')
152
- .description('List known and supported third-party services.')
187
+ .description('Manage and inspect supported services.');
188
+ servicesCommand
189
+ .command('list')
190
+ .description('List all supported services.')
153
191
  .action(() => {
154
192
  const serviceNames = deps.registry.services.map((service) => service.name);
155
- deps.log(serviceNames.join(' '));
193
+ deps.log(JSON.stringify(serviceNames, null, 2));
156
194
  });
157
- program
158
- .command('ensure-browser')
159
- .description('Ensure a Chrome/Chromium browser is available for Latchkey to use.')
160
- .option('--source <sources>', `Comma-separated list of sources to try in order: ${BROWSER_SOURCES.join(', ')}`, DEFAULT_BROWSER_SOURCES.join(','))
161
- .action(async (options) => {
162
- const configPath = deps.config.configPath;
163
- // Parse and validate sources
164
- const sourceList = options.source.split(',').map((s) => s.trim());
165
- const invalidSources = sourceList.filter((s) => !BROWSER_SOURCES.includes(s));
166
- if (invalidSources.length > 0) {
167
- deps.errorLog(`Error: Invalid source(s): ${invalidSources.join(', ')}`);
168
- deps.errorLog(`Valid sources: ${BROWSER_SOURCES.join(', ')}`);
195
+ servicesCommand
196
+ .command('info')
197
+ .description('Show information about a service.')
198
+ .argument('<service_name>', 'Name of the service to get info for')
199
+ .action(async (serviceName) => {
200
+ const service = deps.registry.getByName(serviceName);
201
+ if (service === null) {
202
+ deps.errorLog(`Error: Unknown service: ${serviceName}`);
203
+ deps.errorLog("Use 'latchkey services list' to see available services.");
169
204
  deps.exit(1);
170
205
  }
171
- const sources = sourceList;
172
- deps.log(`Discovering browser using sources: ${sources.join(', ')}`);
173
- try {
174
- const { config, source } = await ensureBrowser(configPath, sources);
175
- deps.log('');
176
- deps.log('Browser configured successfully:');
177
- deps.log(` Path: ${config.executablePath}`);
178
- deps.log(` Found via: ${source}`);
179
- if (source !== 'existing-config') {
180
- deps.log(` Config saved to: ${configPath}`);
181
- }
182
- }
183
- catch (error) {
184
- if (error instanceof BrowserNotFoundError) {
185
- deps.errorLog(`Error: ${error.message}`);
186
- deps.exit(1);
187
- }
188
- throw error;
189
- }
206
+ // Login options
207
+ const supportsBrowser = service.getSession !== undefined && !deps.config.browserDisabled;
208
+ const authOptions = supportsBrowser ? ['browser', 'set'] : ['set'];
209
+ // Credentials status
210
+ const encryptedStorage = createEncryptedStorageFromConfig(deps.config);
211
+ const apiCredentialStore = new ApiCredentialStore(deps.config.credentialStorePath, encryptedStorage);
212
+ const apiCredentials = apiCredentialStore.get(serviceName);
213
+ const credentialStatus = await getCredentialStatus(service, apiCredentials, apiCredentialStore);
214
+ const info = {
215
+ authOptions,
216
+ credentialStatus,
217
+ developerNotes: service.info,
218
+ };
219
+ deps.log(JSON.stringify(info, null, 2));
190
220
  });
191
- program
221
+ const authCommand = program.command('auth').description('Manage authentication credentials.');
222
+ authCommand
192
223
  .command('clear')
193
224
  .description('Clear stored API credentials.')
194
225
  .argument('[service_name]', 'Name of the service to clear API credentials for')
@@ -201,56 +232,83 @@ export function registerCommands(program, deps) {
201
232
  clearService(deps, serviceName);
202
233
  }
203
234
  });
204
- program
205
- .command('status')
206
- .description('Check the API credential status for a service.')
207
- .argument('[service_name]', 'Name of the service to check status for')
208
- .action((serviceName) => {
235
+ authCommand
236
+ .command('list')
237
+ .description('List all stored credentials and their status.')
238
+ .action(async () => {
209
239
  const encryptedStorage = createEncryptedStorageFromConfig(deps.config);
210
240
  const apiCredentialStore = new ApiCredentialStore(deps.config.credentialStorePath, encryptedStorage);
241
+ const allCredentials = apiCredentialStore.getAll();
242
+ const entries = {};
243
+ for (const [serviceName, credentials] of allCredentials) {
244
+ const service = deps.registry.getByName(serviceName);
245
+ const credentialStatus = service !== null
246
+ ? await getCredentialStatus(service, credentials, apiCredentialStore)
247
+ : ApiCredentialStatus.Valid;
248
+ entries[serviceName] = {
249
+ credentialType: credentials.objectType,
250
+ credentialStatus,
251
+ };
252
+ }
253
+ deps.log(JSON.stringify(entries, null, 2));
254
+ });
255
+ authCommand
256
+ .command('set')
257
+ .description('Store credentials for a service in the form of arbitrary curl arguments.')
258
+ .argument('<service_name>', 'Name of the service to store credentials for')
259
+ .addHelpText('after', `\nExample:\n $ latchkey auth set slack -H "Authorization: Bearer xoxb-your-token"`)
260
+ .allowUnknownOption()
261
+ .allowExcessArguments()
262
+ .action((_serviceName, _options, command) => {
263
+ const [serviceName, ...curlArguments] = command.args;
211
264
  if (serviceName === undefined) {
212
- for (const service of deps.registry.services) {
213
- const apiCredentials = apiCredentialStore.get(service.name);
214
- if (apiCredentials === null) {
215
- deps.log(`${service.name}: ${ApiCredentialStatus.Missing}`);
216
- }
217
- else {
218
- const status = service.checkApiCredentials(apiCredentials);
219
- deps.log(`${service.name}: ${status}`);
220
- }
221
- }
222
- return;
265
+ deps.errorLog('Error: Service name is required.');
266
+ deps.exit(1);
223
267
  }
224
268
  const service = deps.registry.getByName(serviceName);
225
269
  if (service === null) {
226
270
  deps.errorLog(`Error: Unknown service: ${serviceName}`);
227
- deps.errorLog("Use 'latchkey services' to see available services.");
271
+ deps.errorLog("Use 'latchkey services list' to see available services.");
228
272
  deps.exit(1);
229
273
  }
230
- const apiCredentials = apiCredentialStore.get(serviceName);
231
- if (apiCredentials === null) {
232
- deps.log(ApiCredentialStatus.Missing);
233
- return;
274
+ if (!curlArguments.some((argument) => argument.startsWith('-'))) {
275
+ deps.errorLog("Error: Arguments don't look like valid curl options (expected at least one switch starting with '-').");
276
+ deps.errorLog(`Example: latchkey auth set ${serviceName} -H "Authorization: Bearer <token>"`);
277
+ deps.exit(1);
234
278
  }
235
- const apiCredentialStatus = service.checkApiCredentials(apiCredentials);
236
- deps.log(apiCredentialStatus);
279
+ const encryptedStorage = createEncryptedStorageFromConfig(deps.config);
280
+ const apiCredentialStore = new ApiCredentialStore(deps.config.credentialStorePath, encryptedStorage);
281
+ const credentials = new RawCurlCredentials(curlArguments);
282
+ apiCredentialStore.save(serviceName, credentials);
283
+ deps.log('Credentials stored.');
237
284
  });
238
- program
239
- .command('login')
240
- .description('Login to a service and store the API credentials.')
285
+ authCommand
286
+ .command('browser')
287
+ .description('Login to a service via the browser and store the API credentials.')
241
288
  .argument('<service_name>', 'Name of the service to login to')
242
289
  .action(async (serviceName) => {
243
290
  const service = deps.registry.getByName(serviceName);
244
291
  if (service === null) {
245
292
  deps.errorLog(`Error: Unknown service: ${serviceName}`);
246
- deps.errorLog("Use 'latchkey services' to see available services.");
293
+ deps.errorLog("Use 'latchkey services list' to see available services.");
294
+ deps.exit(1);
295
+ }
296
+ const session = service.getSession?.();
297
+ if (!session) {
298
+ deps.errorLog(new BrowserFlowsNotSupportedError(service.name).message);
247
299
  deps.exit(1);
248
300
  }
249
301
  const encryptedStorage = createEncryptedStorageFromConfig(deps.config);
250
302
  const apiCredentialStore = new ApiCredentialStore(deps.config.credentialStorePath, encryptedStorage);
303
+ const oldCredentials = apiCredentialStore.get(service.name);
304
+ if (session.prepare && oldCredentials === null) {
305
+ deps.errorLog(`Error: Service ${serviceName} requires preparation first.`);
306
+ deps.errorLog(`Run 'latchkey auth browser-prepare ${serviceName}' before logging in.`);
307
+ deps.exit(1);
308
+ }
251
309
  const launchOptions = getBrowserLaunchOptionsOrExit(deps);
252
310
  try {
253
- const apiCredentials = await service.getSession().login(encryptedStorage, launchOptions);
311
+ const apiCredentials = await session.login(encryptedStorage, launchOptions, oldCredentials ?? undefined);
254
312
  apiCredentialStore.save(service.name, apiCredentials);
255
313
  deps.log('Done');
256
314
  }
@@ -266,6 +324,48 @@ export function registerCommands(program, deps) {
266
324
  throw error;
267
325
  }
268
326
  });
327
+ authCommand
328
+ .command('browser-prepare')
329
+ .description('Prepare a service to be used with the browser command.')
330
+ .argument('<service_name>', 'Name of the service to prepare')
331
+ .action(async (serviceName) => {
332
+ const service = deps.registry.getByName(serviceName);
333
+ if (service === null) {
334
+ deps.errorLog(`Error: Unknown service: ${serviceName}`);
335
+ deps.errorLog("Use 'latchkey services list' to see available services.");
336
+ deps.exit(1);
337
+ }
338
+ const session = service.getSession?.();
339
+ if (!session?.prepare) {
340
+ deps.log('This service does not require a preparation step.');
341
+ return;
342
+ }
343
+ const encryptedStorage = createEncryptedStorageFromConfig(deps.config);
344
+ const apiCredentialStore = new ApiCredentialStore(deps.config.credentialStorePath, encryptedStorage);
345
+ // Check if already prepared (credentials exist)
346
+ const existingCredentials = apiCredentialStore.get(service.name);
347
+ if (existingCredentials !== null) {
348
+ deps.log('Already prepared.');
349
+ return;
350
+ }
351
+ const launchOptions = getBrowserLaunchOptionsOrExit(deps);
352
+ try {
353
+ const apiCredentials = await session.prepare(encryptedStorage, launchOptions);
354
+ apiCredentialStore.save(service.name, apiCredentials);
355
+ deps.log('Done');
356
+ }
357
+ catch (error) {
358
+ if (error instanceof LoginCancelledError) {
359
+ deps.errorLog('Preparation cancelled.');
360
+ deps.exit(1);
361
+ }
362
+ if (error instanceof LoginFailedError) {
363
+ deps.errorLog(error.message);
364
+ deps.exit(1);
365
+ }
366
+ throw error;
367
+ }
368
+ });
269
369
  program
270
370
  .command('curl')
271
371
  .description('Run curl with API credential injection.')
@@ -286,27 +386,64 @@ export function registerCommands(program, deps) {
286
386
  const encryptedStorage = createEncryptedStorageFromConfig(deps.config);
287
387
  const apiCredentialStore = new ApiCredentialStore(deps.config.credentialStorePath, encryptedStorage);
288
388
  let apiCredentials = apiCredentialStore.get(service.name);
389
+ // Check if credentials exist but are expired
390
+ const isExpired = apiCredentials?.isExpired() === true;
289
391
  if (apiCredentials === null) {
290
- const launchOptions = getBrowserLaunchOptionsOrExit(deps);
291
- try {
292
- apiCredentials = await service.getSession().login(encryptedStorage, launchOptions);
293
- apiCredentialStore.save(service.name, apiCredentials);
294
- }
295
- catch (error) {
296
- if (error instanceof LoginCancelledError) {
297
- deps.errorLog('Login cancelled.');
298
- deps.exit(1);
299
- }
300
- if (error instanceof LoginFailedError) {
301
- deps.errorLog(error.message);
302
- deps.exit(1);
303
- }
304
- throw error;
392
+ deps.errorLog(`Error: No credentials found for ${service.name}.`);
393
+ deps.errorLog(`Run 'latchkey auth browser ${service.name}' or 'latchkey auth set ${service.name}' first.`);
394
+ deps.exit(1);
395
+ }
396
+ if (isExpired) {
397
+ apiCredentials = await maybeRefreshCredentials(service, apiCredentials, apiCredentialStore);
398
+ if (apiCredentials.isExpired() === true) {
399
+ deps.errorLog(`Error: Credentials for ${service.name} are expired.`);
400
+ deps.errorLog(`Run 'latchkey auth browser ${service.name}' or 'latchkey auth set ${service.name}' to refresh them.`);
401
+ deps.exit(1);
305
402
  }
306
403
  }
307
404
  const allArguments = [...apiCredentials.asCurlArguments(), ...curlArguments];
308
405
  const result = deps.runCurl(allArguments);
309
406
  deps.exit(result.returncode);
310
407
  });
408
+ program
409
+ .command('skill-md')
410
+ .description('Print the SKILL.md file for AI agent integration.')
411
+ .action(async () => {
412
+ deps.log(await getSkillMdContent());
413
+ });
414
+ program
415
+ .command('ensure-browser')
416
+ .description('Ensure a Chrome/Chromium browser is available for Latchkey to use.')
417
+ .option('--source <sources>', `Comma-separated list of sources to try in order: ${BROWSER_SOURCES.join(', ')}`, DEFAULT_BROWSER_SOURCES.join(','))
418
+ .action(async (options) => {
419
+ const configPath = deps.config.configPath;
420
+ // Parse and validate sources
421
+ const sourceList = options.source.split(',').map((s) => s.trim());
422
+ const invalidSources = sourceList.filter((s) => !BROWSER_SOURCES.includes(s));
423
+ if (invalidSources.length > 0) {
424
+ deps.errorLog(`Error: Invalid source(s): ${invalidSources.join(', ')}`);
425
+ deps.errorLog(`Valid sources: ${BROWSER_SOURCES.join(', ')}`);
426
+ deps.exit(1);
427
+ }
428
+ const sources = sourceList;
429
+ deps.log(`Discovering browser using sources: ${sources.join(', ')}`);
430
+ try {
431
+ const { config, source } = await ensureBrowser(configPath, sources);
432
+ deps.log('');
433
+ deps.log('Browser configured successfully:');
434
+ deps.log(` Path: ${config.executablePath}`);
435
+ deps.log(` Found via: ${source}`);
436
+ if (source !== 'existing-config') {
437
+ deps.log(` Config saved to: ${configPath}`);
438
+ }
439
+ }
440
+ catch (error) {
441
+ if (error instanceof BrowserNotFoundError) {
442
+ deps.errorLog(`Error: ${error.message}`);
443
+ deps.exit(1);
444
+ }
445
+ throw error;
446
+ }
447
+ });
311
448
  }
312
449
  //# sourceMappingURL=cliCommands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cliCommands.js","sourceRoot":"","sources":["../../src/cliCommands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cliCommands.js","sourceRoot":"","sources":["../../src/cliCommands.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,9 @@
4
4
  export declare class InsecureFilePermissionsError extends Error {
5
5
  constructor(filePath: string, permissions: number);
6
6
  }
7
+ export declare class CurlNotFoundError extends Error {
8
+ constructor(curlCommand: string);
9
+ }
7
10
  export declare const DEFAULT_KEYRING_SERVICE_NAME = "latchkey";
8
11
  export declare const DEFAULT_KEYRING_ACCOUNT_NAME = "encryption-key";
9
12
  /**
@@ -22,12 +25,22 @@ export declare class Config {
22
25
  readonly encryptionKeyOverride: string | null;
23
26
  readonly serviceName: string;
24
27
  readonly accountName: string;
28
+ /**
29
+ * When true, the browser login flow is disabled.
30
+ * Commands that require browser login will fail with an error.
31
+ */
32
+ readonly browserDisabled: boolean;
25
33
  constructor(getEnv?: (name: string) => string | undefined);
26
34
  /**
27
35
  * Check that sensitive files have secure permissions.
28
36
  * Throws InsecureFilePermissionsError if any file is readable by group or others.
29
37
  */
30
38
  checkSensitiveFilePermissions(): void;
39
+ /**
40
+ * Check that system prerequisites are met.
41
+ * Throws CurlNotFoundError if curl is not available.
42
+ */
43
+ checkSystemPrerequisites(): void;
31
44
  }
32
45
  /**
33
46
  * Global configuration singleton, initialized from process.env at import time.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAOlD;AAUD,eAAO,MAAM,4BAA4B,aAAa,CAAC;AACvD,eAAO,MAAM,4BAA4B,mBAAmB,CAAC;AAmB7D;;GAEG;AACH,qBAAa,MAAM;IACjB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAuC;IA2BtF;;;OAGG;IACH,6BAA6B,IAAI,IAAI;CAmBtC;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAOlD;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,WAAW,EAAE,MAAM;CAIhC;AAWD,eAAO,MAAM,4BAA4B,aAAa,CAAC;AACvD,eAAO,MAAM,4BAA4B,mBAAmB,CAAC;AA8C7D;;GAEG;AACH,qBAAa,MAAM;IACjB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;gBAEtB,MAAM,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAuC;IA8BtF;;;OAGG;IACH,6BAA6B,IAAI,IAAI;IAoBrC;;;OAGG;IACH,wBAAwB,IAAI,IAAI;CAKjC;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * Configuration management for Latchkey.
3
3
  */
4
- import { existsSync, statSync } from 'node:fs';
4
+ import { accessSync, constants, existsSync, statSync } from 'node:fs';
5
5
  import { homedir } from 'node:os';
6
- import { join, resolve } from 'node:path';
6
+ import { delimiter, isAbsolute, join, resolve } from 'node:path';
7
7
  import { getDefaultConfigPath } from './browserConfig.js';
8
8
  import { isKeychainAvailable } from './keychain.js';
9
9
  export class InsecureFilePermissionsError extends Error {
@@ -13,13 +13,20 @@ export class InsecureFilePermissionsError extends Error {
13
13
  this.name = 'InsecureFilePermissionsError';
14
14
  }
15
15
  }
16
+ export class CurlNotFoundError extends Error {
17
+ constructor(curlCommand) {
18
+ super(`'${curlCommand}' is not available. Please install curl.`);
19
+ this.name = 'CurlNotFoundError';
20
+ }
21
+ }
16
22
  const LATCHKEY_STORE_ENV_VAR = 'LATCHKEY_STORE';
17
23
  const LATCHKEY_BROWSER_STATE_ENV_VAR = 'LATCHKEY_BROWSER_STATE';
18
24
  const LATCHKEY_CONFIG_ENV_VAR = 'LATCHKEY_CONFIG';
19
- const LATCHKEY_CURL_PATH_ENV_VAR = 'LATCHKEY_CURL_PATH';
25
+ const LATCHKEY_CURL_ENV_VAR = 'LATCHKEY_CURL';
20
26
  const LATCHKEY_ENCRYPTION_KEY_ENV_VAR = 'LATCHKEY_ENCRYPTION_KEY';
21
27
  const LATCHKEY_KEYRING_SERVICE_NAME_ENV_VAR = 'LATCHKEY_KEYRING_SERVICE_NAME';
22
28
  const LATCHKEY_KEYRING_ACCOUNT_NAME_ENV_VAR = 'LATCHKEY_KEYRING_ACCOUNT_NAME';
29
+ const LATCHKEY_DISABLE_BROWSER_ENV_VAR = 'LATCHKEY_DISABLE_BROWSER';
23
30
  export const DEFAULT_KEYRING_SERVICE_NAME = 'latchkey';
24
31
  export const DEFAULT_KEYRING_ACCOUNT_NAME = 'encryption-key';
25
32
  function getDefaultCredentialStorePath(encryptionEnabled) {
@@ -36,6 +43,29 @@ function resolvePathWithTildeExpansion(path) {
36
43
  }
37
44
  return resolve(path);
38
45
  }
46
+ function isExecutable(filePath) {
47
+ try {
48
+ accessSync(filePath, constants.X_OK);
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ function findInPath(command) {
56
+ if (isAbsolute(command)) {
57
+ return isExecutable(command);
58
+ }
59
+ const pathEnv = process.env.PATH ?? '';
60
+ const pathDirs = pathEnv.split(delimiter);
61
+ for (const dir of pathDirs) {
62
+ const fullPath = join(dir, command);
63
+ if (isExecutable(fullPath)) {
64
+ return true;
65
+ }
66
+ }
67
+ return false;
68
+ }
39
69
  /**
40
70
  * Configuration for Latchkey, sourced from environment variables with sensible defaults.
41
71
  */
@@ -52,13 +82,20 @@ export class Config {
52
82
  encryptionKeyOverride;
53
83
  serviceName;
54
84
  accountName;
85
+ /**
86
+ * When true, the browser login flow is disabled.
87
+ * Commands that require browser login will fail with an error.
88
+ */
89
+ browserDisabled;
55
90
  constructor(getEnv = (name) => process.env[name]) {
56
- this.curlCommand = getEnv(LATCHKEY_CURL_PATH_ENV_VAR) ?? 'curl';
91
+ this.curlCommand = getEnv(LATCHKEY_CURL_ENV_VAR) ?? 'curl';
57
92
  this.encryptionKeyOverride = getEnv(LATCHKEY_ENCRYPTION_KEY_ENV_VAR) ?? null;
58
93
  this.serviceName =
59
94
  getEnv(LATCHKEY_KEYRING_SERVICE_NAME_ENV_VAR) ?? DEFAULT_KEYRING_SERVICE_NAME;
60
95
  this.accountName =
61
96
  getEnv(LATCHKEY_KEYRING_ACCOUNT_NAME_ENV_VAR) ?? DEFAULT_KEYRING_ACCOUNT_NAME;
97
+ const browserDisabledEnv = getEnv(LATCHKEY_DISABLE_BROWSER_ENV_VAR);
98
+ this.browserDisabled = browserDisabledEnv !== undefined && browserDisabledEnv !== '';
62
99
  // Determine if encryption will be enabled (either via key override or keychain)
63
100
  const encryptionEnabled = this.encryptionKeyOverride !== null ||
64
101
  isKeychainAvailable(this.serviceName, this.accountName);
@@ -93,6 +130,15 @@ export class Config {
93
130
  }
94
131
  }
95
132
  }
133
+ /**
134
+ * Check that system prerequisites are met.
135
+ * Throws CurlNotFoundError if curl is not available.
136
+ */
137
+ checkSystemPrerequisites() {
138
+ if (!findInPath(this.curlCommand)) {
139
+ throw new CurlNotFoundError(this.curlCommand);
140
+ }
141
+ }
96
142
  }
97
143
  /**
98
144
  * Global configuration singleton, initialized from process.env at import time.
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@ export { encrypt, decrypt, generateKey, EncryptionError, DecryptionError } from
8
8
  export { EncryptedStorage, EncryptedStorageError } from './encryptedStorage.js';
9
9
  export { storeInKeychain, retrieveFromKeychain, deleteFromKeychain, isKeychainAvailable, KeychainError, KeychainNotAvailableError, } from './keychain.js';
10
10
  export { run as runCurl, runCaptured as runCurlCaptured, setSubprocessRunner, resetSubprocessRunner, setCapturingSubprocessRunner, resetCapturingSubprocessRunner, } from './curl.js';
11
- export { typeLikeHuman } from './playwrightUtils.js';
11
+ export { typeLikeHuman, BrowserDisabledError, BrowserFlowsNotSupportedError, } from './playwrightUtils.js';
12
12
  export { Service, ServiceSession, SimpleServiceSession, BrowserFollowupServiceSession, LoginCancelledError, LoginFailedError, Slack, SLACK, Discord, DISCORD, Github, GITHUB, Dropbox, DROPBOX, Linear, LINEAR, } from './services/index.js';
13
13
  export { Registry, REGISTRY } from './registry.js';
14
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElG,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,GAAG,IAAI,OAAO,EACd,WAAW,IAAI,eAAe,EAC9B,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,6BAA6B,EAC7B,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,GACP,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElG,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,GAAG,IAAI,OAAO,EACd,WAAW,IAAI,eAAe,EAC9B,mBAAmB,EACnB,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,GAC/B,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,6BAA6B,EAC7B,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,MAAM,GACP,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}