@openge/forge-release-vercel 0.1.1 → 0.3.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 +32 -5
- package/dist/cli-arguments.d.ts +2 -0
- package/dist/cli-arguments.d.ts.map +1 -1
- package/dist/cli-arguments.js +6 -3
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli-runner.js +1 -1
- package/dist/cli-runner.js.map +1 -1
- package/dist/contracts.d.ts +14 -3
- package/dist/contracts.d.ts.map +1 -1
- package/dist/node/managed-budget.d.ts +2 -1
- package/dist/node/managed-budget.d.ts.map +1 -1
- package/dist/node/managed-budget.js +4 -2
- package/dist/node/managed-budget.js.map +1 -1
- package/dist/node/managed-closure.d.ts +2 -0
- package/dist/node/managed-closure.d.ts.map +1 -1
- package/dist/node/managed-closure.js +11 -0
- package/dist/node/managed-closure.js.map +1 -1
- package/dist/node/managed-disposition.d.ts +36 -0
- package/dist/node/managed-disposition.d.ts.map +1 -0
- package/dist/node/managed-disposition.js +114 -0
- package/dist/node/managed-disposition.js.map +1 -0
- package/dist/node/managed-history.d.ts +6 -0
- package/dist/node/managed-history.d.ts.map +1 -0
- package/dist/node/managed-history.js +48 -0
- package/dist/node/managed-history.js.map +1 -0
- package/dist/node/managed-io.d.ts +3 -2
- package/dist/node/managed-io.d.ts.map +1 -1
- package/dist/node/managed-io.js +36 -10
- package/dist/node/managed-io.js.map +1 -1
- package/dist/node/managed-metadata.d.ts +12 -0
- package/dist/node/managed-metadata.d.ts.map +1 -0
- package/dist/node/managed-metadata.js +73 -0
- package/dist/node/managed-metadata.js.map +1 -0
- package/dist/node/managed-paths.d.ts.map +1 -1
- package/dist/node/managed-paths.js +14 -5
- package/dist/node/managed-paths.js.map +1 -1
- package/dist/node/managed-process.d.ts.map +1 -1
- package/dist/node/managed-process.js +48 -13
- package/dist/node/managed-process.js.map +1 -1
- package/dist/node/managed-recovery-lock.d.ts +1 -1
- package/dist/node/managed-recovery-lock.d.ts.map +1 -1
- package/dist/node/managed-recovery-lock.js +28 -7
- package/dist/node/managed-recovery-lock.js.map +1 -1
- package/dist/node/managed-recovery.d.ts +15 -2
- package/dist/node/managed-recovery.d.ts.map +1 -1
- package/dist/node/managed-recovery.js +87 -72
- package/dist/node/managed-recovery.js.map +1 -1
- package/dist/node/managed-release.d.ts.map +1 -1
- package/dist/node/managed-release.js +18 -3
- package/dist/node/managed-release.js.map +1 -1
- package/dist/node/managed-remote-state.d.ts +8 -0
- package/dist/node/managed-remote-state.d.ts.map +1 -0
- package/dist/node/managed-remote-state.js +63 -0
- package/dist/node/managed-remote-state.js.map +1 -0
- package/dist/node/managed-retirement.d.ts +5 -0
- package/dist/node/managed-retirement.d.ts.map +1 -0
- package/dist/node/managed-retirement.js +166 -0
- package/dist/node/managed-retirement.js.map +1 -0
- package/dist/node/managed-state.d.ts.map +1 -1
- package/dist/node/managed-state.js +29 -5
- package/dist/node/managed-state.js.map +1 -1
- package/dist/node/managed-terminal.d.ts +42 -0
- package/dist/node/managed-terminal.d.ts.map +1 -0
- package/dist/node/managed-terminal.js +163 -0
- package/dist/node/managed-terminal.js.map +1 -0
- package/dist/node/publication.d.ts.map +1 -1
- package/dist/node/publication.js +5 -1
- package/dist/node/publication.js.map +1 -1
- package/dist/node/release-context.d.ts +22 -4
- package/dist/node/release-context.d.ts.map +1 -1
- package/dist/node/release.d.ts.map +1 -1
- package/dist/node/release.js +9 -1
- package/dist/node/release.js.map +1 -1
- package/dist/node/retirement-claim.d.ts +8 -0
- package/dist/node/retirement-claim.d.ts.map +1 -0
- package/dist/node/retirement-claim.js +47 -0
- package/dist/node/retirement-claim.js.map +1 -0
- package/dist/node/retirement-host.d.ts +11 -0
- package/dist/node/retirement-host.d.ts.map +1 -0
- package/dist/node/retirement-host.js +55 -0
- package/dist/node/retirement-host.js.map +1 -0
- package/dist/node/retirement-lease.d.ts +9 -0
- package/dist/node/retirement-lease.d.ts.map +1 -0
- package/dist/node/retirement-lease.js +88 -0
- package/dist/node/retirement-lease.js.map +1 -0
- package/dist/node/retirement-record.d.ts +40 -0
- package/dist/node/retirement-record.d.ts.map +1 -0
- package/dist/node/retirement-record.js +109 -0
- package/dist/node/retirement-record.js.map +1 -0
- package/dist/node/workspace-release.js +2 -2
- package/dist/node/workspace-release.js.map +1 -1
- package/package.json +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-process.js","sourceRoot":"","sources":["../../src/node/managed-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAuG,MAAM,8BAA8B,CAAC;AACtK,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"managed-process.js","sourceRoot":"","sources":["../../src/node/managed-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ManagedPaths, ManagedState } from './release-context.js';
|
|
2
|
-
import {
|
|
2
|
+
import type { OwnedLock } from './lock.js';
|
|
3
3
|
export declare function claimManagedRecovery(paths: ManagedPaths, state: ManagedState, signal?: AbortSignal): Promise<{
|
|
4
4
|
readonly claim: OwnedLock;
|
|
5
5
|
readonly oldLock?: OwnedLock;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-recovery-lock.d.ts","sourceRoot":"","sources":["../../src/node/managed-recovery-lock.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"managed-recovery-lock.d.ts","sourceRoot":"","sources":["../../src/node/managed-recovery-lock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAc3C,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC,CAyC/K"}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
import { randomUUID } from 'node:crypto';
|
|
2
1
|
import { unlink } from 'node:fs/promises';
|
|
3
|
-
import { acquireLock } from './lock.js';
|
|
4
2
|
import { record, ReleaseError } from './errors.js';
|
|
5
3
|
import { assertManagedPaths, assertManagementUntracked } from './managed-paths.js';
|
|
6
4
|
import { fileIdentity, measureManagedUsage, pathExists, readBoundedJson, sameIdentity } from './managed-io.js';
|
|
7
|
-
import { currentCoordinator } from './process-identities.js';
|
|
8
5
|
import { parseManagedState } from './managed-state.js';
|
|
9
6
|
import { Execution } from './execution.js';
|
|
7
|
+
import { hasManagedDisposition } from './managed-disposition.js';
|
|
8
|
+
import { acquireRetirementLease } from './retirement-lease.js';
|
|
9
|
+
import { readRetirementHost } from './retirement-host.js';
|
|
10
|
+
import { claimRetirement } from './retirement-claim.js';
|
|
11
|
+
import { retirementDigest } from './retirement-record.js';
|
|
12
|
+
import { assertMetadataFile, inspectMetadataFile } from './managed-metadata.js';
|
|
13
|
+
import { assertManagedHistory } from './managed-history.js';
|
|
10
14
|
export async function claimManagedRecovery(paths, state, signal) {
|
|
11
15
|
await assertManagedPaths(paths);
|
|
12
|
-
const management = new Execution(state.source.root, state.source.config,
|
|
16
|
+
const management = new Execution(state.source.root, state.source.config, undefined, []);
|
|
13
17
|
await assertManagementUntracked(state.source, management);
|
|
14
18
|
const config = state.source.config.source;
|
|
15
19
|
if (config.mode !== 'managed-commit')
|
|
@@ -17,15 +21,32 @@ export async function claimManagedRecovery(paths, state, signal) {
|
|
|
17
21
|
const usage = await measureManagedUsage(paths);
|
|
18
22
|
if (usage.bytes + 1024 > config.maxBytes || usage.freeBytes - 1024 < config.minFreeBytes)
|
|
19
23
|
throw new ReleaseError('BUDGET_EXCEEDED', { reason: 'RECOVERY_ADMISSION' });
|
|
20
|
-
|
|
24
|
+
await assertManagedHistory(paths, state);
|
|
25
|
+
const stateFile = await inspectMetadataFile(paths.statePath);
|
|
26
|
+
const lease = await acquireRetirementLease(paths, await readRetirementHost(signal), signal);
|
|
27
|
+
const guard = async () => { await lease.assertOwned(); await assertManagedPaths(paths); await assertManagementUntracked(state.source, management); await assertMetadataFile(paths.statePath, stateFile); };
|
|
28
|
+
let rawClaim;
|
|
29
|
+
try {
|
|
30
|
+
rawClaim = await claimRetirement(paths, state, retirementDigest({ runId: state.runId, slotId: state.slotId, stateFile }), lease, guard, signal, 'managed-recovery-claim');
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
await lease.release();
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
21
36
|
const assertClaim = async () => { await assertManagedPaths(paths); await assertManagementUntracked(state.source, management); await rawClaim.assertOwned(); };
|
|
22
|
-
const claim = { assertOwned: assertClaim, release: async () => {
|
|
37
|
+
const claim = { assertOwned: assertClaim, release: async () => { try {
|
|
38
|
+
await assertClaim();
|
|
39
|
+
await rawClaim.release();
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await lease.release();
|
|
43
|
+
} } };
|
|
23
44
|
try {
|
|
24
45
|
const current = parseManagedState(await readBoundedJson(paths.statePath), state.source, state.slotId);
|
|
25
46
|
if (JSON.stringify(current) !== JSON.stringify(state))
|
|
26
47
|
throw new ReleaseError('RECOVERY_REQUIRED', { reason: 'RUN_CHANGED' });
|
|
27
48
|
if (!await pathExists(paths.lockPath)) {
|
|
28
|
-
if (state.status !== 'closed'
|
|
49
|
+
if (state.status !== 'closed' && !await hasManagedDisposition(paths, state))
|
|
29
50
|
throw new ReleaseError('LOCK_OWNERSHIP', { reason: 'RUN_LOCK_MISSING' });
|
|
30
51
|
return { claim };
|
|
31
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-recovery-lock.js","sourceRoot":"","sources":["../../src/node/managed-recovery-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"managed-recovery-lock.js","sourceRoot":"","sources":["../../src/node/managed-recovery-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import type { ManagedPaths, ManagedReceipt, ManagedState } from './release-context.js';
|
|
1
|
+
import type { FrozenSource, ManagedAnchor, ManagedPaths, ManagedReceipt, ManagedState } from './release-context.js';
|
|
2
2
|
import { Execution } from './execution.js';
|
|
3
|
-
import type { ReleaseRefRelation, ReleaseReport, RunReleaseOptions } from '../contracts.js';
|
|
3
|
+
import type { ReleaseRecoveryObservation, ReleaseRefRelation, ReleaseReport, RunReleaseOptions } from '../contracts.js';
|
|
4
4
|
export declare function classifyRemoteRef(execution: Execution, sha: string, ref: string): Promise<ReleaseRefRelation>;
|
|
5
|
+
export declare function observeRefs(execution: Execution, source: FrozenSource, observation: RecoveryObservation): Promise<ReleaseRecoveryObservation>;
|
|
6
|
+
export declare function observeRefsForDisposition(execution: Execution, source: FrozenSource, observation: RecoveryObservation): Promise<ReleaseRecoveryObservation>;
|
|
7
|
+
export declare function settleManagedSlot(options: RunReleaseOptions): Promise<void>;
|
|
5
8
|
export declare function runManagedReceiptCommand(options: RunReleaseOptions): Promise<ReleaseReport>;
|
|
6
9
|
export interface RecoveryObservation {
|
|
7
10
|
readonly owner: 'inactive' | 'active' | 'unknown';
|
|
@@ -9,5 +12,15 @@ export interface RecoveryObservation {
|
|
|
9
12
|
readonly knownCount: number;
|
|
10
13
|
}
|
|
11
14
|
export declare function inspectManagedRecovery(state: ManagedState, paths: ManagedPaths, signal?: AbortSignal, reader?: import("@openge/forge-process-control").ProcessIdentityReader): Promise<RecoveryObservation>;
|
|
15
|
+
export interface ManagedLocation {
|
|
16
|
+
readonly root: string;
|
|
17
|
+
readonly configPath: string;
|
|
18
|
+
readonly anchor: ManagedAnchor;
|
|
19
|
+
readonly paths: ManagedPaths;
|
|
20
|
+
readonly repository: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function readManagedLocation(cwd: string, configPath: string): Promise<ManagedLocation>;
|
|
23
|
+
export declare function frozenSource(value: unknown, location: ManagedLocation): FrozenSource;
|
|
24
|
+
export declare function assertHistoricalSource(source: FrozenSource, signal?: AbortSignal): Promise<void>;
|
|
12
25
|
export declare function selectManagedPublication(sourceRoot: string, configPath: string, sha?: string): Promise<ManagedReceipt>;
|
|
13
26
|
//# sourceMappingURL=managed-recovery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-recovery.d.ts","sourceRoot":"","sources":["../../src/node/managed-recovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"managed-recovery.d.ts","sourceRoot":"","sources":["../../src/node/managed-recovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgB,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAA+B,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAM/J,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAuD,0BAA0B,EAAE,kBAAkB,EAAE,aAAa,EAAgB,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAgB3L,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQnH;AAgBD,wBAAsB,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAMnJ;AACD,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAQjK;AAwCD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAajF;AAuCD,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiDjG;AAED,MAAM,WAAW,mBAAmB;IAAG,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAC7K,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,gEAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA6BpK;AAED,MAAM,WAAW,eAAe;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAMlL,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAsBnG;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,GAAG,YAAY,CAOpF;AACD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtG;AAaD,wBAAsB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAE5H"}
|
|
@@ -3,7 +3,7 @@ import { resolve } from 'node:path';
|
|
|
3
3
|
import { assertActive, record, ReleaseError } from './errors.js';
|
|
4
4
|
import { assertPathChain, pathExists, readBoundedJson, within } from './managed-io.js';
|
|
5
5
|
import { assertManagedPaths } from './managed-paths.js';
|
|
6
|
-
import {
|
|
6
|
+
import { parseManagedReceipt, parseManagedState } from './managed-state.js';
|
|
7
7
|
import { validateReleaseConfig } from './config.js';
|
|
8
8
|
import { Execution } from './execution.js';
|
|
9
9
|
import { assertRepository, normalizeRepository, remoteRefs } from './git.js';
|
|
@@ -18,7 +18,11 @@ import { openManagedSlot } from './managed-paths.js';
|
|
|
18
18
|
import { createManagedSession } from './managed-process.js';
|
|
19
19
|
import { assertCheckoutFrozen } from './managed-checkout.js';
|
|
20
20
|
import { publishCandidate } from './publication.js';
|
|
21
|
-
import {
|
|
21
|
+
import { hasVerifiedManagedStop } from './managed-closure.js';
|
|
22
|
+
import { discardPreparedState, restoreManagedTerminal } from './managed-terminal.js';
|
|
23
|
+
import { archiveManagedDisposition, assertDispositionSnapshot, hasManagedDisposition, readManagedDisposition } from './managed-disposition.js';
|
|
24
|
+
import { hasFinalizedRetirement } from './retirement-record.js';
|
|
25
|
+
import { assertManagedHistory } from './managed-history.js';
|
|
22
26
|
export async function classifyRemoteRef(execution, sha, ref) {
|
|
23
27
|
if (sha === ref)
|
|
24
28
|
return 'candidate';
|
|
@@ -39,29 +43,41 @@ export async function classifyRemoteRef(execution, sha, ref) {
|
|
|
39
43
|
if (before)
|
|
40
44
|
return 'before';
|
|
41
45
|
const after = await ancestor(sha, ref);
|
|
42
|
-
return after === undefined ? 'unknown' : after ? '
|
|
46
|
+
return after === undefined ? 'unknown' : after ? 'superseded' : 'diverged';
|
|
43
47
|
}
|
|
44
48
|
function receiptReport(options, outcome) {
|
|
45
49
|
const { source, location } = outcome;
|
|
46
50
|
return { schemaVersion: 2, command: options.command, ok: outcome.failure === undefined, startedAt: outcome.startedAt, finishedAt: new Date().toISOString(),
|
|
47
51
|
stage: outcome.stage, steps: outcome.steps, effects: { ...outcome.effects }, ...(outcome.runId ? { runId: outcome.runId } : {}),
|
|
48
52
|
...(source && location ? { sourceRoot: source.root, executionRoot: location.paths.checkoutRoot, slotId: location.anchor.slotId, candidateSha: source.sha, configSha256: source.configSha256, configPath: source.configPath,
|
|
49
|
-
recovery: { candidateSha: source.sha, reportPath: resolve(location.paths.slotRoot, `latest-${outcome.kind ?? 'publish'}.json`), nextCommand: recoveryCommand(outcome.next ?? 'verify', source), ...(outcome.refs ? { observation: outcome.refs } : {}) } } : {}),
|
|
53
|
+
recovery: { candidateSha: source.sha, reportPath: resolve(location.paths.slotRoot, `latest-${outcome.kind ?? 'publish'}.json`), nextCommand: recoveryCommand(outcome.next ?? 'verify', source), ...(outcome.reportExists === undefined ? {} : { reportExists: outcome.reportExists }), ...(outcome.refs ? { observation: outcome.refs } : {}) } } : {}),
|
|
50
54
|
...(outcome.observation ? { processes: { status: outcome.observation.processes, knownCount: outcome.observation.knownCount } } : {}),
|
|
51
55
|
...(outcome.budget ? { budget: outcome.budget } : {}), ...(outcome.deployment ? { deployment: outcome.deployment } : {}), ...(outcome.failure ? { error: outcome.failure } : {}) };
|
|
52
56
|
}
|
|
53
|
-
async function observeRefs(execution, source, observation) {
|
|
57
|
+
export async function observeRefs(execution, source, observation) {
|
|
54
58
|
const refs = await remoteRefs(execution, source.config);
|
|
55
59
|
const development = refs[source.config.git.developmentBranch] ?? '', release = refs[source.config.git.releaseBranch] ?? '';
|
|
56
60
|
return { owner: observation.owner, processes: observation.processes, observedAt: new Date().toISOString(),
|
|
57
61
|
developmentRef: { sha: development, relation: await classifyRemoteRef(execution, source.sha, development) },
|
|
58
62
|
releaseRef: { sha: release, relation: await classifyRemoteRef(execution, source.sha, release) } };
|
|
59
63
|
}
|
|
64
|
+
export async function observeRefsForDisposition(execution, source, observation) {
|
|
65
|
+
try {
|
|
66
|
+
return await observeRefs(execution, source, observation);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
assertActive(execution.signal);
|
|
70
|
+
if (!(error instanceof ReleaseError) || !['GIT_FAILED', 'GIT_DIVERGED', 'COMMAND_TIMEOUT'].includes(error.code))
|
|
71
|
+
throw error;
|
|
72
|
+
return { owner: observation.owner, processes: observation.processes, observedAt: new Date().toISOString(),
|
|
73
|
+
developmentRef: { sha: '', relation: 'unknown' }, releaseRef: { sha: '', relation: 'unknown' } };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
60
76
|
async function recoverManagedPublication(options) {
|
|
61
77
|
const startedAt = new Date().toISOString();
|
|
62
78
|
let location, source, state;
|
|
63
79
|
let recovery, observation, refs;
|
|
64
|
-
let budget,
|
|
80
|
+
let budget, failure;
|
|
65
81
|
let effects = { developmentPush: 'not-attempted', releasePush: 'not-attempted' };
|
|
66
82
|
try {
|
|
67
83
|
assertActive(options.signal);
|
|
@@ -74,56 +90,26 @@ async function recoverManagedPublication(options) {
|
|
|
74
90
|
effects = { ...state.effects };
|
|
75
91
|
await assertHistoricalSource(source, options.signal);
|
|
76
92
|
recovery = await claimManagedRecovery(location.paths, state, options.signal);
|
|
77
|
-
|
|
93
|
+
const restored = await restoreManagedTerminal(location.paths, state, { allowReleasedLock: !recovery.oldLock, ...(options.signal ? { signal: options.signal } : {}) });
|
|
94
|
+
observation = await inspectManagedRecovery(restored.state, location.paths, options.signal);
|
|
95
|
+
refs = { owner: observation.owner, processes: observation.processes, observedAt: new Date().toISOString() };
|
|
78
96
|
if (source.config.source.mode !== 'managed-commit')
|
|
79
97
|
throw new ReleaseError('SOURCE_UNSUPPORTED');
|
|
80
98
|
budget = new BudgetMonitor(location.paths, source.config.source);
|
|
81
99
|
await budget.sample();
|
|
82
100
|
const execution = new Execution(source.root, source.config, options.signal, []);
|
|
83
|
-
refs = await
|
|
84
|
-
const verify = new VercelVerification(source.config, options.transport ?? createTransport(execution), options.signal);
|
|
85
|
-
await verify.project();
|
|
86
|
-
deployment = await verify.find(source.sha);
|
|
101
|
+
refs = await observeRefsForDisposition(execution, source, observation);
|
|
87
102
|
if (observation.owner !== 'inactive')
|
|
88
103
|
throw new ReleaseError('RECOVERY_REQUIRED', { reason: 'OWNER_NOT_INACTIVE', owner: observation.owner });
|
|
89
104
|
if (observation.processes !== 'closed')
|
|
90
105
|
throw new ReleaseError('PROCESS_STATE_UNKNOWN', { reason: 'CLOSURE_UNPROVEN', processes: observation.processes });
|
|
91
|
-
for (const [effect, ref] of [['developmentPush', refs.developmentRef], ['releasePush', refs.releaseRef]]) {
|
|
92
|
-
if (state.effects[effect] !== 'unknown' && state.pendingPush !== effect)
|
|
93
|
-
continue;
|
|
94
|
-
if (!ref || !['candidate', 'before'].includes(ref.relation))
|
|
95
|
-
throw new ReleaseError('RECOVERY_REQUIRED', { reason: 'REMOTE_NOT_RESUMABLE', effect, relation: ref?.relation, sha: ref?.sha });
|
|
96
|
-
effects[effect] = ref.relation === 'candidate' ? 'already-current' : 'not-current';
|
|
97
|
-
}
|
|
98
106
|
await budget.sample();
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
if (state.command !== 'verify') {
|
|
106
|
-
const previous = await store.readReceipt(kind);
|
|
107
|
-
if (previous && previous.report.runId === state.runId) {
|
|
108
|
-
await store.writeReceipt(kind, { ...previous, report: { ...previous.report,
|
|
109
|
-
recovery: { candidateSha: source.sha, reportPath: resolve(location.paths.slotRoot, `latest-${kind}.json`), nextCommand: recoveryCommand('publish', source), observation: refs } } });
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
const interrupted = { schemaVersion: 2, command: state.command, ok: false, startedAt, finishedAt: new Date().toISOString(),
|
|
113
|
-
candidateSha: source.sha, configSha256: source.configSha256, sourceRoot: source.root, executionRoot: location.paths.checkoutRoot,
|
|
114
|
-
slotId: state.slotId, runId: state.runId, configPath: source.configPath, stage: state.stage, steps: [], effects: { ...state.effects },
|
|
115
|
-
error: { code: 'RECOVERY_REQUIRED', details: { reason: 'RECOVERED_INTERRUPTED_RUN' } }, recovery: { candidateSha: source.sha,
|
|
116
|
-
reportPath: resolve(location.paths.slotRoot, `latest-${kind}.json`), nextCommand: recoveryCommand('publish', source), observation: refs } };
|
|
117
|
-
await store.writeReceipt(kind, { schemaVersion: 2, slotId: state.slotId, source, report: interrupted });
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
oldState.effects = effects;
|
|
121
|
-
delete oldState.pendingPush;
|
|
122
|
-
oldState.status = 'closed';
|
|
123
|
-
await store.writeState(oldState);
|
|
124
|
-
// 旧运行的关键结果全部持久化后,才精确释放原锁;恢复声明仍阻止新运行进入。
|
|
125
|
-
await oldLock.release();
|
|
126
|
-
}
|
|
107
|
+
const oldLocation = location, claim = recovery.claim, oldLock = recovery.oldLock, frozen = source;
|
|
108
|
+
const guard = async () => { await assertHistoricalSource(frozen, options.signal); await assertManagedPaths(oldLocation.paths); await claim.assertOwned(); await oldLock?.assertOwned(); };
|
|
109
|
+
const archived = await archiveManagedDisposition(location.paths, state, restored.state, guard, refs);
|
|
110
|
+
await discardPreparedState(location.paths, restored.terminal, async () => { await guard(); await assertDispositionSnapshot(oldLocation.paths, archived, !!oldLock); });
|
|
111
|
+
// 原始失败和未决副作用均已归档;这里只结束本地占用,不重放远端操作。
|
|
112
|
+
await oldLock?.release();
|
|
127
113
|
}
|
|
128
114
|
catch (error) {
|
|
129
115
|
failure = diagnostic(error);
|
|
@@ -138,15 +124,44 @@ async function recoverManagedPublication(options) {
|
|
|
138
124
|
}
|
|
139
125
|
}
|
|
140
126
|
}
|
|
141
|
-
|
|
127
|
+
let reportExists;
|
|
128
|
+
if (location) {
|
|
129
|
+
try {
|
|
130
|
+
reportExists = await pathExists(resolve(location.paths.slotRoot, state?.command === 'check' ? 'latest-check.json' : 'latest-publish.json'));
|
|
131
|
+
}
|
|
132
|
+
catch { /* 存在性未知时省略此字段,不把路径文本当作文件证据。 */ }
|
|
133
|
+
}
|
|
134
|
+
return receiptReport(options, { startedAt, stage: failure ? 'recover' : 'complete', steps: [], effects, ...(reportExists === undefined ? {} : { reportExists }),
|
|
142
135
|
...(source ? { source } : {}), ...(location ? { location } : {}), ...(state ? { runId: state.runId, kind: state.command === 'check' ? 'check' : 'publish' } : {}),
|
|
143
|
-
...(observation ? { observation } : {}), ...(refs ? { refs } : {}), ...(budget ? { budget: budget.summary() } : {}), ...(
|
|
144
|
-
next: failure ? 'recover' : effects.releasePush === 'pushed' || effects.releasePush === 'already-current' ? 'verify' : 'publish' });
|
|
136
|
+
...(observation ? { observation } : {}), ...(refs ? { refs } : {}), ...(budget ? { budget: budget.summary() } : {}), ...(failure ? { failure } : {}),
|
|
137
|
+
next: failure ? failure.details.reason === 'CLOSURE_UNPROVEN' && state ? `retire --run-id ${state.runId}` : 'recover' : effects.releasePush === 'pushed' || effects.releasePush === 'already-current' ? 'verify' : 'publish' });
|
|
138
|
+
}
|
|
139
|
+
export async function settleManagedSlot(options) {
|
|
140
|
+
if (!await pathExists(resolve(options.cwd, '.tmp/forge-vercel-release/managed.json')))
|
|
141
|
+
return;
|
|
142
|
+
const location = await readManagedLocation(options.cwd, options.configPath ?? 'release.config.json');
|
|
143
|
+
const value = await readBoundedJson(location.paths.statePath);
|
|
144
|
+
if (value === undefined)
|
|
145
|
+
throw new ReleaseError('RECOVERY_REQUIRED', { reason: 'STATE_MISSING' });
|
|
146
|
+
const source = frozenSource(record(value).source, location), state = parseManagedState(value, source, location.anchor.slotId);
|
|
147
|
+
await assertHistoricalSource(source, options.signal);
|
|
148
|
+
if (!await pathExists(location.paths.lockPath) && (await hasManagedDisposition(location.paths, state)
|
|
149
|
+
|| await hasFinalizedRetirement(location.paths, state)
|
|
150
|
+
|| (state.status === 'closed' && !state.pendingPush && !Object.values(state.effects).includes('unknown') && state.processes.every(hasVerifiedManagedStop))))
|
|
151
|
+
return;
|
|
152
|
+
const recovered = await recoverManagedPublication({ ...options, command: 'recover' });
|
|
153
|
+
if (!recovered.ok)
|
|
154
|
+
throw new ReleaseError(recovered.error?.code ?? 'RECOVERY_REQUIRED', { ...recovered.error?.details,
|
|
155
|
+
runId: state.runId, ...(recovered.recovery?.nextCommand ? { nextCommand: recovered.recovery.nextCommand } : {}) });
|
|
145
156
|
}
|
|
146
157
|
async function runManagedVerification(options) {
|
|
147
158
|
const startedAt = new Date().toISOString();
|
|
148
159
|
let selected, slot, session;
|
|
149
160
|
let failure, deployment, closed = true;
|
|
161
|
+
const report = () => receiptReport(options, { startedAt, stage: session?.state.stage ?? 'source', steps: session?.steps ?? [], effects: session?.state.effects ?? { developmentPush: 'not-attempted', releasePush: 'not-attempted' },
|
|
162
|
+
...(selected ? { source: selected.receipt.source, location: selected.location, ...(session ? { runId: session.state.runId } : {}) } : {}),
|
|
163
|
+
...(session ? { observation: { owner: closed ? 'inactive' : 'unknown', processes: closed ? 'closed' : 'unknown', knownCount: new Set(session.state.processes.flatMap(command => [...command.descendants, ...(command.identity ? [command.identity] : [])]).map(identity => `${String(identity.pid)}:${identity.startToken}`)).size }, budget: session.budget.summary() } : {}),
|
|
164
|
+
...(deployment ? { deployment } : {}), ...(failure ? { failure } : {}), next: closed ? 'verify' : 'recover' });
|
|
150
165
|
try {
|
|
151
166
|
if (options.config !== undefined)
|
|
152
167
|
throw new ReleaseError('SOURCE_UNSUPPORTED', { reason: 'COMMITTED_CONFIG_REQUIRED' });
|
|
@@ -155,6 +170,7 @@ async function runManagedVerification(options) {
|
|
|
155
170
|
if (!await pathExists(resolve(selected.location.paths.checkoutRoot, '.git')))
|
|
156
171
|
throw new ReleaseError('RECOVERY_REQUIRED', { reason: 'CHECKOUT_MISSING' });
|
|
157
172
|
const original = new Execution(source.root, source.config, options.signal, []);
|
|
173
|
+
await settleManagedSlot(options);
|
|
158
174
|
slot = await openManagedSlot(source, original);
|
|
159
175
|
session = await createManagedSession(slot, 'verify', options.signal);
|
|
160
176
|
const current = session;
|
|
@@ -172,7 +188,7 @@ async function runManagedVerification(options) {
|
|
|
172
188
|
}
|
|
173
189
|
if (session) {
|
|
174
190
|
try {
|
|
175
|
-
await session.
|
|
191
|
+
await session.assertStopped();
|
|
176
192
|
}
|
|
177
193
|
catch {
|
|
178
194
|
closed = false;
|
|
@@ -180,6 +196,11 @@ async function runManagedVerification(options) {
|
|
|
180
196
|
session.state.status = closed ? 'closed' : 'unknown';
|
|
181
197
|
try {
|
|
182
198
|
await session.persist();
|
|
199
|
+
if (closed) {
|
|
200
|
+
const completed = session;
|
|
201
|
+
await completed.assertStopped();
|
|
202
|
+
await archiveManagedDisposition(completed.slot.paths, completed.state, completed.state, () => completed.slot.lock.assertOwned(), undefined, false, report());
|
|
203
|
+
}
|
|
183
204
|
}
|
|
184
205
|
catch (error) {
|
|
185
206
|
failure ??= diagnostic(error);
|
|
@@ -195,10 +216,7 @@ async function runManagedVerification(options) {
|
|
|
195
216
|
closed = false;
|
|
196
217
|
}
|
|
197
218
|
}
|
|
198
|
-
return
|
|
199
|
-
...(selected ? { source: selected.receipt.source, location: selected.location, ...(session ? { runId: session.state.runId } : {}) } : {}),
|
|
200
|
-
...(session ? { observation: { owner: closed ? 'inactive' : 'unknown', processes: closed ? 'closed' : 'unknown', knownCount: new Set(session.state.processes.flatMap(command => [...command.descendants, ...(command.identity ? [command.identity] : [])]).map(identity => `${String(identity.pid)}:${identity.startToken}`)).size }, budget: session.budget.summary() } : {}),
|
|
201
|
-
...(deployment ? { deployment } : {}), ...(failure ? { failure } : {}), next: closed ? 'verify' : 'recover' });
|
|
219
|
+
return report();
|
|
202
220
|
}
|
|
203
221
|
export async function runManagedReceiptCommand(options) {
|
|
204
222
|
if (options.command === 'recover')
|
|
@@ -225,23 +243,18 @@ export async function runManagedReceiptCommand(options) {
|
|
|
225
243
|
const stateSource = frozenSource(record(stateValue).source, location);
|
|
226
244
|
await assertHistoricalSource(stateSource, options.signal);
|
|
227
245
|
const state = parseManagedState(stateValue, stateSource, location.anchor.slotId);
|
|
228
|
-
|
|
229
|
-
|
|
246
|
+
await assertManagedHistory(location.paths, state);
|
|
247
|
+
const restored = await restoreManagedTerminal(location.paths, state, { allowReleasedLock: !await pathExists(location.paths.lockPath), ...(options.signal ? { signal: options.signal } : {}) });
|
|
248
|
+
observation = await inspectManagedRecovery(restored.state, location.paths, options.signal);
|
|
249
|
+
const locallyReady = await hasManagedDisposition(location.paths, state);
|
|
250
|
+
needsRecovery = observation.owner !== 'inactive' || observation.processes !== 'closed' || (state.status !== 'closed' && !locallyReady);
|
|
230
251
|
const execution = new Execution(source.root, source.config, options.signal, []);
|
|
231
252
|
refs = await observeRefs(execution, source, observation);
|
|
232
|
-
const
|
|
233
|
-
const
|
|
234
|
-
for (const [effect, previous, current] of [['developmentPush', proof?.developmentRef, refs.developmentRef], ['releasePush', proof?.releaseRef, refs.releaseRef]]) {
|
|
253
|
+
const published = receipt.report.runId ? await readManagedDisposition(location.paths, receipt.report.runId) : undefined;
|
|
254
|
+
for (const [effect, current] of [['developmentPush', refs.developmentRef], ['releasePush', refs.releaseRef]]) {
|
|
235
255
|
if (effects[effect] !== 'unknown')
|
|
236
256
|
continue;
|
|
237
|
-
|
|
238
|
-
&& Number.isFinite(Date.parse(proof.observedAt)) && previous && /^[a-f0-9]{40}$/u.test(previous.sha)
|
|
239
|
-
&& (previous.relation === 'candidate' ? previous.sha === source.sha : previous.relation === 'before' && previous.sha !== source.sha);
|
|
240
|
-
if (witnessed && current?.relation === 'candidate')
|
|
241
|
-
effects[effect] = 'already-current';
|
|
242
|
-
else if (witnessed && current?.relation === 'before')
|
|
243
|
-
effects[effect] = 'not-current';
|
|
244
|
-
else
|
|
257
|
+
if (!published || published.stopped.source.sha !== source.sha || !current || !['candidate', 'superseded'].includes(current.relation))
|
|
245
258
|
needsRecovery = true;
|
|
246
259
|
}
|
|
247
260
|
stage = 'deployment';
|
|
@@ -275,7 +288,7 @@ export async function inspectManagedRecovery(state, paths, signal, reader = iden
|
|
|
275
288
|
const controller = new AbortController(), timer = setTimeout(() => controller.abort(), Math.min(30_000, state.source.config.limits.commandMs));
|
|
276
289
|
const combined = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;
|
|
277
290
|
const identities = new Map(state.processes.flatMap(command => [...command.descendants, ...(command.identity ? [command.identity] : [])]).map(value => [`${String(value.pid)}:${value.startToken}`, value]));
|
|
278
|
-
const unresolved = state.processes.filter(command => !
|
|
291
|
+
const unresolved = state.processes.filter(command => !hasVerifiedManagedStop(command));
|
|
279
292
|
const pendingIdentities = new Map(unresolved.flatMap(command => [...command.descendants, ...(command.identity ? [command.identity] : [])]).map(value => [`${String(value.pid)}:${value.startToken}`, value]));
|
|
280
293
|
let owner = 'unknown';
|
|
281
294
|
let unknown = unresolved.length > 0, running = false;
|
|
@@ -285,7 +298,9 @@ export async function inspectManagedRecovery(state, paths, signal, reader = iden
|
|
|
285
298
|
if (observed.status === 'ABSENT')
|
|
286
299
|
owner = 'inactive';
|
|
287
300
|
else if (observed.identity.startToken === state.coordinator.startToken)
|
|
288
|
-
owner = await pathExists(paths.lockPath) ? 'active' : state.status === 'closed' ? 'inactive' : 'unknown';
|
|
301
|
+
owner = await pathExists(paths.lockPath) ? 'active' : state.status === 'closed' || await hasManagedDisposition(paths, state) ? 'inactive' : 'unknown';
|
|
302
|
+
else
|
|
303
|
+
owner = 'inactive';
|
|
289
304
|
}
|
|
290
305
|
catch {
|
|
291
306
|
assertActive(signal);
|
|
@@ -323,7 +338,7 @@ function identity(value) {
|
|
|
323
338
|
throw new ReleaseError('SLOT_STATE', { reason: 'FILE_IDENTITY' });
|
|
324
339
|
return { dev: item.dev, ino: item.ino };
|
|
325
340
|
}
|
|
326
|
-
async function readManagedLocation(cwd, configPath) {
|
|
341
|
+
export async function readManagedLocation(cwd, configPath) {
|
|
327
342
|
const root = await realpath(cwd), path = relativeConfigPath(root, configPath), anchorPath = resolve(root, '.tmp/forge-vercel-release/managed.json');
|
|
328
343
|
await assertPathChain(root, anchorPath);
|
|
329
344
|
const value = await readBoundedJson(anchorPath, 65_536);
|
|
@@ -351,7 +366,7 @@ async function readManagedLocation(cwd, configPath) {
|
|
|
351
366
|
await assertManagedPaths(paths);
|
|
352
367
|
return { root, configPath: path, anchor, paths, repository: owner.repository };
|
|
353
368
|
}
|
|
354
|
-
function frozenSource(value, location) {
|
|
369
|
+
export function frozenSource(value, location) {
|
|
355
370
|
const item = record(value), config = validateReleaseConfig(item.config);
|
|
356
371
|
if (item.root !== location.root || item.configPath !== location.configPath || typeof item.sha !== 'string' || !/^[a-f0-9]{40}$/u.test(item.sha)
|
|
357
372
|
|| typeof item.configBlobOid !== 'string' || !/^[a-f0-9]{40}$/u.test(item.configBlobOid) || typeof item.configSha256 !== 'string' || !/^[a-f0-9]{64}$/u.test(item.configSha256)
|
|
@@ -360,7 +375,7 @@ function frozenSource(value, location) {
|
|
|
360
375
|
throw new ReleaseError('SLOT_STATE', { reason: 'FROZEN_SOURCE' });
|
|
361
376
|
return { root: location.root, configPath: location.configPath, sha: item.sha, config, configBlobOid: item.configBlobOid, configSha256: item.configSha256, fetchUrl: item.fetchUrl };
|
|
362
377
|
}
|
|
363
|
-
async function assertHistoricalSource(source, signal) {
|
|
378
|
+
export async function assertHistoricalSource(source, signal) {
|
|
364
379
|
const execution = new Execution(source.root, source.config, signal, []);
|
|
365
380
|
try {
|
|
366
381
|
await assertRepository(execution, source.config);
|