@dsh-enhanced/plugin-control-plane 0.1.32 → 0.1.34
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 +352 -4
- package/bin/dsh-local-release-adapter.js +80 -16
- package/bin/dsh-npm-registry-adapter.js +613 -0
- package/bin/dsh-source-adoption-authority.js +12 -0
- package/bin/dsh-source-approval-authority.js +16 -0
- package/bin/dsh-source-release-authority.js +12 -0
- package/bin/dsh-systemd-host-attestor.js +707 -0
- package/bin/dsh-task-observation-authority.js +15 -0
- package/lib/adapter-process.d.ts +23 -0
- package/lib/adapter-process.d.ts.map +1 -0
- package/lib/adapter-process.js +305 -0
- package/lib/adapter-process.js.map +1 -0
- package/lib/adoption-coordinator.d.ts +63 -0
- package/lib/adoption-coordinator.d.ts.map +1 -0
- package/lib/adoption-coordinator.js +241 -0
- package/lib/adoption-coordinator.js.map +1 -0
- package/lib/adoption-handoff.d.ts +16 -0
- package/lib/adoption-handoff.d.ts.map +1 -0
- package/lib/adoption-handoff.js +11 -0
- package/lib/adoption-handoff.js.map +1 -0
- package/lib/attestation.d.ts.map +1 -1
- package/lib/attestation.js +49 -1
- package/lib/attestation.js.map +1 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +29 -2
- package/lib/catalog.js.map +1 -1
- package/lib/cli.d.ts +33 -9
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +624 -178
- package/lib/cli.js.map +1 -1
- package/lib/deployment-readiness.d.ts +38 -0
- package/lib/deployment-readiness.d.ts.map +1 -0
- package/lib/deployment-readiness.js +154 -0
- package/lib/deployment-readiness.js.map +1 -0
- package/lib/effect-blocked-replay.d.ts +81 -0
- package/lib/effect-blocked-replay.d.ts.map +1 -0
- package/lib/effect-blocked-replay.js +259 -0
- package/lib/effect-blocked-replay.js.map +1 -0
- package/lib/errors.d.ts +6 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +9 -0
- package/lib/errors.js.map +1 -0
- package/lib/foreground-deployment-runtime.d.ts +20 -0
- package/lib/foreground-deployment-runtime.d.ts.map +1 -0
- package/lib/foreground-deployment-runtime.js +79 -0
- package/lib/foreground-deployment-runtime.js.map +1 -0
- package/lib/foreground-deployment.d.ts +17 -0
- package/lib/foreground-deployment.d.ts.map +1 -0
- package/lib/foreground-deployment.js +43 -0
- package/lib/foreground-deployment.js.map +1 -0
- package/lib/host-attestor.d.ts +1 -1
- package/lib/host-attestor.d.ts.map +1 -1
- package/lib/host-attestor.js +51 -57
- package/lib/host-attestor.js.map +1 -1
- package/lib/index.d.ts +25 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +11 -2
- package/lib/index.js.map +1 -1
- package/lib/npm-publish.d.ts +25 -0
- package/lib/npm-publish.d.ts.map +1 -0
- package/lib/npm-publish.js +280 -0
- package/lib/npm-publish.js.map +1 -0
- package/lib/owner-task-gap-types.d.ts +21 -0
- package/lib/owner-task-gap-types.d.ts.map +1 -0
- package/lib/owner-task-gap-types.js +2 -0
- package/lib/owner-task-gap-types.js.map +1 -0
- package/lib/owner-task-gaps.d.ts +24 -0
- package/lib/owner-task-gaps.d.ts.map +1 -0
- package/lib/owner-task-gaps.js +74 -0
- package/lib/owner-task-gaps.js.map +1 -0
- package/lib/post-activation.d.ts +33 -0
- package/lib/post-activation.d.ts.map +1 -0
- package/lib/post-activation.js +219 -0
- package/lib/post-activation.js.map +1 -0
- package/lib/registry-fetch.d.ts +50 -0
- package/lib/registry-fetch.d.ts.map +1 -0
- package/lib/registry-fetch.js +267 -0
- package/lib/registry-fetch.js.map +1 -0
- package/lib/release.d.ts +4 -4
- package/lib/release.d.ts.map +1 -1
- package/lib/release.js +142 -56
- package/lib/release.js.map +1 -1
- package/lib/replay-endpoint-protocol.d.ts +65 -0
- package/lib/replay-endpoint-protocol.d.ts.map +1 -0
- package/lib/replay-endpoint-protocol.js +183 -0
- package/lib/replay-endpoint-protocol.js.map +1 -0
- package/lib/replay-endpoint.d.ts +7 -0
- package/lib/replay-endpoint.d.ts.map +1 -0
- package/lib/replay-endpoint.js +193 -0
- package/lib/replay-endpoint.js.map +1 -0
- package/lib/replay-grant.d.ts +62 -0
- package/lib/replay-grant.d.ts.map +1 -0
- package/lib/replay-grant.js +208 -0
- package/lib/replay-grant.js.map +1 -0
- package/lib/replay-journal.d.ts +25 -0
- package/lib/replay-journal.d.ts.map +1 -0
- package/lib/replay-journal.js +275 -0
- package/lib/replay-journal.js.map +1 -0
- package/lib/runtime-observer-protocol.d.ts +63 -0
- package/lib/runtime-observer-protocol.d.ts.map +1 -0
- package/lib/runtime-observer-protocol.js +280 -0
- package/lib/runtime-observer-protocol.js.map +1 -0
- package/lib/runtime-observer.d.ts +8 -0
- package/lib/runtime-observer.d.ts.map +1 -0
- package/lib/runtime-observer.js +182 -0
- package/lib/runtime-observer.js.map +1 -0
- package/lib/service.d.ts +145 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +734 -6
- package/lib/service.js.map +1 -1
- package/lib/source-adoption-authority.d.ts +65 -0
- package/lib/source-adoption-authority.d.ts.map +1 -0
- package/lib/source-adoption-authority.js +271 -0
- package/lib/source-adoption-authority.js.map +1 -0
- package/lib/source-adoption-runner.d.ts +28 -0
- package/lib/source-adoption-runner.d.ts.map +1 -0
- package/lib/source-adoption-runner.js +197 -0
- package/lib/source-adoption-runner.js.map +1 -0
- package/lib/source-approval-authority.d.ts +50 -0
- package/lib/source-approval-authority.d.ts.map +1 -0
- package/lib/source-approval-authority.js +412 -0
- package/lib/source-approval-authority.js.map +1 -0
- package/lib/source-approval-client.d.ts +32 -0
- package/lib/source-approval-client.d.ts.map +1 -0
- package/lib/source-approval-client.js +175 -0
- package/lib/source-approval-client.js.map +1 -0
- package/lib/source-build.d.ts +60 -0
- package/lib/source-build.d.ts.map +1 -0
- package/lib/source-build.js +311 -0
- package/lib/source-build.js.map +1 -0
- package/lib/source-context.d.ts +24 -0
- package/lib/source-context.d.ts.map +1 -0
- package/lib/source-context.js +99 -0
- package/lib/source-context.js.map +1 -0
- package/lib/source-job-types.d.ts +87 -0
- package/lib/source-job-types.d.ts.map +1 -0
- package/lib/source-job-types.js +2 -0
- package/lib/source-job-types.js.map +1 -0
- package/lib/source-jobs.d.ts +113 -0
- package/lib/source-jobs.d.ts.map +1 -0
- package/lib/source-jobs.js +535 -0
- package/lib/source-jobs.js.map +1 -0
- package/lib/source-release-authority.d.ts +35 -0
- package/lib/source-release-authority.d.ts.map +1 -0
- package/lib/source-release-authority.js +271 -0
- package/lib/source-release-authority.js.map +1 -0
- package/lib/source-release-client.d.ts +10 -0
- package/lib/source-release-client.d.ts.map +1 -0
- package/lib/source-release-client.js +24 -0
- package/lib/source-release-client.js.map +1 -0
- package/lib/source-release-runner.d.ts +31 -0
- package/lib/source-release-runner.d.ts.map +1 -0
- package/lib/source-release-runner.js +125 -0
- package/lib/source-release-runner.js.map +1 -0
- package/lib/source-versioning.d.ts +24 -0
- package/lib/source-versioning.d.ts.map +1 -0
- package/lib/source-versioning.js +213 -0
- package/lib/source-versioning.js.map +1 -0
- package/lib/source-workspace.d.ts +117 -0
- package/lib/source-workspace.d.ts.map +1 -0
- package/lib/source-workspace.js +458 -0
- package/lib/source-workspace.js.map +1 -0
- package/lib/sqlite.d.ts +1 -1
- package/lib/sqlite.d.ts.map +1 -1
- package/lib/sqlite.js +509 -7
- package/lib/sqlite.js.map +1 -1
- package/lib/store.d.ts +229 -6
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +2431 -383
- package/lib/store.js.map +1 -1
- package/lib/task-observation-authority.d.ts +29 -0
- package/lib/task-observation-authority.d.ts.map +1 -0
- package/lib/task-observation-authority.js +370 -0
- package/lib/task-observation-authority.js.map +1 -0
- package/lib/task-observation-client.d.ts +4 -0
- package/lib/task-observation-client.d.ts.map +1 -0
- package/lib/task-observation-client.js +20 -0
- package/lib/task-observation-client.js.map +1 -0
- package/lib/task-observation-runtime.d.ts +59 -0
- package/lib/task-observation-runtime.d.ts.map +1 -0
- package/lib/task-observation-runtime.js +331 -0
- package/lib/task-observation-runtime.js.map +1 -0
- package/lib/task-observation-store.d.ts +17 -0
- package/lib/task-observation-store.d.ts.map +1 -0
- package/lib/task-observation-store.js +115 -0
- package/lib/task-observation-store.js.map +1 -0
- package/lib/task-observation-types.d.ts +67 -0
- package/lib/task-observation-types.d.ts.map +1 -0
- package/lib/task-observation-types.js +2 -0
- package/lib/task-observation-types.js.map +1 -0
- package/lib/trust.d.ts +3 -0
- package/lib/trust.d.ts.map +1 -1
- package/lib/trust.js +0 -0
- package/lib/trust.js.map +1 -1
- package/lib/types.d.ts +275 -8
- package/lib/types.d.ts.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +40 -5
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { constants as fsConstants } from 'node:fs';
|
|
2
|
+
import { lstat, open, realpath } from 'node:fs/promises';
|
|
3
|
+
import { dirname, isAbsolute, relative, resolve } from 'node:path';
|
|
4
|
+
import { ControlPlaneCliError } from './errors.js';
|
|
5
|
+
import { assertPluginModificationAllowed, runLocalBuffer, runLocalCommand, validateScopedPluginFiles } from './source-workspace.js';
|
|
6
|
+
const NAME = /^(?=.{1,64}$)[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u;
|
|
7
|
+
const COMMIT = /^[a-f0-9]{40}$/u;
|
|
8
|
+
const STABLE_VERSION = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/u;
|
|
9
|
+
const MAX_FILE_BYTES = 65_536;
|
|
10
|
+
function inputName(name) {
|
|
11
|
+
const normalized = name.normalize('NFC').trim();
|
|
12
|
+
if (normalized !== name || !NAME.test(name))
|
|
13
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', 'managed version plugin name is invalid');
|
|
14
|
+
assertPluginModificationAllowed(name);
|
|
15
|
+
return name;
|
|
16
|
+
}
|
|
17
|
+
function nextStablePatch(version) {
|
|
18
|
+
const match = STABLE_VERSION.exec(version);
|
|
19
|
+
if (match === null)
|
|
20
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base must be a stable x.y.z version');
|
|
21
|
+
const major = Number(match[1]);
|
|
22
|
+
const minor = Number(match[2]);
|
|
23
|
+
const patch = Number(match[3]);
|
|
24
|
+
if (![major, minor, patch].every(Number.isSafeInteger) || patch >= Number.MAX_SAFE_INTEGER) {
|
|
25
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base patch is outside the safe increment range');
|
|
26
|
+
}
|
|
27
|
+
return `${major}.${minor}.${patch + 1}`;
|
|
28
|
+
}
|
|
29
|
+
function parseManifest(bytes, label) {
|
|
30
|
+
if (bytes.length === 0 || bytes.length > MAX_FILE_BYTES || bytes.includes(0))
|
|
31
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `${label} exceeds the managed version read bound`);
|
|
32
|
+
let text;
|
|
33
|
+
try {
|
|
34
|
+
text = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `${label} is not strict UTF-8`);
|
|
38
|
+
}
|
|
39
|
+
let value;
|
|
40
|
+
try {
|
|
41
|
+
value = JSON.parse(text);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `${label} is not valid JSON`);
|
|
45
|
+
}
|
|
46
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype) {
|
|
47
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `${label} must be a JSON object`);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function assertBaseManifest(manifest, name) {
|
|
52
|
+
if (manifest.name !== `@dsh-enhanced/${name}` || manifest.version === undefined || typeof manifest.version !== 'string'
|
|
53
|
+
|| !('dsh' in manifest) || (manifest.dsh === null || typeof manifest.dsh !== 'object' || Array.isArray(manifest.dsh))
|
|
54
|
+
|| manifest.dsh.bundle === null || typeof manifest.dsh.bundle !== 'object'
|
|
55
|
+
|| Array.isArray(manifest.dsh.bundle)
|
|
56
|
+
|| (manifest.dsh.bundle.patch !== './cordis.patch.yml')) {
|
|
57
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base manifest identity or bundle patch is invalid');
|
|
58
|
+
}
|
|
59
|
+
nextStablePatch(manifest.version);
|
|
60
|
+
return manifest.version;
|
|
61
|
+
}
|
|
62
|
+
function manifestWithVersion(manifest, version) {
|
|
63
|
+
return `${JSON.stringify({ ...manifest, version }, null, 2)}\n`;
|
|
64
|
+
}
|
|
65
|
+
function canonicalJson(value) {
|
|
66
|
+
if (value === null || typeof value !== 'object')
|
|
67
|
+
return JSON.stringify(value);
|
|
68
|
+
if (Array.isArray(value))
|
|
69
|
+
return `[${value.map(canonicalJson).join(',')}]`;
|
|
70
|
+
const object = value;
|
|
71
|
+
return `{${Object.keys(object).sort().map(key => `${JSON.stringify(key)}:${canonicalJson(object[key])}`).join(',')}}`;
|
|
72
|
+
}
|
|
73
|
+
function equalExceptVersion(base, current, version) {
|
|
74
|
+
if (current.version !== version)
|
|
75
|
+
return false;
|
|
76
|
+
const { version: _baseVersion, ...baseRest } = base;
|
|
77
|
+
const { version: _currentVersion, ...currentRest } = current;
|
|
78
|
+
return canonicalJson(baseRest) === canonicalJson(currentRest);
|
|
79
|
+
}
|
|
80
|
+
async function readCurrentRegularFile(worktree, path) {
|
|
81
|
+
const expected = resolve(worktree, path);
|
|
82
|
+
const root = resolve(worktree);
|
|
83
|
+
if (relative(root, expected).startsWith('..') || !isAbsolute(expected))
|
|
84
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version path escapes its worktree');
|
|
85
|
+
const canonical = await realpath(expected);
|
|
86
|
+
if (canonical !== expected)
|
|
87
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version current file must be canonical');
|
|
88
|
+
const parent = await lstat(dirname(canonical));
|
|
89
|
+
const before = await lstat(canonical);
|
|
90
|
+
const uid = process.getuid?.();
|
|
91
|
+
if (!parent.isDirectory() || parent.isSymbolicLink() || (parent.mode & 0o022) !== 0
|
|
92
|
+
|| !before.isFile() || before.isSymbolicLink() || before.nlink !== 1 || before.size > MAX_FILE_BYTES || (before.mode & 0o022) !== 0
|
|
93
|
+
|| (uid !== undefined && before.uid !== 0 && before.uid !== uid)) {
|
|
94
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version current file is not an owner-safe bounded regular file');
|
|
95
|
+
}
|
|
96
|
+
const handle = await open(canonical, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
|
|
97
|
+
try {
|
|
98
|
+
const descriptor = await handle.stat();
|
|
99
|
+
const bytes = await handle.readFile();
|
|
100
|
+
const after = await lstat(canonical);
|
|
101
|
+
if (!descriptor.isFile() || descriptor.nlink !== 1 || descriptor.dev !== before.dev || descriptor.ino !== before.ino
|
|
102
|
+
|| after.dev !== before.dev || after.ino !== before.ino || after.size !== before.size || bytes.length !== before.size) {
|
|
103
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version current file changed while being read');
|
|
104
|
+
}
|
|
105
|
+
return bytes;
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
await handle.close();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function readBaseFiles(input) {
|
|
112
|
+
const name = inputName(input.name);
|
|
113
|
+
if (!COMMIT.test(input.baseCommit))
|
|
114
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', 'managed version base commit is invalid');
|
|
115
|
+
const signal = input.signal ?? new AbortController().signal;
|
|
116
|
+
const check = async () => { signal.throwIfAborted(); await input.assertCurrent?.(); signal.throwIfAborted(); };
|
|
117
|
+
await check();
|
|
118
|
+
const worktree = await realpath(input.worktree);
|
|
119
|
+
if (worktree !== resolve(input.worktree))
|
|
120
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version worktree must be canonical');
|
|
121
|
+
await check();
|
|
122
|
+
const root = (await runLocalCommand('git', ['rev-parse', '--show-toplevel'], worktree, input.environment, { capture: true, maximumOutput: 4_096, timeoutMs: 15_000, signal })).trim();
|
|
123
|
+
if (root !== worktree)
|
|
124
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version worktree must be the Git top-level');
|
|
125
|
+
const verified = (await runLocalCommand('git', ['rev-parse', '--verify', `${input.baseCommit}^{commit}`], worktree, input.environment, { capture: true, maximumOutput: 4_096, timeoutMs: 15_000, signal })).trim();
|
|
126
|
+
if (verified !== input.baseCommit)
|
|
127
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base commit did not resolve exactly');
|
|
128
|
+
const paths = [`plugins/${name}/package.json`, `plugins/${name}/src/version.ts`];
|
|
129
|
+
await check();
|
|
130
|
+
const listed = await runLocalCommand('git', ['--literal-pathspecs', 'ls-tree', '-l', '-z', input.baseCommit, '--', ...paths], worktree, input.environment, { capture: true, maximumOutput: 8_192, timeoutMs: 15_000, signal });
|
|
131
|
+
const entries = new Map();
|
|
132
|
+
for (const record of listed.split('\0').filter(Boolean)) {
|
|
133
|
+
const match = /^(100644|100755) blob ([a-f0-9]{40}) +(\d+)\t(.+)$/u.exec(record);
|
|
134
|
+
if (match === null || !paths.includes(match[4]) || Number(match[3]) > MAX_FILE_BYTES || entries.has(match[4])) {
|
|
135
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base file is unavailable, unsafe, or too large');
|
|
136
|
+
}
|
|
137
|
+
entries.set(match[4], { hash: match[2], bytes: Number(match[3]) });
|
|
138
|
+
}
|
|
139
|
+
if (entries.size !== paths.length)
|
|
140
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base files must be tracked regular blobs');
|
|
141
|
+
const read = async (path) => {
|
|
142
|
+
const entry = entries.get(path);
|
|
143
|
+
await check();
|
|
144
|
+
const bytes = await runLocalBuffer('git', ['cat-file', 'blob', entry.hash], worktree, input.environment, { maximumOutput: MAX_FILE_BYTES, timeoutMs: 15_000, signal });
|
|
145
|
+
if (bytes.length !== entry.bytes)
|
|
146
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base blob changed while being read');
|
|
147
|
+
return bytes;
|
|
148
|
+
};
|
|
149
|
+
const manifest = parseManifest(await read(paths[0]), 'managed version base manifest');
|
|
150
|
+
const baseVersion = assertBaseManifest(manifest, name);
|
|
151
|
+
const source = await read(paths[1]);
|
|
152
|
+
let versionSource;
|
|
153
|
+
try {
|
|
154
|
+
versionSource = new TextDecoder('utf-8', { fatal: true }).decode(source);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base runtime version is not strict UTF-8');
|
|
158
|
+
}
|
|
159
|
+
if (versionSource !== `export const version = '${baseVersion}'\n`) {
|
|
160
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version base runtime version must be the canonical constant');
|
|
161
|
+
}
|
|
162
|
+
await check();
|
|
163
|
+
return { baseManifest: manifest, baseVersion, versionSource };
|
|
164
|
+
}
|
|
165
|
+
/** Derive, but never write, the Host-reserved patch-version file contents. */
|
|
166
|
+
export async function managedPatchVersionFiles(input) {
|
|
167
|
+
const { baseManifest, baseVersion } = await readBaseFiles(input);
|
|
168
|
+
const version = nextStablePatch(baseVersion);
|
|
169
|
+
return Object.freeze({ baseVersion, version, files: Object.freeze([
|
|
170
|
+
Object.freeze({ path: 'package.json', content: manifestWithVersion(baseManifest, version) }),
|
|
171
|
+
Object.freeze({ path: 'src/version.ts', content: `export const version = '${version}'\n` }),
|
|
172
|
+
]) });
|
|
173
|
+
}
|
|
174
|
+
/** Re-read current files and prove that only the Host-reserved version fields changed. */
|
|
175
|
+
export async function verifyManagedPatchVersion(input) {
|
|
176
|
+
const { baseManifest, baseVersion } = await readBaseFiles(input);
|
|
177
|
+
const version = nextStablePatch(baseVersion);
|
|
178
|
+
const signal = input.signal ?? new AbortController().signal;
|
|
179
|
+
const check = async () => { signal.throwIfAborted(); await input.assertCurrent?.(); signal.throwIfAborted(); };
|
|
180
|
+
await check();
|
|
181
|
+
const worktree = await realpath(input.worktree);
|
|
182
|
+
await check();
|
|
183
|
+
const manifest = parseManifest(await readCurrentRegularFile(worktree, `plugins/${input.name}/package.json`), 'managed version current manifest');
|
|
184
|
+
await check();
|
|
185
|
+
const source = await readCurrentRegularFile(worktree, `plugins/${input.name}/src/version.ts`);
|
|
186
|
+
let versionSource;
|
|
187
|
+
try {
|
|
188
|
+
versionSource = new TextDecoder('utf-8', { fatal: true }).decode(source);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version current runtime version is not strict UTF-8');
|
|
192
|
+
}
|
|
193
|
+
if (!equalExceptVersion(baseManifest, manifest, version) || versionSource !== `export const version = '${version}'\n`) {
|
|
194
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version current files differ from the base except for the reserved patch version');
|
|
195
|
+
}
|
|
196
|
+
await check();
|
|
197
|
+
return Object.freeze({ baseVersion, version });
|
|
198
|
+
}
|
|
199
|
+
/** Candidate source files may never replace Host-reserved version fields. */
|
|
200
|
+
export function assertManagedVersionPaths(files) {
|
|
201
|
+
if (!Array.isArray(files))
|
|
202
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', 'managed version files must be an array');
|
|
203
|
+
for (const file of files) {
|
|
204
|
+
if (file === null || typeof file !== 'object' || typeof file.path !== 'string' || file.path !== file.path.normalize('NFC')) {
|
|
205
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'managed version file path is not canonical');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
validateScopedPluginFiles(files);
|
|
209
|
+
if (files.some(file => file.path === 'package.json' || file.path === 'src/version.ts')) {
|
|
210
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'candidate source files cannot replace Host-managed version fields');
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=source-versioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-versioning.js","sourceRoot":"","sources":["../src/source-versioning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import type { ControlPlaneStore } from './store.js';
|
|
2
|
+
import type { PluginSourcePlan } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* T3 安全根插件绝不允许经成长执行体的隔离区窄口改写——即使产物只是待批
|
|
5
|
+
* pending plan。命中即拒绝,不进入 worktree 流程。
|
|
6
|
+
*/
|
|
7
|
+
export declare const PROTECTED_PLUGIN_DENYLIST: ReadonlySet<string>;
|
|
8
|
+
export interface ScopedPluginFile {
|
|
9
|
+
/** 相对于 plugins/<name>/ 的 POSIX 相对路径,不允许 .. 或绝对路径。 */
|
|
10
|
+
path: string;
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
export interface IsolatedWorktree {
|
|
14
|
+
worktree: string;
|
|
15
|
+
remove: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function assertPluginModificationAllowed(name: string): void;
|
|
18
|
+
export declare function resolveLocalExecutable(command: 'git' | 'pnpm', environment: NodeJS.ProcessEnv): Promise<string>;
|
|
19
|
+
export interface RunLocalOptions {
|
|
20
|
+
/** Capture stdout for the result (and bound it). When false, stdout is drained and discarded — exactly like the legacy localCommand, whose uncaptured output had no byte bound. */
|
|
21
|
+
capture?: boolean;
|
|
22
|
+
maximumOutput?: number;
|
|
23
|
+
timeoutMs?: number;
|
|
24
|
+
signal?: AbortSignal;
|
|
25
|
+
}
|
|
26
|
+
export interface RunLocalResult {
|
|
27
|
+
stdout: string;
|
|
28
|
+
stdoutBuffer: Buffer;
|
|
29
|
+
stderrTail: string;
|
|
30
|
+
durationMs: number;
|
|
31
|
+
logDigest: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function runLocalBuffer(command: 'git' | 'pnpm', args: readonly string[], cwd: string, environment: NodeJS.ProcessEnv, options?: RunLocalOptions): Promise<Buffer>;
|
|
34
|
+
export declare function runLocalCommand(command: 'git' | 'pnpm', args: readonly string[], cwd: string, environment: NodeJS.ProcessEnv, options?: RunLocalOptions): Promise<string>;
|
|
35
|
+
export declare function changedSourcePaths(worktree: string, baseCommit: string, environment: NodeJS.ProcessEnv, signal?: AbortSignal): Promise<readonly string[]>;
|
|
36
|
+
export declare function sourcePathAllowed(path: string, name: string, mode?: 'create' | 'modify'): boolean;
|
|
37
|
+
export declare function checkedSourceSnapshot(worktree: string, baseCommit: string, scopeInput: readonly string[], environment: NodeJS.ProcessEnv, preparedTree?: string, signal?: AbortSignal): Promise<{
|
|
38
|
+
checkedTreeDigest: string;
|
|
39
|
+
checkedPatchDigest: string;
|
|
40
|
+
}>;
|
|
41
|
+
/** Recheck the immutable prepared tree without rebuilding or executing candidate code. */
|
|
42
|
+
export declare function verifyPreparedSourceWorktree(plan: PluginSourcePlan, environment: NodeJS.ProcessEnv, signal?: AbortSignal): Promise<{
|
|
43
|
+
checkedTreeDigest: string;
|
|
44
|
+
checkedPatchDigest: string;
|
|
45
|
+
}>;
|
|
46
|
+
/**
|
|
47
|
+
* Create a throwaway linked git worktree under the control-plane state root,
|
|
48
|
+
* detached at exactly baseCommit. Removal prunes the worktree registration and
|
|
49
|
+
* falls back to deleting the directory.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createIsolatedWorktree(input: {
|
|
52
|
+
stateRoot: string;
|
|
53
|
+
repository: string;
|
|
54
|
+
baseCommit: string;
|
|
55
|
+
environment: NodeJS.ProcessEnv;
|
|
56
|
+
worktreeName?: string;
|
|
57
|
+
}): Promise<IsolatedWorktree>;
|
|
58
|
+
/** Host-only reconciliation of the exact durable resource; never rebuilds it. */
|
|
59
|
+
export declare function removeSourceJobWorktree(input: {
|
|
60
|
+
stateRoot: string;
|
|
61
|
+
repository: string;
|
|
62
|
+
worktree: string;
|
|
63
|
+
baseCommit: string;
|
|
64
|
+
environment: NodeJS.ProcessEnv;
|
|
65
|
+
}): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Write a bounded set of plugin files through O_NOFOLLOW handles. Every path is
|
|
68
|
+
* constrained to plugins/<name>/; the plugin root must already exist at the
|
|
69
|
+
* base commit (modify never creates a plugin root, and never touches
|
|
70
|
+
* plugins/README.md).
|
|
71
|
+
*/
|
|
72
|
+
export declare function writeScopedPluginFiles(input: {
|
|
73
|
+
worktree: string;
|
|
74
|
+
name: string;
|
|
75
|
+
files: readonly ScopedPluginFile[];
|
|
76
|
+
}): Promise<void>;
|
|
77
|
+
/** Validate bytes and paths before persisting a durable source job. */
|
|
78
|
+
export declare function validateScopedPluginFiles(files: readonly ScopedPluginFile[]): void;
|
|
79
|
+
/**
|
|
80
|
+
* A prepared modify worktree is garbage only while its plan is still waiting on
|
|
81
|
+
* the owner (pending/approved) and the plan's TTL has elapsed. Plans that
|
|
82
|
+
* reached ready-for-human-review or a release phase are retained for the
|
|
83
|
+
* owner's release workflow.
|
|
84
|
+
*/
|
|
85
|
+
export declare function preparedWorktreeIsGarbage(plan: {
|
|
86
|
+
status: string;
|
|
87
|
+
expiresAt: number;
|
|
88
|
+
}, now: number): boolean;
|
|
89
|
+
/** Parse `git worktree list --porcelain` into canonical linked-worktree paths. */
|
|
90
|
+
export declare function linkedWorktrees(repository: string, environment: NodeJS.ProcessEnv): Promise<readonly string[]>;
|
|
91
|
+
/**
|
|
92
|
+
* Remove a prepared worktree registered against `repository`. Idempotent: an
|
|
93
|
+
* already-unregistered or missing directory resolves successfully after
|
|
94
|
+
* pruning. The caller is responsible for proving the path is still inside the
|
|
95
|
+
* control-plane state root.
|
|
96
|
+
*/
|
|
97
|
+
export declare function pruneRegisteredWorktree(input: {
|
|
98
|
+
repository: string;
|
|
99
|
+
worktree: string;
|
|
100
|
+
environment: NodeJS.ProcessEnv;
|
|
101
|
+
}): Promise<void>;
|
|
102
|
+
/**
|
|
103
|
+
* Remove prepared modify worktrees whose plans expired while still waiting on
|
|
104
|
+
* the owner. Every removed path must (1) belong to a modify plan, (2) be a
|
|
105
|
+
* descendant of the control-plane state root and (3) still be a linked
|
|
106
|
+
* worktree of the plan's repository; anything outside those proofs is left
|
|
107
|
+
* untouched. Idempotent. Shared by the service and the owner CLI.
|
|
108
|
+
*/
|
|
109
|
+
export declare function gcPreparedModifyWorktrees(input: {
|
|
110
|
+
store: ControlPlaneStore;
|
|
111
|
+
statePath: string;
|
|
112
|
+
environment: NodeJS.ProcessEnv;
|
|
113
|
+
now: number;
|
|
114
|
+
}): Promise<{
|
|
115
|
+
removed: readonly string[];
|
|
116
|
+
}>;
|
|
117
|
+
//# sourceMappingURL=source-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-workspace.d.ts","sourceRoot":"","sources":["../src/source-workspace.ts"],"names":[],"mappings":"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"}
|