latchkey 2.21.0 → 3.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 (230) hide show
  1. package/README.md +36 -4
  2. package/dist/skills/generic/latchkey/SKILL.md +21 -0
  3. package/dist/skills/openclaw/latchkey/SKILL.md +21 -0
  4. package/dist/src/apiCredentials/account.d.ts +28 -0
  5. package/dist/src/apiCredentials/account.d.ts.map +1 -0
  6. package/dist/src/apiCredentials/account.js +49 -0
  7. package/dist/src/apiCredentials/account.js.map +1 -0
  8. package/dist/src/apiCredentials/store.d.ts +70 -4
  9. package/dist/src/apiCredentials/store.d.ts.map +1 -1
  10. package/dist/src/apiCredentials/store.js +161 -19
  11. package/dist/src/apiCredentials/store.js.map +1 -1
  12. package/dist/src/apiCredentials/utils.d.ts +2 -2
  13. package/dist/src/apiCredentials/utils.d.ts.map +1 -1
  14. package/dist/src/apiCredentials/utils.js +5 -5
  15. package/dist/src/apiCredentials/utils.js.map +1 -1
  16. package/dist/src/cli.js +1 -1
  17. package/dist/src/cli.js.map +1 -1
  18. package/dist/src/cliCommands.d.ts.map +1 -1
  19. package/dist/src/cliCommands.js +118 -22
  20. package/dist/src/cliCommands.js.map +1 -1
  21. package/dist/src/config.d.ts +6 -0
  22. package/dist/src/config.d.ts.map +1 -1
  23. package/dist/src/config.js +8 -0
  24. package/dist/src/config.js.map +1 -1
  25. package/dist/src/configDataStore.d.ts +3 -0
  26. package/dist/src/configDataStore.d.ts.map +1 -1
  27. package/dist/src/configDataStore.js +1 -0
  28. package/dist/src/configDataStore.js.map +1 -1
  29. package/dist/src/curl.d.ts +21 -16
  30. package/dist/src/curl.d.ts.map +1 -1
  31. package/dist/src/curl.js +17 -24
  32. package/dist/src/curl.js.map +1 -1
  33. package/dist/src/curlInjection.d.ts +8 -2
  34. package/dist/src/curlInjection.d.ts.map +1 -1
  35. package/dist/src/curlInjection.js +13 -8
  36. package/dist/src/curlInjection.js.map +1 -1
  37. package/dist/src/errorMessages.d.ts +2 -2
  38. package/dist/src/errorMessages.d.ts.map +1 -1
  39. package/dist/src/errorMessages.js +22 -6
  40. package/dist/src/errorMessages.js.map +1 -1
  41. package/dist/src/gateway/gatewayEndpoint.d.ts +1 -1
  42. package/dist/src/gateway/gatewayEndpoint.d.ts.map +1 -1
  43. package/dist/src/gateway/gatewayEndpoint.js +3 -1
  44. package/dist/src/gateway/gatewayEndpoint.js.map +1 -1
  45. package/dist/src/gateway/latchkeyEndpoint.d.ts +6 -0
  46. package/dist/src/gateway/latchkeyEndpoint.d.ts.map +1 -1
  47. package/dist/src/gateway/latchkeyEndpoint.js +6 -4
  48. package/dist/src/gateway/latchkeyEndpoint.js.map +1 -1
  49. package/dist/src/index.d.ts +2 -2
  50. package/dist/src/index.d.ts.map +1 -1
  51. package/dist/src/index.js +1 -1
  52. package/dist/src/index.js.map +1 -1
  53. package/dist/src/migrations.d.ts +21 -1
  54. package/dist/src/migrations.d.ts.map +1 -1
  55. package/dist/src/migrations.js +112 -4
  56. package/dist/src/migrations.js.map +1 -1
  57. package/dist/src/oauthUtils.d.ts +2 -2
  58. package/dist/src/oauthUtils.d.ts.map +1 -1
  59. package/dist/src/oauthUtils.js +5 -5
  60. package/dist/src/oauthUtils.js.map +1 -1
  61. package/dist/src/services/aws.d.ts +1 -0
  62. package/dist/src/services/aws.d.ts.map +1 -1
  63. package/dist/src/services/aws.js +13 -0
  64. package/dist/src/services/aws.js.map +1 -1
  65. package/dist/src/services/calendly.d.ts +2 -0
  66. package/dist/src/services/calendly.d.ts.map +1 -1
  67. package/dist/src/services/calendly.js +7 -0
  68. package/dist/src/services/calendly.js.map +1 -1
  69. package/dist/src/services/coolify.d.ts +3 -1
  70. package/dist/src/services/coolify.d.ts.map +1 -1
  71. package/dist/src/services/coolify.js +10 -1
  72. package/dist/src/services/coolify.js.map +1 -1
  73. package/dist/src/services/core/base.d.ts +43 -1
  74. package/dist/src/services/core/base.d.ts.map +1 -1
  75. package/dist/src/services/core/base.js +29 -9
  76. package/dist/src/services/core/base.js.map +1 -1
  77. package/dist/src/services/core/registered.d.ts +1 -0
  78. package/dist/src/services/core/registered.d.ts.map +1 -1
  79. package/dist/src/services/core/registered.js +5 -0
  80. package/dist/src/services/core/registered.js.map +1 -1
  81. package/dist/src/services/discord.d.ts +1 -0
  82. package/dist/src/services/discord.d.ts.map +1 -1
  83. package/dist/src/services/discord.js +9 -0
  84. package/dist/src/services/discord.js.map +1 -1
  85. package/dist/src/services/dropbox.d.ts +2 -1
  86. package/dist/src/services/dropbox.d.ts.map +1 -1
  87. package/dist/src/services/dropbox.js +17 -11
  88. package/dist/src/services/dropbox.js.map +1 -1
  89. package/dist/src/services/figma.d.ts +2 -0
  90. package/dist/src/services/figma.d.ts.map +1 -1
  91. package/dist/src/services/figma.js +7 -0
  92. package/dist/src/services/figma.js.map +1 -1
  93. package/dist/src/services/github.d.ts +1 -0
  94. package/dist/src/services/github.d.ts.map +1 -1
  95. package/dist/src/services/github.js +9 -0
  96. package/dist/src/services/github.js.map +1 -1
  97. package/dist/src/services/gitlab.d.ts +2 -0
  98. package/dist/src/services/gitlab.d.ts.map +1 -1
  99. package/dist/src/services/gitlab.js +9 -0
  100. package/dist/src/services/gitlab.js.map +1 -1
  101. package/dist/src/services/google/analytics.d.ts +0 -1
  102. package/dist/src/services/google/analytics.d.ts.map +1 -1
  103. package/dist/src/services/google/analytics.js +0 -3
  104. package/dist/src/services/google/analytics.js.map +1 -1
  105. package/dist/src/services/google/base.d.ts +11 -0
  106. package/dist/src/services/google/base.d.ts.map +1 -1
  107. package/dist/src/services/google/base.js +26 -7
  108. package/dist/src/services/google/base.js.map +1 -1
  109. package/dist/src/services/google/calendar.d.ts +0 -1
  110. package/dist/src/services/google/calendar.d.ts.map +1 -1
  111. package/dist/src/services/google/calendar.js +0 -3
  112. package/dist/src/services/google/calendar.js.map +1 -1
  113. package/dist/src/services/google/directions.d.ts +1 -0
  114. package/dist/src/services/google/directions.d.ts.map +1 -1
  115. package/dist/src/services/google/directions.js +5 -0
  116. package/dist/src/services/google/directions.js.map +1 -1
  117. package/dist/src/services/google/docs.d.ts +0 -1
  118. package/dist/src/services/google/docs.d.ts.map +1 -1
  119. package/dist/src/services/google/docs.js +0 -3
  120. package/dist/src/services/google/docs.js.map +1 -1
  121. package/dist/src/services/google/drive.d.ts +0 -1
  122. package/dist/src/services/google/drive.d.ts.map +1 -1
  123. package/dist/src/services/google/drive.js +0 -3
  124. package/dist/src/services/google/drive.js.map +1 -1
  125. package/dist/src/services/google/gmail.d.ts +0 -1
  126. package/dist/src/services/google/gmail.d.ts.map +1 -1
  127. package/dist/src/services/google/gmail.js +0 -3
  128. package/dist/src/services/google/gmail.js.map +1 -1
  129. package/dist/src/services/google/people.d.ts +0 -1
  130. package/dist/src/services/google/people.d.ts.map +1 -1
  131. package/dist/src/services/google/people.js +0 -3
  132. package/dist/src/services/google/people.js.map +1 -1
  133. package/dist/src/services/google/sheets.d.ts +0 -1
  134. package/dist/src/services/google/sheets.d.ts.map +1 -1
  135. package/dist/src/services/google/sheets.js +0 -3
  136. package/dist/src/services/google/sheets.js.map +1 -1
  137. package/dist/src/services/google/slides.d.ts +0 -1
  138. package/dist/src/services/google/slides.d.ts.map +1 -1
  139. package/dist/src/services/google/slides.js +0 -3
  140. package/dist/src/services/google/slides.js.map +1 -1
  141. package/dist/src/services/index.d.ts +1 -1
  142. package/dist/src/services/index.d.ts.map +1 -1
  143. package/dist/src/services/index.js.map +1 -1
  144. package/dist/src/services/linear.d.ts +2 -1
  145. package/dist/src/services/linear.d.ts.map +1 -1
  146. package/dist/src/services/linear.js +8 -1
  147. package/dist/src/services/linear.js.map +1 -1
  148. package/dist/src/services/mailchimp.d.ts +2 -0
  149. package/dist/src/services/mailchimp.d.ts.map +1 -1
  150. package/dist/src/services/mailchimp.js +7 -0
  151. package/dist/src/services/mailchimp.js.map +1 -1
  152. package/dist/src/services/notion-mcp.d.ts +3 -2
  153. package/dist/src/services/notion-mcp.d.ts.map +1 -1
  154. package/dist/src/services/notion-mcp.js +111 -14
  155. package/dist/src/services/notion-mcp.js.map +1 -1
  156. package/dist/src/services/notion.d.ts +2 -0
  157. package/dist/src/services/notion.d.ts.map +1 -1
  158. package/dist/src/services/notion.js +17 -0
  159. package/dist/src/services/notion.js.map +1 -1
  160. package/dist/src/services/ramp.d.ts +11 -2
  161. package/dist/src/services/ramp.d.ts.map +1 -1
  162. package/dist/src/services/ramp.js +35 -9
  163. package/dist/src/services/ramp.js.map +1 -1
  164. package/dist/src/services/sentry.d.ts +3 -2
  165. package/dist/src/services/sentry.d.ts.map +1 -1
  166. package/dist/src/services/sentry.js +12 -27
  167. package/dist/src/services/sentry.js.map +1 -1
  168. package/dist/src/services/slack.d.ts +3 -2
  169. package/dist/src/services/slack.d.ts.map +1 -1
  170. package/dist/src/services/slack.js +19 -13
  171. package/dist/src/services/slack.js.map +1 -1
  172. package/dist/src/services/stripe.d.ts +7 -0
  173. package/dist/src/services/stripe.d.ts.map +1 -1
  174. package/dist/src/services/stripe.js +15 -0
  175. package/dist/src/services/stripe.js.map +1 -1
  176. package/dist/src/services/telegram.d.ts +1 -0
  177. package/dist/src/services/telegram.d.ts.map +1 -1
  178. package/dist/src/services/telegram.js +7 -0
  179. package/dist/src/services/telegram.js.map +1 -1
  180. package/dist/src/services/todoist.d.ts +2 -1
  181. package/dist/src/services/todoist.d.ts.map +1 -1
  182. package/dist/src/services/todoist.js +9 -1
  183. package/dist/src/services/todoist.js.map +1 -1
  184. package/dist/src/services/umami.d.ts +3 -1
  185. package/dist/src/services/umami.d.ts.map +1 -1
  186. package/dist/src/services/umami.js +11 -1
  187. package/dist/src/services/umami.js.map +1 -1
  188. package/dist/src/services/yelp.d.ts +1 -0
  189. package/dist/src/services/yelp.d.ts.map +1 -1
  190. package/dist/src/services/yelp.js +5 -0
  191. package/dist/src/services/yelp.js.map +1 -1
  192. package/dist/src/services/zoom.d.ts +8 -0
  193. package/dist/src/services/zoom.d.ts.map +1 -1
  194. package/dist/src/services/zoom.js +16 -0
  195. package/dist/src/services/zoom.js.map +1 -1
  196. package/dist/src/sharedOperations.d.ts +30 -10
  197. package/dist/src/sharedOperations.d.ts.map +1 -1
  198. package/dist/src/sharedOperations.js +67 -29
  199. package/dist/src/sharedOperations.js.map +1 -1
  200. package/dist/src/version.d.ts +1 -1
  201. package/dist/src/version.d.ts.map +1 -1
  202. package/dist/src/version.js +1 -1
  203. package/dist/src/version.js.map +1 -1
  204. package/dist/tests/apiCredentialStore.test.js +155 -2
  205. package/dist/tests/apiCredentialStore.test.js.map +1 -1
  206. package/dist/tests/apiCredentialsUtils.test.js +1 -1
  207. package/dist/tests/apiCredentialsUtils.test.js.map +1 -1
  208. package/dist/tests/cli.test.js +334 -147
  209. package/dist/tests/cli.test.js.map +1 -1
  210. package/dist/tests/config.test.js +5 -0
  211. package/dist/tests/config.test.js.map +1 -1
  212. package/dist/tests/gateway.test.js +8 -18
  213. package/dist/tests/gateway.test.js.map +1 -1
  214. package/dist/tests/latchkeyEndpoint.test.js +18 -28
  215. package/dist/tests/latchkeyEndpoint.test.js.map +1 -1
  216. package/dist/tests/migrations.test.js +220 -39
  217. package/dist/tests/migrations.test.js.map +1 -1
  218. package/dist/tests/mockService.d.ts +25 -0
  219. package/dist/tests/mockService.d.ts.map +1 -0
  220. package/dist/tests/mockService.js +40 -0
  221. package/dist/tests/mockService.js.map +1 -0
  222. package/dist/tests/oauthUtils.test.js +12 -12
  223. package/dist/tests/oauthUtils.test.js.map +1 -1
  224. package/dist/tests/serviceAccounts.test.d.ts +12 -0
  225. package/dist/tests/serviceAccounts.test.d.ts.map +1 -0
  226. package/dist/tests/serviceAccounts.test.js +278 -0
  227. package/dist/tests/serviceAccounts.test.js.map +1 -0
  228. package/dist/tests/sharedOperations.test.js +327 -58
  229. package/dist/tests/sharedOperations.test.js.map +1 -1
  230. package/package.json +1 -1
@@ -6,6 +6,8 @@ import { Config } from '../src/config.js';
6
6
  import { EncryptedStorage } from '../src/encryptedStorage.js';
7
7
  import { generateKey } from '../src/encryption.js';
8
8
  import { runMigrations, readDataFormatVersion, LATEST_VERSION, MigrationError, } from '../src/migrations.js';
9
+ import { ApiCredentialStatus } from '../src/apiCredentials/base.js';
10
+ import { setAsyncSubprocessRunner, resetAsyncSubprocessRunner } from '../src/curl.js';
9
11
  function createTestConfig(directory) {
10
12
  return new Config((name) => {
11
13
  if (name === 'LATCHKEY_DIRECTORY')
@@ -13,6 +15,19 @@ function createTestConfig(directory) {
13
15
  return undefined;
14
16
  });
15
17
  }
18
+ /**
19
+ * Resolver that never hits the network. It reports every credential as
20
+ * inconclusive, which makes the accounts migration keep each service under the
21
+ * default account (the pre-network behaviour these tests were written for).
22
+ */
23
+ const inconclusiveResolver = () => Promise.resolve({ status: ApiCredentialStatus.Unknown, account: null });
24
+ /**
25
+ * Build a resolver from a fixed map of service name to resolved credential,
26
+ * defaulting to inconclusive for anything not listed.
27
+ */
28
+ function resolverFromMap(results) {
29
+ return (serviceName) => Promise.resolve(results[serviceName] ?? { status: ApiCredentialStatus.Unknown, account: null });
30
+ }
16
31
  describe('migrations', () => {
17
32
  let tempDir;
18
33
  let encryptionKey;
@@ -25,6 +40,7 @@ describe('migrations', () => {
25
40
  config = createTestConfig(tempDir);
26
41
  });
27
42
  afterEach(() => {
43
+ resetAsyncSubprocessRunner();
28
44
  rmSync(tempDir, { recursive: true, force: true });
29
45
  });
30
46
  describe('readDataFormatVersion', () => {
@@ -49,40 +65,40 @@ describe('migrations', () => {
49
65
  });
50
66
  });
51
67
  describe('runMigrations', () => {
52
- it('should skip migrations on first installation (no directory)', () => {
68
+ it('should skip migrations but stamp the version on first installation (no directory)', async () => {
53
69
  const freshConfig = createTestConfig(join(tempDir, 'nonexistent'));
54
- runMigrations(freshConfig, encryptedStorage);
55
- // Should not throw and should not create any files
56
- expect(existsSync(join(tempDir, 'nonexistent', 'data-format-version'))).toBe(false);
70
+ await runMigrations(freshConfig, encryptedStorage, inconclusiveResolver);
71
+ // A fresh installation starts in the newest format; the version stamp
72
+ // prevents future runs from "migrating" a store created in that format.
73
+ expect(readDataFormatVersion(freshConfig)).toBe(LATEST_VERSION);
74
+ expect(existsSync(join(tempDir, 'nonexistent', 'credentials.json'))).toBe(false);
57
75
  });
58
- it('should skip migrations on first installation (directory exists but no credentials)', () => {
76
+ it('should skip migrations but stamp the version on first installation (directory exists but no credentials)', async () => {
59
77
  // tempDir exists but has no credentials file
60
- runMigrations(config, encryptedStorage);
61
- expect(existsSync(join(tempDir, 'data-format-version'))).toBe(false);
78
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
79
+ expect(readDataFormatVersion(config)).toBe(LATEST_VERSION);
62
80
  });
63
- it('should run migrations when credentials exist and version is 0', () => {
81
+ it('should run migrations when credentials exist and version is 0', async () => {
64
82
  // Create a credentials store with no "google" entry
65
83
  encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: { objectType: 'slack', token: 't', dCookie: 'd' } }));
66
- runMigrations(config, encryptedStorage);
84
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
67
85
  expect(readDataFormatVersion(config)).toBe(LATEST_VERSION);
68
86
  });
69
- it('should not run migrations when already at latest version', () => {
87
+ it('should not run migrations when already at latest version', async () => {
70
88
  encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: { objectType: 'slack', token: 't', dCookie: 'd' } }));
71
89
  writeFileSync(join(tempDir, 'data-format-version'), String(LATEST_VERSION), 'utf-8');
72
90
  // Should not throw
73
- runMigrations(config, encryptedStorage);
91
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
74
92
  expect(readDataFormatVersion(config)).toBe(LATEST_VERSION);
75
93
  });
76
- it('should throw when version is newer than latest', () => {
94
+ it('should throw when version is newer than latest', async () => {
77
95
  encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: { objectType: 'slack', token: 't', dCookie: 'd' } }));
78
96
  writeFileSync(join(tempDir, 'data-format-version'), String(LATEST_VERSION + 1), 'utf-8');
79
- expect(() => {
80
- runMigrations(config, encryptedStorage);
81
- }).toThrow(MigrationError);
97
+ await expect(runMigrations(config, encryptedStorage, inconclusiveResolver)).rejects.toThrow(MigrationError);
82
98
  });
83
99
  });
84
100
  describe('migration 1: split google credentials', () => {
85
- it('should replace "google" with individual service entries', () => {
101
+ it('should replace "google" with individual service entries', async () => {
86
102
  const googleCredentials = {
87
103
  objectType: 'oauth',
88
104
  clientId: 'test-client-id',
@@ -91,21 +107,34 @@ describe('migrations', () => {
91
107
  refreshToken: 'test-refresh-token',
92
108
  };
93
109
  encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ google: googleCredentials }));
94
- runMigrations(config, encryptedStorage);
110
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
95
111
  const content = encryptedStorage.readFile(config.credentialStorePath);
96
112
  const store = JSON.parse(content);
97
- expect(store).not.toHaveProperty('google');
98
- expect(store['google-gmail']).toEqual(googleCredentials);
99
- expect(store['google-calendar']).toEqual(googleCredentials);
100
- expect(store['google-drive']).toEqual(googleCredentials);
101
- expect(store['google-sheets']).toEqual(googleCredentials);
102
- expect(store['google-docs']).toEqual(googleCredentials);
103
- expect(store['google-people']).toEqual(googleCredentials);
113
+ // The accounts-and-preparations migration additionally wraps each entry
114
+ // under the default account (the empty string) and derives a token-less
115
+ // OAuth client preparation for each Google service.
116
+ const expectedPreparation = {
117
+ objectType: 'oauth',
118
+ clientId: 'test-client-id',
119
+ clientSecret: 'test-client-secret',
120
+ };
121
+ expect(store.credentials).not.toHaveProperty('google');
122
+ for (const serviceName of [
123
+ 'google-gmail',
124
+ 'google-calendar',
125
+ 'google-drive',
126
+ 'google-sheets',
127
+ 'google-docs',
128
+ 'google-people',
129
+ ]) {
130
+ expect(store.credentials[serviceName]).toEqual({ '': googleCredentials });
131
+ expect(store.preparations[serviceName]).toEqual(expectedPreparation);
132
+ }
104
133
  // analytics and maps should NOT be created
105
- expect(store).not.toHaveProperty('google-analytics');
106
- expect(store).not.toHaveProperty('google-directions');
134
+ expect(store.credentials).not.toHaveProperty('google-analytics');
135
+ expect(store.credentials).not.toHaveProperty('google-directions');
107
136
  });
108
- it('should not overwrite existing individual service credentials', () => {
137
+ it('should not overwrite existing individual service credentials', async () => {
109
138
  const googleCredentials = {
110
139
  objectType: 'oauth',
111
140
  clientId: 'old-client',
@@ -122,13 +151,17 @@ describe('migrations', () => {
122
151
  google: googleCredentials,
123
152
  'google-drive': existingDriveCredentials,
124
153
  }));
125
- runMigrations(config, encryptedStorage);
154
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
126
155
  const content = encryptedStorage.readFile(config.credentialStorePath);
127
156
  const store = JSON.parse(content);
128
- expect(store['google-drive']).toEqual(existingDriveCredentials);
129
- expect(store['google-gmail']).toEqual(googleCredentials);
157
+ expect(store.credentials['google-drive']).toEqual({ '': existingDriveCredentials });
158
+ // The old shared "google" credentials carry no tokens, so the
159
+ // accounts-and-preparations migration treats them as prepared
160
+ // placeholders.
161
+ expect(store.credentials['google-gmail']).toBeUndefined();
162
+ expect(store.preparations['google-gmail']).toEqual(googleCredentials);
130
163
  });
131
- it('should preserve non-google credentials', () => {
164
+ it('should preserve non-google credentials', async () => {
132
165
  const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
133
166
  const googleCredentials = {
134
167
  objectType: 'oauth',
@@ -139,26 +172,174 @@ describe('migrations', () => {
139
172
  slack: slackCredentials,
140
173
  google: googleCredentials,
141
174
  }));
142
- runMigrations(config, encryptedStorage);
175
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
143
176
  const content = encryptedStorage.readFile(config.credentialStorePath);
144
177
  const store = JSON.parse(content);
145
- expect(store.slack).toEqual(slackCredentials);
178
+ expect(store.credentials.slack).toEqual({ '': slackCredentials });
146
179
  });
147
- it('should be a no-op when there is no "google" entry', () => {
180
+ it('should be a no-op when there is no "google" entry', async () => {
148
181
  const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
149
182
  encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
150
- runMigrations(config, encryptedStorage);
183
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
151
184
  const content = encryptedStorage.readFile(config.credentialStorePath);
152
185
  const store = JSON.parse(content);
153
- expect(store.slack).toEqual(slackCredentials);
154
- expect(Object.keys(store)).toEqual(['slack']);
186
+ expect(store.credentials.slack).toEqual({ '': slackCredentials });
187
+ expect(Object.keys(store.credentials)).toEqual(['slack']);
155
188
  });
156
- it('should update the version file after migration', () => {
189
+ it('should update the version file after migration', async () => {
157
190
  encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ google: { objectType: 'oauth', clientId: 'c', clientSecret: 's' } }));
158
- runMigrations(config, encryptedStorage);
191
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
159
192
  const versionContent = readFileSync(join(tempDir, 'data-format-version'), 'utf-8');
160
193
  expect(versionContent).toBe(String(LATEST_VERSION));
161
194
  });
162
195
  });
196
+ describe('migration 2: introduce accounts and separate preparations', () => {
197
+ it('should wrap each service credential under the default account', async () => {
198
+ const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
199
+ const discordCredentials = { objectType: 'authorizationBare', token: 'discord' };
200
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials, discord: discordCredentials }));
201
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
202
+ const content = encryptedStorage.readFile(config.credentialStorePath);
203
+ const store = JSON.parse(content);
204
+ expect(store.credentials.slack).toEqual({ '': slackCredentials });
205
+ expect(store.credentials.discord).toEqual({ '': discordCredentials });
206
+ });
207
+ it('should produce an empty store for an empty store', async () => {
208
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({}));
209
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
210
+ const content = encryptedStorage.readFile(config.credentialStorePath);
211
+ expect(JSON.parse(content)).toEqual({ credentials: {}, preparations: {} });
212
+ });
213
+ it('should key valid credentials by their resolved account', async () => {
214
+ const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
215
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
216
+ await runMigrations(config, encryptedStorage, resolverFromMap({
217
+ slack: { status: ApiCredentialStatus.Valid, account: 'user@example.com' },
218
+ }));
219
+ const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
220
+ expect(store.credentials.slack).toEqual({ 'user@example.com': slackCredentials });
221
+ });
222
+ it('should keep valid credentials under the default account when the account is unknown', async () => {
223
+ const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
224
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
225
+ await runMigrations(config, encryptedStorage, resolverFromMap({ slack: { status: ApiCredentialStatus.Valid, account: null } }));
226
+ const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
227
+ expect(store.credentials.slack).toEqual({ '': slackCredentials });
228
+ });
229
+ it('should preserve the OAuth client of dropped invalid credentials as a preparation', async () => {
230
+ const gmailCredentials = {
231
+ objectType: 'oauth',
232
+ clientId: 'client',
233
+ clientSecret: 'secret',
234
+ accessToken: 'expired-access-token',
235
+ refreshToken: 'expired-refresh-token',
236
+ };
237
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ 'google-gmail': gmailCredentials }));
238
+ await runMigrations(config, encryptedStorage, resolverFromMap({
239
+ 'google-gmail': { status: ApiCredentialStatus.Invalid, account: null },
240
+ }));
241
+ const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
242
+ expect(store.credentials).not.toHaveProperty('google-gmail');
243
+ expect(store.preparations['google-gmail']).toEqual({
244
+ objectType: 'oauth',
245
+ clientId: 'client',
246
+ clientSecret: 'secret',
247
+ });
248
+ });
249
+ it('should drop invalid credentials', async () => {
250
+ const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
251
+ const discordCredentials = { objectType: 'authorizationBare', token: 'discord' };
252
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials, discord: discordCredentials }));
253
+ await runMigrations(config, encryptedStorage, resolverFromMap({
254
+ slack: { status: ApiCredentialStatus.Invalid, account: null },
255
+ discord: { status: ApiCredentialStatus.Valid, account: 'me#1234' },
256
+ }));
257
+ const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
258
+ expect(store.credentials).not.toHaveProperty('slack');
259
+ expect(store.credentials.discord).toEqual({ 'me#1234': discordCredentials });
260
+ });
261
+ it('should key google credentials by the account from the userinfo endpoint', async () => {
262
+ // Google services learn validity from their credential check and the
263
+ // account from getAccount(), both against the OpenID userinfo endpoint.
264
+ // This exercises the real registry resolver (no injected resolver) to
265
+ // ensure that path runs during the migration. The curl runner is stubbed
266
+ // so nothing hits the network; only the check appends the HTTP status
267
+ // code as the final line (via `-w '\n%{http_code}'`), the account
268
+ // request receives the bare body.
269
+ setAsyncSubprocessRunner((args) => {
270
+ const isCredentialCheck = args.includes('-w');
271
+ const joined = args.join(' ');
272
+ const body = joined.includes('openidconnect.googleapis.com')
273
+ ? JSON.stringify({ email: 'alice@example.com' })
274
+ : '{}';
275
+ return Promise.resolve({
276
+ returncode: 0,
277
+ stdout: Buffer.from(isCredentialCheck ? `${body}\n200` : body),
278
+ stderr: '',
279
+ });
280
+ });
281
+ const gmailCredentials = {
282
+ objectType: 'oauth',
283
+ clientId: 'client',
284
+ clientSecret: 'secret',
285
+ accessToken: 'access-token',
286
+ refreshToken: 'refresh-token',
287
+ };
288
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ 'google-gmail': gmailCredentials }));
289
+ // Note: no resolver is injected, so the default registry resolver runs.
290
+ await runMigrations(config, encryptedStorage);
291
+ const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
292
+ expect(store.credentials['google-gmail']).toEqual({
293
+ 'alice@example.com': gmailCredentials,
294
+ });
295
+ expect(store.preparations['google-gmail']).toEqual({
296
+ objectType: 'oauth',
297
+ clientId: 'client',
298
+ clientSecret: 'secret',
299
+ });
300
+ });
301
+ it('should leave credentials under the default account on inconclusive checks', async () => {
302
+ const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
303
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify({ slack: slackCredentials }));
304
+ await runMigrations(config, encryptedStorage, resolverFromMap({ slack: { status: ApiCredentialStatus.Unknown, account: null } }));
305
+ const store = JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
306
+ expect(store.credentials.slack).toEqual({ '': slackCredentials });
307
+ });
308
+ });
309
+ describe('migration 2: preparations', () => {
310
+ async function runMigrationOn(store) {
311
+ encryptedStorage.writeFile(config.credentialStorePath, JSON.stringify(store));
312
+ await runMigrations(config, encryptedStorage, inconclusiveResolver);
313
+ return JSON.parse(encryptedStorage.readFile(config.credentialStorePath));
314
+ }
315
+ it('moves a token-less OAuth client (a prepared placeholder) into preparations', async () => {
316
+ const preparedClient = { objectType: 'oauth', clientId: 'cid', clientSecret: 'csecret' };
317
+ const store = await runMigrationOn({ 'google-gmail': preparedClient });
318
+ expect(store.credentials).not.toHaveProperty('google-gmail');
319
+ expect(store.preparations['google-gmail']).toEqual(preparedClient);
320
+ });
321
+ it('derives a token-less preparation from complete OAuth credentials', async () => {
322
+ const fullCredentials = {
323
+ objectType: 'oauth',
324
+ clientId: 'cid',
325
+ clientSecret: 'csecret',
326
+ accessToken: 'access-token',
327
+ refreshToken: 'refresh-token',
328
+ };
329
+ const store = await runMigrationOn({ 'google-docs': fullCredentials });
330
+ expect(store.credentials['google-docs']).toEqual({ '': fullCredentials });
331
+ expect(store.preparations['google-docs']).toEqual({
332
+ objectType: 'oauth',
333
+ clientId: 'cid',
334
+ clientSecret: 'csecret',
335
+ });
336
+ });
337
+ it('creates no preparation for non-OAuth credentials', async () => {
338
+ const slackCredentials = { objectType: 'slack', token: 't', dCookie: 'd' };
339
+ const store = await runMigrationOn({ slack: slackCredentials });
340
+ expect(store.credentials.slack).toEqual({ '': slackCredentials });
341
+ expect(store.preparations).toEqual({});
342
+ });
343
+ });
163
344
  });
164
345
  //# sourceMappingURL=migrations.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../../tests/migrations.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.test.js","sourceRoot":"","sources":["../../tests/migrations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Shared Service test double.
3
+ *
4
+ * Service has protected members (the credential-check hooks), so plain object
5
+ * literals can no longer satisfy the Service type; fakes must subclass it.
6
+ * MockService exposes every configurable member as a public, writable field
7
+ * with Slack-flavored defaults matching the historical inline fakes.
8
+ */
9
+ import { type ApiCredentials } from '../src/apiCredentials/base.js';
10
+ import { Service } from '../src/services/core/base.js';
11
+ export declare class MockService extends Service {
12
+ name: string;
13
+ displayName: string;
14
+ baseApiUrls: readonly (string | RegExp)[];
15
+ loginUrl: string;
16
+ info: string;
17
+ credentialCheckCurlArguments: readonly string[];
18
+ checkApiCredentials: Service['checkApiCredentials'];
19
+ getAccount: Service['getAccount'];
20
+ setCredentialsExample(serviceName: string): string;
21
+ getCredentialsNoCurl(_arguments: readonly string[]): ApiCredentials;
22
+ getSession: Service['getSession'];
23
+ }
24
+ export declare function createMockService(overrides?: Partial<MockService>): MockService;
25
+ //# sourceMappingURL=mockService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockService.d.ts","sourceRoot":"","sources":["../../tests/mockService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEzF,OAAO,EAAsC,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE3F,qBAAa,WAAY,SAAQ,OAAO;IACtC,IAAI,SAAW;IACf,WAAW,SAAW;IACtB,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAA8B;IACvE,QAAQ,SAA8B;IACtC,IAAI,SAAkC;IACtC,4BAA4B,EAAE,SAAS,MAAM,EAAE,CAAuC;IAE7E,mBAAmB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAEZ;IAEvC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAmC;IAE7E,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc;IAInE,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAKvC;CACJ;AAED,wBAAgB,iBAAiB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAEnF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Shared Service test double.
3
+ *
4
+ * Service has protected members (the credential-check hooks), so plain object
5
+ * literals can no longer satisfy the Service type; fakes must subclass it.
6
+ * MockService exposes every configurable member as a public, writable field
7
+ * with Slack-flavored defaults matching the historical inline fakes.
8
+ */
9
+ import { vi } from 'vitest';
10
+ import { ApiCredentialStatus } from '../src/apiCredentials/base.js';
11
+ import { SlackApiCredentials } from '../src/services/slack.js';
12
+ import { NoCurlCredentialsNotSupportedError, Service } from '../src/services/core/base.js';
13
+ export class MockService extends Service {
14
+ name = 'slack';
15
+ displayName = 'Slack';
16
+ baseApiUrls = ['https://slack.com/api/'];
17
+ loginUrl = 'https://slack.com/signin';
18
+ info = 'Test info for Slack service.';
19
+ credentialCheckCurlArguments = ['https://slack.com/api/auth.test'];
20
+ checkApiCredentials = vi
21
+ .fn()
22
+ .mockResolvedValue(ApiCredentialStatus.Valid);
23
+ getAccount = vi.fn().mockResolvedValue(null);
24
+ setCredentialsExample(serviceName) {
25
+ return `latchkey auth set ${serviceName} -H "Authorization: Bearer xoxb-your-token"`;
26
+ }
27
+ getCredentialsNoCurl(_arguments) {
28
+ throw new NoCurlCredentialsNotSupportedError(this.name);
29
+ }
30
+ getSession = vi.fn().mockReturnValue({
31
+ login: vi.fn().mockResolvedValue({
32
+ credentials: new SlackApiCredentials('xoxc-test-token', 'test-cookie'),
33
+ account: '',
34
+ }),
35
+ });
36
+ }
37
+ export function createMockService(overrides = {}) {
38
+ return Object.assign(new MockService(), overrides);
39
+ }
40
+ //# sourceMappingURL=mockService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockService.js","sourceRoot":"","sources":["../../tests/mockService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAuB,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAE3F,MAAM,OAAO,WAAY,SAAQ,OAAO;IACtC,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,OAAO,CAAC;IACtB,WAAW,GAAiC,CAAC,wBAAwB,CAAC,CAAC;IACvE,QAAQ,GAAG,0BAA0B,CAAC;IACtC,IAAI,GAAG,8BAA8B,CAAC;IACtC,4BAA4B,GAAsB,CAAC,iCAAiC,CAAC,CAAC;IAE7E,mBAAmB,GAAmC,EAAE;SAC9D,EAAE,EAAE;SACJ,iBAAiB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAEvC,UAAU,GAA0B,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE7E,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,6CAA6C,CAAC;IACvF,CAAC;IAEQ,oBAAoB,CAAC,UAA6B;QACzD,MAAM,IAAI,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAEQ,UAAU,GAA0B,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC;QACnE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;YAC/B,WAAW,EAAE,IAAI,mBAAmB,CAAC,iBAAiB,EAAE,aAAa,CAAC;YACtE,OAAO,EAAE,EAAE;SACZ,CAAC;KACH,CAAC,CAAC;CACJ;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAkC,EAAE;IACpE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC"}
@@ -32,40 +32,40 @@ describe('generateCodeChallenge', () => {
32
32
  });
33
33
  });
34
34
  describe('exchangeCodeForTokens', () => {
35
- it('with PKCE: includes code_verifier in body', () => {
36
- const spy = vi.spyOn(curl, 'runCaptured').mockImplementation(() => {
35
+ it('with PKCE: includes code_verifier in body', async () => {
36
+ const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
37
37
  throw new Error('STOP');
38
38
  });
39
- expect(() => exchangeCodeForTokens('https://api.notion.com/v1/oauth/token', 'auth-code-abc123', 'test-client-id', 'test-client-secret', 'http://localhost:12345/oauth2callback', 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk')).toThrow('STOP');
39
+ await expect(exchangeCodeForTokens('https://api.notion.com/v1/oauth/token', 'auth-code-abc123', 'test-client-id', 'test-client-secret', 'http://localhost:12345/oauth2callback', 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk')).rejects.toThrow('STOP');
40
40
  const args = spy.mock.calls[0][0];
41
41
  const body = args[args.indexOf('-d') + 1];
42
42
  expect(body).toBe('code=auth-code-abc123&client_id=test-client-id&redirect_uri=http%3A%2F%2Flocalhost%3A12345%2Foauth2callback&grant_type=authorization_code&client_secret=test-client-secret&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk');
43
43
  });
44
- it('without PKCE: omits code_verifier from body', () => {
45
- const spy = vi.spyOn(curl, 'runCaptured').mockImplementation(() => {
44
+ it('without PKCE: omits code_verifier from body', async () => {
45
+ const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
46
46
  throw new Error('STOP');
47
47
  });
48
- expect(() => exchangeCodeForTokens('https://api.notion.com/v1/oauth/token', 'auth-code-abc123', 'test-client-id', 'test-client-secret', 'http://localhost:12345/oauth2callback')).toThrow('STOP');
48
+ await expect(exchangeCodeForTokens('https://api.notion.com/v1/oauth/token', 'auth-code-abc123', 'test-client-id', 'test-client-secret', 'http://localhost:12345/oauth2callback')).rejects.toThrow('STOP');
49
49
  const args = spy.mock.calls[0][0];
50
50
  const body = args[args.indexOf('-d') + 1];
51
51
  expect(body).toBe('code=auth-code-abc123&client_id=test-client-id&redirect_uri=http%3A%2F%2Flocalhost%3A12345%2Foauth2callback&grant_type=authorization_code&client_secret=test-client-secret');
52
52
  });
53
53
  });
54
54
  describe('refreshAccessToken', () => {
55
- it('confidential client: includes client_secret in body', () => {
56
- const spy = vi.spyOn(curl, 'runCaptured').mockImplementation(() => {
55
+ it('confidential client: includes client_secret in body', async () => {
56
+ const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
57
57
  throw new Error('STOP');
58
58
  });
59
- expect(() => refreshAccessToken('https://api.notion.com/v1/oauth/token', 'refresh-token-xyz789', 'test-client-id', 'test-client-secret')).toThrow('STOP');
59
+ await expect(refreshAccessToken('https://api.notion.com/v1/oauth/token', 'refresh-token-xyz789', 'test-client-id', 'test-client-secret')).rejects.toThrow('STOP');
60
60
  const args = spy.mock.calls[0][0];
61
61
  const body = args[args.indexOf('-d') + 1];
62
62
  expect(body).toBe('refresh_token=refresh-token-xyz789&client_id=test-client-id&grant_type=refresh_token&client_secret=test-client-secret');
63
63
  });
64
- it('public client: omits client_secret from body', () => {
65
- const spy = vi.spyOn(curl, 'runCaptured').mockImplementation(() => {
64
+ it('public client: omits client_secret from body', async () => {
65
+ const spy = vi.spyOn(curl, 'runCapturedAsync').mockImplementation(() => {
66
66
  throw new Error('STOP');
67
67
  });
68
- expect(() => refreshAccessToken('https://api.notion.com/v1/oauth/token', 'refresh-token-xyz789', 'test-client-id', '')).toThrow('STOP');
68
+ await expect(refreshAccessToken('https://api.notion.com/v1/oauth/token', 'refresh-token-xyz789', 'test-client-id', '')).rejects.toThrow('STOP');
69
69
  const args = spy.mock.calls[0][0];
70
70
  const body = args[args.indexOf('-d') + 1];
71
71
  expect(body).toBe('refresh_token=refresh-token-xyz789&client_id=test-client-id&grant_type=refresh_token');
@@ -1 +1 @@
1
- {"version":3,"file":"oauthUtils.test.js","sourceRoot":"","sources":["../../tests/oauthUtils.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauthUtils.test.js","sourceRoot":"","sources":["../../tests/oauthUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests for the credential check and for account determination.
3
+ *
4
+ * The credential check runs a single curl call whose output is the response
5
+ * body followed by the HTTP status code on the final line (produced by
6
+ * `-w '\n%{http_code}'`). Account determination (`getAccount`) runs its own
7
+ * curl call against an identity-revealing endpoint and parses the account
8
+ * from the raw response body. These tests mock the async subprocess runner
9
+ * to feed service implementations recorded response bodies.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=serviceAccounts.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceAccounts.test.d.ts","sourceRoot":"","sources":["../../tests/serviceAccounts.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}