@msn-control/liftoff 0.10.3 → 0.10.4

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 (97) hide show
  1. package/DEVELOPER.md +201 -0
  2. package/README.md +1 -1
  3. package/assets/governance/single-maintainer-gitflow/assessment-controls.json +39 -0
  4. package/assets/supported-stack.json +4 -2
  5. package/dist/args.d.ts +2 -2
  6. package/dist/args.js +41 -10
  7. package/dist/args.js.map +1 -1
  8. package/dist/artifact-lifecycle.d.ts +1 -1
  9. package/dist/artifact-lifecycle.js +3 -1
  10. package/dist/artifact-lifecycle.js.map +1 -1
  11. package/dist/cli.js +2 -1
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands.js +214 -57
  14. package/dist/commands.js.map +1 -1
  15. package/dist/file-system.d.ts +3 -0
  16. package/dist/file-system.js +51 -10
  17. package/dist/file-system.js.map +1 -1
  18. package/dist/governance-activation/commands.js +40 -2
  19. package/dist/governance-activation/commands.js.map +1 -1
  20. package/dist/governance-activation/readiness.d.ts +1 -0
  21. package/dist/governance-activation/readiness.js +3 -1
  22. package/dist/governance-activation/readiness.js.map +1 -1
  23. package/dist/governance-activation/seed-lifecycle.d.ts +1 -1
  24. package/dist/governance-activation/seed-lifecycle.js +47 -3
  25. package/dist/governance-activation/seed-lifecycle.js.map +1 -1
  26. package/dist/governance-activation/transitions.d.ts +8 -0
  27. package/dist/governance-activation/transitions.js +12 -1
  28. package/dist/governance-activation/transitions.js.map +1 -1
  29. package/dist/governance-assessment/catalog.d.ts +8 -0
  30. package/dist/governance-assessment/catalog.js +98 -0
  31. package/dist/governance-assessment/catalog.js.map +1 -0
  32. package/dist/governance-assessment/command.d.ts +10 -0
  33. package/dist/governance-assessment/command.js +81 -0
  34. package/dist/governance-assessment/command.js.map +1 -0
  35. package/dist/governance-assessment/engine.d.ts +19 -0
  36. package/dist/governance-assessment/engine.js +586 -0
  37. package/dist/governance-assessment/engine.js.map +1 -0
  38. package/dist/governance-assessment/index.d.ts +5 -0
  39. package/dist/governance-assessment/index.js +6 -0
  40. package/dist/governance-assessment/index.js.map +1 -0
  41. package/dist/governance-assessment/live-normalize.d.ts +19 -0
  42. package/dist/governance-assessment/live-normalize.js +403 -0
  43. package/dist/governance-assessment/live-normalize.js.map +1 -0
  44. package/dist/governance-assessment/live-transport.d.ts +38 -0
  45. package/dist/governance-assessment/live-transport.js +467 -0
  46. package/dist/governance-assessment/live-transport.js.map +1 -0
  47. package/dist/governance-assessment/live.d.ts +2 -0
  48. package/dist/governance-assessment/live.js +639 -0
  49. package/dist/governance-assessment/live.js.map +1 -0
  50. package/dist/governance-assessment/predicates.d.ts +27 -0
  51. package/dist/governance-assessment/predicates.js +330 -0
  52. package/dist/governance-assessment/predicates.js.map +1 -0
  53. package/dist/governance-assessment/project.d.ts +37 -0
  54. package/dist/governance-assessment/project.js +268 -0
  55. package/dist/governance-assessment/project.js.map +1 -0
  56. package/dist/governance-assessment/readers.d.ts +18 -0
  57. package/dist/governance-assessment/readers.js +130 -0
  58. package/dist/governance-assessment/readers.js.map +1 -0
  59. package/dist/governance-assessment/report.d.ts +23 -0
  60. package/dist/governance-assessment/report.js +266 -0
  61. package/dist/governance-assessment/report.js.map +1 -0
  62. package/dist/governance-assessment/sanitize.d.ts +8 -0
  63. package/dist/governance-assessment/sanitize.js +57 -0
  64. package/dist/governance-assessment/sanitize.js.map +1 -0
  65. package/dist/governance-assessment/types.d.ts +178 -0
  66. package/dist/governance-assessment/types.js +13 -0
  67. package/dist/governance-assessment/types.js.map +1 -0
  68. package/dist/governance-assessment/yaml.d.ts +6 -0
  69. package/dist/governance-assessment/yaml.js +30 -0
  70. package/dist/governance-assessment/yaml.js.map +1 -0
  71. package/dist/migrate-plan.d.ts +4 -0
  72. package/dist/migrate-plan.js +73 -2
  73. package/dist/migrate-plan.js.map +1 -1
  74. package/dist/power-apps-templates.js +4 -0
  75. package/dist/power-apps-templates.js.map +1 -1
  76. package/dist/process-runner.d.ts +4 -0
  77. package/dist/process-runner.js +164 -8
  78. package/dist/process-runner.js.map +1 -1
  79. package/dist/published-verifier.js +6 -0
  80. package/dist/published-verifier.js.map +1 -1
  81. package/dist/release-identity.js +19 -0
  82. package/dist/release-identity.js.map +1 -1
  83. package/dist/repository-governance.d.ts +5 -0
  84. package/dist/repository-governance.js +128 -1
  85. package/dist/repository-governance.js.map +1 -1
  86. package/dist/telemetry/contract.d.ts +2 -0
  87. package/dist/telemetry/contract.js +7 -0
  88. package/dist/telemetry/contract.js.map +1 -1
  89. package/dist/templates.js +48 -25
  90. package/dist/templates.js.map +1 -1
  91. package/docs/cli-reference.md +80 -0
  92. package/docs/configuration-and-manifests.md +11 -1
  93. package/docs/project-structure.md +8 -3
  94. package/docs/repository-governance.md +119 -2
  95. package/docs/telemetry.md +9 -3
  96. package/docs/workloads.md +7 -0
  97. package/package.json +3 -2
@@ -0,0 +1,467 @@
1
+ import { performance } from 'node:perf_hooks';
2
+ import { isRecord } from './sanitize.js';
3
+ import { assessmentLimits } from './types.js';
4
+ const githubCliHost = 'github.com';
5
+ const githubApiOrigin = 'https://api.github.com';
6
+ const armHost = 'https://management.azure.com';
7
+ const pageSize = 100;
8
+ export const githubApiVersion = '2022-11-28';
9
+ export class LiveFailure extends Error {
10
+ code;
11
+ transient;
12
+ constructor(code, message, transient = false) {
13
+ super(message);
14
+ this.code = code;
15
+ this.transient = transient;
16
+ }
17
+ }
18
+ function failureForStatus(status) {
19
+ if (status === 401)
20
+ return new LiveFailure('authentication', 'Existing authentication did not authorize the read.');
21
+ if (status === 403)
22
+ return new LiveFailure('denied', 'The scoped read was denied; absence cannot be established.');
23
+ if (status === 404)
24
+ return new LiveFailure('masked-not-found', 'The read returned 404; absence cannot be distinguished from hidden access.');
25
+ if (status === 429)
26
+ return new LiveFailure('rate-limit', 'The provider rate-limited the scoped read.', true);
27
+ if (status >= 500 && status <= 599)
28
+ return new LiveFailure('provider-unavailable', 'The provider could not complete the scoped read.', true);
29
+ return new LiveFailure('http-error', 'The provider returned an unsuccessful HTTP response.');
30
+ }
31
+ function parseJson(text) {
32
+ try {
33
+ return JSON.parse(text);
34
+ }
35
+ catch {
36
+ throw new LiveFailure('invalid-response', 'The provider response was invalid or truncated JSON.');
37
+ }
38
+ }
39
+ function parseGitHub(text) {
40
+ const split = text.search(/\r?\n\r?\n/u);
41
+ if (split < 0)
42
+ throw new LiveFailure('invalid-response', 'GitHub response headers were unavailable; pagination cannot be verified.');
43
+ const lines = text.slice(0, split).split(/\r?\n/u);
44
+ const status = /^HTTP\/[0-9.]+\s+([0-9]{3})(?:\s|$)/u.exec(lines.shift() ?? '');
45
+ if (!status)
46
+ throw new LiveFailure('invalid-response', 'GitHub returned an invalid HTTP envelope.');
47
+ const headers = new Map();
48
+ for (const line of lines) {
49
+ const colon = line.indexOf(':');
50
+ if (colon < 1)
51
+ throw new LiveFailure('invalid-response', 'GitHub returned malformed response headers.');
52
+ const name = line.slice(0, colon).toLowerCase();
53
+ if (!/^[a-z0-9-]+$/u.test(name) || headers.has(name)) {
54
+ throw new LiveFailure('invalid-response', 'GitHub returned ambiguous response headers.');
55
+ }
56
+ headers.set(name, line.slice(colon + 1).trim());
57
+ }
58
+ const code = Number(status[1]);
59
+ if (code < 200 || code >= 300)
60
+ throw failureForStatus(code);
61
+ const body = text.slice(split).replace(/^\r?\n\r?\n/u, '');
62
+ const length = headers.get('content-length');
63
+ if (length !== undefined && !headers.has('content-encoding') &&
64
+ (!/^\d+$/u.test(length) || Number(length) !== Buffer.byteLength(body))) {
65
+ throw new LiveFailure('truncated-response', 'The GitHub response did not match its declared content length.');
66
+ }
67
+ return { value: parseJson(body), headers };
68
+ }
69
+ function httpError(result) {
70
+ if (result.errorCode === 'ENOENT')
71
+ return new LiveFailure('tool-unavailable', 'The required CLI is unavailable; no installation was attempted.');
72
+ const code = /\bHTTP(?:\/[0-9.]+)?\s+([1-5][0-9]{2})\b/iu.exec(result.stderr)?.[1] ??
73
+ /\b(?:status(?:\s+code)?|StatusCode)\s*[:=]?\s*([1-5][0-9]{2})\b/iu.exec(result.stderr)?.[1];
74
+ if (code)
75
+ return failureForStatus(Number(code));
76
+ if (/\b(?:AuthorizationFailed|Forbidden|AccessDenied)\b/u.test(result.stderr))
77
+ return failureForStatus(403);
78
+ if (/\b(?:AuthenticationFailed|Unauthorized|NotLoggedIn)\b|az login|gh auth login/iu.test(result.stderr))
79
+ return failureForStatus(401);
80
+ if (/\b(?:ResourceNotFound|NotFound)\b/u.test(result.stderr))
81
+ return failureForStatus(404);
82
+ if (['EAI_AGAIN', 'ECONNRESET', 'ETIMEDOUT'].includes(result.errorCode ?? '')) {
83
+ return new LiveFailure('transport-unavailable', 'The scoped read encountered a transient transport failure.', true);
84
+ }
85
+ return new LiveFailure('command-failed', 'The read-only CLI request failed; provider error details were withheld.');
86
+ }
87
+ export class LiveTransport {
88
+ runner;
89
+ now;
90
+ scope;
91
+ azureUrls;
92
+ diagnostic;
93
+ clockStart;
94
+ monotonicStart = performance.now();
95
+ verified = false;
96
+ shas = new Set();
97
+ unavailable = new Set();
98
+ active = new Set();
99
+ deadlineFailure;
100
+ constructor(runner, now, scope, azureUrls, diagnostic) {
101
+ this.runner = runner;
102
+ this.now = now;
103
+ this.scope = scope;
104
+ this.azureUrls = azureUrls;
105
+ this.diagnostic = diagnostic;
106
+ this.clockStart = now().getTime();
107
+ }
108
+ verifyRepository() {
109
+ this.verified = true;
110
+ }
111
+ bindSha(sha) {
112
+ if (!/^[a-f0-9]{40}(?:[a-f0-9]{24})?$/u.test(sha)) {
113
+ throw new LiveFailure('scope-mismatch', 'A check request requires a verified commit SHA.');
114
+ }
115
+ this.shas.add(sha);
116
+ }
117
+ remaining() {
118
+ if (this.deadlineFailure)
119
+ throw this.deadlineFailure;
120
+ const elapsed = Math.max(this.now().getTime() - this.clockStart, performance.now() - this.monotonicStart);
121
+ const remaining = assessmentLimits.liveDeadlineMs - elapsed;
122
+ if (!Number.isFinite(remaining) || remaining <= 0) {
123
+ throw this.expireDeadline();
124
+ }
125
+ return Math.max(1, Math.floor(remaining));
126
+ }
127
+ expireDeadline() {
128
+ this.deadlineFailure ??= new LiveFailure('deadline', 'The live collection deadline was reached; remaining proof was not collected.');
129
+ for (const controller of this.active)
130
+ controller.abort(this.deadlineFailure);
131
+ return this.deadlineFailure;
132
+ }
133
+ githubUrl(action, selector) {
134
+ const repository = this.scope.repository;
135
+ if (!repository || (action !== 'repository' && !this.verified)) {
136
+ throw new LiveFailure('unverified-scope', 'Repository identity must be verified before dependent reads.');
137
+ }
138
+ const root = `/repos/${repository.owner}/${repository.name}`;
139
+ const runner = this.scope.runner;
140
+ let pathname;
141
+ switch (action) {
142
+ case 'repository':
143
+ pathname = root;
144
+ break;
145
+ case 'actions-app':
146
+ pathname = '/apps/github-actions';
147
+ break;
148
+ case 'rulesets':
149
+ pathname = `${root}/rulesets`;
150
+ break;
151
+ case 'ruleset':
152
+ if (typeof selector !== 'number' || !Number.isSafeInteger(selector) || selector < 1) {
153
+ throw new LiveFailure('unsafe-scope', 'A ruleset read requires an observed numeric ruleset ID.');
154
+ }
155
+ pathname = `${root}/rulesets/${selector}`;
156
+ break;
157
+ case 'branch':
158
+ case 'protection':
159
+ case 'branch-rules':
160
+ if (typeof selector !== 'string' || !this.scope.refs.includes(selector)) {
161
+ throw new LiveFailure('unsafe-scope', 'The requested branch was not in the validated scope.');
162
+ }
163
+ pathname = action === 'branch-rules'
164
+ ? `${root}/rules/branches/${encodeURIComponent(selector)}`
165
+ : `${root}/branches/${encodeURIComponent(selector)}${action === 'protection' ? '/protection' : ''}`;
166
+ break;
167
+ case 'checks':
168
+ if (typeof selector !== 'string' || !this.shas.has(selector)) {
169
+ throw new LiveFailure('unverified-scope', 'Checks must be requested for an observed commit SHA.');
170
+ }
171
+ pathname = `${root}/commits/${selector}/check-runs`;
172
+ break;
173
+ case 'environments':
174
+ pathname = `${root}/environments`;
175
+ break;
176
+ case 'environment-policies':
177
+ if (typeof selector !== 'string' || !this.scope.environments.includes(selector)) {
178
+ throw new LiveFailure('unsafe-scope', 'The environment was not in the validated scope.');
179
+ }
180
+ pathname = `${root}/environments/${encodeURIComponent(selector)}/deployment-branch-policies`;
181
+ break;
182
+ case 'workflows':
183
+ pathname = `${root}/actions/workflows`;
184
+ break;
185
+ case 'runner':
186
+ case 'runner-group':
187
+ case 'runner-assignment':
188
+ case 'runner-network':
189
+ if (!runner || runner.organization.toLowerCase() !== repository.owner.toLowerCase() ||
190
+ !Number.isSafeInteger(runner.runnerId) || runner.runnerId <= 0 ||
191
+ !Number.isSafeInteger(runner.groupId) || Number(runner.groupId) <= 0 ||
192
+ typeof runner.networkConfigurationId !== 'string' || !/^[A-Za-z0-9_-]{1,128}$/u.test(runner.networkConfigurationId)) {
193
+ throw new LiveFailure('unsafe-scope', 'Exact runner, group, network and repository bindings are required.');
194
+ }
195
+ pathname = action === 'runner' ? `/orgs/${repository.owner}/actions/hosted-runners/${runner.runnerId}`
196
+ : action === 'runner-group' ? `/orgs/${repository.owner}/actions/runner-groups/${runner.groupId}`
197
+ : action === 'runner-network' ? `/orgs/${repository.owner}/settings/network-configurations/${runner.networkConfigurationId}`
198
+ : `/orgs/${repository.owner}/actions/runner-groups`;
199
+ break;
200
+ default: throw new LiveFailure('unsafe-action', 'The requested action is not an allowlisted live read.');
201
+ }
202
+ const url = new URL(pathname, githubApiOrigin);
203
+ if (action === 'rulesets' || action === 'ruleset')
204
+ url.searchParams.set('includes_parents', 'true');
205
+ if (action === 'checks')
206
+ url.searchParams.set('filter', 'latest');
207
+ if (action === 'runner-assignment')
208
+ url.searchParams.set('visible_to_repository', repository.name);
209
+ return url;
210
+ }
211
+ async github(action, selector) {
212
+ const response = await this.getGitHub(this.githubUrl(action, selector));
213
+ if (response.headers.has('link')) {
214
+ throw new LiveFailure('incomplete-pagination', 'A single-object read unexpectedly returned pagination.');
215
+ }
216
+ return response.value;
217
+ }
218
+ async pages(action, field, normalize, selector) {
219
+ const base = this.githubUrl(action, selector);
220
+ base.searchParams.set('per_page', String(pageSize));
221
+ base.searchParams.set('page', '1');
222
+ let current = base;
223
+ let expectedTotal;
224
+ let expectedLast;
225
+ let terminalProbe = false;
226
+ let bytes = 0;
227
+ const rows = [];
228
+ const keys = new Set();
229
+ for (let page = 1; page <= assessmentLimits.maxPages; page += 1) {
230
+ const response = await this.getGitHub(current);
231
+ const container = response.value;
232
+ if (isRecord(container) && (container.incomplete_results === true || container.truncated === true ||
233
+ container.nextLink !== undefined || container['@odata.nextLink'] !== undefined)) {
234
+ throw new LiveFailure('incomplete-pagination', 'The provider marked the inventory incomplete or supplied unsupported continuation metadata.');
235
+ }
236
+ const entries = field === null ? container : isRecord(container) ? container[field] : undefined;
237
+ if (!Array.isArray(entries) || entries.length > pageSize) {
238
+ throw new LiveFailure('invalid-page', 'The provider returned an invalid inventory page.');
239
+ }
240
+ if (field !== null) {
241
+ const count = isRecord(container) ? container.total_count : undefined;
242
+ if (!Number.isSafeInteger(count) || Number(count) < 0) {
243
+ throw new LiveFailure('invalid-page', 'The inventory page did not provide a valid total count.');
244
+ }
245
+ if (expectedTotal !== undefined && expectedTotal !== count) {
246
+ throw new LiveFailure('incomplete-pagination', 'The inventory changed while its pages were being read.');
247
+ }
248
+ expectedTotal = Number(count);
249
+ if (expectedTotal > assessmentLimits.maxPages * pageSize) {
250
+ throw new LiveFailure('page-limit', 'The inventory exceeds the release-owned page limit.');
251
+ }
252
+ }
253
+ for (const entry of entries) {
254
+ const normalized = normalize(entry);
255
+ if (keys.has(normalized.key)) {
256
+ throw new LiveFailure('incomplete-pagination', 'The inventory repeated an entry across pages.');
257
+ }
258
+ keys.add(normalized.key);
259
+ bytes += Buffer.byteLength(JSON.stringify(normalized.value));
260
+ if (bytes > assessmentLimits.responseBytes) {
261
+ throw new LiveFailure('size-limit', 'Normalized inventory metadata exceeded the byte limit.');
262
+ }
263
+ rows.push(normalized.value);
264
+ }
265
+ if (expectedTotal !== undefined && rows.length > expectedTotal) {
266
+ throw new LiveFailure('incomplete-pagination', 'The inventory exceeded its declared total count.');
267
+ }
268
+ const link = response.headers.get('link');
269
+ const { next, last } = link === undefined ? { next: null, last: undefined }
270
+ : this.nextPage(link, base, page, terminalProbe && entries.length === 0);
271
+ if (last !== undefined) {
272
+ if (expectedLast !== undefined && expectedLast !== last) {
273
+ throw new LiveFailure('incomplete-pagination', 'The advertised final inventory page changed during collection.');
274
+ }
275
+ expectedLast = last;
276
+ if (last > assessmentLimits.maxPages) {
277
+ throw new LiveFailure('page-limit', 'The advertised inventory exceeds the release-owned page limit.');
278
+ }
279
+ }
280
+ if (expectedLast !== undefined) {
281
+ if (terminalProbe && entries.length === 0 && page === expectedLast + 1 && next === null)
282
+ return rows;
283
+ if (page > expectedLast || (page < expectedLast && next === null) || (page === expectedLast && next !== null)) {
284
+ throw new LiveFailure('incomplete-pagination', 'Inventory continuation metadata contradicted the advertised final page.');
285
+ }
286
+ }
287
+ if (next !== null) {
288
+ if (entries.length === 0 || (expectedTotal !== undefined && rows.length >= expectedTotal)) {
289
+ throw new LiveFailure('incomplete-pagination', 'The inventory returned inconsistent continuation metadata.');
290
+ }
291
+ current = next;
292
+ terminalProbe = false;
293
+ }
294
+ else {
295
+ if (expectedTotal !== undefined) {
296
+ if (rows.length !== expectedTotal) {
297
+ throw new LiveFailure('incomplete-pagination', 'The inventory ended before its declared total count.');
298
+ }
299
+ return rows;
300
+ }
301
+ if (entries.length < pageSize || page === expectedLast)
302
+ return rows;
303
+ // Bare-array APIs have no total: an exactly full last page needs a terminal read.
304
+ current = new URL(base);
305
+ current.searchParams.set('page', String(page + 1));
306
+ terminalProbe = true;
307
+ }
308
+ }
309
+ throw new LiveFailure('page-limit', 'The inventory could not be completed within the page limit.');
310
+ }
311
+ nextPage(link, base, currentPage, emptyTerminalProbe) {
312
+ let next = null;
313
+ let last;
314
+ const relations = new Set();
315
+ for (const item of link.split(',')) {
316
+ const match = /^\s*<([^<>]+)>;\s*rel="(next|prev|first|last)"\s*$/u.exec(item);
317
+ if (!match || relations.has(match[2])) {
318
+ throw new LiveFailure('unsafe-continuation', 'The provider supplied an invalid or ambiguous continuation link.');
319
+ }
320
+ relations.add(match[2]);
321
+ let url;
322
+ try {
323
+ url = new URL(match[1]);
324
+ }
325
+ catch {
326
+ throw new LiveFailure('unsafe-continuation', 'The provider supplied an invalid continuation URL.');
327
+ }
328
+ if (match[1].split('?')[0] !== `${githubApiOrigin}${base.pathname}` ||
329
+ url.origin !== githubApiOrigin || url.username || url.password || url.hash || url.pathname !== base.pathname) {
330
+ throw new LiveFailure('unsafe-continuation', 'A continuation attempted to leave the verified API host or endpoint scope.');
331
+ }
332
+ const params = [...url.searchParams];
333
+ if (new Set(params.map(([key]) => key)).size !== params.length ||
334
+ params.length !== [...base.searchParams].length ||
335
+ params.some(([key, value]) => key !== 'page' && base.searchParams.get(key) !== value) ||
336
+ !/^[1-9]\d*$/u.test(url.searchParams.get('page') ?? '')) {
337
+ throw new LiveFailure('unsafe-continuation', 'A continuation changed the allowlisted query scope.');
338
+ }
339
+ const page = Number(url.searchParams.get('page'));
340
+ if (!Number.isSafeInteger(page) || (match[2] === 'next' && page !== currentPage + 1) ||
341
+ (match[2] === 'prev' && page !== currentPage - 1) || (match[2] === 'first' && page !== 1)) {
342
+ throw new LiveFailure('unsafe-continuation', 'A continuation skipped or repeated an inventory page.');
343
+ }
344
+ if (match[2] === 'next')
345
+ next = url;
346
+ if (match[2] === 'last')
347
+ last = page;
348
+ }
349
+ if (last !== undefined &&
350
+ ((last < currentPage && !(emptyTerminalProbe && last === currentPage - 1 && next === null)) ||
351
+ (last > currentPage && next === null) || (last <= currentPage && next !== null))) {
352
+ throw new LiveFailure('incomplete-pagination', 'The next and final page links were incomplete or contradictory.');
353
+ }
354
+ return { next, last };
355
+ }
356
+ async getGitHub(url) {
357
+ return this.request({
358
+ executable: 'gh',
359
+ args: [
360
+ 'api', '--method', 'GET', '--hostname', githubCliHost,
361
+ '--header', 'Accept: application/vnd.github+json',
362
+ '--header', `X-GitHub-Api-Version: ${githubApiVersion}`, '--include', url.href
363
+ ]
364
+ }, parseGitHub);
365
+ }
366
+ async azure(url) {
367
+ if (!this.verified || !this.azureUrls.has(url) || !url.startsWith(`${armHost}/subscriptions/`)) {
368
+ throw new LiveFailure('unsafe-scope', 'The ARM URL was not an explicitly bound metadata read.');
369
+ }
370
+ return this.request({
371
+ executable: 'az',
372
+ args: ['rest', '--method', 'GET', '--url', url, '--output', 'json', '--only-show-errors']
373
+ }, (stdout) => {
374
+ const value = parseJson(stdout);
375
+ if (isRecord(value) && (value.nextLink !== undefined || value['@odata.nextLink'] !== undefined)) {
376
+ throw new LiveFailure('incomplete-pagination', 'A bound ARM object unexpectedly returned a continuation; it was not followed.');
377
+ }
378
+ return value;
379
+ });
380
+ }
381
+ async request(command, decode) {
382
+ for (let attempt = 0;; attempt += 1) {
383
+ if (this.unavailable.has(command.executable)) {
384
+ throw new LiveFailure('tool-unavailable', 'The required CLI is unavailable; dependent reads were withheld.');
385
+ }
386
+ const remaining = this.remaining();
387
+ const timeoutMs = Math.min(assessmentLimits.requestTimeoutMs, remaining);
388
+ const controller = new AbortController();
389
+ this.active.add(controller);
390
+ const cancellationFailure = () => controller.signal.reason instanceof LiveFailure ? controller.signal.reason
391
+ : new LiveFailure('request-cancelled', 'The scoped read was cancelled.');
392
+ let onAbort;
393
+ const cancelled = new Promise((_, reject) => {
394
+ onAbort = () => reject(cancellationFailure());
395
+ controller.signal.addEventListener('abort', onAbort, { once: true });
396
+ });
397
+ let timer;
398
+ let completed = false;
399
+ try {
400
+ timer = setTimeout(() => {
401
+ if (remaining <= assessmentLimits.requestTimeoutMs)
402
+ this.expireDeadline();
403
+ else
404
+ controller.abort(new LiveFailure('request-timeout', 'The scoped read exceeded its request timeout.', true));
405
+ }, timeoutMs);
406
+ const running = Promise.resolve().then(() => {
407
+ if (controller.signal.aborted)
408
+ throw cancellationFailure();
409
+ this.remaining();
410
+ return this.runner.run(command, {
411
+ stream: false, timeoutMs, maxOutputBytes: assessmentLimits.responseBytes, signal: controller.signal,
412
+ env: {
413
+ GH_HOST: githubCliHost, GH_REPO: '', GH_DEBUG: '', GH_PROMPT_DISABLED: '1',
414
+ GH_NO_UPDATE_NOTIFIER: '1', GH_NO_EXTENSION_UPDATE_NOTIFIER: '1',
415
+ GH_FORCE_TTY: '', NO_COLOR: '1',
416
+ AZURE_CORE_COLLECT_TELEMETRY: 'false', AZURE_CORE_ONLY_SHOW_ERRORS: 'true',
417
+ AZURE_LOGGING_ENABLE_LOG_FILE: 'false', AZURE_EXTENSION_USE_DYNAMIC_INSTALL: 'no'
418
+ }
419
+ });
420
+ }).finally(() => { completed = true; });
421
+ const result = await Promise.race([running, cancelled]);
422
+ if (controller.signal.aborted)
423
+ throw cancellationFailure();
424
+ this.remaining();
425
+ if (result.outputLimitExceeded ||
426
+ Buffer.byteLength(result.stdout) + Buffer.byteLength(result.stderr) > assessmentLimits.responseBytes) {
427
+ throw new LiveFailure('size-limit', 'The provider response exceeded the byte limit; its body was discarded.');
428
+ }
429
+ if (result.timedOut)
430
+ throw new LiveFailure('request-timeout', 'The scoped read exceeded its request timeout.', true);
431
+ if (result.aborted)
432
+ throw new LiveFailure('request-cancelled', 'The scoped read was cancelled.');
433
+ if (result.status !== 0 || result.errorCode) {
434
+ if (command.executable === 'gh' && /^HTTP\/[0-9.]+\s/u.test(result.stdout)) {
435
+ parseGitHub(result.stdout);
436
+ }
437
+ throw httpError(result);
438
+ }
439
+ return decode(result.stdout);
440
+ }
441
+ catch (error) {
442
+ const failure = error instanceof LiveFailure ? error
443
+ : new LiveFailure('transport-failed', 'The read-only transport failed; error details were withheld.');
444
+ if (failure.code === 'tool-unavailable')
445
+ this.unavailable.add(command.executable);
446
+ if (!failure.transient || attempt >= assessmentLimits.retries)
447
+ throw failure;
448
+ this.remaining();
449
+ this.diagnostic({
450
+ code: 'live-retried-request', severity: 'info',
451
+ source: command.executable === 'gh' ? 'github' : 'azure',
452
+ message: 'A transient scoped read failed; the single permitted retry was attempted.'
453
+ });
454
+ }
455
+ finally {
456
+ if (timer !== undefined)
457
+ clearTimeout(timer);
458
+ this.active.delete(controller);
459
+ controller.signal.removeEventListener('abort', onAbort);
460
+ if (!completed && !controller.signal.aborted) {
461
+ controller.abort(new LiveFailure('request-cancelled', 'The scoped read was cancelled.'));
462
+ }
463
+ }
464
+ }
465
+ }
466
+ }
467
+ //# sourceMappingURL=live-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-transport.js","sourceRoot":"","sources":["../../src/governance-assessment/live-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type LiveAssessmentOptions, type LiveAssessmentResult, type LiveAssessmentScope } from './types.js';
2
+ export declare function collectLiveAssessment(scope: LiveAssessmentScope, options?: LiveAssessmentOptions): Promise<LiveAssessmentResult>;