@brass-build/cli 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/AGENTS.md +177 -11
  2. package/CHANGELOG.md +29 -0
  3. package/README.md +76 -14
  4. package/dist/api.d.ts +45 -0
  5. package/dist/api.d.ts.map +1 -1
  6. package/dist/api.js +21 -2
  7. package/dist/api.js.map +1 -1
  8. package/dist/approval-prompt.d.ts +25 -0
  9. package/dist/approval-prompt.d.ts.map +1 -0
  10. package/dist/approval-prompt.js +44 -0
  11. package/dist/approval-prompt.js.map +1 -0
  12. package/dist/args.d.ts.map +1 -1
  13. package/dist/args.js +10 -1
  14. package/dist/args.js.map +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +197 -19
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands.d.ts +28 -1
  19. package/dist/commands.d.ts.map +1 -1
  20. package/dist/commands.js +369 -29
  21. package/dist/commands.js.map +1 -1
  22. package/dist/config.d.ts +1 -0
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js +8 -1
  25. package/dist/config.js.map +1 -1
  26. package/dist/login.d.ts +1 -0
  27. package/dist/login.d.ts.map +1 -1
  28. package/dist/login.js +24 -12
  29. package/dist/login.js.map +1 -1
  30. package/dist/project.d.ts +8 -0
  31. package/dist/project.d.ts.map +1 -1
  32. package/dist/project.js +75 -7
  33. package/dist/project.js.map +1 -1
  34. package/dist/sdk-pairing.d.ts +9 -0
  35. package/dist/sdk-pairing.d.ts.map +1 -0
  36. package/dist/sdk-pairing.js +42 -0
  37. package/dist/sdk-pairing.js.map +1 -0
  38. package/dist/session.d.ts +18 -1
  39. package/dist/session.d.ts.map +1 -1
  40. package/dist/session.js +95 -12
  41. package/dist/session.js.map +1 -1
  42. package/dist/store.d.ts +10 -0
  43. package/dist/store.d.ts.map +1 -1
  44. package/dist/store.js +41 -0
  45. package/dist/store.js.map +1 -1
  46. package/dist/version.d.ts +2 -2
  47. package/dist/version.js +1 -1
  48. package/package.json +2 -1
  49. package/src/api.ts +80 -2
  50. package/src/approval-prompt.ts +75 -0
  51. package/src/args.ts +10 -1
  52. package/src/cli.ts +240 -18
  53. package/src/commands.ts +479 -36
  54. package/src/config.ts +15 -2
  55. package/src/login.ts +34 -11
  56. package/src/project.ts +82 -7
  57. package/src/sdk-pairing.ts +53 -0
  58. package/src/session.ts +135 -11
  59. package/src/store.ts +77 -0
  60. package/src/version.ts +1 -1
package/dist/config.js CHANGED
@@ -37,7 +37,14 @@ export function resolveCredential(inputs) {
37
37
  }
38
38
  const stored = inputs.file?.credentials[inputs.profile];
39
39
  if (stored?.session && isNonEmpty(stored.session.sid)) {
40
- return { kind: 'session', sid: stored.session.sid.trim(), source: 'file' };
40
+ return {
41
+ kind: 'session',
42
+ sid: stored.session.sid.trim(),
43
+ source: 'file',
44
+ ...(isNonEmpty(stored.session.authBaseUrl)
45
+ ? { authBaseUrl: stored.session.authBaseUrl.trim() }
46
+ : {}),
47
+ };
41
48
  }
42
49
  if (isNonEmpty(stored?.token)) {
43
50
  return { kind: 'service', token: stored.token.trim(), source: 'file' };
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/login.d.ts CHANGED
@@ -5,6 +5,7 @@ export interface LoginStartOptions {
5
5
  profile: Profile;
6
6
  log: Logger;
7
7
  force?: boolean;
8
+ targetAppId?: string;
8
9
  resultFollows?: boolean;
9
10
  env?: NodeJS.ProcessEnv;
10
11
  now?: () => number;
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IAGZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAIhB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAMD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqC5E;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IAIZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AASD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4E5E"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IAGZ,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,WAAW,CAAC,EAAE,MAAM,CAAC;IAIrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAMD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC5E;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IAIZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AASD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4F5E"}
package/dist/login.js CHANGED
@@ -15,6 +15,7 @@
15
15
  // second code because the first expired is the cost being avoided.
16
16
  import { deviceAuthorize, pollDeviceTokenOnce, postDeviceCancel, decodeEmail } from './session.js';
17
17
  import { readPendingLogin, writePendingLogin, writeStoredCredential, } from './store.js';
18
+ import { renderApprovalPrompt } from './approval-prompt.js';
18
19
  const realSleep = (ms) => new Promise((r) => setTimeout(r, ms));
19
20
  // A grant with less than this left is renewed rather than handed out, so a
20
21
  // caller never relays a code that dies while the human is still reading it.
@@ -44,7 +45,8 @@ export async function loginStart(options) {
44
45
  if (resumed === null && existing !== null && existing.expiresAt > now()) {
45
46
  await postDeviceCancel(existing.authBaseUrl, existing.deviceCode);
46
47
  }
47
- const pending = resumed ?? (await mintPendingLogin(options.authBaseUrl, now(), options.profile, env));
48
+ const pending = resumed ??
49
+ (await mintPendingLogin(options.authBaseUrl, now(), options.profile, env, options.targetAppId));
48
50
  promptFor(options.log, pending, {
49
51
  lead: resumed === null ? null : 'A sign-in is already waiting for approval.',
50
52
  });
@@ -89,7 +91,7 @@ export async function loginCheck(options) {
89
91
  let justPrompted = false;
90
92
  for (;;) {
91
93
  if (now() >= pending.expiresAt) {
92
- pending = await mintPendingLogin(pending.authBaseUrl, now(), options.profile, env);
94
+ pending = await mintPendingLogin(pending.authBaseUrl, now(), options.profile, env, pending.targetAppId);
93
95
  intervalSeconds = pending.intervalSeconds;
94
96
  renewed = true;
95
97
  promptFor(options.log, pending, {
@@ -115,6 +117,16 @@ export async function loginCheck(options) {
115
117
  options.log.result({ state: 'denied' });
116
118
  return 1;
117
119
  }
120
+ // The server has stopped accepting this grant, so the stored code is one
121
+ // the approval page refuses. Clearing it is what stops `brass status`
122
+ // relaying it, and what a caller reads as "start a new one" rather than
123
+ // "keep waiting".
124
+ if (outcome.state === 'expired') {
125
+ await writePendingLogin(options.profile, null, env);
126
+ options.log.info('That sign-in expired. Run `brass login --start` to begin a new one.');
127
+ options.log.result({ state: 'expired' });
128
+ return 1;
129
+ }
118
130
  // RFC 8628 §3.5: polling too fast. Back off for the rest of this wait.
119
131
  if (outcome.state === 'slow_down')
120
132
  intervalSeconds += 5;
@@ -137,11 +149,12 @@ export async function loginCheck(options) {
137
149
  });
138
150
  return 0;
139
151
  }
140
- async function mintPendingLogin(authBaseUrl, now, profile, env) {
141
- const auth = await deviceAuthorize(authBaseUrl, now);
152
+ async function mintPendingLogin(authBaseUrl, now, profile, env, targetAppId) {
153
+ const auth = await deviceAuthorize(authBaseUrl, now, targetAppId);
142
154
  const pending = {
143
155
  authBaseUrl,
144
156
  deviceCode: auth.deviceCode,
157
+ ...(targetAppId !== undefined ? { targetAppId } : {}),
145
158
  userCode: auth.userCode,
146
159
  verificationUri: auth.verificationUri,
147
160
  ...(auth.verificationUriComplete !== undefined
@@ -159,14 +172,13 @@ function targetUrl(pending) {
159
172
  function remainingSeconds(pending, now) {
160
173
  return Math.max(0, Math.round((pending.expiresAt - now) / 1000));
161
174
  }
162
- // The one rendering of "here is what to relay, and here is what to run next",
163
- // so a resumed, renewed, and freshly minted grant all read the same to whoever
164
- // is relaying it.
165
175
  function promptFor(log, pending, opts) {
166
- log.info((opts.lead !== null ? `${opts.lead}\n` : '') +
167
- 'To approve this sign-in, go to:\n' +
168
- ` ${targetUrl(pending)}\n` +
169
- `and confirm the code: ${pending.userCode}\n` +
170
- '\nThen run `brass login --check --wait` to finish signing in.');
176
+ log.info(renderApprovalPrompt({
177
+ url: targetUrl(pending),
178
+ code: pending.userCode,
179
+ lead: opts.lead,
180
+ nextCommand: 'brass login --check --wait',
181
+ relaying: true,
182
+ }));
171
183
  }
172
184
  //# sourceMappingURL=login.js.map
package/dist/login.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
package/dist/project.d.ts CHANGED
@@ -20,7 +20,15 @@ export interface AppManifest {
20
20
  schema?: BrassSchemaManifest;
21
21
  [key: string]: unknown;
22
22
  }
23
+ export declare const MANIFEST_FILENAME = "brass-app.json";
24
+ export declare function publishManifestCandidates(dir: string): string[];
25
+ export declare function sourceManifestCandidates(): string[];
23
26
  export declare function readManifest(path: string): Promise<AppManifest | null>;
27
+ export declare function loadFirstManifest(cwd: string, candidates: readonly string[]): Promise<{
28
+ path: string;
29
+ manifest: AppManifest;
30
+ } | null>;
31
+ export declare function firstExistingManifestPath(cwd: string, candidates: readonly string[]): Promise<string | null>;
24
32
  export declare function writeManifest(path: string, manifest: AppManifest): Promise<void>;
25
33
  export declare function writeTextFile(path: string, content: string): Promise<void>;
26
34
  export declare function mergeSchemaIntoManifest(manifest: AppManifest, schema: BrassSchemaManifest): AppManifest;
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAOpD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C;AAKD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWhF;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAQf;AAKD,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,GAAG,IAAI,CAKhB;AAUD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IAOd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAS5E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF;AAKD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAMD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAEb;AAgBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAyCzF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,CAK1E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEpE;AASD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAKvE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMhE"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAOpD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C;AAKD,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAWhF;AAED,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAQf;AAKD,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,GAAG,IAAI,CAKhB;AAUD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IAOd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAID,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAOlD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAOD,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAOnD;AAOD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmB5E;AAMD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GAAG,IAAI,CAAC,CAMzD;AAMD,wBAAsB,yBAAyB,CAC7C,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASxB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF;AAKD,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhF;AAMD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,mBAAmB,GAC1B,WAAW,CAEb;AAgBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAyCzF;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,UAAU,CAK1E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAEpE;AASD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAKvE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMhE"}
package/dist/project.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { readFile, writeFile, readdir, stat, mkdir, realpath } from 'node:fs/promises';
2
- import { join, relative, sep, dirname } from 'node:path';
2
+ import { join, relative, resolve, sep, dirname } from 'node:path';
3
3
  import { createHash } from 'node:crypto';
4
4
  import { zipSync } from 'fflate';
5
5
  const PROJECT_DIR = '.brass';
@@ -43,17 +43,85 @@ export function resolveAppId(inputs) {
43
43
  function nonEmpty(v) {
44
44
  return typeof v === 'string' && v.trim() !== '';
45
45
  }
46
+ // The manifest filename, and the bundle-relative directory the capability
47
+ // docs put it in.
48
+ export const MANIFEST_FILENAME = 'brass-app.json';
49
+ const WELL_KNOWN_DIR = '.well-known';
50
+ // Where `publish` and `status` look for the served manifest, most
51
+ // authoritative first. The copy inside the bundle is the one the platform
52
+ // reads back after a deploy, so it outranks the repo root, which is the flat
53
+ // layout an app that keeps its manifest beside `package.json` uses.
54
+ export function publishManifestCandidates(dir) {
55
+ return [join(dir, WELL_KNOWN_DIR, MANIFEST_FILENAME), MANIFEST_FILENAME];
56
+ }
57
+ // Where `schema pull` looks for a manifest to merge a pulled schema into.
58
+ // Source locations only: a bundler rewrites its output directory on the next
59
+ // build, so a schema written there is gone before the app is published. Each
60
+ // candidate is used only when it already holds a file, so a layout this list
61
+ // does not name falls back to the root default rather than being guessed at.
62
+ export function sourceManifestCandidates() {
63
+ return [
64
+ MANIFEST_FILENAME,
65
+ join(WELL_KNOWN_DIR, MANIFEST_FILENAME),
66
+ join('public', WELL_KNOWN_DIR, MANIFEST_FILENAME),
67
+ join('static', WELL_KNOWN_DIR, MANIFEST_FILENAME),
68
+ ];
69
+ }
70
+ // Absent means no file at this path, which is what lets a caller walk a
71
+ // candidate list. Every other failure throws: a manifest that exists and
72
+ // cannot be parsed is a mistake to report, and answering it with `null` drops
73
+ // the `name` and `client_token` it was written to carry, which reads as a
74
+ // missing manifest and creates a duplicate app on the next stateless run.
46
75
  export async function readManifest(path) {
76
+ let raw;
47
77
  try {
48
- const raw = await readFile(path, 'utf8');
49
- const parsed = JSON.parse(raw);
50
- if (typeof parsed !== 'object' || parsed === null)
78
+ raw = await readFile(path, 'utf8');
79
+ }
80
+ catch (err) {
81
+ const code = err.code;
82
+ if (code === 'ENOENT' || code === 'ENOTDIR')
51
83
  return null;
52
- return parsed;
84
+ throw new Error(`Could not read the manifest at ${path}: ${err.message}`);
53
85
  }
54
- catch {
55
- return null;
86
+ let parsed;
87
+ try {
88
+ parsed = JSON.parse(raw);
89
+ }
90
+ catch (err) {
91
+ throw new Error(`The manifest at ${path} is not valid JSON: ${err.message}`);
92
+ }
93
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
94
+ throw new Error(`The manifest at ${path} must hold a JSON object.`);
95
+ }
96
+ return parsed;
97
+ }
98
+ // The first candidate that holds a manifest, paired with the path it came
99
+ // from so a caller can name it. A candidate with no file is skipped; one that
100
+ // is present and unreadable throws out of `readManifest`, so a malformed
101
+ // manifest is reported rather than passed over for the next candidate down.
102
+ export async function loadFirstManifest(cwd, candidates) {
103
+ for (const candidate of candidates) {
104
+ const manifest = await readManifest(resolve(cwd, candidate));
105
+ if (manifest !== null)
106
+ return { path: candidate, manifest };
107
+ }
108
+ return null;
109
+ }
110
+ // The first candidate that holds a file, without parsing it. `schema pull`
111
+ // picks its destination this way so it merges into a malformed manifest's
112
+ // path and fails there, instead of stepping over it and writing a second
113
+ // manifest the bundle never serves.
114
+ export async function firstExistingManifestPath(cwd, candidates) {
115
+ for (const candidate of candidates) {
116
+ try {
117
+ if ((await stat(resolve(cwd, candidate))).isFile())
118
+ return candidate;
119
+ }
120
+ catch {
121
+ // Not there, or not reachable through this path. Try the next.
122
+ }
56
123
  }
124
+ return null;
57
125
  }
58
126
  export async function writeManifest(path, manifest) {
59
127
  await mkdir(dirname(path), { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface LoadedSdk {
2
+ version: string;
3
+ path: string;
4
+ }
5
+ export declare function sdkMismatchMessage(args: {
6
+ pinned: string | undefined;
7
+ loaded: LoadedSdk | null;
8
+ }): string | null;
9
+ //# sourceMappingURL=sdk-pairing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-pairing.d.ts","sourceRoot":"","sources":["../src/sdk-pairing.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAIhB,IAAI,EAAE,MAAM,CAAC;CACd;AASD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B,GAAG,MAAM,GAAG,IAAI,CAchB"}
@@ -0,0 +1,42 @@
1
+ // Which `@brass-build/client` this CLI is allowed to use.
2
+ //
3
+ // The dependency is pinned to one exact version, and what the CLI imports is
4
+ // the `internal` subpath, the entry that promises nothing from one release to
5
+ // the next. So the only copy it can run against is the one it names, and a
6
+ // correct install always provides it.
7
+ //
8
+ // What does not is a CLI running somewhere its own dependency is not
9
+ // reachable, and every way in is quiet. `npx brass` from a directory with no
10
+ // `node_modules` fetches the CLI alone from the registry. `npm i -g` nests a
11
+ // registry copy under the CLI. Installing the CLI tarball by itself resolves
12
+ // the SDK from npm, which succeeds precisely because an unreleased build in a
13
+ // working tree still carries the last released version number.
14
+ //
15
+ // The check is on the VERSION, not on any one export, and that is the point:
16
+ // a check per export is re-earned every time the CLI reaches for a new one,
17
+ // and it reports whatever that call happened to need rather than the pairing
18
+ // that is actually wrong. One version comparison covers every surface the CLI
19
+ // imports today and every one it adds later.
20
+ // The mismatch, as a sentence, or `null` when the pairing is sound.
21
+ //
22
+ // `loaded` is null when the SDK could not be resolved from the CLI's own
23
+ // location. That is not a mismatch: it is the shape an in-repo run takes,
24
+ // where the module specifier is mapped to the SDK's source and there is no
25
+ // installed package to read a version from. Being unable to check is not
26
+ // evidence of a fault, so it passes.
27
+ export function sdkMismatchMessage(args) {
28
+ const { pinned, loaded } = args;
29
+ if (pinned === undefined || loaded === null)
30
+ return null;
31
+ if (loaded.version === pinned)
32
+ return null;
33
+ return (`This CLI is built against @brass-build/client ${pinned}, and the copy it ` +
34
+ `loads is ${loaded.version} (${loaded.path}). It reads the SDK's internal ` +
35
+ `entry, which changes between releases, so the two have to match. Install ` +
36
+ `the CLI into the directory you run it from ("npm i @brass-build/cli") and ` +
37
+ `run it as ./node_modules/.bin/brass with absolute paths: a global install ` +
38
+ `keeps its own copy of the SDK, and npx resolves node_modules from the ` +
39
+ `current directory, so it fetches one from the registry when run anywhere ` +
40
+ `else.`);
41
+ }
42
+ //# sourceMappingURL=sdk-pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-pairing.js","sourceRoot":"","sources":["../src/sdk-pairing.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,sCAAsC;AACtC,EAAE;AACF,qEAAqE;AACrE,6EAA6E;AAC7E,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,+DAA+D;AAC/D,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,6CAA6C;AAU7C,oEAAoE;AACpE,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AACzE,qCAAqC;AACrC,MAAM,UAAU,kBAAkB,CAAC,IAGlC;IACC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACzD,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,CACL,iDAAiD,MAAM,oBAAoB;QAC3E,YAAY,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,iCAAiC;QAC3E,2EAA2E;QAC3E,4EAA4E;QAC5E,4EAA4E;QAC5E,wEAAwE;QACxE,2EAA2E;QAC3E,OAAO,CACR,CAAC;AACJ,CAAC"}
package/dist/session.d.ts CHANGED
@@ -5,9 +5,23 @@ export interface RefreshedTokens {
5
5
  idToken: string;
6
6
  expiresAt: number;
7
7
  sessionToken?: string;
8
+ appAssertion?: string;
8
9
  }
9
10
  export declare function postRefresh(authBaseUrl: string, sid: string, origin?: string, now?: number): Promise<RefreshedTokens>;
10
11
  export declare function postSignOut(authBaseUrl: string, sid: string, origin?: string): Promise<boolean>;
12
+ export type BrowserSessionOutcome = {
13
+ state: 'ready';
14
+ url: string;
15
+ expiresIn: number;
16
+ } | {
17
+ state: 'needs_approval';
18
+ approvalUrl: string;
19
+ expiresIn: number;
20
+ };
21
+ export declare function postDeviceAppSession(authBaseUrl: string, sid: string, args: {
22
+ appId: string;
23
+ returnTo: string;
24
+ }, origin?: string): Promise<BrowserSessionOutcome>;
11
25
  export declare function postDeviceCancel(authBaseUrl: string, deviceCode: string): Promise<boolean>;
12
26
  export declare function decodeEmail(idToken: string): string | undefined;
13
27
  export interface LoginResult {
@@ -22,7 +36,7 @@ export interface DeviceAuthorization {
22
36
  intervalSeconds: number;
23
37
  expiresAt: number;
24
38
  }
25
- export declare function deviceAuthorize(authBaseUrl: string, now?: number): Promise<DeviceAuthorization>;
39
+ export declare function deviceAuthorize(authBaseUrl: string, now?: number, targetAppId?: string): Promise<DeviceAuthorization>;
26
40
  export type DevicePollOutcome = {
27
41
  state: 'approved';
28
42
  tokens: RefreshedTokens;
@@ -32,6 +46,8 @@ export type DevicePollOutcome = {
32
46
  state: 'slow_down';
33
47
  } | {
34
48
  state: 'denied';
49
+ } | {
50
+ state: 'expired';
35
51
  };
36
52
  export declare function pollDeviceTokenOnce(authBaseUrl: string, deviceCode: string, now?: number): Promise<DevicePollOutcome>;
37
53
  export declare function pollDeviceToken(authBaseUrl: string, auth: DeviceAuthorization, opts?: {
@@ -40,6 +56,7 @@ export declare function pollDeviceToken(authBaseUrl: string, auth: DeviceAuthori
40
56
  }): Promise<RefreshedTokens>;
41
57
  export interface DeviceLoginOptions {
42
58
  authBaseUrl: string;
59
+ targetAppId?: string;
43
60
  onPrompt?: (auth: DeviceAuthorization) => void;
44
61
  openBrowser?: (url: string) => void;
45
62
  sleep?: (ms: number) => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAY9C,eAAO,MAAM,UAAU,2BAA2B,CAAC;AAUnD,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAKlB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA2BD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAuB,EAC/B,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,eAAe,CAAC,CA8C1B;AAUD,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,MAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAelB;AAMD,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAYlB;AAID,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAW/D;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAQD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAWD,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,mBAAmB,CAAC,CA+B9B;AAMD,MAAM,MAAM,iBAAiB,GACzB;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC9C;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,GACpB;IAAE,KAAK,EAAE,WAAW,CAAA;CAAE,GACtB;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,CAAC;AAExB,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAmB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CA0C5B;AAKD,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,mBAAmB,EACzB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GACvE,OAAO,CAAC,eAAe,CAAC,CAa1B;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IAEpB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAI/C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC,CAWnF;AAoCD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAW1E"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
package/dist/session.js CHANGED
@@ -10,6 +10,7 @@
10
10
  // later token refresh.
11
11
  import { spawn } from 'node:child_process';
12
12
  import { BrassApiError, networkError } from './api.js';
13
+ import { renderApprovalPrompt } from './approval-prompt.js';
13
14
  // Every auth call carries a few hundred bytes, so a host still silent after
14
15
  // this is one that is not going to answer.
15
16
  const AUTH_TIMEOUT_MS = 15_000;
@@ -83,6 +84,7 @@ export async function postRefresh(authBaseUrl, sid, origin = REFRESH_ORIGIN, now
83
84
  idToken: json.id_token,
84
85
  expiresAt: now + tokenTtlSeconds(json.expires_in) * 1000,
85
86
  ...(json.session_token ? { sessionToken: json.session_token } : {}),
87
+ ...(json.app_assertion ? { appAssertion: json.app_assertion } : {}),
86
88
  };
87
89
  }
88
90
  // End this machine's sign-in on the server, not only in the local
@@ -110,6 +112,54 @@ export async function postSignOut(authBaseUrl, sid, origin = REFRESH_ORIGIN) {
110
112
  return false;
111
113
  }
112
114
  }
115
+ // Ask the auth API for a URL that signs a browser in as the human this
116
+ // machine is signed in as. The stored device pointer is the credential, and
117
+ // the answer is `return_to` with a one-time code on it, so what reaches the
118
+ // browser expires in minutes and is spent once.
119
+ //
120
+ // The URL is a credential for as long as it lives. It belongs in the browser
121
+ // the caller is about to drive, not in a log, a PR body, or a commit.
122
+ export async function postDeviceAppSession(authBaseUrl, sid, args, origin = REFRESH_ORIGIN) {
123
+ const url = `${authBaseUrl}/device/app-session`;
124
+ let response;
125
+ try {
126
+ response = await fetch(url, {
127
+ method: 'POST',
128
+ headers: { 'content-type': 'application/x-www-form-urlencoded', origin },
129
+ body: new URLSearchParams({ sid, app_id: args.appId, return_to: args.returnTo }),
130
+ signal: AbortSignal.timeout(AUTH_TIMEOUT_MS),
131
+ });
132
+ }
133
+ catch (cause) {
134
+ throw networkError(`reaching ${authBaseUrl}`, cause);
135
+ }
136
+ const json = (await response.json().catch(() => ({})));
137
+ if (response.ok) {
138
+ if (!json.url) {
139
+ throw new BrassApiError(response.status, 'Brass returned no browser-session URL.');
140
+ }
141
+ return {
142
+ state: 'ready',
143
+ url: json.url,
144
+ expiresIn: tokenTtlSeconds(json.expires_in),
145
+ };
146
+ }
147
+ if (json.error === 'app_not_approved' && json.approval_url) {
148
+ return {
149
+ state: 'needs_approval',
150
+ approvalUrl: json.approval_url,
151
+ expiresIn: tokenTtlSeconds(json.expires_in),
152
+ };
153
+ }
154
+ // The server's own wording where it has one: every refusal here names a
155
+ // specific thing the caller can fix (an unknown app, a return_to off the
156
+ // allowlist, a sign-in that has ended), and rewording them locally would
157
+ // lose which.
158
+ throw new BrassApiError(response.status, json.error_description ??
159
+ (response.status === 401
160
+ ? "Your Brass sign-in is no longer valid (401). Run 'brass login' to sign in again."
161
+ : `Could not mint a browser session (${response.status}).`));
162
+ }
113
163
  // Abandon a sign-in this machine started and never redeemed, so the code it
114
164
  // relayed to a human stops being redeemable. Reports whether the server took
115
165
  // it, like `postSignOut`: the record naming the grant is the caller's only
@@ -142,8 +192,14 @@ export function decodeEmail(idToken) {
142
192
  return undefined;
143
193
  }
144
194
  }
145
- export async function deviceAuthorize(authBaseUrl, now = Date.now()) {
195
+ // `targetAppId` is the app the machine will hand a browser once it is signed
196
+ // in (`brass login --app`). The grant still mints for the CLI alone; naming a
197
+ // target only widens what the human's one approval covers, so a later
198
+ // `brass browser-session` needs no second trip to a browser.
199
+ export async function deviceAuthorize(authBaseUrl, now = Date.now(), targetAppId) {
146
200
  const body = new URLSearchParams({ app_id: CLI_APP_ID });
201
+ if (targetAppId !== undefined)
202
+ body.set('target_app_id', targetAppId);
147
203
  let response;
148
204
  try {
149
205
  response = await fetch(`${authBaseUrl}/device/authorize`, {
@@ -156,9 +212,14 @@ export async function deviceAuthorize(authBaseUrl, now = Date.now()) {
156
212
  catch (cause) {
157
213
  throw new Error(`Network error reaching ${authBaseUrl}: ${String(cause)}`);
158
214
  }
159
- if (!response.ok)
160
- throw new Error(`Device sign-in could not start (${response.status})`);
161
- const json = (await response.json());
215
+ // The server's own reason where it sent one. Every 400 here names a
216
+ // specific thing the caller got wrong (an app id that is not an app, an app
217
+ // that does not support device sign-in), and a status on its own sends them
218
+ // looking at the network instead.
219
+ const json = (await response.json().catch(() => ({})));
220
+ if (!response.ok) {
221
+ throw new Error(json.error_description ?? `Device sign-in could not start (${response.status})`);
222
+ }
162
223
  return {
163
224
  deviceCode: json.device_code,
164
225
  userCode: json.user_code,
@@ -203,12 +264,19 @@ export async function pollDeviceTokenOnce(authBaseUrl, deviceCode, now = Date.no
203
264
  idToken: json.id_token,
204
265
  expiresAt: now + tokenTtlSeconds(json.expires_in) * 1000,
205
266
  ...(json.session_token ? { sessionToken: json.session_token } : {}),
267
+ ...(json.app_assertion ? { appAssertion: json.app_assertion } : {}),
206
268
  },
207
269
  };
208
270
  }
209
- // The user declined: the one terminal refusal.
271
+ // The user declined: the one terminal refusal the person chose.
210
272
  if (json.error === 'access_denied')
211
273
  return { state: 'denied' };
274
+ // The other terminal one, which the server chose: the grant was consumed,
275
+ // cancelled, is unknown, or its session has ended. No later poll of this
276
+ // grant can be approved, so waiting out the deadline only relays a code the
277
+ // approval page will not take.
278
+ if (json.error === 'expired_token')
279
+ return { state: 'expired' };
212
280
  // RFC 8628 §3.5: polling too fast. The caller backs off.
213
281
  if (json.error === 'slow_down')
214
282
  return { state: 'slow_down' };
@@ -237,12 +305,15 @@ export async function pollDeviceToken(authBaseUrl, auth, opts = {}) {
237
305
  return outcome.tokens;
238
306
  if (outcome.state === 'denied')
239
307
  throw new Error('Sign-in was denied.');
308
+ if (outcome.state === 'expired') {
309
+ throw new Error('Device sign-in expired. Run `brass login` again.');
310
+ }
240
311
  if (outcome.state === 'slow_down')
241
312
  intervalSeconds += 5;
242
313
  }
243
314
  }
244
315
  export async function loginDevice(options) {
245
- const auth = await deviceAuthorize(options.authBaseUrl);
316
+ const auth = await deviceAuthorize(options.authBaseUrl, Date.now(), options.targetAppId);
246
317
  (options.onPrompt ?? defaultDevicePrompt)(auth);
247
318
  (options.openBrowser ?? openBrowser)(auth.verificationUriComplete ?? auth.verificationUri);
248
319
  const tokens = await pollDeviceToken(options.authBaseUrl, auth, options.sleep ? { sleep: options.sleep } : {});
@@ -251,11 +322,13 @@ export async function loginDevice(options) {
251
322
  return { sessionToken: tokens.sessionToken, email: decodeEmail(tokens.idToken) };
252
323
  }
253
324
  function defaultDevicePrompt(auth) {
254
- const target = auth.verificationUriComplete ?? auth.verificationUri;
255
- process.stderr.write('\nOpening your browser to approve this sign-in.\n' +
256
- `If it doesn't open, go to:\n ${target}\n` +
257
- `and confirm the code: ${auth.userCode}\n` +
258
- '\nWaiting for approval...\n');
325
+ process.stderr.write(`\n${renderApprovalPrompt({
326
+ url: auth.verificationUriComplete ?? auth.verificationUri,
327
+ code: auth.userCode,
328
+ // This command polls to approval on its own, so there is nothing further
329
+ // to run; what the reader needs is that the wait has started.
330
+ closing: 'Waiting for approval...',
331
+ })}\n`);
259
332
  }
260
333
  function openBrowser(url) {
261
334
  const platform = process.platform;
@@ -288,7 +361,17 @@ export function sessionAuth(authBaseUrl, sid) {
288
361
  if (cached === null || Date.now() >= cached.expiresAt - SKEW_MS) {
289
362
  cached = await postRefresh(authBaseUrl, sid);
290
363
  }
291
- return { authorization: `Bearer ${cached.accessToken}`, 'x-id-token': cached.idToken };
364
+ return {
365
+ authorization: `Bearer ${cached.accessToken}`,
366
+ 'x-id-token': cached.idToken,
367
+ // Refreshed on the same call as the token, so the two always name
368
+ // the same grant. Omitted rather than sent empty when the platform
369
+ // minted none, since a header the verifier cannot read is the same
370
+ // as no header and an empty one only obscures which it was.
371
+ ...(cached.appAssertion
372
+ ? { 'x-brass-app-assertion': cached.appAssertion }
373
+ : {}),
374
+ };
292
375
  },
293
376
  };
294
377
  }