latchkey 2.4.2 → 2.5.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 (50) hide show
  1. package/README.md +5 -0
  2. package/dist/package.json +1 -1
  3. package/dist/scripts/encryptFile.d.ts +21 -0
  4. package/dist/scripts/encryptFile.d.ts.map +1 -0
  5. package/dist/scripts/encryptFile.js +101 -0
  6. package/dist/scripts/encryptFile.js.map +1 -0
  7. package/dist/skills/generic/SKILL.md +114 -0
  8. package/dist/skills/generic/latchkey/SKILL.md +114 -0
  9. package/dist/skills/openclaw/SKILL.md +106 -0
  10. package/dist/skills/openclaw/latchkey/SKILL.md +106 -0
  11. package/dist/src/browserState.d.ts +8 -0
  12. package/dist/src/browserState.d.ts.map +1 -0
  13. package/dist/src/browserState.js +21 -0
  14. package/dist/src/browserState.js.map +1 -0
  15. package/dist/src/cli.js +1 -1
  16. package/dist/src/cli.js.map +1 -1
  17. package/dist/src/latestVersionCheck.d.ts +10 -0
  18. package/dist/src/latestVersionCheck.d.ts.map +1 -0
  19. package/dist/src/latestVersionCheck.js +42 -0
  20. package/dist/src/latestVersionCheck.js.map +1 -0
  21. package/dist/src/registeredService.d.ts +20 -0
  22. package/dist/src/registeredService.d.ts.map +1 -0
  23. package/dist/src/registeredService.js +34 -0
  24. package/dist/src/registeredService.js.map +1 -0
  25. package/dist/src/registeredServiceStore.d.ts +24 -0
  26. package/dist/src/registeredServiceStore.d.ts.map +1 -0
  27. package/dist/src/registeredServiceStore.js +70 -0
  28. package/dist/src/registeredServiceStore.js.map +1 -0
  29. package/dist/src/services/google/maps.d.ts +39 -0
  30. package/dist/src/services/google/maps.d.ts.map +1 -0
  31. package/dist/src/services/google/maps.js +94 -0
  32. package/dist/src/services/google/maps.js.map +1 -0
  33. package/dist/src/services/google.d.ts.map +1 -1
  34. package/dist/src/services/google.js +4 -3
  35. package/dist/src/services/google.js.map +1 -1
  36. package/dist/src/services/googleAnalytics.d.ts +11 -0
  37. package/dist/src/services/googleAnalytics.d.ts.map +1 -0
  38. package/dist/src/services/googleAnalytics.js +18 -0
  39. package/dist/src/services/googleAnalytics.js.map +1 -0
  40. package/dist/src/services/googleMaps.d.ts +12 -0
  41. package/dist/src/services/googleMaps.d.ts.map +1 -0
  42. package/dist/src/services/googleMaps.js +17 -0
  43. package/dist/src/services/googleMaps.js.map +1 -0
  44. package/dist/src/skillMd.js +2 -2
  45. package/dist/src/skillMd.js.map +1 -1
  46. package/dist/tests/latestVersionCheck.test.d.ts +2 -0
  47. package/dist/tests/latestVersionCheck.test.d.ts.map +1 -0
  48. package/dist/tests/latestVersionCheck.test.js +80 -0
  49. package/dist/tests/latestVersionCheck.test.js.map +1 -0
  50. package/package.json +7 -3
@@ -0,0 +1,80 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync, existsSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { Config } from '../src/config.js';
6
+ import { checkLatestVersionIfNeeded } from '../src/latestVersionCheck.js';
7
+ import { setDetachedSubprocessRunner, resetDetachedSubprocessRunner } from '../src/curl.js';
8
+ describe('checkLatestVersionIfNeeded', () => {
9
+ let directory;
10
+ let config;
11
+ let detachedCalls;
12
+ beforeEach(() => {
13
+ directory = mkdtempSync(join(tmpdir(), 'latchkey-version-check-'));
14
+ config = new Config(() => undefined);
15
+ // Override directory via a new Config with custom env
16
+ config = new Config((name) => (name === 'LATCHKEY_DIRECTORY' ? directory : undefined));
17
+ detachedCalls = [];
18
+ setDetachedSubprocessRunner((args) => {
19
+ detachedCalls = [...detachedCalls, [...args]];
20
+ });
21
+ });
22
+ afterEach(() => {
23
+ resetDetachedSubprocessRunner();
24
+ rmSync(directory, { recursive: true, force: true });
25
+ });
26
+ it('should fire a request when the file does not exist', () => {
27
+ checkLatestVersionIfNeeded(config);
28
+ expect(detachedCalls).toHaveLength(1);
29
+ expect(detachedCalls[0]).toContain('https://dau-tracker.latchkey.host.imbue.com/api/version/latchkey');
30
+ expect(detachedCalls[0]).toContain('--max-time');
31
+ expect(detachedCalls[0]).toContain('5');
32
+ });
33
+ it('should write the current timestamp to the file after firing', () => {
34
+ checkLatestVersionIfNeeded(config);
35
+ const filePath = join(directory, 'latest-version-check');
36
+ expect(existsSync(filePath)).toBe(true);
37
+ const content = readFileSync(filePath, 'utf-8').trim();
38
+ const timestamp = new Date(content);
39
+ expect(isNaN(timestamp.getTime())).toBe(false);
40
+ expect(Date.now() - timestamp.getTime()).toBeLessThan(5000);
41
+ });
42
+ it('should not fire a request when the file has a recent timestamp', () => {
43
+ const filePath = join(directory, 'latest-version-check');
44
+ writeFileSync(filePath, new Date().toISOString(), 'utf-8');
45
+ checkLatestVersionIfNeeded(config);
46
+ expect(detachedCalls).toHaveLength(0);
47
+ });
48
+ it('should fire a request when the timestamp is older than 24 hours', () => {
49
+ const filePath = join(directory, 'latest-version-check');
50
+ const oldDate = new Date(Date.now() - 25 * 60 * 60 * 1000);
51
+ writeFileSync(filePath, oldDate.toISOString(), 'utf-8');
52
+ checkLatestVersionIfNeeded(config);
53
+ expect(detachedCalls).toHaveLength(1);
54
+ });
55
+ it('should fire a request when the file contains invalid content', () => {
56
+ const filePath = join(directory, 'latest-version-check');
57
+ writeFileSync(filePath, 'not-a-date', 'utf-8');
58
+ checkLatestVersionIfNeeded(config);
59
+ expect(detachedCalls).toHaveLength(1);
60
+ });
61
+ it('should not fire a request when telemetry is disabled', () => {
62
+ const telemetryDisabledConfig = new Config((name) => {
63
+ if (name === 'LATCHKEY_DIRECTORY')
64
+ return directory;
65
+ if (name === 'LATCHKEY_DISABLE_TELEMETRY')
66
+ return '1';
67
+ return undefined;
68
+ });
69
+ checkLatestVersionIfNeeded(telemetryDisabledConfig);
70
+ expect(detachedCalls).toHaveLength(0);
71
+ });
72
+ it('should not fire a request when the timestamp is exactly 23 hours old', () => {
73
+ const filePath = join(directory, 'latest-version-check');
74
+ const recentDate = new Date(Date.now() - 23 * 60 * 60 * 1000);
75
+ writeFileSync(filePath, recentDate.toISOString(), 'utf-8');
76
+ checkLatestVersionIfNeeded(config);
77
+ expect(detachedCalls).toHaveLength(0);
78
+ });
79
+ });
80
+ //# sourceMappingURL=latestVersionCheck.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latestVersionCheck.test.js","sourceRoot":"","sources":["../../tests/latestVersionCheck.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "latchkey",
3
- "version": "2.4.2",
3
+ "version": "2.5.0",
4
4
  "description": "A CLI tool that injects API credentials into curl requests to third-party services",
5
5
  "author": "Imbue <hynek@imbue.com>",
6
6
  "repository": {
@@ -24,7 +24,7 @@
24
24
  ],
25
25
  "scripts": {
26
26
  "prepublishOnly": "npm run build",
27
- "build": "tsc && node -e \"require('fs').cpSync('integrations', 'dist/integrations', {recursive:true})\" ",
27
+ "build": "tsc && node -e \"require('fs').cpSync('skills', 'dist/skills', {recursive:true})\" ",
28
28
  "dev": "tsc --watch",
29
29
  "lint": "eslint src tests scripts",
30
30
  "lint:fix": "eslint src tests scripts --fix",
@@ -43,7 +43,8 @@
43
43
  "credentials",
44
44
  "authentication",
45
45
  "agents",
46
- "imbue"
46
+ "imbue",
47
+ "pi-package"
47
48
  ],
48
49
  "license": "MIT",
49
50
  "engines": {
@@ -63,5 +64,8 @@
63
64
  "typescript": "^5.3.0",
64
65
  "typescript-eslint": "^8.53.1",
65
66
  "vitest": "^4.0.18"
67
+ },
68
+ "pi": {
69
+ "skills": ["./skills/generic"]
66
70
  }
67
71
  }