latchkey 2.21.0 → 3.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 (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 +27 -1
  54. package/dist/src/migrations.d.ts.map +1 -1
  55. package/dist/src/migrations.js +141 -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 +299 -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
@@ -1 +1 @@
1
- {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/services/slack.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEhF,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,UAAU,EAAG,OAAO,CAAU;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK1C,kBAAkB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAUhF,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,MAAM,IAAI,uBAAuB;IAQjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,mBAAmB;CAGpE;AAED,cAAM,mBAAoB,SAAQ,oBAAoB;IACpD,OAAO,CAAC,cAAc,CAAuB;cAE7B,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAmClC;AAED,qBAAa,KAAM,SAAQ,OAAO;IAChC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,WAAW;IAC/B,QAAQ,CAAC,WAAW,kEAAmE;IACvF,QAAQ,CAAC,QAAQ,8BAA8B;IAC/C,QAAQ,CAAC,IAAI,SAEyD;IAEtE,QAAQ,CAAC,4BAA4B,+CAAgD;IAErF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,mBAAmB;IAIhD,mBAAmB,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAgBjG;AAED,eAAO,MAAM,KAAK,OAAc,CAAC"}
1
+ {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/services/slack.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG/D;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAIpC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEhF,qBAAa,mBAAoB,YAAW,cAAc;IACxD,QAAQ,CAAC,UAAU,EAAG,OAAO,CAAU;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK1C,kBAAkB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAUhF,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,MAAM,IAAI,uBAAuB;IAQjC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,GAAG,mBAAmB;CAGpE;AAED,cAAM,mBAAoB,SAAQ,oBAAoB;IACpD,OAAO,CAAC,cAAc,CAAuB;cAE7B,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAmClC;AAED,qBAAa,KAAM,SAAQ,OAAO;IAChC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,WAAW;IAC/B,QAAQ,CAAC,WAAW,kEAAmE;IACvF,QAAQ,CAAC,QAAQ,8BAA8B;IAC/C,QAAQ,CAAC,IAAI,SAEyD;IAEtE,QAAQ,CAAC,4BAA4B,+CAAgD;IAErF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,mBAAmB;cAM5C,8BAA8B,CAC/C,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO;IAKD,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAuB5E;AAED,eAAO,MAAM,KAAK,OAAc,CAAC"}
@@ -2,9 +2,8 @@
2
2
  * Slack service implementation.
3
3
  */
4
4
  import { z } from 'zod';
5
- import { ApiCredentialStatus } from '../apiCredentials/base.js';
6
- import { runCaptured } from '../curl.js';
7
5
  import { Service, SimpleServiceSession } from './core/base.js';
6
+ import { fetchAccountFromEndpoint, tryParseJson } from '../apiCredentials/account.js';
8
7
  /**
9
8
  * Slack-specific credentials (token + d cookie).
10
9
  */
@@ -92,18 +91,25 @@ export class Slack extends Service {
92
91
  getSession(appNamePrefix) {
93
92
  return new SlackServiceSession(this, appNamePrefix);
94
93
  }
95
- async checkApiCredentials(apiCredentials) {
96
- const result = runCaptured(await apiCredentials.injectIntoCurlCall(['-s', ...this.credentialCheckCurlArguments]), 10);
97
- try {
98
- const data = JSON.parse(result.stdout);
99
- if (data.ok) {
100
- return ApiCredentialStatus.Valid;
94
+ // auth.test reports authentication failures as HTTP 200 with `ok: false`,
95
+ // so validity comes from the body rather than the status code.
96
+ isCredentialCheckResponseValid(_httpStatusCode, responseBody) {
97
+ const data = tryParseJson(responseBody);
98
+ return data?.ok === true;
99
+ }
100
+ getAccount(apiCredentials) {
101
+ return fetchAccountFromEndpoint(apiCredentials, this.credentialCheckCurlArguments, (responseBody) => {
102
+ const data = tryParseJson(responseBody);
103
+ if (data?.user === undefined) {
104
+ return null;
101
105
  }
102
- return ApiCredentialStatus.Invalid;
103
- }
104
- catch {
105
- return ApiCredentialStatus.Invalid;
106
- }
106
+ // The same user can be signed in to several workspaces, so the account
107
+ // includes the workspace: prefer the stable subdomain from the workspace
108
+ // URL, falling back to the display name.
109
+ const workspaceMatch = data.url === undefined ? null : /^https:\/\/([^./]+)\./.exec(data.url);
110
+ const workspace = workspaceMatch?.[1] ?? data.team;
111
+ return workspace === undefined ? data.user : `${data.user}@${workspace}`;
112
+ });
107
113
  }
108
114
  }
109
115
  export const SLACK = new Slack();
@@ -1 +1 @@
1
- {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/services/slack.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/services/slack.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { ApiCredentials } from '../apiCredentials/base.js';
1
2
  import { Service } from './core/base.js';
2
3
  export declare class Stripe extends Service {
3
4
  readonly name = "stripe";
@@ -7,6 +8,12 @@ export declare class Stripe extends Service {
7
8
  readonly info = "https://docs.stripe.com/api.";
8
9
  readonly credentialCheckCurlArguments: readonly ["https://api.stripe.com/v1/balance"];
9
10
  setCredentialsExample(serviceName: string): string;
11
+ /**
12
+ * The account comes from /v1/account rather than the balance endpoint used
13
+ * by the credential check, which carries no identity. Restricted keys may
14
+ * not be allowed to read the account, in which case it stays undetermined.
15
+ */
16
+ getAccount(apiCredentials: ApiCredentials): Promise<string | null>;
10
17
  }
11
18
  export declare const STRIPE: Stripe;
12
19
  //# sourceMappingURL=stripe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../../src/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,MAAO,SAAQ,OAAO;IACjC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,WAAW,uCAAwC;IAC5D,QAAQ,CAAC,QAAQ,wCAAwC;IACzD,QAAQ,CAAC,IAAI,kCAAkC;IAE/C,QAAQ,CAAC,4BAA4B,iDAAkD;IAEvF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAGnD;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
1
+ {"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../../src/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,MAAO,SAAQ,OAAO;IACjC,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,YAAY;IAChC,QAAQ,CAAC,WAAW,uCAAwC;IAC5D,QAAQ,CAAC,QAAQ,wCAAwC;IACzD,QAAQ,CAAC,IAAI,kCAAkC;IAE/C,QAAQ,CAAC,4BAA4B,iDAAkD;IAEvF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIlD;;;;OAIG;IACM,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAiB5E;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { fetchAccountFromEndpoint, tryParseJson } from '../apiCredentials/account.js';
1
2
  import { Service } from './core/base.js';
2
3
  export class Stripe extends Service {
3
4
  name = 'stripe';
@@ -9,6 +10,20 @@ export class Stripe extends Service {
9
10
  setCredentialsExample(serviceName) {
10
11
  return `latchkey auth set ${serviceName} -H "Authorization: Bearer <token>"`;
11
12
  }
13
+ /**
14
+ * The account comes from /v1/account rather than the balance endpoint used
15
+ * by the credential check, which carries no identity. Restricted keys may
16
+ * not be allowed to read the account, in which case it stays undetermined.
17
+ */
18
+ getAccount(apiCredentials) {
19
+ return fetchAccountFromEndpoint(apiCredentials, ['https://api.stripe.com/v1/account'], (responseBody) => {
20
+ const data = tryParseJson(responseBody);
21
+ if (data === null || data.error !== undefined) {
22
+ return null;
23
+ }
24
+ return data.email ?? data.id ?? null;
25
+ });
26
+ }
12
27
  }
13
28
  export const STRIPE = new Stripe();
14
29
  //# sourceMappingURL=stripe.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../../src/services/stripe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,MAAO,SAAQ,OAAO;IACxB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,QAAQ,CAAC;IACvB,WAAW,GAAG,CAAC,yBAAyB,CAAU,CAAC;IACnD,QAAQ,GAAG,oCAAoC,CAAC;IAChD,IAAI,GAAG,8BAA8B,CAAC;IAEtC,4BAA4B,GAAG,CAAC,mCAAmC,CAAU,CAAC;IAEvF,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../../src/services/stripe.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,MAAO,SAAQ,OAAO;IACxB,IAAI,GAAG,QAAQ,CAAC;IAChB,WAAW,GAAG,QAAQ,CAAC;IACvB,WAAW,GAAG,CAAC,yBAAyB,CAAU,CAAC;IACnD,QAAQ,GAAG,oCAAoC,CAAC;IAChD,IAAI,GAAG,8BAA8B,CAAC;IAEtC,4BAA4B,GAAG,CAAC,mCAAmC,CAAU,CAAC;IAEvF,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;IAED;;;;OAIG;IACM,UAAU,CAAC,cAA8B;QAChD,OAAO,wBAAwB,CAC7B,cAAc,EACd,CAAC,mCAAmC,CAAC,EACrC,CAAC,YAAY,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAI9B,CAAC;YACT,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;QACvC,CAAC,CACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
@@ -35,6 +35,7 @@ export declare class Telegram extends Service {
35
35
  readonly credentialCheckCurlArguments: readonly ["https://api.telegram.org/getMe"];
36
36
  setCredentialsExample(serviceName: string): string;
37
37
  getCredentialsNoCurl(arguments_: readonly string[]): ApiCredentials;
38
+ getAccount(apiCredentials: ApiCredentials): Promise<string | null>;
38
39
  }
39
40
  export declare const TELEGRAM: Telegram;
40
41
  //# sourceMappingURL=telegram.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../../src/services/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAsC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI7E;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;EAGvC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAEtF,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,QAAQ,CAAC,UAAU,EAAG,aAAa,CAAU;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM;IAIzB,kBAAkB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAYhF,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,MAAM,IAAI,0BAA0B;IAOpC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,0BAA0B,GAAG,sBAAsB;CAG1E;AAED,qBAAa,QAAS,SAAQ,OAAO;IACnC,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,cAAc;IAClC,QAAQ,CAAC,WAAW,yCAA2B;IAC/C,QAAQ,CAAC,QAAQ,+BAA+B;IAChD,QAAQ,CAAC,IAAI,SAGgF;IAE7F,QAAQ,CAAC,4BAA4B,8CAAqC;IAE1E,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc;CAgB7E;AAUD,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../../src/services/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAsC,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAK7E;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;EAGvC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAEtF,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,QAAQ,CAAC,UAAU,EAAG,aAAa,CAAU;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM;IAIzB,kBAAkB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC;IAYhF,SAAS,IAAI,OAAO,GAAG,SAAS;IAIhC,MAAM,IAAI,0BAA0B;IAOpC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,0BAA0B,GAAG,sBAAsB;CAG1E;AAED,qBAAa,QAAS,SAAQ,OAAO;IACnC,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,cAAc;IAClC,QAAQ,CAAC,WAAW,yCAA2B;IAC/C,QAAQ,CAAC,QAAQ,+BAA+B;IAChD,QAAQ,CAAC,IAAI,SAGgF;IAE7F,QAAQ,CAAC,4BAA4B,8CAAqC;IAE1E,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,oBAAoB,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc;IAiBnE,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAY5E;AAUD,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { extractUrlFromCurlArguments } from '../curl.js';
3
3
  import { NoCurlCredentialsNotSupportedError, Service } from './core/base.js';
4
+ import { fetchAccountFromEndpoint, tryParseJson } from '../apiCredentials/account.js';
4
5
  const BASE_API_URL = 'https://api.telegram.org/';
5
6
  /**
6
7
  * Telegram Bot API credentials.
@@ -63,6 +64,12 @@ export class Telegram extends Service {
63
64
  }
64
65
  return new TelegramBotCredentials(token);
65
66
  }
67
+ getAccount(apiCredentials) {
68
+ return fetchAccountFromEndpoint(apiCredentials, this.credentialCheckCurlArguments, (responseBody) => {
69
+ const data = tryParseJson(responseBody);
70
+ return data?.result?.username ?? data?.result?.id?.toString() ?? null;
71
+ });
72
+ }
66
73
  }
67
74
  class TelegramCredentialError extends NoCurlCredentialsNotSupportedError {
68
75
  constructor(message) {
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/services/telegram.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,kCAAkC,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,YAAY,GAAG,2BAA2B,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;CAClB,CAAC,CAAC;AAIH,MAAM,OAAO,sBAAsB;IACxB,UAAU,GAAG,aAAsB,CAAC;IACpC,KAAK,CAAS;IAEvB,YAAY,KAAa;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,kBAAkB,CAAC,aAAgC;QACjD,MAAM,GAAG,GAAG,2BAA2B,CAAC,aAAyB,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,GAAG,YAAY,MAAM,IAAI,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC;QACxE,OAAO,OAAO,CAAC,OAAO,CACpB,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAC9E,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAgC;QAC9C,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,OAAO;IAC1B,IAAI,GAAG,UAAU,CAAC;IAClB,WAAW,GAAG,UAAU,CAAC;IACzB,WAAW,GAAG,CAAC,YAAY,CAAU,CAAC;IACtC,QAAQ,GAAG,2BAA2B,CAAC;IACvC,IAAI,GACX,sCAAsC;QACtC,wEAAwE;QACxE,0FAA0F,CAAC;IAEpF,4BAA4B,GAAG,CAAC,GAAG,YAAY,OAAO,CAAU,CAAC;IAE1E,qBAAqB,CAAC,WAAmB;QACvC,OAAO,4BAA4B,WAAW,cAAc,CAAC;IAC/D,CAAC;IAEQ,oBAAoB,CAAC,UAA6B;QACzD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,IAAI,uBAAuB,CAC/B,iDAAiD;gBAC/C,wDAAwD,CAC3D,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,uBAAuB,CAC/B,6FAA6F;gBAC3F,sBAAsB,CACzB,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,uBAAwB,SAAQ,kCAAkC;IACtE,YAAY,OAAe;QACzB,KAAK,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/services/telegram.ts"],"names":[],"mappings":"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"}
@@ -16,8 +16,9 @@ export declare class Todoist extends Service {
16
16
  readonly baseApiUrls: readonly ["https://api.todoist.com/"];
17
17
  readonly loginUrl = "https://app.todoist.com/app/settings/integrations/developer";
18
18
  readonly info: string;
19
- readonly credentialCheckCurlArguments: readonly ["https://api.todoist.com/api/v1/projects"];
19
+ readonly credentialCheckCurlArguments: readonly ["https://api.todoist.com/api/v1/user"];
20
20
  setCredentialsExample(serviceName: string): string;
21
+ getAccount(apiCredentials: ApiCredentials): Promise<string | null>;
21
22
  getSession(appNamePrefix: string): TodoistServiceSession;
22
23
  }
23
24
  export declare const TODOIST: Todoist;
@@ -1 +1 @@
1
- {"version":3,"file":"todoist.d.ts","sourceRoot":"","sources":["../../../src/services/todoist.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAuB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,6BAA6B,EAAoB,MAAM,gBAAgB,CAAC;AAW1F,cAAM,qBAAsB,SAAQ,6BAA6B;IAC/D,OAAO,CAAC,UAAU,CAAS;IAE3B,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAsBpC,SAAS,CAAC,eAAe,IAAI,OAAO;cAIpB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,cAAc,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAuBlC;AAED,qBAAa,OAAQ,SAAQ,OAAO;IAClC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IACjC,QAAQ,CAAC,WAAW,wCAAyC;IAC7D,QAAQ,CAAC,QAAQ,iEAAkC;IACnD,QAAQ,CAAC,IAAI,SAE6E;IAE1F,QAAQ,CAAC,4BAA4B,uDAAwD;IAE7F,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB;CAGlE;AAED,eAAO,MAAM,OAAO,SAAgB,CAAC"}
1
+ {"version":3,"file":"todoist.d.ts","sourceRoot":"","sources":["../../../src/services/todoist.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAuB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,6BAA6B,EAAoB,MAAM,gBAAgB,CAAC;AAY1F,cAAM,qBAAsB,SAAQ,6BAA6B;IAC/D,OAAO,CAAC,UAAU,CAAS;IAE3B,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAsBpC,SAAS,CAAC,eAAe,IAAI,OAAO;cAIpB,sBAAsB,CACpC,OAAO,EAAE,cAAc,EACvB,eAAe,CAAC,EAAE,cAAc,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAuBlC;AAED,qBAAa,OAAQ,SAAQ,OAAO;IAClC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,aAAa;IACjC,QAAQ,CAAC,WAAW,wCAAyC;IAC7D,QAAQ,CAAC,QAAQ,iEAAkC;IACnD,QAAQ,CAAC,IAAI,SAE6E;IAG1F,QAAQ,CAAC,4BAA4B,mDAAoD;IAEzF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAelE,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,qBAAqB;CAGlE;AAED,eAAO,MAAM,OAAO,SAAgB,CAAC"}
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { AuthorizationBearer } from '../apiCredentials/base.js';
5
5
  import { Service, BrowserFollowupServiceSession, LoginFailedError } from './core/base.js';
6
+ import { fetchAccountFromEndpoint, tryParseJson } from '../apiCredentials/account.js';
6
7
  const DEFAULT_TIMEOUT_MS = 8000;
7
8
  // The Developer settings page exposes the user's personal API token. It also
8
9
  // doubles as the login URL: when visited while logged out, Todoist redirects to
@@ -57,10 +58,17 @@ export class Todoist extends Service {
57
58
  loginUrl = TODOIST_DEVELOPER_SETTINGS_URL;
58
59
  info = 'https://developer.todoist.com/api/v1. ' +
59
60
  'The personal API token is read from Settings → Integrations → Developer during login.';
60
- credentialCheckCurlArguments = ['https://api.todoist.com/api/v1/projects'];
61
+ // /user both validates the token and identifies the account.
62
+ credentialCheckCurlArguments = ['https://api.todoist.com/api/v1/user'];
61
63
  setCredentialsExample(serviceName) {
62
64
  return `latchkey auth set ${serviceName} -H "Authorization: Bearer <token>"`;
63
65
  }
66
+ getAccount(apiCredentials) {
67
+ return fetchAccountFromEndpoint(apiCredentials, this.credentialCheckCurlArguments, (responseBody) => {
68
+ const data = tryParseJson(responseBody);
69
+ return data?.email ?? data?.full_name ?? data?.id ?? null;
70
+ });
71
+ }
64
72
  getSession(appNamePrefix) {
65
73
  return new TodoistServiceSession(this, appNamePrefix);
66
74
  }
@@ -1 +1 @@
1
- {"version":3,"file":"todoist.js","sourceRoot":"","sources":["../../../src/services/todoist.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAkB,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE1F,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,6EAA6E;AAC7E,gFAAgF;AAChF,8EAA8E;AAC9E,iBAAiB;AACjB,MAAM,8BAA8B,GAClC,6DAA6D,CAAC;AAEhE,MAAM,qBAAsB,SAAQ,6BAA6B;IACvD,UAAU,GAAG,KAAK,CAAC;IAE3B,UAAU,CAAC,QAAkB;QAC3B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,8EAA8E;QAC9E,oEAAoE;QACpE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;QACrC,IACE,CAAC,GAAG,CAAC,UAAU,CAAC,8BAA8B,CAAC;YAC/C,CAAC,GAAG,CAAC,UAAU,CAAC,0BAA0B,CAAC,EAC3C,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAES,eAAe;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAES,KAAK,CAAC,sBAAsB,CACpC,OAAuB,EACvB,eAAgC;QAEhC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAEhD,wEAAwE;QACxE,oEAAoE;QACpE,mEAAmE;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3D,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAE1D,MAAM,KAAK,GAAG,CAAC,MAAM,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,gBAAgB,CAAC,uCAAuC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAEnB,OAAO,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,OAAQ,SAAQ,OAAO;IACzB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,SAAS,CAAC;IACxB,WAAW,GAAG,CAAC,0BAA0B,CAAU,CAAC;IACpD,QAAQ,GAAG,8BAA8B,CAAC;IAC1C,IAAI,GACX,wCAAwC;QACxC,uFAAuF,CAAC;IAEjF,4BAA4B,GAAG,CAAC,yCAAyC,CAAU,CAAC;IAE7F,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;IAEQ,UAAU,CAAC,aAAqB;QACvC,OAAO,IAAI,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"todoist.js","sourceRoot":"","sources":["../../../src/services/todoist.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { ApiCredentials } from '../apiCredentials/base.js';
1
2
  import { Service } from './core/base.js';
2
3
  export declare class Umami extends Service {
3
4
  readonly name = "umami";
@@ -5,8 +6,9 @@ export declare class Umami extends Service {
5
6
  readonly baseApiUrls: readonly ["https://api.umami.is/"];
6
7
  readonly loginUrl = "https://cloud.umami.is/login";
7
8
  readonly info = "https://umami.is/docs/api.";
8
- readonly credentialCheckCurlArguments: readonly ["https://api.umami.is/v1/websites"];
9
+ readonly credentialCheckCurlArguments: readonly ["https://api.umami.is/v1/me"];
9
10
  setCredentialsExample(serviceName: string): string;
11
+ getAccount(apiCredentials: ApiCredentials): Promise<string | null>;
10
12
  }
11
13
  export declare const UMAMI: Umami;
12
14
  //# sourceMappingURL=umami.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"umami.d.ts","sourceRoot":"","sources":["../../../src/services/umami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,KAAM,SAAQ,OAAO;IAChC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,WAAW;IAC/B,QAAQ,CAAC,WAAW,qCAAsC;IAC1D,QAAQ,CAAC,QAAQ,kCAAkC;IACnD,QAAQ,CAAC,IAAI,gCAAgC;IAE7C,QAAQ,CAAC,4BAA4B,gDAAiD;IAEtF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAGnD;AAED,eAAO,MAAM,KAAK,OAAc,CAAC"}
1
+ {"version":3,"file":"umami.d.ts","sourceRoot":"","sources":["../../../src/services/umami.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC,qBAAa,KAAM,SAAQ,OAAO;IAChC,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,WAAW,WAAW;IAC/B,QAAQ,CAAC,WAAW,qCAAsC;IAC1D,QAAQ,CAAC,QAAQ,kCAAkC;IACnD,QAAQ,CAAC,IAAI,gCAAgC;IAI7C,QAAQ,CAAC,4BAA4B,0CAA2C;IAEhF,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIzC,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAa5E;AAED,eAAO,MAAM,KAAK,OAAc,CAAC"}
@@ -1,14 +1,24 @@
1
1
  import { Service } from './core/base.js';
2
+ import { fetchAccountFromEndpoint, tryParseJson } from '../apiCredentials/account.js';
2
3
  export class Umami extends Service {
3
4
  name = 'umami';
4
5
  displayName = 'Umami';
5
6
  baseApiUrls = ['https://api.umami.is/'];
6
7
  loginUrl = 'https://cloud.umami.is/login';
7
8
  info = 'https://umami.is/docs/api.';
8
- credentialCheckCurlArguments = ['https://api.umami.is/v1/websites'];
9
+ // /v1/me both validates the API key and identifies the account (it is one of
10
+ // the few endpoints allowed for API-key authentication).
11
+ credentialCheckCurlArguments = ['https://api.umami.is/v1/me'];
9
12
  setCredentialsExample(serviceName) {
10
13
  return `latchkey auth set ${serviceName} -H "x-umami-api-key: <api-key>"`;
11
14
  }
15
+ getAccount(apiCredentials) {
16
+ return fetchAccountFromEndpoint(apiCredentials, this.credentialCheckCurlArguments, (responseBody) => {
17
+ // On Umami Cloud the username is the account e-mail.
18
+ const data = tryParseJson(responseBody);
19
+ return data?.user?.username ?? data?.user?.id ?? null;
20
+ });
21
+ }
12
22
  }
13
23
  export const UMAMI = new Umami();
14
24
  //# sourceMappingURL=umami.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"umami.js","sourceRoot":"","sources":["../../../src/services/umami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,KAAM,SAAQ,OAAO;IACvB,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,OAAO,CAAC;IACtB,WAAW,GAAG,CAAC,uBAAuB,CAAU,CAAC;IACjD,QAAQ,GAAG,8BAA8B,CAAC;IAC1C,IAAI,GAAG,4BAA4B,CAAC;IAEpC,4BAA4B,GAAG,CAAC,kCAAkC,CAAU,CAAC;IAEtF,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,kCAAkC,CAAC;IAC5E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"umami.js","sourceRoot":"","sources":["../../../src/services/umami.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEtF,MAAM,OAAO,KAAM,SAAQ,OAAO;IACvB,IAAI,GAAG,OAAO,CAAC;IACf,WAAW,GAAG,OAAO,CAAC;IACtB,WAAW,GAAG,CAAC,uBAAuB,CAAU,CAAC;IACjD,QAAQ,GAAG,8BAA8B,CAAC;IAC1C,IAAI,GAAG,4BAA4B,CAAC;IAE7C,6EAA6E;IAC7E,yDAAyD;IAChD,4BAA4B,GAAG,CAAC,4BAA4B,CAAU,CAAC;IAEhF,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,kCAAkC,CAAC;IAC5E,CAAC;IAEQ,UAAU,CAAC,cAA8B;QAChD,OAAO,wBAAwB,CAC7B,cAAc,EACd,IAAI,CAAC,4BAA4B,EACjC,CAAC,YAAY,EAAE,EAAE;YACf,qDAAqD;YACrD,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAE9B,CAAC;YACT,OAAO,IAAI,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC;QACxD,CAAC,CACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC"}
@@ -7,6 +7,7 @@ export declare class Yelp extends Service {
7
7
  readonly info = "https://docs.developer.yelp.com/reference.";
8
8
  readonly credentialCheckCurlArguments: readonly ["https://api.yelp.com/v3/businesses/search?location=NYC&limit=1"];
9
9
  setCredentialsExample(serviceName: string): string;
10
+ getAccount(): Promise<string | null>;
10
11
  }
11
12
  export declare const YELP: Yelp;
12
13
  //# sourceMappingURL=yelp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"yelp.d.ts","sourceRoot":"","sources":["../../../src/services/yelp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,IAAK,SAAQ,OAAO;IAC/B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,UAAU;IAC9B,QAAQ,CAAC,WAAW,qCAAsC;IAC1D,QAAQ,CAAC,QAAQ,gCAAgC;IACjD,QAAQ,CAAC,IAAI,gDAAgD;IAE7D,QAAQ,CAAC,4BAA4B,8EAE1B;IAEX,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAGnD;AAED,eAAO,MAAM,IAAI,MAAa,CAAC"}
1
+ {"version":3,"file":"yelp.d.ts","sourceRoot":"","sources":["../../../src/services/yelp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,IAAK,SAAQ,OAAO;IAC/B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,UAAU;IAC9B,QAAQ,CAAC,WAAW,qCAAsC;IAC1D,QAAQ,CAAC,QAAQ,gCAAgC;IACjD,QAAQ,CAAC,IAAI,gDAAgD;IAE7D,QAAQ,CAAC,4BAA4B,8EAE1B;IAEX,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAMlD,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGrC;AAED,eAAO,MAAM,IAAI,MAAa,CAAC"}
@@ -11,6 +11,11 @@ export class Yelp extends Service {
11
11
  setCredentialsExample(serviceName) {
12
12
  return `latchkey auth set ${serviceName} -H "Authorization: Bearer <token>"`;
13
13
  }
14
+ // Yelp API keys are app-scoped and the Fusion API has no endpoint that
15
+ // reveals the account behind them.
16
+ getAccount() {
17
+ return Promise.resolve(null);
18
+ }
14
19
  }
15
20
  export const YELP = new Yelp();
16
21
  //# sourceMappingURL=yelp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"yelp.js","sourceRoot":"","sources":["../../../src/services/yelp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,IAAK,SAAQ,OAAO;IACtB,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,MAAM,CAAC;IACrB,WAAW,GAAG,CAAC,uBAAuB,CAAU,CAAC;IACjD,QAAQ,GAAG,4BAA4B,CAAC;IACxC,IAAI,GAAG,4CAA4C,CAAC;IAEpD,4BAA4B,GAAG;QACtC,gEAAgE;KACxD,CAAC;IAEX,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"yelp.js","sourceRoot":"","sources":["../../../src/services/yelp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,IAAK,SAAQ,OAAO;IACtB,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,MAAM,CAAC;IACrB,WAAW,GAAG,CAAC,uBAAuB,CAAU,CAAC;IACjD,QAAQ,GAAG,4BAA4B,CAAC;IACxC,IAAI,GAAG,4CAA4C,CAAC;IAEpD,4BAA4B,GAAG;QACtC,gEAAgE;KACxD,CAAC;IAEX,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;IAED,uEAAuE;IACvE,mCAAmC;IACnC,UAAU;QACR,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { ApiCredentials } from '../apiCredentials/base.js';
1
2
  import { Service } from './core/base.js';
2
3
  export declare class Zoom extends Service {
3
4
  readonly name = "zoom";
@@ -7,6 +8,13 @@ export declare class Zoom extends Service {
7
8
  readonly info = "https://developers.zoom.us/docs/api/.";
8
9
  readonly credentialCheckCurlArguments: readonly ["-H", "Content-Type: application/json", "https://api.zoom.us/v2/users?page_size=1"];
9
10
  setCredentialsExample(serviceName: string): string;
11
+ /**
12
+ * The account comes from /users/me rather than the user-list endpoint used
13
+ * by the credential check, which carries no identity. Server-to-server
14
+ * tokens have no user context and error on /users/me, in which case the
15
+ * account stays undetermined.
16
+ */
17
+ getAccount(apiCredentials: ApiCredentials): Promise<string | null>;
10
18
  }
11
19
  export declare const ZOOM: Zoom;
12
20
  //# sourceMappingURL=zoom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/services/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,IAAK,SAAQ,OAAO;IAC/B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,UAAU;IAC9B,QAAQ,CAAC,WAAW,uCAAwC;IAC5D,QAAQ,CAAC,QAAQ,4BAA4B;IAC7C,QAAQ,CAAC,IAAI,2CAA2C;IAExD,QAAQ,CAAC,4BAA4B,gGAI1B;IAEX,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAGnD;AAED,eAAO,MAAM,IAAI,MAAa,CAAC"}
1
+ {"version":3,"file":"zoom.d.ts","sourceRoot":"","sources":["../../../src/services/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,qBAAa,IAAK,SAAQ,OAAO;IAC/B,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,WAAW,UAAU;IAC9B,QAAQ,CAAC,WAAW,uCAAwC;IAC5D,QAAQ,CAAC,QAAQ,4BAA4B;IAC7C,QAAQ,CAAC,IAAI,2CAA2C;IAExD,QAAQ,CAAC,4BAA4B,gGAI1B;IAEX,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIlD;;;;;OAKG;IACM,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAiB5E;AAED,eAAO,MAAM,IAAI,MAAa,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { fetchAccountFromEndpoint, tryParseJson } from '../apiCredentials/account.js';
1
2
  import { Service } from './core/base.js';
2
3
  export class Zoom extends Service {
3
4
  name = 'zoom';
@@ -13,6 +14,21 @@ export class Zoom extends Service {
13
14
  setCredentialsExample(serviceName) {
14
15
  return `latchkey auth set ${serviceName} -H "Authorization: Bearer <token>"`;
15
16
  }
17
+ /**
18
+ * The account comes from /users/me rather than the user-list endpoint used
19
+ * by the credential check, which carries no identity. Server-to-server
20
+ * tokens have no user context and error on /users/me, in which case the
21
+ * account stays undetermined.
22
+ */
23
+ getAccount(apiCredentials) {
24
+ return fetchAccountFromEndpoint(apiCredentials, ['https://api.zoom.us/v2/users/me'], (responseBody) => {
25
+ const data = tryParseJson(responseBody);
26
+ if (data === null || data.code !== undefined) {
27
+ return null;
28
+ }
29
+ return data.email ?? data.id ?? null;
30
+ });
31
+ }
16
32
  }
17
33
  export const ZOOM = new Zoom();
18
34
  //# sourceMappingURL=zoom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/services/zoom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,IAAK,SAAQ,OAAO;IACtB,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,MAAM,CAAC;IACrB,WAAW,GAAG,CAAC,yBAAyB,CAAU,CAAC;IACnD,QAAQ,GAAG,wBAAwB,CAAC;IACpC,IAAI,GAAG,uCAAuC,CAAC;IAE/C,4BAA4B,GAAG;QACtC,IAAI;QACJ,gCAAgC;QAChC,0CAA0C;KAClC,CAAC;IAEX,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;CACF;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC"}
1
+ {"version":3,"file":"zoom.js","sourceRoot":"","sources":["../../../src/services/zoom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,OAAO,IAAK,SAAQ,OAAO;IACtB,IAAI,GAAG,MAAM,CAAC;IACd,WAAW,GAAG,MAAM,CAAC;IACrB,WAAW,GAAG,CAAC,yBAAyB,CAAU,CAAC;IACnD,QAAQ,GAAG,wBAAwB,CAAC;IACpC,IAAI,GAAG,uCAAuC,CAAC;IAE/C,4BAA4B,GAAG;QACtC,IAAI;QACJ,gCAAgC;QAChC,0CAA0C;KAClC,CAAC;IAEX,qBAAqB,CAAC,WAAmB;QACvC,OAAO,qBAAqB,WAAW,qCAAqC,CAAC;IAC/E,CAAC;IAED;;;;;OAKG;IACM,UAAU,CAAC,cAA8B;QAChD,OAAO,wBAAwB,CAC7B,cAAc,EACd,CAAC,iCAAiC,CAAC,EACnC,CAAC,YAAY,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAI9B,CAAC;YACT,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC;QACvC,CAAC,CACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC"}
@@ -19,24 +19,43 @@ export declare class BrowserNotConfiguredError extends Error {
19
19
  export declare class PreparationRequiredError extends Error {
20
20
  constructor(serviceName: string);
21
21
  }
22
+ /**
23
+ * Thrown when an explicitly named account has no stored credentials.
24
+ */
25
+ export declare class AccountNotFoundError extends Error {
26
+ constructor(serviceName: string, account: string);
27
+ }
22
28
  export declare function servicesList(registry: ServiceRegistry, apiCredentialStore: ApiCredentialStore, config: Config, options: {
23
29
  builtin?: boolean;
24
30
  viable?: boolean;
25
31
  }): readonly string[];
32
+ /**
33
+ * Status of a single stored credential, keyed by account in the various
34
+ * listings. Shared between `auth list` and `services info`.
35
+ */
36
+ export interface CredentialStatusEntry {
37
+ readonly credentialType: string;
38
+ readonly credentialStatus: ApiCredentialStatus;
39
+ }
40
+ /**
41
+ * A service's stored credentials keyed by account. The default account is
42
+ * keyed by the empty string.
43
+ */
44
+ export type AccountCredentialStatuses = Record<string, CredentialStatusEntry>;
26
45
  export interface ServicesInfoResult {
27
46
  readonly type: 'built-in' | 'user-registered';
28
47
  readonly baseApiUrls: readonly (string | RegExp)[];
29
48
  readonly authOptions: readonly string[];
30
- readonly credentialStatus: ApiCredentialStatus;
49
+ readonly credentials: AccountCredentialStatuses;
31
50
  readonly setCredentialsExample: string;
32
51
  readonly developerNotes: string;
33
52
  }
34
53
  export declare function servicesInfo(registry: ServiceRegistry, apiCredentialStore: ApiCredentialStore, config: Config, serviceName: string, offline?: boolean): Promise<ServicesInfoResult>;
35
- export declare function authList(registry: ServiceRegistry, apiCredentialStore: ApiCredentialStore, config: Config): Promise<Record<string, {
36
- credentialType: string;
37
- credentialStatus: ApiCredentialStatus;
38
- }>>;
39
- export declare function authBrowser(registry: ServiceRegistry, apiCredentialStore: ApiCredentialStore, encryptedStorage: EncryptedStorage, config: Config, serviceName: string): Promise<void>;
54
+ export declare function authList(registry: ServiceRegistry, apiCredentialStore: ApiCredentialStore, config: Config): Promise<Record<string, AccountCredentialStatuses>>;
55
+ export interface AuthBrowserResult {
56
+ readonly account: string;
57
+ }
58
+ export declare function authBrowser(registry: ServiceRegistry, apiCredentialStore: ApiCredentialStore, encryptedStorage: EncryptedStorage, config: Config, serviceName: string, account?: string): Promise<AuthBrowserResult>;
40
59
  export interface AuthBrowserPrepareResult {
41
60
  readonly alreadyPrepared: boolean;
42
61
  }
@@ -46,10 +65,11 @@ export interface PrepareServiceResult {
46
65
  readonly credentialType: string;
47
66
  }
48
67
  /**
49
- * Store credentials for a service from a validated JSON payload
50
- * (`latchkey auth prepare <service> <json>`). The whole operation is rejected — and
51
- * nothing is stored — if the JSON is malformed, fails the service's schema, or
52
- * the service does not support prepare.
68
+ * Store a service's preparation from a validated JSON payload
69
+ * (`latchkey auth prepare <service> <json>`), overwriting any previous
70
+ * preparation. The whole operation is rejected — and nothing is stored — if
71
+ * the JSON is malformed, fails the service's schema, or the service does not
72
+ * support prepare.
53
73
  */
54
74
  export declare function prepareService(registry: ServiceRegistry, apiCredentialStore: ApiCredentialStore, serviceName: string, json: string): PrepareServiceResult;
55
75
  //# sourceMappingURL=sharedOperations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sharedOperations.d.ts","sourceRoot":"","sources":["../../src/sharedOperations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAY5D,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,WAAW,EAAE,MAAM;CAMhC;AAED,qBAAa,yBAA0B,SAAQ,KAAK;;CAKnD;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,WAAW,EAAE,MAAM;CAOhC;AAkCD,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,eAAe,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/C,SAAS,MAAM,EAAE,CAoBnB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,iBAAiB,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACnD,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;IAC/C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,eAAe,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,OAAO,UAAQ,GACd,OAAO,CAAC,kBAAkB,CAAC,CAyB7B;AAED,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,eAAe,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAAC,CAwB5F;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,eAAe,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,eAAe,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,gBAAgB,EAClC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,wBAAwB,CAAC,CA8BnC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,GACX,oBAAoB,CAyBtB"}
1
+ {"version":3,"file":"sharedOperations.d.ts","sourceRoot":"","sources":["../../src/sharedOperations.ts"],"names":[],"mappings":"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"}