wicked-crew 0.9.0 → 0.9.2
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/dist/api/capture.d.ts +6 -6
- package/dist/api/codebase-archive.d.ts +102 -0
- package/dist/api/codebase-archive.d.ts.map +1 -0
- package/dist/api/codebase-archive.js +299 -0
- package/dist/api/codebase-archive.js.map +1 -0
- package/dist/api/delivery-index.d.ts +3 -1
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +4 -2
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/mcp.d.ts +8 -8
- package/dist/api/routes.d.ts +7 -2
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +70 -11
- package/dist/api/routes.js.map +1 -1
- package/dist/api/server.d.ts +2 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +64 -1
- package/dist/api/server.js.map +1 -1
- package/dist/core/adapter.d.ts +10 -0
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +46 -14
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/ado-deliver-helper.d.ts +22 -0
- package/dist/core/ado-deliver-helper.d.ts.map +1 -0
- package/dist/core/ado-deliver-helper.js +139 -0
- package/dist/core/ado-deliver-helper.js.map +1 -0
- package/dist/core/deliver-credentials.d.ts +88 -0
- package/dist/core/deliver-credentials.d.ts.map +1 -0
- package/dist/core/deliver-credentials.js +231 -0
- package/dist/core/deliver-credentials.js.map +1 -0
- package/dist/core/deliver.d.ts +11 -0
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +108 -4
- package/dist/core/deliver.js.map +1 -1
- package/dist/core/inventory-claim.d.ts +2 -8
- package/dist/core/inventory-claim.d.ts.map +1 -1
- package/dist/core/inventory-claim.js.map +1 -1
- package/dist/projects/routes.d.ts +2 -2
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +2 -0
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/studio/assets/index-BLYKfepE.css +32 -0
- package/dist/studio/assets/{index-B1MYiNq-.js → index-BbXtfDnB.js} +95 -95
- package/dist/studio/editors/wicked-page/editor.json +1 -1
- package/dist/studio/editors/wicked-page/index.html +1 -1
- package/dist/studio/index.html +2 -2
- package/dist/studio/testid-inventory.json +37 -6
- package/endpoint-manifest.json +12 -2
- package/package.json +4 -4
- package/dist/studio/assets/index--O1AdvNx.css +0 -32
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crew#720: the Azure DevOps half of the deliver script — a small node program the script writes
|
|
3
|
+
* into its temp dir and runs with the node that runs crew. It does the three things bash cannot do
|
|
4
|
+
* safely: mint the auth header (an Entra client-credentials token for a service principal, or
|
|
5
|
+
* `Basic base64(":"+PAT)`), compare origin's URLs with the consented repository, and open (or
|
|
6
|
+
* adopt) the pull request through the REST API with a JSON body.
|
|
7
|
+
*
|
|
8
|
+
* Rules it keeps:
|
|
9
|
+
* - credentials are read from the environment only (`CREW_ADO_*` / `AZURE_DEVOPS_EXT_PAT`), and
|
|
10
|
+
* the minted header is written to stdout for the script to capture into an UNEXPORTED shell
|
|
11
|
+
* variable — never to a file, argv or the log;
|
|
12
|
+
* - the `pr` call reads the header from `WICKED_ADO_AUTH`, set one-shot on that one child;
|
|
13
|
+
* - every request uses `redirect: 'manual'`, so the header never follows a redirect to another
|
|
14
|
+
* host, and a 3xx is a failure;
|
|
15
|
+
* - every message is redacted (each secret, its base64 Basic forms, JWTs, Authorization values,
|
|
16
|
+
* URL userinfo) before it is printed.
|
|
17
|
+
*
|
|
18
|
+
* Plain JavaScript in a string on purpose: the script must not depend on where crew's dist lives
|
|
19
|
+
* (a run waits at its gate across a crew upgrade), and the same text is what the tests run.
|
|
20
|
+
*/
|
|
21
|
+
export const ADO_HELPER_JS = String.raw `
|
|
22
|
+
const [, , cmd, ...args] = process.argv;
|
|
23
|
+
const env = process.env;
|
|
24
|
+
const secrets = [];
|
|
25
|
+
const keep = (s) => { if (typeof s === 'string' && s.length >= 4) secrets.push(s); return s; };
|
|
26
|
+
for (const n of ['AZURE_DEVOPS_EXT_PAT', 'CREW_ADO_CLIENT_SECRET', 'WICKED_ADO_AUTH']) keep(env[n]);
|
|
27
|
+
if (env.WICKED_ADO_AUTH) keep(env.WICKED_ADO_AUTH.replace(/^(Basic|Bearer) /, ''));
|
|
28
|
+
function redact(text) {
|
|
29
|
+
let out = String(text ?? '');
|
|
30
|
+
for (const s of secrets) {
|
|
31
|
+
for (const f of [s, Buffer.from(':' + s).toString('base64'), Buffer.from(s).toString('base64')]) out = out.split(f).join('[REDACTED]');
|
|
32
|
+
}
|
|
33
|
+
return out
|
|
34
|
+
.replace(/(authorization\s*:\s*)(basic|bearer)\s+\S+/gi, '$1$2 [REDACTED]')
|
|
35
|
+
.replace(/\beyJ[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]+/g, '[REDACTED-JWT]')
|
|
36
|
+
.replace(/(\b[a-z][a-z0-9+.-]*:\/\/)[^/\s@]+@/gi, '$1[REDACTED]@');
|
|
37
|
+
}
|
|
38
|
+
function fail(msg, code = 3) { process.stderr.write('deliver: ' + redact(msg) + '\n'); process.exit(code); }
|
|
39
|
+
const v = (n) => (typeof env[n] === 'string' ? env[n].trim() : '');
|
|
40
|
+
async function call(url, init) {
|
|
41
|
+
let res;
|
|
42
|
+
try {
|
|
43
|
+
res = await fetch(url, { ...init, redirect: 'manual', signal: AbortSignal.timeout(30000) });
|
|
44
|
+
} catch (e) {
|
|
45
|
+
fail('Azure DevOps request to ' + new URL(url).host + ' failed (' + (e && e.name ? e.name : 'error') + ')');
|
|
46
|
+
}
|
|
47
|
+
const text = await res.text();
|
|
48
|
+
let json = null;
|
|
49
|
+
try { json = JSON.parse(text); } catch {}
|
|
50
|
+
return { status: res.status, ok: res.status >= 200 && res.status < 300, json, text };
|
|
51
|
+
}
|
|
52
|
+
// The canonical form of a remote URL: an Azure DevOps spelling becomes
|
|
53
|
+
// https://dev.azure.com/<org>/<project>/_git/<repo>; anything else loses its userinfo, a trailing
|
|
54
|
+
// slash and .git, and has its scheme and host lowercased. Two URLs name one repository when their
|
|
55
|
+
// canonical forms are equal (case-insensitively: Azure DevOps names are).
|
|
56
|
+
function canon(raw) {
|
|
57
|
+
const s = String(raw).trim();
|
|
58
|
+
const e = (x) => encodeURIComponent(decodeURIComponent(x));
|
|
59
|
+
let m = /^(?:ssh:\/\/)?[^@\/\s]+@(?:ssh\.dev\.azure\.com|vs-ssh\.visualstudio\.com)[:\/]v3\/([^\/]+)\/([^\/]+)\/([^\/]+?)\/?$/i.exec(s);
|
|
60
|
+
if (m) return ('https://dev.azure.com/' + e(m[1]) + '/' + e(m[2]) + '/_git/' + e(m[3].replace(/\.git$/i, ''))).toLowerCase();
|
|
61
|
+
let u;
|
|
62
|
+
try { u = new URL(s); } catch { return null; }
|
|
63
|
+
const host = u.hostname.toLowerCase();
|
|
64
|
+
const segs = u.pathname.split('/').filter(Boolean);
|
|
65
|
+
const g = segs.indexOf('_git');
|
|
66
|
+
if (host === 'dev.azure.com' && g === 2 && segs.length === 4) return ('https://dev.azure.com/' + e(segs[0]) + '/' + e(segs[1]) + '/_git/' + e(segs[3].replace(/\.git$/i, ''))).toLowerCase();
|
|
67
|
+
if (host.endsWith('.visualstudio.com') && g >= 1 && g === segs.length - 2) {
|
|
68
|
+
const rest = segs.slice(0, g).filter((x, i) => !(i === 0 && x.toLowerCase() === 'defaultcollection'));
|
|
69
|
+
if (rest.length !== 1) return null;
|
|
70
|
+
return ('https://dev.azure.com/' + e(host.slice(0, -'.visualstudio.com'.length)) + '/' + e(rest[0]) + '/_git/' + e(segs[g + 1].replace(/\.git$/i, ''))).toLowerCase();
|
|
71
|
+
}
|
|
72
|
+
return (u.protocol + '//' + u.host + u.pathname.replace(/\/+$/, '').replace(/\.git$/i, '')).toLowerCase();
|
|
73
|
+
}
|
|
74
|
+
async function header(loginBase) {
|
|
75
|
+
const tenant = v('CREW_ADO_TENANT_ID'), client = v('CREW_ADO_CLIENT_ID'), secret = v('CREW_ADO_CLIENT_SECRET');
|
|
76
|
+
if (tenant && client && secret) {
|
|
77
|
+
const body = new URLSearchParams({ grant_type: 'client_credentials', client_id: client, client_secret: secret, scope: '499b84ac-1321-427f-aa17-267ca6975798/.default' }).toString();
|
|
78
|
+
const r = await call(loginBase.replace(/\/+$/, '') + '/' + encodeURIComponent(tenant) + '/oauth2/v2.0/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', Accept: 'application/json' }, body });
|
|
79
|
+
const tok = r.json && typeof r.json.access_token === 'string' ? keep(r.json.access_token) : '';
|
|
80
|
+
if (!r.ok || !tok) fail('Entra refused the Azure DevOps service-principal credential (HTTP ' + r.status + (r.json && typeof r.json.error === 'string' ? ', ' + r.json.error : '') + ')');
|
|
81
|
+
return 'Bearer ' + tok;
|
|
82
|
+
}
|
|
83
|
+
const pat = v('AZURE_DEVOPS_EXT_PAT');
|
|
84
|
+
if (pat) return 'Basic ' + keep(Buffer.from(':' + pat).toString('base64'));
|
|
85
|
+
fail('Azure DevOps credentials not configured', 4);
|
|
86
|
+
}
|
|
87
|
+
const API = 'api-version=7.1';
|
|
88
|
+
async function findPr(apiBase, auth, source, target) {
|
|
89
|
+
const q = new URLSearchParams({ 'searchCriteria.sourceRefName': 'refs/heads/' + source, 'searchCriteria.targetRefName': 'refs/heads/' + target, 'searchCriteria.status': 'active' });
|
|
90
|
+
const r = await call(apiBase + '/pullrequests?' + q + '&' + API, { method: 'GET', headers: { Authorization: auth, Accept: 'application/json' } });
|
|
91
|
+
if (!r.ok) return null;
|
|
92
|
+
const list = r.json && Array.isArray(r.json.value) ? r.json.value : [];
|
|
93
|
+
const mine = list.filter((p) => p && p.sourceRefName === 'refs/heads/' + source && p.targetRefName === 'refs/heads/' + target && p.status === 'active' && typeof p.pullRequestId === 'number');
|
|
94
|
+
return mine.length === 1 ? mine[0] : null;
|
|
95
|
+
}
|
|
96
|
+
function fitDescription(body) {
|
|
97
|
+
const MAX = 4000;
|
|
98
|
+
if (body.length <= MAX) return body;
|
|
99
|
+
const note = '\n\n_(description truncated to Azure DevOps\' 4000-character limit)_';
|
|
100
|
+
const tail = body.slice(-600);
|
|
101
|
+
return body.slice(0, MAX - tail.length - note.length) + note + tail;
|
|
102
|
+
}
|
|
103
|
+
async function pr(apiBase, webUrl, source, target, titleFile, bodyFile) {
|
|
104
|
+
const fs = await import('node:fs');
|
|
105
|
+
const auth = env.WICKED_ADO_AUTH || '';
|
|
106
|
+
if (!auth) fail('no Azure DevOps auth header was handed to the pull-request step');
|
|
107
|
+
let title = fs.readFileSync(titleFile, 'utf8').replace(/\n+$/, '');
|
|
108
|
+
if (title.length > 400) title = title.slice(0, 399) + '…';
|
|
109
|
+
const description = fitDescription(fs.readFileSync(bodyFile, 'utf8'));
|
|
110
|
+
const r = await call(apiBase + '/pullrequests?' + API, {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
headers: { Authorization: auth, 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
113
|
+
body: JSON.stringify({ sourceRefName: 'refs/heads/' + source, targetRefName: 'refs/heads/' + target, title, description }),
|
|
114
|
+
});
|
|
115
|
+
if (r.ok && r.json && typeof r.json.pullRequestId === 'number') {
|
|
116
|
+
process.stdout.write(webUrl + '/pullrequest/' + r.json.pullRequestId + '\n');
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
// A PR for this branch pair may already exist (a retry after the push landed, a rework): adopt
|
|
120
|
+
// it only when exactly one ACTIVE PR has this source AND target branch.
|
|
121
|
+
const existing = await findPr(apiBase, auth, source, target);
|
|
122
|
+
if (existing) {
|
|
123
|
+
process.stdout.write('deliver: ADO-PR-EXISTS ' + webUrl + '/pullrequest/' + existing.pullRequestId + '\n');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const why = r.json && typeof r.json.message === 'string' ? r.json.message : r.text.slice(0, 300);
|
|
127
|
+
fail('Azure DevOps refused the pull request (HTTP ' + r.status + '): ' + why);
|
|
128
|
+
}
|
|
129
|
+
(async () => {
|
|
130
|
+
if (cmd === 'header') process.stdout.write((await header(args[0])) + '\n');
|
|
131
|
+
else if (cmd === 'same') {
|
|
132
|
+
const want = canon(args[0]);
|
|
133
|
+
const urls = args.slice(1).join('\n').split(/\s+/).filter(Boolean);
|
|
134
|
+
if (!want || urls.length === 0 || urls.some((u) => canon(u) !== want)) process.exit(1);
|
|
135
|
+
} else if (cmd === 'pr') await pr(...args);
|
|
136
|
+
else fail('unknown helper command ' + cmd);
|
|
137
|
+
})().catch((e) => fail(e && e.message ? e.message : String(e)));
|
|
138
|
+
`;
|
|
139
|
+
//# sourceMappingURL=ado-deliver-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ado-deliver-helper.js","sourceRoot":"","sources":["../../src/core/ado-deliver-helper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqHtC,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crew#720: the deliver phase's provider credentials — ONE preflight shape for GitHub and Azure
|
|
3
|
+
* DevOps — and the Azure DevOps repository a remote URL names.
|
|
4
|
+
*
|
|
5
|
+
* Only PRESENCE is read here, never a value: the credential stays in the daemon's environment
|
|
6
|
+
* (or gh's keyring) and is consumed by the deliver script alone, inside the deliver phase (the
|
|
7
|
+
* engine strips every forge credential from worker seats, wicked-core#671).
|
|
8
|
+
*
|
|
9
|
+
* The same check runs twice: at launch (so the deliver gate card says "<provider> credentials not
|
|
10
|
+
* configured" BEFORE approval, and `GET /repos/:id/deliver-target` reports it) and in the deliver
|
|
11
|
+
* script itself before anything is staged, whose refusal parks the run at the engine's
|
|
12
|
+
* deliver-refusal gate with the work kept ({@link DELIVER_CREDENTIALS_MISSING_MARKER}).
|
|
13
|
+
*/
|
|
14
|
+
/** The forge a delivery goes to. `null` from {@link deliverProviderOf} = neither (a local path,
|
|
15
|
+
* GitLab, Gitea, …): the push-only path, which needs no provider credential of crew's. */
|
|
16
|
+
export type DeliverProvider = 'github' | 'azure_devops';
|
|
17
|
+
/** api-types `DeliverCredentials` (crew#720) — the one preflight shape every provider shares. */
|
|
18
|
+
export interface DeliverCredentials {
|
|
19
|
+
provider: DeliverProvider;
|
|
20
|
+
/** `unknown` = the probe could not answer (gh timed out); never read as `missing`. */
|
|
21
|
+
status: 'configured' | 'missing' | 'unknown';
|
|
22
|
+
/** Where the credential comes from when configured; `null` otherwise. */
|
|
23
|
+
source: 'gh_token' | 'gh_login' | 'service_principal' | 'pat' | null;
|
|
24
|
+
/** What to set when `missing`, in the order the phase tries them (env var names, commands). */
|
|
25
|
+
missing: string[];
|
|
26
|
+
/** One sentence for the gate card and the run record. */
|
|
27
|
+
message: string;
|
|
28
|
+
}
|
|
29
|
+
/** The env var names the Azure DevOps delivery reads (service principal first, then the PAT). */
|
|
30
|
+
export declare const ADO_SP_ENV: readonly ["CREW_ADO_TENANT_ID", "CREW_ADO_CLIENT_ID", "CREW_ADO_CLIENT_SECRET"];
|
|
31
|
+
export declare const ADO_PAT_ENV = "AZURE_DEVOPS_EXT_PAT";
|
|
32
|
+
/**
|
|
33
|
+
* The line the deliver script prints when the provider credential is absent:
|
|
34
|
+
* `deliver: CREDENTIALS-MISSING <provider>` — before anything is staged, followed by the
|
|
35
|
+
* push-refused marker so the engine parks the run at its deliver-refusal gate.
|
|
36
|
+
*/
|
|
37
|
+
export declare const DELIVER_CREDENTIALS_MISSING_MARKER = "deliver: CREDENTIALS-MISSING";
|
|
38
|
+
/** The Azure DevOps credential the daemon environment holds (presence only). */
|
|
39
|
+
export declare function adoCredentials(env?: NodeJS.ProcessEnv): DeliverCredentials;
|
|
40
|
+
/**
|
|
41
|
+
* The GitHub credential: an exported `GH_TOKEN`, else a gh login for github.com. `logins` is
|
|
42
|
+
* `gh auth status`'s answer — `[]` = gh answered with no login, `'absent'` = gh is not installed,
|
|
43
|
+
* `null` = the probe could not answer (unknown, never missing).
|
|
44
|
+
*/
|
|
45
|
+
export declare function githubCredentials(env: NodeJS.ProcessEnv, logins: readonly string[] | 'absent' | null): DeliverCredentials;
|
|
46
|
+
/** The Azure DevOps repository a remote URL names. */
|
|
47
|
+
export interface AdoRepo {
|
|
48
|
+
org: string;
|
|
49
|
+
project: string;
|
|
50
|
+
repo: string;
|
|
51
|
+
/** The canonical https git URL every authenticated fetch/push goes to. */
|
|
52
|
+
gitUrl: string;
|
|
53
|
+
/** `…/_apis/git/repositories/<repo>` — the REST base for pull requests. */
|
|
54
|
+
apiBase: string;
|
|
55
|
+
/** The repository's web URL; a PR is `<webUrl>/pullrequest/<id>`. */
|
|
56
|
+
webUrl: string;
|
|
57
|
+
/** The Entra token authority (service-principal mint). */
|
|
58
|
+
loginBase: string;
|
|
59
|
+
}
|
|
60
|
+
/** Is `host` an Azure DevOps host (`dev.azure.com`, `ssh.dev.azure.com`, `*.visualstudio.com`)? */
|
|
61
|
+
export declare function isAdoHost(host: string | null): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* The Azure DevOps repository of a remote URL, or `null`. Accepts the four spellings Azure DevOps
|
|
64
|
+
* hands out — `https://[user@]dev.azure.com/<org>/<project>/_git/<repo>`,
|
|
65
|
+
* `https://<org>.visualstudio.com/[DefaultCollection/]<project>/_git/<repo>`,
|
|
66
|
+
* `git@ssh.dev.azure.com:v3/<org>/<project>/<repo>` and
|
|
67
|
+
* `<org>@vs-ssh.visualstudio.com:v3/<org>/<project>/<repo>` — and nothing looser. Userinfo is
|
|
68
|
+
* never kept. Every part is percent-decoded once and re-encoded, so the canonical URL is stable.
|
|
69
|
+
*/
|
|
70
|
+
export declare function adoRepoOf(url: string | null | undefined): AdoRepo | null;
|
|
71
|
+
/** The provider a delivery to `originUrl` uses, or `null` (push-only / local / unknown). */
|
|
72
|
+
export declare function deliverProviderOf(originUrl: string | null | undefined): DeliverProvider | null;
|
|
73
|
+
/** The credential preflight a deliver card shows for an origin; `null` when no provider applies. */
|
|
74
|
+
export declare function deliverCredentialsFor(originUrl: string | null | undefined, env: NodeJS.ProcessEnv, ghLogins: readonly string[] | 'absent' | null): DeliverCredentials | null;
|
|
75
|
+
/** `deliver: CREDENTIALS-MISSING <provider>` in a deliver transcript → that provider, else `null`.
|
|
76
|
+
* The LAST such line decides; the script prints it before anything reaches the remote. */
|
|
77
|
+
export declare function credentialsMissingIn(text: string): DeliverProvider | null;
|
|
78
|
+
/**
|
|
79
|
+
* {@link deliverCredentialsFor} with the gh probe run only when it can matter: a github.com origin
|
|
80
|
+
* with no exported GH_TOKEN (a bounded `gh auth status`, crew#737's probe). gh not installed reads
|
|
81
|
+
* `'absent'`; a probe that timed out reads unknown. Never throws.
|
|
82
|
+
*/
|
|
83
|
+
export declare function deliverCredentialsProbe(originUrl: string | null | undefined, env: NodeJS.ProcessEnv, probe?: () => Promise<string[] | 'absent' | null>): Promise<DeliverCredentials | null>;
|
|
84
|
+
export declare function ghLoginsOrAbsent(): Promise<string[] | 'absent' | null>;
|
|
85
|
+
/** The canonical `missing` reading for a provider — what the run record says after the deliver
|
|
86
|
+
* phase refused for want of the credential (the phase read the environment it ran in). */
|
|
87
|
+
export declare function missingCredentials(provider: DeliverProvider): DeliverCredentials;
|
|
88
|
+
//# sourceMappingURL=deliver-credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliver-credentials.d.ts","sourceRoot":"","sources":["../../src/core/deliver-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;2FAC2F;AAC3F,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC;AAExD,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,eAAe,CAAC;IAC1B,sFAAsF;IACtF,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7C,yEAAyE;IACzE,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,mBAAmB,GAAG,KAAK,GAAG,IAAI,CAAC;IACrE,+FAA+F;IAC/F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,iGAAiG;AACjG,eAAO,MAAM,UAAU,iFAAkF,CAAC;AAC1G,eAAO,MAAM,WAAW,yBAAyB,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,iCAAiC,CAAC;AAOjF,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,kBAAkB,CAiBvF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,GAAG,kBAAkB,CAmBzH;AAED,sDAAsD;AACtD,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAItD;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAsDxE;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAM9F;AAED,oGAAoG;AACpG,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,GAC5C,kBAAkB,GAAG,IAAI,CAK3B;AAED;2FAC2F;AAC3F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAOzE;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,KAAK,GAAE,MAAM,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAoB,GAClE,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAMpC;AAQD,wBAAgB,gBAAgB,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAMtE;AAcD;2FAC2F;AAC3F,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,kBAAkB,CAEhF"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* crew#720: the deliver phase's provider credentials — ONE preflight shape for GitHub and Azure
|
|
3
|
+
* DevOps — and the Azure DevOps repository a remote URL names.
|
|
4
|
+
*
|
|
5
|
+
* Only PRESENCE is read here, never a value: the credential stays in the daemon's environment
|
|
6
|
+
* (or gh's keyring) and is consumed by the deliver script alone, inside the deliver phase (the
|
|
7
|
+
* engine strips every forge credential from worker seats, wicked-core#671).
|
|
8
|
+
*
|
|
9
|
+
* The same check runs twice: at launch (so the deliver gate card says "<provider> credentials not
|
|
10
|
+
* configured" BEFORE approval, and `GET /repos/:id/deliver-target` reports it) and in the deliver
|
|
11
|
+
* script itself before anything is staged, whose refusal parks the run at the engine's
|
|
12
|
+
* deliver-refusal gate with the work kept ({@link DELIVER_CREDENTIALS_MISSING_MARKER}).
|
|
13
|
+
*/
|
|
14
|
+
// A function-only import (no module-evaluation use), so the cycle with deliver.ts is inert.
|
|
15
|
+
import { execFile } from 'node:child_process';
|
|
16
|
+
import { originRemoteHost, parseGhAuthStatusLogins } from './deliver.js';
|
|
17
|
+
import { childEnvWithBootEstateDb } from './governance-store.js';
|
|
18
|
+
/** The env var names the Azure DevOps delivery reads (service principal first, then the PAT). */
|
|
19
|
+
export const ADO_SP_ENV = ['CREW_ADO_TENANT_ID', 'CREW_ADO_CLIENT_ID', 'CREW_ADO_CLIENT_SECRET'];
|
|
20
|
+
export const ADO_PAT_ENV = 'AZURE_DEVOPS_EXT_PAT';
|
|
21
|
+
/**
|
|
22
|
+
* The line the deliver script prints when the provider credential is absent:
|
|
23
|
+
* `deliver: CREDENTIALS-MISSING <provider>` — before anything is staged, followed by the
|
|
24
|
+
* push-refused marker so the engine parks the run at its deliver-refusal gate.
|
|
25
|
+
*/
|
|
26
|
+
export const DELIVER_CREDENTIALS_MISSING_MARKER = 'deliver: CREDENTIALS-MISSING';
|
|
27
|
+
function present(env, name) {
|
|
28
|
+
const v = env[name];
|
|
29
|
+
return typeof v === 'string' && v.trim() !== '';
|
|
30
|
+
}
|
|
31
|
+
/** The Azure DevOps credential the daemon environment holds (presence only). */
|
|
32
|
+
export function adoCredentials(env = process.env) {
|
|
33
|
+
if (ADO_SP_ENV.every((n) => present(env, n))) {
|
|
34
|
+
return { provider: 'azure_devops', status: 'configured', source: 'service_principal', missing: [], message: 'Azure DevOps credentials: the service principal (CREW_ADO_TENANT_ID / CREW_ADO_CLIENT_ID / CREW_ADO_CLIENT_SECRET).' };
|
|
35
|
+
}
|
|
36
|
+
if (present(env, ADO_PAT_ENV)) {
|
|
37
|
+
return { provider: 'azure_devops', status: 'configured', source: 'pat', missing: [], message: `Azure DevOps credentials: a personal access token (${ADO_PAT_ENV}).` };
|
|
38
|
+
}
|
|
39
|
+
const spMissing = ADO_SP_ENV.filter((n) => !present(env, n));
|
|
40
|
+
return {
|
|
41
|
+
provider: 'azure_devops',
|
|
42
|
+
status: 'missing',
|
|
43
|
+
source: null,
|
|
44
|
+
missing: [...spMissing, ADO_PAT_ENV],
|
|
45
|
+
message: `Azure DevOps credentials not configured: set ${ADO_SP_ENV.join(', ')} (a service principal) or ${ADO_PAT_ENV} ` +
|
|
46
|
+
"in the daemon's environment and restart it. The deliver phase refuses before anything is staged and the run waits at the deliver gate with its work kept.",
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The GitHub credential: an exported `GH_TOKEN`, else a gh login for github.com. `logins` is
|
|
51
|
+
* `gh auth status`'s answer — `[]` = gh answered with no login, `'absent'` = gh is not installed,
|
|
52
|
+
* `null` = the probe could not answer (unknown, never missing).
|
|
53
|
+
*/
|
|
54
|
+
export function githubCredentials(env, logins) {
|
|
55
|
+
if (present(env, 'GH_TOKEN')) {
|
|
56
|
+
return { provider: 'github', status: 'configured', source: 'gh_token', missing: [], message: 'GitHub credentials: GH_TOKEN in the daemon environment.' };
|
|
57
|
+
}
|
|
58
|
+
if (logins === null) {
|
|
59
|
+
return { provider: 'github', status: 'unknown', source: null, missing: [], message: 'GitHub credentials: gh did not answer in time; the deliver phase checks again before it stages anything.' };
|
|
60
|
+
}
|
|
61
|
+
if (logins !== 'absent' && logins.length > 0) {
|
|
62
|
+
return { provider: 'github', status: 'configured', source: 'gh_login', missing: [], message: `GitHub credentials: gh is signed in to github.com (${logins.join(', ')}).` };
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
provider: 'github',
|
|
66
|
+
status: 'missing',
|
|
67
|
+
source: null,
|
|
68
|
+
missing: ['gh auth login', 'GH_TOKEN'],
|
|
69
|
+
message: `GitHub credentials not configured: ${logins === 'absent' ? 'gh is not installed and ' : 'gh is not signed in to github.com and '}no GH_TOKEN is exported. ` +
|
|
70
|
+
"Run `gh auth login` on this machine or export GH_TOKEN in the daemon's environment. The deliver phase refuses before anything is staged and the run waits at the deliver gate with its work kept.",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const ADO_PART = /^[A-Za-z0-9._~%() -]+$/;
|
|
74
|
+
/** Is `host` an Azure DevOps host (`dev.azure.com`, `ssh.dev.azure.com`, `*.visualstudio.com`)? */
|
|
75
|
+
export function isAdoHost(host) {
|
|
76
|
+
if (host === null)
|
|
77
|
+
return false;
|
|
78
|
+
const h = host.toLowerCase();
|
|
79
|
+
return h === 'dev.azure.com' || h === 'ssh.dev.azure.com' || h === 'visualstudio.com' || h.endsWith('.visualstudio.com');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The Azure DevOps repository of a remote URL, or `null`. Accepts the four spellings Azure DevOps
|
|
83
|
+
* hands out — `https://[user@]dev.azure.com/<org>/<project>/_git/<repo>`,
|
|
84
|
+
* `https://<org>.visualstudio.com/[DefaultCollection/]<project>/_git/<repo>`,
|
|
85
|
+
* `git@ssh.dev.azure.com:v3/<org>/<project>/<repo>` and
|
|
86
|
+
* `<org>@vs-ssh.visualstudio.com:v3/<org>/<project>/<repo>` — and nothing looser. Userinfo is
|
|
87
|
+
* never kept. Every part is percent-decoded once and re-encoded, so the canonical URL is stable.
|
|
88
|
+
*/
|
|
89
|
+
export function adoRepoOf(url) {
|
|
90
|
+
const raw = (url ?? '').trim();
|
|
91
|
+
if (raw === '' || !isAdoHost(originRemoteHost(raw)))
|
|
92
|
+
return null;
|
|
93
|
+
let org;
|
|
94
|
+
let project;
|
|
95
|
+
let repo;
|
|
96
|
+
const dec = (s) => {
|
|
97
|
+
try {
|
|
98
|
+
return decodeURIComponent(s);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
const ssh = /^(?:ssh:\/\/)?[^@/\s]+@(?:ssh\.dev\.azure\.com|vs-ssh\.visualstudio\.com)[:/](?:v3\/)([^/]+)\/([^/]+)\/([^/]+?)\/?$/i.exec(raw);
|
|
105
|
+
if (ssh !== null) {
|
|
106
|
+
[org, project, repo] = [ssh[1], ssh[2], ssh[3]];
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
let u;
|
|
110
|
+
try {
|
|
111
|
+
u = new URL(raw);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
if (u.protocol !== 'https:')
|
|
117
|
+
return null;
|
|
118
|
+
const host = u.hostname.toLowerCase();
|
|
119
|
+
const segs = u.pathname.split('/').filter((x) => x !== '');
|
|
120
|
+
const gitAt = segs.indexOf('_git');
|
|
121
|
+
if (gitAt < 0 || gitAt !== segs.length - 2)
|
|
122
|
+
return null;
|
|
123
|
+
if (host === 'dev.azure.com') {
|
|
124
|
+
if (gitAt !== 2)
|
|
125
|
+
return null;
|
|
126
|
+
[org, project, repo] = [segs[0], segs[1], segs[3]];
|
|
127
|
+
}
|
|
128
|
+
else if (host.endsWith('.visualstudio.com')) {
|
|
129
|
+
org = host.slice(0, -'.visualstudio.com'.length);
|
|
130
|
+
const rest = segs.slice(0, gitAt).filter((s, i) => !(i === 0 && s.toLowerCase() === 'defaultcollection'));
|
|
131
|
+
if (rest.length !== 1)
|
|
132
|
+
return null;
|
|
133
|
+
[project, repo] = [rest[0], segs[gitAt + 1]];
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const parts = [org, project, repo.replace(/\.git$/i, '')].map(dec);
|
|
140
|
+
if (parts.some((p) => p === null || p === '' || !ADO_PART.test(p)))
|
|
141
|
+
return null;
|
|
142
|
+
const [o, p, r] = parts;
|
|
143
|
+
const e = encodeURIComponent;
|
|
144
|
+
const webUrl = `https://dev.azure.com/${e(o)}/${e(p)}/_git/${e(r)}`;
|
|
145
|
+
return {
|
|
146
|
+
org: o,
|
|
147
|
+
project: p,
|
|
148
|
+
repo: r,
|
|
149
|
+
gitUrl: webUrl,
|
|
150
|
+
apiBase: `https://dev.azure.com/${e(o)}/${e(p)}/_apis/git/repositories/${e(r)}`,
|
|
151
|
+
webUrl,
|
|
152
|
+
loginBase: 'https://login.microsoftonline.com',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** The provider a delivery to `originUrl` uses, or `null` (push-only / local / unknown). */
|
|
156
|
+
export function deliverProviderOf(originUrl) {
|
|
157
|
+
const host = originRemoteHost((originUrl ?? '').trim());
|
|
158
|
+
if (host === null)
|
|
159
|
+
return null;
|
|
160
|
+
if (host === 'github.com' || host === 'ssh.github.com')
|
|
161
|
+
return 'github';
|
|
162
|
+
if (adoRepoOf(originUrl) !== null)
|
|
163
|
+
return 'azure_devops';
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
/** The credential preflight a deliver card shows for an origin; `null` when no provider applies. */
|
|
167
|
+
export function deliverCredentialsFor(originUrl, env, ghLogins) {
|
|
168
|
+
const provider = deliverProviderOf(originUrl);
|
|
169
|
+
if (provider === 'azure_devops')
|
|
170
|
+
return adoCredentials(env);
|
|
171
|
+
if (provider === 'github')
|
|
172
|
+
return githubCredentials(env, ghLogins);
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
/** `deliver: CREDENTIALS-MISSING <provider>` in a deliver transcript → that provider, else `null`.
|
|
176
|
+
* The LAST such line decides; the script prints it before anything reaches the remote. */
|
|
177
|
+
export function credentialsMissingIn(text) {
|
|
178
|
+
let found = null;
|
|
179
|
+
for (const line of text.split('\n')) {
|
|
180
|
+
const m = /^deliver: CREDENTIALS-MISSING (github|azure_devops)\b/.exec(line.trim());
|
|
181
|
+
if (m !== null)
|
|
182
|
+
found = m[1];
|
|
183
|
+
}
|
|
184
|
+
return found;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* {@link deliverCredentialsFor} with the gh probe run only when it can matter: a github.com origin
|
|
188
|
+
* with no exported GH_TOKEN (a bounded `gh auth status`, crew#737's probe). gh not installed reads
|
|
189
|
+
* `'absent'`; a probe that timed out reads unknown. Never throws.
|
|
190
|
+
*/
|
|
191
|
+
export async function deliverCredentialsProbe(originUrl, env, probe = ghLoginsOrAbsent) {
|
|
192
|
+
const provider = deliverProviderOf(originUrl);
|
|
193
|
+
if (provider === null)
|
|
194
|
+
return null;
|
|
195
|
+
if (provider === 'azure_devops' || present(env, 'GH_TOKEN'))
|
|
196
|
+
return deliverCredentialsFor(originUrl, env, null);
|
|
197
|
+
const logins = await probe().catch(() => null);
|
|
198
|
+
return deliverCredentialsFor(originUrl, env, logins);
|
|
199
|
+
}
|
|
200
|
+
/** `gh auth status --hostname github.com` → the logins, `'absent'` when gh is not installed (spawn
|
|
201
|
+
* ENOENT), `null` when it could not answer. Bounded to 4 s; one answer serves 30 s. */
|
|
202
|
+
let ghMemo = null;
|
|
203
|
+
/** How long one gh answer serves the launch composer and the gate card (a sign-in is rare). */
|
|
204
|
+
const GH_MEMO_MS = 30_000;
|
|
205
|
+
export function ghLoginsOrAbsent() {
|
|
206
|
+
const now = Date.now();
|
|
207
|
+
if (ghMemo !== null && now - ghMemo.at < GH_MEMO_MS)
|
|
208
|
+
return ghMemo.value;
|
|
209
|
+
const value = ghLoginsUncached();
|
|
210
|
+
ghMemo = { at: now, value };
|
|
211
|
+
return value;
|
|
212
|
+
}
|
|
213
|
+
function ghLoginsUncached() {
|
|
214
|
+
return new Promise((resolve) => {
|
|
215
|
+
execFile('gh', ['auth', 'status', '--hostname', 'github.com'], { timeout: 4_000, encoding: 'utf8', env: childEnvWithBootEstateDb(process.env) }, (err, stdout, stderr) => {
|
|
216
|
+
const code = err?.code;
|
|
217
|
+
if (code === 'ENOENT')
|
|
218
|
+
return resolve('absent');
|
|
219
|
+
// A non-numeric code (a timeout kill, another spawn failure) is no answer at all.
|
|
220
|
+
if (err !== null && typeof code !== 'number')
|
|
221
|
+
return resolve(null);
|
|
222
|
+
resolve(parseGhAuthStatusLogins(`${String(stdout ?? '')}\n${String(stderr ?? '')}`));
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
/** The canonical `missing` reading for a provider — what the run record says after the deliver
|
|
227
|
+
* phase refused for want of the credential (the phase read the environment it ran in). */
|
|
228
|
+
export function missingCredentials(provider) {
|
|
229
|
+
return provider === 'azure_devops' ? adoCredentials({}) : githubCredentials({}, []);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=deliver-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliver-credentials.js","sourceRoot":"","sources":["../../src/core/deliver-credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/core/deliver.d.ts
CHANGED
|
@@ -84,6 +84,7 @@
|
|
|
84
84
|
* {@link deliverPrPhase}.
|
|
85
85
|
*/
|
|
86
86
|
import type { PhaseDef, WorkflowDef } from './types.js';
|
|
87
|
+
import { type AdoRepo, type DeliverCredentials } from './deliver-credentials.js';
|
|
87
88
|
import { type DeliverTextFacts } from './deliver-text.js';
|
|
88
89
|
/**
|
|
89
90
|
* The content-address of wicked-core's built-in evidence floor (`builtin_floors::EVIDENCE_FLOOR_PIN`,
|
|
@@ -213,6 +214,12 @@ export interface DeliverScriptOptions {
|
|
|
213
214
|
/** (crew#739) The sentinel nonce (16-64 hex digits). Absent ⇒ a fresh one per composition; a
|
|
214
215
|
* test passes one to read the sentinel deterministically. Refused at compose time otherwise. */
|
|
215
216
|
nonce?: string;
|
|
217
|
+
/** (crew#720) The Azure DevOps repository this delivery goes to. Absent ⇒ derived from
|
|
218
|
+
* `originUrl` ({@link adoRepoOf}); a test passes one to point the push and the REST calls at a
|
|
219
|
+
* local git server and a mocked API. `null` ⇒ not an Azure DevOps delivery. */
|
|
220
|
+
adoTarget?: AdoRepo | null;
|
|
221
|
+
/** (crew#720) The provider credential preflight read at compose time, for the gate card. */
|
|
222
|
+
credentials?: DeliverCredentials | null;
|
|
216
223
|
}
|
|
217
224
|
/**
|
|
218
225
|
* (crew#737) The configured push identity for a launch on `repoRef`: the repository's own pin
|
|
@@ -473,6 +480,8 @@ export interface DeliverTargetView {
|
|
|
473
480
|
githubRepo: string | null;
|
|
474
481
|
/** {@link newPrTargetSentence} for the launch (no run yet): the deliver gate's own sentence. */
|
|
475
482
|
sentence: string;
|
|
483
|
+
/** (crew#720) `org/project/repo` for an Azure DevOps origin; `null` otherwise. */
|
|
484
|
+
adoRepo: string | null;
|
|
476
485
|
}
|
|
477
486
|
/** The launch-time reading of the same origin preflight the deliver gate uses (R3, crew#730). */
|
|
478
487
|
export declare function deliverTargetView(originUrl: string | null | undefined): DeliverTargetView;
|
|
@@ -518,6 +527,8 @@ export interface DeliverLaunchContext {
|
|
|
518
527
|
deliverIdentitySource?: 'repo' | 'setting';
|
|
519
528
|
/** (crew#737) Whether it is signed in to gh here (`null`/absent = unknown). */
|
|
520
529
|
deliverIdentitySignedIn?: boolean | null;
|
|
530
|
+
/** (crew#720) The provider credential preflight for the gate card (`null`/absent = none read). */
|
|
531
|
+
credentials?: DeliverCredentials | null;
|
|
521
532
|
}
|
|
522
533
|
/**
|
|
523
534
|
* The `deliver` PLAN STEP a delivering PRESET launch hands the engine (DES-TEAMING-002 T3,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../src/core/deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAQL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AAErD,2FAA2F;AAC3F,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,2BAA2B,CAAC;AAErE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,2BAA2B,CAAC;AAErE;;;;;;;GAOG;AACH,eAAO,MAAM,2BAA2B,0BAA0B,CAAC;AAEnE;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AACjD,kGAAkG;AAClG,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAClF,4DAA4D;AAC5D,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,yFAAyF;AACzF,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;4EAC4E;AAC5E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAOtE;AAED;yDACyD;AACzD,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;0EACsE;IACtE,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;uFACmF;IACnF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;kGAE8F;IAC9F,SAAS,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACtC;2DACuD;IACvD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iGAAiG;IACjG,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;wBAKoB;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;+FAI2F;IAC3F,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;sGACkG;IAClG,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C;;uFAEmF;IACnF,uBAAuB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACzC;qGACiG;IACjG,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../src/core/deliver.ts"],"names":[],"mappings":"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"}
|