@getbrevo/cli 2.0.2 → 2.1.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 (217) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +8 -5
  3. package/agent-context/AGENTS.md +59 -15
  4. package/agent-context/SKILL.md +70 -14
  5. package/dist/{templates → bin}/files/AGENTS.md.tmpl +11 -1
  6. package/dist/{templates → bin}/files/CLAUDE.md.tmpl +8 -0
  7. package/dist/{templates → bin}/files/README.md.tmpl +11 -14
  8. package/dist/bin/files/app-config.json.tmpl +16 -0
  9. package/dist/{templates → bin}/files/src/oauth/.env.example.tmpl +8 -0
  10. package/dist/{templates → bin}/files/src/oauth/.env.local.tmpl +2 -0
  11. package/dist/{templates → bin}/files/src/oauth/handler.js.tmpl +49 -7
  12. package/dist/{templates → bin}/files/src/oauth/server.js.tmpl +20 -14
  13. package/dist/{templates → bin}/files/src/oauth/token-store.js.tmpl +19 -0
  14. package/dist/bin/index.js +660 -235
  15. package/dist/bin/index.js.map +7 -1
  16. package/package.json +6 -4
  17. package/dist/api/client.d.ts +0 -25
  18. package/dist/api/client.d.ts.map +0 -1
  19. package/dist/api/client.js +0 -205
  20. package/dist/api/client.js.map +0 -1
  21. package/dist/bin/index.d.ts +0 -3
  22. package/dist/bin/index.d.ts.map +0 -1
  23. package/dist/commands/app/create.d.ts +0 -8
  24. package/dist/commands/app/create.d.ts.map +0 -1
  25. package/dist/commands/app/create.js +0 -325
  26. package/dist/commands/app/create.js.map +0 -1
  27. package/dist/commands/app/credentials.d.ts +0 -6
  28. package/dist/commands/app/credentials.d.ts.map +0 -1
  29. package/dist/commands/app/credentials.js +0 -114
  30. package/dist/commands/app/credentials.js.map +0 -1
  31. package/dist/commands/app/delete.d.ts +0 -6
  32. package/dist/commands/app/delete.d.ts.map +0 -1
  33. package/dist/commands/app/delete.js +0 -167
  34. package/dist/commands/app/delete.js.map +0 -1
  35. package/dist/commands/app/list.d.ts +0 -4
  36. package/dist/commands/app/list.d.ts.map +0 -1
  37. package/dist/commands/app/list.js +0 -71
  38. package/dist/commands/app/list.js.map +0 -1
  39. package/dist/commands/app/scaffold.d.ts +0 -5
  40. package/dist/commands/app/scaffold.d.ts.map +0 -1
  41. package/dist/commands/app/scaffold.js +0 -213
  42. package/dist/commands/app/scaffold.js.map +0 -1
  43. package/dist/commands/app/scopes.d.ts +0 -2
  44. package/dist/commands/app/scopes.d.ts.map +0 -1
  45. package/dist/commands/app/scopes.js +0 -81
  46. package/dist/commands/app/scopes.js.map +0 -1
  47. package/dist/commands/app/start.d.ts +0 -5
  48. package/dist/commands/app/start.d.ts.map +0 -1
  49. package/dist/commands/app/start.js +0 -220
  50. package/dist/commands/app/start.js.map +0 -1
  51. package/dist/commands/app/update.d.ts +0 -2
  52. package/dist/commands/app/update.d.ts.map +0 -1
  53. package/dist/commands/app/update.js +0 -444
  54. package/dist/commands/app/update.js.map +0 -1
  55. package/dist/commands/definitions.d.ts +0 -5
  56. package/dist/commands/definitions.d.ts.map +0 -1
  57. package/dist/commands/definitions.js +0 -262
  58. package/dist/commands/definitions.js.map +0 -1
  59. package/dist/commands/init.d.ts +0 -2
  60. package/dist/commands/init.d.ts.map +0 -1
  61. package/dist/commands/init.js +0 -138
  62. package/dist/commands/init.js.map +0 -1
  63. package/dist/commands/login.d.ts +0 -6
  64. package/dist/commands/login.d.ts.map +0 -1
  65. package/dist/commands/login.js +0 -251
  66. package/dist/commands/login.js.map +0 -1
  67. package/dist/commands/logout.d.ts +0 -5
  68. package/dist/commands/logout.d.ts.map +0 -1
  69. package/dist/commands/logout.js +0 -54
  70. package/dist/commands/logout.js.map +0 -1
  71. package/dist/commands/skill/install.d.ts +0 -4
  72. package/dist/commands/skill/install.d.ts.map +0 -1
  73. package/dist/commands/skill/install.js +0 -29
  74. package/dist/commands/skill/install.js.map +0 -1
  75. package/dist/commands/skill/uninstall.d.ts +0 -4
  76. package/dist/commands/skill/uninstall.d.ts.map +0 -1
  77. package/dist/commands/skill/uninstall.js +0 -23
  78. package/dist/commands/skill/uninstall.js.map +0 -1
  79. package/dist/commands/whoami.d.ts +0 -4
  80. package/dist/commands/whoami.d.ts.map +0 -1
  81. package/dist/commands/whoami.js +0 -85
  82. package/dist/commands/whoami.js.map +0 -1
  83. package/dist/container.d.ts +0 -7
  84. package/dist/container.d.ts.map +0 -1
  85. package/dist/container.js +0 -28
  86. package/dist/container.js.map +0 -1
  87. package/dist/lang/en.d.ts +0 -162
  88. package/dist/lang/en.d.ts.map +0 -1
  89. package/dist/lang/en.js +0 -189
  90. package/dist/lang/en.js.map +0 -1
  91. package/dist/lib/abort.d.ts +0 -3
  92. package/dist/lib/abort.d.ts.map +0 -1
  93. package/dist/lib/abort.js +0 -30
  94. package/dist/lib/abort.js.map +0 -1
  95. package/dist/lib/auth-guard.d.ts +0 -13
  96. package/dist/lib/auth-guard.d.ts.map +0 -1
  97. package/dist/lib/auth-guard.js +0 -60
  98. package/dist/lib/auth-guard.js.map +0 -1
  99. package/dist/lib/browser.d.ts +0 -2
  100. package/dist/lib/browser.d.ts.map +0 -1
  101. package/dist/lib/browser.js +0 -16
  102. package/dist/lib/browser.js.map +0 -1
  103. package/dist/lib/cli-version.d.ts +0 -2
  104. package/dist/lib/cli-version.d.ts.map +0 -1
  105. package/dist/lib/cli-version.js +0 -59
  106. package/dist/lib/cli-version.js.map +0 -1
  107. package/dist/lib/command-handler.d.ts +0 -10
  108. package/dist/lib/command-handler.d.ts.map +0 -1
  109. package/dist/lib/command-handler.js +0 -16
  110. package/dist/lib/command-handler.js.map +0 -1
  111. package/dist/lib/command-registry.d.ts +0 -28
  112. package/dist/lib/command-registry.d.ts.map +0 -1
  113. package/dist/lib/command-registry.js +0 -54
  114. package/dist/lib/command-registry.js.map +0 -1
  115. package/dist/lib/config.d.ts +0 -83
  116. package/dist/lib/config.d.ts.map +0 -1
  117. package/dist/lib/config.js +0 -430
  118. package/dist/lib/config.js.map +0 -1
  119. package/dist/lib/constants.d.ts +0 -48
  120. package/dist/lib/constants.d.ts.map +0 -1
  121. package/dist/lib/constants.js +0 -121
  122. package/dist/lib/constants.js.map +0 -1
  123. package/dist/lib/errors.d.ts +0 -30
  124. package/dist/lib/errors.d.ts.map +0 -1
  125. package/dist/lib/errors.js +0 -66
  126. package/dist/lib/errors.js.map +0 -1
  127. package/dist/lib/exit-codes.d.ts +0 -9
  128. package/dist/lib/exit-codes.d.ts.map +0 -1
  129. package/dist/lib/exit-codes.js +0 -12
  130. package/dist/lib/exit-codes.js.map +0 -1
  131. package/dist/lib/hidden-input.d.ts +0 -2
  132. package/dist/lib/hidden-input.d.ts.map +0 -1
  133. package/dist/lib/hidden-input.js +0 -78
  134. package/dist/lib/hidden-input.js.map +0 -1
  135. package/dist/lib/json-output.d.ts +0 -6
  136. package/dist/lib/json-output.d.ts.map +0 -1
  137. package/dist/lib/json-output.js +0 -11
  138. package/dist/lib/json-output.js.map +0 -1
  139. package/dist/lib/logger.d.ts +0 -11
  140. package/dist/lib/logger.d.ts.map +0 -1
  141. package/dist/lib/logger.js +0 -110
  142. package/dist/lib/logger.js.map +0 -1
  143. package/dist/lib/oauth-freshness.d.ts +0 -30
  144. package/dist/lib/oauth-freshness.d.ts.map +0 -1
  145. package/dist/lib/oauth-freshness.js +0 -61
  146. package/dist/lib/oauth-freshness.js.map +0 -1
  147. package/dist/lib/port.d.ts +0 -25
  148. package/dist/lib/port.d.ts.map +0 -1
  149. package/dist/lib/port.js +0 -103
  150. package/dist/lib/port.js.map +0 -1
  151. package/dist/lib/telemetry.d.ts +0 -9
  152. package/dist/lib/telemetry.d.ts.map +0 -1
  153. package/dist/lib/telemetry.js +0 -57
  154. package/dist/lib/telemetry.js.map +0 -1
  155. package/dist/lib/ui.d.ts +0 -14
  156. package/dist/lib/ui.d.ts.map +0 -1
  157. package/dist/lib/ui.js +0 -75
  158. package/dist/lib/ui.js.map +0 -1
  159. package/dist/lib/update-notifier.d.ts +0 -37
  160. package/dist/lib/update-notifier.d.ts.map +0 -1
  161. package/dist/lib/update-notifier.js +0 -298
  162. package/dist/lib/update-notifier.js.map +0 -1
  163. package/dist/lib/validators.d.ts +0 -55
  164. package/dist/lib/validators.d.ts.map +0 -1
  165. package/dist/lib/validators.js +0 -166
  166. package/dist/lib/validators.js.map +0 -1
  167. package/dist/services/account.d.ts +0 -8
  168. package/dist/services/account.d.ts.map +0 -1
  169. package/dist/services/account.js +0 -15
  170. package/dist/services/account.js.map +0 -1
  171. package/dist/services/app.d.ts +0 -38
  172. package/dist/services/app.d.ts.map +0 -1
  173. package/dist/services/app.js +0 -145
  174. package/dist/services/app.js.map +0 -1
  175. package/dist/services/browser-auth.d.ts +0 -15
  176. package/dist/services/browser-auth.d.ts.map +0 -1
  177. package/dist/services/browser-auth.js +0 -188
  178. package/dist/services/browser-auth.js.map +0 -1
  179. package/dist/services/normalize-app-id.d.ts +0 -12
  180. package/dist/services/normalize-app-id.d.ts.map +0 -1
  181. package/dist/services/normalize-app-id.js +0 -38
  182. package/dist/services/normalize-app-id.js.map +0 -1
  183. package/dist/services/oauth-metadata.d.ts +0 -7
  184. package/dist/services/oauth-metadata.d.ts.map +0 -1
  185. package/dist/services/oauth-metadata.js +0 -43
  186. package/dist/services/oauth-metadata.js.map +0 -1
  187. package/dist/services/oauth-refresh.d.ts +0 -14
  188. package/dist/services/oauth-refresh.d.ts.map +0 -1
  189. package/dist/services/oauth-refresh.js +0 -70
  190. package/dist/services/oauth-refresh.js.map +0 -1
  191. package/dist/services/scopes-html.d.ts +0 -3
  192. package/dist/services/scopes-html.d.ts.map +0 -1
  193. package/dist/services/scopes-html.js +0 -516
  194. package/dist/services/scopes-html.js.map +0 -1
  195. package/dist/services/scopes-web.d.ts +0 -12
  196. package/dist/services/scopes-web.d.ts.map +0 -1
  197. package/dist/services/scopes-web.js +0 -95
  198. package/dist/services/scopes-web.js.map +0 -1
  199. package/dist/services/skill.d.ts +0 -48
  200. package/dist/services/skill.d.ts.map +0 -1
  201. package/dist/services/skill.js +0 -223
  202. package/dist/services/skill.js.map +0 -1
  203. package/dist/skills/index.d.ts +0 -47
  204. package/dist/skills/index.d.ts.map +0 -1
  205. package/dist/skills/index.js +0 -61
  206. package/dist/skills/index.js.map +0 -1
  207. package/dist/templates/files/app-config.json.tmpl +0 -25
  208. package/dist/templates/index.d.ts +0 -36
  209. package/dist/templates/index.d.ts.map +0 -1
  210. package/dist/templates/index.js +0 -105
  211. package/dist/templates/index.js.map +0 -1
  212. package/dist/types.d.ts +0 -32
  213. package/dist/types.d.ts.map +0 -1
  214. package/dist/types.js +0 -3
  215. package/dist/types.js.map +0 -1
  216. /package/dist/{templates → bin}/files/gitignore.tmpl +0 -0
  217. /package/dist/{templates → bin}/files/src/oauth/package.json.tmpl +0 -0
@@ -1,145 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createAppService = createAppService;
7
- const inquirer_1 = __importDefault(require("inquirer"));
8
- const cli_version_1 = require("../lib/cli-version");
9
- const constants_1 = require("../lib/constants");
10
- const errors_1 = require("../lib/errors");
11
- const exit_codes_1 = require("../lib/exit-codes");
12
- const logger_1 = require("../lib/logger");
13
- const ui_1 = require("../lib/ui");
14
- const en_1 = require("../lang/en");
15
- const config_1 = require("../lib/config");
16
- const normalize_app_id_1 = require("./normalize-app-id");
17
- function rethrowNotFound(err, appId) {
18
- if (err instanceof errors_1.ApiError && err.statusCode === 404) {
19
- throw new errors_1.CliError(`App ${appId} not found.`, err.exitCode);
20
- }
21
- throw err;
22
- }
23
- /**
24
- * Check apps exist and throw with user-facing message if empty.
25
- */
26
- function logEmptyAndThrow() {
27
- (0, logger_1.logInfo)(`\n ${en_1.messages.APP_LIST_EMPTY}\n`);
28
- throw new errors_1.CliError(en_1.messages.APP_LIST_EMPTY, exit_codes_1.EXIT_CODES.ERROR);
29
- }
30
- function createAppService(client) {
31
- async function fetchAppsList() {
32
- const apps = await client.get(constants_1.ENDPOINTS.APP_STORE_APPS);
33
- return (apps || []).map(normalize_app_id_1.normalizeAppId);
34
- }
35
- return {
36
- fetchAppsList,
37
- async fetchApp(appId) {
38
- let app;
39
- try {
40
- app = await client.get(constants_1.ENDPOINTS.APP_STORE_APP(appId));
41
- }
42
- catch (err) {
43
- rethrowNotFound(err, appId);
44
- }
45
- return app ? (0, normalize_app_id_1.normalizeAppId)(app) : null;
46
- },
47
- async pickApp(promptMessage, formatChoice) {
48
- const spinner = (0, ui_1.createSpinner)('Loading apps...');
49
- const apps = await fetchAppsList();
50
- spinner.stop();
51
- if (apps.length === 0) {
52
- logEmptyAndThrow();
53
- }
54
- const { selectedApp } = await inquirer_1.default.prompt([
55
- {
56
- type: 'rawlist',
57
- name: 'selectedApp',
58
- message: promptMessage,
59
- choices: apps.map((a) => {
60
- const appName = a.name || 'App ' + a.app_id;
61
- return {
62
- name: formatChoice
63
- ? formatChoice(a)
64
- : `${appName} (App ID: ${a.app_id}, Client ID: ${a.client_id})`,
65
- value: a.app_id,
66
- };
67
- }),
68
- },
69
- ]);
70
- return selectedApp;
71
- },
72
- /**
73
- * Fetch app from API and merge with local cache.
74
- * The GET endpoint may not return client_secret (only shown at creation),
75
- * so we fall back to the locally cached value.
76
- */
77
- async resolveAppCredentials(appId) {
78
- let raw;
79
- try {
80
- raw = await client.get(constants_1.ENDPOINTS.APP_STORE_APP(appId));
81
- }
82
- catch (err) {
83
- rethrowNotFound(err, appId);
84
- }
85
- if (!raw)
86
- return null;
87
- const app = (0, normalize_app_id_1.normalizeAppId)(raw);
88
- const local = (0, config_1.getAppCredentials)(appId);
89
- const diffs = [];
90
- // Merge: prefer remote values, fall back to local cache for missing fields
91
- if (local) {
92
- if (!app.client_id && local.clientId) {
93
- app.client_id = local.clientId;
94
- }
95
- else if (local.clientId && local.clientId !== app.client_id) {
96
- diffs.push('client_id');
97
- }
98
- if (!app.client_secret && local.clientSecret) {
99
- app.client_secret = local.clientSecret;
100
- }
101
- else if (local.clientSecret && local.clientSecret !== app.client_secret) {
102
- diffs.push('client_secret');
103
- }
104
- }
105
- return { app, diffs };
106
- },
107
- /**
108
- * Save credentials to local cache.
109
- * Preserves existing local values when the app has missing fields
110
- * (e.g. GET endpoint doesn't return client_secret).
111
- */
112
- syncAppCredentials(appId, app) {
113
- const existing = (0, config_1.getAppCredentials)(appId);
114
- const clientId = app.client_id || existing?.clientId;
115
- const clientSecret = app.client_secret || existing?.clientSecret;
116
- // Only write if we have at least a client ID and a non-empty secret
117
- if (clientId && clientSecret) {
118
- (0, config_1.saveAppCredentials)(appId, { clientId, clientSecret });
119
- }
120
- },
121
- async createApp(payload) {
122
- const raw = await client.post(constants_1.ENDPOINTS.APP_STORE_APPS, {
123
- ...payload,
124
- source: 'cli',
125
- cli_version: cli_version_1.CLI_VERSION,
126
- });
127
- return (0, normalize_app_id_1.normalizeAppId)(raw);
128
- },
129
- async updateApp(appId, body) {
130
- await client.patch(constants_1.ENDPOINTS.APP_STORE_APP(appId), {
131
- ...body,
132
- cli_version: cli_version_1.CLI_VERSION,
133
- });
134
- },
135
- async deleteApp(appId) {
136
- try {
137
- await client.delete(constants_1.ENDPOINTS.APP_STORE_APP(appId));
138
- }
139
- catch (err) {
140
- rethrowNotFound(err, appId);
141
- }
142
- },
143
- };
144
- }
145
- //# sourceMappingURL=app.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/services/app.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- export interface OAuthTokens {
2
- accessToken: string;
3
- refreshToken: string;
4
- expiresIn: number;
5
- tokenType: string;
6
- scope?: string;
7
- }
8
- export interface RunBrowserLoginOptions {
9
- proxyUrl: string;
10
- timeoutMs?: number;
11
- openBrowser?: (url: string) => void;
12
- onWaiting?: (loginUrl: string) => void;
13
- }
14
- export declare function runBrowserLoginFlow(opts: RunBrowserLoginOptions): Promise<OAuthTokens>;
15
- //# sourceMappingURL=browser-auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-auth.d.ts","sourceRoot":"","sources":["../../src/services/browser-auth.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAsCD,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAkI5F"}
@@ -1,188 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.runBrowserLoginFlow = runBrowserLoginFlow;
37
- const http = __importStar(require("node:http"));
38
- const node_crypto_1 = require("node:crypto");
39
- const logger_1 = require("../lib/logger");
40
- const errors_1 = require("../lib/errors");
41
- const en_1 = require("../lang/en");
42
- const MAX_BODY_BYTES = 16 * 1024;
43
- // 5 minutes — accommodates SSO/2FA flows where the user may need to fetch a
44
- // code from another device. 120s was too tight and routinely timed out mid-2FA.
45
- const DEFAULT_TIMEOUT_MS = 300_000;
46
- function normalizeTokens(raw) {
47
- if (typeof raw.access_token !== 'string' ||
48
- !raw.access_token ||
49
- typeof raw.refresh_token !== 'string' ||
50
- !raw.refresh_token ||
51
- typeof raw.expires_in !== 'number' ||
52
- !Number.isFinite(raw.expires_in) ||
53
- raw.expires_in <= 0 ||
54
- typeof raw.token_type !== 'string' ||
55
- !raw.token_type) {
56
- return null;
57
- }
58
- return {
59
- accessToken: raw.access_token,
60
- refreshToken: raw.refresh_token,
61
- expiresIn: raw.expires_in,
62
- tokenType: raw.token_type,
63
- scope: typeof raw.scope === 'string' ? raw.scope : undefined,
64
- };
65
- }
66
- async function runBrowserLoginFlow(opts) {
67
- const proxyOrigin = new URL(opts.proxyUrl).origin;
68
- const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
69
- const openBrowser = opts.openBrowser ?? (() => { });
70
- return new Promise((resolve, reject) => {
71
- let settled = false;
72
- const claimSettlement = () => {
73
- if (settled)
74
- return false;
75
- settled = true;
76
- return true;
77
- };
78
- const server = http.createServer((req, res) => {
79
- const pathname = new URL(req.url ?? '/', 'http://127.0.0.1').pathname;
80
- const origin = req.headers.origin;
81
- (0, logger_1.logDebug)('loopback request', { method: req.method, url: req.url, pathname, origin });
82
- if (req.method === 'OPTIONS' && pathname === '/callback') {
83
- if (origin !== proxyOrigin) {
84
- (0, logger_1.logDebug)('loopback OPTIONS rejected: origin mismatch', { origin, expected: proxyOrigin });
85
- res.writeHead(403).end();
86
- return;
87
- }
88
- res
89
- .writeHead(204, {
90
- 'Access-Control-Allow-Origin': proxyOrigin,
91
- 'Access-Control-Allow-Methods': 'POST, OPTIONS',
92
- 'Access-Control-Allow-Headers': 'Content-Type',
93
- 'Access-Control-Max-Age': '600',
94
- })
95
- .end();
96
- return;
97
- }
98
- if (req.method === 'POST' && pathname === '/callback') {
99
- if (origin !== proxyOrigin) {
100
- (0, logger_1.logDebug)('loopback POST rejected: origin mismatch', { origin, expected: proxyOrigin });
101
- res.writeHead(403).end();
102
- return;
103
- }
104
- let bytes = 0;
105
- const chunks = [];
106
- req.on('data', (chunk) => {
107
- bytes += chunk.length;
108
- if (bytes > MAX_BODY_BYTES) {
109
- (0, logger_1.logDebug)('loopback POST rejected: body too large', { bytes, max: MAX_BODY_BYTES });
110
- res.writeHead(413, { Connection: 'close' }).end();
111
- req.destroy();
112
- return;
113
- }
114
- chunks.push(chunk);
115
- });
116
- req.on('end', () => {
117
- let parsed = null;
118
- try {
119
- parsed = JSON.parse(Buffer.concat(chunks).toString('utf-8'));
120
- }
121
- catch {
122
- parsed = null;
123
- }
124
- const tokens = parsed ? normalizeTokens(parsed) : null;
125
- if (!tokens) {
126
- (0, logger_1.logDebug)('loopback POST rejected: bad payload shape', {
127
- hasParsed: parsed !== null,
128
- keys: parsed ? Object.keys(parsed) : null,
129
- });
130
- res
131
- .writeHead(400, {
132
- 'Access-Control-Allow-Origin': proxyOrigin,
133
- 'Content-Type': 'text/plain',
134
- })
135
- .end('Bad payload');
136
- return;
137
- }
138
- (0, logger_1.logDebug)('loopback POST accepted', { hasScope: tokens.scope !== undefined });
139
- res.writeHead(204, { 'Access-Control-Allow-Origin': proxyOrigin }).end();
140
- if (claimSettlement()) {
141
- server.close();
142
- resolve(tokens);
143
- }
144
- });
145
- return;
146
- }
147
- if (req.method === 'GET' && (pathname === '/' || pathname === '/callback')) {
148
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
149
- res.end('<!doctype html><meta charset="utf-8"><title>Brevo CLI login</title>' +
150
- '<p>Waiting for login to complete — you can close this tab once the CLI confirms success.</p>');
151
- return;
152
- }
153
- (0, logger_1.logDebug)('loopback request not matched', { method: req.method, pathname });
154
- res.writeHead(404).end();
155
- });
156
- server.on('error', (err) => {
157
- (0, logger_1.logDebug)('loopback server error', { message: err.message });
158
- if (claimSettlement())
159
- reject(err);
160
- });
161
- server.listen(0, '127.0.0.1', () => {
162
- const port = server.address().port;
163
- // Unique per-attempt token. If a previous attempt timed out mid-flow,
164
- // the browser may still have a tab open at the proxy showing an error;
165
- // a unique URL forces a fresh navigation instead of reusing that tab,
166
- // and prevents the proxy/browser from serving a cached response.
167
- const attemptToken = (0, node_crypto_1.randomUUID)();
168
- const loginUrl = `${opts.proxyUrl}/login?port=${port}&t=${attemptToken}`;
169
- (0, logger_1.logDebug)('loopback listening', { host: '127.0.0.1', port, proxyOrigin });
170
- opts.onWaiting?.(loginUrl);
171
- try {
172
- openBrowser(loginUrl);
173
- }
174
- catch {
175
- // best-effort — URL already surfaced via onWaiting
176
- }
177
- });
178
- const timer = setTimeout(() => {
179
- if (claimSettlement()) {
180
- server.close();
181
- reject(new errors_1.CliError(en_1.messages.AUTH_BROWSER_TIMEOUT));
182
- }
183
- }, timeoutMs);
184
- timer.unref?.();
185
- server.on('close', () => clearTimeout(timer));
186
- });
187
- }
188
- //# sourceMappingURL=browser-auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-auth.js","sourceRoot":"","sources":["../../src/services/browser-auth.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Coerce `app_id` on an API response object to a string.
3
- * Defensive boundary in case the server still returns a number for a legacy app.
4
- * Fails fast on unexpected types so invalid server responses never propagate as
5
- * bogus IDs (e.g. "undefined", "[object Object]") into requests or credential keys.
6
- */
7
- export declare function normalizeAppId<T extends {
8
- app_id: unknown;
9
- }>(raw: T): Omit<T, 'app_id'> & {
10
- app_id: string;
11
- };
12
- //# sourceMappingURL=normalize-app-id.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalize-app-id.d.ts","sourceRoot":"","sources":["../../src/services/normalize-app-id.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,EAC1D,GAAG,EAAE,CAAC,GACL,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAkBxC"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.normalizeAppId = normalizeAppId;
4
- const errors_1 = require("../lib/errors");
5
- /**
6
- * Coerce `app_id` on an API response object to a string.
7
- * Defensive boundary in case the server still returns a number for a legacy app.
8
- * Fails fast on unexpected types so invalid server responses never propagate as
9
- * bogus IDs (e.g. "undefined", "[object Object]") into requests or credential keys.
10
- */
11
- function normalizeAppId(raw) {
12
- const { app_id } = raw;
13
- if (typeof app_id === 'string') {
14
- const trimmed = app_id.trim();
15
- if (trimmed.length === 0) {
16
- throw new errors_1.CliError('Invalid app_id in API response: expected non-empty string, received empty string.');
17
- }
18
- return { ...raw, app_id: trimmed };
19
- }
20
- if (typeof app_id === 'number' && Number.isFinite(app_id)) {
21
- return { ...raw, app_id: String(app_id) };
22
- }
23
- const received = describeAppId(app_id);
24
- throw new errors_1.CliError(`Invalid app_id in API response: expected string or finite number, received ${received}.`);
25
- }
26
- function describeAppId(value) {
27
- if (value === null)
28
- return 'null';
29
- if (typeof value === 'number') {
30
- if (Number.isNaN(value))
31
- return 'number (NaN)';
32
- if (!Number.isFinite(value))
33
- return `number (${value > 0 ? 'Infinity' : '-Infinity'})`;
34
- return 'number';
35
- }
36
- return typeof value;
37
- }
38
- //# sourceMappingURL=normalize-app-id.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalize-app-id.js","sourceRoot":"","sources":["../../src/services/normalize-app-id.ts"],"names":[],"mappings":";;AAQA,wCAoBC;AA5BD,0CAAyC;AAEzC;;;;;GAKG;AACH,SAAgB,cAAc,CAC5B,GAAM;IAEN,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,iBAAQ,CAChB,mFAAmF,CACpF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,IAAI,iBAAQ,CAChB,8EAA8E,QAAQ,GAAG,CAC1F,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,cAAc,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC;QACvF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,KAAK,CAAC;AACtB,CAAC"}
@@ -1,7 +0,0 @@
1
- export interface ScopeEntry {
2
- name: string;
3
- category: string;
4
- apiEndpoints: string[];
5
- }
6
- export declare function fetchSupportedScopes(): Promise<ScopeEntry[]>;
7
- //# sourceMappingURL=oauth-metadata.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-metadata.d.ts","sourceRoot":"","sources":["../../src/services/oauth-metadata.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AASD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAuDlE"}
@@ -1,43 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchSupportedScopes = fetchSupportedScopes;
4
- const constants_1 = require("../lib/constants");
5
- const errors_1 = require("../lib/errors");
6
- const en_1 = require("../lang/en");
7
- async function fetchSupportedScopes() {
8
- let response;
9
- try {
10
- response = await fetch(constants_1.OAUTH_SCOPES_URL, { method: 'GET' });
11
- }
12
- catch {
13
- throw new errors_1.ApiError(en_1.messages.OAUTH_METADATA_FETCH_FAILED(constants_1.OAUTH_SCOPES_URL, 0), 0, errors_1.ErrorCode.NETWORK_ERROR);
14
- }
15
- if (!response.ok) {
16
- throw new errors_1.ApiError(en_1.messages.OAUTH_METADATA_FETCH_FAILED(constants_1.OAUTH_SCOPES_URL, response.status), response.status);
17
- }
18
- let body;
19
- try {
20
- body = await response.json();
21
- }
22
- catch {
23
- throw new errors_1.CliError(en_1.messages.OAUTH_METADATA_MISSING_SCOPES);
24
- }
25
- if (!body || typeof body !== 'object' || !Array.isArray(body.scopes)) {
26
- throw new errors_1.CliError(en_1.messages.OAUTH_METADATA_MISSING_SCOPES);
27
- }
28
- const rawScopes = body.scopes;
29
- return rawScopes
30
- .filter((s) => !!s &&
31
- typeof s === 'object' &&
32
- typeof s.name === 'string' &&
33
- typeof s.category === 'string' &&
34
- s.is_oidc_reserved !== true)
35
- .map((s) => ({
36
- name: s.name,
37
- category: s.category,
38
- apiEndpoints: Array.isArray(s.api_endpoints)
39
- ? s.api_endpoints.filter((e) => typeof e === 'string')
40
- : [],
41
- }));
42
- }
43
- //# sourceMappingURL=oauth-metadata.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-metadata.js","sourceRoot":"","sources":["../../src/services/oauth-metadata.ts"],"names":[],"mappings":";;AAiBA,oDAuDC;AAxED,gDAAoD;AACpD,0CAA8D;AAC9D,mCAAsC;AAe/B,KAAK,UAAU,oBAAoB;IACxC,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,4BAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAQ,CAChB,aAAQ,CAAC,2BAA2B,CAAC,4BAAgB,EAAE,CAAC,CAAC,EACzD,CAAC,EACD,kBAAS,CAAC,aAAa,CACxB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,iBAAQ,CAChB,aAAQ,CAAC,2BAA2B,CAAC,4BAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvE,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;IAED,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,6BAA6B,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,IAA6B,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,iBAAQ,CAAC,aAAQ,CAAC,6BAA6B,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,SAAS,GAAI,IAA8B,CAAC,MAAoB,CAAC;IAEvE,OAAO,SAAS;SACb,MAAM,CACL,CACE,CAAC,EAMD,EAAE,CACF,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,QAAQ;QACrB,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAC1B,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAC9B,CAAC,CAAC,gBAAgB,KAAK,IAAI,CAC9B;SACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;YAC1C,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YACnE,CAAC,CAAC,EAAE;KACP,CAAC,CAAC,CAAC;AACR,CAAC"}
@@ -1,14 +0,0 @@
1
- export interface RefreshedTokens {
2
- accessToken: string;
3
- refreshToken: string;
4
- expiresIn: number;
5
- tokenType: string;
6
- scope?: string;
7
- }
8
- export declare class RefreshError extends Error {
9
- readonly unauthorized: boolean;
10
- readonly cause?: unknown | undefined;
11
- constructor(message: string, unauthorized: boolean, cause?: unknown | undefined);
12
- }
13
- export declare function refreshAccessToken(refreshToken: string, proxyUrl: string): Promise<RefreshedTokens>;
14
- //# sourceMappingURL=oauth-refresh.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-refresh.d.ts","sourceRoot":"","sources":["../../src/services/oauth-refresh.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAa,SAAQ,KAAK;aAGnB,YAAY,EAAE,OAAO;aACrB,KAAK,CAAC,EAAE,OAAO;gBAF/B,OAAO,EAAE,MAAM,EACC,YAAY,EAAE,OAAO,EACrB,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC;AAED,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAgE1B"}
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RefreshError = void 0;
4
- exports.refreshAccessToken = refreshAccessToken;
5
- class RefreshError extends Error {
6
- unauthorized;
7
- cause;
8
- constructor(message, unauthorized, cause) {
9
- super(message);
10
- this.unauthorized = unauthorized;
11
- this.cause = cause;
12
- this.name = 'RefreshError';
13
- }
14
- }
15
- exports.RefreshError = RefreshError;
16
- async function refreshAccessToken(refreshToken, proxyUrl) {
17
- let res;
18
- try {
19
- res = await fetch(`${proxyUrl}/refresh`, {
20
- method: 'POST',
21
- headers: {
22
- 'Content-Type': 'application/json',
23
- Accept: 'application/json',
24
- },
25
- body: JSON.stringify({ refresh_token: refreshToken }),
26
- signal: AbortSignal.timeout(15_000),
27
- });
28
- }
29
- catch (err) {
30
- throw new RefreshError('Could not reach the Brevo login service.', false, err);
31
- }
32
- if (!res.ok) {
33
- throw new RefreshError(`Token refresh failed (${res.status}).`, res.status === 401);
34
- }
35
- let body;
36
- try {
37
- body = (await res.json());
38
- }
39
- catch (err) {
40
- throw new RefreshError('Malformed refresh response from login service.', false, err);
41
- }
42
- if (!body.access_token ||
43
- typeof body.access_token !== 'string' ||
44
- typeof body.expires_in !== 'number' ||
45
- !Number.isFinite(body.expires_in) ||
46
- body.expires_in <= 0 ||
47
- !body.token_type ||
48
- typeof body.token_type !== 'string') {
49
- throw new RefreshError('Malformed refresh response from login service.', false);
50
- }
51
- // refresh_token rotation is optional (proxies often only mint a new one
52
- // when the old one is close to expiry). When the field is present it must
53
- // be a non-empty string — `??` would let an empty string slip through and
54
- // get persisted as a permanently-broken refresh token.
55
- let resolvedRefreshToken = refreshToken;
56
- if (body.refresh_token !== undefined) {
57
- if (typeof body.refresh_token !== 'string' || body.refresh_token.length === 0) {
58
- throw new RefreshError('Malformed refresh response from login service.', false);
59
- }
60
- resolvedRefreshToken = body.refresh_token;
61
- }
62
- return {
63
- accessToken: body.access_token,
64
- refreshToken: resolvedRefreshToken,
65
- expiresIn: body.expires_in,
66
- tokenType: body.token_type,
67
- scope: body.scope,
68
- };
69
- }
70
- //# sourceMappingURL=oauth-refresh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-refresh.js","sourceRoot":"","sources":["../../src/services/oauth-refresh.ts"],"names":[],"mappings":";;;AAmBA,gDAmEC;AA9ED,MAAa,YAAa,SAAQ,KAAK;IAGnB;IACA;IAHlB,YACE,OAAe,EACC,YAAqB,EACrB,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,iBAAY,GAAZ,YAAY,CAAS;QACrB,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AATD,oCASC;AAEM,KAAK,UAAU,kBAAkB,CACtC,YAAoB,EACpB,QAAgB;IAEhB,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,UAAU,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;YACrD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,0CAA0C,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,YAAY,CAAC,yBAAyB,GAAG,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,IAMH,CAAC;IACF,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,gDAAgD,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACvF,CAAC;IAED,IACE,CAAC,IAAI,CAAC,YAAY;QAClB,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;QACrC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC,UAAU,IAAI,CAAC;QACpB,CAAC,IAAI,CAAC,UAAU;QAChB,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EACnC,CAAC;QACD,MAAM,IAAI,YAAY,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;IAED,wEAAwE;IACxE,0EAA0E;IAC1E,0EAA0E;IAC1E,uDAAuD;IACvD,IAAI,oBAAoB,GAAG,YAAY,CAAC;IACxC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,YAAY,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;QAClF,CAAC;QACD,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,oBAAoB;QAClC,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { ScopeEntry } from './oauth-metadata';
2
- export declare function renderScopesHtml(entries: ScopeEntry[]): string;
3
- //# sourceMappingURL=scopes-html.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scopes-html.d.ts","sourceRoot":"","sources":["../../src/services/scopes-html.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmcnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAqE9D"}