@codyswann/lisa 4.28.5 → 4.29.1
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/all/copy-overwrite/scripts/lisa-gates.mjs +2 -1
- package/all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh +3 -2
- package/cdk/create-only/vitest.config.local.ts +5 -1
- package/cdk/package-lisa/package.lisa.json +14 -7
- package/dist/cli/lisa-test-run-bootstrap.d.ts +3 -0
- package/dist/cli/lisa-test-run-bootstrap.d.ts.map +1 -0
- package/dist/cli/lisa-test-run-bootstrap.js +201 -0
- package/dist/cli/lisa-test-run-bootstrap.js.map +1 -0
- package/dist/cli/lisa-test-run-ipc.d.ts +42 -0
- package/dist/cli/lisa-test-run-ipc.d.ts.map +1 -0
- package/dist/cli/lisa-test-run-ipc.js +200 -0
- package/dist/cli/lisa-test-run-ipc.js.map +1 -0
- package/dist/cli/lisa-test-run-process-group.d.ts +30 -0
- package/dist/cli/lisa-test-run-process-group.d.ts.map +1 -0
- package/dist/cli/lisa-test-run-process-group.js +123 -0
- package/dist/cli/lisa-test-run-process-group.js.map +1 -0
- package/dist/cli/lisa-test-run-reaper.d.ts +3 -0
- package/dist/cli/lisa-test-run-reaper.d.ts.map +1 -0
- package/dist/cli/lisa-test-run-reaper.js +195 -0
- package/dist/cli/lisa-test-run-reaper.js.map +1 -0
- package/dist/cli/lisa-test-run-runtime.d.ts +46 -0
- package/dist/cli/lisa-test-run-runtime.d.ts.map +1 -0
- package/dist/cli/lisa-test-run-runtime.js +123 -0
- package/dist/cli/lisa-test-run-runtime.js.map +1 -0
- package/dist/cli/lisa-test-run-supervisor.d.ts +13 -0
- package/dist/cli/lisa-test-run-supervisor.d.ts.map +1 -0
- package/dist/cli/lisa-test-run-supervisor.js +268 -0
- package/dist/cli/lisa-test-run-supervisor.js.map +1 -0
- package/dist/cli/lisa-test-run.d.ts +3 -0
- package/dist/cli/lisa-test-run.d.ts.map +1 -0
- package/dist/cli/lisa-test-run.js +66 -0
- package/dist/cli/lisa-test-run.js.map +1 -0
- package/dist/configs/vitest/base.d.ts.map +1 -1
- package/dist/configs/vitest/base.js +5 -2
- package/dist/configs/vitest/base.js.map +1 -1
- package/dist/configs/vitest/cdk.d.ts +4 -0
- package/dist/configs/vitest/cdk.d.ts.map +1 -1
- package/dist/configs/vitest/cdk.js +5 -0
- package/dist/configs/vitest/cdk.js.map +1 -1
- package/dist/configs/vitest/harper-fabric.d.ts.map +1 -1
- package/dist/configs/vitest/harper-fabric.js +1 -0
- package/dist/configs/vitest/harper-fabric.js.map +1 -1
- package/dist/configs/vitest/nestjs.d.ts.map +1 -1
- package/dist/configs/vitest/nestjs.js +1 -0
- package/dist/configs/vitest/nestjs.js.map +1 -1
- package/dist/configs/vitest/phaser.d.ts.map +1 -1
- package/dist/configs/vitest/phaser.js +1 -0
- package/dist/configs/vitest/phaser.js.map +1 -1
- package/dist/configs/vitest/scratch-authority.d.ts +25 -0
- package/dist/configs/vitest/scratch-authority.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-authority.js +107 -0
- package/dist/configs/vitest/scratch-authority.js.map +1 -0
- package/dist/configs/vitest/scratch-bound-cleanup-programs.d.ts +5 -0
- package/dist/configs/vitest/scratch-bound-cleanup-programs.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-bound-cleanup-programs.js +219 -0
- package/dist/configs/vitest/scratch-bound-cleanup-programs.js.map +1 -0
- package/dist/configs/vitest/scratch-bound-cleanup.d.ts +28 -0
- package/dist/configs/vitest/scratch-bound-cleanup.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-bound-cleanup.js +155 -0
- package/dist/configs/vitest/scratch-bound-cleanup.js.map +1 -0
- package/dist/configs/vitest/scratch-bound-root-cleanup.d.ts +17 -0
- package/dist/configs/vitest/scratch-bound-root-cleanup.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-bound-root-cleanup.js +149 -0
- package/dist/configs/vitest/scratch-bound-root-cleanup.js.map +1 -0
- package/dist/configs/vitest/scratch-global-setup.d.ts +17 -9
- package/dist/configs/vitest/scratch-global-setup.d.ts.map +1 -1
- package/dist/configs/vitest/scratch-global-setup.js +103 -35
- package/dist/configs/vitest/scratch-global-setup.js.map +1 -1
- package/dist/configs/vitest/scratch-leak-setup.d.ts +2 -0
- package/dist/configs/vitest/scratch-leak-setup.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-leak-setup.js +108 -0
- package/dist/configs/vitest/scratch-leak-setup.js.map +1 -0
- package/dist/configs/vitest/scratch-namespace-authority.d.ts +80 -0
- package/dist/configs/vitest/scratch-namespace-authority.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-namespace-authority.js +291 -0
- package/dist/configs/vitest/scratch-namespace-authority.js.map +1 -0
- package/dist/configs/vitest/scratch-owner.d.ts +131 -0
- package/dist/configs/vitest/scratch-owner.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-owner.js +297 -0
- package/dist/configs/vitest/scratch-owner.js.map +1 -0
- package/dist/configs/vitest/scratch-route-profile.d.ts +36 -0
- package/dist/configs/vitest/scratch-route-profile.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-route-profile.js +217 -0
- package/dist/configs/vitest/scratch-route-profile.js.map +1 -0
- package/dist/configs/vitest/scratch-run-root-compatibility.d.ts +33 -0
- package/dist/configs/vitest/scratch-run-root-compatibility.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-run-root-compatibility.js +137 -0
- package/dist/configs/vitest/scratch-run-root-compatibility.js.map +1 -0
- package/dist/configs/vitest/scratch-run-root-intent.d.ts +66 -0
- package/dist/configs/vitest/scratch-run-root-intent.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-run-root-intent.js +183 -0
- package/dist/configs/vitest/scratch-run-root-intent.js.map +1 -0
- package/dist/configs/vitest/scratch-setup.d.ts.map +1 -1
- package/dist/configs/vitest/scratch-setup.js +45 -15
- package/dist/configs/vitest/scratch-setup.js.map +1 -1
- package/dist/configs/vitest/scratch-supervision-intent.d.ts +8 -0
- package/dist/configs/vitest/scratch-supervision-intent.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-supervision-intent.js +125 -0
- package/dist/configs/vitest/scratch-supervision-intent.js.map +1 -0
- package/dist/configs/vitest/scratch-supervision-protocol.d.ts +12 -0
- package/dist/configs/vitest/scratch-supervision-protocol.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-supervision-protocol.js +230 -0
- package/dist/configs/vitest/scratch-supervision-protocol.js.map +1 -0
- package/dist/configs/vitest/scratch-supervision.d.ts +64 -0
- package/dist/configs/vitest/scratch-supervision.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-supervision.js +209 -0
- package/dist/configs/vitest/scratch-supervision.js.map +1 -0
- package/dist/configs/vitest/scratch-sweep.d.ts +66 -0
- package/dist/configs/vitest/scratch-sweep.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-sweep.js +82 -0
- package/dist/configs/vitest/scratch-sweep.js.map +1 -0
- package/dist/configs/vitest/scratch.d.ts +14 -187
- package/dist/configs/vitest/scratch.d.ts.map +1 -1
- package/dist/configs/vitest/scratch.js +18 -285
- package/dist/configs/vitest/scratch.js.map +1 -1
- package/dist/configs/vitest/typescript.d.ts.map +1 -1
- package/dist/configs/vitest/typescript.js +1 -0
- package/dist/configs/vitest/typescript.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +4 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +59 -13
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/expo/package-lisa/package.lisa.json +14 -14
- package/harper-fabric/package-lisa/package.lisa.json +8 -3
- package/nestjs/create-only/vitest.config.local.ts +5 -1
- package/nestjs/package-lisa/package.lisa.json +14 -8
- package/npm-package/package-lisa/package.lisa.json +8 -0
- package/package.json +17 -13
- package/phaser/package-lisa/package.lisa.json +9 -3
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/hooks/sonar-secrets.sh +3 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/hooks/sonar-secrets.sh +3 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/sonar-secrets.sh +3 -2
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/hooks/sonar-secrets.sh +3 -2
- package/typescript/create-only/vitest.config.local.ts +5 -1
- package/typescript/package-lisa/package.lisa.json +14 -8
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/** Compatibility allocation/adoption atop the owned run-root lifecycle. */
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { createScratchNamespaceAuthority, parseRunRootName, removeAuthorizedScratchRoot, runRootName, } from "./scratch-authority.js";
|
|
6
|
+
import { registeredScratchPrefixes, scratchSuiteLabel, } from "./scratch-route-profile.js";
|
|
7
|
+
import { createScratchOwnerRecord, readScratchOwnerRecord, scratchPathIdentity, writeScratchOwnerRecord, } from "./scratch-owner.js";
|
|
8
|
+
import { sweepScratchNamespace } from "./scratch-sweep.js";
|
|
9
|
+
/**
|
|
10
|
+
* Create the immutable owner marker for a newly materialized root.
|
|
11
|
+
* @param authority - Pinned namespace authority
|
|
12
|
+
* @param root - Newly materialized direct root
|
|
13
|
+
* @param now - Creation epoch milliseconds
|
|
14
|
+
* @param configuration - Validated owner attribution
|
|
15
|
+
* @returns Immutable owner marker
|
|
16
|
+
*/
|
|
17
|
+
function createOwnerForNewRoot(authority, root, now, configuration) {
|
|
18
|
+
return createScratchOwnerRecord({
|
|
19
|
+
authority,
|
|
20
|
+
root,
|
|
21
|
+
suiteLabel: configuration.suiteLabel,
|
|
22
|
+
registeredPrefixes: configuration.registeredPrefixes,
|
|
23
|
+
now: new Date(now),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a legacy-compatible owned root with transactional marker rollback.
|
|
28
|
+
* @param options - Clock and marker-writer seams
|
|
29
|
+
* @param options.now - Epoch milliseconds recorded in the basename
|
|
30
|
+
* @param options.writeOwnerRecord - Injectable transactional marker writer
|
|
31
|
+
* @returns Absolute run-root path
|
|
32
|
+
*/
|
|
33
|
+
export const createRunRoot = ({ now = Date.now(), writeOwnerRecord = writeScratchOwnerRecord, } = {}) => {
|
|
34
|
+
if (!Number.isSafeInteger(now) || now < 0) {
|
|
35
|
+
throw new Error("Scratch run-root timestamp must be a non-negative integer");
|
|
36
|
+
}
|
|
37
|
+
const configuration = {
|
|
38
|
+
suiteLabel: scratchSuiteLabel(),
|
|
39
|
+
registeredPrefixes: registeredScratchPrefixes(),
|
|
40
|
+
};
|
|
41
|
+
const authority = createScratchNamespaceAuthority();
|
|
42
|
+
const root = path.join(authority.namespace.canonicalPath, runRootName(process.pid, now, randomBytes(4).toString("hex")));
|
|
43
|
+
const expectedIdentity = (() => {
|
|
44
|
+
fs.mkdirSync(root, { mode: 0o700 });
|
|
45
|
+
return scratchPathIdentity(root);
|
|
46
|
+
})();
|
|
47
|
+
try {
|
|
48
|
+
const owner = createOwnerForNewRoot(authority, root, now, configuration);
|
|
49
|
+
writeOwnerRecord(root, owner);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
try {
|
|
53
|
+
removeAuthorizedScratchRoot({
|
|
54
|
+
authority,
|
|
55
|
+
basename: path.basename(root),
|
|
56
|
+
expectedIdentity,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (cleanupError) {
|
|
60
|
+
throw new AggregateError([error, cleanupError], "Scratch root allocation failed and rollback could not reclaim it");
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
return root;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Reclaim residue, then allocate a durable owned-root handle.
|
|
68
|
+
* @returns Owned current-process root
|
|
69
|
+
*/
|
|
70
|
+
export function reclaimAndCreateOwnedRunRoot() {
|
|
71
|
+
const authority = createScratchNamespaceAuthority();
|
|
72
|
+
const root = (() => {
|
|
73
|
+
sweepScratchNamespace();
|
|
74
|
+
return createRunRoot();
|
|
75
|
+
})();
|
|
76
|
+
return {
|
|
77
|
+
path: root,
|
|
78
|
+
basename: path.basename(root),
|
|
79
|
+
authority,
|
|
80
|
+
owner: readScratchOwnerRecord(root),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read an existing marker or atomically upgrade a legacy current root.
|
|
85
|
+
* @param authority - Pinned namespace authority
|
|
86
|
+
* @param root - Existing current-process root
|
|
87
|
+
* @param startedAt - Timestamp encoded in the recognized basename
|
|
88
|
+
* @returns Existing or newly written marker
|
|
89
|
+
*/
|
|
90
|
+
function readOrCreateAdoptedOwner(authority, root, startedAt) {
|
|
91
|
+
try {
|
|
92
|
+
return readScratchOwnerRecord(root);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error.code !== "ENOENT")
|
|
96
|
+
throw error;
|
|
97
|
+
const owner = createScratchOwnerRecord({
|
|
98
|
+
authority,
|
|
99
|
+
root,
|
|
100
|
+
suiteLabel: scratchSuiteLabel(),
|
|
101
|
+
registeredPrefixes: registeredScratchPrefixes(),
|
|
102
|
+
now: new Date(startedAt),
|
|
103
|
+
});
|
|
104
|
+
writeScratchOwnerRecord(root, owner);
|
|
105
|
+
return owner;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Upgrade a source/dist-compatible path memo created by an older setup copy.
|
|
110
|
+
* @param root - Existing memoized run-root path
|
|
111
|
+
* @returns Durable handle for the existing root
|
|
112
|
+
*/
|
|
113
|
+
export function adoptOwnedScratchRunRoot(root) {
|
|
114
|
+
const authority = createScratchNamespaceAuthority();
|
|
115
|
+
const canonicalRoot = fs.realpathSync(root);
|
|
116
|
+
if (path.dirname(canonicalRoot) !== authority.namespace.canonicalPath ||
|
|
117
|
+
path.basename(root) !== path.basename(canonicalRoot)) {
|
|
118
|
+
throw new Error("Memoized scratch root is outside canonical authority");
|
|
119
|
+
}
|
|
120
|
+
const parsed = parseRunRootName(path.basename(root));
|
|
121
|
+
if (parsed?.pid !== process.pid) {
|
|
122
|
+
throw new Error("Memoized scratch root is not owned by this process");
|
|
123
|
+
}
|
|
124
|
+
const owner = readOrCreateAdoptedOwner(authority, root, parsed.startedAt);
|
|
125
|
+
return {
|
|
126
|
+
path: root,
|
|
127
|
+
basename: path.basename(root),
|
|
128
|
+
authority,
|
|
129
|
+
owner,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Reclaim residue, then return one current-process root path.
|
|
134
|
+
* @returns Newly allocated root path
|
|
135
|
+
*/
|
|
136
|
+
export const reclaimAndCreateRunRoot = () => reclaimAndCreateOwnedRunRoot().path;
|
|
137
|
+
//# sourceMappingURL=scratch-run-root-compatibility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-run-root-compatibility.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-run-root-compatibility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ScratchNamespaceAuthority } from "./scratch-authority.js";
|
|
2
|
+
import { writeScratchOwnerRecord, type ScratchOwnerRecordV1, type ScratchPathIdentity } from "./scratch-owner.js";
|
|
3
|
+
/** Durable handle for one run root owned by this process. */
|
|
4
|
+
export interface OwnedScratchRunRoot {
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly basename: string;
|
|
7
|
+
readonly authority: ScratchNamespaceAuthority;
|
|
8
|
+
readonly owner: ScratchOwnerRecordV1;
|
|
9
|
+
}
|
|
10
|
+
/** Precommitted immutable intent for one exact direct run root. */
|
|
11
|
+
export interface ScratchRunRootIntentV1 {
|
|
12
|
+
readonly schema: 1;
|
|
13
|
+
readonly rootPath: string;
|
|
14
|
+
readonly basename: string;
|
|
15
|
+
readonly authority: ScratchNamespaceAuthority;
|
|
16
|
+
readonly pid: number;
|
|
17
|
+
readonly processBirthFingerprint: string;
|
|
18
|
+
readonly createdAt: string;
|
|
19
|
+
readonly token: string;
|
|
20
|
+
readonly suiteLabel: string;
|
|
21
|
+
readonly registeredPrefixes: readonly string[];
|
|
22
|
+
}
|
|
23
|
+
/** Deterministic seams for precommitting process-birth authority. */
|
|
24
|
+
interface PrepareRunRootOptions {
|
|
25
|
+
readonly platform?: NodeJS.Platform;
|
|
26
|
+
readonly processBirthFingerprint?: (pid: number) => string | undefined;
|
|
27
|
+
readonly suiteLabel?: string;
|
|
28
|
+
readonly registeredPrefixes?: readonly string[];
|
|
29
|
+
}
|
|
30
|
+
/** Deterministic seams for transactional root materialization. */
|
|
31
|
+
interface MaterializeRunRootOptions {
|
|
32
|
+
readonly writeOwnerRecord?: typeof writeScratchOwnerRecord;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Prepare an exact root identity without creating that root.
|
|
36
|
+
* @param options - Deterministic authority seams
|
|
37
|
+
* @returns Immutable precommitted root intent
|
|
38
|
+
*/
|
|
39
|
+
export declare function prepareOwnedScratchRunRoot(options?: PrepareRunRootOptions): ScratchRunRootIntentV1;
|
|
40
|
+
/**
|
|
41
|
+
* Materialize one armed root and persist its immutable marker.
|
|
42
|
+
* @param intent - Precommitted root intent
|
|
43
|
+
* @param options - Transactional marker-writer seams
|
|
44
|
+
* @returns Durable owned-root handle
|
|
45
|
+
*/
|
|
46
|
+
export declare function materializeOwnedScratchRunRoot(intent: ScratchRunRootIntentV1, options?: MaterializeRunRootOptions): OwnedScratchRunRoot;
|
|
47
|
+
/**
|
|
48
|
+
* Validate an opened marker against the complete armed intent.
|
|
49
|
+
* @param intent - Precommitted root facts
|
|
50
|
+
* @param owner - Persisted owner marker
|
|
51
|
+
* @param root - Currently opened root identity
|
|
52
|
+
*/
|
|
53
|
+
declare function assertIntentOwner(intent: ScratchRunRootIntentV1, owner: ScratchOwnerRecordV1, root: ScratchPathIdentity): void;
|
|
54
|
+
/**
|
|
55
|
+
* Open one exact materialized root without following a replacement symlink.
|
|
56
|
+
* @param intent - Armed root intent
|
|
57
|
+
* @returns Owned handle, or undefined when not yet materialized
|
|
58
|
+
*/
|
|
59
|
+
export declare function openOwnedScratchRunRoot(intent: ScratchRunRootIntentV1): OwnedScratchRunRoot | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Remove a run root using only the authority captured when it was made.
|
|
62
|
+
* @param owned - Durable handle or precommitted intent
|
|
63
|
+
*/
|
|
64
|
+
export declare function removeOwnedScratchRunRoot(owned: OwnedScratchRunRoot | ScratchRunRootIntentV1): void;
|
|
65
|
+
export { assertIntentOwner };
|
|
66
|
+
//# sourceMappingURL=scratch-run-root-intent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-run-root-intent.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-run-root-intent.ts"],"names":[],"mappings":"AAKA,OAAO,EAML,KAAK,yBAAyB,EAC/B,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAKL,uBAAuB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,6DAA6D;AAC7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9C,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;CACtC;AAED,mEAAmE;AACnE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAED,qEAAqE;AACrE,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjD;AAED,kEAAkE;AAClE,UAAU,yBAAyB;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,uBAAuB,CAAC;CAC5D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,qBAA0B,GAClC,sBAAsB,CA+BxB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,sBAAsB,EAC9B,OAAO,GAAE,yBAA8B,GACtC,mBAAmB,CAiDrB;AAED;;;;;GAKG;AACH,iBAAS,iBAAiB,CACxB,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,mBAAmB,GACxB,IAAI,CAcN;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,sBAAsB,GAC7B,mBAAmB,GAAG,SAAS,CAiBjC;AAiCD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,mBAAmB,GAAG,sBAAsB,GAClD,IAAI,CAuBN;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/** Pre-root intent, materialization, and reopening for one owned scratch root. */
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { SCRATCH_QUARANTINE_PREFIX, createScratchNamespaceAuthority, readBoundedScratchNamespace, removeAuthorizedScratchRoot, runRootName, } from "./scratch-authority.js";
|
|
6
|
+
import { registeredScratchPrefixes, scratchSuiteLabel, } from "./scratch-route-profile.js";
|
|
7
|
+
import { createScratchOwnerRecord, processBirthFingerprint, readScratchOwnerRecord, scratchPathIdentity, writeScratchOwnerRecord, } from "./scratch-owner.js";
|
|
8
|
+
/**
|
|
9
|
+
* Prepare an exact root identity without creating that root.
|
|
10
|
+
* @param options - Deterministic authority seams
|
|
11
|
+
* @returns Immutable precommitted root intent
|
|
12
|
+
*/
|
|
13
|
+
export function prepareOwnedScratchRunRoot(options = {}) {
|
|
14
|
+
const suiteLabel = options.suiteLabel ?? scratchSuiteLabel();
|
|
15
|
+
const prefixes = options.registeredPrefixes ?? registeredScratchPrefixes();
|
|
16
|
+
const authority = createScratchNamespaceAuthority();
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
const basename = runRootName(process.pid, now, randomBytes(4).toString("hex"));
|
|
19
|
+
const platform = options.platform ?? process.platform;
|
|
20
|
+
const birth = (options.processBirthFingerprint ?? processBirthFingerprint)(process.pid);
|
|
21
|
+
if (birth === undefined && (platform === "darwin" || platform === "linux")) {
|
|
22
|
+
throw new Error(`Scratch process-birth authority is unavailable on ${platform}`);
|
|
23
|
+
}
|
|
24
|
+
return Object.freeze({
|
|
25
|
+
schema: 1,
|
|
26
|
+
rootPath: path.join(authority.namespace.canonicalPath, basename),
|
|
27
|
+
basename,
|
|
28
|
+
authority,
|
|
29
|
+
pid: process.pid,
|
|
30
|
+
processBirthFingerprint: birth ?? `unsupported:${String(process.pid)}`,
|
|
31
|
+
createdAt: new Date(now).toISOString(),
|
|
32
|
+
token: randomBytes(16).toString("hex"),
|
|
33
|
+
suiteLabel,
|
|
34
|
+
registeredPrefixes: prefixes,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Materialize one armed root and persist its immutable marker.
|
|
39
|
+
* @param intent - Precommitted root intent
|
|
40
|
+
* @param options - Transactional marker-writer seams
|
|
41
|
+
* @returns Durable owned-root handle
|
|
42
|
+
*/
|
|
43
|
+
export function materializeOwnedScratchRunRoot(intent, options = {}) {
|
|
44
|
+
if (intent.schema !== 1)
|
|
45
|
+
throw new Error("Invalid scratch root intent schema");
|
|
46
|
+
if (path.join(intent.authority.namespace.canonicalPath, intent.basename) !==
|
|
47
|
+
intent.rootPath) {
|
|
48
|
+
throw new Error("Scratch root intent path does not match its authority");
|
|
49
|
+
}
|
|
50
|
+
const expectedIdentity = (() => {
|
|
51
|
+
fs.mkdirSync(intent.rootPath, { mode: 0o700 });
|
|
52
|
+
return scratchPathIdentity(intent.rootPath);
|
|
53
|
+
})();
|
|
54
|
+
try {
|
|
55
|
+
const owner = createScratchOwnerRecord({
|
|
56
|
+
authority: intent.authority,
|
|
57
|
+
root: intent.rootPath,
|
|
58
|
+
pid: intent.pid,
|
|
59
|
+
processBirthFingerprint: intent.processBirthFingerprint,
|
|
60
|
+
suiteLabel: intent.suiteLabel,
|
|
61
|
+
registeredPrefixes: intent.registeredPrefixes,
|
|
62
|
+
token: intent.token,
|
|
63
|
+
now: new Date(intent.createdAt),
|
|
64
|
+
});
|
|
65
|
+
(options.writeOwnerRecord ?? writeScratchOwnerRecord)(intent.rootPath, owner);
|
|
66
|
+
return {
|
|
67
|
+
path: intent.rootPath,
|
|
68
|
+
basename: intent.basename,
|
|
69
|
+
authority: intent.authority,
|
|
70
|
+
owner,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
try {
|
|
75
|
+
removeAuthorizedScratchRoot({
|
|
76
|
+
authority: intent.authority,
|
|
77
|
+
basename: intent.basename,
|
|
78
|
+
expectedIdentity,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (cleanupError) {
|
|
82
|
+
throw new AggregateError([error, cleanupError], "Scratch root materialization failed and rollback could not reclaim it");
|
|
83
|
+
}
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Validate an opened marker against the complete armed intent.
|
|
89
|
+
* @param intent - Precommitted root facts
|
|
90
|
+
* @param owner - Persisted owner marker
|
|
91
|
+
* @param root - Currently opened root identity
|
|
92
|
+
*/
|
|
93
|
+
function assertIntentOwner(intent, owner, root) {
|
|
94
|
+
if (owner.token !== intent.token ||
|
|
95
|
+
owner.pid !== intent.pid ||
|
|
96
|
+
owner.processBirthFingerprint !== intent.processBirthFingerprint ||
|
|
97
|
+
owner.namespace.dev !== intent.authority.namespace.dev ||
|
|
98
|
+
owner.namespace.ino !== intent.authority.namespace.ino ||
|
|
99
|
+
owner.root.dev !== root.dev ||
|
|
100
|
+
owner.root.ino !== root.ino) {
|
|
101
|
+
throw new Error("Scratch owner token or armed identity does not match intent");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Open one exact materialized root without following a replacement symlink.
|
|
106
|
+
* @param intent - Armed root intent
|
|
107
|
+
* @returns Owned handle, or undefined when not yet materialized
|
|
108
|
+
*/
|
|
109
|
+
export function openOwnedScratchRunRoot(intent) {
|
|
110
|
+
// eslint-disable-next-line functional/no-let -- path-level ENOENT must be separated from marker-level ENOENT
|
|
111
|
+
let root;
|
|
112
|
+
try {
|
|
113
|
+
root = scratchPathIdentity(intent.rootPath);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (error.code === "ENOENT")
|
|
117
|
+
return undefined;
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
const owner = readScratchOwnerRecord(intent.rootPath);
|
|
121
|
+
assertIntentOwner(intent, owner, root);
|
|
122
|
+
return {
|
|
123
|
+
path: intent.rootPath,
|
|
124
|
+
basename: intent.basename,
|
|
125
|
+
authority: intent.authority,
|
|
126
|
+
owner,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Find an interrupted quarantine bound to the intent token and root inode.
|
|
131
|
+
* @param intent - Precommitted root facts
|
|
132
|
+
* @returns Matching quarantine identity, or undefined
|
|
133
|
+
*/
|
|
134
|
+
function interruptedQuarantine(intent) {
|
|
135
|
+
for (const basename of readBoundedScratchNamespace(intent.authority.namespace.canonicalPath)) {
|
|
136
|
+
if (!basename.startsWith(SCRATCH_QUARANTINE_PREFIX))
|
|
137
|
+
continue;
|
|
138
|
+
const candidate = path.join(intent.authority.namespace.canonicalPath, basename);
|
|
139
|
+
try {
|
|
140
|
+
const owner = readScratchOwnerRecord(candidate);
|
|
141
|
+
if (owner.token !== intent.token)
|
|
142
|
+
continue;
|
|
143
|
+
const identity = scratchPathIdentity(candidate);
|
|
144
|
+
assertIntentOwner(intent, owner, identity);
|
|
145
|
+
return { basename, identity };
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Foreign and malformed quarantines never authorize this intent.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Remove a run root using only the authority captured when it was made.
|
|
155
|
+
* @param owned - Durable handle or precommitted intent
|
|
156
|
+
*/
|
|
157
|
+
export function removeOwnedScratchRunRoot(owned) {
|
|
158
|
+
if ("rootPath" in owned) {
|
|
159
|
+
const opened = openOwnedScratchRunRoot(owned);
|
|
160
|
+
if (opened !== undefined) {
|
|
161
|
+
removeOwnedScratchRunRoot(opened);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const quarantine = interruptedQuarantine(owned);
|
|
165
|
+
if (quarantine === undefined)
|
|
166
|
+
return;
|
|
167
|
+
removeAuthorizedScratchRoot({
|
|
168
|
+
authority: owned.authority,
|
|
169
|
+
basename: quarantine.basename,
|
|
170
|
+
expectedToken: owned.token,
|
|
171
|
+
expectedIdentity: quarantine.identity,
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
removeAuthorizedScratchRoot({
|
|
176
|
+
authority: owned.authority,
|
|
177
|
+
basename: owned.basename,
|
|
178
|
+
expectedToken: owned.owner.token,
|
|
179
|
+
expectedIdentity: owned.owner.root,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
export { assertIntentOwner };
|
|
183
|
+
//# sourceMappingURL=scratch-run-root-intent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-run-root-intent.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-run-root-intent.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,2BAA2B,EAC3B,2BAA2B,EAC3B,WAAW,GAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,GAGxB,MAAM,oBAAoB,CAAC;AAqC5B;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACxC,UAAiC,EAAE;IAEnC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,iBAAiB,EAAE,CAAC;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,IAAI,yBAAyB,EAAE,CAAC;IAC3E,MAAM,SAAS,GAAG,+BAA+B,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,WAAW,CAC1B,OAAO,CAAC,GAAG,EACX,GAAG,EACH,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/B,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,uBAAuB,IAAI,uBAAuB,CAAC,CACxE,OAAO,CAAC,GAAG,CACZ,CAAC;IACF,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CACb,qDAAqD,QAAQ,EAAE,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,CAAU;QAClB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC;QAChE,QAAQ;QACR,SAAS;QACT,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,uBAAuB,EAAE,KAAK,IAAI,eAAe,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACtE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;QACtC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;QACtC,UAAU;QACV,kBAAkB,EAAE,QAAQ;KAC7B,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAC5C,MAA8B,EAC9B,UAAqC,EAAE;IAEvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,IACE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC;QACpE,MAAM,CAAC,QAAQ,EACf,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;QAC7B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,OAAO,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,EAAE,CAAC;IACL,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,wBAAwB,CAAC;YACrC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE,MAAM,CAAC,QAAQ;YACrB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;YACvD,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;SAChC,CAAC,CAAC;QACH,CAAC,OAAO,CAAC,gBAAgB,IAAI,uBAAuB,CAAC,CACnD,MAAM,CAAC,QAAQ,EACf,KAAK,CACN,CAAC;QACF,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,QAAQ;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK;SACN,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,2BAA2B,CAAC;gBAC1B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,cAAc,CACtB,CAAC,KAAK,EAAE,YAAY,CAAC,EACrB,uEAAuE,CACxE,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,MAA8B,EAC9B,KAA2B,EAC3B,IAAyB;IAEzB,IACE,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;QAC5B,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;QACxB,KAAK,CAAC,uBAAuB,KAAK,MAAM,CAAC,uBAAuB;QAChE,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG;QACtD,KAAK,CAAC,SAAS,CAAC,GAAG,KAAK,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG;QACtD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG;QAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAC3B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAA8B;IAE9B,6GAA6G;IAC7G,IAAI,IAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACvC,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,QAAQ;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,qBAAqB,CAC5B,MAA8B;IAI9B,KAAK,MAAM,QAAQ,IAAI,2BAA2B,CAChD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CACzC,EAAE,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,yBAAyB,CAAC;YAAE,SAAS;QAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CACzB,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,EACxC,QAAQ,CACT,CAAC;QACF,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;gBAAE,SAAS;YAC3C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;YAChD,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;QACnE,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAmD;IAEnD,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO;QACrC,2BAA2B,CAAC;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,aAAa,EAAE,KAAK,CAAC,KAAK;YAC1B,gBAAgB,EAAE,UAAU,CAAC,QAAQ;SACtC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,2BAA2B,CAAC;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK;QAChC,gBAAgB,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;KACnC,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scratch-setup.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scratch-setup.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-setup.ts"],"names":[],"mappings":"AA0GA;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,QAAO,MA0DrC,CAAC"}
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
* @see {@link module:configs/vitest/scratch} for why the root is shaped this way
|
|
30
30
|
* @module configs/vitest/scratch-setup
|
|
31
31
|
*/
|
|
32
|
-
import * as fs from "node:fs";
|
|
33
32
|
import { env } from "node:process";
|
|
34
|
-
import {
|
|
33
|
+
import { SCRATCH_SUPERVISION_LEASE_ENV, createSupervisedWorkerScope, parseScratchSupervisionLease, removeSupervisedWorkerScope, } from "./scratch-supervision.js";
|
|
34
|
+
import { assertScratchRouteProfile } from "./scratch-route-profile.js";
|
|
35
35
|
/**
|
|
36
36
|
* Signals a worker is reaped with, each of which skips `exit` by default.
|
|
37
37
|
*
|
|
@@ -42,8 +42,9 @@ import { SCRATCH_ROOT_ENV, reclaimAndCreateRunRoot, removeScratchDir, scratchBas
|
|
|
42
42
|
* handler that covered only the case that happened to be measured would leave
|
|
43
43
|
* the other two producing exactly the residue this removes.
|
|
44
44
|
*
|
|
45
|
-
* `SIGKILL` is deliberately absent — it cannot be caught
|
|
46
|
-
*
|
|
45
|
+
* `SIGKILL` is deliberately absent — it cannot be caught in this worker. The
|
|
46
|
+
* detached `lisa-test-run` reaper owns that arm; reclaim-on-start remains the
|
|
47
|
+
* compatibility fallback and is tested separately.
|
|
47
48
|
*/
|
|
48
49
|
const REAPING_SIGNALS = [
|
|
49
50
|
"SIGTERM",
|
|
@@ -52,6 +53,32 @@ const REAPING_SIGNALS = [
|
|
|
52
53
|
];
|
|
53
54
|
/** Key under which the per-process run root is memoised. */
|
|
54
55
|
const RUN_ROOT_KEY = "__lisaScratchRunRoot__";
|
|
56
|
+
/** Key holding the authority/token handle while preserving the path memo ABI. */
|
|
57
|
+
const RUN_ROOT_HANDLE_KEY = "__lisaScratchWorkerScopeV1__";
|
|
58
|
+
/**
|
|
59
|
+
* Tear down this worker's scope without letting the attempt change the outcome.
|
|
60
|
+
*
|
|
61
|
+
* `removeSupervisedWorkerScope` validates the suite root OUTSIDE its own
|
|
62
|
+
* try/catch, so a suite root that has gone missing throws straight out of it.
|
|
63
|
+
* Unguarded, that throw lands in a `process.on("exit")` listener -- where node
|
|
64
|
+
* turns it into an uncaught exception and rewrites the exit code, so a green
|
|
65
|
+
* run reports as a failed one -- or in a reaping-signal listener, BEFORE the
|
|
66
|
+
* re-raise below, so the worker never dies of the signal the pool sent and the
|
|
67
|
+
* pool sees the wrong status. Cleanup is best-effort by construction: it must
|
|
68
|
+
* never be the thing that decides how this process ends. The failure is still
|
|
69
|
+
* reported, because a silent one is how the leak this file exists to close
|
|
70
|
+
* came back the first time.
|
|
71
|
+
* @param worker - This worker's supervised scope
|
|
72
|
+
* @param lease - The suite lease the scope was created under
|
|
73
|
+
*/
|
|
74
|
+
const teardownWorkerScope = (worker, lease) => {
|
|
75
|
+
try {
|
|
76
|
+
removeSupervisedWorkerScope(worker, lease);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
process.stderr.write(`lisa scratch worker teardown failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
55
82
|
/**
|
|
56
83
|
* Points this process's temp directory at a run root it owns, creating the root
|
|
57
84
|
* on first call and reusing it afterwards.
|
|
@@ -65,24 +92,27 @@ const RUN_ROOT_KEY = "__lisaScratchRunRoot__";
|
|
|
65
92
|
export const installScratchRoot = () => {
|
|
66
93
|
const scope = globalThis;
|
|
67
94
|
const existing = scope[RUN_ROOT_KEY];
|
|
68
|
-
if (existing !== undefined &&
|
|
95
|
+
if (existing !== undefined && scope[RUN_ROOT_HANDLE_KEY] !== undefined) {
|
|
69
96
|
return existing;
|
|
70
97
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const
|
|
77
|
-
|
|
98
|
+
const rawLease = env[SCRATCH_SUPERVISION_LEASE_ENV];
|
|
99
|
+
if (rawLease === undefined || rawLease === "") {
|
|
100
|
+
throw new Error("Lisa Vitest scratch requires a supervised lease. Run the suite through `lisa-test-run --profile <profile> --adapter vitest -- vitest ...`.");
|
|
101
|
+
}
|
|
102
|
+
const lease = parseScratchSupervisionLease(rawLease);
|
|
103
|
+
const worker = (() => {
|
|
104
|
+
assertScratchRouteProfile(lease);
|
|
105
|
+
return createSupervisedWorkerScope(lease);
|
|
106
|
+
})();
|
|
107
|
+
const root = worker.path;
|
|
78
108
|
scope[RUN_ROOT_KEY] = root;
|
|
79
|
-
|
|
109
|
+
scope[RUN_ROOT_HANDLE_KEY] = worker;
|
|
80
110
|
env["TMPDIR"] = root;
|
|
81
111
|
env["TMP"] = root;
|
|
82
112
|
env["TEMP"] = root;
|
|
83
113
|
// Covers an ordinary exit, including one where tests failed.
|
|
84
114
|
process.once("exit", () => {
|
|
85
|
-
|
|
115
|
+
teardownWorkerScope(worker, lease);
|
|
86
116
|
});
|
|
87
117
|
// And covers the exit this suite ACTUALLY takes, which is not an ordinary
|
|
88
118
|
// one. Measured on vitest 4.1.9, `forks` pool, by recording every lifecycle
|
|
@@ -104,7 +134,7 @@ export const installScratchRoot = () => {
|
|
|
104
134
|
// buys the cleanup, not a different lifecycle.
|
|
105
135
|
for (const signal of REAPING_SIGNALS) {
|
|
106
136
|
process.once(signal, () => {
|
|
107
|
-
|
|
137
|
+
teardownWorkerScope(worker, lease);
|
|
108
138
|
process.removeAllListeners(signal);
|
|
109
139
|
process.kill(process.pid, signal);
|
|
110
140
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scratch-setup.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"scratch-setup.js","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ScratchRunRootIntentV1 } from "./scratch.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validate an inert scratch-root intent received over IPC.
|
|
4
|
+
* @param value - Candidate intent
|
|
5
|
+
* @returns Schema-validated intent
|
|
6
|
+
*/
|
|
7
|
+
export declare function validateScratchRunRootIntent(value: unknown): ScratchRunRootIntentV1;
|
|
8
|
+
//# sourceMappingURL=scratch-supervision-intent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch-supervision-intent.d.ts","sourceRoot":"","sources":["../../../src/configs/vitest/scratch-supervision-intent.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAwG3D;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,GACb,sBAAsB,CA6CxB"}
|