@nebulr-group/bridge-cli 0.6.5 → 1.0.0-alpha.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 (293) hide show
  1. package/README.md +93 -460
  2. package/dist/api/accounts.d.ts +69 -0
  3. package/dist/api/accounts.d.ts.map +1 -0
  4. package/dist/api/accounts.js +42 -0
  5. package/dist/api/accounts.js.map +1 -0
  6. package/dist/api/apps.d.ts +50 -0
  7. package/dist/api/apps.d.ts.map +1 -0
  8. package/dist/api/apps.js +62 -0
  9. package/dist/api/apps.js.map +1 -0
  10. package/dist/api/billing.d.ts +131 -0
  11. package/dist/api/billing.d.ts.map +1 -0
  12. package/dist/api/billing.js +42 -0
  13. package/dist/api/billing.js.map +1 -0
  14. package/dist/api/flags.d.ts +73 -0
  15. package/dist/api/flags.d.ts.map +1 -0
  16. package/dist/api/flags.js +108 -0
  17. package/dist/api/flags.js.map +1 -0
  18. package/dist/api/keys.d.ts +48 -0
  19. package/dist/api/keys.d.ts.map +1 -0
  20. package/dist/api/keys.js +87 -0
  21. package/dist/api/keys.js.map +1 -0
  22. package/dist/auth/browser-open.d.ts +21 -4
  23. package/dist/auth/browser-open.d.ts.map +1 -1
  24. package/dist/auth/browser-open.js +45 -65
  25. package/dist/auth/browser-open.js.map +1 -1
  26. package/dist/auth/lock.d.ts +8 -0
  27. package/dist/auth/lock.d.ts.map +1 -0
  28. package/dist/auth/lock.js +43 -0
  29. package/dist/auth/lock.js.map +1 -0
  30. package/dist/auth/loopback.d.ts +8 -12
  31. package/dist/auth/loopback.d.ts.map +1 -1
  32. package/dist/auth/loopback.js +40 -45
  33. package/dist/auth/loopback.js.map +1 -1
  34. package/dist/auth/session.d.ts +61 -0
  35. package/dist/auth/session.d.ts.map +1 -0
  36. package/dist/auth/session.js +142 -0
  37. package/dist/auth/session.js.map +1 -0
  38. package/dist/auth/sign-in.d.ts +67 -0
  39. package/dist/auth/sign-in.d.ts.map +1 -0
  40. package/dist/auth/sign-in.js +113 -0
  41. package/dist/auth/sign-in.js.map +1 -0
  42. package/dist/auth/store.d.ts +89 -0
  43. package/dist/auth/store.d.ts.map +1 -0
  44. package/dist/auth/store.js +214 -0
  45. package/dist/auth/store.js.map +1 -0
  46. package/dist/bin.js +0 -2
  47. package/dist/bin.js.map +1 -1
  48. package/dist/cli.d.ts +1 -2
  49. package/dist/cli.d.ts.map +1 -1
  50. package/dist/cli.js +13 -17
  51. package/dist/cli.js.map +1 -1
  52. package/dist/client.d.ts +31 -0
  53. package/dist/client.d.ts.map +1 -0
  54. package/dist/client.js +67 -0
  55. package/dist/client.js.map +1 -0
  56. package/dist/commands/accounts.command.d.ts +4 -0
  57. package/dist/commands/accounts.command.d.ts.map +1 -0
  58. package/dist/commands/accounts.command.js +116 -0
  59. package/dist/commands/accounts.command.js.map +1 -0
  60. package/dist/commands/app.command.d.ts +3 -2
  61. package/dist/commands/app.command.d.ts.map +1 -1
  62. package/dist/commands/app.command.js +132 -233
  63. package/dist/commands/app.command.js.map +1 -1
  64. package/dist/commands/auth.command.d.ts +2 -12
  65. package/dist/commands/auth.command.d.ts.map +1 -1
  66. package/dist/commands/auth.command.js +147 -20
  67. package/dist/commands/auth.command.js.map +1 -1
  68. package/dist/commands/billing.command.d.ts +4 -0
  69. package/dist/commands/billing.command.d.ts.map +1 -0
  70. package/dist/commands/billing.command.js +185 -0
  71. package/dist/commands/billing.command.js.map +1 -0
  72. package/dist/commands/check.command.d.ts +2 -1
  73. package/dist/commands/check.command.d.ts.map +1 -1
  74. package/dist/commands/check.command.js +11 -14
  75. package/dist/commands/check.command.js.map +1 -1
  76. package/dist/commands/context.d.ts +58 -0
  77. package/dist/commands/context.d.ts.map +1 -0
  78. package/dist/commands/context.js +78 -0
  79. package/dist/commands/context.js.map +1 -0
  80. package/dist/commands/flag.command.d.ts +3 -62
  81. package/dist/commands/flag.command.d.ts.map +1 -1
  82. package/dist/commands/flag.command.js +181 -864
  83. package/dist/commands/flag.command.js.map +1 -1
  84. package/dist/commands/key.command.d.ts +4 -0
  85. package/dist/commands/key.command.d.ts.map +1 -0
  86. package/dist/commands/key.command.js +44 -0
  87. package/dist/commands/key.command.js.map +1 -0
  88. package/dist/commands/plan.command.d.ts +3 -203
  89. package/dist/commands/plan.command.d.ts.map +1 -1
  90. package/dist/commands/plan.command.js +200 -759
  91. package/dist/commands/plan.command.js.map +1 -1
  92. package/dist/config.d.ts +19 -101
  93. package/dist/config.d.ts.map +1 -1
  94. package/dist/config.js +51 -364
  95. package/dist/config.js.map +1 -1
  96. package/dist/core/discovery.d.ts +27 -0
  97. package/dist/core/discovery.d.ts.map +1 -0
  98. package/dist/core/discovery.js +97 -0
  99. package/dist/core/discovery.js.map +1 -0
  100. package/dist/core/errors.d.ts +26 -0
  101. package/dist/core/errors.d.ts.map +1 -0
  102. package/dist/core/errors.js +33 -0
  103. package/dist/core/errors.js.map +1 -0
  104. package/dist/core/http.d.ts +23 -0
  105. package/dist/core/http.d.ts.map +1 -0
  106. package/dist/core/http.js +153 -0
  107. package/dist/core/http.js.map +1 -0
  108. package/dist/core/private-files.d.ts +6 -0
  109. package/dist/core/private-files.d.ts.map +1 -0
  110. package/dist/core/private-files.js +96 -0
  111. package/dist/core/private-files.js.map +1 -0
  112. package/dist/core/routes.d.ts +94 -0
  113. package/dist/core/routes.d.ts.map +1 -0
  114. package/dist/core/routes.js +91 -0
  115. package/dist/core/routes.js.map +1 -0
  116. package/dist/core/urls.d.ts +15 -0
  117. package/dist/core/urls.d.ts.map +1 -0
  118. package/dist/core/urls.js +55 -0
  119. package/dist/core/urls.js.map +1 -0
  120. package/dist/gate-rules.d.ts +1 -2
  121. package/dist/gate-rules.d.ts.map +1 -1
  122. package/dist/gate-rules.js +4 -5
  123. package/dist/gate-rules.js.map +1 -1
  124. package/dist/index.d.ts +23 -3
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +18 -3
  127. package/dist/index.js.map +1 -1
  128. package/dist/io.d.ts +21 -0
  129. package/dist/io.d.ts.map +1 -0
  130. package/dist/io.js +59 -0
  131. package/dist/io.js.map +1 -0
  132. package/dist/money.d.ts +42 -0
  133. package/dist/money.d.ts.map +1 -0
  134. package/dist/money.js +112 -0
  135. package/dist/money.js.map +1 -0
  136. package/dist/program.d.ts +5 -24
  137. package/dist/program.d.ts.map +1 -1
  138. package/dist/program.js +25 -113
  139. package/dist/program.js.map +1 -1
  140. package/package.json +7 -8
  141. package/dist/auth/api-client.d.ts +0 -50
  142. package/dist/auth/api-client.d.ts.map +0 -1
  143. package/dist/auth/api-client.js +0 -109
  144. package/dist/auth/api-client.js.map +0 -1
  145. package/dist/auth/relative-time.d.ts +0 -2
  146. package/dist/auth/relative-time.d.ts.map +0 -1
  147. package/dist/auth/relative-time.js +0 -27
  148. package/dist/auth/relative-time.js.map +0 -1
  149. package/dist/auth/scopes.d.ts +0 -30
  150. package/dist/auth/scopes.d.ts.map +0 -1
  151. package/dist/auth/scopes.js +0 -39
  152. package/dist/auth/scopes.js.map +0 -1
  153. package/dist/auth/workspace-client.d.ts +0 -70
  154. package/dist/auth/workspace-client.d.ts.map +0 -1
  155. package/dist/auth/workspace-client.js +0 -105
  156. package/dist/auth/workspace-client.js.map +0 -1
  157. package/dist/commands/auth/config.command.d.ts +0 -8
  158. package/dist/commands/auth/config.command.d.ts.map +0 -1
  159. package/dist/commands/auth/config.command.js +0 -60
  160. package/dist/commands/auth/config.command.js.map +0 -1
  161. package/dist/commands/auth/login.command.d.ts +0 -46
  162. package/dist/commands/auth/login.command.d.ts.map +0 -1
  163. package/dist/commands/auth/login.command.js +0 -166
  164. package/dist/commands/auth/login.command.js.map +0 -1
  165. package/dist/commands/auth/logout.command.d.ts +0 -21
  166. package/dist/commands/auth/logout.command.d.ts.map +0 -1
  167. package/dist/commands/auth/logout.command.js +0 -97
  168. package/dist/commands/auth/logout.command.js.map +0 -1
  169. package/dist/commands/auth/methods.command.d.ts +0 -68
  170. package/dist/commands/auth/methods.command.d.ts.map +0 -1
  171. package/dist/commands/auth/methods.command.js +0 -91
  172. package/dist/commands/auth/methods.command.js.map +0 -1
  173. package/dist/commands/auth/status.command.d.ts +0 -18
  174. package/dist/commands/auth/status.command.d.ts.map +0 -1
  175. package/dist/commands/auth/status.command.js +0 -104
  176. package/dist/commands/auth/status.command.js.map +0 -1
  177. package/dist/commands/auth/use.command.d.ts +0 -17
  178. package/dist/commands/auth/use.command.d.ts.map +0 -1
  179. package/dist/commands/auth/use.command.js +0 -47
  180. package/dist/commands/auth/use.command.js.map +0 -1
  181. package/dist/commands/branding.command.d.ts +0 -3
  182. package/dist/commands/branding.command.d.ts.map +0 -1
  183. package/dist/commands/branding.command.js +0 -42
  184. package/dist/commands/branding.command.js.map +0 -1
  185. package/dist/commands/event.command.d.ts +0 -3
  186. package/dist/commands/event.command.d.ts.map +0 -1
  187. package/dist/commands/event.command.js +0 -27
  188. package/dist/commands/event.command.js.map +0 -1
  189. package/dist/commands/flag-init.command.d.ts +0 -13
  190. package/dist/commands/flag-init.command.d.ts.map +0 -1
  191. package/dist/commands/flag-init.command.js +0 -463
  192. package/dist/commands/flag-init.command.js.map +0 -1
  193. package/dist/commands/guide.command.d.ts +0 -61
  194. package/dist/commands/guide.command.d.ts.map +0 -1
  195. package/dist/commands/guide.command.js +0 -655
  196. package/dist/commands/guide.command.js.map +0 -1
  197. package/dist/commands/info.command.d.ts +0 -3
  198. package/dist/commands/info.command.d.ts.map +0 -1
  199. package/dist/commands/info.command.js +0 -70
  200. package/dist/commands/info.command.js.map +0 -1
  201. package/dist/commands/integration.command.d.ts +0 -35
  202. package/dist/commands/integration.command.d.ts.map +0 -1
  203. package/dist/commands/integration.command.js +0 -290
  204. package/dist/commands/integration.command.js.map +0 -1
  205. package/dist/commands/journeys.d.ts +0 -43
  206. package/dist/commands/journeys.d.ts.map +0 -1
  207. package/dist/commands/journeys.js +0 -221
  208. package/dist/commands/journeys.js.map +0 -1
  209. package/dist/commands/ops.command.d.ts +0 -17
  210. package/dist/commands/ops.command.d.ts.map +0 -1
  211. package/dist/commands/ops.command.js +0 -129
  212. package/dist/commands/ops.command.js.map +0 -1
  213. package/dist/commands/privilege.command.d.ts +0 -16
  214. package/dist/commands/privilege.command.d.ts.map +0 -1
  215. package/dist/commands/privilege.command.js +0 -86
  216. package/dist/commands/privilege.command.js.map +0 -1
  217. package/dist/commands/role.command.d.ts +0 -3
  218. package/dist/commands/role.command.d.ts.map +0 -1
  219. package/dist/commands/role.command.js +0 -101
  220. package/dist/commands/role.command.js.map +0 -1
  221. package/dist/commands/runtime-dir.d.ts +0 -16
  222. package/dist/commands/runtime-dir.d.ts.map +0 -1
  223. package/dist/commands/runtime-dir.js +0 -18
  224. package/dist/commands/runtime-dir.js.map +0 -1
  225. package/dist/commands/setup.command.d.ts +0 -63
  226. package/dist/commands/setup.command.d.ts.map +0 -1
  227. package/dist/commands/setup.command.js +0 -148
  228. package/dist/commands/setup.command.js.map +0 -1
  229. package/dist/commands/stripe.command.d.ts +0 -29
  230. package/dist/commands/stripe.command.d.ts.map +0 -1
  231. package/dist/commands/stripe.command.js +0 -99
  232. package/dist/commands/stripe.command.js.map +0 -1
  233. package/dist/commands/tenant.command.d.ts +0 -3
  234. package/dist/commands/tenant.command.d.ts.map +0 -1
  235. package/dist/commands/tenant.command.js +0 -135
  236. package/dist/commands/tenant.command.js.map +0 -1
  237. package/dist/commands/token.command.d.ts +0 -3
  238. package/dist/commands/token.command.d.ts.map +0 -1
  239. package/dist/commands/token.command.js +0 -54
  240. package/dist/commands/token.command.js.map +0 -1
  241. package/dist/commands/user.command.d.ts +0 -3
  242. package/dist/commands/user.command.d.ts.map +0 -1
  243. package/dist/commands/user.command.js +0 -117
  244. package/dist/commands/user.command.js.map +0 -1
  245. package/dist/credentials.d.ts +0 -141
  246. package/dist/credentials.d.ts.map +0 -1
  247. package/dist/credentials.js +0 -348
  248. package/dist/credentials.js.map +0 -1
  249. package/dist/flag-coherence.d.ts +0 -42
  250. package/dist/flag-coherence.d.ts.map +0 -1
  251. package/dist/flag-coherence.js +0 -103
  252. package/dist/flag-coherence.js.map +0 -1
  253. package/dist/output.d.ts +0 -17
  254. package/dist/output.d.ts.map +0 -1
  255. package/dist/output.js +0 -107
  256. package/dist/output.js.map +0 -1
  257. package/dist/preview.d.ts +0 -9
  258. package/dist/preview.d.ts.map +0 -1
  259. package/dist/preview.js +0 -63
  260. package/dist/preview.js.map +0 -1
  261. package/dist/product-decisions.d.ts +0 -40
  262. package/dist/product-decisions.d.ts.map +0 -1
  263. package/dist/product-decisions.js +0 -52
  264. package/dist/product-decisions.js.map +0 -1
  265. package/dist/prompt-urls.d.ts +0 -31
  266. package/dist/prompt-urls.d.ts.map +0 -1
  267. package/dist/prompt-urls.js +0 -35
  268. package/dist/prompt-urls.js.map +0 -1
  269. package/dist/prompts/auth-master-integration-prompt.md +0 -255
  270. package/dist/prompts/billing/master.md +0 -332
  271. package/dist/prompts/decisions/feature-control.md +0 -131
  272. package/dist/prompts/decisions/going-live.md +0 -60
  273. package/dist/prompts/decisions/login.md +0 -71
  274. package/dist/prompts/decisions/look-and-feel.md +0 -68
  275. package/dist/prompts/decisions/payments.md +0 -97
  276. package/dist/prompts/decisions/roles.md +0 -78
  277. package/dist/prompts/decisions/teams.md +0 -61
  278. package/dist/prompts/fit-together.md +0 -97
  279. package/dist/prompts/flags/master.md +0 -220
  280. package/dist/prompts/guide-coverage.json +0 -17
  281. package/dist/prompts/integration-success.md +0 -106
  282. package/dist/prompts/mcp-tools.json +0 -90
  283. package/dist/prompts/mechanisms.md +0 -298
  284. package/dist/prompts/orientation.md +0 -42
  285. package/dist/prompts/product-decisions.json +0 -338
  286. package/dist/resolve.d.ts +0 -110
  287. package/dist/resolve.d.ts.map +0 -1
  288. package/dist/resolve.js +0 -260
  289. package/dist/resolve.js.map +0 -1
  290. package/dist/shape.d.ts +0 -25
  291. package/dist/shape.d.ts.map +0 -1
  292. package/dist/shape.js +0 -74
  293. package/dist/shape.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAID,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAEvC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAqB5D;AAED,iBAAe,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHzD;AAED,iBAAS,iBAAiB,CACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE;IACN,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,WAAW,CAAC;CACjC,GACA,MAAM,CAeR"}
@@ -1,166 +0,0 @@
1
- import { writeCredentials } from '../../credentials.js';
2
- import { resetManagementClient } from '../../config.js';
3
- import { generateCodeVerifier, codeChallengeFor, generateState } from '../../auth/pkce.js';
4
- import { startLoopback, LoopbackError } from '../../auth/loopback.js';
5
- import { openBrowser } from '../../auth/browser-open.js';
6
- import { createCliApiClient, CliAuthApiError } from '../../auth/api-client.js';
7
- import { SCOPE_MANAGEMENT, SCOPE_MANAGEMENT_ADMIN } from '../../auth/scopes.js';
8
- const DEFAULT_API_BASE_URL = 'https://api.thebridge.dev';
9
- const DEFAULT_AUTH_BASE_URL = 'https://auth.thebridge.dev';
10
- export { runLogin, buildAuthorizeUrl };
11
- export function registerAuthLoginCommand(auth) {
12
- auth
13
- .command('login')
14
- .description('Authenticate via browser (loopback PKCE) and save credentials')
15
- .option('--app <id|name>', 'Pin the home app: an app id skips the picker entirely; an app name is resolved on the consent screen (falls back to the picker if not found)')
16
- .option('--single-app', 'Ask for a login that covers only the home app. By default the consent screen preselects "Every app in <workspace>", so `bridge app use` / `--app` can switch apps without logging in again')
17
- .option('--label <text>', 'Friendly label stored on the token (default: "bridge-cli")')
18
- .option('--no-browser', 'Print the authorization URL instead of opening a browser')
19
- .option('--reauth', 'Force the consent screen to sign you out and prompt for credentials again')
20
- .option('--admin', 'Also request delete authority and the ability to create API tokens. Needed for `bridge token create`, `bridge role delete` and `bridge tenant delete`. Without this the token can read, create and update but cannot delete anything.')
21
- .action(async (opts) => {
22
- try {
23
- await runLogin(opts);
24
- process.exitCode = 0;
25
- }
26
- catch (err) {
27
- // Friendly, single-line stderr — never log JWTs / verifiers.
28
- const msg = err instanceof Error ? err.message : String(err);
29
- process.stderr.write(`bridge auth login: ${msg}\n`);
30
- process.exitCode = 1;
31
- }
32
- });
33
- }
34
- async function runLogin(opts) {
35
- const apiBaseUrl = (process.env.BRIDGE_BASE_URL?.trim() || DEFAULT_API_BASE_URL).replace(/\/$/, '');
36
- const authBaseUrl = (process.env.BRIDGE_AUTH_BASE_URL?.trim() || DEFAULT_AUTH_BASE_URL).replace(/\/$/, '');
37
- // 1. PKCE + state.
38
- const codeVerifier = generateCodeVerifier();
39
- const codeChallenge = codeChallengeFor(codeVerifier);
40
- const state = generateState();
41
- // 2. Boot the single-shot loopback listener.
42
- let loopback;
43
- try {
44
- loopback = await startLoopback({
45
- expectedState: state,
46
- // Bounce the browser to a branded success page on cloud-views instead
47
- // of leaving the user staring at 127.0.0.1.
48
- successRedirectUrl: `${authBaseUrl}/cli/login-complete`,
49
- });
50
- }
51
- catch (err) {
52
- throw new Error(`Could not bind a loopback port: ${err instanceof Error ? err.message : String(err)}. ` +
53
- 'Try `bridge auth login --device` once TBP-108 lands, or check whether your firewall blocks 127.0.0.1.');
54
- }
55
- const authorizeUrl = buildAuthorizeUrl(authBaseUrl, {
56
- challenge: codeChallenge,
57
- redirect: loopback.redirectUri,
58
- state,
59
- appId: opts.app,
60
- label: opts.label,
61
- reauth: opts.reauth === true,
62
- admin: opts.admin === true,
63
- appAccess: opts.singleApp === true ? 'app' : 'workspace',
64
- });
65
- // 3. Open browser (or print URL if --no-browser or open fails).
66
- const stdout = process.stdout;
67
- // commander's `--no-browser` sets opts.browser === false. Treat unset as the
68
- // default (open browser); only skip when explicitly false.
69
- const useBrowser = opts.browser !== false;
70
- if (!useBrowser) {
71
- stdout.write(`Open this URL in your browser to continue:\n ${authorizeUrl}\n`);
72
- }
73
- else {
74
- const open = await openBrowser(authorizeUrl);
75
- if (!open.ok) {
76
- stdout.write(`Could not open a browser automatically (${open.reason ?? 'unknown'}). ` +
77
- `Open this URL manually:\n ${authorizeUrl}\n`);
78
- }
79
- else {
80
- stdout.write('Your browser just opened — complete the login there. Waiting...\n');
81
- }
82
- }
83
- // 4. Await the callback. Translate cancel/CSRF/timeout into friendly errors.
84
- let result;
85
- try {
86
- result = await loopback.result;
87
- }
88
- catch (err) {
89
- if (err instanceof LoopbackError) {
90
- throw new Error(err.message);
91
- }
92
- throw err;
93
- }
94
- // 5. Exchange the code for a JWT.
95
- const api = createCliApiClient({ baseUrl: apiBaseUrl });
96
- let exchanged;
97
- try {
98
- exchanged = await api.exchangeCode({
99
- code: result.code,
100
- codeVerifier,
101
- });
102
- }
103
- catch (err) {
104
- if (err instanceof CliAuthApiError) {
105
- throw new Error(err.message);
106
- }
107
- throw err;
108
- }
109
- // 6. Persist credentials with mode 0600.
110
- const issuedAt = new Date().toISOString();
111
- const stored = {
112
- apiKey: exchanged.api_token,
113
- expiresAt: exchanged.expires_at,
114
- issuedAt,
115
- app: { id: exchanged.app.id, name: exchanged.app.name },
116
- user: { id: exchanged.user.id, email: exchanged.user.email },
117
- baseUrl: apiBaseUrl,
118
- ...(opts.label ? { label: opts.label } : {}),
119
- // TBP-769 — what the user actually chose on the consent screen (the URL
120
- // only preselected it). An older server omits it: that login is one app.
121
- appAccess: exchanged.app_access === 'workspace' ? 'workspace' : 'app',
122
- };
123
- writeCredentials(stored);
124
- // Reset the cached BridgeManagement client so the next command picks up the
125
- // new token (relevant when `auth login` is called within the same process).
126
- resetManagementClient();
127
- // 7. Friendly confirmation.
128
- const expiryHuman = formatExpiryDate(exchanged.expires_at);
129
- const scope = stored.appAccess === 'workspace'
130
- ? `Workspace: every app (home app: ${exchanged.app.name})`
131
- : `App: ${exchanged.app.name}`;
132
- stdout.write(`Logged in as ${exchanged.user.email}. ${scope}. Token valid until ${expiryHuman}.\n`);
133
- if (stored.appAccess === 'workspace') {
134
- stdout.write('Run `bridge app list` to see the apps, `bridge app use <id|name>` to switch.\n');
135
- }
136
- }
137
- function buildAuthorizeUrl(authBaseUrl, params) {
138
- const url = new URL(`${authBaseUrl}/cli/authorize`);
139
- url.searchParams.set('challenge', params.challenge);
140
- url.searchParams.set('redirect', params.redirect);
141
- url.searchParams.set('state', params.state);
142
- url.searchParams.set('scope', params.admin ? SCOPE_MANAGEMENT_ADMIN : SCOPE_MANAGEMENT);
143
- if (params.appId)
144
- url.searchParams.set('app_id', params.appId);
145
- if (params.label)
146
- url.searchParams.set('label', params.label);
147
- // TBP-769 — only PRESELECTS the choice on the consent screen; the user decides.
148
- if (params.appAccess)
149
- url.searchParams.set('app_access', params.appAccess);
150
- // OAuth-style `prompt=login` — the consent screen reads this as "clear any
151
- // existing browser session and re-prompt for credentials" so users who just
152
- // ran `bridge auth logout` aren't dropped straight into the workspace picker.
153
- if (params.reauth)
154
- url.searchParams.set('prompt', 'login');
155
- return url.toString();
156
- }
157
- function formatExpiryDate(iso) {
158
- const d = new Date(iso);
159
- if (Number.isNaN(d.getTime()))
160
- return iso;
161
- // YYYY-MM-DD HH:MM (local) — easier to glance at than a full ISO.
162
- const pad = (n) => String(n).padStart(2, '0');
163
- return (`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +
164
- `${pad(d.getHours())}:${pad(d.getMinutes())}`);
165
- }
166
- //# sourceMappingURL=login.command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.command.js","sourceRoot":"","sources":["../../../src/commands/auth/login.command.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- /**
2
- * `bridge auth logout` — best-effort revoke + delete credentials file.
3
- *
4
- * Behavior:
5
- * - No credentials file → "Not logged in." (exit 0).
6
- * - Otherwise → call `POST /v1/auth/cli/revoke` with `x-api-key`,
7
- * treat 401 as success (token already gone), then
8
- * remove it locally. Network errors → warn but still
9
- * remove (the local file is the source of truth for
10
- * "logged in" on this machine).
11
- *
12
- * TBP-628 — the file can hold several apps, so logout now has a scope.
13
- * Bare `logout` removes the ACTIVE credential and leaves the others; the
14
- * alternative, wiping every app because you finished with one of them, throws
15
- * away valid tokens and forces browser round-trips to get them back, which is
16
- * the friction this ticket exists to remove. `--profile` names one, `--all`
17
- * asks for the old whole-file behaviour explicitly.
18
- */
19
- import type { Command } from 'commander';
20
- export declare function registerAuthLogoutCommand(auth: Command): void;
21
- //# sourceMappingURL=logout.command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logout.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAgB7D"}
@@ -1,97 +0,0 @@
1
- import { credentialsPath, CredentialSelectorError, deleteAllCredentials, findCredential, listCredentials, readCredentials, removeCredential, } from '../../credentials.js';
2
- import { resetManagementClient } from '../../config.js';
3
- import { createCliApiClient, CliAuthApiError } from '../../auth/api-client.js';
4
- export function registerAuthLogoutCommand(auth) {
5
- auth
6
- .command('logout')
7
- .description('Revoke the active CLI token and remove it locally')
8
- .option('--profile <label|app-id|app-name>', 'Log out of one specific stored app')
9
- .option('--all', 'Log out of every stored app and delete the credentials file')
10
- .action(async (opts) => {
11
- try {
12
- await runLogout(opts);
13
- process.exitCode = 0;
14
- }
15
- catch (err) {
16
- const msg = err instanceof Error ? err.message : String(err);
17
- process.stderr.write(`bridge auth logout: ${msg}\n`);
18
- process.exitCode = 1;
19
- }
20
- });
21
- }
22
- async function runLogout(opts = {}) {
23
- const stdout = process.stdout;
24
- const stderr = process.stderr;
25
- let entries;
26
- try {
27
- entries = listCredentials();
28
- }
29
- catch (err) {
30
- // Malformed credentials file — still delete it so the user gets unstuck.
31
- stderr.write(`Warning: existing credentials file at ${credentialsPath()} could not be parsed (${err instanceof Error ? err.message : String(err)}). Removing it.\n`);
32
- deleteAllCredentials();
33
- stdout.write('Logged out (credentials file removed).\n');
34
- return;
35
- }
36
- if (entries.length === 0) {
37
- stdout.write('Not logged in.\n');
38
- return;
39
- }
40
- if (opts.all) {
41
- for (const entry of entries)
42
- await revoke(entry.creds, stderr);
43
- deleteAllCredentials();
44
- resetManagementClient();
45
- stdout.write(`Logged out of ${entries.length} app(s).\n`);
46
- return;
47
- }
48
- let target;
49
- if (opts.profile) {
50
- try {
51
- target = findCredential(opts.profile);
52
- }
53
- catch (err) {
54
- if (err instanceof CredentialSelectorError)
55
- throw new Error(err.message);
56
- throw err;
57
- }
58
- }
59
- else {
60
- const active = readCredentials();
61
- if (!active) {
62
- // Several stored, none active. Removing one by guess is exactly the
63
- // silent choice this ticket forbids.
64
- throw new Error('No active credential. Name one with `--profile <label|app id>`, or use `--all`. ' +
65
- `Stored: ${entries.map((e) => e.creds.label ?? e.creds.app.name).join(', ')}.`);
66
- }
67
- target = entries.find((e) => e.key === active.app.id);
68
- }
69
- await revoke(target.creds, stderr);
70
- const remaining = removeCredential(target.key);
71
- resetManagementClient();
72
- const name = target.creds.label ?? target.creds.app.name;
73
- stdout.write(`Logged out ${target.creds.user.email} from ${name}.\n`);
74
- if (remaining > 0) {
75
- const rest = listCredentials();
76
- const nowActive = rest.find((e) => e.isActive);
77
- stdout.write(` ${remaining} credential(s) still stored` +
78
- (nowActive ? `; now using ${nowActive.creds.label ?? nowActive.creds.app.name}` : '') +
79
- '.\n');
80
- }
81
- }
82
- /** Best-effort server-side revoke. Never fatal — local removal is the point. */
83
- async function revoke(creds, stderr) {
84
- const api = createCliApiClient({ baseUrl: creds.baseUrl });
85
- try {
86
- await api.revokeToken(creds.apiKey);
87
- }
88
- catch (err) {
89
- if (err instanceof CliAuthApiError && err.code === 'network_error') {
90
- stderr.write(`Warning: could not reach bridge-api to revoke ${creds.app.name} server-side (${err.message}). Removing local credentials anyway.\n`);
91
- }
92
- else {
93
- stderr.write(`Warning: server-side revoke for ${creds.app.name} returned an error (${err instanceof Error ? err.message : String(err)}). Removing local credentials anyway.\n`);
94
- }
95
- }
96
- }
97
- //# sourceMappingURL=logout.command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logout.command.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.command.ts"],"names":[],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- /**
2
- * `bridge auth methods list|enable|disable <method>` — TBP-547.
3
- *
4
- * One view of every login method and one verb to switch any of them.
5
- *
6
- * - `list` prints the same `loginMethods` object as the MCP tool
7
- * get_auth_config, from the same `app.get()` that `bridge auth config` and
8
- * `bridge info auth-config` read, so the three never disagree.
9
- * - `enable` / `disable` flip the one app switch behind the method. Social
10
- * providers keep their saved credentials when switched off, so switching
11
- * them back on needs no new setup.
12
- * - Bridge itself refuses a social provider with no credentials yet
13
- * (SIGN_IN_CREDENTIALS_MISSING) and the last remaining sign-in method
14
- * (LAST_SIGN_IN_METHOD); its code and fix come through as the error.
15
- * - Password has no switch on Bridge: it is listed as always available, and
16
- * enabling or disabling it is refused here with that reason.
17
- */
18
- import type { Command } from 'commander';
19
- type AppSwitch = 'magicLinkEnabled' | 'passkeysEnabled' | 'mfaEnabled' | 'googleSsoEnabled' | 'linkedinSsoEnabled' | 'azureAdSsoEnabled' | 'appleSsoEnabled' | 'githubSsoEnabled' | 'facebookSsoEnabled';
20
- /** Method name → the app switch behind it. Names match get_auth_config. */
21
- export declare const METHOD_SWITCHES: Readonly<Record<string, AppSwitch>>;
22
- export declare const METHOD_NAMES: string[];
23
- type AppLike = Partial<Record<AppSwitch, boolean>>;
24
- /** The `loginMethods` object get_auth_config returns — kept identical on purpose. */
25
- export declare function loginMethods(app: AppLike): {
26
- password: {
27
- enabled: boolean;
28
- note: string;
29
- };
30
- magicLink: {
31
- enabled: boolean | undefined;
32
- };
33
- passkeys: {
34
- enabled: boolean | undefined;
35
- };
36
- mfa: {
37
- enabled: boolean | undefined;
38
- note: string;
39
- };
40
- socialProviders: {
41
- google: {
42
- enabled: boolean | undefined;
43
- };
44
- linkedin: {
45
- enabled: boolean | undefined;
46
- };
47
- azureAd: {
48
- enabled: boolean | undefined;
49
- };
50
- apple: {
51
- enabled: boolean | undefined;
52
- };
53
- github: {
54
- enabled: boolean | undefined;
55
- };
56
- facebook: {
57
- enabled: boolean | undefined;
58
- };
59
- };
60
- };
61
- /** Accepts the canonical name in any case, and kebab/snake forms (magic-link). */
62
- export declare function resolveMethod(input: string): {
63
- method: string;
64
- field: AppSwitch;
65
- };
66
- export declare function registerAuthMethodsCommands(auth: Command): void;
67
- export {};
68
- //# sourceMappingURL=methods.command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"methods.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/methods.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,KAAK,SAAS,GACV,kBAAkB,GAClB,iBAAiB,GACjB,YAAY,GACZ,kBAAkB,GAClB,oBAAoB,GACpB,mBAAmB,GACnB,iBAAiB,GACjB,kBAAkB,GAClB,oBAAoB,CAAC;AAEzB,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAU/D,CAAC;AAEF,eAAO,MAAM,YAAY,UAAgD,CAAC;AAE1E,KAAK,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnD,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAexC;AAQD,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAkBjF;AAYD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAgC/D"}
@@ -1,91 +0,0 @@
1
- import { getManagementClient } from '../../config.js';
2
- import { outputSuccess, outputError } from '../../output.js';
3
- /** Method name → the app switch behind it. Names match get_auth_config. */
4
- export const METHOD_SWITCHES = {
5
- magicLink: 'magicLinkEnabled',
6
- passkeys: 'passkeysEnabled',
7
- mfa: 'mfaEnabled',
8
- google: 'googleSsoEnabled',
9
- linkedin: 'linkedinSsoEnabled',
10
- azureAd: 'azureAdSsoEnabled',
11
- apple: 'appleSsoEnabled',
12
- github: 'githubSsoEnabled',
13
- facebook: 'facebookSsoEnabled',
14
- };
15
- export const METHOD_NAMES = ['password', ...Object.keys(METHOD_SWITCHES)];
16
- /** The `loginMethods` object get_auth_config returns — kept identical on purpose. */
17
- export function loginMethods(app) {
18
- return {
19
- password: { enabled: true, note: 'Always available on Bridge' },
20
- magicLink: { enabled: app.magicLinkEnabled },
21
- passkeys: { enabled: app.passkeysEnabled },
22
- mfa: { enabled: app.mfaEnabled, note: 'Second factor, not a standalone login method' },
23
- socialProviders: {
24
- google: { enabled: app.googleSsoEnabled },
25
- linkedin: { enabled: app.linkedinSsoEnabled },
26
- azureAd: { enabled: app.azureAdSsoEnabled },
27
- apple: { enabled: app.appleSsoEnabled },
28
- github: { enabled: app.githubSsoEnabled },
29
- facebook: { enabled: app.facebookSsoEnabled },
30
- },
31
- };
32
- }
33
- class AuthMethodError extends Error {
34
- code;
35
- hint;
36
- constructor(message, code, hint) {
37
- super(message);
38
- this.code = code;
39
- this.hint = hint;
40
- }
41
- }
42
- /** Accepts the canonical name in any case, and kebab/snake forms (magic-link). */
43
- export function resolveMethod(input) {
44
- const wanted = input.replace(/[-_\s]/g, '').toLowerCase();
45
- const method = METHOD_NAMES.find((m) => m.toLowerCase() === wanted);
46
- if (method === 'password') {
47
- throw new AuthMethodError('Password sign-in has no switch on Bridge: it is always available, so it cannot be enabled or disabled.', 'PASSWORD_ALWAYS_ON', `To change how people sign in, switch one of these instead: ${Object.keys(METHOD_SWITCHES).join(', ')}.`);
48
- }
49
- if (!method) {
50
- throw new AuthMethodError(`Unknown login method "${input}".`, 'UNKNOWN_AUTH_METHOD', `Use one of: ${Object.keys(METHOD_SWITCHES).join(', ')}. \`bridge auth methods list\` shows them all.`);
51
- }
52
- return { method, field: METHOD_SWITCHES[method] };
53
- }
54
- async function setMethod(input, enabled) {
55
- try {
56
- const { method, field } = resolveMethod(input);
57
- const app = (await getManagementClient().app.update({ [field]: enabled }));
58
- outputSuccess({ method, enabled: app[field] === true, loginMethods: loginMethods(app) });
59
- }
60
- catch (err) {
61
- outputError(err);
62
- }
63
- }
64
- export function registerAuthMethodsCommands(auth) {
65
- const methods = auth
66
- .command('methods')
67
- .description('Every login method in one place: list them, switch one on or off');
68
- methods
69
- .command('list')
70
- .description('List every login method and whether it is on (same as the MCP tool get_auth_config)')
71
- .action(async () => {
72
- try {
73
- const app = (await getManagementClient().app.get());
74
- outputSuccess({ loginMethods: loginMethods(app) });
75
- }
76
- catch (err) {
77
- outputError(err);
78
- }
79
- });
80
- methods
81
- .command('enable <method>')
82
- .description(`Switch a login method on (${Object.keys(METHOD_SWITCHES).join(', ')}). ` +
83
- 'A social provider needs its credentials first: bridge setup sso --provider <p>')
84
- .action((method) => setMethod(method, true));
85
- methods
86
- .command('disable <method>')
87
- .description('Switch a login method off. A social provider keeps its credentials, so enable switches it back on. ' +
88
- 'Bridge refuses to switch off the last remaining sign-in method.')
89
- .action((method) => setMethod(method, false));
90
- }
91
- //# sourceMappingURL=methods.command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"methods.command.js","sourceRoot":"","sources":["../../../src/commands/auth/methods.command.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * `bridge auth status` — prints whether a credentials file exists, who it's
3
- * for, and how long until it expires.
4
- *
5
- * Output is plain text (one key=value per line after the first), tuned for
6
- * humans. Other CLI commands emit structured JSON — auth status is the one
7
- * place where a developer is most likely to be eyeballing the result, so we
8
- * optimize for readability over machine-parseability.
9
- *
10
- * If the user wants JSON, they can run `cat ~/.config/bridge/credentials.json`.
11
- *
12
- * TBP-628 — the file can hold several apps, so this lists ALL of them and marks
13
- * the active one. Knowing which app is in force is the whole reason somebody
14
- * runs this command, and it was already the only place that told them.
15
- */
16
- import type { Command } from 'commander';
17
- export declare function registerAuthStatusCommand(auth: Command): void;
18
- //# sourceMappingURL=status.command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.command.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAc7D"}
@@ -1,104 +0,0 @@
1
- import { credentialsPath, isExpired, listCredentials, readCredentialsFile, } from '../../credentials.js';
2
- import { formatRelativeTime } from '../../auth/relative-time.js';
3
- export function registerAuthStatusCommand(auth) {
4
- auth
5
- .command('status')
6
- .description('Show current authentication state (who, which app, expiry)')
7
- .action(() => {
8
- try {
9
- runStatus();
10
- process.exitCode = 0;
11
- }
12
- catch (err) {
13
- const msg = err instanceof Error ? err.message : String(err);
14
- process.stderr.write(`bridge auth status: ${msg}\n`);
15
- process.exitCode = 1;
16
- }
17
- });
18
- }
19
- function runStatus() {
20
- const stdout = process.stdout;
21
- // Report on `BRIDGE_API_KEY` separately if set, so a CI user setting the env
22
- // var sees something useful.
23
- const envApiKey = process.env.BRIDGE_API_KEY?.trim();
24
- const envProfile = process.env.BRIDGE_PROFILE?.trim();
25
- let entries;
26
- try {
27
- readCredentialsFile();
28
- entries = listCredentials();
29
- }
30
- catch (err) {
31
- stdout.write(`Credentials file at ${credentialsPath()} is unreadable: ${err instanceof Error ? err.message : String(err)}\n` + 'Run `bridge auth login` to refresh, or delete the file manually.\n');
32
- return;
33
- }
34
- if (entries.length === 0) {
35
- if (envApiKey && envApiKey.length > 0) {
36
- stdout.write('Using BRIDGE_API_KEY from environment (service-account / CI path).\n' +
37
- 'Run `bridge auth login` to switch to interactive credentials.\n');
38
- return;
39
- }
40
- stdout.write('Not logged in. Run `bridge auth login`.\n');
41
- return;
42
- }
43
- const active = entries.find((e) => e.isActive);
44
- if (active) {
45
- stdout.write(`Logged in as ${active.creds.user.email}\n`);
46
- }
47
- else {
48
- // A pointer at a credential that is gone. Say so rather than picking one:
49
- // an inferred default is exactly what this ticket is about.
50
- stdout.write('No active credential selected — run `bridge auth use <profile>` to pick one.\n');
51
- }
52
- for (const entry of entries) {
53
- writeEntry(entry, entries.length > 1);
54
- }
55
- stdout.write(` credentials=${credentialsPath()}\n`);
56
- if (entries.length > 1) {
57
- stdout.write('\nSwitch the default with `bridge auth use <label|app id>`, ' +
58
- 'or target one command with `--profile <label|app id>`.\n');
59
- }
60
- if (entries.some((e) => e.creds.appAccess === 'workspace')) {
61
- stdout.write('\nWithin a workspace login: `bridge app list`, `bridge app use <id|name>`, ' +
62
- 'or `--app <id|name>` for one command.\n');
63
- }
64
- if (envProfile) {
65
- stdout.write(`\nBRIDGE_PROFILE=${envProfile} is set — it overrides the active credential above.\n`);
66
- }
67
- if (envApiKey && envApiKey.length > 0) {
68
- // This used to claim the opposite. The credentials file has always won;
69
- // saying otherwise is how somebody comes to believe they retargeted the
70
- // CLI when they did not (TBP-628).
71
- stdout.write('\nNote: BRIDGE_API_KEY is set in your environment but is IGNORED while a ' +
72
- 'credentials file exists.\nTo use it, run `bridge auth logout --all`. ' +
73
- 'To target another stored app, use `--profile`.\n');
74
- }
75
- if (process.env.BRIDGE_APP_ID?.trim()) {
76
- stdout.write('\nNote: BRIDGE_APP_ID has no effect. The app is carried by the credential ' +
77
- 'itself; use `--profile <label|app id>` to target another one.\n');
78
- }
79
- }
80
- function writeEntry(entry, showMarker) {
81
- const stdout = process.stdout;
82
- const { creds } = entry;
83
- const expiryDelta = new Date(creds.expiresAt).getTime() - Date.now();
84
- const expiryRel = formatRelativeTime(expiryDelta);
85
- const expiredLabel = isExpired(creds) ? ' (EXPIRED)' : '';
86
- const marker = showMarker ? (entry.isActive ? '* ' : ' ') : '';
87
- stdout.write(` ${marker}app=${creds.app.name} (${creds.app.id})\n`);
88
- // TBP-769 — what the login covers, and which app commands act on.
89
- if (creds.appAccess === 'workspace') {
90
- const current = creds.currentApp ?? creds.app;
91
- stdout.write(` ${marker} scope=workspace (every app)\n`);
92
- stdout.write(` ${marker} homeApp=${creds.app.name} (${creds.app.id})\n`);
93
- stdout.write(` ${marker} currentApp=${current.name} (${current.id})${creds.currentApp ? '' : ' — the home app'}\n`);
94
- }
95
- else {
96
- stdout.write(` ${marker} scope=single app\n`);
97
- }
98
- if (creds.label)
99
- stdout.write(` ${marker} label=${creds.label}\n`);
100
- stdout.write(` ${marker} user=${creds.user.email}\n`);
101
- stdout.write(` ${marker} expires=${expiryRel} — ${creds.expiresAt}${expiredLabel}\n`);
102
- stdout.write(` ${marker} baseUrl=${creds.baseUrl}\n`);
103
- }
104
- //# sourceMappingURL=status.command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.command.js","sourceRoot":"","sources":["../../../src/commands/auth/status.command.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * `bridge auth use <profile>` — move the persisted default to another stored
3
- * credential, without a browser round-trip (TBP-628).
4
- *
5
- * The credential is already on disk with days left on it; switching is a
6
- * pointer move. Before this existed the only way to change apps was
7
- * `auth logout` + `auth login`, which discarded a perfectly valid token and
8
- * cost a browser trip, so people did not switch — they ran commands against
9
- * whichever app happened to be active and read the answers as if they came
10
- * from the one they meant.
11
- *
12
- * For a single command, prefer `--profile` / `BRIDGE_PROFILE`: this command
13
- * mutates state that other processes read.
14
- */
15
- import type { Command } from 'commander';
16
- export declare function registerAuthUseCommand(auth: Command): void;
17
- //# sourceMappingURL=use.command.d.ts.map