@nebulr-group/bridge-cli 0.6.6 → 1.0.0-alpha.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.
- package/README.md +98 -458
- package/dist/api/accounts.d.ts +105 -0
- package/dist/api/accounts.d.ts.map +1 -0
- package/dist/api/accounts.js +58 -0
- package/dist/api/accounts.js.map +1 -0
- package/dist/api/apps.d.ts +50 -0
- package/dist/api/apps.d.ts.map +1 -0
- package/dist/api/apps.js +62 -0
- package/dist/api/apps.js.map +1 -0
- package/dist/api/billing.d.ts +131 -0
- package/dist/api/billing.d.ts.map +1 -0
- package/dist/api/billing.js +42 -0
- package/dist/api/billing.js.map +1 -0
- package/dist/api/flags.d.ts +73 -0
- package/dist/api/flags.d.ts.map +1 -0
- package/dist/api/flags.js +108 -0
- package/dist/api/flags.js.map +1 -0
- package/dist/api/keys.d.ts +48 -0
- package/dist/api/keys.d.ts.map +1 -0
- package/dist/api/keys.js +87 -0
- package/dist/api/keys.js.map +1 -0
- package/dist/auth/browser-open.d.ts +21 -4
- package/dist/auth/browser-open.d.ts.map +1 -1
- package/dist/auth/browser-open.js +45 -65
- package/dist/auth/browser-open.js.map +1 -1
- package/dist/auth/lock.d.ts +8 -0
- package/dist/auth/lock.d.ts.map +1 -0
- package/dist/auth/lock.js +43 -0
- package/dist/auth/lock.js.map +1 -0
- package/dist/auth/loopback.d.ts +8 -12
- package/dist/auth/loopback.d.ts.map +1 -1
- package/dist/auth/loopback.js +40 -45
- package/dist/auth/loopback.js.map +1 -1
- package/dist/auth/session.d.ts +61 -0
- package/dist/auth/session.d.ts.map +1 -0
- package/dist/auth/session.js +142 -0
- package/dist/auth/session.js.map +1 -0
- package/dist/auth/sign-in.d.ts +67 -0
- package/dist/auth/sign-in.d.ts.map +1 -0
- package/dist/auth/sign-in.js +113 -0
- package/dist/auth/sign-in.js.map +1 -0
- package/dist/auth/store.d.ts +89 -0
- package/dist/auth/store.d.ts.map +1 -0
- package/dist/auth/store.js +214 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/bin.js +0 -2
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +13 -17
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +31 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +67 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/accounts.command.d.ts +4 -0
- package/dist/commands/accounts.command.d.ts.map +1 -0
- package/dist/commands/accounts.command.js +166 -0
- package/dist/commands/accounts.command.js.map +1 -0
- package/dist/commands/app.command.d.ts +3 -2
- package/dist/commands/app.command.d.ts.map +1 -1
- package/dist/commands/app.command.js +132 -233
- package/dist/commands/app.command.js.map +1 -1
- package/dist/commands/auth.command.d.ts +2 -12
- package/dist/commands/auth.command.d.ts.map +1 -1
- package/dist/commands/auth.command.js +147 -20
- package/dist/commands/auth.command.js.map +1 -1
- package/dist/commands/billing.command.d.ts +4 -0
- package/dist/commands/billing.command.d.ts.map +1 -0
- package/dist/commands/billing.command.js +185 -0
- package/dist/commands/billing.command.js.map +1 -0
- package/dist/commands/check.command.d.ts +2 -1
- package/dist/commands/check.command.d.ts.map +1 -1
- package/dist/commands/check.command.js +11 -14
- package/dist/commands/check.command.js.map +1 -1
- package/dist/commands/context.d.ts +58 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +78 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/flag.command.d.ts +3 -62
- package/dist/commands/flag.command.d.ts.map +1 -1
- package/dist/commands/flag.command.js +181 -864
- package/dist/commands/flag.command.js.map +1 -1
- package/dist/commands/key.command.d.ts +4 -0
- package/dist/commands/key.command.d.ts.map +1 -0
- package/dist/commands/key.command.js +44 -0
- package/dist/commands/key.command.js.map +1 -0
- package/dist/commands/plan.command.d.ts +3 -203
- package/dist/commands/plan.command.d.ts.map +1 -1
- package/dist/commands/plan.command.js +200 -759
- package/dist/commands/plan.command.js.map +1 -1
- package/dist/config.d.ts +19 -101
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +51 -364
- package/dist/config.js.map +1 -1
- package/dist/core/discovery.d.ts +27 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/core/discovery.js +97 -0
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +33 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/http.d.ts +23 -0
- package/dist/core/http.d.ts.map +1 -0
- package/dist/core/http.js +153 -0
- package/dist/core/http.js.map +1 -0
- package/dist/core/private-files.d.ts +6 -0
- package/dist/core/private-files.d.ts.map +1 -0
- package/dist/core/private-files.js +96 -0
- package/dist/core/private-files.js.map +1 -0
- package/dist/core/routes.d.ts +100 -0
- package/dist/core/routes.d.ts.map +1 -0
- package/dist/core/routes.js +99 -0
- package/dist/core/routes.js.map +1 -0
- package/dist/core/urls.d.ts +15 -0
- package/dist/core/urls.d.ts.map +1 -0
- package/dist/core/urls.js +55 -0
- package/dist/core/urls.js.map +1 -0
- package/dist/gate-rules.d.ts +1 -2
- package/dist/gate-rules.d.ts.map +1 -1
- package/dist/gate-rules.js +4 -5
- package/dist/gate-rules.js.map +1 -1
- package/dist/index.d.ts +24 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/dist/io.d.ts +21 -0
- package/dist/io.d.ts.map +1 -0
- package/dist/io.js +59 -0
- package/dist/io.js.map +1 -0
- package/dist/money.d.ts +42 -0
- package/dist/money.d.ts.map +1 -0
- package/dist/money.js +112 -0
- package/dist/money.js.map +1 -0
- package/dist/program.d.ts +5 -24
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +25 -113
- package/dist/program.js.map +1 -1
- package/package.json +7 -8
- package/dist/auth/api-client.d.ts +0 -50
- package/dist/auth/api-client.d.ts.map +0 -1
- package/dist/auth/api-client.js +0 -109
- package/dist/auth/api-client.js.map +0 -1
- package/dist/auth/relative-time.d.ts +0 -2
- package/dist/auth/relative-time.d.ts.map +0 -1
- package/dist/auth/relative-time.js +0 -27
- package/dist/auth/relative-time.js.map +0 -1
- package/dist/auth/scopes.d.ts +0 -30
- package/dist/auth/scopes.d.ts.map +0 -1
- package/dist/auth/scopes.js +0 -39
- package/dist/auth/scopes.js.map +0 -1
- package/dist/auth/workspace-client.d.ts +0 -70
- package/dist/auth/workspace-client.d.ts.map +0 -1
- package/dist/auth/workspace-client.js +0 -105
- package/dist/auth/workspace-client.js.map +0 -1
- package/dist/commands/auth/config.command.d.ts +0 -8
- package/dist/commands/auth/config.command.d.ts.map +0 -1
- package/dist/commands/auth/config.command.js +0 -60
- package/dist/commands/auth/config.command.js.map +0 -1
- package/dist/commands/auth/login.command.d.ts +0 -46
- package/dist/commands/auth/login.command.d.ts.map +0 -1
- package/dist/commands/auth/login.command.js +0 -166
- package/dist/commands/auth/login.command.js.map +0 -1
- package/dist/commands/auth/logout.command.d.ts +0 -21
- package/dist/commands/auth/logout.command.d.ts.map +0 -1
- package/dist/commands/auth/logout.command.js +0 -97
- package/dist/commands/auth/logout.command.js.map +0 -1
- package/dist/commands/auth/methods.command.d.ts +0 -68
- package/dist/commands/auth/methods.command.d.ts.map +0 -1
- package/dist/commands/auth/methods.command.js +0 -91
- package/dist/commands/auth/methods.command.js.map +0 -1
- package/dist/commands/auth/status.command.d.ts +0 -18
- package/dist/commands/auth/status.command.d.ts.map +0 -1
- package/dist/commands/auth/status.command.js +0 -104
- package/dist/commands/auth/status.command.js.map +0 -1
- package/dist/commands/auth/use.command.d.ts +0 -17
- package/dist/commands/auth/use.command.d.ts.map +0 -1
- package/dist/commands/auth/use.command.js +0 -47
- package/dist/commands/auth/use.command.js.map +0 -1
- package/dist/commands/branding.command.d.ts +0 -3
- package/dist/commands/branding.command.d.ts.map +0 -1
- package/dist/commands/branding.command.js +0 -42
- package/dist/commands/branding.command.js.map +0 -1
- package/dist/commands/event.command.d.ts +0 -3
- package/dist/commands/event.command.d.ts.map +0 -1
- package/dist/commands/event.command.js +0 -27
- package/dist/commands/event.command.js.map +0 -1
- package/dist/commands/flag-init.command.d.ts +0 -13
- package/dist/commands/flag-init.command.d.ts.map +0 -1
- package/dist/commands/flag-init.command.js +0 -463
- package/dist/commands/flag-init.command.js.map +0 -1
- package/dist/commands/guide.command.d.ts +0 -61
- package/dist/commands/guide.command.d.ts.map +0 -1
- package/dist/commands/guide.command.js +0 -655
- package/dist/commands/guide.command.js.map +0 -1
- package/dist/commands/info.command.d.ts +0 -3
- package/dist/commands/info.command.d.ts.map +0 -1
- package/dist/commands/info.command.js +0 -70
- package/dist/commands/info.command.js.map +0 -1
- package/dist/commands/integration.command.d.ts +0 -35
- package/dist/commands/integration.command.d.ts.map +0 -1
- package/dist/commands/integration.command.js +0 -290
- package/dist/commands/integration.command.js.map +0 -1
- package/dist/commands/journeys.d.ts +0 -43
- package/dist/commands/journeys.d.ts.map +0 -1
- package/dist/commands/journeys.js +0 -221
- package/dist/commands/journeys.js.map +0 -1
- package/dist/commands/ops.command.d.ts +0 -17
- package/dist/commands/ops.command.d.ts.map +0 -1
- package/dist/commands/ops.command.js +0 -129
- package/dist/commands/ops.command.js.map +0 -1
- package/dist/commands/privilege.command.d.ts +0 -16
- package/dist/commands/privilege.command.d.ts.map +0 -1
- package/dist/commands/privilege.command.js +0 -86
- package/dist/commands/privilege.command.js.map +0 -1
- package/dist/commands/role.command.d.ts +0 -3
- package/dist/commands/role.command.d.ts.map +0 -1
- package/dist/commands/role.command.js +0 -101
- package/dist/commands/role.command.js.map +0 -1
- package/dist/commands/runtime-dir.d.ts +0 -16
- package/dist/commands/runtime-dir.d.ts.map +0 -1
- package/dist/commands/runtime-dir.js +0 -18
- package/dist/commands/runtime-dir.js.map +0 -1
- package/dist/commands/setup.command.d.ts +0 -63
- package/dist/commands/setup.command.d.ts.map +0 -1
- package/dist/commands/setup.command.js +0 -148
- package/dist/commands/setup.command.js.map +0 -1
- package/dist/commands/stripe.command.d.ts +0 -29
- package/dist/commands/stripe.command.d.ts.map +0 -1
- package/dist/commands/stripe.command.js +0 -99
- package/dist/commands/stripe.command.js.map +0 -1
- package/dist/commands/tenant.command.d.ts +0 -3
- package/dist/commands/tenant.command.d.ts.map +0 -1
- package/dist/commands/tenant.command.js +0 -135
- package/dist/commands/tenant.command.js.map +0 -1
- package/dist/commands/token.command.d.ts +0 -3
- package/dist/commands/token.command.d.ts.map +0 -1
- package/dist/commands/token.command.js +0 -54
- package/dist/commands/token.command.js.map +0 -1
- package/dist/commands/user.command.d.ts +0 -3
- package/dist/commands/user.command.d.ts.map +0 -1
- package/dist/commands/user.command.js +0 -117
- package/dist/commands/user.command.js.map +0 -1
- package/dist/credentials.d.ts +0 -141
- package/dist/credentials.d.ts.map +0 -1
- package/dist/credentials.js +0 -348
- package/dist/credentials.js.map +0 -1
- package/dist/flag-coherence.d.ts +0 -42
- package/dist/flag-coherence.d.ts.map +0 -1
- package/dist/flag-coherence.js +0 -103
- package/dist/flag-coherence.js.map +0 -1
- package/dist/output.d.ts +0 -17
- package/dist/output.d.ts.map +0 -1
- package/dist/output.js +0 -107
- package/dist/output.js.map +0 -1
- package/dist/preview.d.ts +0 -9
- package/dist/preview.d.ts.map +0 -1
- package/dist/preview.js +0 -63
- package/dist/preview.js.map +0 -1
- package/dist/product-decisions.d.ts +0 -40
- package/dist/product-decisions.d.ts.map +0 -1
- package/dist/product-decisions.js +0 -52
- package/dist/product-decisions.js.map +0 -1
- package/dist/prompt-urls.d.ts +0 -31
- package/dist/prompt-urls.d.ts.map +0 -1
- package/dist/prompt-urls.js +0 -35
- package/dist/prompt-urls.js.map +0 -1
- package/dist/prompts/auth-master-integration-prompt.md +0 -255
- package/dist/prompts/billing/master.md +0 -332
- package/dist/prompts/decisions/feature-control.md +0 -131
- package/dist/prompts/decisions/going-live.md +0 -60
- package/dist/prompts/decisions/login.md +0 -71
- package/dist/prompts/decisions/look-and-feel.md +0 -68
- package/dist/prompts/decisions/payments.md +0 -97
- package/dist/prompts/decisions/roles.md +0 -78
- package/dist/prompts/decisions/teams.md +0 -61
- package/dist/prompts/fit-together.md +0 -97
- package/dist/prompts/flags/master.md +0 -220
- package/dist/prompts/guide-coverage.json +0 -17
- package/dist/prompts/integration-success.md +0 -106
- package/dist/prompts/mcp-tools.json +0 -90
- package/dist/prompts/mechanisms.md +0 -304
- package/dist/prompts/orientation.md +0 -42
- package/dist/prompts/product-decisions.json +0 -338
- package/dist/resolve.d.ts +0 -110
- package/dist/resolve.d.ts.map +0 -1
- package/dist/resolve.js +0 -260
- package/dist/resolve.js.map +0 -1
- package/dist/shape.d.ts +0 -25
- package/dist/shape.d.ts.map +0 -1
- package/dist/shape.js +0 -74
- package/dist/shape.js.map +0 -1
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `bridge auth login` — browser-based loopback PKCE flow.
|
|
3
|
-
*
|
|
4
|
-
* Drives: PKCE pair → ephemeral loopback listener → open browser →
|
|
5
|
-
* await callback → exchange code → write credentials file.
|
|
6
|
-
*
|
|
7
|
-
* Default flow (per TBP-107 Q4): open the browser automatically, fall back
|
|
8
|
-
* to printing the URL if the open command fails or `--no-browser` is set.
|
|
9
|
-
*
|
|
10
|
-
* Hostnames (locked in TBP-107):
|
|
11
|
-
* Consent screen: `https://auth.thebridge.dev/cli/authorize`
|
|
12
|
-
* API: `https://api.thebridge.dev/v1/auth/cli/token`
|
|
13
|
-
*
|
|
14
|
-
* Both endpoints can be overridden for local dev:
|
|
15
|
-
* `BRIDGE_BASE_URL` → bridge-api host
|
|
16
|
-
* `BRIDGE_AUTH_BASE_URL` → consent screen host
|
|
17
|
-
*/
|
|
18
|
-
import type { Command } from 'commander';
|
|
19
|
-
interface LoginOptions {
|
|
20
|
-
app?: string;
|
|
21
|
-
label?: string;
|
|
22
|
-
/**
|
|
23
|
-
* commander's `--no-browser` flag sets `browser=false` (default `true`).
|
|
24
|
-
* We read this as `opts.browser === false` → use --no-browser path.
|
|
25
|
-
*/
|
|
26
|
-
browser?: boolean;
|
|
27
|
-
reauth?: boolean;
|
|
28
|
-
/** TBP-593 — request the elevated `management:admin` scope. */
|
|
29
|
-
admin?: boolean;
|
|
30
|
-
/** TBP-769 — preselect "only this app" instead of "every app" on consent. */
|
|
31
|
-
singleApp?: boolean;
|
|
32
|
-
}
|
|
33
|
-
export { runLogin, buildAuthorizeUrl };
|
|
34
|
-
export declare function registerAuthLoginCommand(auth: Command): void;
|
|
35
|
-
declare function runLogin(opts: LoginOptions): Promise<void>;
|
|
36
|
-
declare function buildAuthorizeUrl(authBaseUrl: string, params: {
|
|
37
|
-
challenge: string;
|
|
38
|
-
redirect: string;
|
|
39
|
-
state: string;
|
|
40
|
-
appId?: string;
|
|
41
|
-
label?: string;
|
|
42
|
-
reauth?: boolean;
|
|
43
|
-
admin?: boolean;
|
|
44
|
-
appAccess?: 'app' | 'workspace';
|
|
45
|
-
}): string;
|
|
46
|
-
//# sourceMappingURL=login.command.d.ts.map
|
|
@@ -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"}
|