@substrat-run/cli 0.51.0 → 0.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -3
- package/dist/cli.js +141 -15
- package/dist/cli.js.map +1 -1
- package/dist/data-loss-check.d.ts +6 -0
- package/dist/data-loss-check.d.ts.map +1 -1
- package/dist/data-loss-check.js +5 -3
- package/dist/data-loss-check.js.map +1 -1
- package/dist/push.d.ts +10 -12
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +18 -21
- package/dist/push.js.map +1 -1
- package/dist/review-archive.d.ts +8 -0
- package/dist/review-archive.d.ts.map +1 -0
- package/dist/review-archive.js +164 -0
- package/dist/review-archive.js.map +1 -0
- package/dist/source-snapshot.d.ts +4 -0
- package/dist/source-snapshot.d.ts.map +1 -0
- package/dist/source-snapshot.js +99 -0
- package/dist/source-snapshot.js.map +1 -0
- package/dist/store-driver-approval.d.ts +33 -0
- package/dist/store-driver-approval.d.ts.map +1 -0
- package/dist/store-driver-approval.js +178 -0
- package/dist/store-driver-approval.js.map +1 -0
- package/dist/store-driver.d.ts +1 -0
- package/dist/store-driver.d.ts.map +1 -1
- package/dist/store-driver.js +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { gzipSync } from 'node:zlib';
|
|
4
|
+
const BLOCK = 512;
|
|
5
|
+
const MAX_COMPRESSED = 32 * 1024 * 1024;
|
|
6
|
+
const MAX_EXPANDED = 128 * 1024 * 1024;
|
|
7
|
+
const MAX_FILE = 16 * 1024 * 1024;
|
|
8
|
+
const MAX_ENTRIES = 10_000;
|
|
9
|
+
const pathDecoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
|
|
10
|
+
function git(args, cwd, input) {
|
|
11
|
+
return execFileSync('git', args, { cwd, input, maxBuffer: MAX_EXPANDED + 1024 * 1024 });
|
|
12
|
+
}
|
|
13
|
+
function putText(block, at, size, value) {
|
|
14
|
+
const bytes = Buffer.from(value);
|
|
15
|
+
if (bytes.length > size)
|
|
16
|
+
throw new Error('archive path is too long for USTAR');
|
|
17
|
+
block.set(bytes, at);
|
|
18
|
+
}
|
|
19
|
+
function putOctal(block, at, size, value) {
|
|
20
|
+
const digits = value.toString(8).padStart(size - 1, '0');
|
|
21
|
+
if (digits.length !== size - 1)
|
|
22
|
+
throw new Error('archive number is too large');
|
|
23
|
+
putText(block, at, size, digits);
|
|
24
|
+
block[at + size - 1] = 0;
|
|
25
|
+
}
|
|
26
|
+
function portablePath(path) {
|
|
27
|
+
if (!path || /[\x00-\x1f\x7f]/.test(path) || path.includes('\\') ||
|
|
28
|
+
path.startsWith('/') || /^[a-zA-Z]:/.test(path) ||
|
|
29
|
+
path.split('/').some((part) => !part || part === '.' || part === '..')) {
|
|
30
|
+
throw new Error('archive path is not a portable relative path');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function pathFields(path) {
|
|
34
|
+
portablePath(path);
|
|
35
|
+
if (Buffer.byteLength(path) <= 100)
|
|
36
|
+
return { name: path, prefix: '' };
|
|
37
|
+
for (let slash = path.lastIndexOf('/'); slash >= 0; slash = path.lastIndexOf('/', slash - 1)) {
|
|
38
|
+
if (Buffer.byteLength(path.slice(0, slash)) <= 155 && Buffer.byteLength(path.slice(slash + 1)) <= 100) {
|
|
39
|
+
return { prefix: path.slice(0, slash), name: path.slice(slash + 1) };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
function header(path, mode, size, type = 48) {
|
|
45
|
+
const block = new Uint8Array(BLOCK);
|
|
46
|
+
const fields = pathFields(path);
|
|
47
|
+
if (!fields)
|
|
48
|
+
throw new Error('internal archive header path is too long');
|
|
49
|
+
putText(block, 0, 100, fields.name);
|
|
50
|
+
putOctal(block, 100, 8, mode);
|
|
51
|
+
putOctal(block, 108, 8, 0);
|
|
52
|
+
putOctal(block, 116, 8, 0);
|
|
53
|
+
putOctal(block, 124, 12, size);
|
|
54
|
+
putOctal(block, 136, 12, 0);
|
|
55
|
+
block.fill(32, 148, 156);
|
|
56
|
+
block[156] = type;
|
|
57
|
+
putText(block, 257, 6, 'ustar');
|
|
58
|
+
putText(block, 263, 2, '00');
|
|
59
|
+
putText(block, 345, 155, fields.prefix);
|
|
60
|
+
let sum = 0;
|
|
61
|
+
for (const byte of block)
|
|
62
|
+
sum += byte;
|
|
63
|
+
putOctal(block, 148, 8, sum);
|
|
64
|
+
return block;
|
|
65
|
+
}
|
|
66
|
+
function paxPath(path) {
|
|
67
|
+
const value = `path=${path}\n`;
|
|
68
|
+
let length = Buffer.byteLength(value) + 2;
|
|
69
|
+
for (;;) {
|
|
70
|
+
const record = Buffer.from(`${length} ${value}`);
|
|
71
|
+
if (record.length === length) {
|
|
72
|
+
if (length > 1024)
|
|
73
|
+
throw new Error('archive path extension is too large');
|
|
74
|
+
return record;
|
|
75
|
+
}
|
|
76
|
+
length = record.length;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/** The committed tree as canonical USTAR + narrowly scoped PAX paths + gzip. */
|
|
80
|
+
export function reviewArchive(cwd, ref) {
|
|
81
|
+
const tree = git(['ls-tree', '-r', '-z', ref], cwd);
|
|
82
|
+
const rows = [];
|
|
83
|
+
for (let start = 0; start < tree.length;) {
|
|
84
|
+
const end = tree.indexOf(0, start);
|
|
85
|
+
if (end < 0)
|
|
86
|
+
throw new Error('review tree listing is incomplete');
|
|
87
|
+
rows.push(tree.subarray(start, end));
|
|
88
|
+
start = end + 1;
|
|
89
|
+
}
|
|
90
|
+
if (rows.length === 0 || rows.length > MAX_ENTRIES)
|
|
91
|
+
throw new Error('archive entry count is out of bounds');
|
|
92
|
+
const files = rows.map((row) => {
|
|
93
|
+
const tab = row.indexOf(9);
|
|
94
|
+
const match = tab < 0 ? null : /^(100644|100755) blob ([0-9a-f]+)$/.exec(row.toString('ascii', 0, tab));
|
|
95
|
+
if (!match)
|
|
96
|
+
throw new Error('review tree contains a link, submodule or unsupported entry');
|
|
97
|
+
const pathBytes = row.subarray(tab + 1);
|
|
98
|
+
let path;
|
|
99
|
+
try {
|
|
100
|
+
path = pathDecoder.decode(pathBytes);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
throw new Error(`review tree path has invalid UTF-8 bytes: ${pathBytes.toString('hex')}`);
|
|
104
|
+
}
|
|
105
|
+
return { mode: match[1] === '100755' ? 0o755 : 0o644, oid: match[2], path };
|
|
106
|
+
}).sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);
|
|
107
|
+
const seen = new Set();
|
|
108
|
+
for (const file of files) {
|
|
109
|
+
portablePath(file.path);
|
|
110
|
+
const folded = file.path.normalize('NFC').toLowerCase();
|
|
111
|
+
if (seen.has(folded))
|
|
112
|
+
throw new Error('review tree has colliding paths');
|
|
113
|
+
seen.add(folded);
|
|
114
|
+
}
|
|
115
|
+
const input = Buffer.from(files.map((file) => `${file.oid}\n`).join(''));
|
|
116
|
+
const batch = git(['cat-file', '--batch'], cwd, input);
|
|
117
|
+
let at = 0;
|
|
118
|
+
let expanded = 2 * BLOCK;
|
|
119
|
+
const blocks = [];
|
|
120
|
+
for (const [index, file] of files.entries()) {
|
|
121
|
+
const newline = batch.indexOf(10, at);
|
|
122
|
+
if (newline < 0)
|
|
123
|
+
throw new Error('git object batch is incomplete');
|
|
124
|
+
const line = batch.toString('ascii', at, newline);
|
|
125
|
+
const match = /^([0-9a-f]+) blob ([0-9]+)$/.exec(line);
|
|
126
|
+
if (!match || match[1] !== file.oid)
|
|
127
|
+
throw new Error('git object batch differs from tree');
|
|
128
|
+
const size = Number(match[2]);
|
|
129
|
+
if (!Number.isSafeInteger(size) || size > MAX_FILE)
|
|
130
|
+
throw new Error('review file exceeds the size limit');
|
|
131
|
+
at = newline + 1;
|
|
132
|
+
const content = batch.subarray(at, at + size);
|
|
133
|
+
if (content.byteLength !== size || batch[at + size] !== 10)
|
|
134
|
+
throw new Error('git object batch is truncated');
|
|
135
|
+
at += size + 1;
|
|
136
|
+
const native = pathFields(file.path);
|
|
137
|
+
if (!native) {
|
|
138
|
+
const pax = paxPath(file.path);
|
|
139
|
+
const marker = String(index).padStart(6, '0');
|
|
140
|
+
blocks.push(header(`PaxHeaders/${marker}`, 0o644, pax.length, 120), pax);
|
|
141
|
+
if (pax.length % BLOCK)
|
|
142
|
+
blocks.push(new Uint8Array(BLOCK - pax.length % BLOCK));
|
|
143
|
+
expanded += BLOCK + Math.ceil(pax.length / BLOCK) * BLOCK;
|
|
144
|
+
}
|
|
145
|
+
expanded += BLOCK + Math.ceil(size / BLOCK) * BLOCK;
|
|
146
|
+
if (expanded > MAX_EXPANDED)
|
|
147
|
+
throw new Error('review tree exceeds the expanded size limit');
|
|
148
|
+
blocks.push(header(native ? file.path : `PaxFiles/${String(index).padStart(6, '0')}`, file.mode, size), content);
|
|
149
|
+
if (size % BLOCK)
|
|
150
|
+
blocks.push(new Uint8Array(BLOCK - size % BLOCK));
|
|
151
|
+
}
|
|
152
|
+
blocks.push(new Uint8Array(2 * BLOCK));
|
|
153
|
+
const compressed = gzipSync(Buffer.concat(blocks), { level: 9 });
|
|
154
|
+
if (compressed.byteLength > MAX_COMPRESSED)
|
|
155
|
+
throw new Error('review archive exceeds the compressed size limit');
|
|
156
|
+
return { bytes: compressed, sha256: createHash('sha256').update(compressed).digest('hex') };
|
|
157
|
+
}
|
|
158
|
+
/** A staff branch review only describes the committed source. */
|
|
159
|
+
export function assertCleanReviewTree(cwd) {
|
|
160
|
+
if (git(['status', '--porcelain', '--untracked-files=all'], cwd).byteLength) {
|
|
161
|
+
throw new Error('commit the branch before uploading it for review');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=review-archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-archive.js","sourceRoot":"","sources":["../src/review-archive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type SourceSnapshot } from '@substrat-run/contracts';
|
|
2
|
+
/** Include workspace manifests and local packages when pushing a monorepo member. */
|
|
3
|
+
export declare function collectSourceSnapshot(directory: string): SourceSnapshot;
|
|
4
|
+
//# sourceMappingURL=source-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-snapshot.d.ts","sourceRoot":"","sources":["../src/source-snapshot.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwD,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEpH,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CA+EvE"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, lstatSync, readFileSync, readdirSync, realpathSync } from 'node:fs';
|
|
3
|
+
import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
4
|
+
import { excludedSourcePath, sourceSnapshot, SOURCE_BYTES_MAX } from '@substrat-run/contracts';
|
|
5
|
+
/** Include workspace manifests and local packages when pushing a monorepo member. */
|
|
6
|
+
export function collectSourceSnapshot(directory) {
|
|
7
|
+
const dir = realpathSync.native(resolve(directory));
|
|
8
|
+
let root = dir;
|
|
9
|
+
let parent = dir;
|
|
10
|
+
while (true) {
|
|
11
|
+
if (existsSync(join(parent, 'pnpm-workspace.yaml'))) {
|
|
12
|
+
if (!excludedSourcePath(relative(parent, dir).split(sep).join('/')))
|
|
13
|
+
root = parent;
|
|
14
|
+
break;
|
|
15
|
+
}
|
|
16
|
+
const next = dirname(parent);
|
|
17
|
+
if (next === parent)
|
|
18
|
+
break;
|
|
19
|
+
parent = next;
|
|
20
|
+
}
|
|
21
|
+
let included;
|
|
22
|
+
if (root !== dir) {
|
|
23
|
+
// Resolve the workspace graph without installing or building anything. Include
|
|
24
|
+
// nested browser packages as well as the vertical's declared dependencies.
|
|
25
|
+
// A constant shell command also resolves pnpm.cmd on Windows; no project input is interpolated.
|
|
26
|
+
const members = JSON.parse(execSync('pnpm -r list --depth -1 --json', { cwd: root, encoding: 'utf8', maxBuffer: 8 * 1024 * 1024, stdio: ['ignore', 'pipe', 'ignore'] }));
|
|
27
|
+
// Resolve Windows short-name aliases as well as separators before comparing paths.
|
|
28
|
+
for (const member of members)
|
|
29
|
+
member.path = realpathSync.native(resolve(member.path));
|
|
30
|
+
const byName = new Map(members.filter((m) => m.name).map((m) => [m.name, m]));
|
|
31
|
+
const selected = new Set(members.filter((m) => {
|
|
32
|
+
const child = relative(dir, m.path);
|
|
33
|
+
return child === '' || (!isAbsolute(child) && child !== '..' && !child.startsWith(`..${sep}`));
|
|
34
|
+
}).map((m) => m.path));
|
|
35
|
+
selected.add(dir);
|
|
36
|
+
const queue = [...selected];
|
|
37
|
+
for (const path of queue) {
|
|
38
|
+
const pkg = JSON.parse(readFileSync(join(path, 'package.json'), 'utf8'));
|
|
39
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies, ...pkg.peerDependencies, ...pkg.optionalDependencies };
|
|
40
|
+
for (const name of Object.keys(deps)) {
|
|
41
|
+
const member = byName.get(name);
|
|
42
|
+
if (member && !selected.has(member.path)) {
|
|
43
|
+
selected.add(member.path);
|
|
44
|
+
queue.push(member.path);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
included = [...selected].map((p) => `${relative(root, p).split(sep).join('/')}/`);
|
|
49
|
+
}
|
|
50
|
+
let names;
|
|
51
|
+
const gitExecutable = new Set();
|
|
52
|
+
try {
|
|
53
|
+
names = execFileSync('git', ['-C', root, 'ls-files', '--cached', '--others', '--exclude-standard', '-z', '--', '.'], { encoding: 'utf8', maxBuffer: 16 * 1024 * 1024, stdio: ['ignore', 'pipe', 'ignore'] }).split('\0').filter(Boolean);
|
|
54
|
+
if (process.platform === 'win32') {
|
|
55
|
+
const modes = execFileSync('git', ['-C', root, 'ls-files', '--stage', '-z', '--', '.'], { encoding: 'utf8', maxBuffer: 16 * 1024 * 1024, stdio: ['ignore', 'pipe', 'ignore'] });
|
|
56
|
+
for (const entry of modes.split('\0')) {
|
|
57
|
+
const match = /^100755 [0-9a-f]+ \d\t(.+)$/.exec(entry);
|
|
58
|
+
if (match)
|
|
59
|
+
gitExecutable.add(match[1]);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// git prints paths relative to cwd; it must never select an ancestor's unrelated files.
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
const walk = (prefix) => readdirSync(join(root, prefix)).flatMap((name) => {
|
|
66
|
+
const path = prefix ? `${prefix}/${name}` : name;
|
|
67
|
+
if (excludedSourcePath(path))
|
|
68
|
+
return [];
|
|
69
|
+
const stat = lstatSync(join(root, path));
|
|
70
|
+
return stat.isDirectory() ? walk(path) : [path];
|
|
71
|
+
});
|
|
72
|
+
names = walk('');
|
|
73
|
+
}
|
|
74
|
+
const files = [];
|
|
75
|
+
let bytes = 0;
|
|
76
|
+
for (const path of [...new Set(names)].sort()) {
|
|
77
|
+
if (excludedSourcePath(path))
|
|
78
|
+
continue;
|
|
79
|
+
if (included && path.includes('/') && !path.startsWith('tools/') && !path.startsWith('scripts/') && !included.some((prefix) => path.startsWith(prefix)))
|
|
80
|
+
continue;
|
|
81
|
+
const absolute = join(root, path);
|
|
82
|
+
if (!existsSync(absolute))
|
|
83
|
+
continue; // tracked deletion
|
|
84
|
+
const stat = lstatSync(absolute);
|
|
85
|
+
if (stat.isSymbolicLink())
|
|
86
|
+
throw new Error(`source snapshot refuses symlink: ${path}`);
|
|
87
|
+
if (!stat.isFile())
|
|
88
|
+
continue;
|
|
89
|
+
const real = realpathSync.native(absolute);
|
|
90
|
+
if (!real.startsWith(`${root}${sep}`))
|
|
91
|
+
throw new Error(`source path escapes the project: ${path}`);
|
|
92
|
+
bytes += Math.ceil(stat.size / 3) * 4;
|
|
93
|
+
if (bytes > SOURCE_BYTES_MAX)
|
|
94
|
+
throw new Error('source snapshot exceeds the upload limit');
|
|
95
|
+
files.push({ path, base64: readFileSync(real).toString('base64'), executable: process.platform === 'win32' ? gitExecutable.has(path) : Boolean(stat.mode & 0o111) });
|
|
96
|
+
}
|
|
97
|
+
return sourceSnapshot.parse({ files, directory: relative(root, dir).split(sep).join('/') || '.' });
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=source-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-snapshot.js","sourceRoot":"","sources":["../src/source-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type StoreDriverApprovalBody, type StoreDriverApprovalResultView, type StoreDriverRevokeResultView, type StoreDriverView } from '@substrat-run/control-plane-client';
|
|
2
|
+
/** CLI backstop: one release walk should not require more than 10,000 page requests. */
|
|
3
|
+
export declare const STORE_DRIVER_REVOKE_MAX_PAGES = 10000;
|
|
4
|
+
/** The same printable, bounded text rule as the approval and revoke routes. Values stay exact. */
|
|
5
|
+
export declare function storeDriverReviewText(value: unknown, field: string): string;
|
|
6
|
+
/** Validate the full body before the client sends it; no text is silently normalised. */
|
|
7
|
+
export declare function validateStoreDriverApproval(value: unknown): StoreDriverApprovalBody;
|
|
8
|
+
export declare function approvalFromFiles(input: {
|
|
9
|
+
reason: string;
|
|
10
|
+
sourceReferencesFile: string;
|
|
11
|
+
isolationReviewFile: string;
|
|
12
|
+
schema: string;
|
|
13
|
+
className: string;
|
|
14
|
+
operations: string[];
|
|
15
|
+
}): StoreDriverApprovalBody;
|
|
16
|
+
export declare function approvalLines(result: StoreDriverApprovalResultView): string[];
|
|
17
|
+
export declare function approvalStatusLines(view: StoreDriverView): string[];
|
|
18
|
+
export declare function uploadApprovalLine(driver: string, sha256: string): string;
|
|
19
|
+
/** Resume every server page; a busy or lost hold can be retried with the same command. */
|
|
20
|
+
export declare function revokeStoreDriverUntilComplete(input: {
|
|
21
|
+
client: {
|
|
22
|
+
revokeStoreDriverRelease(driver: string, sha256: string, body: {
|
|
23
|
+
reason: string;
|
|
24
|
+
emergency?: boolean;
|
|
25
|
+
}): Promise<StoreDriverRevokeResultView>;
|
|
26
|
+
};
|
|
27
|
+
driver: string;
|
|
28
|
+
sha256: string;
|
|
29
|
+
reason: string;
|
|
30
|
+
emergency: boolean;
|
|
31
|
+
progress: (line: string) => void;
|
|
32
|
+
}): Promise<StoreDriverRevokeResultView>;
|
|
33
|
+
//# sourceMappingURL=store-driver-approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-driver-approval.d.ts","sourceRoot":"","sources":["../src/store-driver-approval.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,eAAe,EACrB,MAAM,oCAAoC,CAAC;AAU5C,wFAAwF;AACxF,eAAO,MAAM,6BAA6B,QAAS,CAAC;AAapD,kGAAkG;AAClG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED,yFAAyF;AACzF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,uBAAuB,CA2DnF;AAUD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IAAC,oBAAoB,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAC1E,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAC;CACzD,GAAG,uBAAuB,CAQ1B;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,6BAA6B,GAAG,MAAM,EAAE,CAM7E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAMnE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED,0FAA0F;AAC1F,wBAAsB,8BAA8B,CAAC,KAAK,EAAE;IAC1D,MAAM,EAAE;QAAE,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAA;KAAE,CAAC;IAC1J,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IACnE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,GAAG,OAAO,CAAC,2BAA2B,CAAC,CA+BvC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/** Scriptable, person-only approval commands for already uploaded store-driver releases (D-65). */
|
|
2
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
3
|
+
import { storeCatalogOperation } from '@substrat-run/contracts';
|
|
4
|
+
import { ControlPlaneError, } from '@substrat-run/control-plane-client';
|
|
5
|
+
const nonPrinting = /[\p{Cc}\p{Cf}\u2028\u2029]/u;
|
|
6
|
+
const commitShape = /^(?:[0-9a-f]{40}|[0-9a-f]{64})$/;
|
|
7
|
+
const classShape = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
8
|
+
const reviewKeys = [
|
|
9
|
+
'separateScriptPerTenant', 'noOutboundAccess', 'envelopeVerifiedOutsideDriver',
|
|
10
|
+
'envelopeChecked', 'reservedOperationsChecked', 'noModuleStateChecked',
|
|
11
|
+
];
|
|
12
|
+
const MAX_REVIEW_FILE_BYTES = 128 * 1024;
|
|
13
|
+
/** CLI backstop: one release walk should not require more than 10,000 page requests. */
|
|
14
|
+
export const STORE_DRIVER_REVOKE_MAX_PAGES = 10_000;
|
|
15
|
+
const record = (value, field) => {
|
|
16
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
17
|
+
throw new Error(`${field}: expected an object`);
|
|
18
|
+
return value;
|
|
19
|
+
};
|
|
20
|
+
const exactKeys = (value, keys, field) => {
|
|
21
|
+
if (Object.keys(value).length !== keys.length || keys.some((key) => !Object.hasOwn(value, key))) {
|
|
22
|
+
throw new Error(`${field}: expected exactly ${keys.join(', ')}`);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
/** The same printable, bounded text rule as the approval and revoke routes. Values stay exact. */
|
|
26
|
+
export function storeDriverReviewText(value, field) {
|
|
27
|
+
if (typeof value !== 'string' || value.length < 1 || value.length > 2048 || value.trim().length === 0 || nonPrinting.test(value)) {
|
|
28
|
+
throw new Error(`${field}: expected 1–2048 printable characters`);
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
}
|
|
32
|
+
/** Validate the full body before the client sends it; no text is silently normalised. */
|
|
33
|
+
export function validateStoreDriverApproval(value) {
|
|
34
|
+
const body = record(value, 'approval');
|
|
35
|
+
exactKeys(body, ['reason', 'sourceReferences', 'isolationReview', 'schema', 'className', 'operations'], 'approval');
|
|
36
|
+
const reason = storeDriverReviewText(body.reason, 'reason');
|
|
37
|
+
if (!Array.isArray(body.sourceReferences) || body.sourceReferences.length < 1 || body.sourceReferences.length > 64) {
|
|
38
|
+
throw new Error('sourceReferences: expected 1–64 repository and commit pairs');
|
|
39
|
+
}
|
|
40
|
+
const sourceReferences = body.sourceReferences.map((entry, i) => {
|
|
41
|
+
const ref = record(entry, `sourceReferences.${i}`);
|
|
42
|
+
exactKeys(ref, ['repository', 'commit'], `sourceReferences.${i}`);
|
|
43
|
+
const repository = ref.repository;
|
|
44
|
+
if (typeof repository !== 'string' || repository.length < 1 || repository.length > 1024 ||
|
|
45
|
+
!repository.startsWith('https://') || /[\s\\?#]/u.test(repository) || nonPrinting.test(repository)) {
|
|
46
|
+
throw new Error(`sourceReferences.${i}.repository: expected an HTTPS URL with host and path`);
|
|
47
|
+
}
|
|
48
|
+
let url;
|
|
49
|
+
try {
|
|
50
|
+
url = new URL(repository);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
throw new Error(`sourceReferences.${i}.repository: expected an HTTPS URL with host and path`);
|
|
54
|
+
}
|
|
55
|
+
if (url.protocol !== 'https:' || !url.hostname || url.username || url.password || url.search || url.hash ||
|
|
56
|
+
!url.pathname.split('/').some(Boolean)) {
|
|
57
|
+
throw new Error(`sourceReferences.${i}.repository: expected an HTTPS URL with host and path`);
|
|
58
|
+
}
|
|
59
|
+
if (typeof ref.commit !== 'string' || !commitShape.test(ref.commit)) {
|
|
60
|
+
throw new Error(`sourceReferences.${i}.commit: expected 40 or 64 lowercase hex characters`);
|
|
61
|
+
}
|
|
62
|
+
return { repository, commit: ref.commit };
|
|
63
|
+
});
|
|
64
|
+
const review = record(body.isolationReview, 'isolationReview');
|
|
65
|
+
exactKeys(review, reviewKeys, 'isolationReview');
|
|
66
|
+
const checked = (key) => {
|
|
67
|
+
const part = record(review[key], `isolationReview.${key}`);
|
|
68
|
+
exactKeys(part, ['checked', 'evidence'], `isolationReview.${key}`);
|
|
69
|
+
if (part.checked !== true)
|
|
70
|
+
throw new Error(`isolationReview.${key}.checked: expected true`);
|
|
71
|
+
return { checked: true, evidence: storeDriverReviewText(part.evidence, `isolationReview.${key}.evidence`) };
|
|
72
|
+
};
|
|
73
|
+
const met = (key) => {
|
|
74
|
+
const part = record(review[key], `isolationReview.${key}`);
|
|
75
|
+
exactKeys(part, ['met', 'evidence'], `isolationReview.${key}`);
|
|
76
|
+
if (typeof part.met !== 'boolean')
|
|
77
|
+
throw new Error(`isolationReview.${key}.met: expected a boolean`);
|
|
78
|
+
return { met: part.met, evidence: storeDriverReviewText(part.evidence, `isolationReview.${key}.evidence`) };
|
|
79
|
+
};
|
|
80
|
+
const isolationReview = {
|
|
81
|
+
separateScriptPerTenant: met('separateScriptPerTenant'),
|
|
82
|
+
noOutboundAccess: met('noOutboundAccess'),
|
|
83
|
+
envelopeVerifiedOutsideDriver: met('envelopeVerifiedOutsideDriver'),
|
|
84
|
+
envelopeChecked: checked('envelopeChecked'),
|
|
85
|
+
reservedOperationsChecked: checked('reservedOperationsChecked'),
|
|
86
|
+
noModuleStateChecked: checked('noModuleStateChecked'),
|
|
87
|
+
};
|
|
88
|
+
if (typeof body.schema !== 'number' || !Number.isSafeInteger(body.schema) || body.schema < 0) {
|
|
89
|
+
throw new Error('schema: expected a non-negative integer');
|
|
90
|
+
}
|
|
91
|
+
if (typeof body.className !== 'string' || body.className.length > 256 || !classShape.test(body.className)) {
|
|
92
|
+
throw new Error('className: expected a Python class identifier');
|
|
93
|
+
}
|
|
94
|
+
if (!Array.isArray(body.operations) || body.operations.length > 256 ||
|
|
95
|
+
body.operations.some((name) => typeof name !== 'string' || nonPrinting.test(name) || !storeCatalogOperation.safeParse(name).success)) {
|
|
96
|
+
throw new Error('operations: expected at most 256 fixed catalog labels');
|
|
97
|
+
}
|
|
98
|
+
return { reason, sourceReferences, isolationReview, schema: body.schema, className: body.className, operations: body.operations };
|
|
99
|
+
}
|
|
100
|
+
function readReviewJson(path) {
|
|
101
|
+
if (statSync(path).size > MAX_REVIEW_FILE_BYTES)
|
|
102
|
+
throw new Error(`${path}: review JSON exceeds ${MAX_REVIEW_FILE_BYTES} bytes`);
|
|
103
|
+
const text = readFileSync(path, 'utf8');
|
|
104
|
+
if (Buffer.byteLength(text) > MAX_REVIEW_FILE_BYTES)
|
|
105
|
+
throw new Error(`${path}: review JSON exceeds ${MAX_REVIEW_FILE_BYTES} bytes`);
|
|
106
|
+
try {
|
|
107
|
+
return JSON.parse(text);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
throw new Error(`${path}: expected JSON`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export function approvalFromFiles(input) {
|
|
114
|
+
if (!/^(?:0|[1-9][0-9]*)$/.test(input.schema))
|
|
115
|
+
throw new Error('schema: expected a non-negative integer');
|
|
116
|
+
return validateStoreDriverApproval({
|
|
117
|
+
reason: input.reason,
|
|
118
|
+
sourceReferences: readReviewJson(input.sourceReferencesFile),
|
|
119
|
+
isolationReview: readReviewJson(input.isolationReviewFile),
|
|
120
|
+
schema: Number(input.schema), className: input.className, operations: input.operations,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
export function approvalLines(result) {
|
|
124
|
+
const { approval, currentSchema } = result;
|
|
125
|
+
return [
|
|
126
|
+
`✓ approved ${approval.driver} ${approval.sha256} (approval ${approval.approvalId})`,
|
|
127
|
+
` schema ${approval.schema}; current good schema ${currentSchema ?? 'none'}`,
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
export function approvalStatusLines(view) {
|
|
131
|
+
if (!view.approvals)
|
|
132
|
+
return [];
|
|
133
|
+
if (view.approvals.length === 0)
|
|
134
|
+
return [' approvals: none'];
|
|
135
|
+
return view.approvals.map((approval) => approval.revokedAt
|
|
136
|
+
? ` approval ${approval.approvalId} ${approval.sha256}: revoked ${approval.revokedAt} by ${approval.revokedBy}${approval.revokedEmergency ? ' (emergency)' : ''}; reason: ${approval.revokedReason}`
|
|
137
|
+
: ` approval ${approval.approvalId} ${approval.sha256}: live, approved ${approval.approvedAt} by ${approval.approvedBy}; schema ${approval.schema}, class ${approval.className}, operations ${approval.operations.join(', ') || 'none'}`);
|
|
138
|
+
}
|
|
139
|
+
export function uploadApprovalLine(driver, sha256) {
|
|
140
|
+
return ` upload alone does not make these bytes runnable; a staff person approves them with: ` +
|
|
141
|
+
`substrat store-driver approve --driver ${driver} --sha256 ${sha256} --reason <reason> ` +
|
|
142
|
+
'--source-references <json-file> --isolation-review <json-file> --schema <n> --class-name <Class> [--operation <name> ...]';
|
|
143
|
+
}
|
|
144
|
+
/** Resume every server page; a busy or lost hold can be retried with the same command. */
|
|
145
|
+
export async function revokeStoreDriverUntilComplete(input) {
|
|
146
|
+
let pages = 0;
|
|
147
|
+
let previousRemaining;
|
|
148
|
+
let unchangedPages = 0;
|
|
149
|
+
while (true) {
|
|
150
|
+
if (pages >= STORE_DRIVER_REVOKE_MAX_PAGES) {
|
|
151
|
+
throw new Error(`revoke walk exceeded the ${STORE_DRIVER_REVOKE_MAX_PAGES}-page CLI limit; run the same command again, or check store-driver status`);
|
|
152
|
+
}
|
|
153
|
+
pages += 1;
|
|
154
|
+
let result;
|
|
155
|
+
try {
|
|
156
|
+
result = await input.client.revokeStoreDriverRelease(input.driver, input.sha256, { reason: input.reason, ...(input.emergency ? { emergency: true } : {}) });
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
if (error instanceof ControlPlaneError && error.status === 409 && /hold|held|busy|rollout or push/i.test(error.message)) {
|
|
160
|
+
throw new Error(`${error.message}; retry the same store-driver revoke command`);
|
|
161
|
+
}
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
input.progress(result.complete
|
|
165
|
+
? `✓ revoked approval ${result.approval.approvalId} for ${input.driver} ${input.sha256}`
|
|
166
|
+
: ` revoke walk paused: ${result.remaining} script(s) remaining; continuing`);
|
|
167
|
+
if (result.complete)
|
|
168
|
+
return result;
|
|
169
|
+
unchangedPages = previousRemaining !== undefined && result.remaining >= previousRemaining
|
|
170
|
+
? unchangedPages + 1
|
|
171
|
+
: 0;
|
|
172
|
+
previousRemaining = result.remaining;
|
|
173
|
+
if (unchangedPages >= 3) {
|
|
174
|
+
throw new Error(`revoke walk remains at ${result.remaining} script(s) remaining; run the same command again, or check store-driver status`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=store-driver-approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-driver-approval.js","sourceRoot":"","sources":["../src/store-driver-approval.ts"],"names":[],"mappings":"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"}
|
package/dist/store-driver.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ export declare const uploadStoreDriverRelease: (input: Plane & {
|
|
|
46
46
|
}) => Promise<{
|
|
47
47
|
release: import("@substrat-run/control-plane-client").StoreDriverReleaseView;
|
|
48
48
|
pinned: boolean;
|
|
49
|
+
approved?: boolean;
|
|
49
50
|
}>;
|
|
50
51
|
export declare const rollOutStoreDriver: (input: Plane & {
|
|
51
52
|
driver: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-driver.d.ts","sourceRoot":"","sources":["../src/store-driver.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAiF,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACvJ,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAelG;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA8D,CAAC;AAI9G;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBnD;AAED,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAAS,MAAM,KAAG,MAAM,EAAqE,CAAC;AAEpI;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgB5E;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,wBAAwB,CAiB7G;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAUpJ;AAED,0GAA0G;AAC1G,eAAO,MAAM,YAAY,UAAW,MAAM,GAAG,SAAS,KAAG,KAAK,IAAI,MAA6D,CAAC;AAEhI,KAAK,KAAK,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAEzE,eAAO,MAAM,wBAAwB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,wBAAwB,CAAA;CAAE
|
|
1
|
+
{"version":3,"file":"store-driver.d.ts","sourceRoot":"","sources":["../src/store-driver.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAiF,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACvJ,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAelG;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA8D,CAAC;AAI9G;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwBnD;AAED,gFAAgF;AAChF,eAAO,MAAM,yBAAyB,QAAS,MAAM,KAAG,MAAM,EAAqE,CAAC;AAEpI;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAgB5E;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,wBAAwB,CAiB7G;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EAAE,CAUpJ;AAED,0GAA0G;AAC1G,eAAO,MAAM,YAAY,UAAW,MAAM,GAAG,SAAS,KAAG,KAAK,IAAI,MAA6D,CAAC;AAEhI,KAAK,KAAK,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAEzE,eAAO,MAAM,wBAAwB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,wBAAwB,CAAA;CAAE;;;;EACR,CAAC;AAEnG,eAAO,MAAM,kBAAkB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,uFACU,CAAC;AAE/F,eAAO,MAAM,mBAAmB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,uFACY,CAAC;AAElF,eAAO,MAAM,iBAAiB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,6BACS,CAAC;AAE7E,eAAO,MAAM,kBAAkB,UAAW,KAAK,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE;;;EACqC,CAAC;AAEpI;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,EAAE,CA4BjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,MAAM,EAAE,CAStF"}
|
package/dist/store-driver.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* refuses the service token.
|
|
5
5
|
*
|
|
6
6
|
* - `upload` packs the driver's package from `--dir` and stores it. The control plane names the
|
|
7
|
-
* release by its sha256
|
|
7
|
+
* release by its sha256; a staff person approves those bytes separately.
|
|
8
8
|
* - `rollout --sha256` moves every vertical to a stored, pinned release, after a canary. A big
|
|
9
9
|
* fleet takes more than one request: the command says so, and running it again continues.
|
|
10
10
|
* - `rollback` returns the driver to the immediately previous good release.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@substrat-run/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.52.0",
|
|
4
4
|
"description": "The substrat CLI — authenticated deploy tooling: push a vertical to the platform, manage its versions and channels",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -30,10 +30,10 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@babel/parser": "^7.29.11",
|
|
32
32
|
"esbuild": "^0.28.2",
|
|
33
|
-
"@substrat-run/
|
|
34
|
-
"@substrat-run/
|
|
35
|
-
"@substrat-run/
|
|
36
|
-
"@substrat-run/model-view": "^0.6.
|
|
33
|
+
"@substrat-run/contracts": "^0.166.0",
|
|
34
|
+
"@substrat-run/control-plane-client": "^0.3.17",
|
|
35
|
+
"@substrat-run/boundary-lint": "^0.8.1",
|
|
36
|
+
"@substrat-run/model-view": "^0.6.13"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
39
|
"@types/node": "^22.20.5",
|